From 2e08f506059930af5af1d450ae2685f9ed8040fe Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Sun, 21 Jun 2015 23:05:52 +0000 Subject: [PATCH] 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 --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 +- clang/lib/Sema/SemaDecl.cpp | 37 ++++++++++++++---------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 803203c..779f43e 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -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; def warn_attribute_precede_definition : Warning< "attribute declaration must precede definition">, diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index df8e38f..f750638 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -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); } } -- 2.7.4