diff options
author | Anders Carlsson <andersca@mac.com> | 2009-05-30 20:03:25 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-05-30 20:03:25 +0000 |
commit | 993a4b308060443b30a98d8ca1371b341ba809b8 (patch) | |
tree | 5da5e0e0661ba8c2ac052d9a2b4fa8773563eb8a /clang/lib | |
parent | f337d8c515f6f31ab67a83070a1fb70c26f279cd (diff) | |
download | bcm5719-llvm-993a4b308060443b30a98d8ca1371b341ba809b8.tar.gz bcm5719-llvm-993a4b308060443b30a98d8ca1371b341ba809b8.zip |
Add a CXXBindTemporaryExpr.
llvm-svn: 72627
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/AST/ExprCXX.cpp | 18 | ||||
-rw-r--r-- | clang/lib/AST/StmtPrinter.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateExpr.cpp | 10 |
3 files changed, 32 insertions, 0 deletions
diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index 16b9c4b67b0..d0032fb5e5a 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -242,6 +242,15 @@ CXXTemporary *CXXTemporary::Create(ASTContext &C, return new CXXTemporary(Destructor); } +CXXBindTemporaryExpr *CXXBindTemporaryExpr::Create(ASTContext &C, + CXXTemporary *Temp, + Expr* SubExpr) { + assert(SubExpr->getType()->isRecordType() && + "Expression bound to a temporary must have record type!"); + + return new CXXBindTemporaryExpr(Temp, SubExpr); +} + CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(ASTContext &C, VarDecl *vd, CXXConstructorDecl *Cons, QualType writtenTy, @@ -303,6 +312,15 @@ CXXExprWithTemporaries::~CXXExprWithTemporaries() { delete[] Decls; } +// CXXBindTemporaryExpr +Stmt::child_iterator CXXBindTemporaryExpr::child_begin() { + return &SubExpr; +} + +Stmt::child_iterator CXXBindTemporaryExpr::child_end() { + return &SubExpr + 1; +} + // CXXConstructExpr Stmt::child_iterator CXXConstructExpr::child_begin() { return &Args[0]; diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index 594b98f863e..710da638613 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -988,6 +988,10 @@ void StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) { OS << ")"; } +void StmtPrinter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) { + PrintExpr(Node->getSubExpr()); +} + void StmtPrinter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *Node) { OS << Node->getType().getAsString(); OS << "("; diff --git a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp index c312bb85420..3b28813a725 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp @@ -976,6 +976,16 @@ TemplateExprInstantiator::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { } Sema::OwningExprResult +TemplateExprInstantiator::VisitCXXBindTemporaryExpr( + CXXBindTemporaryExpr *E) { + OwningExprResult SubExpr = Visit(E->getSubExpr()); + if (SubExpr.isInvalid()) + return SemaRef.ExprError(); + + return move(SubExpr); +} + +Sema::OwningExprResult TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) { assert(!cast<CXXRecordDecl>(E->getConstructor()->getDeclContext()) ->isDependentType() && "Dependent constructor shouldn't be here"); |