1 // P0929R2: Checking for abstract class types.
2 // { dg-do compile { target c++11 } }
3 // { dg-additional-options -Wno-return-type }
4
5 struct A
6 {
7 virtual void f() = 0;
8 };
9
10 struct B
11 {
12 A a; // { dg-error "abstract" }
13 A ar[4]; // { dg-error "abstract" }
14 };
15
16 using Aa = A[4]; // OK
17 Aa* aap; // OK
18
19 extern A a; // OK
20 extern Aa aa; // OK
21 A f(); // OK
22 void g(A); // OK
23
24 A a; // { dg-error "abstract" }
25 Aa aa; // { dg-error "abstract" }
f()26 A f() { } // { dg-error "abstract" }
g(A)27 void g(A) { } // { dg-error "abstract" }
28
main()29 int main()
30 {
31 (A(a)); // { dg-error "abstract" }
32 A{}; // { dg-error "abstract" }
33 static_cast<A>(a); // { dg-error "abstract" }
34 Aa{}; // { dg-error "abstract" }
35 f(); // { dg-error "abstract" }
36 decltype(f())* p; // OK
37 g(a); // { dg-error "abstract" }
38
39 throw a; // { dg-error "abstract" }
40 }
41