}
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 {
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();
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 {
}
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;
}
virtual ~Decl();
-
+
public:
/// \brief Source range that this declaration covers.
///
/// 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.
/// \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,
return getInstantiatedFromMemberTemplateImpl();
}
- virtual RedeclarableTemplateDecl *getNextRedeclaration();
+ RedeclarableTemplateDecl *getNextRedeclaration();
// Implement isa/cast/dyncast/etc.
static bool classof(const Decl *D) { return classofKind(D->getKind()); }
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
//===----------------------------------------------------------------------===//