]> granicus.if.org Git - clang/commitdiff
Clean up the C89/C++ warnings about C99 array features to not
authorChris Lattner <sabre@nondot.org>
Thu, 18 Dec 2008 06:50:14 +0000 (06:50 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 18 Dec 2008 06:50:14 +0000 (06:50 +0000)
emit duplicate diags (some in parser and some in sema) and to
warn about use of typequals in array sizes.  This implements
PR2759.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61197 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticKinds.def
lib/Parse/ParseDecl.cpp
lib/Sema/SemaType.cpp
test/Sema/c89.c

index 38d084fc99cc7d204c4dee2c9bc62739c5c7df9f..39464efd6aec760ae8a16da6c57cdb5a2fbcf83f 100644 (file)
@@ -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,
index 1a8e5d9f95567e76401a3bfc747965fccd25222f..e31b87bd4322bd3854d81d90cd0607ffe2eec29c 100644 (file)
@@ -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,
index 3f911f5b0cde10888f7657cfe667b1221ba33542..a6441c8d7040c8385848e11f54950828efa1fb79 100644 (file)
@@ -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:
index b1780e916102440950e82088b7b09029eddbcaa8..0c7496ac7a27fefd53786e6bb9e0d2568c116dc8 100644 (file)
@@ -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}} */
+}