1 | // RUN: %clang_cc1 -std=c++11 -verify %s |
2 | |
3 | struct Public {} public_; |
4 | struct Protected {} protected_; |
5 | struct Private {} private_; |
6 | |
7 | class A { |
8 | public: |
9 | A(Public); |
10 | void f(Public); |
11 | |
12 | protected: |
13 | A(Protected); // expected-note {{protected here}} |
14 | void f(Protected); |
15 | |
16 | private: |
17 | A(Private); // expected-note 4{{private here}} |
18 | void f(Private); // expected-note {{private here}} |
19 | |
20 | friend void Friend(); |
21 | }; |
22 | |
23 | class B : private A { |
24 | using A::A; // ok |
25 | using A::f; // expected-error {{private member}} |
26 | |
27 | void f() { |
28 | B a(public_); |
29 | B b(protected_); |
30 | B c(private_); // expected-error {{private}} |
31 | } |
32 | |
33 | B(Public p, int) : B(p) {} |
34 | B(Protected p, int) : B(p) {} |
35 | B(Private p, int) : B(p) {} // expected-error {{private}} |
36 | }; |
37 | |
38 | class C : public B { |
39 | C(Public p) : B(p) {} |
40 | // There is no access check on the conversion from derived to base here; |
41 | // protected constructors of A act like protected constructors of B. |
42 | C(Protected p) : B(p) {} |
43 | C(Private p) : B(p) {} // expected-error {{private}} |
44 | }; |
45 | |
46 | void Friend() { |
47 | // There is no access check on the conversion from derived to base here. |
48 | B a(public_); |
49 | B b(protected_); |
50 | B c(private_); |
51 | } |
52 | |
53 | void NonFriend() { |
54 | B a(public_); |
55 | B b(protected_); // expected-error {{protected}} |
56 | B c(private_); // expected-error {{private}} |
57 | } |
58 | |
59 | namespace ProtectedAccessFromMember { |
60 | namespace a { |
61 | struct ES { |
62 | private: |
63 | ES(const ES &) = delete; |
64 | protected: |
65 | ES(const char *); |
66 | }; |
67 | } |
68 | namespace b { |
69 | struct DES : a::ES { |
70 | DES *f(); |
71 | private: |
72 | using a::ES::ES; |
73 | }; |
74 | } |
75 | b::DES *b::DES::f() { return new b::DES("foo"); } |
76 | |
77 | } |
78 | |