forked from OSchip/llvm-project
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. llvm-svn: 71967
This commit is contained in:
parent
678d3bac03
commit
15af3ee6a9
|
@ -225,8 +225,14 @@ Parser::ParseExpressionWithLeadingAt(SourceLocation AtLoc) {
|
||||||
/// process of disambiguating between an expression and a declaration.
|
/// process of disambiguating between an expression and a declaration.
|
||||||
Parser::OwningExprResult
|
Parser::OwningExprResult
|
||||||
Parser::ParseExpressionWithLeadingExtension(SourceLocation ExtLoc) {
|
Parser::ParseExpressionWithLeadingExtension(SourceLocation ExtLoc) {
|
||||||
OwningExprResult LHS(ParseCastExpression(false));
|
OwningExprResult LHS(Actions, true);
|
||||||
if (LHS.isInvalid()) return move(LHS);
|
{
|
||||||
|
// 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__,
|
LHS = Actions.ActOnUnaryOp(CurScope, ExtLoc, tok::kw___extension__,
|
||||||
move(LHS));
|
move(LHS));
|
||||||
|
|
|
@ -435,13 +435,13 @@ Parser::OwningStmtResult Parser::ParseCompoundStatementBody(bool isStmtExpr) {
|
||||||
SourceLocation ExtLoc = ConsumeToken();
|
SourceLocation ExtLoc = ConsumeToken();
|
||||||
while (Tok.is(tok::kw___extension__))
|
while (Tok.is(tok::kw___extension__))
|
||||||
ConsumeToken();
|
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 this is the start of a declaration, parse it as such.
|
||||||
if (isDeclarationStatement()) {
|
if (isDeclarationStatement()) {
|
||||||
|
// __extension__ silences extension warnings in the subdeclaration.
|
||||||
// FIXME: Save the __extension__ on the decl as a node somehow?
|
// FIXME: Save the __extension__ on the decl as a node somehow?
|
||||||
|
ExtensionRAIIObject O(Diags);
|
||||||
|
|
||||||
SourceLocation DeclStart = Tok.getLocation(), DeclEnd;
|
SourceLocation DeclStart = Tok.getLocation(), DeclEnd;
|
||||||
DeclGroupPtrTy Res = ParseDeclaration(Declarator::BlockContext,DeclEnd);
|
DeclGroupPtrTy Res = ParseDeclaration(Declarator::BlockContext,DeclEnd);
|
||||||
R = Actions.ActOnDeclStmt(Res, DeclStart, DeclEnd);
|
R = Actions.ActOnDeclStmt(Res, DeclStart, DeclEnd);
|
||||||
|
|
|
@ -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
|
__extension__ typedef struct
|
||||||
{
|
{
|
||||||
long long int quot;
|
long long int quot;
|
||||||
long long int rem;
|
long long int rem;
|
||||||
}lldiv_t;
|
} lldiv_t;
|
||||||
|
|
||||||
|
|
||||||
// Compound expr __extension__ marker.
|
/* Decl/expr __extension__ marker. */
|
||||||
void bar() {
|
void bar() {
|
||||||
__extension__ int i;
|
__extension__ int i;
|
||||||
int j;
|
int j;
|
||||||
|
__extension__ (j = 10LL);
|
||||||
|
__extension__ j = 10LL; /* expected-warning {{'long long' is an extension}} */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ void f() {
|
||||||
T(a)->m = 7;
|
T(a)->m = 7;
|
||||||
int(a)++; // expected-error {{expression is not assignable}}
|
int(a)++; // expected-error {{expression is not assignable}}
|
||||||
__extension__ 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}}
|
void(a), ++a; // expected-warning {{expression result unused}}
|
||||||
if (int(a)+1) {}
|
if (int(a)+1) {}
|
||||||
for (int(a)+1;;) {}
|
for (int(a)+1;;) {}
|
||||||
|
|
Loading…
Reference in New Issue