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

--- Comment #8 from Bernd Edlinger <bernd.edlinger at hotmail dot de> ---
(In reply to janus from comment #5)
> (In reply to Bernd Edlinger from comment #3)
> > > The function "make_real" is not invoked directly, but through the 
> > > type-bound
> > > "a%real", which is called three times in the test case. Does the failure
> > > occur already at the first one (i.e. line 67)? Can you give a reduced test
> > > case?
> > 
> > Yes it is in line 67.
> 
> Ok, then I guess the following reduction should be enough to trigger the bug?
> 
> 
> module m
> 
>   type :: t1
>     integer :: i = 42
>   contains
>     procedure, pass :: real => make_real
>   end type
> 
> contains
> 
>   real function make_real (arg)
>     class(t1), intent(in) :: arg
>     make_real = real (arg%i)
>   end function make_real
> 
> end module m
> 
>   use m
>   class(t1), pointer :: a
>   type(t1), target :: b
>   a => b
>   if (a%real() .ne. real (42)) call abort
> end
> 
> 

The crash occurs if I add the line "procedure(make_real), pointer :: ptr"
to type t1.

> Additionally you could try if calling 'make_real' directly (without the
> type-binding) works, i.e. replace the last line by:
> 
>   if (make_real(a) .ne. real (42)) call abort
> 
> 

This line does not abort.


> > > The type-bound call is transformed into a procedure-pointer-component
> > > call, i.e. "a._vptr->real (&a)". Do all the proc_ptr_comp_* test cases 
> > > work
> > > on ARMv7?
> > 
> > Yes, the test cases that failed with the last snapshot are:
> > 
> > FAIL: gfortran.dg/dynamic_dispatch_1.f03  -O0  execution test
> > FAIL: gfortran.dg/dynamic_dispatch_3.f03  -O0  execution test
> > FAIL: gfortran.dg/select_type_4.f90  -O2  execution test
> 
> This one might possibly be related. It also involves polymorphism (but no
> type-bound procedures).

I think dynamic_dispatch_3.f03 duplicates this one.
But I am not sure about select_type_4.f90:

$ gfortran -O1 -g select_type_4.f90 -o select_type_4
$ ./select_type_4 
   1.23000002    
          42
 Node with no data.
 Some other node type.
   4.55999994    

$ gfortran -O2 -g select_type_4.f90 -o select_type_4
$ ./select_type_4
    1.23000002    
          42

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
Segmentation fault

Program received signal SIGSEGV, Segmentation fault.
MAIN__ () at select_type_4.f90:166
166            if (cnt /= 4) call abort()

but this statement is executed for the third time when the chash happens:

Breakpoint 2, MAIN__ () at select_type_4.f90:166
166            if (cnt /= 4) call abort()
2: /x $r2 = 0x8db4
1: x/i $pc
=> 0x8b14 <MAIN__+608>:    ldr    r3, [r2]
(gdb) c
Continuing.
   1.23000002    

Breakpoint 2, MAIN__ () at select_type_4.f90:166
166            if (cnt /= 4) call abort()
2: /x $r2 = 0x8dcc
1: x/i $pc
=> 0x8b14 <MAIN__+608>:    ldr    r3, [r2]
(gdb) c
Continuing.
          42

Breakpoint 2, MAIN__ () at select_type_4.f90:166
166            if (cnt /= 4) call abort()
2: /x $r2 = 0xf15aea17
1: x/i $pc
=> 0x8b14 <MAIN__+608>:    ldr    r3, [r2]

this looks like some loop optimization problem.

Reply via email to