Compiling tonto-2.2 reveals that structure components cannot be used in array constructors: subroutine complex_constructor type BASIS_TYPE character(len=512) :: label end type type(BASIS_TYPE), dimension(:), pointer :: var call read_library_data_((/var%label/)) end subroutine complex_constructor emits.. complex_constructor.f90: In function ‘complex_constructor’: complex_constructor.f90:1: fatal error: gfc_todo: Not Implemented: complex character array constructors compilation terminated. I am on to it.... Paul
Confirmed.
The fix turns out to be almost insulting: One type and one unnecessary gfc_todo (not the original one, by the way!) Index: gcc/fortran/trans-array.c =================================================================== *** gcc/fortran/trans-array.c (revision 112981) --- gcc/fortran/trans-array.c (working copy) *************** gfc_trans_array_constructor_subarray (st *** 1035,1043 **** gfc_copy_loopinfo_to_se (&se, &loop); se.ss = ss; - if (expr->ts.type == BT_CHARACTER) - gfc_todo_error ("character arrays in constructors"); - gfc_trans_array_ctor_element (&body, desc, *poffset, &se, expr); gcc_assert (se.ss == gfc_ss_terminator); --- 1035,1040 ---- *************** get_array_ctor_var_strlen (gfc_expr * ex *** 1311,1317 **** /* Array references don't change the string length. */ break; ! case COMPONENT_REF: /* Use the length of the component. */ ts = &ref->u.c.component->ts; break; --- 1308,1314 ---- /* Array references don't change the string length. */ break; ! case REF_COMPONENT: /* Use the length of the component. */ ts = &ref->u.c.component->ts; break; I will try to compile tonto-2.2 before submitting Paul
Subject: Bug number PR27113 A patch for this bug has been added to the patch tracker. The mailing list url for the patch is http://gcc.gnu.org/ml/gcc-patches/2006-04/msg00681.html
Subject: Bug 27113 Author: pault Date: Fri Apr 21 05:10:22 2006 New Revision: 113133 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=113133 Log: 2006-04-21 Paul Thomas <pault@gcc.gnu.org> PR fortran/27122 * resolve.c (resolve_function): Remove general restriction on auto character length function interfaces. (gfc_resolve_uops): Check restrictions on defined operator procedures. (resolve_types): Call the check for defined operators. PR fortran/27113 * trans-array.c (gfc_trans_array_constructor_subarray): Remove redundant gfc_todo_error. (get_array_ctor_var_strlen): Remove typo in enum. 2006-04-21 Paul Thomas <pault@gcc.gnu.org> PR fortran/27122 * gfortran.dg/defined_operators_1.f90: New test. * gfortran.dg/assumed_charlen_function_1.f90: Add new error and remove old ones associated, incorrectly, with Note 5.46. PR fortran/27113 * gfortran.dg/character_array_constructor_1.f90: New test. Added: trunk/gcc/testsuite/gfortran.dg/character_array_constructor_1.f90 trunk/gcc/testsuite/gfortran.dg/defined_operators_1.f90 Modified: trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/resolve.c trunk/gcc/fortran/trans-array.c trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/gfortran.dg/assumed_charlen_function_1.f90
trunk and 4.1 have diverged too far, especially in characters, for the fix to work on 4.1. I started trying to make up the difference but it is just too much to be worthwhile. I am marking this as fixed on trunk. Paul
Subject: Bug 27113 Author: pault Date: Sun Apr 23 05:33:16 2006 New Revision: 113191 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=113191 Log: 2006-04-23 Paul Thomas <pault@gcc.gnu.org> PR fortran/27122 * resolve.c (resolve_function): Remove general restriction on auto character length function interfaces. (gfc_resolve_uops): Check restrictions on defined operator procedures. (resolve_types): Call the check for defined operators. PR fortran/27113 * trans-array.c (get_array_ctor_var_strlen): Remove typo in enum. Part of the fix in 4.2, which does not work in 4.1 because the divergence is now too great. PR fortran/26822 * intrinsic.c (add_functions): Mark LOGICAL as elemental. PR fortran/26787 * expr.c (gfc_check_assign): Extend scope of error to include assignments to a procedure in the main program or, from a module or internal procedure that is not that represented by the lhs symbol. Use VARIABLE rather than l-value in message. PR fortran/25597 * trans-decl.c (gfc_trans_deferred_vars): Check if an array result, is also automatic character length. If so, process the character length. Note that this fixes the bug in 4.2 but not here in 4.1 because the trees have diverged too much. Manifestly correct, so applied anyway. PR fortran/18803 PR fortran/25669 PR fortran/26834 * trans_intrinsic.c (gfc_walk_intrinsic_bound): Set data.info.dimen for bound intrinsics. * trans_array.c (gfc_conv_ss_startstride): Pick out LBOUND and UBOUND intrinsics and supply their shape information to the ss and the loop. PR fortran/27124 * trans_expr.c (gfc_trans_function_call): Add a new block, post, in to which all the argument post blocks are put. Add this block to se->pre after a byref call or to se->post, otherwise. 2006-04-23 Paul Thomas <pault@gcc.gnu.org> PR fortran/27122 * gfortran.dg/defined_operators_1.f90: New test. * gfortran.dg/assumed_charlen_function_1.f90: Add new error and remove old ones associated, incorrectly, with Note 5.46. PR fortran/26787 * gfortran.dg/proc_assign_1.f90: New test. * gfortran.dg/procedure_lvalue.f90: Change message. * gfortran.dg/namelist_4.f90: Add new error. PR fortran/27089 * gfortran.dg/specification_type_resolution_1.f90 PR fortran/18803 PR fortran/25669 PR fortran/26834 * gfortran.dg/bounds_temporaries_1.f90: New test. PR fortran/27124 * gfortran.dg/array_return_value_1.f90: New test. Added: branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/array_return_value_1.f90 branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/bounds_temporaries_1.f90 branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/defined_operators_1.f90 branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/proc_assign_1.f90 branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/specification_type_resolution_1.f90 Modified: branches/gcc-4_1-branch/gcc/fortran/ChangeLog branches/gcc-4_1-branch/gcc/fortran/expr.c branches/gcc-4_1-branch/gcc/fortran/intrinsic.c branches/gcc-4_1-branch/gcc/fortran/resolve.c branches/gcc-4_1-branch/gcc/fortran/trans-array.c branches/gcc-4_1-branch/gcc/fortran/trans-decl.c branches/gcc-4_1-branch/gcc/fortran/trans-expr.c branches/gcc-4_1-branch/gcc/fortran/trans-intrinsic.c branches/gcc-4_1-branch/gcc/testsuite/ChangeLog branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/assumed_charlen_function_1.f90 branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/namelist_4.f90 branches/gcc-4_1-branch/gcc/testsuite/gfortran.dg/procedure_lvalue.f90