brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.0 KiB · 2205b60 Raw
171 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s2 3// C++0x [class.access.base]p1(a):4//   If a class is declared to be a base class for another class using5//   the public access specifier, the public members of the base class6//   are accessible as public members of the derived class and protected7//   members of the base class are accessible as protected members of8//   the derived class.9namespace test0 {10  class Base {11  public: int pub; static int spub;12  protected: int prot; static int sprot; // expected-note 4 {{declared protected here}}13  private: int priv; static int spriv; // expected-note 8 {{declared private here}}14  };15 16  class Test : public Base {17    void test() {18      pub++;19      spub++;20      prot++;21      sprot++;22      priv++; // expected-error {{private member}}23      spriv++; // expected-error {{private member}}24 25      Base::pub++;26      Base::spub++;27      Base::prot++;28      Base::sprot++;29      Base::priv++; // expected-error {{private member}}30      Base::spriv++; // expected-error {{private member}}31    }32  };33 34  void test(Test *t) {35    t->pub++;36    t->spub++;37    t->prot++; // expected-error {{protected member}}38    t->sprot++; // expected-error {{protected member}}39    t->priv++; // expected-error {{private member}}40    t->spriv++; // expected-error {{private member}}41 42    t->Base::pub++;43    t->Base::spub++;44    t->Base::prot++; // expected-error {{protected member}}45    t->Base::sprot++; // expected-error {{protected member}}46    t->Base::priv++; // expected-error {{private member}}47    t->Base::spriv++; // expected-error {{private member}}48  }49}50 51// C++0x [class.access.base]p1(b):52//   If a class is declared to be a base class for another class using53//   the protected access specifier, the public and protected members54//   of the base class are accessible as protected members of the55//   derived class.56namespace test1 {57  class Base { // expected-note 6{{member is declared here}}58  public: 59    int pub; // expected-note{{member is declared here}}60    static int spub; // expected-note{{member is declared here}}61  protected: int prot; static int sprot; // expected-note 4 {{declared protected here}}62  private: int priv; static int spriv; // expected-note 8 {{declared private here}}63  };64 65  class Test : protected Base { // expected-note 3 {{declared protected here}} expected-note 8 {{constrained by protected inheritance here}}66    void test() {67      pub++;68      spub++;69      prot++;70      sprot++;71      priv++; // expected-error {{private member}}72      spriv++; // expected-error {{private member}}73 74      Base::pub++;75      Base::spub++;76      Base::prot++;77      Base::sprot++;78      Base::priv++; // expected-error {{private member}}79      Base::spriv++; // expected-error {{private member}}80    }81  };82 83  void test(Test *t) {84    t->pub++; // expected-error {{protected member}}85    t->spub++; // expected-error {{protected member}}86    t->prot++; // expected-error {{protected member}}87    t->sprot++; // expected-error {{protected member}}88    t->priv++; // expected-error {{private member}}89    t->spriv++; // expected-error {{private member}}90 91    // Two possible errors here: one for Base, one for the member92    t->Base::pub++; // expected-error {{protected member}} expected-error {{protected base class}}93    t->Base::spub++; // expected-error {{protected member}}94    t->Base::prot++; // expected-error 2 {{protected member}} expected-error {{protected base class}}95    t->Base::sprot++; // expected-error 2 {{protected member}}96    t->Base::priv++; // expected-error {{protected member}} expected-error {{private member}} expected-error {{protected base class}}97    t->Base::spriv++; // expected-error {{protected member}} expected-error {{private member}}98  }99}100 101// C++0x [class.access.base]p1(b):102//   If a class is declared to be a base class for another class using103//   the private access specifier, the public and protected members of104//   the base class are accessible as private members of the derived105//   class.106namespace test2 {107  class Base { // expected-note 6{{member is declared here}}108  public:109    int pub; // expected-note{{member is declared here}}110    static int spub; // expected-note{{member is declared here}}111  protected:112    int prot; // expected-note {{declared protected here}} \113    // expected-note{{member is declared here}}114    static int sprot; // expected-note {{declared protected here}} \115    // expected-note{{member is declared here}}116  private:117    int priv; // expected-note 4 {{declared private here}}118    static int spriv; // expected-note 4 {{declared private here}}119  };120 121  class Test : private Base { // expected-note 3 {{declared private here}} \122                              // expected-note 10 {{constrained by private inheritance here}}123    void test() {124      pub++;125      spub++;126      prot++;127      sprot++;128      priv++; // expected-error {{private member}}129      spriv++; // expected-error {{private member}}130 131      Base::pub++;132      Base::spub++;133      Base::prot++;134      Base::sprot++;135      Base::priv++; // expected-error {{private member}}136      Base::spriv++; // expected-error {{private member}}137    }138  };139 140  void test(Test *t) {141    t->pub++; // expected-error {{private member}}142    t->spub++; // expected-error {{private member}}143    t->prot++; // expected-error {{private member}}144    t->sprot++; // expected-error {{private member}}145    t->priv++; // expected-error {{private member}}146    t->spriv++; // expected-error {{private member}}147 148    t->Base::pub++; // expected-error {{private member}} expected-error {{private base class}}149    t->Base::spub++; // expected-error {{private member}}150    t->Base::prot++; // expected-error {{protected member}} expected-error {{private member}} expected-error {{private base class}}151    t->Base::sprot++; // expected-error {{protected member}} expected-error {{private member}}152    t->Base::priv++; // expected-error 2 {{private member}} expected-error {{private base class}}153    t->Base::spriv++; // expected-error 2 {{private member}}154  }155}156 157namespace PR12788 {158  class A {159  protected:160    struct {161      int x;162    };163  };164  class B : A {165    void f() {166      ++x;167      A::x++;168    }169  };170}171