[cfe-commits] r76980 - in /cfe/trunk: include/clang/AST/DeclCXX.h lib/AST/DeclCXX.cpp lib/AST/DeclPrinter.cpp lib/CodeGen/CGCXX.cpp

Fariborz Jahanian fjahanian at apple.com
Fri Jul 24 10:57:02 PDT 2009


Author: fjahanian
Date: Fri Jul 24 12:57:02 2009
New Revision: 76980

URL: http://llvm.org/viewvc/llvm-project?rev=76980&view=rev
Log:
More work toward initialization of objects
in constructors.

Modified:
    cfe/trunk/include/clang/AST/DeclCXX.h
    cfe/trunk/lib/AST/DeclCXX.cpp
    cfe/trunk/lib/AST/DeclPrinter.cpp
    cfe/trunk/lib/CodeGen/CGCXX.cpp

Modified: cfe/trunk/include/clang/AST/DeclCXX.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=76980&r1=76979&r2=76980&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/DeclCXX.h (original)
+++ cfe/trunk/include/clang/AST/DeclCXX.h Fri Jul 24 12:57:02 2009
@@ -14,6 +14,7 @@
 #ifndef LLVM_CLANG_AST_DECLCXX_H
 #define LLVM_CLANG_AST_DECLCXX_H
 
+#include "clang/AST/Expr.h"
 #include "clang/AST/Decl.h"
 #include "llvm/ADT/SmallVector.h"
 
@@ -733,7 +734,7 @@
   uintptr_t BaseOrMember;
 
   /// Args - The arguments used to initialize the base or member.
-  Expr **Args;
+  Stmt **Args;
   unsigned NumArgs;
   
   /// CtorToCall - For a base or member needing a constructor for their
@@ -761,11 +762,11 @@
 
   /// arg_iterator - Iterates through the member initialization
   /// arguments.
-  typedef Expr **arg_iterator;
+  typedef ExprIterator arg_iterator;
 
   /// arg_const_iterator - Iterates through the member initialization
   /// arguments.
-  typedef Expr * const * arg_const_iterator;
+  typedef ConstExprIterator const_arg_iterator;
 
   /// getBaseOrMember - get the generic 'member' representing either the field
   /// or a base class.
@@ -811,19 +812,19 @@
       return 0;
   }
 
-  CXXConstructorDecl *getConstructor() const { return CtorToCall; }
+  const CXXConstructorDecl *getConstructor() const { return CtorToCall; }
   
   SourceLocation getSourceLocation() const { return IdLoc; }
   
-  /// begin() - Retrieve an iterator to the first initializer argument.
-  arg_iterator       begin()       { return Args; }
-  /// begin() - Retrieve an iterator to the first initializer argument.
-  arg_const_iterator begin() const { return Args; }
-
-  /// end() - Retrieve an iterator past the last initializer argument.
-  arg_iterator       end()       { return Args + NumArgs; }
-  /// end() - Retrieve an iterator past the last initializer argument.
-  arg_const_iterator end() const { return Args + NumArgs; }
+  /// arg_begin() - Retrieve an iterator to the first initializer argument.
+  arg_iterator       arg_begin()       { return Args; }
+  /// arg_begin() - Retrieve an iterator to the first initializer argument.
+  const_arg_iterator const_arg_begin() const { return Args; }
+
+  /// arg_end() - Retrieve an iterator past the last initializer argument.
+  arg_iterator       arg_end()       { return Args + NumArgs; }
+  /// arg_end() - Retrieve an iterator past the last initializer argument.
+  const_arg_iterator const_arg_end() const { return Args + NumArgs; }
 
   /// getNumArgs - Determine the number of arguments used to
   /// initialize the member or base.

Modified: cfe/trunk/lib/AST/DeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=76980&r1=76979&r2=76980&view=diff

