diff options
author | David Majnemer <david.majnemer@gmail.com> | 2016-07-04 00:24:59 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2016-07-04 00:24:59 +0000 |
commit | 3b568aa4ed932275fb2fce0553d621cc2a00a5cc (patch) | |
tree | 721882633872acc008347f1848b05fc637b02b96 | |
parent | c804751a18766f40a60875d44ec3c048d7fb6e7d (diff) | |
download | bcm5719-llvm-3b568aa4ed932275fb2fce0553d621cc2a00a5cc.tar.gz bcm5719-llvm-3b568aa4ed932275fb2fce0553d621cc2a00a5cc.zip |
[Sema] A flexible array member must not be the only named member
We didn't correctly detect situations where a flexible array member was
the only named member in a record.
This fixes PR28407.
llvm-svn: 274477
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 6 | ||||
-rw-r--r-- | clang/test/Sema/MicrosoftExtensions.c | 6 |
2 files changed, 8 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 0567a59f8da..7797ff1efc4 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -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() diff --git a/clang/test/Sema/MicrosoftExtensions.c b/clang/test/Sema/MicrosoftExtensions.c index cdef5dc309d..62e5285970a 100644 --- a/clang/test/Sema/MicrosoftExtensions.c +++ b/clang/test/Sema/MicrosoftExtensions.c @@ -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 { |