]> granicus.if.org Git - clang/commitdiff
Sema: Flexible array members were introduced in C99, diagnose their use in C++
authorDavid Majnemer <david.majnemer@gmail.com>
Sat, 2 Nov 2013 09:22:44 +0000 (09:22 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Sat, 2 Nov 2013 09:22:44 +0000 (09:22 +0000)
The declaration of a flexible array member was correctly diagnosed as an
extension in C89 mode but not in C++.

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

include/clang/Basic/DiagnosticParseKinds.td
lib/Sema/SemaDecl.cpp
test/Sema/c89.c
test/SemaCXX/c99.cpp

index c9eb2ad58806bc8fe4d790fa80bdc17058ec6a5b..932732402c53cbc6fcdfda003a260ce712e55e97 100644 (file)
@@ -74,7 +74,7 @@ def ext_c99_variable_decl_in_for_loop : Extension<
 def ext_c99_compound_literal : Extension<
   "compound literals are a C99-specific feature">, InGroup<C99>;
 def ext_c99_flexible_array_member : Extension<
-  "Flexible array members are a C99-specific feature">, InGroup<C99>;
+  "flexible array members are a C99-specific feature">, InGroup<C99>;
 def ext_enumerator_list_comma_c : Extension<
   "commas at the end of enumerator lists are a C99-specific "
   "feature">, InGroup<C99>;
index 4c2c7d66ecb65ada996a58a9fd33e1426509fa9c..6c8b36c6cc9e3c86905d57c6d7cd7add96b31b7c 100644 (file)
@@ -11829,6 +11829,9 @@ void Sema::ActOnFields(Scope *S, SourceLocation RecLoc, Decl *EnclosingDecl,
         else if (Fields.size() == 1)
           Diag(FD->getLocation(), diag::ext_flexible_array_empty_aggregate_ms)
             << FD->getDeclName() << Record->getTagKind();
+        else
+          Diag(FD->getLocation(), diag::ext_c99_flexible_array_member)
+            << FD->getDeclName() << Record->getTagKind();
       } else if (getLangOpts().CPlusPlus) {
         if (Record->isUnion())
           Diag(FD->getLocation(), diag::ext_flexible_array_union_gnu)
@@ -11836,6 +11839,9 @@ void Sema::ActOnFields(Scope *S, SourceLocation RecLoc, Decl *EnclosingDecl,
         else if (Fields.size() == 1)
           Diag(FD->getLocation(), diag::ext_flexible_array_empty_aggregate_gnu)
             << FD->getDeclName() << Record->getTagKind();
+        else
+          Diag(FD->getLocation(), diag::ext_c99_flexible_array_member)
+            << FD->getDeclName() << Record->getTagKind();
       } else if (!getLangOpts().C99) {
         if (Record->isUnion())
           Diag(FD->getLocation(), diag::ext_flexible_array_union_gnu)
index 2ab00b6ff088c79b25d3774c637afddb36cb1867..0c42ec291f04c271aea17fac2fcb163a601560bc 100644 (file)
@@ -90,7 +90,7 @@ void test16() {
   printg("Hello, world!\n"); /* expected-warning {{implicit declaration of function 'printg'}} */
 }
 
-struct x { int x,y[]; }; /* expected-warning {{Flexible array members are a C99-specific feature}} */
+struct x { int x,y[]; }; /* expected-warning {{flexible array members are a C99-specific feature}} */
 
 /* Duplicated type-qualifiers aren't allowed by C90 */
 const const int c_i; /* expected-warning {{duplicate 'const' declaration specifier}} */
index 13918dcf5ef65a05c74476dff21e680e4e365e77..3383d595f0ed36318a014c277183b8de5563c9be 100644 (file)
@@ -2,7 +2,7 @@
 void f1(int i[static 5]) { // expected-error{{C99}}
 }
 
-struct Point { int x; int y; };
+struct Point { int x; int y; int z[]; }; // expected-warning{{flexible array members are a C99-specific feature}}
 
 Point p1 = { .x = 17, // expected-warning{{designated initializers are a C99 feature}}
              y: 25 }; // expected-warning{{designated initializers are a C99 feature}} \