summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2016-10-20 18:29:25 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2016-10-20 18:29:25 +0000
commitf70a906a11d68f716a7337341b4dddb418081a3f (patch)
tree1ae83b4abab111a4213192cae7b9f8df5f022761
parent521e5ef4ceb2f2cf67e44b2dc0442a6c9ca880fb (diff)
downloadbcm5719-llvm-f70a906a11d68f716a7337341b4dddb418081a3f.tar.gz
bcm5719-llvm-f70a906a11d68f716a7337341b4dddb418081a3f.zip
[c++1z] Fix assertion failure when using the wrong number of bindings for a
struct with unnamed bitfields. llvm-svn: 284761
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp4
-rw-r--r--clang/test/SemaCXX/cxx1z-decomposition.cpp6
2 files changed, 9 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index f86b793df57..c1938d5e8e6 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -1279,7 +1279,9 @@ static bool checkMemberDecomposition(Sema &S, ArrayRef<BindingDecl*> Bindings,
DecompType.getQualifiers());
auto DiagnoseBadNumberOfBindings = [&]() -> bool {
- unsigned NumFields = std::distance(RD->field_begin(), RD->field_end());
+ unsigned NumFields =
+ std::count_if(RD->field_begin(), RD->field_end(),
+ [](FieldDecl *FD) { return !FD->isUnnamedBitfield(); });
assert(Bindings.size() != NumFields);
S.Diag(Src->getLocation(), diag::err_decomp_decl_wrong_number_bindings)
<< DecompType << (unsigned)Bindings.size() << NumFields
diff --git a/clang/test/SemaCXX/cxx1z-decomposition.cpp b/clang/test/SemaCXX/cxx1z-decomposition.cpp
index 12c863c8c3f..762dd7b94de 100644
--- a/clang/test/SemaCXX/cxx1z-decomposition.cpp
+++ b/clang/test/SemaCXX/cxx1z-decomposition.cpp
@@ -47,4 +47,10 @@ void enclosing() {
(void) [n] {}; // expected-error {{'n' in capture list does not name a variable}}
}
+void bitfield() {
+ struct { int a : 3, : 4, b : 5; } a;
+ auto &[x, y] = a;
+ auto &[p, q, r] = a; // expected-error {{decomposes into 2 elements, but 3 names were provided}}
+}
+
// FIXME: by-value array copies
OpenPOWER on IntegriCloud