1 // { dg-options "-Wcatch-value=1" } 2 ~AA3struct A { virtual ~A() {} }; 4 struct B : A {}; 5 struct C {}; 6 struct D : C {}; 7 foo()8void foo() 9 { 10 try {} 11 catch (D) {} 12 catch (C) {} 13 catch (B) {} // { dg-warning "10:catching polymorphic type" } 14 catch (A) {} // { dg-warning "10: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 foo1()27template<typename T> void foo1() 28 { 29 try {} 30 catch (T) {} // { dg-warning "10:catching polymorphic type" } 31 } 32 foo2()33template<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 bar()45void 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 } 65