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