aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Parse/ParseDecl.cpp17
-rw-r--r--lib/Sema/SemaType.cpp12
2 files changed, 12 insertions, 17 deletions
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: