Hi,
this is variant of testcase that produces wrong code on Mainline.

$ ./xgcc -B ./ -O3 ~/t.C -S -fno-partial-inlining -fno-early-inlining 
-fdump-ipa-all ; g++ t.s; ./a.out
Aborted

The bug is that we determine wrong type on call of ~MultiTermDocs within ~C (it
is determined as C, while it really should be C in construction).
Quite amusingly gcc-4.8 also determine the wrong type but does devirtualize 
correctly.  Martin,
any idea why?


#include <stdlib.h>
class A {                                                                       
                                                                                
                                
public:                                                                         
                                                                                
                                
  unsigned length;                                                              
                                                                                
                                
};                                                                              
                                                                                
                                
class B {};                                                                     
                                                                                
                                
class MultiTermDocs : public virtual B {                                        
                                                                                
                                
protected:                                                                      
                                                                                
                                
  A readerTermDocs;                                                             
                                                                                
                                
  A subReaders;                                                                 
                                                                                
                                
  virtual B *m_fn1(int *) {}                                                    
                                                                                
                                 
  inline virtual ~MultiTermDocs();                                              
                                                                                
                                       
  void wrap(void)
  {
  m_fn1(NULL);
  }
};                                                                              
                                                                                
                                
class C : MultiTermDocs {                                                       
                                                                                
                                
  B *m_fn1(int *);                                                              
                                                                                
                                
};                                                                              
                                                                                
                                
MultiTermDocs::~MultiTermDocs() {                                               
                                                                                
                                
  wrap ();
  if (&readerTermDocs) {                                                        
                                                                                
                                
    B *a;                                                                       
                                                                                
                                
    for (unsigned i = 0; i < subReaders.length; i++)                            
                                                                                
                                
      (a != 0);                                                                 
                                                                                
                                
  }                                                                             
                                                                                
                                
}                                                                               
                                                                                
                                
                                                                                
                                                                                
                                
B *C::m_fn1(int *) { abort (); }                                                
                                                                                
                                
                                                                                
                                                                                
                                
main()
{
  class C c;
}

Reply via email to