aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-04-23 02:32:43 +0000
committerAnders Carlsson <andersca@mac.com>2009-04-23 02:32:43 +0000
commite349bea668622ef31bd51a229960a73d69940709 (patch)
tree8e690702d88a17b7aa9097313a02b10270f1e552 /lib
parent0941b49af3b7204ddb69ed21f07c966b8d949cf4 (diff)
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()
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69854 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/AST/ExprCXX.cpp40
-rw-r--r--lib/AST/StmtPrinter.cpp4
2 files changed, 44 insertions, 0 deletions
diff --git a/lib/AST/ExprCXX.cpp b/lib/AST/ExprCXX.cpp
index 0c9b6270a4..1e96395d46 100644
--- a/lib/AST/ExprCXX.cpp
+++ b/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();
}
diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp
index 888c15ad24..5e75a2eb61 100644
--- a/lib/AST/StmtPrinter.cpp
+++ b/lib/AST/StmtPrinter.cpp
@@ -1097,6 +1097,10 @@ void StmtPrinter::VisitUnresolvedFunctionNameExpr(UnresolvedFunctionNameExpr *E)
OS << E->getName().getAsString();
}
+void StmtPrinter::VisitCXXConstructExpr(CXXConstructExpr *E) {
+ // Nothing to print.
+}
+
void StmtPrinter::VisitCXXDestroyExpr(CXXDestroyExpr *E) {
// Nothing to print.
}