------- Comment #8 from burnus at gcc dot gnu dot org 2007-02-15 09:45 -------
The link to c.l.fortran is:
http://groups.google.com/group/comp.lang.fortran/browse_thread/thread/23aa68ecce460e50
Richard Main: "The pointer assignment is ok. I [...] don't have
time to adequately peruse the rest of the code. [...]
I do note that you've got generics that have specifics of the same name
as the generic. The standard does allow that, but it wouldn't shock me
if some compilers get as confused by it as I do."
Both the initial and the reduced program compile and run (seemingly) correctly
with NAG f95 5.1, ifort 9.1 and 10, and sunf95 8.3.
I played around with my reduced testcase (attachment 13050). The crash only
occurs with:
type mesh
integer,allocatable :: area(:)
end type mesh
if I replace it by "pointer :: area(:)" it does not crash. The extra lines in
msh_ and get_scalar_field_msh are:
__result_msh_->area.data = 0B;
and
__result_get_scalar_field_msh->area.data = 0B;
Actually, the program does not crash if one replaces the third line of:
function msh_(fld)
type(mesh), pointer :: msh_
type(field), intent(in) :: fld
msh_ => fld%msh
end function msh_
by
type(field), TARGET, intent(in) :: fld
I have still to re-read the test case to check whether TARGET is required by
the standard in this case or not. Adding "target" to msh_ is however not enough
to prevent the original test case (attachment 13049) from crashing in
get_scalar_field_msh; here the dump-tree-original looks like:
struct mesh * __result_get_scalar_field_msh;
__result_get_scalar_field_msh->area.data = 0B;
__result_get_scalar_field_msh->dist.data = 0B;
__result_get_scalar_field_msh->interp.data = 0B;
I don't know whether something happens behind the scenes, but accessing a
component of a (non-allocated and non-associated) pointer sounds bad.
Especially, even if it worked, setting them to values and then overwriting them
by
__result_get_scalar_field_msh = msh_ (&fld->base);
seems to be strange.
I therefore think there are two bugs:
a) In the program a TARGET is missing
b) In gfortran one should not initialize array components of pointers before
the pointer is allocated (if it is associated it is not needed). If the
gfortran bug is fixed, (a) is probably not needed to prevent the crash.
(Next step: check whether the standard mandates TARGET and where the bug in
gfortran is located, must be somewhere in trans-*.c.)
--
burnus at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |burnus at gcc dot gnu dot
| |org
Status|UNCONFIRMED |NEW
Ever Confirmed|0 |1
GCC build triplet|i686-pc-linux-gnu |
GCC host triplet|i686-pc-linux-gnu |
GCC target triplet|i686-pc-linux-gnu |
Keywords| |wrong-code
Last reconfirmed|0000-00-00 00:00:00 |2007-02-15 09:45:54
date| |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30793