Devirtualize Decl::getNextRedeclaration().

llvm-svn: 125740
This commit is contained in:
Douglas Gregor 2011-02-17 08:47:29 +00:00
parent 712563bba4
commit 133edddd82
5 changed files with 91 additions and 10 deletions

View File

@ -674,7 +674,8 @@ 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;
@ -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,7 +1925,9 @@ 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;
@ -2042,13 +2048,15 @@ 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;
redecl_iterator redecls_begin() const {

View File

@ -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.

View File

@ -182,7 +182,8 @@ 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,

View File

@ -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()); }

View File

@ -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
//===----------------------------------------------------------------------===//