Bug 19269 - transpose(reshape(...)) of character array segfaults.
Summary: transpose(reshape(...)) of character array segfaults.
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: fortran (show other bugs)
Version: 4.0.0
: P2 normal
Target Milestone: 4.1.0
Assignee: Richard Sandiford
URL:
Keywords: ice-on-valid-code
Depends on: 18960 19271 21825
Blocks: Fortran_character
  Show dependency treegraph
 
Reported: 2005-01-05 16:49 UTC by Thomas Koenig
Modified: 2005-09-13 07:24 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2005-09-08 09:24:04


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Thomas Koenig 2005-01-05 16:49:34 UTC
Probably related to PR 18960, except that two
null pointers are swapped here :-)

$ cat reshape-char.f90
program main
  character(len=1), dimension(2,2) :: a,b
  a = transpose(reshape((/'a', 'b', 'c', 'd'/), shape(a)))
  print *,a
end program main
$ gfortran reshape-char.f90
reshape-char.f90: In function 'MAIN__':
reshape-char.f90:3: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
$ gfortran -v
Using built-in specs.
Configured with: ../gcc-4.0-20050102/configure --prefix=/home/zfkts
--enable-languages=c,c++,f95
Thread model: posix
gcc version 4.0.0 20050102 (experimental)
$ gfortran -dumpmachine
ia64-unknown-linux-gnu
$ gdb ~/libexec/gcc/ia64-unknown-linux-gnu/4.0.0/f951
GNU gdb Red Hat Linux (6.1post-1.20040607.52rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "ia64-redhat-linux-gnu"...Using host libthread_db
library "/lib/tls/libthread_db.so.1".

(gdb) r reshape-char.f90
Starting program: /home/zfkts/libexec/gcc/ia64-unknown-linux-gnu/4.0.0/f951
reshape-char.f90
 MAIN__

Program received signal SIGSEGV, Segmentation fault.
tree_swap_operands_p (arg0=0x0, arg1=0x0, reorder=1 '\001')
    at ../../gcc-4.0-20050102/gcc/fold-const.c:5933
5933      STRIP_SIGN_NOPS (arg1);
(gdb) bt
#0  tree_swap_operands_p (arg0=0x0, arg1=0x0, reorder=1 '\001')
    at ../../gcc-4.0-20050102/gcc/fold-const.c:5933
#1  0x400000000041e690 in fold (expr=0x20000000024cceb0)
    at ../../gcc-4.0-20050102/gcc/fold-const.c:6328
#2  0x40000000000b8460 in gfc_trans_allocate_temp_array (
    loop=0x60000fffffff9350, info=0x60000000000ed3b0, eltype=Variable "eltype"
is not available.
)
    at ../../gcc-4.0-20050102/gcc/fortran/trans-array.c:621
#3  0x40000000000d9150 in gfc_conv_function_call (se=0x60000fffffff91a0,
    sym=0x60000000000ed510, arg=0x60000000000eb5a0)
    at ../../gcc-4.0-20050102/gcc/fortran/trans-expr.c:1091
#4  0x40000000000e2490 in gfc_conv_intrinsic_funcall (se=0x60000fffffff91a0,
    expr=0x60000000000eb330)
    at ../../gcc-4.0-20050102/gcc/fortran/trans-intrinsic.c:1083
#5  0x40000000000e99f0 in gfc_conv_intrinsic_function (se=0x60000fffffff91a0,
    expr=0x60000000000eb330)
    at ../../gcc-4.0-20050102/gcc/fortran/trans-intrinsic.c:3007
#6  0x40000000000d97c0 in gfc_conv_function_expr (se=0x60000fffffff91a0,
    expr=0x60000000000eb330)
    at ../../gcc-4.0-20050102/gcc/fortran/trans-expr.c:1404
#7  0x40000000000da3a0 in gfc_conv_expr (se=0x60000fffffff91a0,
    expr=0x60000000000eb330)
    at ../../gcc-4.0-20050102/gcc/fortran/trans-expr.c:1780
