]> granicus.if.org Git - clang/commitdiff
PCH support for ParenExpr
authorDouglas Gregor <dgregor@apple.com>
Tue, 14 Apr 2009 23:59:37 +0000 (23:59 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 14 Apr 2009 23:59:37 +0000 (23:59 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69106 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Expr.h
include/clang/Frontend/PCHBitCodes.h
lib/Frontend/PCHReader.cpp
lib/Frontend/PCHWriter.cpp
test/PCH/exprs.h

index cc6a0a6d610a8467ac521e0f293144768af9aded..2102126eb641e5379565fb57fce1e5bd730933a2 100644 (file)
@@ -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<Expr>(Val); }
   Expr *getSubExpr() { return cast<Expr>(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; 
index 66b800c57714456d0cd34f840f803f6684b16de8..f8af0208b05037b15725f9b58a422e982754da8c 100644 (file)
@@ -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
     };
index 057e66a6f7d4a8a78679c0028ccebb9ce6a7d807..056c5d50d9bd91823811808fd0ce63d2cba3fdc8 100644 (file)
@@ -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;
index 4ca3c8d0ae6e52bd5504b8c914b2ac545d243b76..ca76243977e5cfb8f65e3dd0091ce27b24e44484 100644 (file)
@@ -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());
index 36660cc0a49edb045ef975f341c6e255f356094b..5dcb26fbe3d7455aa5d44b2b0d4236170ec2b0d7 100644 (file)
@@ -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;