blob: 74c5f27751b9f925b13c5c36966b7a5c67739e21 [file] [log] [blame]
Richard Smithad5c1ca2013-04-29 10:13:55 +00001// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
Anders Carlsson2ed6ceb2009-03-26 00:24:17 +00002
3class C {
4 struct S; // expected-note {{previously declared 'private' here}}
Anders Carlsson2ed6ceb2009-03-26 00:24:17 +00005public:
Anders Carlsson137108d2009-03-26 01:24:28 +00006
Anders Carlsson2ed6ceb2009-03-26 00:24:17 +00007 struct S {}; // expected-error {{'S' redeclared with 'public' access}}
8};
9
10struct S {
11 class C; // expected-note {{previously declared 'public' here}}
12
13private:
14 class C { }; // expected-error {{'C' redeclared with 'private' access}}
Anders Carlsson137108d2009-03-26 01:24:28 +000015};
16
17class T {
18protected:
19 template<typename T> struct A; // expected-note {{previously declared 'protected' here}}
20
21private:
22 template<typename T> struct A {}; // expected-error {{'A' redeclared with 'private' access}}
23};
John McCall0a4bb262009-12-23 00:37:40 +000024
25// PR5573
26namespace test1 {
27 class A {
28 private:
David Majnemer55890bf2013-06-11 03:51:23 +000029 class X; // expected-note {{previously declared 'private' here}} \
30 // expected-note {{previous declaration is here}}
John McCall0a4bb262009-12-23 00:37:40 +000031 public:
David Majnemer55890bf2013-06-11 03:51:23 +000032 class X; // expected-error {{'X' redeclared with 'public' access}} \
33 // expected-warning {{class member cannot be redeclared}}
John McCall0a4bb262009-12-23 00:37:40 +000034 class X {};
35 };
36}
Richard Smithad5c1ca2013-04-29 10:13:55 +000037
38// PR15209
39namespace PR15209 {
40 namespace alias_templates {
41 template<typename T1, typename T2> struct U { };
42 template<typename T1> using W = U<T1, float>;
43
44 class A {
45 typedef int I;
46 static constexpr I x = 0; // expected-note {{implicitly declared private here}}
47 static constexpr I y = 42; // expected-note {{implicitly declared private here}}
48 friend W<int>;
49 };
50
51 template<typename T1>
52 struct U<T1, float> {
53 int v_;
54 // the following will trigger for U<float, float> instantiation, via W<float>
55 U() : v_(A::x) { } // expected-error {{'x' is a private member of 'PR15209::alias_templates::A'}}
56 };
57
58 template<typename T1>
59 struct U<T1, int> {
60 int v_;
61 U() : v_(A::y) { } // expected-error {{'y' is a private member of 'PR15209::alias_templates::A'}}
62 };
63
64 template struct U<int, int>; // expected-note {{in instantiation of member function 'PR15209::alias_templates::U<int, int>::U' requested here}}
65
66 void f()
67 {
68 W<int>();
69 // we should issue diagnostics for the following
70 W<float>(); // expected-note {{in instantiation of member function 'PR15209::alias_templates::U<float, float>::U' requested here}}
71 }
72 }
73
74 namespace templates {
75 class A {
76 typedef int I; // expected-note {{implicitly declared private here}}
77 static constexpr I x = 0; // expected-note {{implicitly declared private here}}
78
79 template<int> friend struct B;
80 template<int> struct C;
81 template<template<int> class T> friend struct TT;
82 template<typename T> friend void funct(T);
83 };
84 template<A::I> struct B { };
85
86 template<A::I> struct A::C { };
87
88 template<template<A::I> class T> struct TT {
89 T<A::x> t;
90 };
91
92 template struct TT<B>;
93 template<A::I> struct D { }; // expected-error {{'I' is a private member of 'PR15209::templates::A'}}
94 template struct TT<D>;
95
96 // function template case
97 template<typename T>
98 void funct(T)
99 {
100 (void)A::x;
101 }
102
103 template void funct<int>(int);
104
105 void f()
106 {
107 (void)A::x; // expected-error {{'x' is a private member of 'PR15209::templates::A'}}
108 }
109 }
110}
Richard Smith389790a2013-06-11 20:38:45 +0000111
112namespace PR7434 {
113 namespace comment0 {
114 template <typename T> struct X;
115 namespace N {
116 class Y {
117 template<typename T> friend struct X;
118 int t; // expected-note {{here}}
119 };
120 }
121 template<typename T> struct X {
122 X() { (void)N::Y().t; } // expected-error {{private}}
123 };
124 X<char> x;
125 }
126 namespace comment2 {
127 struct X;
128 namespace N {
129 class Y {
130 friend struct X;
131 int t; // expected-note {{here}}
132 };
133 }
134 struct X {
135 X() { (void)N::Y().t; } // expected-error {{private}}
136 };
137 }
138}
Richard Smith608da012013-12-11 03:35:27 +0000139
140namespace LocalExternVar {
141 class test {
142 private:
143 struct private_struct { // expected-note 2{{here}}
144 int x;
145 };
146 int use_private();
147 };
148
149 int test::use_private() {
150 extern int array[sizeof(test::private_struct)]; // ok
151 return array[0];
152 }
153
154 int f() {
155 extern int array[sizeof(test::private_struct)]; // expected-error {{private}}
156 return array[0];
157 }
158
159 int array[sizeof(test::private_struct)]; // expected-error {{private}}
160}
Richard Smithc7649dc2016-03-23 20:07:07 +0000161
162namespace ThisLambdaIsNotMyFriend {
163 class A {
164 friend class D;
165 static void foo(); // expected-note {{here}}
166 };
167 template <class T> void foo() {
168 []() { A::foo(); }(); // expected-error {{private}}
169 }
Richard Smithfd55fc82016-03-23 20:39:06 +0000170 void bar() { foo<void>(); }
Richard Smithc7649dc2016-03-23 20:07:07 +0000171}
Akira Hatanaka4ac16db2018-06-13 05:26:23 +0000172
173namespace OverloadedMemberFunctionPointer {
174 template<class T, void(T::*pMethod)()>
175 void func0() {}
176
177 template<class T, void(T::*pMethod)(int)>
178 void func1() {}
179
180 template<class T>
181 void func2(void(*fn)()) {} // expected-note 2 {{candidate function template not viable: no overload of 'func}}
182
183 class C {
184 private:
185 friend void friendFunc();
186 void overloadedMethod();
187 protected:
188 void overloadedMethod(int);
189 public:
190 void overloadedMethod(int, int);
191 void method() {
192 func2<int>(&func0<C, &C::overloadedMethod>);
193 func2<int>(&func1<C, &C::overloadedMethod>);
194 }
195 };
196
197 void friendFunc() {
198 func2<int>(&func0<C, &C::overloadedMethod>);
199 func2<int>(&func1<C, &C::overloadedMethod>);
200 }
201
202 void nonFriendFunc() {
203 func2<int>(&func0<C, &C::overloadedMethod>); // expected-error {{no matching function for call to 'func2'}}
204 func2<int>(&func1<C, &C::overloadedMethod>); // expected-error {{no matching function for call to 'func2'}}
205 }
206
207 // r325321 caused an assertion failure when the following code was compiled.
208 class A {
209 template <typename Type> static bool foo1() { return true; }
210
211 public:
212 void init(bool c) {
213 if (c) {
214 auto f = foo1<int>;
215 }
216 }
217 };
218}