aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-20.C
blob: 85e064b9933ba585ea0fc784f465b75dacb252c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdlib.h>
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-release_ssa -fdevirtualize"  } */
namespace {
struct A
{ int a; virtual int foo() {return a;} void bar() {a=7;} };
struct B
{ int b; virtual int foo2() {return b;} void bar2() {b=9;} };
struct C : public virtual A, public virtual B { };
struct D : public virtual B, public virtual A { };
struct E : public C, public D { void bar2() {b=9;} }; }
int
main(void)
{
  struct E e;
  struct C *c = &e;
  struct D *d = &e;
  struct A *a = &e;
  struct B *b = &e;
  e.bar();
  e.bar2();
  if (e.foo() + e.foo2() != 16)
    abort ();
  if (c->foo() + d->foo2() != 16)
    abort ();
  if (a->foo() + b->foo2() != 16)
    abort ();
  return 0;
}
/* { dg-final { scan-tree-dump-not "abort" "release_ssa"  } } */
/* { dg-final { cleanup-tree-dump "release_ssa" } } */