diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-02-17 08:47:29 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-02-17 08:47:29 +0000 |
commit | 4c3e0ee8e6208eb42c4adb78a7d35b641fd85ae9 (patch) | |
tree | d22914af2d81f16a59bd50e0d5166bcd1d934db2 | |
parent | 543cb655b174087f6c2d22009934c9fed6c32114 (diff) |
Devirtualize Decl::getNextRedeclaration().
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125740 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/AST/Decl.h | 18 | ||||
-rw-r--r-- | include/clang/AST/DeclBase.h | 4 | ||||
-rw-r--r-- | include/clang/AST/DeclObjC.h | 5 | ||||
-rw-r--r-- | include/clang/AST/DeclTemplate.h | 2 | ||||
-rw-r--r-- | lib/AST/DeclBase.cpp | 72 |
5 files changed, 91 insertions, 10 deletions
diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index a90d09061c..68d20510ea 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -674,8 +674,9 @@ protected: } typedef Redeclarable<VarDecl> redeclarable_base; - virtual VarDecl *getNextRedeclaration() { return RedeclLink.getNext(); } - + VarDecl *getNextRedeclaration() { return RedeclLink.getNext(); } + friend class Decl; + public: typedef redeclarable_base::redecl_iterator redecl_iterator; redecl_iterator redecls_begin() const { @@ -1310,9 +1311,12 @@ protected: DNLoc(NameInfo.getInfo()) {} typedef Redeclarable<FunctionDecl> redeclarable_base; - virtual FunctionDecl *getNextRedeclaration() { return RedeclLink.getNext(); } + FunctionDecl *getNextRedeclaration() { return RedeclLink.getNext(); } + friend class Decl; + public: + typedef redeclarable_base::redecl_iterator redecl_iterator; redecl_iterator redecls_begin() const { return redeclarable_base::redecls_begin(); @@ -1921,8 +1925,10 @@ class TypedefDecl : public TypeDecl, public Redeclarable<TypedefDecl> { protected: typedef Redeclarable<TypedefDecl> redeclarable_base; - virtual TypedefDecl *getNextRedeclaration() { return RedeclLink.getNext(); } + TypedefDecl *getNextRedeclaration() { return RedeclLink.getNext(); } + friend class Decl; + public: typedef redeclarable_base::redecl_iterator redecl_iterator; redecl_iterator redecls_begin() const { @@ -2042,12 +2048,14 @@ protected: } typedef Redeclarable<TagDecl> redeclarable_base; - virtual TagDecl *getNextRedeclaration() { return RedeclLink.getNext(); } + TagDecl *getNextRedeclaration() { return RedeclLink.getNext(); } /// @brief Completes the definition of this tag declaration. /// /// This is a helper function for derived classes. void completeDefinition(); + + friend class Decl; public: typedef redeclarable_base::redecl_iterator redecl_iterator; diff --git a/include/clang/AST/DeclBase.h b/include/clang/AST/DeclBase.h index 8d64cb5089..c67391653a 100644 --- a/include/clang/AST/DeclBase.h +++ b/include/clang/AST/DeclBase.h @@ -271,7 +271,7 @@ protected: } virtual ~Decl(); - + public: /// \brief Source range that this declaration covers. @@ -488,7 +488,7 @@ protected: /// /// Decl subclasses that can be redeclared should override this method so that /// Decl::redecl_iterator can iterate over them. - virtual Decl *getNextRedeclaration() { return this; } + Decl *getNextRedeclaration(); public: /// \brief Iterates through all the redeclarations of the same decl. diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index e46a74f598..2ddb68482f 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -182,8 +182,9 @@ private: /// \brief A definition will return its interface declaration. /// An interface declaration will return its definition. /// Otherwise it will return itself. - virtual ObjCMethodDecl *getNextRedeclaration(); - + ObjCMethodDecl *getNextRedeclaration(); + friend class Decl; + public: static ObjCMethodDecl *Create(ASTContext &C, SourceLocation beginLoc, diff --git a/include/clang/AST/DeclTemplate.h b/include/clang/AST/DeclTemplate.h index 176c6badae..774258711c 100644 --- a/include/clang/AST/DeclTemplate.h +++ b/include/clang/AST/DeclTemplate.h @@ -651,7 +651,7 @@ public: return getInstantiatedFromMemberTemplateImpl(); } - virtual RedeclarableTemplateDecl *getNextRedeclaration(); + RedeclarableTemplateDecl *getNextRedeclaration(); // Implement isa/cast/dyncast/etc. static bool classof(const Decl *D) { return classofKind(D->getKind()); } diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index 5a117ebbf2..437089a415 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -191,6 +191,78 @@ Decl *Decl::getCanonicalDecl() { return this; } +Decl *Decl::getNextRedeclaration() { + switch (getKind()) { + case Var: + return static_cast<VarDecl *>(this)->getNextRedeclaration(); + + case Function: + case CXXMethod: + case CXXConstructor: + case CXXDestructor: + case CXXConversion: + return static_cast<FunctionDecl *>(this)->getNextRedeclaration(); + + case Typedef: + return static_cast<TypedefDecl *>(this)->getNextRedeclaration(); + + case Enum: + case Record: + case CXXRecord: + case ClassTemplateSpecialization: + case ClassTemplatePartialSpecialization: + return static_cast<TagDecl *>(this)->getNextRedeclaration(); + + case ObjCMethod: + return static_cast<ObjCMethodDecl *>(this)->getNextRedeclaration(); + + case FunctionTemplate: + case ClassTemplate: + return static_cast<RedeclarableTemplateDecl *>(this) + ->getNextRedeclaration(); + + case Namespace: + case UsingDirective: + case NamespaceAlias: + case Label: + case UnresolvedUsingTypename: + case TemplateTypeParm: + case EnumConstant: + case UnresolvedUsingValue: + case IndirectField: + case Field: + case ObjCIvar: + case ObjCAtDefsField: + case ImplicitParam: + case ParmVar: + case NonTypeTemplateParm: + case TemplateTemplateParm: + case Using: + case UsingShadow: + case ObjCCategory: + case ObjCProtocol: + case ObjCInterface: + case ObjCCategoryImpl: + case ObjCImplementation: + case ObjCProperty: + case ObjCCompatibleAlias: + case LinkageSpec: + case ObjCPropertyImpl: + case ObjCForwardProtocol: + case ObjCClass: + case FileScopeAsm: + case AccessSpec: + case Friend: + case FriendTemplate: + case StaticAssert: + case Block: + case TranslationUnit: + return this; + } + + return this; +} + //===----------------------------------------------------------------------===// // PrettyStackTraceDecl Implementation //===----------------------------------------------------------------------===// |