https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61281
Dominique d'Humieres <dominiq at lps dot ens.fr> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |burnus at gcc dot gnu.org, | |janus at gcc dot gnu.org --- Comment #4 from Dominique d'Humieres <dominiq at lps dot ens.fr> --- Valgrind nor -fsanitize=address don't report any error. The "memory corruption" is not limited to character variable and it occurs already in map, i.e., give_raise(nrl%list) does not return 'rob'. The error "Can't convert CLASS(employees) to TYPE(employees) at (1)" may have been removed by r201328. The original dump for type is: map () { nrl.list = give_raise (&nrl.list); } give_raise (struct employees & restrict e) { struct employees __result_give_raise; { struct employees employees.0; (MEM[(c_char * {ref-all})&employees.0] = MEM[(c_char * {ref-all})"rob"];, (void *) &employees.0.name;); __result_give_raise = employees.0; } __result_give_raise = *e; return __result_give_raise; } MAIN__ () { static struct companies nrl = {.list={.name="rob"}}; static struct employees give_raise (struct employees & restrict); static void map (void); and with class it is: __copy_MAIN___Employees (struct employees & restrict src, struct employees & restrict dst) { *dst = *src; } map () { { struct __class_MAIN___Employees_t class.0; class.0._vptr = (struct __vtype_MAIN___Employees * {ref-all}) &__vtab_MAIN___Employees; class.0._data = &nrl.list; nrl.list = give_raise (&class.0); } } give_raise (struct __class_MAIN___Employees_t & restrict e) { struct employees __result_give_raise; { struct employees employees.1; (MEM[(c_char * {ref-all})&employees.1] = MEM[(c_char * {ref-all})"rob"];, (void *) &employees.1.name;); __result_give_raise = employees.1; } __result_give_raise = VIEW_CONVERT_EXPR<struct employees>(*e); return __result_give_raise; } MAIN__ () { static struct __vtype_MAIN___Employees __vtab_MAIN___Employees = {._hash=65382630, ._size=3, ._extends=0B, ._def_init=&__def_init_MAIN___Employees, ._copy=__copy_MAIN___Employees, ._final=0B}; static struct employees __def_init_MAIN___Employees = {.name="rob"}; static struct companies nrl = {.list={.name="rob"}}; static struct employees give_raise (struct __class_MAIN___Employees_t & restrict); static void map (void); static void __copy_MAIN___Employees (struct employees & restrict, struct employees & restrict); ...