]> granicus.if.org Git - clang/commitdiff
Make the RAII extension warning silencing for __extension__ a bit
authorEli Friedman <eli.friedman@gmail.com>
Sat, 16 May 2009 23:40:44 +0000 (23:40 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Sat, 16 May 2009 23:40:44 +0000 (23:40 +0000)
narrower, so it doesn't catch expresions that aren't sub-expressions of
__extension__ operator.

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

lib/Parse/ParseExpr.cpp
lib/Parse/ParseStmt.cpp
test/Parser/extension.c
test/SemaCXX/decl-expr-ambiguity.cpp

index 20c55a1ea38184eb14ec5024a12b9bef30db75c4..55fc0cdd6c665dab551af33b09942faa9f819502 100644 (file)
@@ -225,8 +225,14 @@ Parser::ParseExpressionWithLeadingAt(SourceLocation AtLoc) {
 /// process of disambiguating between an expression and a declaration.
 Parser::OwningExprResult
 Parser::ParseExpressionWithLeadingExtension(SourceLocation ExtLoc) {
-  OwningExprResult LHS(ParseCastExpression(false));
-  if (LHS.isInvalid()) return move(LHS);
+  OwningExprResult LHS(Actions, true);
+  {
+    // Silence extension warnings in the sub-expression
+    ExtensionRAIIObject O(Diags);
+
+    LHS = ParseCastExpression(false);
+    if (LHS.isInvalid()) return move(LHS);
+  }
 
   LHS = Actions.ActOnUnaryOp(CurScope, ExtLoc, tok::kw___extension__,
                              move(LHS));
index d0d462b66ce859b21d72b18d9d8a5d8cc69087fb..50db966aedb07d635f6307ce7350033d8f10e421 100644 (file)
@@ -435,13 +435,13 @@ Parser::OwningStmtResult Parser::ParseCompoundStatementBody(bool isStmtExpr) {
       SourceLocation ExtLoc = ConsumeToken();
       while (Tok.is(tok::kw___extension__))
         ConsumeToken();
-      
-      // __extension__ silences extension warnings in the subexpression.
-      ExtensionRAIIObject O(Diags);  // Use RAII to do this.
 
       // If this is the start of a declaration, parse it as such.
       if (isDeclarationStatement()) {
+        // __extension__ silences extension warnings in the subdeclaration.
         // FIXME: Save the __extension__ on the decl as a node somehow?
+        ExtensionRAIIObject O(Diags);
+
         SourceLocation DeclStart = Tok.getLocation(), DeclEnd;
         DeclGroupPtrTy Res = ParseDeclaration(Declarator::BlockContext,DeclEnd);
         R = Actions.ActOnDeclStmt(Res, DeclStart, DeclEnd);
index 24f1ac5181a8988810bd3e99fb01eb41bdb51dbe..519dc053c82fa5d713fc9c426b7c64f135df7f79 100644 (file)
@@ -1,17 +1,20 @@
-// RUN: clang-cc %s -fsyntax-only
+/* RUN: clang-cc %s -fsyntax-only -pedantic -verify -std=c89
+ */
 
-// Top level extension marker.
+/* Top level extension marker. */
 
 __extension__ typedef struct
 {
     long long int quot; 
     long long int rem; 
-}lldiv_t; 
+} lldiv_t;
 
 
-// Compound expr __extension__ marker.
+/* Decl/expr __extension__ marker. */
 void bar() {
   __extension__ int i;
   int j;
+  __extension__ (j = 10LL);
+  __extension__ j = 10LL; /* expected-warning {{'long long' is an extension}} */
 }
 
index a9275dcd1fd498ae593f9a95b8909f7f64c16085..bff333464b913b8ea868db2050d4f7fc3b4e7314 100644 (file)
@@ -9,7 +9,7 @@ void f() {
   T(a)->m = 7;
   int(a)++; // expected-error {{expression is not assignable}}
   __extension__ int(a)++; // expected-error {{expression is not assignable}}
-  typeof(int)(a,5)<<a; // expected-error {{function-style cast to a builtin type can only take one argument}}
+  __typeof(int)(a,5)<<a; // expected-error {{function-style cast to a builtin type can only take one argument}}
   void(a), ++a; // expected-warning {{expression result unused}}
   if (int(a)+1) {}
   for (int(a)+1;;) {}