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

janus at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2011.05.18 20:06:33
     Ever Confirmed|0                           |1

--- Comment #1 from janus at gcc dot gnu.org 2011-05-18 20:06:33 UTC ---
(In reply to comment #0)
> The FE wrongly resolves the operator, leading to "wrong code" in the sense 
> that
> the linker cannot find the symbol:
> 
> undefined reference to `assign_interface_' 

The dump shows that the assignment "one = two" is incorrectly translated to:

    struct __class_foo_module_Foo class.1;
    struct __class_foo_module_Foo class.0;

    class.0._vptr = (struct __vtype_foo_module_Foo * {ref-all})
&__vtab_bar_module_Bar;
    class.0._data = (struct foo *) &one;
    class.1._vptr = (struct __vtype_foo_module_Foo * {ref-all})
&__vtab_bar_module_Bar;
    class.1._data = (struct foo *) &two;
    assign_interface (&class.0, &class.1);

First we generate two temporaries to convert the TYPE variables to CLASS
arguments, which is fine. However, the last line should be a polymorphic call
like

class.0._vptr->assign (&class.0, &class.1);


Btw, it works when making the first argument polymorphic:

program main
  use bar_module
  implicit none
  class(bar), allocatable :: one
  type(bar) :: two
  allocate(one)
  one%x = 1
  two%x = 2
  one = two
end program

Reply via email to