ICF is more strict about non-common function and var
[official-gcc.git] / gcc / testsuite / g++.dg / ipa / devirt-21.C
blob99f60afe33c561d3e9850175900273974a87dd49
1 /* { dg-do run } */
2 /* { dg-options "-O3 -fno-early-inlining -fno-ipa-sra -fdump-ipa-cp"  } */
3 /* Main purpose is to verify that we do not produce wrong devirtualization to
4    C::m_fn1.  We currently devirtualize to B::m_fn1, so check that. */
5 #include <stdlib.h>
6 class A {
7 public:
8   unsigned length;
9 };
10 class B {};
11 class MultiTermDocs : public virtual B {
12 protected:
13   A readerTermDocs;
14   A subReaders;
15   virtual B *m_fn1(int *) {}
16   virtual inline  ~MultiTermDocs();
17   void wrap(void)
18   {
19   m_fn1(NULL);
20   }
22 class C : MultiTermDocs {
23   B *m_fn1(int *);
25 MultiTermDocs::~MultiTermDocs() {
26   wrap ();
27   if (&readerTermDocs) {
28     B *a;
29     for (unsigned i = 0; i < subReaders.length; i++)
30       (a != 0);
31   }
34 B *C::m_fn1(int *) { abort (); }
36 main()
38   class C c;
40 /* { dg-final { scan-ipa-dump "Discovered a virtual call to" "cp" } } */
41 /* { dg-final { cleanup-ipa-dump "cp" } } */