------- 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