OSDN Git Service

2006-10-30 Andrew Pinski <pinskia@gmail.com>
authorpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 30 Oct 2006 16:15:09 +0000 (16:15 +0000)
committerpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 30 Oct 2006 16:15:09 +0000 (16:15 +0000)
        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

gcc/fortran/ChangeLog
gcc/fortran/trans-intrinsic.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.fortran-torture/execute/transfer1.f90 [new file with mode: 0644]

index b015e78..25ace32 100644 (file)
@@ -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
index 911782b..44d439d 100644 (file)
@@ -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);
     }
 }
 
index f7182e4..f8876e3 100644 (file)
@@ -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 (file)
index 0000000..855fe9d
--- /dev/null
@@ -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