#8  0x40000000000c4e40 in gfc_add_loop_ss_code (loop=0x60000fffffff9350,
---Type <return> to continue, or q <return> to quit---
    ss=0x60000000000ed390, subscript=0 '\0')
    at ../../gcc-4.0-20050102/gcc/fortran/trans-array.c:1232
#9  0x40000000000c57c0 in gfc_conv_loop_setup (loop=0x60000fffffff9350)
    at ../../gcc-4.0-20050102/gcc/fortran/trans-array.c:2563
#10 0x40000000000df810 in gfc_trans_assignment (expr1=0x60000000000ea360,
    expr2=0x60000000000eb330)
    at ../../gcc-4.0-20050102/gcc/fortran/trans-expr.c:2146
#11 0x40000000000dfef0 in gfc_trans_assign (code=Variable "code" is not available.
)
    at ../../gcc-4.0-20050102/gcc/fortran/trans-expr.c:2235
#12 0x40000000000b6310 in gfc_trans_code (code=0x60000000000ec360)
    at ../../gcc-4.0-20050102/gcc/fortran/trans.c:495
#13 0x40000000000d5910 in gfc_generate_function_code (ns=0x60000000000e9b70)
    at ../../gcc-4.0-20050102/gcc/fortran/trans-decl.c:2217
#14 0x40000000000b69b0 in gfc_generate_code (ns=0x60000000000e9b70)
    at ../../gcc-4.0-20050102/gcc/fortran/trans.c:679
#15 0x400000000007a9a0 in gfc_parse_file ()
    at ../../gcc-4.0-20050102/gcc/fortran/parse.c:2628
#16 0x40000000000ae3f0 in gfc_be_parse_file (set_yydebug=-27088)
    at ../../gcc-4.0-20050102/gcc/fortran/f95-lang.c:266
#17 0x400000000063d9e0 in toplev_main (argc=Variable "argc" is not available.
)
    at ../../gcc-4.0-20050102/gcc/toplev.c:992
#18 0x4000000000106e70 in main (argc=2, argv=0x60000fffffff9ab8)
    at ../../gcc-4.0-20050102/gcc/main.c:35
Comment 1 Andrew Pinski 2005-01-05 18:28:07 UTC
Confirmed, related closely to PR 18960.
Comment 2 Andrew Pinski 2005-01-12 02:03:15 UTC
This looks closely related to PR 19271.  PR 19276 is the meta bug for char array problems.
Comment 3 Richard Sandiford 2005-09-06 15:54:38 UTC
There seem to be two problems here.  First, gfc_simplify_reshape
doesn't set the result's typespec correctly (it doesn't include
a character length).  Second, we're passing character lengths
to the transpose library function, which only wants array
descriptors.  I'm testing a patch for the first problem.
Comment 4 GCC Commits 2005-09-07 07:36:28 UTC
Subject: Bug 19269

CVSROOT:	/cvs/gcc
Module name:	gcc
Changes by:	rsandifo@gcc.gnu.org	2005-09-07 07:36:12

Modified files:
	gcc/fortran    : ChangeLog simplify.c 
	gcc/testsuite  : ChangeLog 
Added files:
	gcc/testsuite/gfortran.fortran-torture/execute: pr19269-1.f90 

Log message:
	PR fortran/19269
	* simplify.c (gfc_simplify_transpose): Set the result's typespec from
	the source, not the first element of the return value.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/ChangeLog.diff?cvsroot=gcc&r1=1.536&r2=1.537
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/simplify.c.diff?cvsroot=gcc&r1=1.30&r2=1.31
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.6021&r2=1.6022
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.fortran-torture/execute/pr19269-1.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1

Comment 5 Richard Sandiford 2005-09-07 13:43:33 UTC
It's not clear who's on the hook to the fix the transpose() call.
I'll unassign myself in the meantime.
Comment 6 Richard Sandiford 2005-09-08 09:24:04 UTC
After discussion on fortran@, I'll take a look at the
library thing too.
Comment 7 GCC Commits 2005-09-13 07:15:30 UTC
Subject: Bug 19269

CVSROOT:	/cvs/gcc
Module name:	gcc
Changes by:	rsandifo@gcc.gnu.org	2005-09-13 07:15:02

