https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64397
janus at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- Summary|[OOP] Runtime segfault with |[OOP] Runtime segfault with |type-bound assignment and |parenthesis expression |parenthesis |passed to polymorphic dummy | |argument --- Comment #4 from janus at gcc dot gnu.org --- As shown by -fdump-tree-original, the first call to 'ass' is translated to: { struct __class_main_My_integer_t class.11; class.11._vptr = (struct __vtype_main_My_integer * {ref-all}) &__vtab_main_My_integer; class.11._data = (struct my_integer *) &a; ass (&class.11); } The second call, however, is translated to: { void * restrict D.3514; integer(kind=8) D.3513; integer(kind=8) D.3512; integer(kind=8) D.3511; struct __class_main_My_integer_t D.3510; struct my_integer D.3509; struct __class_main_My_integer_t class.13; class.13._vptr = (struct __vtype_main_My_integer * {ref-all}) &__vtab_main_My_integer; D.3509 = a; class.13._data = (struct my_integer *) &D.3509; D.3510 = class.13; ass (&class.13); if ((void *) D.3510.x.data != 0B) { D.3511 = (D.3510.x.dim[0].ubound - D.3510.x.dim[0].lbound) + 1; D.3512 = NON_LVALUE_EXPR <D.3511>; D.3513 = D.3512 * 4; D.3514 = (void * restrict) __builtin_malloc (MAX_EXPR <(unsigned long) D.3513, 1>); class.13.x.data = D.3514; __builtin_memcpy ((real(kind=4)[0:] * restrict) class.13.x.data, (real(kind=4)[0:] * restrict) D.3510.x.data, (unsigned long) (D.3512 * 4)); } else { class.13.x.data = 0B; } if (class.13._data->x.data != 0B) { __builtin_free ((void *) class.13._data->x.data); } class.13._data->x.data = 0B; } While nothing is done after the call itself in the first case, quite a bit of cleanup-code is added in the second case (which is also seen in comment 2.