summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>2006-10-30 16:15:09 +0000
committerpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>2006-10-30 16:15:09 +0000
commitc5de24ebf92b98a292607ae1aed1c1bfde74f9de (patch)
treea627b06af6dec5b97093fe2b8d55d7d273615ce4
parent87080baa530343d8017151f611ec372e69175e10 (diff)
downloadppe42-gcc-c5de24ebf92b98a292607ae1aed1c1bfde74f9de.tar.gz
ppe42-gcc-c5de24ebf92b98a292607ae1aed1c1bfde74f9de.zip
2006-10-30 Andrew Pinski <pinskia@gmail.com>
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 2006-10-30 Andrew Pinski <pinskia@gmail.com> PR Fortran/29410 * gfortran.fortran-torture/execute/transfer1.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@118186 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/trans-intrinsic.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.fortran-torture/execute/transfer1.f9010
4 files changed, 26 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index b015e78412c..25ace324b40 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2006-10-30 Andrew Pinski <pinskia@gmail.com>
+
+ 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
+
2006-10-29 Francois-Xavier Coudert <coudert@clipper.ens.fr>
* trans-intrinsic.c (gfc_conv_intrinsic_loc): Make LOC return a
diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c
index 911782ba8de..44d439d01ce 100644
--- a/gcc/fortran/trans-intrinsic.c
+++ b/gcc/fortran/trans-intrinsic.c
@@ -2914,7 +2914,7 @@ gfc_conv_intrinsic_array_transfer (gfc_se * se, gfc_expr * expr)
/* Scalar transfer statement.
- TRANSFER (source, mold) = *(typeof<mold> *)&source. */
+ TRANSFER (source, mold) = VIEW_CONVERT_EXPR<typeof<mold> >source. */
static void
gfc_conv_intrinsic_transfer (gfc_se * se, gfc_expr * expr)
@@ -2939,9 +2939,9 @@ gfc_conv_intrinsic_transfer (gfc_se * se, gfc_expr * expr)
arg = arg->next;
type = gfc_typenode_for_spec (&expr->ts);
- ptr = convert (build_pointer_type (type), ptr);
if (expr->ts.type == BT_CHARACTER)
{
+ ptr = convert (build_pointer_type (type), ptr);
gfc_init_se (&argse, NULL);
gfc_conv_expr (&argse, arg->expr);
gfc_add_block_to_block (&se->pre, &argse.pre);
@@ -2951,7 +2951,8 @@ gfc_conv_intrinsic_transfer (gfc_se * se, gfc_expr * expr)
}
else
{
- se->expr = build_fold_indirect_ref (ptr);
+ tree tmp = build_fold_indirect_ref (ptr);
+ se->expr = fold_build1 (VIEW_CONVERT_EXPR, type, tmp);
}
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f7182e4c0da..f8876e353d7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-10-30 Andrew Pinski <pinskia@gmail.com>
+
+ PR Fortran/29410
+ * gfortran.fortran-torture/execute/transfer1.f90: New test.
+
2006-10-30 Joseph Myers <joseph@codesourcery.com>
* lib/target-supports.exp (check_function_available): Declare
diff --git a/gcc/testsuite/gfortran.fortran-torture/execute/transfer1.f90 b/gcc/testsuite/gfortran.fortran-torture/execute/transfer1.f90
new file mode 100644
index 00000000000..855fe9df17a
--- /dev/null
+++ b/gcc/testsuite/gfortran.fortran-torture/execute/transfer1.f90
@@ -0,0 +1,10 @@
+program chop
+ integer ix, iy
+ real x, y
+ x = 1.
+ y = x
+ ix = transfer(x,ix)
+ iy = transfer(y,iy)
+ print '(2z20.8)', ix, iy
+ if (ix /= iy) call abort
+end program chop
OpenPOWER on IntegriCloud