[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