forked from OSchip/llvm-project
[Parse] Make -Wgcc-compat complain about for loop inits in C89
While clang allows declarations in for loop init statements in c89 and gnu89, gcc does not. So, we should probably warn if users care about gcc compatibility. Differential Revision: https://reviews.llvm.org/D47840 llvm-svn: 335927
This commit is contained in:
parent
53ac1a2ed4
commit
4d45645568
|
@ -173,6 +173,9 @@ def warn_attribute_on_function_definition : Warning<
|
|||
def warn_gcc_attribute_location : Warning<
|
||||
"GCC does not allow an attribute in this position on a function declaration">,
|
||||
InGroup<GccCompat>;
|
||||
def warn_gcc_variable_decl_in_for_loop : Warning<
|
||||
"GCC does not allow variable declarations in for loop initializers before "
|
||||
"C99">, InGroup<GccCompat>;
|
||||
def warn_attribute_no_decl : Warning<
|
||||
"attribute %0 ignored, because it is not attached to a declaration">,
|
||||
InGroup<IgnoredAttributes>;
|
||||
|
|
|
@ -1624,8 +1624,10 @@ StmtResult Parser::ParseForStatement(SourceLocation *TrailingElseLoc) {
|
|||
ParenBraceBracketBalancer BalancerRAIIObj(*this);
|
||||
|
||||
// Parse declaration, which eats the ';'.
|
||||
if (!C99orCXXorObjC) // Use of C99-style for loops in C90 mode?
|
||||
if (!C99orCXXorObjC) { // Use of C99-style for loops in C90 mode?
|
||||
Diag(Tok, diag::ext_c99_variable_decl_in_for_loop);
|
||||
Diag(Tok, diag::warn_gcc_variable_decl_in_for_loop);
|
||||
}
|
||||
|
||||
// In C++0x, "for (T NS:a" might not be a typo for ::
|
||||
bool MightBeForRangeStmt = getLangOpts().CPlusPlus;
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
// RUN: %clang_cc1 -std=c89 -fsyntax-only -verify %s
|
||||
// RUN: %clang_cc1 -std=gnu89 -fsyntax-only -verify %s
|
||||
// RUN: %clang_cc1 -std=c99 -fsyntax-only -verify %s -DC99
|
||||
|
||||
#ifdef C99
|
||||
// expected-no-diagnostics
|
||||
#endif
|
||||
|
||||
void foo() {
|
||||
#ifndef C99
|
||||
// expected-warning@+2{{GCC does not allow variable declarations in for loop initializers before C99}}
|
||||
#endif
|
||||
for (int i = 0; i < 10; i++)
|
||||
;
|
||||
}
|
Loading…
Reference in New Issue