http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50496
--- Comment #4 from Markus Trippelsdorf <markus at trippelsdorf dot de> 2011-09-24 18:23:15 UTC --- I've found a new testcase that results in the same ICE: % < test.cpp class GCAlloc { }; class BaseAlloc { }; class String; class Base { public: virtual void destroy( String *str ) const =0; }; class String: public GCAlloc { const Base *m_class; public: enum constants { }; String( const char *data ); ~String() { m_class->destroy( this ); } void copy( const String &other ); String & operator=( const char *other ) { copy( String( other ) ); } }; class ListElement: public BaseAlloc { }; class List: public BaseAlloc { ListElement *m_head; void (*m_deletor)( void *); public: List(): m_deletor(0) { } const void *back() const { } bool empty() const { return m_head == 0; } void popBack(); }; class FalconData: public BaseAlloc { public: virtual ~FalconData() { } }; class Stream: public FalconData { }; class SrcLexer: public BaseAlloc { List m_streams; String m_whiteLead; void reset(); }; void SrcLexer::reset() { m_whiteLead = ""; while( ! m_streams.empty() ) { Stream *s = (Stream *) m_streams.back(); m_streams.popBack(); if ( !m_streams.empty() ) delete s; } } % g++ -O2 test.cpp test.ii: In member function ‘void SrcLexer::reset()’: test.ii:59:1: internal compiler error: in redirect_jump, at jump.c:1497