111
|
1 // { dg-options "-Wcatch-value=1" }
|
|
2
|
|
3 struct A { virtual ~A() {} };
|
|
4 struct B : A {};
|
|
5 struct C {};
|
|
6 struct D : C {};
|
|
7
|
|
8 void foo()
|
|
9 {
|
|
10 try {}
|
|
11 catch (D) {}
|
|
12 catch (C) {}
|
|
13 catch (B) {} // { dg-warning "catching polymorphic type" }
|
|
14 catch (A) {} // { dg-warning "catching polymorphic type" }
|
|
15 catch (A*) {}
|
|
16 catch (int) {}
|
|
17
|
|
18 try {}
|
|
19 catch (D&) {}
|
|
20 catch (C&) {}
|
|
21 catch (B&) {}
|
|
22 catch (A&) {}
|
|
23 catch (A*) {}
|
|
24 catch (int&) {}
|
|
25 }
|
|
26
|
|
27 template<typename T> void foo1()
|
|
28 {
|
|
29 try {}
|
|
30 catch (T) {} // { dg-warning "catching polymorphic type" }
|
|
31 }
|
|
32
|
|
33 template<typename T> void foo2()
|
|
34 {
|
|
35 try {}
|
|
36 catch (T*) {}
|
|
37
|
|
38 try {}
|
|
39 catch (T&) {}
|
|
40
|
|
41 try {}
|
|
42 catch (const T&) {}
|
|
43 }
|
|
44
|
|
45 void bar()
|
|
46 {
|
|
47 foo1<int&>();
|
|
48 foo1<const A&>();
|
|
49 foo1<B&>();
|
|
50 foo1<const C&>();
|
|
51 foo1<D&>();
|
|
52
|
|
53 foo1<int>();
|
|
54 foo1<A>(); // { dg-message "required" }
|
|
55 foo1<B>(); // { dg-message "required" }
|
|
56 foo1<C>();
|
|
57 foo1<D>();
|
|
58
|
|
59 foo2<int>();
|
|
60 foo2<A>();
|
|
61 foo2<B>();
|
|
62 foo2<C>();
|
|
63 foo2<D>();
|
|
64 }
|