| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520 |
- // RUN: %clang_cc1 -fsyntax-only -verify %s
- namespace test0 {
- class A {
- protected: int x; // expected-note 3 {{declared}} \
- // expected-note {{member is declared here}}
- static int sx; // expected-note 3 {{declared}} \
- // expected-note {{member is declared here}}
- };
- class B : public A {
- };
- class C : protected A { // expected-note {{declared}}
- };
- class D : private B { // expected-note 3 {{constrained}}
- };
- void test(A &a) {
- (void) a.x; // expected-error {{'x' is a protected member}}
- (void) a.sx; // expected-error {{'sx' is a protected member}}
- }
- void test(B &b) {
- (void) b.x; // expected-error {{'x' is a protected member}}
- (void) b.sx; // expected-error {{'sx' is a protected member}}
- }
- void test(C &c) {
- (void) c.x; // expected-error {{'x' is a protected member}} expected-error {{protected base class}}
- (void) c.sx; // expected-error {{'sx' is a protected member}}
- }
- void test(D &d) {
- (void) d.x; // expected-error {{'x' is a private member}} expected-error {{private base class}}
- (void) d.sx; // expected-error {{'sx' is a private member}}
- }
- }
- namespace test1 {
- class A {
- protected: int x;
- static int sx;
- static void test(A&);
- };
- class B : public A {
- static void test(B&);
- };
- class C : protected A {
- static void test(C&);
- };
- class D : private B {
- static void test(D&);
- };
- void A::test(A &a) {
- (void) a.x;
- (void) a.sx;
- }
- void B::test(B &b) {
- (void) b.x;
- (void) b.sx;
- }
- void C::test(C &c) {
- (void) c.x;
- (void) c.sx;
- }
- void D::test(D &d) {
- (void) d.x;
- (void) d.sx;
- }
- }
- namespace test2 {
- class A {
- protected: int x; // expected-note 3 {{can only access this member on an object of type}}
- static int sx;
- static void test(A&);
- };
- class B : public A {
- static void test(A&);
- };
- class C : protected A {
- static void test(A&);
- };
- class D : private B {
- static void test(A&);
- };
- void A::test(A &a) {
- (void) a.x;
- (void) a.sx;
- }
- void B::test(A &a) {
- (void) a.x; // expected-error {{'x' is a protected member}}
- (void) a.sx;
- }
- void C::test(A &a) {
- (void) a.x; // expected-error {{'x' is a protected member}}
- (void) a.sx;
- }
- void D::test(A &a) {
- (void) a.x; // expected-error {{'x' is a protected member}}
- (void) a.sx;
- }
- }
- namespace test3 {
- class B;
- class A {
- protected: int x; //expected-note {{declared protected}} // expected-note {{can only access this member on an object of type}}
- static int sx;
- static void test(B&);
- };
- class B : public A {
- static void test(B&);
- };
- class C : protected A {
- static void test(B&);
- };
- class D : private B {
- static void test(B&);
- };
- void A::test(B &b) {
- (void) b.x;
- (void) b.sx;
- }
- void B::test(B &b) {
- (void) b.x;
- (void) b.sx;
- }
- void C::test(B &b) {
- (void) b.x; // expected-error {{'x' is a protected member}}
- (void) b.sx;
- }
- void D::test(B &b) {
- (void) b.x; // expected-error {{'x' is a protected member}}
- (void) b.sx;
- }
- }
- namespace test4 {
- class C;
- class A {
- protected: int x; // expected-note 2{{declared protected here}} expected-note{{member is declared here}}
- static int sx; // expected-note 3{{member is declared here}}
- static void test(C&);
- };
- class B : public A {
- static void test(C&);
- };
- class C : protected A { // expected-note 4 {{constrained}} expected-note 3 {{declared}}
- static void test(C&);
- };
- class D : private B {
- static void test(C&);
- };
- void A::test(C &c) {
- (void) c.x; // expected-error {{'x' is a protected member}} \
- // expected-error {{protected base class}}
- (void) c.sx; // expected-error {{'sx' is a protected member}}
- }
- void B::test(C &c) {
- (void) c.x; // expected-error {{'x' is a protected member}} \
- // expected-error {{protected base class}}
- (void) c.sx; // expected-error {{'sx' is a protected member}}
- }
- void C::test(C &c) {
- (void) c.x;
- (void) c.sx;
- }
- void D::test(C &c) {
- (void) c.x; // expected-error {{'x' is a protected member}} \
- // expected-error {{protected base class}}
- (void) c.sx; // expected-error {{'sx' is a protected member}}
- }
- }
- namespace test5 {
- class D;
- class A {
- protected: int x; // expected-note 3{{member is declared here}}
- static int sx; // expected-note 3{{member is declared here}}
- static void test(D&);
- };
- class B : public A {
- static void test(D&);
- };
- class C : protected A {
- static void test(D&);
- };
- class D : private B { // expected-note 9 {{constrained}}
- static void test(D&);
- };
- void A::test(D &d) {
- (void) d.x; // expected-error {{'x' is a private member}} \
- // expected-error {{cannot cast}}
- (void) d.sx; // expected-error {{'sx' is a private member}}
- }
- void B::test(D &d) {
- (void) d.x; // expected-error {{'x' is a private member}} \
- // expected-error {{cannot cast}}
- (void) d.sx; // expected-error {{'sx' is a private member}}
- }
- void C::test(D &d) {
- (void) d.x; // expected-error {{'x' is a private member}} \
- // expected-error {{cannot cast}}
- (void) d.sx; // expected-error {{'sx' is a private member}}
- }
- void D::test(D &d) {
- (void) d.x;
- (void) d.sx;
- }
- }
- namespace test6 {
- class Static {};
- class A {
- protected:
- void foo(int); // expected-note 3 {{can only access this member on an object of type}}
- void foo(long);
- static void foo(Static);
- static void test(A&);
- };
- class B : public A {
- static void test(A&);
- };
- class C : protected A {
- static void test(A&);
- };
- class D : private B {
- static void test(A&);
- };
- void A::test(A &a) {
- a.foo(10);
- a.foo(Static());
- }
- void B::test(A &a) {
- a.foo(10); // expected-error {{'foo' is a protected member}}
- a.foo(Static());
- }
- void C::test(A &a) {
- a.foo(10); // expected-error {{'foo' is a protected member}}
- a.foo(Static());
- }
- void D::test(A &a) {
- a.foo(10); // expected-error {{'foo' is a protected member}}
- a.foo(Static());
- }
- }
- namespace test7 {
- class Static {};
- class A {
- protected:
- void foo(int); // expected-note 3 {{must name member using the type of the current context}}
- void foo(long);
- static void foo(Static);
- static void test();
- };
- class B : public A {
- static void test();
- };
- class C : protected A {
- static void test();
- };
- class D : private B {
- static void test();
- };
- void A::test() {
- void (A::*x)(int) = &A::foo;
- void (*sx)(Static) = &A::foo;
- }
- void B::test() {
- void (A::*x)(int) = &A::foo; // expected-error {{'foo' is a protected member}}
- void (*sx)(Static) = &A::foo;
- }
- void C::test() {
- void (A::*x)(int) = &A::foo; // expected-error {{'foo' is a protected member}}
- void (*sx)(Static) = &A::foo;
- }
- void D::test() {
- void (A::*x)(int) = &A::foo; // expected-error {{'foo' is a protected member}}
- void (*sx)(Static) = &A::foo;
- }
- }
- namespace test8 {
- class Static {};
- class A {
- protected:
- void foo(int); // expected-note 3 {{must name member using the type of the current context}}
- void foo(long);
- static void foo(Static);
- static void test();
- };
- class B : public A {
- static void test();
- };
- class C : protected A {
- static void test();
- };
- class D : private B {
- static void test();
- };
- void call(void (A::*)(int));
- void calls(void (*)(Static));
- void A::test() {
- call(&A::foo);
- calls(&A::foo);
- }
- void B::test() {
- call(&A::foo); // expected-error {{'foo' is a protected member}}
- calls(&A::foo);
- }
- void C::test() {
- call(&A::foo); // expected-error {{'foo' is a protected member}}
- calls(&A::foo);
- }
- void D::test() {
- call(&A::foo); // expected-error {{'foo' is a protected member}}
- calls(&A::foo);
- }
- }
- namespace test9 {
- class A { // expected-note {{member is declared here}}
- protected: int foo(); // expected-note 4 {{declared}} expected-note 3 {{can only access this member on an object of type}} expected-note 2 {{member is declared here}}
- };
- class B : public A { // expected-note {{member is declared here}}
- friend class D;
- };
- class C : protected B { // expected-note {{declared}} \
- // expected-note 9 {{constrained}}
- };
- class D : public A {
- static void test(A &a) {
- a.foo(); // expected-error {{'foo' is a protected member}}
- a.A::foo(); // expected-error {{'foo' is a protected member}}
- a.B::foo(); // expected-error {{'foo' is a protected member}}
- a.C::foo(); // expected-error {{'foo' is a protected member}}
- a.D::foo(); // expected-error {{'foo' is a protected member}}
- }
- static void test(B &b) {
- b.foo();
- b.A::foo();
- b.B::foo(); // accessible as named in A
- b.C::foo(); // expected-error {{'foo' is a protected member}}
- }
- static void test(C &c) {
- c.foo(); // expected-error {{'foo' is a protected member}} \
- // expected-error {{cannot cast}}
- c.A::foo(); // expected-error {{'A' is a protected member}} \
- // expected-error {{cannot cast}}
- c.B::foo(); // expected-error {{'B' is a protected member}} \
- // expected-error {{cannot cast}}
- c.C::foo(); // expected-error {{'foo' is a protected member}} \
- // expected-error {{cannot cast}}
- }
- static void test(D &d) {
- d.foo();
- d.A::foo();
- d.B::foo();
- d.C::foo(); // expected-error {{'foo' is a protected member}}
- }
- };
- }
- namespace test10 {
- template<typename T> class A {
- protected:
- int foo();
- int foo() const;
- ~A() { foo(); }
- };
- template class A<int>;
- }
- // rdar://problem/8360285: class.protected friendship
- namespace test11 {
- class A {
- protected:
- int foo();
- };
- class B : public A {
- friend class C;
- };
- class C {
- void test() {
- B b;
- b.A::foo();
- }
- };
- }
- // This friendship is considered because a public member of A would be
- // a private member of C.
- namespace test12 {
- class A { protected: int foo(); };
- class B : public virtual A {};
- class C : private B { friend void test(); };
- class D : private C, public virtual A {};
- void test() {
- D d;
- d.A::foo();
- }
- }
- // This friendship is not considered because a public member of A is
- // inaccessible in C.
- namespace test13 {
- class A { protected: int foo(); }; // expected-note {{declared protected here}}
- class B : private virtual A {};
- class C : private B { friend void test(); };
- class D : public virtual A {};
- void test() {
- D d;
- d.A::foo(); // expected-error {{protected member}}
- }
- }
- // PR8058
- namespace test14 {
- class A {
- protected:
- template <class T> void temp(T t); // expected-note {{must name member using the type of the current context}}
- void nontemp(int); // expected-note {{must name member using the type of the current context}}
- template <class T> void ovl_temp(T t); // expected-note {{must name member using the type of the current context}}
- void ovl_temp(float);
- void ovl_nontemp(int); // expected-note {{must name member using the type of the current context}}
- void ovl_nontemp(float);
- template <class T> void ovl_withtemp(T);
- void ovl_withtemp(int); // expected-note {{must name member using the type of the current context}}
- };
- class B : public A {
- void use() {
- void (A::*ptr)(int);
- ptr = &A::temp; // expected-error {{protected member}}
- ptr = &A::nontemp; // expected-error {{protected member}}
- ptr = &A::ovl_temp; // expected-error {{protected member}}
- ptr = &A::ovl_nontemp; // expected-error {{protected member}}
- ptr = &A::ovl_withtemp; // expected-error {{protected member}}
- }
- };
- }
- namespace test15 {
- class A {
- protected:
- A(); // expected-note 2 {{protected constructor can only be used to construct a base class subobject}}
- A(const A &); // expected-note {{protected constructor can only be used to construct a base class subobject}}
- ~A(); // expected-note 3 {{protected destructor can only be used to destroy a base class subobject}}
- };
- class B : public A {
- // The uses here are fine.
- B() {}
- B(int i) : A() {}
- ~B() {}
- // All these uses are bad.
- void test0() {
- A a; // expected-error {{protected constructor}} expected-error {{protected destructor}}
- }
- A *test1() {
- return new A(); // expected-error {{protected constructor}}
- }
- void test2(A *a) {
- delete a; // expected-error {{protected destructor}}
- }
- A test3(A *a) {
- return *a; // expected-error {{protected constructor}}
- }
- void test4(A *a) {
- a->~A(); // expected-error {{protected member}}
- }
- };
- }
- namespace test16 {
- class A {
- protected:
- ~A();
- };
- class B : public virtual A {
- public:
- ~B() {}
- };
- class C : public B {
- ~C() {}
- };
- }
|