This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/29820] ICE in fold_convert, at fold-const.c:2146
- From: "rguenth at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 14 Nov 2006 09:50:20 -0000
- Subject: [Bug fortran/29820] ICE in fold_convert, at fold-const.c:2146
- References: <bug-29820-6318@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #4 from rguenth at gcc dot gnu dot org 2006-11-14 09:50 -------
I'm confused that for
type geodetic
real :: h
end type geodetic
gfortran is using a record type but still goes the scalar assignment path.
With
gfc_trans_scalar_assign changed to read
gcc_assert (!AGGREGATE_TYPE_P (TREE_TYPE (lse->expr))
|| TREE_TYPE (lse->expr) == TREE_TYPE (rse->expr));
gfc_add_modify_expr (&block, lse->expr,
!AGGREGATE_TYPE_P (TREE_TYPE (lse->expr))
? fold_convert (TREE_TYPE (lse->expr), rse->expr)
: rse->expr);
we can see that we don't have the required type-unification for geodetic:
(gdb) call debug_tree (lse->expr)
<indirect_ref 0x2b0877c769c0
type <record_type 0x2b0877d4ea50 geodetic SF
size <integer_cst 0x2b0877c6cba0 constant invariant 32>
unit size <integer_cst 0x2b0877c6c6c0 constant invariant 4>
align 32 symtab 0 alias set -1
fields <field_decl 0x2b0877d4ce40 h type <real_type 0x2b0877c87210
real4>
SF file t.f90 line 9 size <integer_cst 0x2b0877c6cba0 32> unit size
<integer_cst 0x2b0877c6c6c0 4>
align 32 offset_align 128
offset <integer_cst 0x2b0877c6c6f0 constant invariant 0>
bit offset <integer_cst 0x2b0877c842d0 constant invariant 0>
context <record_type 0x2b0877d4ea50 geodetic>>
reference_to_this <reference_type 0x2b0877d4eb00> chain <type_decl
0x2b0877c91680 D.1330>>
(gdb) call debug_tree (rse->expr)
<array_ref 0x2b0877d55180
type <record_type 0x2b0877d4ec60 geodetic SF
size <integer_cst 0x2b0877c6cba0 constant invariant 32>
unit size <integer_cst 0x2b0877c6c6c0 constant invariant 4>
align 32 symtab 0 alias set -1
fields <field_decl 0x2b0877d4cf00 h type <real_type 0x2b0877c87210
real4>
SF file t.f90 line 9 size <integer_cst 0x2b0877c6cba0 32> unit size
<integer_cst 0x2b0877c6c6c0 4>
align 32 offset_align 128
offset <integer_cst 0x2b0877c6c6f0 constant invariant 0>
bit offset <integer_cst 0x2b0877c842d0 constant invariant 0>
context <record_type 0x2b0877d4ec60 geodetic>>
pointer_to_this <pointer_type 0x2b0877d4edc0> chain <type_decl
0x2b0877c91750 D.1335>>
(while this should be the same type, one is record_type 0x2b0877d4ec60 and
the other is record_type 0x2b0877d4ea50, which is causing this bug)
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29820