public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug fortran/31193] New: ICE on count(transfer(...)...), with non-constant transfer arguments.
@ 2007-03-16 4:38 brooks at gcc dot gnu dot org
2007-03-16 6:54 ` [Bug fortran/31193] ICE on non-constant character tranfert fxcoudert at gcc dot gnu dot org
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: brooks at gcc dot gnu dot org @ 2007-03-16 4:38 UTC (permalink / raw)
To: gcc-bugs
There are known problems with attempts at folding TRANSFER in constant
expressions. However, the following code doesn't involve this, and should work
properly even if folding of TRANSFER simply bails out without attempting to
fold anything. Instead, it gives an ICE (in the middle-end, not in the Fortran
front-end).
debian-gfortran:~/test> more awgrey2.f90
function NumOccurances(string,chr) result(n)
character(*),intent(in) :: string
character(1),intent(in) :: chr
!
! return number of occurances of character in given string
!
n=count(transfer(string,char(1),len(string))==chr)
return
end
debian-gfortran:~/test> ~/bin-trunk/bin/gfortran awgrey2.f90
awgrey2.f90: In function 'numoccurances':
awgrey2.f90:1: internal compiler error: in fold_binary, at fold-const.c:8999
Please submit a full bug report,
debian-gfortran:~/test> ~/bin-trunk/bin/gfortran --version
GNU Fortran (GCC) 4.3.0 20070307 (experimental)
--
Summary: ICE on count(transfer(...)...), with non-constant
transfer arguments.
Product: gcc
Version: 4.3.0
Status: UNCONFIRMED
Keywords: ice-on-valid-code
Severity: normal
Priority: P3
Component: fortran
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: brooks at gcc dot gnu dot org
GCC build triplet: i686-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31193
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug fortran/31193] ICE on non-constant character tranfert
2007-03-16 4:38 [Bug fortran/31193] New: ICE on count(transfer(...)...), with non-constant transfer arguments brooks at gcc dot gnu dot org
@ 2007-03-16 6:54 ` fxcoudert at gcc dot gnu dot org
2007-03-21 15:22 ` pault at gcc dot gnu dot org
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: fxcoudert at gcc dot gnu dot org @ 2007-03-16 6:54 UTC (permalink / raw)
To: gcc-bugs
------- Comment #1 from fxcoudert at gcc dot gnu dot org 2007-03-16 06:54 -------
Further reduced testcase:
character(5) :: string
print *, transfer(string,"a",5)
end
The ICE happens because the front-end generates a MULT_EXPR with a NULL second
argument, in trans-array.c:
if (size && !callee_alloc)
{
/* If or_expr is true, then the extent in at least one
dimension is zero and the size is set to zero. */
size = fold_build3 (COND_EXPR, gfc_array_index_type,
or_expr, gfc_index_zero_node, size);
nelem = size;
size = fold_build2 (MULT_EXPR, gfc_array_index_type, size,
TYPE_SIZE_UNIT (gfc_get_element_type (type)));
}
For some reason, TYPE_SIZE_UNIT (gfc_get_element_type (type)) is NULL, while
type is:
<record_type 0xb7c4ce38 array1_unknown type_1 BLK
size <integer_cst 0xb7be1708 type <integer_type 0xb7bf0068 bit_size_type>
constant invariant 192>
unit size <integer_cst 0xb7be1720 type <integer_type 0xb7bf0000> constant
invariant 24>
align 32 symtab 0 alias set -1 canonical type 0xb7c4cb60
fields <field_decl 0xb7c4905c data
type <pointer_type 0xb7bf0958 type <void_type 0xb7bf08f0 void>
public unsigned SI
size <integer_cst 0xb7be1330 constant invariant 32>
unit size <integer_cst 0xb7be1168 constant invariant 4>
align 32 symtab 0 alias set -1 canonical type 0xb7bf0958
pointer_to_this <pointer_type 0xb7bf8bc8>>
unsigned SI file u.f90 line 1 size <integer_cst 0xb7be1330 32> unit
size <integer_cst 0xb7be1168 4>
align 32 offset_align 128
offset <integer_cst 0xb7be1180 constant invariant 0>
bit offset <integer_cst 0xb7be1540 constant invariant 0> context
<record_type 0xb7c4cb60 array_descriptor1>
chain <field_decl 0xb7c490b8 offset type <integer_type 0xb7bf02d8 int4>
SI file u.f90 line 1 size <integer_cst 0xb7be1330 32> unit size
<integer_cst 0xb7be1168 4>
align 32 offset_align 128 offset <integer_cst 0xb7be1180 0> bit
offset <integer_cst 0xb7be1330 32> context <record_type 0xb7c4cb60
array_descriptor1> chain <field_decl 0xb7c49114 dtype>>>>
--
fxcoudert at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Ever Confirmed|0 |1
GCC build triplet|i686-pc-linux-gnu |
Known to fail| |4.3.0 4.2.0
Last reconfirmed|0000-00-00 00:00:00 |2007-03-16 06:54:45
date| |
Summary|ICE on |ICE on non-constant
|count(transfer(...)...), |character tranfert
|with non-constant transfer |
|arguments. |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31193
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug fortran/31193] ICE on non-constant character tranfert
2007-03-16 4:38 [Bug fortran/31193] New: ICE on count(transfer(...)...), with non-constant transfer arguments brooks at gcc dot gnu dot org
2007-03-16 6:54 ` [Bug fortran/31193] ICE on non-constant character tranfert fxcoudert at gcc dot gnu dot org
@ 2007-03-21 15:22 ` pault at gcc dot gnu dot org
2007-03-22 13:31 ` patchapp at dberlin dot org
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: pault at gcc dot gnu dot org @ 2007-03-21 15:22 UTC (permalink / raw)
To: gcc-bugs
------- Comment #2 from pault at gcc dot gnu dot org 2007-03-21 15:22 -------
This fixes it
Index: gcc/fortran/trans-intrinsic.c
===================================================================
*** gcc/fortran/trans-intrinsic.c (revision 123059)
--- gcc/fortran/trans-intrinsic.c (working copy)
*************** gfc_conv_intrinsic_array_transfer (gfc_s
*** 2829,2834 ****
--- 2829,2835 ----
tree extent;
tree source;
tree source_bytes;
+ tree mold_type;
tree dest_word_len;
tree size_words;
tree size_bytes;
*************** gfc_conv_intrinsic_array_transfer (gfc_s
*** 2934,2953 ****
if (ss == gfc_ss_terminator)
{
gfc_conv_expr_reference (&argse, arg->expr);
-
- /* Obtain the source word length. */
tmp = gfc_size_in_bytes (&argse, arg->expr);
}
else
{
gfc_init_se (&argse, NULL);
argse.want_pointer = 0;
gfc_conv_expr_descriptor (&argse, arg->expr, ss);
-
- /* Obtain the source word length. */
tmp = gfc_size_in_bytes (&argse, arg->expr);
}
!
dest_word_len = gfc_create_var (gfc_array_index_type, NULL);
gfc_add_modify_expr (&se->pre, dest_word_len, tmp);
--- 2935,2952 ----
if (ss == gfc_ss_terminator)
{
gfc_conv_expr_reference (&argse, arg->expr);
tmp = gfc_size_in_bytes (&argse, arg->expr);
+ mold_type = TREE_TYPE (build_fold_indirect_ref (argse.expr));
}
else
{
gfc_init_se (&argse, NULL);
argse.want_pointer = 0;
gfc_conv_expr_descriptor (&argse, arg->expr, ss);
tmp = gfc_size_in_bytes (&argse, arg->expr);
+ mold_type = gfc_get_element_type (TREE_TYPE (argse.expr));
}
!
dest_word_len = gfc_create_var (gfc_array_index_type, NULL);
gfc_add_modify_expr (&se->pre, dest_word_len, tmp);
$
*************** gfc_conv_intrinsic_array_transfer (gfc_s
*** 3016,3025 ****
/* Build a destination descriptor, using the pointer, source, as the
data field. This is already allocated so set callee_alloc.
FIXME callee_alloc is not set! */
-
- tmp = gfc_typenode_for_spec (&expr->ts);
gfc_trans_create_temp_array (&se->pre, &se->post, se->loop,
! info, tmp, false, true, false);
/* Use memcpy to do the transfer. */
tmp = build_call_expr (built_in_decls[BUILT_IN_MEMCPY],
--- 3015,3022 ----
/* Build a destination descriptor, using the pointer, source, as the
data field. This is already allocated so set callee_alloc.
FIXME callee_alloc is not set! */
gfc_trans_create_temp_array (&se->pre, &se->post, se->loop,
! info, mold_type, false, true, false);
/* Use memcpy to do the transfer. */
tmp = build_call_expr (built_in_decls[BUILT_IN_MEMCPY],
However, mold being string(1:1) gives the wrong result so I'll fix that first
before submitting the patch.
Paul
--
pault at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
AssignedTo|unassigned at gcc dot gnu |pault at gcc dot gnu dot org
|dot org |
Status|NEW |ASSIGNED
Last reconfirmed|2007-03-16 06:54:45 |2007-03-21 15:22:38
date| |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31193
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug fortran/31193] ICE on non-constant character tranfert
2007-03-16 4:38 [Bug fortran/31193] New: ICE on count(transfer(...)...), with non-constant transfer arguments brooks at gcc dot gnu dot org
2007-03-16 6:54 ` [Bug fortran/31193] ICE on non-constant character tranfert fxcoudert at gcc dot gnu dot org
2007-03-21 15:22 ` pault at gcc dot gnu dot org
@ 2007-03-22 13:31 ` patchapp at dberlin dot org
2007-03-22 18:37 ` pault at gcc dot gnu dot org
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: patchapp at dberlin dot org @ 2007-03-22 13:31 UTC (permalink / raw)
To: gcc-bugs
------- Comment #3 from patchapp at dberlin dot org 2007-03-22 13:30 -------
Subject: Bug number PR31193
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-03/msg01465.html
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31193
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug fortran/31193] ICE on non-constant character tranfert
2007-03-16 4:38 [Bug fortran/31193] New: ICE on count(transfer(...)...), with non-constant transfer arguments brooks at gcc dot gnu dot org
` (2 preceding siblings ...)
2007-03-22 13:31 ` patchapp at dberlin dot org
@ 2007-03-22 18:37 ` pault at gcc dot gnu dot org
2007-03-27 9:09 ` [Bug fortran/31193] [4.2 only] " pault at gcc dot gnu dot org
2007-03-29 16:11 ` fxcoudert at gcc dot gnu dot org
5 siblings, 0 replies; 7+ messages in thread
From: pault at gcc dot gnu dot org @ 2007-03-22 18:37 UTC (permalink / raw)
To: gcc-bugs
------- Comment #4 from pault at gcc dot gnu dot org 2007-03-22 18:37 -------
Subject: Bug 31193
Author: pault
Date: Thu Mar 22 18:37:16 2007
New Revision: 123131
URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=123131
Log:
2006-03-22 Paul Thomas <pault@gcc.gnu.org>
PR fortran/31193
* trans-intrinsic.c (gfc_size_in_bytes): Remove function.
(gfc_conv_intrinsic_array_transfer): Remove calls to previous.
Explicitly extract TREE_TYPEs for source and mold. Use these
to calculate length of source and mold, except for characters,
where the se string_length is used. For mold, the TREE_TYPE is
recalculated using gfc_get_character_type_len so that the
result is correctly cast for character literals and substrings.
Do not use gfc_typenode_for_spec for the final cast.
2006-03-22 Paul Thomas <pault@gcc.gnu.org>
PR fortran/31193
* gfortran.dg/transfer_array_intrinsic_3.f90: New test.
Added:
trunk/gcc/testsuite/gfortran.dg/transfer_array_intrinsic_3.f90
Modified:
trunk/gcc/fortran/ChangeLog
trunk/gcc/fortran/trans-intrinsic.c
trunk/gcc/testsuite/ChangeLog
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31193
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug fortran/31193] [4.2 only] ICE on non-constant character tranfert
2007-03-16 4:38 [Bug fortran/31193] New: ICE on count(transfer(...)...), with non-constant transfer arguments brooks at gcc dot gnu dot org
` (3 preceding siblings ...)
2007-03-22 18:37 ` pault at gcc dot gnu dot org
@ 2007-03-27 9:09 ` pault at gcc dot gnu dot org
2007-03-29 16:11 ` fxcoudert at gcc dot gnu dot org
5 siblings, 0 replies; 7+ messages in thread
From: pault at gcc dot gnu dot org @ 2007-03-27 9:09 UTC (permalink / raw)
To: gcc-bugs
------- Comment #5 from pault at gcc dot gnu dot org 2007-03-27 10:09 -------
This is not a regression wrt 4.1 so closing.
Paul
--
pault at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|ASSIGNED |RESOLVED
Resolution| |FIXED
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31193
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Bug fortran/31193] [4.2 only] ICE on non-constant character tranfert
2007-03-16 4:38 [Bug fortran/31193] New: ICE on count(transfer(...)...), with non-constant transfer arguments brooks at gcc dot gnu dot org
` (4 preceding siblings ...)
2007-03-27 9:09 ` [Bug fortran/31193] [4.2 only] " pault at gcc dot gnu dot org
@ 2007-03-29 16:11 ` fxcoudert at gcc dot gnu dot org
5 siblings, 0 replies; 7+ messages in thread
From: fxcoudert at gcc dot gnu dot org @ 2007-03-29 16:11 UTC (permalink / raw)
To: gcc-bugs
------- Comment #6 from fxcoudert at gcc dot gnu dot org 2007-03-29 17:10 -------
*** Bug 31390 has been marked as a duplicate of this bug. ***
--
fxcoudert at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |drewmccormack at mac dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31193
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2007-03-29 16:11 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-03-16 4:38 [Bug fortran/31193] New: ICE on count(transfer(...)...), with non-constant transfer arguments brooks at gcc dot gnu dot org
2007-03-16 6:54 ` [Bug fortran/31193] ICE on non-constant character tranfert fxcoudert at gcc dot gnu dot org
2007-03-21 15:22 ` pault at gcc dot gnu dot org
2007-03-22 13:31 ` patchapp at dberlin dot org
2007-03-22 18:37 ` pault at gcc dot gnu dot org
2007-03-27 9:09 ` [Bug fortran/31193] [4.2 only] " pault at gcc dot gnu dot org
2007-03-29 16:11 ` fxcoudert at gcc dot gnu dot org
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).