* [Bug fortran/29951] incorrect conversion from string to integer by convert()
2006-11-23 9:24 [Bug fortran/29951] New: incorrect conversion from string to integer by convert() kloedej at knmi dot nl
@ 2006-11-23 9:28 ` kloedej at knmi dot nl
2006-11-23 11:17 ` [Bug fortran/29951] incorrect conversion from string to integer by TRANSFER() burnus at gcc dot gnu dot org
` (9 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: kloedej at knmi dot nl @ 2006-11-23 9:28 UTC (permalink / raw)
To: gcc-bugs
------- Comment #1 from kloedej at knmi dot nl 2006-11-23 09:27 -------
Hi,
a little correction on the just submitted report.
I seem to have mixed up the two cases. The string case fails so it clearly has
nothing to do with the rank of the first parameter to transfer().
Jos de Kloe
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29951
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug fortran/29951] incorrect conversion from string to integer by TRANSFER()
2006-11-23 9:24 [Bug fortran/29951] New: incorrect conversion from string to integer by convert() kloedej at knmi dot nl
2006-11-23 9:28 ` [Bug fortran/29951] " kloedej at knmi dot nl
@ 2006-11-23 11:17 ` burnus at gcc dot gnu dot org
2006-11-23 11:40 ` burnus at gcc dot gnu dot org
` (8 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: burnus at gcc dot gnu dot org @ 2006-11-23 11:17 UTC (permalink / raw)
To: gcc-bugs
------- Comment #2 from burnus at gcc dot gnu dot org 2006-11-23 11:17 -------
Confirmed.
For "transfer(string, integer)", gfortran's transfer only uses the first
character (byte).
It should use all characters.
-fdump-tree-original:
value = VIEW_CONVERT_EXPR<int4>(byte_string[1]{lb: 1 sz: 1});
In iresolve.c gfortran only checks whether the source is scalar or an array,
the transfer is then done in gfc_conv_intrinsic_transfer (scalar) or
gfc_conv_intrinsic_array_transfer in trans-intrinsic.c.
--
burnus at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |burnus at gcc dot gnu dot
| |org
Status|UNCONFIRMED |NEW
Ever Confirmed|0 |1
Keywords| |wrong-code
Last reconfirmed|0000-00-00 00:00:00 |2006-11-23 11:17:09
date| |
Summary|incorrect conversion from |incorrect conversion from
|string to integer by |string to integer by
|convert() |TRANSFER()
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29951
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug fortran/29951] incorrect conversion from string to integer by TRANSFER()
2006-11-23 9:24 [Bug fortran/29951] New: incorrect conversion from string to integer by convert() kloedej at knmi dot nl
2006-11-23 9:28 ` [Bug fortran/29951] " kloedej at knmi dot nl
2006-11-23 11:17 ` [Bug fortran/29951] incorrect conversion from string to integer by TRANSFER() burnus at gcc dot gnu dot org
@ 2006-11-23 11:40 ` burnus at gcc dot gnu dot org
2006-11-24 3:00 ` pinskia at gcc dot gnu dot org
` (7 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: burnus at gcc dot gnu dot org @ 2006-11-23 11:40 UTC (permalink / raw)
To: gcc-bugs
------- Comment #3 from burnus at gcc dot gnu dot org 2006-11-23 11:39 -------
> In iresolve.c gfortran only checks whether the source is scalar or an array,
This is none sense it actually checks the mold-rank.
The function to modify is gfc_conv_intrinsic_transfer (trans-intrinsic.c);
we somewhere need to obtain for character strings their byte size.
gfc_conv_intrinsic_array_transfer seems to do the right thing.
For "character(len=2) :: byte_array(2)" it works,
for character(len=4) :: byte_array(1)" it does not.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29951
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug fortran/29951] incorrect conversion from string to integer by TRANSFER()
2006-11-23 9:24 [Bug fortran/29951] New: incorrect conversion from string to integer by convert() kloedej at knmi dot nl
` (2 preceding siblings ...)
2006-11-23 11:40 ` burnus at gcc dot gnu dot org
@ 2006-11-24 3:00 ` pinskia at gcc dot gnu dot org
2006-11-24 8:12 ` kloedej at knmi dot nl
` (6 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2006-11-24 3:00 UTC (permalink / raw)
To: gcc-bugs
------- Comment #4 from pinskia at gcc dot gnu dot org 2006-11-24 03:00 -------
(In reply to comment #2)
> Confirmed.
> For "transfer(string, integer)", gfortran's transfer only uses the first
> character (byte).
> It should use all characters.
>
> -fdump-tree-original:
> value = VIEW_CONVERT_EXPR<int4>(byte_string[1]{lb: 1 sz: 1});
Hmm, I think this is only a bug in 4.3.0 but this was reported against 4.2.0.
The above VCE is my fault and I have to figure that out but I think there is
something else going wrong if it fails for 4.2.0 since my VCE patch was not
applied there. I guess I might have revert the VCE patch and create a new one
with memcpy and just hope someone optimizes memcpy better.
--
pinskia at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |pinskia at gcc dot gnu dot
| |org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29951
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug fortran/29951] incorrect conversion from string to integer by TRANSFER()
2006-11-23 9:24 [Bug fortran/29951] New: incorrect conversion from string to integer by convert() kloedej at knmi dot nl
` (3 preceding siblings ...)
2006-11-24 3:00 ` pinskia at gcc dot gnu dot org
@ 2006-11-24 8:12 ` kloedej at knmi dot nl
2006-11-24 8:14 ` [Bug fortran/29951] [4.3 Regression] " pinskia at gcc dot gnu dot org
` (5 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: kloedej at knmi dot nl @ 2006-11-24 8:12 UTC (permalink / raw)
To: gcc-bugs
------- Comment #5 from kloedej at knmi dot nl 2006-11-24 08:12 -------
Yes, I can confirm the gfortran version used was 4.3.0.
I didn't notice the version number changed when I downoaded the latest version.
Sorry for that.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29951
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug fortran/29951] [4.3 Regression] incorrect conversion from string to integer by TRANSFER()
2006-11-23 9:24 [Bug fortran/29951] New: incorrect conversion from string to integer by convert() kloedej at knmi dot nl
` (4 preceding siblings ...)
2006-11-24 8:12 ` kloedej at knmi dot nl
@ 2006-11-24 8:14 ` pinskia at gcc dot gnu dot org
2006-11-24 22:46 ` pinskia at gcc dot gnu dot org
` (4 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2006-11-24 8:14 UTC (permalink / raw)
To: gcc-bugs
------- Comment #6 from pinskia at gcc dot gnu dot org 2006-11-24 08:13 -------
Mine to fix then.
--
pinskia at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
AssignedTo|unassigned at gcc dot gnu |pinskia at gcc dot gnu dot
|dot org |org
Status|NEW |ASSIGNED
Summary|incorrect conversion from |[4.3 Regression] incorrect
|string to integer by |conversion from string to
|TRANSFER() |integer by TRANSFER()
Target Milestone|--- |4.3.0
Version|4.2.0 |4.3.0
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29951
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug fortran/29951] [4.3 Regression] incorrect conversion from string to integer by TRANSFER()
2006-11-23 9:24 [Bug fortran/29951] New: incorrect conversion from string to integer by convert() kloedej at knmi dot nl
` (5 preceding siblings ...)
2006-11-24 8:14 ` [Bug fortran/29951] [4.3 Regression] " pinskia at gcc dot gnu dot org
@ 2006-11-24 22:46 ` pinskia at gcc dot gnu dot org
2006-11-25 21:44 ` pinskia at gcc dot gnu dot org
` (3 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2006-11-24 22:46 UTC (permalink / raw)
To: gcc-bugs
------- Comment #7 from pinskia at gcc dot gnu dot org 2006-11-24 22:46 -------
Here is the patch which I am testing, it fixes this testcase;
Index: trans-intrinsic.c
===================================================================
--- trans-intrinsic.c (revision 119148)
+++ trans-intrinsic.c (working copy)
@@ -2989,7 +2989,7 @@ gfc_conv_intrinsic_array_transfer (gfc_s
/* Scalar transfer statement.
- TRANSFER (source, mold) = VIEW_CONVERT_EXPR<typeof<mold> >source. */
+ TRANSFER (source, mold) = memcpy(&tmpdecl, &source, size), tmpdecl. */
static void
gfc_conv_intrinsic_transfer (gfc_se * se, gfc_expr * expr)
@@ -2999,6 +2999,7 @@ gfc_conv_intrinsic_transfer (gfc_se * se
tree type;
tree ptr;
gfc_ss *ss;
+ tree tmpdecl, tmp, args;
/* Get a pointer to the source. */
arg = expr->value.function.actual;
@@ -3014,6 +3015,7 @@ gfc_conv_intrinsic_transfer (gfc_se * se
arg = arg->next;
type = gfc_typenode_for_spec (&expr->ts);
+
if (expr->ts.type == BT_CHARACTER)
{
ptr = convert (build_pointer_type (type), ptr);
@@ -3026,8 +3028,22 @@ gfc_conv_intrinsic_transfer (gfc_se * se
}
else
{
- tree tmp = build_fold_indirect_ref (ptr);
- se->expr = fold_build1 (VIEW_CONVERT_EXPR, type, tmp);
+ tree moldsize;
+ tmpdecl = gfc_create_var (type, "transfer");
+ moldsize = size_in_bytes (type);
+
+ /* Use memcpy to do the transfer. */
+ tmp = build1 (ADDR_EXPR, build_pointer_type (type), tmpdecl);
+ tmp = fold_convert (pvoid_type_node, tmp);
+ args = gfc_chainon_list (NULL_TREE, tmp);
+ tmp = fold_convert (pvoid_type_node, ptr);
+ args = gfc_chainon_list (args, tmp);
+ args = gfc_chainon_list (args, moldsize);
+ tmp = built_in_decls[BUILT_IN_MEMCPY];
+ tmp = build_function_call_expr (tmp, args);
+ gfc_add_expr_to_block (&se->pre, tmp);
+
+ se->expr = tmpdecl;
}
}
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29951
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug fortran/29951] [4.3 Regression] incorrect conversion from string to integer by TRANSFER()
2006-11-23 9:24 [Bug fortran/29951] New: incorrect conversion from string to integer by convert() kloedej at knmi dot nl
` (6 preceding siblings ...)
2006-11-24 22:46 ` pinskia at gcc dot gnu dot org
@ 2006-11-25 21:44 ` pinskia at gcc dot gnu dot org
2006-11-25 21:45 ` pinskia at gcc dot gnu dot org
` (2 subsequent siblings)
10 siblings, 0 replies; 12+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2006-11-25 21:44 UTC (permalink / raw)
To: gcc-bugs
------- Comment #8 from pinskia at gcc dot gnu dot org 2006-11-25 21:43 -------
Subject: Bug 29951
Author: pinskia
Date: Sat Nov 25 21:43:48 2006
New Revision: 119211
URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=119211
Log:
2006-11-25 Andrew Pinski <pinskia@gmail.com>
PR fortran/29951
* trans-intrinsic.c (gfc_conv_intrinsic_transfer): Change to
call memcpy instead of creating a VIEW_CONVERT_EXRP.
2006-11-25 Andrew Pinski <pinskia@gmail.com>
PR fortran/29951
* gfortran.fortran-torture/execute/transfer2.f90: New test
Added:
trunk/gcc/testsuite/gfortran.fortran-torture/execute/transfer2.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=29951
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug fortran/29951] [4.3 Regression] incorrect conversion from string to integer by TRANSFER()
2006-11-23 9:24 [Bug fortran/29951] New: incorrect conversion from string to integer by convert() kloedej at knmi dot nl
` (7 preceding siblings ...)
2006-11-25 21:44 ` pinskia at gcc dot gnu dot org
@ 2006-11-25 21:45 ` pinskia at gcc dot gnu dot org
2006-11-27 8:22 ` kloedej at knmi dot nl
2007-01-23 5:15 ` pinskia at gcc dot gnu dot org
10 siblings, 0 replies; 12+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2006-11-25 21:45 UTC (permalink / raw)
To: gcc-bugs
------- Comment #9 from pinskia at gcc dot gnu dot org 2006-11-25 21:45 -------
Fixed.
--
pinskia at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|ASSIGNED |RESOLVED
Resolution| |FIXED
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29951
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug fortran/29951] [4.3 Regression] incorrect conversion from string to integer by TRANSFER()
2006-11-23 9:24 [Bug fortran/29951] New: incorrect conversion from string to integer by convert() kloedej at knmi dot nl
` (8 preceding siblings ...)
2006-11-25 21:45 ` pinskia at gcc dot gnu dot org
@ 2006-11-27 8:22 ` kloedej at knmi dot nl
2007-01-23 5:15 ` pinskia at gcc dot gnu dot org
10 siblings, 0 replies; 12+ messages in thread
From: kloedej at knmi dot nl @ 2006-11-27 8:22 UTC (permalink / raw)
To: gcc-bugs
------- Comment #10 from kloedej at knmi dot nl 2006-11-27 08:21 -------
thanks for your effort to fix this bug!
I can confirm todays binary version, downloaded from
"http://quatramaran.ens.fr/~coudert/gfortran/gfortran-linux.tar.gz
works fine for me.
best regards,
Jos de kloe
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29951
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Bug fortran/29951] [4.3 Regression] incorrect conversion from string to integer by TRANSFER()
2006-11-23 9:24 [Bug fortran/29951] New: incorrect conversion from string to integer by convert() kloedej at knmi dot nl
` (9 preceding siblings ...)
2006-11-27 8:22 ` kloedej at knmi dot nl
@ 2007-01-23 5:15 ` pinskia at gcc dot gnu dot org
10 siblings, 0 replies; 12+ messages in thread
From: pinskia at gcc dot gnu dot org @ 2007-01-23 5:15 UTC (permalink / raw)
To: gcc-bugs
------- Comment #11 from pinskia at gcc dot gnu dot org 2007-01-23 05:15 -------
Subject: Bug 29951
Author: pinskia
Date: Tue Jan 23 05:15:21 2007
New Revision: 121076
URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=121076
Log:
2007-01-22 Andrew Pinski <pinskia@gmail.com>
PR fortran/29951
* gfortran.fortran-torture/execute/transfer2.f90: New test.
PR Fortran/29410
* gfortran.fortran-torture/execute/transfer1.f90: New test.
2007-01-22 Andrew Pinski <pinskia@gmail.com>
PR fortran/29951
* trans-intrinsic.c (gfc_conv_intrinsic_transfer): Change to
call memcpy instead of creating a VIEW_CONVERT_EXRP.
PR fortran/29410
* trans-intrinsic.c (gfc_conv_intrinsic_array_transfer):
Change over to create VIEW_CONVERT_EXPR instead of using an
ADDR_EXPR, a cast and then an indirect reference.
Added:
branches/gcc-4_2-branch/gcc/testsuite/gfortran.fortran-torture/execute/transfer1.f90
- copied unchanged from r118186,
trunk/gcc/testsuite/gfortran.fortran-torture/execute/transfer1.f90
branches/gcc-4_2-branch/gcc/testsuite/gfortran.fortran-torture/execute/transfer2.f90
- copied unchanged from r119211,
trunk/gcc/testsuite/gfortran.fortran-torture/execute/transfer2.f90
Modified:
branches/gcc-4_2-branch/gcc/fortran/ChangeLog
branches/gcc-4_2-branch/gcc/fortran/trans-intrinsic.c
branches/gcc-4_2-branch/gcc/testsuite/ChangeLog
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29951
^ permalink raw reply [flat|nested] 12+ messages in thread