p4.cpp revision 6bb8017bb9e828d118e15e59d71c66bba323c364
1c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall// RUN: %clang_cc1 -fsyntax-only -faccess-control -verify %s
2c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall
3c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall// C++0x [class.access]p4:
4c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall
5c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall//   Access control is applied uniformly to all names, whether the
6c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall//   names are referred to from declarations or expressions.  In the
7c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall//   case of overloaded function names, access control is applied to
8c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall//   the function selected by overload resolution.
9c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall
10c373d48502ca7683ab55385f5bd624d778eb288dJohn McCallclass Public {} PublicInst;
11c373d48502ca7683ab55385f5bd624d778eb288dJohn McCallclass Protected {} ProtectedInst;
12c373d48502ca7683ab55385f5bd624d778eb288dJohn McCallclass Private {} PrivateInst;
13c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall
14c373d48502ca7683ab55385f5bd624d778eb288dJohn McCallnamespace test0 {
15c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall  class A {
16c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall  public:
17c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall    void foo(Public&);
18c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall  protected:
19c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall    void foo(Protected&); // expected-note 2 {{declared protected here}}
20c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall  private:
21c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall    void foo(Private&); // expected-note 2 {{declared private here}}
22c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall  };
23c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall
24c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall  void test(A *op) {
25c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall    op->foo(PublicInst);
266b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall    op->foo(ProtectedInst); // expected-error {{'foo' is a protected member}}
276b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall    op->foo(PrivateInst); // expected-error {{'foo' is a private member}}
28c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall
29c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall    void (A::*a)(Public&) = &A::foo;
306b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall    void (A::*b)(Protected&) = &A::foo; // expected-error {{'foo' is a protected member}}
316b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall    void (A::*c)(Private&) = &A::foo; // expected-error {{'foo' is a private member}}
32c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall  }
33c373d48502ca7683ab55385f5bd624d778eb288dJohn McCall}
345357b615364c17ea024c757354c58ae2a520d216John McCall
355357b615364c17ea024c757354c58ae2a520d216John McCall// Member operators.
365357b615364c17ea024c757354c58ae2a520d216John McCallnamespace test1 {
375357b615364c17ea024c757354c58ae2a520d216John McCall  class A {
385357b615364c17ea024c757354c58ae2a520d216John McCall  public:
395357b615364c17ea024c757354c58ae2a520d216John McCall    void operator+(Public&);
405357b615364c17ea024c757354c58ae2a520d216John McCall    void operator[](Public&);
4141d8903731782ee85ee2b19734008b006e01c76fJohn McCall    void operator()(Public&);
42233a6419097ed97b67ff8efcacef9af613262ca3John McCall    typedef void (*PublicSurrogate)(Public&);
43233a6419097ed97b67ff8efcacef9af613262ca3John McCall    operator PublicSurrogate() const;
445357b615364c17ea024c757354c58ae2a520d216John McCall  protected:
455357b615364c17ea024c757354c58ae2a520d216John McCall    void operator+(Protected&); // expected-note {{declared protected here}}
465357b615364c17ea024c757354c58ae2a520d216John McCall    void operator[](Protected&); // expected-note {{declared protected here}}
4741d8903731782ee85ee2b19734008b006e01c76fJohn McCall    void operator()(Protected&); // expected-note {{declared protected here}}
48233a6419097ed97b67ff8efcacef9af613262ca3John McCall    typedef void (*ProtectedSurrogate)(Protected&);
49233a6419097ed97b67ff8efcacef9af613262ca3John McCall    operator ProtectedSurrogate() const; // expected-note {{declared protected here}}
505357b615364c17ea024c757354c58ae2a520d216John McCall  private:
515357b615364c17ea024c757354c58ae2a520d216John McCall    void operator+(Private&); // expected-note {{declared private here}}
525357b615364c17ea024c757354c58ae2a520d216John McCall    void operator[](Private&); // expected-note {{declared private here}}
5341d8903731782ee85ee2b19734008b006e01c76fJohn McCall    void operator()(Private&); // expected-note {{declared private here}}
545357b615364c17ea024c757354c58ae2a520d216John McCall    void operator-(); // expected-note {{declared private here}}
55233a6419097ed97b67ff8efcacef9af613262ca3John McCall    typedef void (*PrivateSurrogate)(Private&);
56233a6419097ed97b67ff8efcacef9af613262ca3John McCall    operator PrivateSurrogate() const; // expected-note {{declared private here}}
575357b615364c17ea024c757354c58ae2a520d216John McCall  };
585357b615364c17ea024c757354c58ae2a520d216John McCall  void operator+(const A &, Public&);
595357b615364c17ea024c757354c58ae2a520d216John McCall  void operator+(const A &, Protected&);
605357b615364c17ea024c757354c58ae2a520d216John McCall  void operator+(const A &, Private&);
615357b615364c17ea024c757354c58ae2a520d216John McCall  void operator-(const A &);
625357b615364c17ea024c757354c58ae2a520d216John McCall
635357b615364c17ea024c757354c58ae2a520d216John McCall  void test(A &a, Public &pub, Protected &prot, Private &priv) {
645357b615364c17ea024c757354c58ae2a520d216John McCall    a + pub;
656b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall    a + prot; // expected-error {{'operator+' is a protected member}}
666b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall    a + priv; // expected-error {{'operator+' is a private member}}
675357b615364c17ea024c757354c58ae2a520d216John McCall    a[pub];
686b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall    a[prot]; // expected-error {{'operator[]' is a protected member}}
696b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall    a[priv]; // expected-error {{'operator[]' is a private member}}
7041d8903731782ee85ee2b19734008b006e01c76fJohn McCall    a(pub);
716b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall    a(prot); // expected-error {{'operator()' is a protected member}}
726b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall    a(priv); // expected-error {{'operator()' is a private member}}
736b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall    -a;       // expected-error {{'operator-' is a private member}}
745357b615364c17ea024c757354c58ae2a520d216John McCall
755357b615364c17ea024c757354c58ae2a520d216John McCall    const A &ca = a;
765357b615364c17ea024c757354c58ae2a520d216John McCall    ca + pub;
775357b615364c17ea024c757354c58ae2a520d216John McCall    ca + prot;
785357b615364c17ea024c757354c58ae2a520d216John McCall    ca + priv;
795357b615364c17ea024c757354c58ae2a520d216John McCall    -ca;
80233a6419097ed97b67ff8efcacef9af613262ca3John McCall    // These are all surrogate calls
81233a6419097ed97b67ff8efcacef9af613262ca3John McCall    ca(pub);
826b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall    ca(prot); // expected-error {{'operator void (*)(class Protected &)' is a protected member}}
836b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall    ca(priv); // expected-error {{'operator void (*)(class Private &)' is a private member}}
845357b615364c17ea024c757354c58ae2a520d216John McCall  }
855357b615364c17ea024c757354c58ae2a520d216John McCall}
864f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall
874f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall// Implicit constructor calls.
884f9506a27cb6b865bf38beea48eadfa9dc93f510John McCallnamespace test2 {
894f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall  class A {
904f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall  private:
914f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall    A(); // expected-note {{declared private here}}
924f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall
934f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall    static A foo;
944f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall  };
954f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall
966b2accb4793e16b2e93a8c2589f5df702231f17aJohn McCall  A a; // expected-error {{calling a private constructor}}
974f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall  A A::foo; // okay
984f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall}
994f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall
1004f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall// Implicit destructor calls.
1014f9506a27cb6b865bf38beea48eadfa9dc93f510John McCallnamespace test3 {
10258e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall  class A {
1034f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall  private:
1049c127392efe91dadacbe28ca16b8a9a5fa7990b3Douglas Gregor    ~A(); // expected-note 2 {{declared private here}}
1054f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall    static A foo;
1064f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall  };
1074f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall
10858e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall  A a; // expected-error {{variable of type 'test3::A' has private destructor}}
1094f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall  A A::foo;
1104f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall
1119c127392efe91dadacbe28ca16b8a9a5fa7990b3Douglas Gregor  void foo(A param) { // okay
11258e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall    A local; // expected-error {{variable of type 'test3::A' has private destructor}}
1134f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall  }
11458e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall
115ef027fe748894522653558d9475a220482395094John McCall  template <unsigned N> class Base { ~Base(); }; // expected-note 14 {{declared private here}}
116ef027fe748894522653558d9475a220482395094John McCall  class Base2 : virtual Base<2> { ~Base2(); }; // expected-note 3 {{declared private here}} \
117ef027fe748894522653558d9475a220482395094John McCall                                               // expected-error {{base class 'Base<2>' has private destructor}}
118ef027fe748894522653558d9475a220482395094John McCall  class Base3 : virtual Base<3> { public: ~Base3(); }; // expected-error {{base class 'Base<3>' has private destructor}}
11958e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall
12058e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall  // These don't cause diagnostics because we don't need the destructor.
12158e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall  class Derived0 : Base<0> { ~Derived0(); };
12258e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall  class Derived1 : Base<1> { };
12358e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall
12458e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall  class Derived2 : // expected-error {{inherited virtual base class 'Base<2>' has private destructor}} \
12558e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall                   // expected-error {{inherited virtual base class 'Base<3>' has private destructor}}
12658e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall    Base<0>,  // expected-error {{base class 'Base<0>' has private destructor}}
12758e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall    virtual Base<1>, // expected-error {{base class 'Base<1>' has private destructor}}
12858e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall    Base2, // expected-error {{base class 'test3::Base2' has private destructor}}
12958e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall    virtual Base3
13058e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall  {
13158e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall    ~Derived2() {}
13258e6f34e4d2c668562e1c391162ee9de7b05fbb2John McCall  };
1336c790eac94101407acfd2c664400924cab45c0b1John McCall
134ef027fe748894522653558d9475a220482395094John McCall  class Derived3 : // expected-error 2 {{inherited virtual base class 'Base<2>' has private destructor}} \
135ef027fe748894522653558d9475a220482395094John McCall                   // expected-error 2 {{inherited virtual base class 'Base<3>' has private destructor}}
136ef027fe748894522653558d9475a220482395094John McCall    Base<0>,  // expected-error 2 {{base class 'Base<0>' has private destructor}}
137ef027fe748894522653558d9475a220482395094John McCall    virtual Base<1>, // expected-error 2 {{base class 'Base<1>' has private destructor}}
138ef027fe748894522653558d9475a220482395094John McCall    Base2, // expected-error 2 {{base class 'test3::Base2' has private destructor}}
1396c790eac94101407acfd2c664400924cab45c0b1John McCall    virtual Base3
1406c790eac94101407acfd2c664400924cab45c0b1John McCall  {};
1416c790eac94101407acfd2c664400924cab45c0b1John McCall  Derived3 d3;
1424f9506a27cb6b865bf38beea48eadfa9dc93f510John McCall}
143b05b5f35f114505182b076aa70002843c0669bebJohn McCall
144b05b5f35f114505182b076aa70002843c0669bebJohn McCall// Conversion functions.
145b05b5f35f114505182b076aa70002843c0669bebJohn McCallnamespace test4 {
146b05b5f35f114505182b076aa70002843c0669bebJohn McCall  class Base {
147b05b5f35f114505182b076aa70002843c0669bebJohn McCall  private:
148b05b5f35f114505182b076aa70002843c0669bebJohn McCall    operator Private(); // expected-note 4 {{declared private here}}
149b05b5f35f114505182b076aa70002843c0669bebJohn McCall  public:
150b05b5f35f114505182b076aa70002843c0669bebJohn McCall    operator Public();
151b05b5f35f114505182b076aa70002843c0669bebJohn McCall  };
152b05b5f35f114505182b076aa70002843c0669bebJohn McCall
153b05b5f35f114505182b076aa70002843c0669bebJohn McCall  class Derived1 : private Base { // expected-note 2 {{declared private here}} \
154b05b5f35f114505182b076aa70002843c0669bebJohn McCall                                  // expected-note {{constrained by private inheritance}}
155b05b5f35f114505182b076aa70002843c0669bebJohn McCall    Private test1() { return *this; } // expected-error {{'operator Private' is a private member}}
156b05b5f35f114505182b076aa70002843c0669bebJohn McCall    Public test2() { return *this; }
157b05b5f35f114505182b076aa70002843c0669bebJohn McCall  };
158b05b5f35f114505182b076aa70002843c0669bebJohn McCall  Private test1(Derived1 &d) { return d; } // expected-error {{'operator Private' is a private member}} \
159b05b5f35f114505182b076aa70002843c0669bebJohn McCall                                           // expected-error {{cannot cast 'test4::Derived1' to its private base class}}
160b05b5f35f114505182b076aa70002843c0669bebJohn McCall  Public test2(Derived1 &d) { return d; } // expected-error {{cannot cast 'test4::Derived1' to its private base class}} \
161b05b5f35f114505182b076aa70002843c0669bebJohn McCall                                          // expected-error {{'operator Public' is a private member}}
162b05b5f35f114505182b076aa70002843c0669bebJohn McCall
163b05b5f35f114505182b076aa70002843c0669bebJohn McCall
164b05b5f35f114505182b076aa70002843c0669bebJohn McCall  class Derived2 : public Base {
165b05b5f35f114505182b076aa70002843c0669bebJohn McCall    Private test1() { return *this; } // expected-error {{'operator Private' is a private member}}
166b05b5f35f114505182b076aa70002843c0669bebJohn McCall    Public test2() { return *this; }
167b05b5f35f114505182b076aa70002843c0669bebJohn McCall  };
168b05b5f35f114505182b076aa70002843c0669bebJohn McCall  Private test1(Derived2 &d) { return d; } // expected-error {{'operator Private' is a private member}}
169b05b5f35f114505182b076aa70002843c0669bebJohn McCall  Public test2(Derived2 &d) { return d; }
170b05b5f35f114505182b076aa70002843c0669bebJohn McCall
171b05b5f35f114505182b076aa70002843c0669bebJohn McCall  class Derived3 : private Base { // expected-note {{constrained by private inheritance here}} \
172b05b5f35f114505182b076aa70002843c0669bebJohn McCall                                  // expected-note {{declared private here}}
173b05b5f35f114505182b076aa70002843c0669bebJohn McCall  public:
174b05b5f35f114505182b076aa70002843c0669bebJohn McCall    operator Private();
175b05b5f35f114505182b076aa70002843c0669bebJohn McCall  };
176b05b5f35f114505182b076aa70002843c0669bebJohn McCall  Private test1(Derived3 &d) { return d; }
177b05b5f35f114505182b076aa70002843c0669bebJohn McCall  Public test2(Derived3 &d) { return d; } // expected-error {{'operator Public' is a private member of 'test4::Base'}} \
178b05b5f35f114505182b076aa70002843c0669bebJohn McCall                                          // expected-error {{cannot cast 'test4::Derived3' to its private base class}}
179b05b5f35f114505182b076aa70002843c0669bebJohn McCall
180b05b5f35f114505182b076aa70002843c0669bebJohn McCall  class Derived4 : public Base {
181b05b5f35f114505182b076aa70002843c0669bebJohn McCall  public:
182b05b5f35f114505182b076aa70002843c0669bebJohn McCall    operator Private();
183b05b5f35f114505182b076aa70002843c0669bebJohn McCall  };
184b05b5f35f114505182b076aa70002843c0669bebJohn McCall  Private test1(Derived4 &d) { return d; }
185b05b5f35f114505182b076aa70002843c0669bebJohn McCall  Public test2(Derived4 &d) { return d; }
186b05b5f35f114505182b076aa70002843c0669bebJohn McCall}
187b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall
188b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall// Implicit copy assignment operator uses.
189b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCallnamespace test5 {
190b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall  class A {
191b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall    void operator=(const A &); // expected-note 2 {{declared private here}}
192b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall  };
193b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall
194b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall  class Test1 { A a; }; // expected-error {{field of type 'test5::A' has private copy assignment operator}}
195b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall  void test1() {
196b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall    Test1 a;
197b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall    a = Test1();
198b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall  }
199b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall
200b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall  class Test2 : A {}; // expected-error {{base class 'test5::A' has private copy assignment operator}}
201b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall  void test2() {
202b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall    Test2 a;
203b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall    a = Test2();
204b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall  }
205b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall}
206b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall
207b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall// Implicit copy constructor uses.
208b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCallnamespace test6 {
209b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall  class A {
210b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall    public: A();
211b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall    private: A(const A &); // expected-note 2 {{declared private here}}
212b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall  };
213b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall
214b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall  class Test1 { A a; }; // expected-error {{field of type 'test6::A' has private copy constructor}}
215b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall  void test1(const Test1 &t) {
216b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall    Test1 a = t;
217b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall  }
218b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall
219b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall  class Test2 : A {}; // expected-error {{base class 'test6::A' has private copy constructor}}
220b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall  void test2(const Test2 &t) {
221b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall    Test2 a = t;
222b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall  }
223b020748a9954c995f2e616f50bb9ed4fe2df1f72John McCall}
22410f2873c0df7f662bfdb9a3e8bc834b68c1ead48John McCall
22510f2873c0df7f662bfdb9a3e8bc834b68c1ead48John McCall// Redeclaration lookups are not accesses.
22610f2873c0df7f662bfdb9a3e8bc834b68c1ead48John McCallnamespace test7 {
22710f2873c0df7f662bfdb9a3e8bc834b68c1ead48John McCall  class A {
22810f2873c0df7f662bfdb9a3e8bc834b68c1ead48John McCall    int private_member;
22910f2873c0df7f662bfdb9a3e8bc834b68c1ead48John McCall  };
23010f2873c0df7f662bfdb9a3e8bc834b68c1ead48John McCall  class B : A {
23110f2873c0df7f662bfdb9a3e8bc834b68c1ead48John McCall    int foo(int private_member) {
23210f2873c0df7f662bfdb9a3e8bc834b68c1ead48John McCall      return 0;
23310f2873c0df7f662bfdb9a3e8bc834b68c1ead48John McCall    }
23410f2873c0df7f662bfdb9a3e8bc834b68c1ead48John McCall  };
23510f2873c0df7f662bfdb9a3e8bc834b68c1ead48John McCall}
23690c8c57bcd84083df85f76aac2aa62acb85eb077John McCall
23790c8c57bcd84083df85f76aac2aa62acb85eb077John McCall// Ignored operator new and delete overloads are not
23890c8c57bcd84083df85f76aac2aa62acb85eb077John McCallnamespace test8 {
23990c8c57bcd84083df85f76aac2aa62acb85eb077John McCall  typedef __typeof__(sizeof(int)) size_t;
24090c8c57bcd84083df85f76aac2aa62acb85eb077John McCall
24190c8c57bcd84083df85f76aac2aa62acb85eb077John McCall  class A {
24290c8c57bcd84083df85f76aac2aa62acb85eb077John McCall    void *operator new(size_t s);
24390c8c57bcd84083df85f76aac2aa62acb85eb077John McCall    void operator delete(void *p);
24490c8c57bcd84083df85f76aac2aa62acb85eb077John McCall  public:
24590c8c57bcd84083df85f76aac2aa62acb85eb077John McCall    void *operator new(size_t s, int n);
24690c8c57bcd84083df85f76aac2aa62acb85eb077John McCall    void operator delete(void *p, int n);
24790c8c57bcd84083df85f76aac2aa62acb85eb077John McCall  };
24890c8c57bcd84083df85f76aac2aa62acb85eb077John McCall
24990c8c57bcd84083df85f76aac2aa62acb85eb077John McCall  void test() {
25090c8c57bcd84083df85f76aac2aa62acb85eb077John McCall    new (2) A();
25190c8c57bcd84083df85f76aac2aa62acb85eb077John McCall  }
25290c8c57bcd84083df85f76aac2aa62acb85eb077John McCall}
2537aceaf8cee77c98478e8934dc283910292711a7eJohn McCall
2547aceaf8cee77c98478e8934dc283910292711a7eJohn McCall// Don't silently upgrade forbidden-access paths to private.
2557aceaf8cee77c98478e8934dc283910292711a7eJohn McCallnamespace test9 {
2567aceaf8cee77c98478e8934dc283910292711a7eJohn McCall  class A {
2577aceaf8cee77c98478e8934dc283910292711a7eJohn McCall    public: static int x;
2587aceaf8cee77c98478e8934dc283910292711a7eJohn McCall  };
2597aceaf8cee77c98478e8934dc283910292711a7eJohn McCall  class B : private A { // expected-note {{constrained by private inheritance here}}
2607aceaf8cee77c98478e8934dc283910292711a7eJohn McCall  };
2617aceaf8cee77c98478e8934dc283910292711a7eJohn McCall  class C : public B {
2627aceaf8cee77c98478e8934dc283910292711a7eJohn McCall    static int getX() { return x; } // expected-error {{'x' is a private member of 'test9::A'}}
2637aceaf8cee77c98478e8934dc283910292711a7eJohn McCall  };
2647aceaf8cee77c98478e8934dc283910292711a7eJohn McCall}
265c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall
266c1b621daf98d83075a466c6f4ad9904dc845dd09John McCallnamespace test10 {
267c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall  class A {
268c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall    enum {
269c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall      value = 10 // expected-note {{declared private here}}
270c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall    };
271c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall    friend class C;
272c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall  };
273c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall
274c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall  class B {
275c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall    enum {
276c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall      value = A::value // expected-error {{'value' is a private member of 'test10::A'}}
277c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall    };
278c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall  };
279c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall
280c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall  class C {
281c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall    enum {
282c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall      value = A::value
283c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall    };
284c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall  };
285c1b621daf98d83075a466c6f4ad9904dc845dd09John McCall}
28690f97892eb8b2ecfcf633c9df01e2504686d4d96John McCall
28790f97892eb8b2ecfcf633c9df01e2504686d4d96John McCallnamespace test11 {
28890f97892eb8b2ecfcf633c9df01e2504686d4d96John McCall  class A {
28990f97892eb8b2ecfcf633c9df01e2504686d4d96John McCall    protected: virtual ~A();
29090f97892eb8b2ecfcf633c9df01e2504686d4d96John McCall  };
29190f97892eb8b2ecfcf633c9df01e2504686d4d96John McCall
29290f97892eb8b2ecfcf633c9df01e2504686d4d96John McCall  class B : public A {
29390f97892eb8b2ecfcf633c9df01e2504686d4d96John McCall    ~B();
29490f97892eb8b2ecfcf633c9df01e2504686d4d96John McCall  };
29590f97892eb8b2ecfcf633c9df01e2504686d4d96John McCall
29690f97892eb8b2ecfcf633c9df01e2504686d4d96John McCall  B::~B() {};
29790f97892eb8b2ecfcf633c9df01e2504686d4d96John McCall}
2982cc2675d426af23476a9722c08c1b6c5266bd653John McCall
2992cc2675d426af23476a9722c08c1b6c5266bd653John McCallnamespace test12 {
3002cc2675d426af23476a9722c08c1b6c5266bd653John McCall  class A {
3012cc2675d426af23476a9722c08c1b6c5266bd653John McCall    int x;
3022cc2675d426af23476a9722c08c1b6c5266bd653John McCall
3032cc2675d426af23476a9722c08c1b6c5266bd653John McCall    void foo() {
3042cc2675d426af23476a9722c08c1b6c5266bd653John McCall      class Local {
3052cc2675d426af23476a9722c08c1b6c5266bd653John McCall        int foo(A *a) {
3062cc2675d426af23476a9722c08c1b6c5266bd653John McCall          return a->x;
3072cc2675d426af23476a9722c08c1b6c5266bd653John McCall        }
3082cc2675d426af23476a9722c08c1b6c5266bd653John McCall      };
3092cc2675d426af23476a9722c08c1b6c5266bd653John McCall    }
3102cc2675d426af23476a9722c08c1b6c5266bd653John McCall  };
3112cc2675d426af23476a9722c08c1b6c5266bd653John McCall}
3126bb8017bb9e828d118e15e59d71c66bba323c364John McCall
3136bb8017bb9e828d118e15e59d71c66bba323c364John McCallnamespace test13 {
3146bb8017bb9e828d118e15e59d71c66bba323c364John McCall  struct A {
3156bb8017bb9e828d118e15e59d71c66bba323c364John McCall    int x;
3166bb8017bb9e828d118e15e59d71c66bba323c364John McCall    unsigned foo() const;
3176bb8017bb9e828d118e15e59d71c66bba323c364John McCall  };
3186bb8017bb9e828d118e15e59d71c66bba323c364John McCall
3196bb8017bb9e828d118e15e59d71c66bba323c364John McCall  struct B : protected A {
3206bb8017bb9e828d118e15e59d71c66bba323c364John McCall    using A::foo;
3216bb8017bb9e828d118e15e59d71c66bba323c364John McCall    using A::x;
3226bb8017bb9e828d118e15e59d71c66bba323c364John McCall  };
3236bb8017bb9e828d118e15e59d71c66bba323c364John McCall
3246bb8017bb9e828d118e15e59d71c66bba323c364John McCall  void test() {
3256bb8017bb9e828d118e15e59d71c66bba323c364John McCall    A *d;
3266bb8017bb9e828d118e15e59d71c66bba323c364John McCall    d->foo();
3276bb8017bb9e828d118e15e59d71c66bba323c364John McCall    (void) d->x;
3286bb8017bb9e828d118e15e59d71c66bba323c364John McCall  }
3296bb8017bb9e828d118e15e59d71c66bba323c364John McCall}
330