[Bug fortran/29951] [4.3 Regression] incorrect conversion from string to integer by TRANSFER()
--- 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=gccview=revrev=121076 Log: 2007-01-22 Andrew Pinski [EMAIL PROTECTED] 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 [EMAIL PROTECTED] 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
[Bug fortran/29951] [4.3 Regression] incorrect conversion from string to integer by TRANSFER()
--- 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
[Bug fortran/29951] [4.3 Regression] incorrect conversion from string to integer by TRANSFER()
--- 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=gccview=revrev=119211 Log: 2006-11-25 Andrew Pinski [EMAIL PROTECTED] 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 [EMAIL PROTECTED] 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
[Bug fortran/29951] [4.3 Regression] incorrect conversion from string to integer by TRANSFER()
--- 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
[Bug fortran/29951] [4.3 Regression] incorrect conversion from string to integer by TRANSFER()
--- 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
[Bug fortran/29951] [4.3 Regression] incorrect conversion from string to integer by TRANSFER()
--- 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_EXPRtypeofmold 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