diff options
author | Ben Cheng <bccheng@google.com> | 2014-03-25 22:37:19 -0700 |
---|---|---|
committer | Ben Cheng <bccheng@google.com> | 2014-03-25 22:37:19 -0700 |
commit | 1bc5aee63eb72b341f506ad058502cd0361f0d10 (patch) | |
tree | c607e8252f3405424ff15bc2d00aa38dadbb2518 /gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C | |
parent | 283a0bf58fcf333c58a2a92c3ebbc41fb9eb1fdb (diff) | |
download | toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.zip toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.gz toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.bz2 |
Initial checkin of GCC 4.9.0 from trunk (r208799).
Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba
Diffstat (limited to 'gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C')
-rw-r--r-- | gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C new file mode 100644 index 0000000..37e7669 --- /dev/null +++ b/gcc-4.9/gcc/testsuite/g++.dg/ipa/devirt-22.C @@ -0,0 +1,41 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fno-early-inlining -fno-ipa-sra -fdump-ipa-cp" } */ +class A {}; +class B { +public: + A &operator[](int); +}; +class C : B { +public: + virtual int m_fn1() { return 0; } + A &operator[](int p1) { + int a; + a = m_fn1(); + static_cast<void>(__builtin_expect(a, 0) ?: 0); + return B::operator[](p1); + } +}; + +C b; +int *e; +static void sort(C &p1, C &p2) { + for (int i=0;; i++) { + A c, d = p2[0]; + p1[0] = c; + p2[0] = d; + } +} + +void lookupSourceDone() { b[0]; } + +void update_sources() { + if (e) { + C f; + sort(f, b); + } +} +/* Note that we miss one devirtualization because we are not able to track the + vtbl store in destructor. + Previously we devirtualized to C::m_fn1 instead of B::m_fn1. */ +/* { dg-final { scan-ipa-dump-times "Discovered a virtual call to a known target" 1 "cp" } } */ +/* { dg-final { cleanup-ipa-dump "cp" } } */ |