diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-09-25 22:12:44 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-09-25 22:12:44 +0000 |
commit | 730c7ae40ea09e0e0209d0e092322e5eeec9b3cd (patch) | |
tree | 193062087be297060f61d0549626c774b5d2baaf /test/CXX | |
parent | 2b97f3cfc8043a7f06799f314a3824738ba24984 (diff) |
P0969R0: allow structured binding of accessible members, not only public members.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@343036 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CXX')
-rw-r--r-- | test/CXX/dcl.decl/dcl.decomp/p4.cpp | 51 |
1 files changed, 46 insertions, 5 deletions
diff --git a/test/CXX/dcl.decl/dcl.decomp/p4.cpp b/test/CXX/dcl.decl/dcl.decomp/p4.cpp index c461eb6f54..f14c0d02c1 100644 --- a/test/CXX/dcl.decl/dcl.decomp/p4.cpp +++ b/test/CXX/dcl.decl/dcl.decomp/p4.cpp @@ -20,15 +20,15 @@ namespace NonPublicMembers { int a; // expected-note 2{{declared private here}} }; - struct NonPublic3 : private A {}; // expected-note {{constrained by private inheritance}} + struct NonPublic3 : private A {}; // expected-note {{declared private here}} struct NonPublic4 : NonPublic2 {}; void test() { - auto [a1] = NonPublic1(); // expected-error {{cannot decompose non-public member 'a' of 'NonPublicMembers::NonPublic1'}} - auto [a2] = NonPublic2(); // expected-error {{cannot decompose non-public member 'a' of 'NonPublicMembers::NonPublic2'}} - auto [a3] = NonPublic3(); // expected-error {{cannot decompose members of non-public base class 'A' of 'NonPublic3'}} - auto [a4] = NonPublic4(); // expected-error {{cannot decompose non-public member 'a' of 'NonPublicMembers::NonPublic4'}} + auto [a1] = NonPublic1(); // expected-error {{cannot decompose protected member 'a' of 'NonPublicMembers::NonPublic1'}} + auto [a2] = NonPublic2(); // expected-error {{cannot decompose private member 'a' of 'NonPublicMembers::NonPublic2'}} + auto [a3] = NonPublic3(); // expected-error {{cannot decompose members of inaccessible base class 'A' of 'NonPublicMembers::NonPublic3'}} + auto [a4] = NonPublic4(); // expected-error {{cannot decompose private member 'a' of 'NonPublicMembers::NonPublic2'}} } } @@ -198,3 +198,44 @@ namespace std_example { same<decltype((x)), const int&> same1; same<decltype((y)), const volatile double&> same2; } + +namespace p0969r0 { + struct A { + int x; + int y; + }; + struct B : private A { // expected-note {{declared private here}} + void test_member() { + auto &[x, y] = *this; + } + friend void test_friend(B); + }; + void test_friend(B b) { + auto &[x, y] = b; + } + void test_external(B b) { + auto &[x, y] = b; // expected-error {{cannot decompose members of inaccessible base class 'p0969r0::A' of 'p0969r0::B'}} + } + + struct C { + int x; + protected: + int y; // expected-note {{declared protected here}} expected-note {{can only access this member on an object of type 'p0969r0::D'}} + void test_member() { + auto &[x, y] = *this; + } + friend void test_friend(struct D); + }; + struct D : C { + static void test_member(D d, C c) { + auto &[x1, y1] = d; + auto &[x2, y2] = c; // expected-error {{cannot decompose protected member 'y' of 'p0969r0::C'}} + } + }; + void test_friend(D d) { + auto &[x, y] = d; + } + void test_external(D d) { + auto &[x, y] = d; // expected-error {{cannot decompose protected member 'y' of 'p0969r0::C'}} + } +} |