From e58d233abbfd75b14a109d71f30791e8d8b3d9c7 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Mon, 3 Oct 2016 18:34:23 +0000 Subject: [PATCH] Factor out a diagnostic kind enum for use in two %select expressions NFC git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@283131 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Sema/Sema.h | 15 +++++++++++++++ lib/Sema/SemaDecl.cpp | 28 ++++++++++++++++++---------- lib/Sema/SemaTemplate.cpp | 12 +++--------- lib/Sema/TreeTransform.h | 10 ++++------ 4 files changed, 40 insertions(+), 25 deletions(-) diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index 94f31696ec..74c4e41c47 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -1970,6 +1970,21 @@ public: Decl *BuildMicrosoftCAnonymousStruct(Scope *S, DeclSpec &DS, RecordDecl *Record); + /// Common ways to introduce type names without a tag for use in diagnostics. + /// Keep in sync with err_tag_reference_non_tag. + enum NonTagKind { + NTK_Unknown, + NTK_Typedef, + NTK_TypeAlias, + NTK_Template, + NTK_TypeAliasTemplate, + NTK_TemplateTemplateArgument, + }; + + /// Given a non-tag type declaration, returns an enum useful for indicating + /// what kind of non-tag type this is. + NonTagKind getNonTagTypeDeclKind(const Decl *D); + bool isAcceptableTagRedeclaration(const TagDecl *Previous, TagTypeKind NewTag, bool isDefinition, SourceLocation NewTagLoc, diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index d85a612e0b..21778e8b62 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -12243,6 +12243,20 @@ static bool isClassCompatTagKind(TagTypeKind Tag) return Tag == TTK_Struct || Tag == TTK_Class || Tag == TTK_Interface; } +Sema::NonTagKind Sema::getNonTagTypeDeclKind(const Decl *PrevDecl) { + if (isa(PrevDecl)) + return NTK_Typedef; + else if (isa(PrevDecl)) + return NTK_TypeAlias; + else if (isa(PrevDecl)) + return NTK_Template; + else if (isa(PrevDecl)) + return NTK_TypeAliasTemplate; + else if (isa(PrevDecl)) + return NTK_TemplateTemplateArgument; + return NTK_Unknown; +} + /// \brief Determine whether a tag with a given kind is acceptable /// as a redeclaration of the given tag declaration. /// @@ -13023,11 +13037,8 @@ Decl *Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, // (non-redeclaration) lookup. if ((TUK == TUK_Reference || TUK == TUK_Friend) && !Previous.isForRedeclaration()) { - unsigned Kind = 0; - if (isa(PrevDecl)) Kind = 1; - else if (isa(PrevDecl)) Kind = 2; - else if (isa(PrevDecl)) Kind = 3; - Diag(NameLoc, diag::err_tag_reference_non_tag) << Kind; + NonTagKind NTK = getNonTagTypeDeclKind(PrevDecl); + Diag(NameLoc, diag::err_tag_reference_non_tag) << NTK; Diag(PrevDecl->getLocation(), diag::note_declared_at); Invalid = true; @@ -13038,11 +13049,8 @@ Decl *Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, // Diagnose implicit declarations introduced by elaborated types. } else if (TUK == TUK_Reference || TUK == TUK_Friend) { - unsigned Kind = 0; - if (isa(PrevDecl)) Kind = 1; - else if (isa(PrevDecl)) Kind = 2; - else if (isa(PrevDecl)) Kind = 3; - Diag(NameLoc, diag::err_tag_reference_conflict) << Kind; + NonTagKind NTK = getNonTagTypeDeclKind(PrevDecl); + Diag(NameLoc, diag::err_tag_reference_conflict) << NTK; Diag(PrevDecl->getLocation(), diag::note_previous_decl) << PrevDecl; Invalid = true; diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index b1bb97b758..7061f079ac 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -2468,7 +2468,7 @@ TypeResult Sema::ActOnTagTemplateIdType(TagUseKind TUK, // If the identifier resolves to a typedef-name or the simple-template-id // resolves to an alias template specialization, the // elaborated-type-specifier is ill-formed. - Diag(TemplateLoc, diag::err_tag_reference_non_tag) << 4; + Diag(TemplateLoc, diag::err_tag_reference_non_tag) << NTK_TypeAliasTemplate; Diag(TAT->getLocation(), diag::note_declared_at); } @@ -7438,14 +7438,8 @@ Sema::ActOnExplicitInstantiation(Scope *S, ClassTemplateDecl *ClassTemplate = dyn_cast(TD); if (!ClassTemplate) { - unsigned ErrorKind = 0; - if (isa(TD)) { - ErrorKind = 4; - } else if (isa(TD)) { - ErrorKind = 5; - } - - Diag(TemplateNameLoc, diag::err_tag_reference_non_tag) << ErrorKind; + NonTagKind NTK = getNonTagTypeDeclKind(TD); + Diag(TemplateNameLoc, diag::err_tag_reference_non_tag) << NTK; Diag(TD->getLocation(), diag::note_previous_use); return true; } diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index ef3740b717..a74171ed5f 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -1013,11 +1013,8 @@ public: case LookupResult::FoundOverloaded: case LookupResult::FoundUnresolvedValue: { NamedDecl *SomeDecl = Result.getRepresentativeDecl(); - unsigned Kind = 0; - if (isa(SomeDecl)) Kind = 1; - else if (isa(SomeDecl)) Kind = 2; - else if (isa(SomeDecl)) Kind = 3; - SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << Kind; + Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl); + SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << NTK; SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); break; } @@ -5703,7 +5700,8 @@ TreeTransform::TransformElaboratedType(TypeLocBuilder &TLB, if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null( Template.getAsTemplateDecl())) { SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), - diag::err_tag_reference_non_tag) << 4; + diag::err_tag_reference_non_tag) + << Sema::NTK_TypeAliasTemplate; SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); } } -- 2.50.1