From: Douglas Gregor Date: Tue, 14 Apr 2009 23:59:37 +0000 (+0000) Subject: PCH support for ParenExpr X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c04db4feefa2b0dbbc6876cb4eeeee108aa6791d;p=clang PCH support for ParenExpr git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69106 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index cc6a0a6d61..2102126eb6 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -628,15 +628,23 @@ public: val->isTypeDependent(), val->isValueDependent()), L(l), R(r), Val(val) {} + /// \brief Construct an empty parenthesized expression. + explicit ParenExpr(EmptyShell Empty) + : Expr(ParenExprClass, Empty) { } + const Expr *getSubExpr() const { return cast(Val); } Expr *getSubExpr() { return cast(Val); } + void setSubExpr(Expr *E) { Val = E; } + virtual SourceRange getSourceRange() const { return SourceRange(L, R); } /// \brief Get the location of the left parentheses '('. SourceLocation getLParen() const { return L; } + void setLParen(SourceLocation Loc) { L = Loc; } /// \brief Get the location of the right parentheses ')'. SourceLocation getRParen() const { return R; } + void setRParen(SourceLocation Loc) { R = Loc; } static bool classof(const Stmt *T) { return T->getStmtClass() == ParenExprClass; diff --git a/include/clang/Frontend/PCHBitCodes.h b/include/clang/Frontend/PCHBitCodes.h index 66b800c577..f8af0208b0 100644 --- a/include/clang/Frontend/PCHBitCodes.h +++ b/include/clang/Frontend/PCHBitCodes.h @@ -383,6 +383,8 @@ namespace clang { EXPR_FLOATING_LITERAL, /// \brief A CharacterLiteral record. EXPR_CHARACTER_LITERAL, + /// \brief A ParenExpr record. + EXPR_PAREN, /// \brief An ImplicitCastExpr record. EXPR_IMPLICIT_CAST }; diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp index 057e66a6f7..056c5d50d9 100644 --- a/lib/Frontend/PCHReader.cpp +++ b/lib/Frontend/PCHReader.cpp @@ -237,6 +237,7 @@ namespace { unsigned VisitIntegerLiteral(IntegerLiteral *E); unsigned VisitFloatingLiteral(FloatingLiteral *E); unsigned VisitCharacterLiteral(CharacterLiteral *E); + unsigned VisitParenExpr(ParenExpr *E); unsigned VisitCastExpr(CastExpr *E); unsigned VisitImplicitCastExpr(ImplicitCastExpr *E); }; @@ -286,6 +287,14 @@ unsigned PCHStmtReader::VisitCharacterLiteral(CharacterLiteral *E) { return 0; } +unsigned PCHStmtReader::VisitParenExpr(ParenExpr *E) { + VisitExpr(E); + E->setLParen(SourceLocation::getFromRawEncoding(Record[Idx++])); + E->setRParen(SourceLocation::getFromRawEncoding(Record[Idx++])); + E->setSubExpr(ExprStack.back()); + return 1; +} + unsigned PCHStmtReader::VisitCastExpr(CastExpr *E) { VisitExpr(E); E->setSubExpr(ExprStack.back()); @@ -1605,6 +1614,10 @@ Expr *PCHReader::ReadExpr() { E = new (Context) CharacterLiteral(Empty); break; + case pch::EXPR_PAREN: + E = new (Context) ParenExpr(Empty); + break; + case pch::EXPR_IMPLICIT_CAST: E = new (Context) ImplicitCastExpr(Empty); break; diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp index 4ca3c8d0ae..ca76243977 100644 --- a/lib/Frontend/PCHWriter.cpp +++ b/lib/Frontend/PCHWriter.cpp @@ -449,6 +449,7 @@ namespace { void VisitIntegerLiteral(IntegerLiteral *E); void VisitFloatingLiteral(FloatingLiteral *E); void VisitCharacterLiteral(CharacterLiteral *E); + void VisitParenExpr(ParenExpr *E); void VisitCastExpr(CastExpr *E); void VisitImplicitCastExpr(ImplicitCastExpr *E); }; @@ -497,6 +498,14 @@ void PCHStmtWriter::VisitCharacterLiteral(CharacterLiteral *E) { Code = pch::EXPR_CHARACTER_LITERAL; } +void PCHStmtWriter::VisitParenExpr(ParenExpr *E) { + VisitExpr(E); + Writer.AddSourceLocation(E->getLParen(), Record); + Writer.AddSourceLocation(E->getRParen(), Record); + Writer.WriteSubExpr(E->getSubExpr()); + Code = pch::EXPR_PAREN; +} + void PCHStmtWriter::VisitCastExpr(CastExpr *E) { VisitExpr(E); Writer.WriteSubExpr(E->getSubExpr()); diff --git a/test/PCH/exprs.h b/test/PCH/exprs.h index 36660cc0a4..5dcb26fbe3 100644 --- a/test/PCH/exprs.h +++ b/test/PCH/exprs.h @@ -11,7 +11,7 @@ typedef typeof(17) integer_literal; typedef typeof(17l) long_literal; // FloatingLiteral -typedef typeof(42.5) floating_literal; +typedef typeof((42.5)) floating_literal; // CharacterLiteral typedef typeof('a') char_literal;