diff options
| author | Benjamin Kramer <benny.kra@googlemail.com> | 2016-08-12 09:19:34 +0000 |
|---|---|---|
| committer | Benjamin Kramer <benny.kra@googlemail.com> | 2016-08-12 09:19:34 +0000 |
| commit | df8bf140dd79d03c21261199ae8d78cf69e6a6ae (patch) | |
| tree | c8e5570d945403e75939464429817c0eb37c0f6e | |
| parent | 06ae68362060928fdc391bea8061cf9d8dc622eb (diff) | |
| download | bcm5719-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.td | 4 | ||||
| -rw-r--r-- | clang/test/CXX/dcl.decl/dcl.decomp/p4.cpp | 19 |
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; |

