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