p1.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. // RUN: %clang_cc1 -fsyntax-only -verify %s
  2. namespace test0 {
  3. class A {
  4. protected: int x; // expected-note 3 {{declared}} \
  5. // expected-note {{member is declared here}}
  6. static int sx; // expected-note 3 {{declared}} \
  7. // expected-note {{member is declared here}}
  8. };
  9. class B : public A {
  10. };
  11. class C : protected A { // expected-note {{declared}}
  12. };
  13. class D : private B { // expected-note 3 {{constrained}}
  14. };
  15. void test(A &a) {
  16. (void) a.x; // expected-error {{'x' is a protected member}}
  17. (void) a.sx; // expected-error {{'sx' is a protected member}}
  18. }
  19. void test(B &b) {
  20. (void) b.x; // expected-error {{'x' is a protected member}}
  21. (void) b.sx; // expected-error {{'sx' is a protected member}}
  22. }
  23. void test(C &c) {
  24. (void) c.x; // expected-error {{'x' is a protected member}} expected-error {{protected base class}}
  25. (void) c.sx; // expected-error {{'sx' is a protected member}}
  26. }
  27. void test(D &d) {
  28. (void) d.x; // expected-error {{'x' is a private member}} expected-error {{private base class}}
  29. (void) d.sx; // expected-error {{'sx' is a private member}}
  30. }
  31. }
  32. namespace test1 {
  33. class A {
  34. protected: int x;
  35. static int sx;
  36. static void test(A&);
  37. };
  38. class B : public A {
  39. static void test(B&);
  40. };
  41. class C : protected A {
  42. static void test(C&);
  43. };
  44. class D : private B {
  45. static void test(D&);
  46. };
  47. void A::test(A &a) {
  48. (void) a.x;
  49. (void) a.sx;
  50. }
  51. void B::test(B &b) {
  52. (void) b.x;
  53. (void) b.sx;
  54. }
  55. void C::test(C &c) {
  56. (void) c.x;
  57. (void) c.sx;
  58. }
  59. void D::test(D &d) {
  60. (void) d.x;
  61. (void) d.sx;
  62. }
  63. }
  64. namespace test2 {
  65. class A {
  66. protected: int x; // expected-note 3 {{can only access this member on an object of type}}
  67. static int sx;
  68. static void test(A&);
  69. };
  70. class B : public A {
  71. static void test(A&);
  72. };
  73. class C : protected A {
  74. static void test(A&);
  75. };
  76. class D : private B {
  77. static void test(A&);
  78. };
  79. void A::test(A &a) {
  80. (void) a.x;
  81. (void) a.sx;
  82. }
  83. void B::test(A &a) {
  84. (void) a.x; // expected-error {{'x' is a protected member}}
  85. (void) a.sx;
  86. }
  87. void C::test(A &a) {
  88. (void) a.x; // expected-error {{'x' is a protected member}}
  89. (void) a.sx;
  90. }
  91. void D::test(A &a) {
  92. (void) a.x; // expected-error {{'x' is a protected member}}
  93. (void) a.sx;
  94. }
  95. }
  96. namespace test3 {
  97. class B;
  98. class A {
  99. protected: int x; //expected-note {{declared protected}} // expected-note {{can only access this member on an object of type}}
  100. static int sx;
  101. static void test(B&);
  102. };
  103. class B : public A {
  104. static void test(B&);
  105. };
  106. class C : protected A {
  107. static void test(B&);
  108. };
  109. class D : private B {
  110. static void test(B&);
  111. };
  112. void A::test(B &b) {
  113. (void) b.x;
  114. (void) b.sx;
  115. }
  116. void B::test(B &b) {
  117. (void) b.x;
  118. (void) b.sx;
  119. }
  120. void C::test(B &b) {
  121. (void) b.x; // expected-error {{'x' is a protected member}}
  122. (void) b.sx;
  123. }
  124. void D::test(B &b) {
  125. (void) b.x; // expected-error {{'x' is a protected member}}
  126. (void) b.sx;
  127. }
  128. }
  129. namespace test4 {
  130. class C;
  131. class A {
  132. protected: int x; // expected-note 2{{declared protected here}} expected-note{{member is declared here}}
  133. static int sx; // expected-note 3{{member is declared here}}
  134. static void test(C&);
  135. };
  136. class B : public A {
  137. static void test(C&);
  138. };
  139. class C : protected A { // expected-note 4 {{constrained}} expected-note 3 {{declared}}
  140. static void test(C&);
  141. };
  142. class D : private B {
  143. static void test(C&);
  144. };
  145. void A::test(C &c) {
  146. (void) c.x; // expected-error {{'x' is a protected member}} \
  147. // expected-error {{protected base class}}
  148. (void) c.sx; // expected-error {{'sx' is a protected member}}
  149. }
  150. void B::test(C &c) {
  151. (void) c.x; // expected-error {{'x' is a protected member}} \
  152. // expected-error {{protected base class}}
  153. (void) c.sx; // expected-error {{'sx' is a protected member}}
  154. }
  155. void C::test(C &c) {
  156. (void) c.x;
  157. (void) c.sx;
  158. }
  159. void D::test(C &c) {
  160. (void) c.x; // expected-error {{'x' is a protected member}} \
  161. // expected-error {{protected base class}}
  162. (void) c.sx; // expected-error {{'sx' is a protected member}}
  163. }
  164. }
  165. namespace test5 {
  166. class D;
  167. class A {
  168. protected: int x; // expected-note 3{{member is declared here}}
  169. static int sx; // expected-note 3{{member is declared here}}
  170. static void test(D&);
  171. };
  172. class B : public A {
  173. static void test(D&);
  174. };
  175. class C : protected A {
  176. static void test(D&);
  177. };
  178. class D : private B { // expected-note 9 {{constrained}}
  179. static void test(D&);
  180. };
  181. void A::test(D &d) {
  182. (void) d.x; // expected-error {{'x' is a private member}} \
  183. // expected-error {{cannot cast}}
  184. (void) d.sx; // expected-error {{'sx' is a private member}}
  185. }
  186. void B::test(D &d) {
  187. (void) d.x; // expected-error {{'x' is a private member}} \
  188. // expected-error {{cannot cast}}
  189. (void) d.sx; // expected-error {{'sx' is a private member}}
  190. }
  191. void C::test(D &d) {
  192. (void) d.x; // expected-error {{'x' is a private member}} \
  193. // expected-error {{cannot cast}}
  194. (void) d.sx; // expected-error {{'sx' is a private member}}
  195. }
  196. void D::test(D &d) {
  197. (void) d.x;
  198. (void) d.sx;
  199. }
  200. }
  201. namespace test6 {
  202. class Static {};
  203. class A {
  204. protected:
  205. void foo(int); // expected-note 3 {{can only access this member on an object of type}}
  206. void foo(long);
  207. static void foo(Static);
  208. static void test(A&);
  209. };
  210. class B : public A {
  211. static void test(A&);
  212. };
  213. class C : protected A {
  214. static void test(A&);
  215. };
  216. class D : private B {
  217. static void test(A&);
  218. };
  219. void A::test(A &a) {
  220. a.foo(10);
  221. a.foo(Static());
  222. }
  223. void B::test(A &a) {
  224. a.foo(10); // expected-error {{'foo' is a protected member}}
  225. a.foo(Static());
  226. }
  227. void C::test(A &a) {
  228. a.foo(10); // expected-error {{'foo' is a protected member}}
  229. a.foo(Static());
  230. }
  231. void D::test(A &a) {
  232. a.foo(10); // expected-error {{'foo' is a protected member}}
  233. a.foo(Static());
  234. }
  235. }
  236. namespace test7 {
  237. class Static {};
  238. class A {
  239. protected:
  240. void foo(int); // expected-note 3 {{must name member using the type of the current context}}
  241. void foo(long);
  242. static void foo(Static);
  243. static void test();
  244. };
  245. class B : public A {
  246. static void test();
  247. };
  248. class C : protected A {
  249. static void test();
  250. };
  251. class D : private B {
  252. static void test();
  253. };
  254. void A::test() {
  255. void (A::*x)(int) = &A::foo;
  256. void (*sx)(Static) = &A::foo;
  257. }
  258. void B::test() {
  259. void (A::*x)(int) = &A::foo; // expected-error {{'foo' is a protected member}}
  260. void (*sx)(Static) = &A::foo;
  261. }
  262. void C::test() {
  263. void (A::*x)(int) = &A::foo; // expected-error {{'foo' is a protected member}}
  264. void (*sx)(Static) = &A::foo;
  265. }
  266. void D::test() {
  267. void (A::*x)(int) = &A::foo; // expected-error {{'foo' is a protected member}}
  268. void (*sx)(Static) = &A::foo;
  269. }
  270. }
  271. namespace test8 {
  272. class Static {};
  273. class A {
  274. protected:
  275. void foo(int); // expected-note 3 {{must name member using the type of the current context}}
  276. void foo(long);
  277. static void foo(Static);
  278. static void test();
  279. };
  280. class B : public A {
  281. static void test();
  282. };
  283. class C : protected A {
  284. static void test();
  285. };
  286. class D : private B {
  287. static void test();
  288. };
  289. void call(void (A::*)(int));
  290. void calls(void (*)(Static));
  291. void A::test() {
  292. call(&A::foo);
  293. calls(&A::foo);
  294. }
  295. void B::test() {
  296. call(&A::foo); // expected-error {{'foo' is a protected member}}
  297. calls(&A::foo);
  298. }
  299. void C::test() {
  300. call(&A::foo); // expected-error {{'foo' is a protected member}}
  301. calls(&A::foo);
  302. }
  303. void D::test() {
  304. call(&A::foo); // expected-error {{'foo' is a protected member}}
  305. calls(&A::foo);
  306. }
  307. }
  308. namespace test9 {
  309. class A { // expected-note {{member is declared here}}
  310. 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}}
  311. };
  312. class B : public A { // expected-note {{member is declared here}}
  313. friend class D;
  314. };
  315. class C : protected B { // expected-note {{declared}} \
  316. // expected-note 9 {{constrained}}
  317. };
  318. class D : public A {
  319. static void test(A &a) {
  320. a.foo(); // expected-error {{'foo' is a protected member}}
  321. a.A::foo(); // expected-error {{'foo' is a protected member}}
  322. a.B::foo(); // expected-error {{'foo' is a protected member}}
  323. a.C::foo(); // expected-error {{'foo' is a protected member}}
  324. a.D::foo(); // expected-error {{'foo' is a protected member}}
  325. }
  326. static void test(B &b) {
  327. b.foo();
  328. b.A::foo();
  329. b.B::foo(); // accessible as named in A
  330. b.C::foo(); // expected-error {{'foo' is a protected member}}
  331. }
  332. static void test(C &c) {
  333. c.foo(); // expected-error {{'foo' is a protected member}} \
  334. // expected-error {{cannot cast}}
  335. c.A::foo(); // expected-error {{'A' is a protected member}} \
  336. // expected-error {{cannot cast}}
  337. c.B::foo(); // expected-error {{'B' is a protected member}} \
  338. // expected-error {{cannot cast}}
  339. c.C::foo(); // expected-error {{'foo' is a protected member}} \
  340. // expected-error {{cannot cast}}
  341. }
  342. static void test(D &d) {
  343. d.foo();
  344. d.A::foo();
  345. d.B::foo();
  346. d.C::foo(); // expected-error {{'foo' is a protected member}}
  347. }
  348. };
  349. }
  350. namespace test10 {
  351. template<typename T> class A {
  352. protected:
  353. int foo();
  354. int foo() const;
  355. ~A() { foo(); }
  356. };
  357. template class A<int>;
  358. }
  359. // rdar://problem/8360285: class.protected friendship
  360. namespace test11 {
  361. class A {
  362. protected:
  363. int foo();
  364. };
  365. class B : public A {
  366. friend class C;
  367. };
  368. class C {
  369. void test() {
  370. B b;
  371. b.A::foo();
  372. }
  373. };
  374. }
  375. // This friendship is considered because a public member of A would be
  376. // a private member of C.
  377. namespace test12 {
  378. class A { protected: int foo(); };
  379. class B : public virtual A {};
  380. class C : private B { friend void test(); };
  381. class D : private C, public virtual A {};
  382. void test() {
  383. D d;
  384. d.A::foo();
  385. }
  386. }
  387. // This friendship is not considered because a public member of A is
  388. // inaccessible in C.
  389. namespace test13 {
  390. class A { protected: int foo(); }; // expected-note {{declared protected here}}
  391. class B : private virtual A {};
  392. class C : private B { friend void test(); };
  393. class D : public virtual A {};
  394. void test() {
  395. D d;
  396. d.A::foo(); // expected-error {{protected member}}
  397. }
  398. }
  399. // PR8058
  400. namespace test14 {
  401. class A {
  402. protected:
  403. template <class T> void temp(T t); // expected-note {{must name member using the type of the current context}}
  404. void nontemp(int); // expected-note {{must name member using the type of the current context}}
  405. template <class T> void ovl_temp(T t); // expected-note {{must name member using the type of the current context}}
  406. void ovl_temp(float);
  407. void ovl_nontemp(int); // expected-note {{must name member using the type of the current context}}
  408. void ovl_nontemp(float);
  409. template <class T> void ovl_withtemp(T);
  410. void ovl_withtemp(int); // expected-note {{must name member using the type of the current context}}
  411. };
  412. class B : public A {
  413. void use() {
  414. void (A::*ptr)(int);
  415. ptr = &A::temp; // expected-error {{protected member}}
  416. ptr = &A::nontemp; // expected-error {{protected member}}
  417. ptr = &A::ovl_temp; // expected-error {{protected member}}
  418. ptr = &A::ovl_nontemp; // expected-error {{protected member}}
  419. ptr = &A::ovl_withtemp; // expected-error {{protected member}}
  420. }
  421. };
  422. }
  423. namespace test15 {
  424. class A {
  425. protected:
  426. A(); // expected-note 2 {{protected constructor can only be used to construct a base class subobject}}
  427. A(const A &); // expected-note {{protected constructor can only be used to construct a base class subobject}}
  428. ~A(); // expected-note 3 {{protected destructor can only be used to destroy a base class subobject}}
  429. };
  430. class B : public A {
  431. // The uses here are fine.
  432. B() {}
  433. B(int i) : A() {}
  434. ~B() {}
  435. // All these uses are bad.
  436. void test0() {
  437. A a; // expected-error {{protected constructor}} expected-error {{protected destructor}}
  438. }
  439. A *test1() {
  440. return new A(); // expected-error {{protected constructor}}
  441. }
  442. void test2(A *a) {
  443. delete a; // expected-error {{protected destructor}}
  444. }
  445. A test3(A *a) {
  446. return *a; // expected-error {{protected constructor}}
  447. }
  448. void test4(A *a) {
  449. a->~A(); // expected-error {{protected member}}
  450. }
  451. };
  452. }
  453. namespace test16 {
  454. class A {
  455. protected:
  456. ~A();
  457. };
  458. class B : public virtual A {
  459. public:
  460. ~B() {}
  461. };
  462. class C : public B {
  463. ~C() {}
  464. };
  465. }