xref: /aosp_15_r20/external/clang/test/SemaCXX/access.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li class C {
4*67e74705SXin Li     struct S; // expected-note {{previously declared 'private' here}}
5*67e74705SXin Li public:
6*67e74705SXin Li 
7*67e74705SXin Li     struct S {}; // expected-error {{'S' redeclared with 'public' access}}
8*67e74705SXin Li };
9*67e74705SXin Li 
10*67e74705SXin Li struct S {
11*67e74705SXin Li     class C; // expected-note {{previously declared 'public' here}}
12*67e74705SXin Li 
13*67e74705SXin Li private:
14*67e74705SXin Li     class C { }; // expected-error {{'C' redeclared with 'private' access}}
15*67e74705SXin Li };
16*67e74705SXin Li 
17*67e74705SXin Li class T {
18*67e74705SXin Li protected:
19*67e74705SXin Li     template<typename T> struct A; // expected-note {{previously declared 'protected' here}}
20*67e74705SXin Li 
21*67e74705SXin Li private:
22*67e74705SXin Li     template<typename T> struct A {}; // expected-error {{'A' redeclared with 'private' access}}
23*67e74705SXin Li };
24*67e74705SXin Li 
25*67e74705SXin Li // PR5573
26*67e74705SXin Li namespace test1 {
27*67e74705SXin Li   class A {
28*67e74705SXin Li   private:
29*67e74705SXin Li     class X; // expected-note {{previously declared 'private' here}} \
30*67e74705SXin Li              // expected-note {{previous declaration is here}}
31*67e74705SXin Li   public:
32*67e74705SXin Li     class X; // expected-error {{'X' redeclared with 'public' access}} \
33*67e74705SXin Li              // expected-warning {{class member cannot be redeclared}}
34*67e74705SXin Li     class X {};
35*67e74705SXin Li   };
36*67e74705SXin Li }
37*67e74705SXin Li 
38*67e74705SXin Li // PR15209
39*67e74705SXin Li namespace PR15209 {
40*67e74705SXin Li   namespace alias_templates {
41*67e74705SXin Li     template<typename T1, typename T2> struct U { };
42*67e74705SXin Li     template<typename T1> using W = U<T1, float>;
43*67e74705SXin Li 
44*67e74705SXin Li     class A {
45*67e74705SXin Li       typedef int I;
46*67e74705SXin Li       static constexpr I x = 0; // expected-note {{implicitly declared private here}}
47*67e74705SXin Li       static constexpr I y = 42; // expected-note {{implicitly declared private here}}
48*67e74705SXin Li       friend W<int>;
49*67e74705SXin Li     };
50*67e74705SXin Li 
51*67e74705SXin Li     template<typename T1>
52*67e74705SXin Li     struct U<T1, float>  {
53*67e74705SXin Li       int v_;
54*67e74705SXin Li       // the following will trigger for U<float, float> instantiation, via W<float>
UPR15209::alias_templates::U55*67e74705SXin Li       U() : v_(A::x) { } // expected-error {{'x' is a private member of 'PR15209::alias_templates::A'}}
56*67e74705SXin Li     };
57*67e74705SXin Li 
58*67e74705SXin Li     template<typename T1>
59*67e74705SXin Li     struct U<T1, int> {
60*67e74705SXin Li       int v_;
UPR15209::alias_templates::U61*67e74705SXin Li       U() : v_(A::y) { } // expected-error {{'y' is a private member of 'PR15209::alias_templates::A'}}
62*67e74705SXin Li     };
63*67e74705SXin Li 
64*67e74705SXin Li     template struct U<int, int>; // expected-note {{in instantiation of member function 'PR15209::alias_templates::U<int, int>::U' requested here}}
65*67e74705SXin Li 
f()66*67e74705SXin Li     void f()
67*67e74705SXin Li     {
68*67e74705SXin Li       W<int>();
69*67e74705SXin Li       // we should issue diagnostics for the following
70*67e74705SXin Li       W<float>(); // expected-note {{in instantiation of member function 'PR15209::alias_templates::U<float, float>::U' requested here}}
71*67e74705SXin Li     }
72*67e74705SXin Li   }
73*67e74705SXin Li 
74*67e74705SXin Li   namespace templates {
75*67e74705SXin Li     class A {
76*67e74705SXin Li       typedef int I;  // expected-note {{implicitly declared private here}}
77*67e74705SXin Li       static constexpr I x = 0; // expected-note {{implicitly declared private here}}
78*67e74705SXin Li 
79*67e74705SXin Li       template<int> friend struct B;
80*67e74705SXin Li       template<int> struct C;
81*67e74705SXin Li       template<template<int> class T> friend struct TT;
82*67e74705SXin Li       template<typename T> friend void funct(T);
83*67e74705SXin Li     };
84*67e74705SXin Li     template<A::I> struct B { };
85*67e74705SXin Li 
86*67e74705SXin Li     template<A::I> struct A::C { };
87*67e74705SXin Li 
88*67e74705SXin Li     template<template<A::I> class T> struct TT {
89*67e74705SXin Li       T<A::x> t;
90*67e74705SXin Li     };
91*67e74705SXin Li 
92*67e74705SXin Li     template struct TT<B>;
93*67e74705SXin Li     template<A::I> struct D { };  // expected-error {{'I' is a private member of 'PR15209::templates::A'}}
94*67e74705SXin Li     template struct TT<D>;
95*67e74705SXin Li 
96*67e74705SXin Li     // function template case
97*67e74705SXin Li     template<typename T>
funct(T)98*67e74705SXin Li     void funct(T)
99*67e74705SXin Li     {
100*67e74705SXin Li       (void)A::x;
101*67e74705SXin Li     }
102*67e74705SXin Li 
103*67e74705SXin Li     template void funct<int>(int);
104*67e74705SXin Li 
f()105*67e74705SXin Li     void f()
106*67e74705SXin Li     {
107*67e74705SXin Li       (void)A::x;  // expected-error {{'x' is a private member of 'PR15209::templates::A'}}
108*67e74705SXin Li     }
109*67e74705SXin Li   }
110*67e74705SXin Li }
111*67e74705SXin Li 
112*67e74705SXin Li namespace PR7434 {
113*67e74705SXin Li   namespace comment0 {
114*67e74705SXin Li     template <typename T> struct X;
115*67e74705SXin Li     namespace N {
116*67e74705SXin Li     class Y {
117*67e74705SXin Li       template<typename T> friend struct X;
118*67e74705SXin Li       int t; // expected-note {{here}}
119*67e74705SXin Li     };
120*67e74705SXin Li     }
121*67e74705SXin Li     template<typename T> struct X {
XPR7434::comment0::X122*67e74705SXin Li       X() { (void)N::Y().t; } // expected-error {{private}}
123*67e74705SXin Li     };
124*67e74705SXin Li     X<char> x;
125*67e74705SXin Li   }
126*67e74705SXin Li   namespace comment2 {
127*67e74705SXin Li     struct X;
128*67e74705SXin Li     namespace N {
129*67e74705SXin Li     class Y {
130*67e74705SXin Li       friend struct X;
131*67e74705SXin Li       int t; // expected-note {{here}}
132*67e74705SXin Li     };
133*67e74705SXin Li     }
134*67e74705SXin Li     struct X {
XPR7434::comment2::X135*67e74705SXin Li       X() { (void)N::Y().t; } // expected-error {{private}}
136*67e74705SXin Li     };
137*67e74705SXin Li   }
138*67e74705SXin Li }
139*67e74705SXin Li 
140*67e74705SXin Li namespace LocalExternVar {
141*67e74705SXin Li   class test {
142*67e74705SXin Li   private:
143*67e74705SXin Li     struct private_struct { // expected-note 2{{here}}
144*67e74705SXin Li       int x;
145*67e74705SXin Li     };
146*67e74705SXin Li     int use_private();
147*67e74705SXin Li   };
148*67e74705SXin Li 
use_private()149*67e74705SXin Li   int test::use_private() {
150*67e74705SXin Li     extern int array[sizeof(test::private_struct)]; // ok
151*67e74705SXin Li     return array[0];
152*67e74705SXin Li   }
153*67e74705SXin Li 
f()154*67e74705SXin Li   int f() {
155*67e74705SXin Li     extern int array[sizeof(test::private_struct)]; // expected-error {{private}}
156*67e74705SXin Li     return array[0];
157*67e74705SXin Li   }
158*67e74705SXin Li 
159*67e74705SXin Li   int array[sizeof(test::private_struct)]; // expected-error {{private}}
160*67e74705SXin Li }
161*67e74705SXin Li 
162*67e74705SXin Li namespace ThisLambdaIsNotMyFriend {
163*67e74705SXin Li   class A {
164*67e74705SXin Li     friend class D;
165*67e74705SXin Li     static void foo(); // expected-note {{here}}
166*67e74705SXin Li   };
foo()167*67e74705SXin Li   template <class T> void foo() {
168*67e74705SXin Li     []() { A::foo(); }(); // expected-error {{private}}
169*67e74705SXin Li   }
bar()170*67e74705SXin Li   void bar() { foo<void>(); }
171*67e74705SXin Li }
172