A recent gfortran ICEs on the following code: character(LEN=12) :: b="123456789012" character(LEN=12) :: a="123456789012" FORALL(I=3:10) a(I:I+2)=a(I-2:I) IF (a.NE."121234567890") CALL ABORT() END
Reduced testcase: character(len=1) :: a="1" forall(i=1:1) a(i:i) = a(i:i) end Adding Roger Sayle in the CC list, since you're our FORALL expert :) Program received signal SIGSEGV, Segmentation fault. integer_onep (expr=0x0) at /utmp/coudert/gfortran/trunk/gcc/tree.c:1311 1311 STRIP_NOPS (expr); (gdb) where #0 integer_onep (expr=0x0) at /utmp/coudert/gfortran/trunk/gcc/tree.c:1311 #1 0x0000000000493a5e in allocate_temp_for_forall_nest_1 (type=0x2a984c7b40, size=0x2a984c68a0, block=0x7fbfffec60, ptemp1=0x7fbfffe8b8) at /utmp/coudert/gfortran/trunk/gcc/fortran/trans-stmt.c:2076 #2 0x0000000000494d84 in gfc_trans_assign_need_temp (expr1=0xe02610, expr2=0xe029a0, wheremask=0x0, invert=0 '\0', nested_forall_info=0xdcec70, block=0x7fbfffec60) at /utmp/coudert/gfortran/trunk/gcc/fortran/trans-stmt.c:2181 #3 0x00000000004986c5 in gfc_trans_forall_1 (code=0xe02e30, nested_forall_info=0x0) at /utmp/coudert/gfortran/trunk/gcc/fortran/trans-stmt.c:2629 #4 0x00000000004665c7 in gfc_trans_code (code=0xe02e30) at /utmp/coudert/gfortran/trunk/gcc/fortran/trans.c:553 #5 0x0000000000479e96 in gfc_generate_function_code (ns=0xdf9060) at /utmp/coudert/gfortran/trunk/gcc/fortran/trans-decl.c:3217
Roger once mentioned that he's not receiving messages sent to his gcc account. I'm CCing his personal one in case this is still true.
Another of the kind string vs. array of character. This works without hitch: character :: a(1) = (/ "1" /) forall(i=1:1) a(i:i) = a(i:i) end
Subject: Bug number PR31217 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/2007-10/msg01043.html
Subject: Bug 31217 Author: burnus Date: Mon Oct 29 14:13:44 2007 New Revision: 129720 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=129720 Log: 2007-10-29 Paul Thomas <pault@gcc.gnu.org> PR fortran/31217 PR fortran/33811 PR fortran/33686 * trans-array.c (gfc_conv_loop_setup): Send a complete type to gfc_trans_create_temp_array if the temporary is character. * trans-stmt.c (gfc_trans_assign_need_temp): Do likewise for allocate_temp_for_forall_nest. (forall_replace): New function. (forall_replace_symtree): New function. (forall_restore): New function. (forall_restore_symtree): New function. (forall_make_variable_temp): New function. (check_forall_dependencies): New function. (cleanup_forall_symtrees): New function. gfc_trans_forall_1): Add and initialize pre and post blocks. Call check_forall_dependencies to check for all dependencies and either trigger second forall block to copy temporary or copy lval, outside the forall construct and replace all dependent references. After assignment clean-up and coalesce the blocks at the end of the function. * gfortran.h : Add prototypes for gfc_traverse_expr and find_forall_index. expr.c (gfc_traverse_expr): New function to traverse expression and visit all subexpressions, under control of a logical flag, a symbol and an integer pointer. The slave function is caller defined and is only called on EXPR_VARIABLE. (expr_set_symbols_referenced): Called by above to set symbols referenced. (gfc_expr_set_symbols_referenced): Rework of this function to use two new functions above. * resolve.c (find_forall_index): Rework with gfc_traverse_expr, using forall_index. (forall_index): New function used by previous. * dependency.c (gfc_check_dependency): Use gfc_dep_resolver for all references, not just REF_ARRAY. (gfc_dep_resolver): Correct the logic for substrings so that overlapping arrays are handled correctly. 2007-10-29 Paul Thomas <pault@gcc.gnu.org> PR fortran/31217 PR fortran/33811 * gfortran.dg/forall_12.f90: New test. PR fortran/33686 * gfortran.dg/forall_13.f90: New test. Added: trunk/gcc/testsuite/gfortran.dg/forall_12.f90 trunk/gcc/testsuite/gfortran.dg/forall_13.f90 Modified: trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/dependency.c trunk/gcc/fortran/expr.c trunk/gcc/fortran/gfortran.h trunk/gcc/fortran/resolve.c trunk/gcc/fortran/trans-array.c trunk/gcc/fortran/trans-stmt.c trunk/gcc/testsuite/ChangeLog
FIXED on the trunk (GCC 4.3.0).
*** Bug 34633 has been marked as a duplicate of this bug. ***