]> granicus.if.org Git - clang/commitdiff
Add setters/getters to CXXMethodDecl so it can keep track of which virtual member...
authorAnders Carlsson <andersca@mac.com>
Sat, 16 May 2009 23:58:37 +0000 (23:58 +0000)
committerAnders Carlsson <andersca@mac.com>
Sat, 16 May 2009 23:58:37 +0000 (23:58 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71968 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclCXX.h
lib/AST/DeclCXX.cpp

index 28a6f2d36748e78045c61d2f3fd37893e7e98caf..85ca2503d76502065f76af3baaccaf38b70e0958 100644 (file)
@@ -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.
index 361fef0325d09678e6c6b1a4e103bf8715734839..30d76cb9e3d3c59980cda8960690269021744aef 100644 (file)
@@ -194,6 +194,47 @@ CXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD,
   return new (C) CXXMethodDecl(CXXMethod, RD, L, N, T, isStatic, isInline);
 }
 
+
+typedef llvm::DenseMap<const CXXMethodDecl*, 
+                       std::vector<const CXXMethodDecl *> *> 
+                       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<const CXXMethodDecl *> *&Methods = (*OverriddenMethods)[this];
+  if (!Methods)
+    Methods = new std::vector<const CXXMethodDecl *>;
+  
+  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*,