http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55677



vlukas at gmx dot de changed:



           What    |Removed                     |Added

----------------------------------------------------------------------------

                 CC|                            |vlukas at gmx dot de



--- Comment #5 from vlukas at gmx dot de 2012-12-14 18:52:14 UTC ---

I can reproduce the crash.

I believe this can be reduced to an illegal conversion to a virtual base:

If you do not pass "this" as an argument to "new class2" in the "derived"

default constructor and instead pass the address of a fully constructed

"derived" object, the program does not crash. I will post an attachment, which

is a modification the original submitters attachment from today.



On the other hand the following program crashes, which is a further reduction

of the submitters testcase:

------------------------------------------------------------------------------

struct base

{

  base(int = 0) { }

};



struct middle : public virtual base

{

  middle() { }

};



struct class2

{

  class2(middle *var)

  {

    base* p = var;

  }



};



struct derived : public middle

{

  derived() : base((class2(this), 0)) { }

};



int main()

{    

  new derived;

}

------------------------------------------------------------------------------



I believe this violates 12.7 " Construction and destruction", paragraph 3,

because when initializing the "base" subobject of the "derived" object, the

construction of "middle" has not yet started.



FYI, a backtrace of the submitters original testcase and mine look similar.

------------------------ original: -------------------------------------------

#0  0x00000000004022f1 in class2::class2 (this=0x607010, var=0x7fffffffd950) at

orig_one_file.cc:82

#1  0x0000000000402494 in derived::derived (this=0x7fffffffd950,

__in_chrg=<optimized out>, 

    __vtt_parm=<optimized out>) at orig_one_file.cc:104

#2  0x0000000000401cac in main () at orig_one_file.cc:118

------------------------------------------------------------------------------



----------------------- mine: ------------------------------------------------

#0  0x00000000004008e9 in class2::class2 (this=0x7fffffffd957, var=0x602010) at

main_reduced.cc:15

#1  0x0000000000400946 in derived::derived (this=0x602010, __in_chrg=<optimized

out>, 

    __vtt_parm=<optimized out>) at main_reduced.cc:22

#2  0x0000000000400825 in main () at main_reduced.cc:27

------------------------------------------------------------------------------

(Note: The backtrace corresponds to the much reduced snippet above, not to the

code I will attach.)



I hope my reasoning goes in the right direction, but I leave final judgement

whether my reduced testcase reproduces the orignal problem and whether the code

is in fact illegal to the GCC maintainers and to the submitter.

Reply via email to