https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66907

kargl at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kargl at gcc dot gnu.org

--- Comment #1 from kargl at gcc dot gnu.org ---
(In reply to mrestelli from comment #0)
> The attached code compiles with gfortran and produces an error at
> runtime. As far as I can see, the code is correct. Unfortunately, I
> have been unable to reduce the test further; if I try, the problem
> disappears.
> 
> 
> $ gfortran gft.f90 -g -O0 -o gft
> $ ./gft 
> 
> Program received signal SIGSEGV: Segmentation fault - invalid memory
> reference.
> 
> Backtrace for this error:
> #0  0x7F281A1F6757
> #1  0x7F281A1F6D5E
> #2  0x7F281972EE8F
> #3  0x400A15 in __mod_a_MOD_mult at gft.f90:67
> #4  0x400F44 in __mod_a_MOD_check_t_b at gft.f90:38 (discriminator 2)
> #5  0x401160 in test at gft.f90:84 (discriminator 2)
> Speicherzugriffsfehler
> 
> $ gfortran --version
> GNU Fortran (GCC) 6.0.0 20150715 (experimental)
> Copyright (C) 2015 Free Software Foundation, Inc.
> 
> 
> The correct behaviour should be
> 
> $ ./gft 
>  p(1):            1
>  p(2):            1
> 

Program appears to function correctly if one uses -O or -O2.
% gfc6 -o z -O er.f90
% ./z
 p(1):            1
 p(2):            1


without optimization one gets
(gdb) run
Starting program: /mnt/sgk/tmp/z 

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400cb5 in mod_a::mult (p1=..., p2=...) at er.f90:57
57        p1_dat = p1%dat(1)

It also works without optimization if one uses a temp variable
in check_t_b().
 pure recursive function check_t_b(d) result(b)
  integer, intent(in) :: d
  type(t_b) :: b(2)

  type(t_b) :: xd, tmp

   xd = 1.0

   if(d.eq.1) then
     b = 1.0
   else
     tmp = xd**0
     b = tmp*check_t_b(1)
   endif

Reply via email to