This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug fortran/61281] Memory corruption on assigning a polymorphic variable to a non-polymorphic one


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);
...


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]