| /* { dg-do compile } */ |
| /* { dg-options "-O2 -fdump-ipa-devirt" } */ |
| struct A {virtual int t(){return 42;}}; |
| struct B:A {virtual int t(){return 1;}}; |
| |
| struct A aa; |
| struct B bb; |
| int |
| t(struct B *b) |
| { |
| struct A *a=b; |
| a->t(); |
| |
| return 0; |
| } |
| |
| /* We should guess that the pointer of type B probably points to an instance |
| of B or its derivates and exclude A::t from list of likely targets. */ |
| |
| /* { dg-final { scan-ipa-dump "Speculative targets" "devirt" } } */ |
| /* { dg-final { scan-ipa-dump "1 speculatively devirtualized" "devirt" } } */ |