Modified files:
	gcc/testsuite  : ChangeLog 
	libgfortran    : ChangeLog 
	gcc/fortran    : ChangeLog iresolve.c trans-array.c 
	libgfortran/intrinsics: cshift0.c eoshift0.c eoshift2.c 
	                        pack_generic.c reshape_generic.c 
	                        spread_generic.c transpose_generic.c 
	                        unpack_generic.c 
	libgfortran/m4 : cshift1.m4 eoshift1.m4 eoshift3.m4 
	libgfortran/generated: cshift1_4.c cshift1_8.c eoshift1_4.c 
	                       eoshift1_8.c eoshift3_4.c eoshift3_8.c 
Added files:
	gcc/testsuite/gfortran.dg: char_associated_1.f90 
	                           char_cshift_1.f90 char_cshift_2.f90 
	                           char_eoshift_1.f90 char_eoshift_2.f90 
	                           char_eoshift_3.f90 char_eoshift_4.f90 
	                           char_pack_1.f90 char_pack_2.f90 
	                           char_reshape_1.f90 char_spread_1.f90 
	                           char_transpose_1.f90 
	                           char_unpack_1.f90 char_unpack_2.f90 

Log message:
	gcc/fortran/
	PR target/19269
	* iresolve.c (gfc_resolve_cshift, gfc_resolve_eoshift)
	(gfc_resolve_pack, gfc_resolve_reshape, gfc_resolve_spread)
	(gfc_resolve_transpose, gfc_resolve_unpack): Add "_char" to the name
	for character-based operations.
	(gfc_resolve_pack): Remove ATTRIBUTE_UNUSED from array argument.
	(gfc_resolve_unpack): Copy the whole typespec from the vector.
	* trans-array.c (gfc_conv_expr_descriptor): In the EXPR_FUNCTION
	case, get the string length from the scalarization state.
	
	libgfortran/
	PR target/19269
	* intrinsics/cshift0.c (cshift0): Add an extra size argument.
	(cshift0_1, cshift0_2, cshift0_4, cshift0_8): Replace explicit
	implementations with...
	(DEFINE_CSHIFT): ...this new macro.  Define character versions too.
	* intrinsics/eoshift0.c (zeros): Delete.
	(eoshift0): Add extra size and filler arguments.  Use memset if no
	bound is provided.
	(eoshift0_1, eoshift0_2, eoshift0_4, eoshift0_8): Replace explicit
	implementations with...
	(DEFINE_EOSHIFT): ...this new macro.  Define character versions too.
	* intrinsics/eoshift2.c (zeros): Delete.
	(eoshift2): Add extra size and filler arguments.  Use memset if no
	bound is provided.
	(eoshift2_1, eoshift2_2, eoshift2_4, eoshift2_8): Replace explicit
	implementations with...
	(DEFINE_EOSHIFT): ...this new macro.  Define character versions too.
	* intrinsics/pack.c (pack_internal): New static function, reusing
	the contents of pack and adding an extra size argument.  Change
	"mptr" rather than "m" when calculating the array size.
	(pack): Redefine as a forwarder to pack_internal.
	(pack_s_internal): New static function, reusing the contents of
	pack_s and adding an extra size argument.
	(pack_s): Redefine as a forwarder to pack_s_internal.
	(pack_char, pack_s_char): New functions.
	* intrinsics/reshape.c (reshape_internal): New static function,
	reusing the contents of reshape and adding an extra size argument.
	(reshape): Redefine as a forwarder to reshape_internal.
	(reshape_char): New function.
	* intrinsics/spread.c (spread_internal): New static function,
	reusing the contents of spread and adding an extra size argument.
	(spread): Redefine as a forwarder to spread_internal.
	(spread_char): New function.
	* intrinsics/transpose.c (transpose_internal): New static function,
	reusing the contents of transpose and adding an extra size argument.
	(transpose): Redefine as a forwarder to transpose_internal.
	(transpose_char): New function.
	* intrinsics/unpack.c (unpack_internal): New static function, reusing
	the contents of unpack1 and adding extra size and fsize arguments.
	(unpack1): Redefine as a forwarder to unpack_internal.
	(unpack0): Call unpack_internal instead of unpack1.
	(unpack1_char, unpack0_char): New functions.
	* m4/cshift1.m4 (cshift1): New static function, reusing the contents
	of cshift1_<kind> and adding an extra size argument.
	(cshift1_<kind>): Redefine as a forwarder to cshift1.
	(cshift1_<kind>_char): New function.
	* m4/eoshift1.m4 (zeros): Delete.
	(eoshift1): New static function, reusing the contents of
	eoshift1_<kind> and adding extra size and filler arguments.
	Fix calculation of hstride.  Use memset if no bound is provided.
	(eoshift1_<kind>): Redefine as a forwarder to eoshift1.
	(eoshift1_<kind>_char): New function.
	* m4/eoshift3.m4 (zeros): Delete.
	(eoshift3): New static function, reusing the contents of
	eoshift3_<kind> and adding extra size and filler arguments.
	Use memset if no bound is provided.
	(eoshift3_<kind>): Redefine as a forwarder to eoshift3.
	(eoshift3_<kind>_char): New function.
	* generated/cshift1_4.c, generated/cshift1_8.c,
	* generated/eoshift1_4.c, generated/eoshift1_8.c,
	* generated/eoshift3_4.c, generated/eoshift3_8.c: Regenerate.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.6052&r2=1.6053
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/char_associated_1.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/char_cshift_1.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/char_cshift_2.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/char_eoshift_1.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/char_eoshift_2.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/char_eoshift_3.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/char_eoshift_4.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/char_pack_1.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/char_pack_2.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/char_reshape_1.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/char_spread_1.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/char_transpose_1.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/char_unpack_1.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gfortran.dg/char_unpack_2.f90.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/ChangeLog.diff?cvsroot=gcc&r1=1.302&r2=1.303
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/ChangeLog.diff?cvsroot=gcc&r1=1.550&r2=1.551
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/iresolve.c.diff?cvsroot=gcc&r1=1.38&r2=1.39
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fortran/trans-array.c.diff?cvsroot=gcc&r1=1.60&r2=1.61
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/intrinsics/cshift0.c.diff?cvsroot=gcc&r1=1.13&r2=1.14
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/intrinsics/eoshift0.c.diff?cvsroot=gcc&r1=1.16&r2=1.17
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/intrinsics/eoshift2.c.diff?cvsroot=gcc&r1=1.16&r2=1.17
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/intrinsics/pack_generic.c.diff?cvsroot=gcc&r1=1.11&r2=1.12
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/intrinsics/reshape_generic.c.diff?cvsroot=gcc&r1=1.10&r2=1.11
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/intrinsics/spread_generic.c.diff?cvsroot=gcc&r1=1.11&r2=1.12
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/intrinsics/transpose_generic.c.diff?cvsroot=gcc&r1=1.10&r2=1.11
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/intrinsics/unpack_generic.c.diff?cvsroot=gcc&r1=1.10&r2=1.11
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/m4/cshift1.m4.diff?cvsroot=gcc&r1=1.10&r2=1.11
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/m4/eoshift1.m4.diff?cvsroot=gcc&r1=1.13&r2=1.14
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/m4/eoshift3.m4.diff?cvsroot=gcc&r1=1.13&r2=1.14
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/generated/cshift1_4.c.diff?cvsroot=gcc&r1=1.9&r2=1.10
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/generated/cshift1_8.c.diff?cvsroot=gcc&r1=1.9&r2=1.10
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/generated/eoshift1_4.c.diff?cvsroot=gcc&r1=1.12&r2=1.13
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/generated/eoshift1_8.c.diff?cvsroot=gcc&r1=1.12&r2=1.13
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/generated/eoshift3_4.c.diff?cvsroot=gcc&r1=1.12&r2=1.13
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libgfortran/generated/eoshift3_8.c.diff?cvsroot=gcc&r1=1.12&r2=1.13

Comment 8 Richard Sandiford 2005-09-13 07:24:18 UTC
Patch committed to mainline.