diff options
Diffstat (limited to 'lib/AST')
-rw-r--r-- | lib/AST/Expr.cpp | 7 | ||||
-rw-r--r-- | lib/AST/ExprCXX.cpp | 8 | ||||
-rw-r--r-- | lib/AST/StmtPrinter.cpp | 11 | ||||
-rw-r--r-- | lib/AST/StmtSerialization.cpp | 36 |
4 files changed, 60 insertions, 2 deletions
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index a3efab637d..9085d2cc0d 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -360,6 +360,7 @@ bool Expr::hasLocalSideEffect() const { return false; } case ExplicitCastExprClass: + case CXXFunctionalCastExprClass: // If this is a cast to void, check the operand. Otherwise, the result of // the cast is unused. if (getType()->isVoidType()) @@ -643,7 +644,8 @@ bool Expr::isConstantExpr(ASTContext &Ctx, SourceLocation *Loc) const { return true; } case ImplicitCastExprClass: - case ExplicitCastExprClass: { + case ExplicitCastExprClass: + case CXXFunctionalCastExprClass: { const Expr *SubExpr = cast<CastExpr>(this)->getSubExpr(); SourceLocation CastLoc = getLocStart(); if (!SubExpr->isConstantExpr(Ctx, Loc)) { @@ -931,7 +933,8 @@ bool Expr::isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx, break; } case ImplicitCastExprClass: - case ExplicitCastExprClass: { + case ExplicitCastExprClass: + case CXXFunctionalCastExprClass: { const Expr *SubExpr = cast<CastExpr>(this)->getSubExpr(); SourceLocation CastLoc = getLocStart(); diff --git a/lib/AST/ExprCXX.cpp b/lib/AST/ExprCXX.cpp index 6069438137..cf85ae2d75 100644 --- a/lib/AST/ExprCXX.cpp +++ b/lib/AST/ExprCXX.cpp @@ -45,3 +45,11 @@ Stmt::child_iterator CXXDefaultArgExpr::child_begin() { Stmt::child_iterator CXXDefaultArgExpr::child_end() { return child_iterator(); } + +// CXXZeroInitValueExpr +Stmt::child_iterator CXXZeroInitValueExpr::child_begin() { + return child_iterator(); +} +Stmt::child_iterator CXXZeroInitValueExpr::child_end() { + return child_iterator(); +} diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp index 5b4c0ec7ce..a76506007d 100644 --- a/lib/AST/StmtPrinter.cpp +++ b/lib/AST/StmtPrinter.cpp @@ -818,6 +818,17 @@ void StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) { // Nothing to print: we picked up the default argument } +void StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) { + OS << Node->getType().getAsString(); + OS << "("; + PrintExpr(Node->getSubExpr()); + OS << ")"; +} + +void StmtPrinter::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *Node) { + OS << Node->getType().getAsString() << "()"; +} + // Obj-C void StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) { diff --git a/lib/AST/StmtSerialization.cpp b/lib/AST/StmtSerialization.cpp index 9859846292..1c61b66512 100644 --- a/lib/AST/StmtSerialization.cpp +++ b/lib/AST/StmtSerialization.cpp @@ -197,6 +197,12 @@ Stmt* Stmt::Create(Deserializer& D, ASTContext& C) { case CXXDefaultArgExprClass: return CXXDefaultArgExpr::CreateImpl(D, C); + + case CXXFunctionalCastExprClass: + return CXXFunctionalCastExpr::CreateImpl(D, C); + + case CXXZeroInitValueExprClass: + return CXXZeroInitValueExpr::CreateImpl(D, C); } } @@ -1101,3 +1107,33 @@ CXXDefaultArgExpr *CXXDefaultArgExpr::CreateImpl(Deserializer& D, ASTContext& C) D.ReadPtr(Param, false); return new CXXDefaultArgExpr(Param); } + +void CXXFunctionalCastExpr::EmitImpl(Serializer& S) const { + S.Emit(getType()); + S.Emit(TyBeginLoc); + S.Emit(RParenLoc); + S.EmitOwnedPtr(getSubExpr()); +} + +CXXFunctionalCastExpr * +CXXFunctionalCastExpr::CreateImpl(Deserializer& D, ASTContext& C) { + QualType Ty = QualType::ReadVal(D); + SourceLocation TyBeginLoc = SourceLocation::ReadVal(D); + SourceLocation RParenLoc = SourceLocation::ReadVal(D); + Expr* SubExpr = D.ReadOwnedPtr<Expr>(C); + return new CXXFunctionalCastExpr(Ty, TyBeginLoc, SubExpr, RParenLoc); +} + +void CXXZeroInitValueExpr::EmitImpl(Serializer& S) const { + S.Emit(getType()); + S.Emit(TyBeginLoc); + S.Emit(RParenLoc); +} + +CXXZeroInitValueExpr * +CXXZeroInitValueExpr::CreateImpl(Deserializer& D, ASTContext& C) { + QualType Ty = QualType::ReadVal(D); + SourceLocation TyBeginLoc = SourceLocation::ReadVal(D); + SourceLocation RParenLoc = SourceLocation::ReadVal(D); + return new CXXZeroInitValueExpr(Ty, TyBeginLoc, RParenLoc); +} |