add a check for conflicting adjacent tags as well

This commit is contained in:
Árpád Goretity 2018-03-08 09:57:05 +01:00
parent 0ddebe0317
commit f4b78e202a

View File

@ -17,6 +17,7 @@ pub fn check(cx: &Ctxt, cont: &Container) {
check_identifier(cx, cont);
check_variant_skip_attrs(cx, cont);
check_internal_tag_field_name_conflict(cx, cont);
check_adjacent_tag_conflict(cx, cont);
}
/// Getters are only allowed inside structs (not enums) with the `remote`
@ -217,3 +218,20 @@ fn check_internal_tag_field_name_conflict(
}
}
}
/// In the case of adjacently-tagged enums, the type and the
/// contents tag must differ, for the same reason.
fn check_adjacent_tag_conflict(cx: &Ctxt, cont: &Container) {
let (type_tag, content_tag) = match *cont.attrs.tag() {
EnumTag::Adjacent { ref tag, ref content } => (tag, content),
EnumTag::Internal { .. } | EnumTag::External | EnumTag::None => return,
};
if type_tag == content_tag {
let message = format!(
"Enum tags `{}` for type and content conflict with each other",
type_tag
);
cx.error(message);
}
}