]> granicus.if.org Git - clang/commitdiff
handle __extension__ properly at block scope.
authorChris Lattner <sabre@nondot.org>
Thu, 13 Mar 2008 06:32:11 +0000 (06:32 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 13 Mar 2008 06:32:11 +0000 (06:32 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48332 91177308-0d34-0410-b5e6-96231b3b80d8

Parse/ParseStmt.cpp

index dab484211e546bc881959986b2b6ed2b26e8700f..f9800219ed5b15f9371be8b54cf49ad395ddc289 100644 (file)
@@ -431,19 +431,25 @@ Parser::StmtResult Parser::ParseCompoundStatementBody(bool isStmtExpr) {
       while (Tok.is(tok::kw___extension__))
         ConsumeToken();
       
+      // __extension__ silences extension warnings in the subexpression.
+      bool SavedExtWarn = Diags.getWarnOnExtensions();
+      Diags.setWarnOnExtensions(false);
+      
       // If this is the start of a declaration, parse it as such.
       if (isDeclarationSpecifier()) {
         // FIXME: Save the __extension__ on the decl as a node somehow.
-        // FIXME: disable extwarns.
         SourceLocation DeclStart = Tok.getLocation();
         DeclTy *Res = ParseDeclaration(Declarator::BlockContext);
         // FIXME: Pass in the right location for the end of the declstmt.
         R = Actions.ActOnDeclStmt(Res, DeclStart, DeclStart);
+        
+        Diags.setWarnOnExtensions(SavedExtWarn);
       } else {
         // Otherwise this was a unary __extension__ marker.  Parse the
         // subexpression and add the __extension__ unary op. 
-        // FIXME: disable extwarns.
         ExprResult Res = ParseCastExpression(false);
+        Diags.setWarnOnExtensions(SavedExtWarn);
+
         if (Res.isInvalid) {
           SkipUntil(tok::semi);
           continue;