diff options
-rw-r--r-- | include/clang/Basic/DiagnosticKinds.def | 2 | ||||
-rw-r--r-- | lib/Parse/ParseDecl.cpp | 17 | ||||
-rw-r--r-- | lib/Sema/SemaType.cpp | 12 | ||||
-rw-r--r-- | test/Sema/c89.c | 7 |
4 files changed, 20 insertions, 18 deletions
diff --git a/include/clang/Basic/DiagnosticKinds.def b/include/clang/Basic/DiagnosticKinds.def index 38d084fc99..39464efd6a 100644 --- a/include/clang/Basic/DiagnosticKinds.def +++ b/include/clang/Basic/DiagnosticKinds.def @@ -310,7 +310,7 @@ DIAG(warn_enum_value_overflow, WARNING, DIAG(ext_ident_list_in_param, EXTENSION, "type-less parameter names in function declaration") DIAG(ext_c99_array_usage, EXTENSION, - "use of C99-specific array features") + "use of C99-specific array features, accepted as an extension") DIAG(ext_c99_variable_decl_in_for_loop, EXTENSION, "variable declaration in for loop is a C99-specific feature") DIAG(ext_c99_compound_literal, EXTENSION, diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 1a8e5d9f95..e31b87bd43 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -1283,7 +1283,7 @@ void Parser::ParseTypeQualifierListOpt(DeclSpec &DS) { DS.AddAttributes(ParseAttributes()); continue; // do *not* consume the next token! } - + // If the specifier combination wasn't legal, issue a diagnostic. if (isInvalid) { assert(PrevSpec && "Method did not return previous specifier!"); @@ -1943,6 +1943,7 @@ void Parser::ParseBracketDeclarator(Declarator &D) { StaticLoc = ConsumeToken(); // If there is a type-qualifier-list, read it now. + // Type qualifiers in an array subscript are a C99 feature. DeclSpec DS; ParseTypeQualifierListOpt(DS); @@ -1962,9 +1963,10 @@ void Parser::ParseBracketDeclarator(Declarator &D) { if (Tok.is(tok::star) && GetLookAheadToken(1).is(tok::r_square)) { ConsumeToken(); // Eat the '*'. - if (StaticLoc.isValid()) + if (StaticLoc.isValid()) { Diag(StaticLoc, diag::err_unspecified_vla_size_with_static); - StaticLoc = SourceLocation(); // Drop the static. + StaticLoc = SourceLocation(); // Drop the static. + } isStar = true; } else if (Tok.isNot(tok::r_square)) { // Parse the assignment-expression now. @@ -1980,15 +1982,6 @@ void Parser::ParseBracketDeclarator(Declarator &D) { MatchRHSPunctuation(tok::r_square, StartLoc); - // If C99 isn't enabled, emit an ext-warn if the arg list wasn't empty and if - // it was not a constant expression. - if (!getLang().C99) { - // TODO: check C90 array constant exprness. - if (isStar || StaticLoc.isValid() || - 0/*TODO: NumElts is not a C90 constantexpr */) - Diag(StartLoc, diag::ext_c99_array_usage); - } - // Remember that we parsed a pointer type, and remember the type-quals. D.AddTypeInfo(DeclaratorChunk::getArray(DS.getTypeQualifiers(), StaticLoc.isValid(), isStar, diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index 3f911f5b0c..a6441c8d70 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -416,11 +416,13 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S, unsigned Skip) { T = Context.getConstantArrayType(T, ConstVal, ASM, ATI.TypeQuals); } // If this is not C99, extwarn about VLA's and C99 array size modifiers. - if (!getLangOptions().C99 && - (ASM != ArrayType::Normal || - (ArraySize && !ArraySize->isValueDependent() && - !ArraySize->isIntegerConstantExpr(Context)))) - Diag(D.getIdentifierLoc(), diag::ext_vla); + if (!getLangOptions().C99) { + if (ArraySize && !ArraySize->isValueDependent() && + !ArraySize->isIntegerConstantExpr(Context)) + Diag(D.getIdentifierLoc(), diag::ext_vla); + else if (ASM != ArrayType::Normal || ATI.TypeQuals != 0) + Diag(D.getIdentifierLoc(), diag::ext_c99_array_usage); + } break; } case DeclaratorChunk::Function: diff --git a/test/Sema/c89.c b/test/Sema/c89.c index b1780e9161..0c7496ac7a 100644 --- a/test/Sema/c89.c +++ b/test/Sema/c89.c @@ -60,3 +60,10 @@ void foo(T); /* typedef for void is allowed */ void foo(void) {} +/* PR2759 */ +void test10 (int x[*]); /* expected-warning {{use of C99-specific array features}} */ +void test11 (int x[static 4]); /* expected-warning {{use of C99-specific array features}} */ + +void test12 (int x[const 4]) { /* expected-warning {{use of C99-specific array features}} */ + int Y[x[1]]; /* expected-warning {{variable length arrays are a C99 feature, accepted as an extension}} */ +} |