diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-01-16 18:33:17 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-01-16 18:33:17 +0000 |
commit | 506ae418eb171d072f2fb4f6bc46d258b52cbf97 (patch) | |
tree | 65fd4af7044c1e6b48175dceded9229cf676f4b2 /lib/AST/StmtSerialization.cpp | |
parent | ab654afb2d49a9a7db2727b69708ac479728f2a1 (diff) |
Part one of handling C++ functional casts. This handles semantic
analysis and AST-building for the cases where we have N != 1
arguments. For N == 1 arguments, we need to finish the C++
implementation of explicit type casts (C++ [expr.cast]).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62329 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/StmtSerialization.cpp')
-rw-r--r-- | lib/AST/StmtSerialization.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/AST/StmtSerialization.cpp b/lib/AST/StmtSerialization.cpp index 02ccde3da2..39330ce335 100644 --- a/lib/AST/StmtSerialization.cpp +++ b/lib/AST/StmtSerialization.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "clang/Basic/TypeTraits.h" +#include "clang/AST/DeclCXX.h" #include "clang/AST/Expr.h" #include "clang/AST/ExprCXX.h" #include "clang/AST/ExprObjC.h" @@ -232,6 +233,9 @@ Stmt* Stmt::Create(Deserializer& D, ASTContext& C) { case CXXThisExprClass: return CXXThisExpr::CreateImpl(D, C); + case CXXTemporaryObjectExprClass: + return CXXTemporaryObjectExpr::CreateImpl(D, C); + case CXXZeroInitValueExprClass: return CXXZeroInitValueExpr::CreateImpl(D, C); @@ -1441,6 +1445,40 @@ CXXThisExpr* CXXThisExpr::CreateImpl(llvm::Deserializer& D, ASTContext&) { return new CXXThisExpr(Loc, Ty); } +void CXXTemporaryObjectExpr::EmitImpl(llvm::Serializer& S) const { + S.Emit(getType()); + S.Emit(TyBeginLoc); + S.Emit(RParenLoc); + S.EmitPtr(cast<Decl>(Constructor)); + S.EmitInt(NumArgs); + if (NumArgs > 0) + S.BatchEmitOwnedPtrs(NumArgs, Args); +} + +CXXTemporaryObjectExpr * +CXXTemporaryObjectExpr::CreateImpl(llvm::Deserializer& D, ASTContext& C) { + QualType writtenTy = QualType::ReadVal(D); + SourceLocation tyBeginLoc = SourceLocation::ReadVal(D); + SourceLocation rParenLoc = SourceLocation::ReadVal(D); + CXXConstructorDecl * Cons = cast_or_null<CXXConstructorDecl>(D.ReadPtr<Decl>()); + unsigned NumArgs = D.ReadInt(); + Stmt** Args = 0; + if (NumArgs > 0) { + Args = new Stmt*[NumArgs]; + D.BatchReadOwnedPtrs(NumArgs, Args, C); + } + + CXXTemporaryObjectExpr * Result + = new CXXTemporaryObjectExpr(Cons, writtenTy, tyBeginLoc, + (Expr**)Args, NumArgs, rParenLoc); + + if (NumArgs > 0) + delete [] Args; + + return Result; +} + + void CXXZeroInitValueExpr::EmitImpl(Serializer& S) const { S.Emit(getType()); S.Emit(TyBeginLoc); |