getOriginalNamespace()->OrigOrAnonNamespace.setPointer(D);
}
- virtual NamespaceDecl *getCanonicalDecl() { return getOriginalNamespace(); }
+ NamespaceDecl *getCanonicalDecl() { return getOriginalNamespace(); }
const NamespaceDecl *getCanonicalDecl() const {
return getOriginalNamespace();
}
return getKind() != Decl::ParmVar && getDeclContext()->isRecord();
}
- virtual VarDecl *getCanonicalDecl();
+ VarDecl *getCanonicalDecl();
const VarDecl *getCanonicalDecl() const {
return const_cast<VarDecl*>(this)->getCanonicalDecl();
}
void setPreviousDeclaration(FunctionDecl * PrevDecl);
- virtual const FunctionDecl *getCanonicalDecl() const;
- virtual FunctionDecl *getCanonicalDecl();
+ const FunctionDecl *getCanonicalDecl() const;
+ FunctionDecl *getCanonicalDecl();
unsigned getBuiltinID() const;
SourceLocation getOuterLocStart() const;
virtual SourceRange getSourceRange() const;
- virtual TagDecl* getCanonicalDecl();
+ TagDecl* getCanonicalDecl();
const TagDecl* getCanonicalDecl() const {
return const_cast<TagDecl*>(this)->getCanonicalDecl();
}
bool isDefinedOutsideFunctionOrMethod() const;
/// \brief Retrieves the "canonical" declaration of the given declaration.
- virtual Decl *getCanonicalDecl() { return this; }
+ Decl *getCanonicalDecl();
const Decl *getCanonicalDecl() const {
return const_cast<Decl*>(this)->getCanonicalDecl();
}
typedef std::reverse_iterator<base_class_const_iterator>
reverse_base_class_const_iterator;
- virtual CXXRecordDecl *getCanonicalDecl() {
+ CXXRecordDecl *getCanonicalDecl() {
return cast<CXXRecordDecl>(RecordDecl::getCanonicalDecl());
}
- virtual const CXXRecordDecl *getCanonicalDecl() const {
+ const CXXRecordDecl *getCanonicalDecl() const {
return cast<CXXRecordDecl>(RecordDecl::getCanonicalDecl());
}
ImplementationControl impControl = None,
unsigned numSelectorArgs = 0);
- virtual ObjCMethodDecl *getCanonicalDecl();
+ ObjCMethodDecl *getCanonicalDecl();
const ObjCMethodDecl *getCanonicalDecl() const {
return const_cast<ObjCMethodDecl*>(this)->getCanonicalDecl();
}
return true;
}
+namespace {
+ template<typename Class, typename Result>
+ inline Result *getSpecificCanonicalDecl(Decl *D, Result *(Class::*Get)()) {
+ return (llvm::cast<Class>(D)->*Get)();
+ }
+
+ inline Decl *getSpecificCanonicalDecl(Decl *D, Decl *(Decl::*)()) {
+ // No specific implementation.
+ return D;
+ }
+}
+
+Decl *Decl::getCanonicalDecl() {
+ switch (getKind()) {
+#define ABSTRACT_DECL(Type)
+#define DECL(Type, Base) \
+ case Type: \
+ return getSpecificCanonicalDecl(this, &Type##Decl::getCanonicalDecl);
+#include "clang/AST/DeclNodes.inc"
+ }
+ return this;
+
+}
//===----------------------------------------------------------------------===//
// PrettyStackTraceDecl Implementation