]> granicus.if.org Git - clang/commitdiff
Have the CXXBaseOrMemberInitializer keep track of whether an initializer initializes...
authorAnders Carlsson <andersca@mac.com>
Mon, 12 Apr 2010 00:51:03 +0000 (00:51 +0000)
committerAnders Carlsson <andersca@mac.com>
Mon, 12 Apr 2010 00:51:03 +0000 (00:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@101004 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclCXX.h
lib/AST/DeclCXX.cpp
lib/CodeGen/CGClass.cpp
lib/Sema/SemaDeclCXX.cpp

index 9f110748d593caf239b5bdeafc23dff2d04ae1d7..29587a9b018b22a9f6d04d8639f81829e0e1ae07 100644 (file)
@@ -1057,6 +1057,10 @@ class CXXBaseOrMemberInitializer {
   /// and AnonUnionMember holds field decl for au_i1.
   FieldDecl *AnonUnionMember;
 
+  /// IsVirtual - If the initializer is a base initializer, this keeps track
+  /// of whether the base is virtual or not.
+  bool IsVirtual;
+  
   /// LParenLoc - Location of the left paren of the ctor-initializer.
   SourceLocation LParenLoc;
 
@@ -1067,7 +1071,7 @@ public:
   /// CXXBaseOrMemberInitializer - Creates a new base-class initializer.
   explicit
   CXXBaseOrMemberInitializer(ASTContext &Context,
-                             TypeSourceInfo *TInfo,
+                             TypeSourceInfo *TInfo, bool IsVirtual,
                              SourceLocation L, 
                              Expr *Init,
                              SourceLocation R);
@@ -1100,7 +1104,14 @@ public:
   /// Otherwise, returns NULL.
   const Type *getBaseClass() const;
   Type *getBaseClass();
-  
+
+  /// Returns whether the base is virtual or not.
+  bool isBaseVirtual() const {
+    assert(isBaseInitializer() && "Must call this on base initializer!");
+    
+    return IsVirtual;
+  }
+
   /// \brief Returns the declarator information for a base class initializer.
   TypeSourceInfo *getBaseClassInfo() const {
     return BaseOrMember.dyn_cast<TypeSourceInfo *>();
index 94ed85c7cd2d4adffc5be192c2849482b3b76218..28489d39c5654a0597b3791635a0c891c16ab676 100644 (file)
@@ -686,9 +686,9 @@ bool CXXMethodDecl::hasInlineBody() const {
 
 CXXBaseOrMemberInitializer::
 CXXBaseOrMemberInitializer(ASTContext &Context,
-                           TypeSourceInfo *TInfo, 
+                           TypeSourceInfo *TInfo, bool IsVirtual,
                            SourceLocation L, Expr *Init, SourceLocation R)
-  : BaseOrMember(TInfo), Init(Init), AnonUnionMember(0),
+  : BaseOrMember(TInfo), Init(Init), AnonUnionMember(0), IsVirtual(IsVirtual),
     LParenLoc(L), RParenLoc(R) 
 {
 }
index 177e86230477341c43d97596e02c24d8bd81c597..7ca8f29b7e9a3c58e08b9f17ecc73caf9f7a82c2 100644 (file)
@@ -782,15 +782,7 @@ static void EmitBaseInitializer(CodeGenFunction &CGF,
   CXXRecordDecl *BaseClassDecl =
     cast<CXXRecordDecl>(BaseType->getAs<RecordType>()->getDecl());
 
-  // FIXME: This method of determining whether a base is virtual is ridiculous;
-  // it should be part of BaseInit.
-  bool isBaseVirtual = false;
-  for (CXXRecordDecl::base_class_const_iterator I = ClassDecl->vbases_begin(),
-       E = ClassDecl->vbases_end(); I != E; ++I)
-    if (I->getType()->getAs<RecordType>()->getDecl() == BaseClassDecl) {
-      isBaseVirtual = true;
-      break;
-    }
+  bool isBaseVirtual = BaseInit->isBaseVirtual();
 
   // The base constructor doesn't construct virtual bases.
   if (CtorType == Ctor_Base && isBaseVirtual)
@@ -976,8 +968,6 @@ void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD,
 
   llvm::SmallVector<CXXBaseOrMemberInitializer *, 8> MemberInitializers;
   
-  // FIXME: Add vbase initialization
-  
   for (CXXConstructorDecl::init_const_iterator B = CD->init_begin(),
        E = CD->init_end();
        B != E; ++B) {
index d68351cc387c01029f6176949beb1dfb7fa24942..0b26e9be3aad6cf33f189e2234e191b8b24fccad 100644 (file)
@@ -1337,6 +1337,7 @@ Sema::BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo,
                           ExprTemporaries.end());
 
     return new (Context) CXXBaseOrMemberInitializer(Context, BaseTInfo, 
+                                                    /*IsVirtual=*/false,
                                                     LParenLoc, 
                                                     BaseInit.takeAs<Expr>(),
                                                     RParenLoc);
@@ -1417,12 +1418,14 @@ Sema::BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo,
       = Owned(new (Context) ParenListExpr(Context, LParenLoc, Args, NumArgs,
                                           RParenLoc));
     return new (Context) CXXBaseOrMemberInitializer(Context, BaseTInfo,
+                                                    BaseSpec->isVirtual(),
                                                     LParenLoc, 
                                                     Init.takeAs<Expr>(),
                                                     RParenLoc);
   }
 
   return new (Context) CXXBaseOrMemberInitializer(Context, BaseTInfo,
+                                                  BaseSpec->isVirtual(),
                                                   LParenLoc, 
                                                   BaseInit.takeAs<Expr>(),
                                                   RParenLoc);
@@ -1494,6 +1497,7 @@ Sema::SetBaseOrMemberInitializers(CXXConstructorDecl *Constructor,
         new (Context) CXXBaseOrMemberInitializer(Context,
                            Context.getTrivialTypeSourceInfo(VBase->getType(), 
                                                             SourceLocation()),
+                                                 /*IsVirtual=*/true,
                                                  SourceLocation(),
                                                  BaseInit.takeAs<Expr>(),
                                                  SourceLocation());
@@ -1528,6 +1532,7 @@ Sema::SetBaseOrMemberInitializers(CXXConstructorDecl *Constructor,
         new (Context) CXXBaseOrMemberInitializer(Context,
                            Context.getTrivialTypeSourceInfo(Base->getType(), 
                                                             SourceLocation()),
+                                                 /*IsVirtual=*/false,
                                                  SourceLocation(),
                                                  BaseInit.takeAs<Expr>(),
                                                  SourceLocation());