p4.cpp revision 41d8903731782ee85ee2b19734008b006e01c76f
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// RUN: %clang_cc1 -fsyntax-only -faccess-control -verify %s 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// C++0x [class.access]p4: 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block// Access control is applied uniformly to all names, whether the 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// names are referred to from declarations or expressions. In the 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// case of overloaded function names, access control is applied to 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// the function selected by overload resolution. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass Public {} PublicInst; 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass Protected {} ProtectedInst; 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass Private {} PrivateInst; 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace test0 { 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class A { 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project public: 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void foo(Public&); 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project protected: 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void foo(Protected&); // expected-note 2 {{declared protected here}} 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project private: 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void foo(Private&); // expected-note 2 {{declared private here}} 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void test(A *op) { 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project op->foo(PublicInst); 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project op->foo(ProtectedInst); // expected-error {{access to protected member outside any class}} 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project op->foo(PrivateInst); // expected-error {{access to private member outside any class}} 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void (A::*a)(Public&) = &A::foo; 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void (A::*b)(Protected&) = &A::foo; // expected-error {{access to protected member outside any class}} 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void (A::*c)(Private&) = &A::foo; // expected-error {{access to private member outside any class}} 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Member operators. 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace test1 { 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class A { 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project public: 39cad810f21b803229eb11403f9209855525a25d57Steve Block void operator+(Public&); 40cad810f21b803229eb11403f9209855525a25d57Steve Block void operator[](Public&); 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void operator()(Public&); 42231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block protected: 43231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void operator+(Protected&); // expected-note {{declared protected here}} 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void operator[](Protected&); // expected-note {{declared protected here}} 45d0825bca7fe65beaee391d30da42e937db621564Steve Block void operator()(Protected&); // expected-note {{declared protected here}} 462bde8e466a4451c7319e3a072d118917957d6554Steve Block private: 472bde8e466a4451c7319e3a072d118917957d6554Steve Block void operator+(Private&); // expected-note {{declared private here}} 482bde8e466a4451c7319e3a072d118917957d6554Steve Block void operator[](Private&); // expected-note {{declared private here}} 49d0825bca7fe65beaee391d30da42e937db621564Steve Block void operator()(Private&); // expected-note {{declared private here}} 50231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void operator-(); // expected-note {{declared private here}} 51231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block }; 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void operator+(const A &, Public&); 53231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void operator+(const A &, Protected&); 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void operator+(const A &, Private&); 55e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block void operator-(const A &); 56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void test(A &a, Public &pub, Protected &prot, Private &priv) { 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project a + pub; 59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block a + prot; // expected-error {{access to protected member}} 60231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block a + priv; // expected-error {{access to private member}} 61231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block a[pub]; 62231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block a[prot]; // expected-error {{access to protected member}} 63231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block a[priv]; // expected-error {{access to private member}} 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project a(pub); 65d0825bca7fe65beaee391d30da42e937db621564Steve Block a(prot); // expected-error {{access to protected member}} 6668513a70bcd92384395513322f1b801e7bf9c729Steve Block a(priv); // expected-error {{access to private member}} 67692e5dbf12901edacf14812a6fae25462920af42Steve Block -a; // expected-error {{access to private member}} 68d0825bca7fe65beaee391d30da42e937db621564Steve Block 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const A &ca = a; 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ca + pub; 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ca + prot; 72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ca + priv; 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project -ca; 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project