forked from OSchip/llvm-project
Sema: add a helper for enumerating the TST id (NFC)
The same pattern was repeated a few times. Create a trivial helper method to map the Type Specifier to an ID for the diagnostic. Flip the selection order on one of the diagnostic messages to get the same ordering across all of the messages. This makes the emission of the diagnostic slightly more legible by changing the cascading ternary into a switch in a function. NFC. llvm-svn: 240251
This commit is contained in:
parent
a77336bd5d
commit
2e08f50605
|
@ -2190,7 +2190,7 @@ def err_attribute_invalid_on_stmt : Error<
|
|||
"%0 attribute cannot be applied to a statement">;
|
||||
def warn_declspec_attribute_ignored : Warning<
|
||||
"attribute %0 is ignored, place it after "
|
||||
"\"%select{class|struct|union|interface|enum}1\" to apply attribute to "
|
||||
"\"%select{class|struct|interface|union|enum}1\" to apply attribute to "
|
||||
"type declaration">, InGroup<IgnoredAttributes>;
|
||||
def warn_attribute_precede_definition : Warning<
|
||||
"attribute declaration must precede definition">,
|
||||
|
|
|
@ -3577,6 +3577,23 @@ void Sema::setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec,
|
|||
TagFromDeclSpec->setTypedefNameForAnonDecl(NewTD);
|
||||
}
|
||||
|
||||
static unsigned GetDiagnosticTypeSpecifierID(DeclSpec::TST T) {
|
||||
switch (T) {
|
||||
case DeclSpec::TST_class:
|
||||
return 0;
|
||||
case DeclSpec::TST_struct:
|
||||
return 1;
|
||||
case DeclSpec::TST_interface:
|
||||
return 2;
|
||||
case DeclSpec::TST_union:
|
||||
return 3;
|
||||
case DeclSpec::TST_enum:
|
||||
return 4;
|
||||
default:
|
||||
llvm_unreachable("unexpected type specifier");
|
||||
}
|
||||
}
|
||||
|
||||
/// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with
|
||||
/// no declarator (e.g. "struct foo;") is parsed. It also accepts template
|
||||
/// parameters to cope with template friend declarations.
|
||||
|
@ -3626,10 +3643,7 @@ Decl *Sema::ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS,
|
|||
// and definitions of functions and variables.
|
||||
if (Tag)
|
||||
Diag(DS.getConstexprSpecLoc(), diag::err_constexpr_tag)
|
||||
<< (DS.getTypeSpecType() == DeclSpec::TST_class ? 0 :
|
||||
DS.getTypeSpecType() == DeclSpec::TST_struct ? 1 :
|
||||
DS.getTypeSpecType() == DeclSpec::TST_interface ? 2 :
|
||||
DS.getTypeSpecType() == DeclSpec::TST_union ? 3 : 4);
|
||||
<< GetDiagnosticTypeSpecifierID(DS.getTypeSpecType());
|
||||
else
|
||||
Diag(DS.getConstexprSpecLoc(), diag::err_constexpr_no_declarators);
|
||||
// Don't emit warnings after this error.
|
||||
|
@ -3656,11 +3670,7 @@ Decl *Sema::ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS,
|
|||
// or an explicit specialization.
|
||||
// Per C++ [dcl.enum]p1, an opaque-enum-declaration can't either.
|
||||
Diag(SS.getBeginLoc(), diag::err_standalone_class_nested_name_specifier)
|
||||
<< (DS.getTypeSpecType() == DeclSpec::TST_class ? 0 :
|
||||
DS.getTypeSpecType() == DeclSpec::TST_struct ? 1 :
|
||||
DS.getTypeSpecType() == DeclSpec::TST_interface ? 2 :
|
||||
DS.getTypeSpecType() == DeclSpec::TST_union ? 3 : 4)
|
||||
<< SS.getRange();
|
||||
<< GetDiagnosticTypeSpecifierID(DS.getTypeSpecType()) << SS.getRange();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
@ -3809,14 +3819,9 @@ Decl *Sema::ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS,
|
|||
TypeSpecType == DeclSpec::TST_union ||
|
||||
TypeSpecType == DeclSpec::TST_enum) {
|
||||
for (AttributeList* attrs = DS.getAttributes().getList(); attrs;
|
||||
attrs = attrs->getNext()) {
|
||||
attrs = attrs->getNext())
|
||||
Diag(attrs->getLoc(), diag::warn_declspec_attribute_ignored)
|
||||
<< attrs->getName()
|
||||
<< (TypeSpecType == DeclSpec::TST_class ? 0 :
|
||||
TypeSpecType == DeclSpec::TST_struct ? 1 :
|
||||
TypeSpecType == DeclSpec::TST_union ? 2 :
|
||||
TypeSpecType == DeclSpec::TST_interface ? 3 : 4);
|
||||
}
|
||||
<< attrs->getName() << GetDiagnosticTypeSpecifierID(TypeSpecType);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue