| /* Check that we speculatively devirutalize call to FOO to B::foo becuase |
| A is noreturn. */ |
| /* { dg-do compile } */ |
| /* { dg-options "-O2 -fdump-ipa-devirt-details -fdump-tree-optimized" } */ |
| /* { dg-add-options bind_pic_locally } */ |
| |
| class A { |
| public: |
| virtual int foo(void) |
| { |
| throw (1); |
| return 0; |
| } |
| }; |
| |
| |
| class B : public A { |
| public: |
| virtual int foo(void); |
| }; |
| |
| int |
| B::foo(void) |
| { |
| return 1; |
| } |
| class A a, *b=&a; |
| void |
| m(void) |
| { |
| b->foo(); |
| } |
| int main() |
| { |
| m(); |
| } |
| |
| /* { dg-final { scan-ipa-dump "speculatively devirtualizing call" "devirt"} } */ |
| /* Match if (PROF_6 == foo) to verify that the speculation survived. */ |
| /* { dg-final { scan-tree-dump "== foo" "optimized"} } */ |