diff options
-rw-r--r-- | include/clang/AST/DeclBase.h | 9 | ||||
-rw-r--r-- | lib/Sema/Sema.h | 1 | ||||
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 10 | ||||
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 4 | ||||
-rw-r--r-- | lib/Sema/SemaTemplate.cpp | 12 |
5 files changed, 19 insertions, 17 deletions
diff --git a/include/clang/AST/DeclBase.h b/include/clang/AST/DeclBase.h index 6d61da4698..55919da54e 100644 --- a/include/clang/AST/DeclBase.h +++ b/include/clang/AST/DeclBase.h @@ -211,6 +211,10 @@ public: static bool CollectingStats(bool Enable = false); static void PrintStats(); + /// isTemplateParameter - Determines whether this declartion is a + /// template parameter. + bool isTemplateParameter() const; + // Implement isa/cast/dyncast/etc. static bool classof(const Decl *) { return true; } static DeclContext *castToDeclContext(const Decl *); @@ -388,6 +392,11 @@ template<> struct DeclContext::KindTrait<DeclContext> { static Decl::Kind getKind(const DeclContext *D) { return D->DeclKind; } }; +inline bool Decl::isTemplateParameter() const { + return getKind() == TemplateTypeParm || getKind() == NonTypeTemplateParm; +} + + } // end clang. namespace llvm { diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index ef99aaaa46..4a8f83084d 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -995,7 +995,6 @@ public: //===--------------------------------------------------------------------===// // C++ Templates [C++ 14] // - bool isTemplateParameterDecl(Decl *D); bool DiagnoseTemplateParameterShadow(SourceLocation Loc, Decl *PrevDecl); virtual DeclTy *ActOnTypeParameter(Scope *S, bool Typename, SourceLocation KeyLoc, diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index b6b1f4c446..41587c5aee 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -868,7 +868,7 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) { } } - if (PrevDecl && isTemplateParameterDecl(PrevDecl)) { + if (PrevDecl && PrevDecl->isTemplateParameter()) { // Maybe we will complain about the shadowed template parameter. InvalidDecl = InvalidDecl || DiagnoseTemplateParameterShadow(D.getIdentifierLoc(), PrevDecl); @@ -2035,7 +2035,7 @@ Sema::ActOnParamDeclarator(Scope *S, Declarator &D) { // among each other. Here they can only shadow globals, which is ok. IdentifierInfo *II = D.getIdentifier(); if (Decl *PrevDecl = LookupDecl(II, Decl::IDNS_Ordinary, S)) { - if (isTemplateParameterDecl(PrevDecl)) { + if (PrevDecl->isTemplateParameter()) { // Maybe we will complain about the shadowed template parameter. DiagnoseTemplateParameterShadow(D.getIdentifierLoc(), PrevDecl); // Just pretend that we didn't see the previous declaration. @@ -2299,7 +2299,7 @@ Sema::DeclTy *Sema::ActOnTag(Scope *S, unsigned TagType, TagKind TK, PrevDecl = dyn_cast_or_null<ScopedDecl>(LookupDecl(Name, Decl::IDNS_Tag,S)); } - if (PrevDecl && isTemplateParameterDecl(PrevDecl)) { + if (PrevDecl && PrevDecl->isTemplateParameter()) { // Maybe we will complain about the shadowed template parameter. DiagnoseTemplateParameterShadow(NameLoc, PrevDecl); // Just pretend that we didn't see the previous declaration. @@ -2442,7 +2442,7 @@ Sema::DeclTy *Sema::ActOnTagStruct(Scope *S, TagDecl::TagKind Kind, TagKind TK, PrevDecl = dyn_cast_or_null<ScopedDecl>(LookupDecl(Name, Decl::IDNS_Tag,S)); } - if (PrevDecl && isTemplateParameterDecl(PrevDecl)) { + if (PrevDecl && PrevDecl->isTemplateParameter()) { // Maybe we will complain about the shadowed template parameter. DiagnoseTemplateParameterShadow(NameLoc, PrevDecl); // Just pretend that we didn't see the previous declaration. @@ -2959,7 +2959,7 @@ Sema::DeclTy *Sema::ActOnEnumConstant(Scope *S, DeclTy *theEnumDecl, // Verify that there isn't already something declared with this name in this // scope. Decl *PrevDecl = LookupDecl(Id, Decl::IDNS_Ordinary, S); - if (PrevDecl && isTemplateParameterDecl(PrevDecl)) { + if (PrevDecl && PrevDecl->isTemplateParameter()) { // Maybe we will complain about the shadowed template parameter. DiagnoseTemplateParameterShadow(IdLoc, PrevDecl); // Just pretend that we didn't see the previous declaration. diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index d7b71211d4..7a93b453f0 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -66,7 +66,7 @@ ActOnStartClassInterface(SourceLocation AtInterfaceLoc, // Check for another declaration kind with the same name. Decl *PrevDecl = LookupDecl(ClassName, Decl::IDNS_Ordinary, TUScope); - if (PrevDecl && isTemplateParameterDecl(PrevDecl)) { + if (PrevDecl && PrevDecl->isTemplateParameter()) { // Maybe we will complain about the shadowed template parameter. DiagnoseTemplateParameterShadow(ClassLoc, PrevDecl); // Just pretend that we didn't see the previous declaration. @@ -826,7 +826,7 @@ Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc, for (unsigned i = 0; i != NumElts; ++i) { // Check for another declaration kind with the same name. Decl *PrevDecl = LookupDecl(IdentList[i], Decl::IDNS_Ordinary, TUScope); - if (PrevDecl && isTemplateParameterDecl(PrevDecl)) { + if (PrevDecl && PrevDecl->isTemplateParameter()) { // Maybe we will complain about the shadowed template parameter. DiagnoseTemplateParameterShadow(AtClassLoc, PrevDecl); // Just pretend that we didn't see the previous declaration. diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index 092c9d2236..2dcb9fe336 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -18,18 +18,12 @@ using namespace clang; -/// isTemplateParameterDecl - Determines whether the given declaration -/// 'D' names a template parameter. -bool Sema::isTemplateParameterDecl(Decl *D) { - return isa<TemplateTypeParmDecl>(D) || isa<NonTypeTemplateParmDecl>(D); -} - /// DiagnoseTemplateParameterShadow - Produce a diagnostic complaining /// that the template parameter 'PrevDecl' is being shadowed by a new /// declaration at location Loc. Returns true to indicate that this is /// an error, and false otherwise. bool Sema::DiagnoseTemplateParameterShadow(SourceLocation Loc, Decl *PrevDecl) { - assert(isTemplateParameterDecl(PrevDecl) && "Not a template parameter"); + assert(PrevDecl->isTemplateParameter() && "Not a template parameter"); // Microsoft Visual C++ permits template parameters to be shadowed. if (getLangOptions().Microsoft) @@ -63,7 +57,7 @@ Sema::DeclTy *Sema::ActOnTypeParameter(Scope *S, bool Typename, if (ParamName) { Decl *PrevDecl = LookupDecl(ParamName, Decl::IDNS_Tag, S); - if (PrevDecl && isTemplateParameterDecl(PrevDecl)) + if (PrevDecl && PrevDecl->isTemplateParameter()) Invalid = Invalid || DiagnoseTemplateParameterShadow(ParamNameLoc, PrevDecl); } @@ -97,7 +91,7 @@ Sema::DeclTy *Sema::ActOnNonTypeTemplateParameter(Scope *S, Declarator &D) { IdentifierInfo *ParamName = D.getIdentifier(); if (ParamName) { Decl *PrevDecl = LookupDecl(ParamName, Decl::IDNS_Tag, S); - if (PrevDecl && isTemplateParameterDecl(PrevDecl)) + if (PrevDecl && PrevDecl->isTemplateParameter()) Invalid = Invalid || DiagnoseTemplateParameterShadow(D.getIdentifierLoc(), PrevDecl); } |