summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2016-08-12 09:19:34 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2016-08-12 09:19:34 +0000
commitdf8bf140dd79d03c21261199ae8d78cf69e6a6ae (patch)
treec8e5570d945403e75939464429817c0eb37c0f6e
parent06ae68362060928fdc391bea8061cf9d8dc622eb (diff)
downloadbcm5719-llvm-df8bf140dd79d03c21261199ae8d78cf69e6a6ae.tar.gz
bcm5719-llvm-df8bf140dd79d03c21261199ae8d78cf69e6a6ae.zip
[C++1z] Fix crash when decomposing structs with anonymous members.
The diagnostic format was invalid. llvm-svn: 278487
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td4
-rw-r--r--clang/test/CXX/dcl.decl/dcl.decomp/p4.cpp19
2 files changed, 21 insertions, 2 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index bc628143d54..788ff192113 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -405,8 +405,8 @@ def err_decomp_decl_non_public_base : Error<
def err_decomp_decl_non_public_member : Error<
"cannot decompose non-public member %0 of %1">;
def err_decomp_decl_anon_union_member : Error<
- "cannot decompose class type %1 because it has an anonymous "
- "%select{struct|union} member">;
+ "cannot decompose class type %0 because it has an anonymous "
+ "%select{struct|union}1 member">;
def err_decomp_decl_std_tuple_element_not_specialized : Error<
"cannot decompose this type; 'std::tuple_element<%0>::type' "
"does not name a type">;
diff --git a/clang/test/CXX/dcl.decl/dcl.decomp/p4.cpp b/clang/test/CXX/dcl.decl/dcl.decomp/p4.cpp
index ea225cbf9ab..c461eb6f54b 100644
--- a/clang/test/CXX/dcl.decl/dcl.decomp/p4.cpp
+++ b/clang/test/CXX/dcl.decl/dcl.decomp/p4.cpp
@@ -32,6 +32,25 @@ namespace NonPublicMembers {
}
}
+namespace AnonymousMember {
+ struct Struct {
+ struct { // expected-note {{declared here}}
+ int i;
+ };
+ };
+
+ struct Union {
+ union { // expected-note {{declared here}}
+ int i;
+ };
+ };
+
+ void test() {
+ auto [a1] = Struct(); // expected-error {{cannot decompose class type 'AnonymousMember::Struct' because it has an anonymous struct member}}
+ auto [a2] = Union(); // expected-error {{cannot decompose class type 'AnonymousMember::Union' because it has an anonymous union member}}
+ }
+}
+
namespace MultipleClasses {
struct B : A {
int a;
OpenPOWER on IntegriCloud