]> granicus.if.org Git - clang/commitdiff
The pre-increment/pre-decrement grammar in C++ differs from that in C,
authorDouglas Gregor <dgregor@apple.com>
Fri, 6 Aug 2010 14:50:36 +0000 (14:50 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 6 Aug 2010 14:50:36 +0000 (14:50 +0000)
but we were parsing the C grammar. Handle the C++ grammar
appropriately. Fixes PR7794.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@110445 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Parse/ParseExpr.cpp
test/SemaCXX/increment-decrement.cpp [moved from test/SemaCXX/inc-decrement-qualifiers.cpp with 84% similarity]

index 589bf4a35f8c118dd989f1a274cecfc0ab402b5a..ec92f0869e5f430a8e98158ab7d73ea158acee4f 100644 (file)
@@ -568,7 +568,7 @@ Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression,
     // If this expression is limited to being a unary-expression, the parent can
     // not start a cast expression.
     ParenParseOption ParenExprType =
-      isUnaryExpression ? CompoundLiteral : CastExpr;
+      (isUnaryExpression && !getLang().CPlusPlus)? CompoundLiteral : CastExpr;
     TypeTy *CastTy;
     SourceLocation LParenLoc = Tok.getLocation();
     SourceLocation RParenLoc;
@@ -702,10 +702,14 @@ Parser::OwningExprResult Parser::ParseCastExpression(bool isUnaryExpression,
   case tok::kw___null:
     return Actions.ActOnGNUNullExpr(ConsumeToken());
     break;
-  case tok::plusplus:      // unary-expression: '++' unary-expression
-  case tok::minusminus: {  // unary-expression: '--' unary-expression
+  case tok::plusplus:      // unary-expression: '++' unary-expression [C99]
+  case tok::minusminus: {  // unary-expression: '--' unary-expression [C99]
+    // C++ [expr.unary] has:
+    //   unary-expression:
+    //     ++ cast-expression
+    //     -- cast-expression
     SourceLocation SavedLoc = ConsumeToken();
-    Res = ParseCastExpression(true);
+    Res = ParseCastExpression(!getLang().CPlusPlus);
     if (!Res.isInvalid())
       Res = Actions.ActOnUnaryOp(getCurScope(), SavedLoc, SavedKind, move(Res));
     return move(Res);
similarity index 84%
rename from test/SemaCXX/inc-decrement-qualifiers.cpp
rename to test/SemaCXX/increment-decrement.cpp
index ba837a9c06db937f2fb8422c50c2314a9639ccf0..11b7d1e12f4e1845007c8ce389669e05fa39948a 100644 (file)
@@ -7,3 +7,8 @@ const int &dec = i--;
 
 const int &incfail = ++i; // expected-error {{drops qualifiers}}
 const int &decfail = --i; // expected-error {{drops qualifiers}}
+
+// PR7794
+void f0(int e) {
+  ++(int&)e;
+}