| // RUN: %clang_cc1 -std=c++11 -verify %s |
| |
| struct Public {} public_; |
| struct Protected {} protected_; |
| struct Private {} private_; |
| |
| class A { |
| public: |
| A(Public); |
| void f(Public); |
| |
| protected: |
| A(Protected); // expected-note {{protected here}} |
| void f(Protected); |
| |
| private: |
| A(Private); // expected-note 4{{private here}} |
| void f(Private); // expected-note {{private here}} |
| |
| friend void Friend(); |
| }; |
| |
| class B : private A { |
| using A::A; // ok |
| using A::f; // expected-error {{private member}} |
| |
| void f() { |
| B a(public_); |
| B b(protected_); |
| B c(private_); // expected-error {{private}} |
| } |
| |
| B(Public p, int) : B(p) {} |
| B(Protected p, int) : B(p) {} |
| B(Private p, int) : B(p) {} // expected-error {{private}} |
| }; |
| |
| class C : public B { |
| C(Public p) : B(p) {} |
| // There is no access check on the conversion from derived to base here; |
| // protected constructors of A act like protected constructors of B. |
| C(Protected p) : B(p) {} |
| C(Private p) : B(p) {} // expected-error {{private}} |
| }; |
| |
| void Friend() { |
| // There is no access check on the conversion from derived to base here. |
| B a(public_); |
| B b(protected_); |
| B c(private_); |
| } |
| |
| void NonFriend() { |
| B a(public_); |
| B b(protected_); // expected-error {{protected}} |
| B c(private_); // expected-error {{private}} |
| } |
| |
| namespace ProtectedAccessFromMember { |
| namespace a { |
| struct ES { |
| private: |
| ES(const ES &) = delete; |
| protected: |
| ES(const char *); |
| }; |
| } |
| namespace b { |
| struct DES : a::ES { |
| DES *f(); |
| private: |
| using a::ES::ES; |
| }; |
| } |
| b::DES *b::DES::f() { return new b::DES("foo"); } |
| |
| } |