Bug 31217 - ICE using FORALL on character substrings
Summary: ICE using FORALL on character substrings
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: fortran (show other bugs)
Version: 4.3.0
: P3 normal
Target Milestone: 4.3.0
Assignee: Paul Thomas
URL:
Keywords: ice-on-valid-code
: 34633 (view as bug list)
Depends on:
Blocks: 19276 32834 33811
  Show dependency treegraph
 
Reported: 2007-03-16 11:44 UTC by Joost VandeVondele
Modified: 2008-01-01 01:26 UTC (History)
6 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail: 4.1.3 4.2.0 4.3.0
Last reconfirmed: 2007-10-18 12:03:51


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Joost VandeVondele 2007-03-16 11:44:48 UTC
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
Comment 1 Francois-Xavier Coudert 2007-03-16 15:32:12 UTC
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
Comment 2 Martin Michlmayr 2007-03-16 18:43:40 UTC
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.
Comment 3 Daniel Franke 2007-07-22 17:16:00 UTC
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
Comment 4 patchapp@dberlin.org 2007-10-20 04:21:27 UTC
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
Comment 5 Tobias Burnus 2007-10-29 14:14:06 UTC
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

Comment 6 Tobias Burnus 2007-10-29 14:14:30 UTC
FIXED on the trunk (GCC 4.3.0).
Comment 7 Andrew Pinski 2008-01-01 01:25:31 UTC
*** Bug 34633 has been marked as a duplicate of this bug. ***