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,
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!");
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);
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.
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,
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:
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}} */
+}