From: Eli Friedman Date: Sat, 16 May 2009 23:40:44 +0000 (+0000) Subject: Make the RAII extension warning silencing for __extension__ a bit X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bc6c848f3e0ec2dc44f6e3d59ef85e884cc9b7be;p=clang Make the RAII extension warning silencing for __extension__ a bit 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 --- diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp index 20c55a1ea3..55fc0cdd6c 100644 --- a/lib/Parse/ParseExpr.cpp +++ b/lib/Parse/ParseExpr.cpp @@ -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)); diff --git a/lib/Parse/ParseStmt.cpp b/lib/Parse/ParseStmt.cpp index d0d462b66c..50db966aed 100644 --- a/lib/Parse/ParseStmt.cpp +++ b/lib/Parse/ParseStmt.cpp @@ -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); diff --git a/test/Parser/extension.c b/test/Parser/extension.c index 24f1ac5181..519dc053c8 100644 --- a/test/Parser/extension.c +++ b/test/Parser/extension.c @@ -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}} */ } diff --git a/test/SemaCXX/decl-expr-ambiguity.cpp b/test/SemaCXX/decl-expr-ambiguity.cpp index a9275dcd1f..bff333464b 100644 --- a/test/SemaCXX/decl-expr-ambiguity.cpp +++ b/test/SemaCXX/decl-expr-ambiguity.cpp @@ -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)<