blob: b164d9eda6a52c5992cc3d744ab2930ac054fe4d [file] [log] [blame]
Richard Smith762bb9d2011-10-13 22:29:44 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11
Anders Carlsson67e4dd22009-03-22 01:52:17 +00002
3#ifndef __GXX_EXPERIMENTAL_CXX0X__
4#define __CONCAT(__X, __Y) __CONCAT1(__X, __Y)
5#define __CONCAT1(__X, __Y) __X ## __Y
6
7#define static_assert(__b, __m) \
8 typedef int __CONCAT(__sa, __LINE__)[__b ? 1 : -1]
9#endif
10
11class C {
Chandler Carruth45f11b72011-02-18 23:59:51 +000012 virtual void f() = 0; // expected-note {{unimplemented pure virtual method 'f'}}
Anders Carlsson67e4dd22009-03-22 01:52:17 +000013};
14
15static_assert(__is_abstract(C), "C has a pure virtual function");
16
17class D : C {
18};
19
20static_assert(__is_abstract(D), "D inherits from an abstract class");
21
22class E : D {
Mike Stump1eb44332009-09-09 15:08:12 +000023 virtual void f();
Anders Carlsson67e4dd22009-03-22 01:52:17 +000024};
25
26static_assert(!__is_abstract(E), "E inherits from an abstract class but implements f");
Anders Carlsson4681ebd2009-03-22 20:18:17 +000027
Chandler Carruth0a8709a2011-02-19 00:12:23 +000028C *d = new C; // expected-error {{allocating an object of abstract class type 'C'}}
Anders Carlssonb9bbe492009-03-23 17:49:10 +000029
Anders Carlsson4681ebd2009-03-22 20:18:17 +000030C c; // expected-error {{variable type 'C' is an abstract class}}
31void t1(C c); // expected-error {{parameter type 'C' is an abstract class}}
32void t2(C); // expected-error {{parameter type 'C' is an abstract class}}
33
34struct S {
35 C c; // expected-error {{field type 'C' is an abstract class}}
36};
Anders Carlssonb9bbe492009-03-23 17:49:10 +000037
Anders Carlsson11f21a02009-03-23 19:10:31 +000038void t3(const C&);
39
40void f() {
Chandler Carruth0a8709a2011-02-19 00:12:23 +000041 C(); // expected-error {{allocating an object of abstract class type 'C'}}
42 t3(C()); // expected-error {{allocating an object of abstract class type 'C'}}
Anders Carlsson11f21a02009-03-23 19:10:31 +000043}
44
Douglas Gregor138bb232010-04-27 19:38:14 +000045C e1[2]; // expected-error {{array of abstract class type 'C'}}
46C (*e2)[2]; // expected-error {{array of abstract class type 'C'}}
47C (**e3)[2]; // expected-error {{array of abstract class type 'C'}}
Anders Carlsson11f21a02009-03-23 19:10:31 +000048
Douglas Gregor138bb232010-04-27 19:38:14 +000049void t4(C c[2]); // expected-error {{array of abstract class type 'C'}}
Anders Carlsson11f21a02009-03-23 19:10:31 +000050
51void t5(void (*)(C)); // expected-error {{parameter type 'C' is an abstract class}}
52
53typedef void (*Func)(C); // expected-error {{parameter type 'C' is an abstract class}}
54void t6(Func);
55
Anders Carlsson8211eff2009-03-24 01:19:16 +000056class F {
Mike Stump1eb44332009-09-09 15:08:12 +000057 F a() { while (1) {} } // expected-error {{return type 'F' is an abstract class}}
Anders Carlsson8211eff2009-03-24 01:19:16 +000058
Mike Stump1eb44332009-09-09 15:08:12 +000059 class D {
60 void f(F c); // expected-error {{parameter type 'F' is an abstract class}}
61 };
Anders Carlsson11f21a02009-03-23 19:10:31 +000062
Mike Stump1eb44332009-09-09 15:08:12 +000063 union U {
64 void u(F c); // expected-error {{parameter type 'F' is an abstract class}}
65 };
Anders Carlsson8211eff2009-03-24 01:19:16 +000066
Chandler Carruth45f11b72011-02-18 23:59:51 +000067 virtual void f() = 0; // expected-note {{unimplemented pure virtual method 'f'}}
Anders Carlsson8211eff2009-03-24 01:19:16 +000068};
Anders Carlssone65a3c82009-03-24 17:23:42 +000069
John McCall94c3b562010-08-18 09:41:07 +000070// Diagnosing in these cases is prohibitively expensive. We still
71// diagnose at the function definition, of course.
72
Anders Carlssone65a3c82009-03-24 17:23:42 +000073class Abstract;
74
John McCall94c3b562010-08-18 09:41:07 +000075void t7(Abstract a);
Anders Carlssone65a3c82009-03-24 17:23:42 +000076
77void t8() {
John McCall94c3b562010-08-18 09:41:07 +000078 void h(Abstract a);
Anders Carlssone65a3c82009-03-24 17:23:42 +000079}
80
81namespace N {
John McCall94c3b562010-08-18 09:41:07 +000082void h(Abstract a);
Anders Carlssone65a3c82009-03-24 17:23:42 +000083}
84
85class Abstract {
John McCall94c3b562010-08-18 09:41:07 +000086 virtual void f() = 0;
Anders Carlssone65a3c82009-03-24 17:23:42 +000087};
Anders Carlsson8ff8c222009-05-17 00:00:05 +000088
89// <rdar://problem/6854087>
90class foo {
91public:
Mike Stump1eb44332009-09-09 15:08:12 +000092 virtual foo *getFoo() = 0;
Anders Carlsson8ff8c222009-05-17 00:00:05 +000093};
94
95class bar : public foo {
96public:
Mike Stump1eb44332009-09-09 15:08:12 +000097 virtual bar *getFoo();
Anders Carlsson8ff8c222009-05-17 00:00:05 +000098};
99
100bar x;
Anders Carlssond12ef8d2009-05-30 00:52:53 +0000101
102// <rdar://problem/6902298>
Mike Stump1eb44332009-09-09 15:08:12 +0000103class A {
Anders Carlssond12ef8d2009-05-30 00:52:53 +0000104public:
Mike Stump1eb44332009-09-09 15:08:12 +0000105 virtual void release() = 0;
106 virtual void release(int count) = 0;
107 virtual void retain() = 0;
Anders Carlssond12ef8d2009-05-30 00:52:53 +0000108};
109
Mike Stump1eb44332009-09-09 15:08:12 +0000110class B : public A {
Anders Carlssond12ef8d2009-05-30 00:52:53 +0000111public:
Mike Stump1eb44332009-09-09 15:08:12 +0000112 virtual void release();
113 virtual void release(int count);
114 virtual void retain();
Anders Carlssond12ef8d2009-05-30 00:52:53 +0000115};
116
Mike Stump1eb44332009-09-09 15:08:12 +0000117void foo(void) {
118 B b;
Anders Carlssond12ef8d2009-05-30 00:52:53 +0000119}
120
Anders Carlssonf89bb0f2009-05-30 17:26:39 +0000121struct K {
122 int f;
123 virtual ~K();
124};
125
126struct L : public K {
127 void f();
128};
Anders Carlsson27823022009-10-18 19:34:08 +0000129
130// PR5222
131namespace PR5222 {
132 struct A {
133 virtual A *clone() = 0;
134 };
135 struct B : public A {
136 virtual B *clone() = 0;
137 };
138 struct C : public B {
139 virtual C *clone();
140 };
141
142 C c;
143}
Sebastian Redla165da02009-11-18 21:51:29 +0000144
145// PR5550 - instantiating template didn't track overridden methods
146namespace PR5550 {
147 struct A {
148 virtual void a() = 0;
149 virtual void b() = 0;
150 };
151 template<typename T> struct B : public A {
152 virtual void b();
153 virtual void c() = 0;
154 };
155 struct C : public B<int> {
156 virtual void a();
157 virtual void c();
158 };
159 C x;
160}
Eli Friedmanff2d8782009-12-16 20:00:27 +0000161
162namespace PureImplicit {
163 // A pure virtual destructor should be implicitly overridden.
164 struct A { virtual ~A() = 0; };
165 struct B : A {};
166 B x;
167
168 // A pure virtual assignment operator should be implicitly overridden.
169 struct D;
170 struct C { virtual D& operator=(const D&) = 0; };
171 struct D : C {};
172 D y;
173}
John McCall52a02752010-06-16 09:33:39 +0000174
175namespace test1 {
176 struct A {
177 virtual void foo() = 0;
178 };
179
180 struct B : A {
181 using A::foo;
182 };
183
184 struct C : B {
185 void foo();
186 };
187
188 void test() {
189 C c;
190 }
191}
John McCall94c3b562010-08-18 09:41:07 +0000192
193// rdar://problem/8302168
194namespace test2 {
195 struct X1 {
Chandler Carruth45f11b72011-02-18 23:59:51 +0000196 virtual void xfunc(void) = 0; // expected-note {{unimplemented pure virtual method}}
John McCall94c3b562010-08-18 09:41:07 +0000197 void g(X1 parm7); // expected-error {{parameter type 'test2::X1' is an abstract class}}
198 void g(X1 parm8[2]); // expected-error {{array of abstract class type 'test2::X1'}}
199 };
200
201 template <int N>
202 struct X2 {
Chandler Carruth45f11b72011-02-18 23:59:51 +0000203 virtual void xfunc(void) = 0; // expected-note {{unimplemented pure virtual method}}
John McCall94c3b562010-08-18 09:41:07 +0000204 void g(X2 parm10); // expected-error {{parameter type 'X2<N>' is an abstract class}}
205 void g(X2 parm11[2]); // expected-error {{array of abstract class type 'X2<N>'}}
206 };
207}
John McCall6aa03e62010-08-18 09:58:15 +0000208
209namespace test3 {
210 struct A { // expected-note {{not complete until}}
211 A x; // expected-error {{field has incomplete type}}
212 virtual void abstract() = 0;
213 };
214
215 struct B { // expected-note {{not complete until}}
216 virtual void abstract() = 0;
217 B x; // expected-error {{field has incomplete type}}
218 };
219
220 struct C {
221 static C x; // expected-error {{abstract class}}
Chandler Carruth45f11b72011-02-18 23:59:51 +0000222 virtual void abstract() = 0; // expected-note {{unimplemented pure virtual method}}
John McCall6aa03e62010-08-18 09:58:15 +0000223 };
224
225 struct D {
Chandler Carruth45f11b72011-02-18 23:59:51 +0000226 virtual void abstract() = 0; // expected-note {{unimplemented pure virtual method}}
John McCall6aa03e62010-08-18 09:58:15 +0000227 static D x; // expected-error {{abstract class}}
228 };
229}
230
231namespace test4 {
232 template <class T> struct A {
233 A x; // expected-error {{abstract class}}
Chandler Carruth45f11b72011-02-18 23:59:51 +0000234 virtual void abstract() = 0; // expected-note {{unimplemented pure virtual method}}
John McCall6aa03e62010-08-18 09:58:15 +0000235 };
236
237 template <class T> struct B {
Chandler Carruth45f11b72011-02-18 23:59:51 +0000238 virtual void abstract() = 0; // expected-note {{unimplemented pure virtual method}}
John McCall6aa03e62010-08-18 09:58:15 +0000239 B x; // expected-error {{abstract class}}
240 };
241
242 template <class T> struct C {
243 static C x; // expected-error {{abstract class}}
Chandler Carruth45f11b72011-02-18 23:59:51 +0000244 virtual void abstract() = 0; // expected-note {{unimplemented pure virtual method}}
John McCall6aa03e62010-08-18 09:58:15 +0000245 };
246
247 template <class T> struct D {
Chandler Carruth45f11b72011-02-18 23:59:51 +0000248 virtual void abstract() = 0; // expected-note {{unimplemented pure virtual method}}
John McCall6aa03e62010-08-18 09:58:15 +0000249 static D x; // expected-error {{abstract class}}
250 };
251}
Douglas Gregor70191862011-02-22 23:21:06 +0000252
253// PR9247: Crash on invalid in clang::Sema::ActOnFinishCXXMemberSpecification
254namespace pr9247 {
255 struct A {
256 virtual void g(const A& input) = 0;
257 struct B {
258 C* f(int foo);
259 };
260 };
261}