| // RUN: clang -fsyntax-only -verify %s -std=c++0x |
| |
| #ifndef __GXX_EXPERIMENTAL_CXX0X__ |
| #define __CONCAT(__X, __Y) __CONCAT1(__X, __Y) |
| #define __CONCAT1(__X, __Y) __X ## __Y |
| |
| #define static_assert(__b, __m) \ |
| typedef int __CONCAT(__sa, __LINE__)[__b ? 1 : -1] |
| #endif |
| |
| class C { |
| virtual void f() = 0; // expected-note {{pure virtual function 'f'}} |
| }; |
| |
| static_assert(__is_abstract(C), "C has a pure virtual function"); |
| |
| class D : C { |
| }; |
| |
| static_assert(__is_abstract(D), "D inherits from an abstract class"); |
| |
| class E : D { |
| virtual void f(); |
| }; |
| |
| static_assert(!__is_abstract(E), "E inherits from an abstract class but implements f"); |
| |
| C *d = new C; // expected-error {{allocation of an object of abstract type 'C'}} |
| |
| C c; // expected-error {{variable type 'C' is an abstract class}} |
| void t1(C c); // expected-error {{parameter type 'C' is an abstract class}} |
| void t2(C); // expected-error {{parameter type 'C' is an abstract class}} |
| |
| struct S { |
| C c; // expected-error {{field type 'C' is an abstract class}} |
| }; |
| |
| void t3(const C&); |
| |
| void f() { |
| C(); // expected-error {{allocation of an object of abstract type 'C'}} |
| t3(C()); // expected-error {{allocation of an object of abstract type 'C'}} |
| } |
| |
| C e1[2]; // expected-error {{variable type 'C' is an abstract class}} |
| C (*e2)[2]; // expected-error {{variable type 'C' is an abstract class}} |
| C (**e3)[2]; // expected-error {{variable type 'C' is an abstract class}} |
| |
| void t4(C c[2]); // expected-error {{parameter type 'C' is an abstract class}} |
| |
| void t5(void (*)(C)); // expected-error {{parameter type 'C' is an abstract class}} |
| |
| typedef void (*Func)(C); // expected-error {{parameter type 'C' is an abstract class}} |
| void t6(Func); |
| |
| class F { |
| F a() { } // expected-error {{return type 'F' is an abstract class}} |
| |
| class D { |
| void f(F c); // expected-error {{parameter type 'F' is an abstract class}} |
| }; |
| |
| union U { |
| void u(F c); // expected-error {{parameter type 'F' is an abstract class}} |
| }; |
| |
| virtual void f() = 0; // expected-note {{pure virtual function 'f'}} |
| }; |