]> granicus.if.org Git - clang/commitdiff
[Sema] A flexible array member must not be the only named member
authorDavid Majnemer <david.majnemer@gmail.com>
Mon, 4 Jul 2016 00:24:59 +0000 (00:24 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Mon, 4 Jul 2016 00:24:59 +0000 (00:24 +0000)
We didn't correctly detect situations where a flexible array member was
the only named member in a record.

This fixes PR28407.

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

lib/Sema/SemaDecl.cpp
test/Sema/MicrosoftExtensions.c

index 0567a59f8da9bec00908cbebd1e115c8affed3e5..7797ff1efc44a77ad94aebde99cff62a64628de4 100644 (file)
@@ -13952,14 +13952,12 @@ void Sema::ActOnFields(Scope *S, SourceLocation RecLoc, Decl *EnclosingDecl,
                      : getLangOpts().CPlusPlus
                            ? diag::ext_flexible_array_union_gnu
                            : diag::err_flexible_array_union;
-      else if (Fields.size() == 1)
+      else if (NumNamedMembers < 1)
         DiagID = getLangOpts().MicrosoftExt
                      ? diag::ext_flexible_array_empty_aggregate_ms
                      : getLangOpts().CPlusPlus
                            ? diag::ext_flexible_array_empty_aggregate_gnu
-                           : NumNamedMembers < 1
-                                 ? diag::err_flexible_array_empty_aggregate
-                                 : 0;
+                           : diag::err_flexible_array_empty_aggregate;
 
       if (DiagID)
         Diag(FD->getLocation(), DiagID) << FD->getDeclName()
index cdef5dc309daebf312d28318eb1093474a8b5f7a..62e5285970a7ee37e9f29ae18825c5330a1f931c 100644 (file)
@@ -6,6 +6,12 @@ struct A
    int a[];  /* expected-warning {{flexible array member 'a' in otherwise empty struct is a Microsoft extension}} */
 };
 
+struct PR28407
+{
+  int : 1;
+  int a[]; /* expected-warning {{flexible array member 'a' in otherwise empty struct is a Microsoft extension}} */
+};
+
 struct C {
    int l;
    union {