diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-09-09 23:08:42 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-09-09 23:08:42 +0000 |
| commit | 5d3507d39cb6d58bd5e46bc9194972c9b00545a9 (patch) | |
| tree | c823c040b2888bd3b09cbcee2d3db58f6de2e9c3 /clang/lib/Frontend | |
| parent | aec990efd72473be9cb6bbbfed4cc3c79dba84ef (diff) | |
| download | bcm5719-llvm-5d3507d39cb6d58bd5e46bc9194972c9b00545a9.tar.gz bcm5719-llvm-5d3507d39cb6d58bd5e46bc9194972c9b00545a9.zip | |
Improve handling of initialization by constructor, by ensuring that
such initializations properly convert constructor arguments and fill
in default arguments where necessary. This also makes the ownership
model more clear.
llvm-svn: 81394
Diffstat (limited to 'clang/lib/Frontend')
| -rw-r--r-- | clang/lib/Frontend/PCHReaderStmt.cpp | 15 | ||||
| -rw-r--r-- | clang/lib/Frontend/PCHWriterStmt.cpp | 12 |
2 files changed, 27 insertions, 0 deletions
diff --git a/clang/lib/Frontend/PCHReaderStmt.cpp b/clang/lib/Frontend/PCHReaderStmt.cpp index 45e2bfb1794..67b7c1f4408 100644 --- a/clang/lib/Frontend/PCHReaderStmt.cpp +++ b/clang/lib/Frontend/PCHReaderStmt.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "clang/Frontend/PCHReader.h" +#include "clang/AST/DeclCXX.h" #include "clang/AST/StmtVisitor.h" using namespace clang; @@ -115,6 +116,7 @@ namespace { unsigned VisitObjCAtThrowStmt(ObjCAtThrowStmt *); unsigned VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E); + unsigned VisitCXXConstructExpr(CXXConstructExpr *E); }; } @@ -847,6 +849,14 @@ unsigned PCHStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) { return num; } +unsigned PCHStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) { + VisitExpr(E); + E->setConstructor(cast<CXXConstructorDecl>(Reader.GetDecl(Record[Idx++]))); + E->setElidable(Record[Idx++]); + for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) + E->setArg(I, cast<Expr>(StmtStack[StmtStack.size() - N + I])); + return E->getNumArgs(); +} // Within the bitstream, expressions are stored in Reverse Polish // Notation, with each of the subexpressions preceding the @@ -1151,6 +1161,11 @@ Stmt *PCHReader::ReadStmt(llvm::BitstreamCursor &Cursor) { case pch::EXPR_CXX_OPERATOR_CALL: S = new (Context) CXXOperatorCallExpr(*Context, Empty); break; + + case pch::EXPR_CXX_CONSTRUCT: + S = new (Context) CXXConstructExpr(Empty, *Context, + Record[PCHStmtReader::NumExprFields + 2]); + break; } // We hit a STMT_STOP, so we're done with this expression. diff --git a/clang/lib/Frontend/PCHWriterStmt.cpp b/clang/lib/Frontend/PCHWriterStmt.cpp index a34c9923fc7..9497f973f6b 100644 --- a/clang/lib/Frontend/PCHWriterStmt.cpp +++ b/clang/lib/Frontend/PCHWriterStmt.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "clang/Frontend/PCHWriter.h" +#include "clang/AST/DeclCXX.h" #include "clang/AST/DeclObjC.h" #include "clang/AST/StmtVisitor.h" #include "llvm/Bitcode/BitstreamWriter.h" @@ -110,6 +111,7 @@ namespace { // C++ Statements void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E); + void VisitCXXConstructExpr(CXXConstructExpr *E); }; } @@ -774,6 +776,16 @@ void PCHStmtWriter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) { Code = pch::EXPR_CXX_OPERATOR_CALL; } +void PCHStmtWriter::VisitCXXConstructExpr(CXXConstructExpr *E) { + VisitExpr(E); + Writer.AddDeclRef(E->getConstructor(), Record); + Record.push_back(E->isElidable()); + Record.push_back(E->getNumArgs()); + for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) + Writer.WriteSubStmt(E->getArg(I)); + Code = pch::EXPR_CXX_CONSTRUCT; +} + //===----------------------------------------------------------------------===// // PCHWriter Implementation //===----------------------------------------------------------------------===// |

