From: Anders Carlsson Date: Sat, 16 May 2009 23:58:37 +0000 (+0000) Subject: Add setters/getters to CXXMethodDecl so it can keep track of which virtual member... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=05eb24474218d70366b4d7d6b5b19dda2473a163;p=clang Add setters/getters to CXXMethodDecl so it can keep track of which virtual member functions it overrides (if any) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71968 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/DeclCXX.h b/include/clang/AST/DeclCXX.h index 28a6f2d367..85ca2503d7 100644 --- a/include/clang/AST/DeclCXX.h +++ b/include/clang/AST/DeclCXX.h @@ -478,9 +478,17 @@ public: } bool isVirtual() const { - // FIXME: Check if it's inherited virtual as well. - return isVirtualAsWritten(); + return isVirtualAsWritten() || + (begin_overridden_methods() != end_overridden_methods()); } + + /// + void addOverriddenMethod(const CXXMethodDecl *MD); + + typedef const CXXMethodDecl ** method_iterator; + + method_iterator begin_overridden_methods() const; + method_iterator end_overridden_methods() const; /// getParent - Returns the parent of this method declaration, which /// is the class in which this method is defined. diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp index 361fef0325..30d76cb9e3 100644 --- a/lib/AST/DeclCXX.cpp +++ b/lib/AST/DeclCXX.cpp @@ -194,6 +194,47 @@ CXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD, return new (C) CXXMethodDecl(CXXMethod, RD, L, N, T, isStatic, isInline); } + +typedef llvm::DenseMap *> + OverriddenMethodsMapTy; + +static OverriddenMethodsMapTy *OverriddenMethods = 0; + +void CXXMethodDecl::addOverriddenMethod(const CXXMethodDecl *MD) { + // FIXME: The CXXMethodDecl dtor needs to remove and free the entry. + + if (!OverriddenMethods) + OverriddenMethods = new OverriddenMethodsMapTy(); + + std::vector *&Methods = (*OverriddenMethods)[this]; + if (!Methods) + Methods = new std::vector; + + Methods->push_back(MD); +} + +CXXMethodDecl::method_iterator CXXMethodDecl::begin_overridden_methods() const { + if (!OverriddenMethods) + return 0; + + OverriddenMethodsMapTy::iterator it = OverriddenMethods->find(this); + if (it == OverriddenMethods->end()) + return 0; + return &(*it->second)[0]; +} + +CXXMethodDecl::method_iterator CXXMethodDecl::end_overridden_methods() const { + if (!OverriddenMethods) + return 0; + + OverriddenMethodsMapTy::iterator it = OverriddenMethods->find(this); + if (it == OverriddenMethods->end()) + return 0; + + return &(*it->second)[it->second->size()]; +} + QualType CXXMethodDecl::getThisType(ASTContext &C) const { // C++ 9.3.2p1: The type of this in a member function of a class X is X*. // If the member function is declared const, the type of this is const X*,