diff options
author | Anders Carlsson <andersca@mac.com> | 2009-04-23 02:32:43 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-04-23 02:32:43 +0000 |
commit | 0781ce7cce39214b3d860934be70ea1619dedcc1 (patch) | |
tree | 88dc7fc6c53803267496252e4fdf63383fd0504d /clang/lib/AST/ExprCXX.cpp | |
parent | 22b0ada8cf3b1c0c73714bb2079cb3ade62b43cb (diff) | |
download | bcm5719-llvm-0781ce7cce39214b3d860934be70ea1619dedcc1.tar.gz bcm5719-llvm-0781ce7cce39214b3d860934be70ea1619dedcc1.zip |
Add a CXXConstructExpr that represents an implicit call to a C++ constructor. I think CXXTemporaryObjectExpr is going to become a subclass of CXXConstructExpr, since CXXTemporaryObjectExpr represents a syntactic temporary, for example T()
llvm-svn: 69854
Diffstat (limited to 'clang/lib/AST/ExprCXX.cpp')
-rw-r--r-- | clang/lib/AST/ExprCXX.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index 0c9b6270a42..1e96395d467 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -254,6 +254,37 @@ CXXTemporaryObjectExpr::~CXXTemporaryObjectExpr() { delete [] Args; } +CXXConstructExpr *CXXConstructExpr::Create(ASTContext &C, VarDecl *VD, + QualType T, CXXConstructorDecl *D, + bool Elidable, + Expr **Args, unsigned NumArgs) { + return new (C) CXXConstructExpr(C, VD, T, D, Elidable, Args, NumArgs); +} + +CXXConstructExpr::CXXConstructExpr(ASTContext &C, VarDecl *vd, + QualType T, CXXConstructorDecl *D, + bool elidable, + Expr **args, unsigned numargs) +: Expr(CXXConstructExprClass, T, + T->isDependentType(), + (T->isDependentType() || + CallExpr::hasAnyValueDependentArguments(args, numargs))), + VD(vd), Constructor(D), Elidable(elidable), Args(0), NumArgs(numargs) { + if (NumArgs > 0) { + Args = new (C) Stmt*[NumArgs]; + for (unsigned i = 0; i < NumArgs; ++i) + Args[i] = args[i]; + } +} + +void CXXConstructExpr::Destroy(ASTContext &C) { + DestroyChildren(C); + if (Args) + C.Deallocate(Args); + this->~CXXConstructExpr(); + C.Deallocate(this); +} + CXXDestroyExpr *CXXDestroyExpr::Create(ASTContext &C, VarDecl *vd) { assert(vd->getKind() == Decl::CXXTempVar || vd->getKind() == Decl::Var && "Can only create a destroy expr with a temp var decl or a var decl!"); @@ -261,6 +292,15 @@ CXXDestroyExpr *CXXDestroyExpr::Create(ASTContext &C, VarDecl *vd) { return new (C) CXXDestroyExpr(vd, C.VoidTy); } +// CXXConstructExpr +Stmt::child_iterator CXXConstructExpr::child_begin() { + return &Args[0]; +} +Stmt::child_iterator CXXConstructExpr::child_end() { + return &Args[0]+NumArgs; +} + +// CXXDestroyExpr Stmt::child_iterator CXXDestroyExpr::child_begin() { return child_iterator(); } |