==============================================================================
--- cfe/trunk/lib/AST/DeclCXX.cpp (original)
+++ cfe/trunk/lib/AST/DeclCXX.cpp Fri Jul 24 12:57:02 2009
@@ -389,7 +389,8 @@
   
   if (NumArgs > 0) {
     this->NumArgs = NumArgs;
-    this->Args = new Expr*[NumArgs];
+    // FIXME. Allocation via Context
+    this->Args = new Stmt*[NumArgs];
     for (unsigned Idx = 0; Idx < NumArgs; ++Idx)
       this->Args[Idx] = Args[Idx];
   }
@@ -406,7 +407,7 @@
 
   if (NumArgs > 0) {
     this->NumArgs = NumArgs;
-    this->Args = new Expr*[NumArgs];
+    this->Args = new Stmt*[NumArgs];
     for (unsigned Idx = 0; Idx < NumArgs; ++Idx)
       this->Args[Idx] = Args[Idx];
   }

Modified: cfe/trunk/lib/AST/DeclPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclPrinter.cpp?rev=76980&r1=76979&r2=76980&view=diff

==============================================================================
--- cfe/trunk/lib/AST/DeclPrinter.cpp (original)
+++ cfe/trunk/lib/AST/DeclPrinter.cpp Fri Jul 24 12:57:02 2009
@@ -346,7 +346,8 @@
           CXXBaseOrMemberInitializer * BMInitializer = (*B);
           if (B != CDecl->init_begin())
             Out << ", ";
-          bool hasArguments = (BMInitializer->begin() != BMInitializer->end());
+          bool hasArguments = (BMInitializer->arg_begin() != 
+                               BMInitializer->arg_end());
           if (BMInitializer->isMemberInitializer()) {
             FieldDecl *FD = BMInitializer->getMember();
             Out <<  FD->getNameAsString();
@@ -360,12 +361,12 @@
           }
           if (hasArguments) {
             Out << "(";
-            for (CXXBaseOrMemberInitializer::arg_const_iterator BE = 
-                 BMInitializer->begin(), EE =  BMInitializer->end(); 
-                 BE != EE; BE++) {
-              if (BE != BMInitializer->begin())
+            for (CXXBaseOrMemberInitializer::const_arg_iterator BE = 
+                 BMInitializer->const_arg_begin(), 
+                 EE =  BMInitializer->const_arg_end(); BE != EE; ++BE) {
+              if (BE != BMInitializer->const_arg_begin())
                 Out<< ", ";
-              Expr *Exp = (*BE);
+              const Expr *Exp = (*BE);
               Exp->printPretty(Out, Context, 0, Policy, Indentation);
             }
             Out << ")";

Modified: cfe/trunk/lib/CodeGen/CGCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXX.cpp?rev=76980&r1=76979&r2=76980&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCXX.cpp Fri Jul 24 12:57:02 2009
@@ -432,13 +432,22 @@
       QualType FieldType = getContext().getCanonicalType((Field)->getType());
       assert(!getContext().getAsArrayType(FieldType) 
              && "FIXME. Field arrays initialization unsupported");
-      assert(!FieldType->getAsRecordType() 
-             && "FIXME. Field class initialization unsupported");
+
       llvm::Value *LoadOfThis = LoadCXXThis();
       LValue LHS = EmitLValueForField(LoadOfThis, Field, false, 0);
+      if (FieldType->getAsRecordType()) {
+        
+          assert(Member->getConstructor() && 
+                 "EmitCtorPrologue - no constructor to initialize member");
+          EmitCXXConstructorCall(Member->getConstructor(),
+                                 Ctor_Complete, LHS.getAddress(),
+                                 Member->const_arg_begin(), 
+                                 Member->const_arg_end());
+        continue;
+      }
       
       assert(Member->getNumArgs() == 1 && "Initializer count must be 1 only");
-      Expr *RhsExpr = *Member->begin();
+      Expr *RhsExpr = *Member->arg_begin();
       llvm::Value *RHS = EmitScalarExpr(RhsExpr, true);
       if (LHS.isBitfield())
         EmitStoreThroughBitfieldLValue(RValue::get(RHS), LHS, FieldType, 0);





More information about the cfe-commits mailing list