This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/41753] New: OOP - segfault with -O2 using methods as actual arguments
- From: "pault at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 19 Oct 2009 10:19:36 -0000
- Subject: [Bug fortran/41753] New: OOP - segfault with -O2 using methods as actual arguments
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
The following produces a segfault at runtime with -O2 and higher
module m
type t
real x
contains
procedure, pass :: a
end type
contains
real function a (arg)
class (t) :: arg
a = arg%x
end function
real function b (arg)
real :: arg
b = arg*2
end function
subroutine s
class(t), allocatable :: z
allocate(z) ! see tree-optimized output
z%x = 42 ! see tree-optimized output
print *, b (z%a()) ! see tree-optimized output
end subroutine
end module
use m
call s
end
With -O0, the marked lines give
<bb 2>:
D.1348_1 = malloc (4);
if (D.1348_1 == 0B)
goto <bb 3>;
else
goto <bb 4>;
<bb 3>:
_gfortran_os_error (&"Out of memory"[1]{lb: 1 sz: 1});
<bb 4>:
D.1374_2 = (struct t *) D.1348_1;
z.$data = D.1374_2;
z.$vindex = 2800126;
z.$size = 4;
D.1375_3 = z.$data;
D.1375_3->x = 4.2e+1;
dt_parm.0.common.filename = &"test.f03"[1]{lb: 1 sz: 1};
dt_parm.0.common.line = 22;
dt_parm.0.common.flags = 128;
dt_parm.0.common.unit = 6;
_gfortran_st_write (&dt_parm.0);
D.1376_4 = __m_MOD_a (&z);
D.1350 = D.1376_4;
D.1377_5 = __m_MOD_b (&D.1350);
D.1351 = D.1377_5;
_gfortran_transfer_real (&dt_parm.0, &D.1351, 4);
_gfortran_st_write_done (&dt_parm.0);
whilst with -O2
<bb 2>:
D.1348_1 = malloc (4);
if (D.1348_1 == 0B)
goto <bb 3>;
else
goto <bb 4>;
<bb 3>:
_gfortran_os_error (&"Out of memory"[1]{lb: 1 sz: 1});
<bb 4>:
D.1374_2 = (struct t *) D.1348_1;
dt_parm.0.common.filename = &"test.f03"[1]{lb: 1 sz: 1};
dt_parm.0.common.line = 22;
dt_parm.0.common.flags = 128;
dt_parm.0.common.unit = 6;
_gfortran_st_write (&dt_parm.0);
arg_21 = (struct .class.t & restrict) &z;
D.1389_22 = arg_21->$data;
D.1386_23 = D.1389_22->x;
D.1392_26 = D.1386_23 * 2.0e+0;
D.1351 = D.1392_26;
_gfortran_transfer_real (&dt_parm.0, &D.1351, 4);
_gfortran_st_write_done (&dt_parm.0);
ie. the important part of the allocation and the entire assignment disappear!
Since the PRINT then tries to access the data component of the CLASS object,
the segfault results
--
Summary: OOP - segfault with -O2 using methods as actual
arguments
Product: gcc
Version: 4.5.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: pault at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41753