]> granicus.if.org Git - clang/commitdiff
Devirtualize TagDecl::completeDefinition().
authorDouglas Gregor <dgregor@apple.com>
Thu, 17 Feb 2011 18:06:05 +0000 (18:06 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 17 Feb 2011 18:06:05 +0000 (18:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125755 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 32706d6c9012647f52808c2ac262faece561e1fc..cca25cf73fc19b0e24ff9f377d405bfe7d4cff57 100644 (file)
@@ -2485,9 +2485,8 @@ public:
     return field_begin() == field_end();
   }
 
-  /// completeDefinition - Notes that the definition of this type is
-  /// now complete.
-  virtual void completeDefinition();
+  /// \brief Indicates that the definition of this class is now complete.
+  void completeDefinition();
 
   static bool classof(const Decl *D) { return classofKind(D->getKind()); }
   static bool classof(const RecordDecl *D) { return true; }
index 64bb1cbca32f8f2d759857bf2b0b35528a23d191..3d730eff6fbf0d47372b37d005fe28f252bbc1f8 100644 (file)
@@ -447,6 +447,9 @@ class CXXRecordDecl : public RecordDecl {
   void markedVirtualFunctionPure();
   friend void FunctionDecl::setPure(bool);
   
+  void completeDefinitionImpl(CXXFinalOverriderMap *FinalOverriders);
+  friend class RecordDecl;
+  
 protected:
   CXXRecordDecl(Kind K, TagKind TK, DeclContext *DC,
                 SourceLocation L, IdentifierInfo *Id,
@@ -994,9 +997,6 @@ public:
     return (PathAccess > DeclAccess ? PathAccess : DeclAccess);
   }
 
-  /// \brief Indicates that the definition of this class is now complete.
-  virtual void completeDefinition();
-
   /// \brief Indicates that the definition of this class is now complete, 
   /// and provides a final overrider map to help determine
   /// 
index 8c55d0e7abfafc47716c86ab76f356c5abf704fa..d5e9dbf4fc7ded0ab661ef6479700eedb2f3c47b 100644 (file)
@@ -2128,13 +2128,6 @@ RecordDecl::field_iterator RecordDecl::field_begin() const {
   return field_iterator(decl_iterator(FirstDecl));
 }
 
-/// completeDefinition - Notes that the definition of this type is now
-/// complete.
-void RecordDecl::completeDefinition() {
-  assert(!isDefinition() && "Cannot redefine record!");
-  TagDecl::completeDefinition();
-}
-
 void RecordDecl::LoadFieldsFromExternalStorage() const {
   ExternalASTSource *Source = getASTContext().getExternalSource();
   assert(hasExternalLexicalStorage() && Source && "No external storage?");
@@ -2160,6 +2153,13 @@ void RecordDecl::LoadFieldsFromExternalStorage() const {
   llvm::tie(FirstDecl, LastDecl) = BuildDeclChain(Decls);
 }
 
+void RecordDecl::completeDefinition() {
+  assert(!isDefinition() && "Cannot redefine record!");
+  TagDecl::completeDefinition();
+  if (CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(this))
+    CXXRecord->completeDefinitionImpl(0);
+}
+
 //===----------------------------------------------------------------------===//
 // BlockDecl Implementation
 //===----------------------------------------------------------------------===//
index fba73f59d563319945bba9d788ecad404a8bb39d..1de3cc989ed016a4e40bc79d470a163988c69115 100644 (file)
@@ -819,13 +819,8 @@ CXXDestructorDecl *CXXRecordDecl::getDestructor() const {
   return Dtor;
 }
 
-void CXXRecordDecl::completeDefinition() {
-  completeDefinition(0);
-}
-
-void CXXRecordDecl::completeDefinition(CXXFinalOverriderMap *FinalOverriders) {
-  RecordDecl::completeDefinition();
-  
+void 
+CXXRecordDecl::completeDefinitionImpl(CXXFinalOverriderMap *FinalOverriders) {
   // If the class may be abstract (but hasn't been marked as such), check for
   // any pure final overriders.
   if (mayBeAbstract()) {
@@ -865,6 +860,12 @@ void CXXRecordDecl::completeDefinition(CXXFinalOverriderMap *FinalOverriders) {
     data().Conversions.setAccess(I, (*I)->getAccess());
 }
 
+void 
+CXXRecordDecl::completeDefinition(CXXFinalOverriderMap *FinalOverriders) {
+  TagDecl::completeDefinition();
+  completeDefinitionImpl(FinalOverriders);
+}
+
 bool CXXRecordDecl::mayBeAbstract() const {
   if (data().Abstract || isInvalidDecl() || !data().Polymorphic ||
       isDependentContext())