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