]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
trans-expr.c (expr_is_variable): New function taking non-copying intrinsic functions...
authorMikael Morin <mikael@gcc.gnu.org>
Fri, 10 Sep 2010 13:03:06 +0000 (13:03 +0000)
committerMikael Morin <mikael@gcc.gnu.org>
Fri, 10 Sep 2010 13:03:06 +0000 (13:03 +0000)
2010-09-10  Mikael Morin  <mikael@gcc.gnu.org>

* trans-expr.c (expr_is_variable): New function taking non-copying
intrinsic functions into account.
(gfc_trans_assignment_1): Use expr_is_variable.

From-SVN: r164169

gcc/fortran/ChangeLog
gcc/fortran/trans-expr.c

index 8c70828443e49b7cb36b986be48caa1cb337f1bf..71d7c9ebddb11c98b6385b003959f663ecf85c23 100644 (file)
@@ -1,3 +1,9 @@
+2010-09-10  Mikael Morin  <mikael@gcc.gnu.org>
+
+       * trans-expr.c (expr_is_variable): New function taking non-copying
+       intrinsic functions into account.
+       (gfc_trans_assignment_1): Use expr_is_variable.
+
 2010-09-10  Mikael Morin  <mikael@gcc.gnu.org>
 
        * trans-array.c (gfc_conv_loop_setup): Access the shape along the
index db1686b35df7aa5f2638330f9cfd507bc6a4e83d..8d4295fce8fba6ee704f91d5c4e3506bcd747a44 100644 (file)
@@ -5536,6 +5536,27 @@ gfc_trans_array_constructor_copy (gfc_expr * expr1, gfc_expr * expr2)
 }
 
 
+/* Tells whether the expression is to be treated as a variable reference.  */
+
+static bool
+expr_is_variable (gfc_expr *expr)
+{
+  gfc_expr *arg;
+
+  if (expr->expr_type == EXPR_VARIABLE)
+    return true;
+
+  arg = gfc_get_noncopying_intrinsic_argument (expr);
+  if (arg)
+    {
+      gcc_assert (expr->value.function.isym->id == GFC_ISYM_TRANSPOSE);
+      return expr_is_variable (arg);
+    }
+
+  return false;
+}
+
+
 /* Subroutine of gfc_trans_assignment that actually scalarizes the
    assignment.  EXPR1 is the destination/LHS and EXPR2 is the source/RHS.
    init_flag indicates initialization expressions and dealloc that no
@@ -5661,7 +5682,7 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
      must have its components deallocated afterwards.  */
   scalar_to_array = (expr2->ts.type == BT_DERIVED
                       && expr2->ts.u.derived->attr.alloc_comp
-                      && expr2->expr_type != EXPR_VARIABLE
+                      && !expr_is_variable (expr2)
                       && !gfc_is_constant_expr (expr2)
                       && expr1->rank && !expr2->rank);
   if (scalar_to_array && dealloc)
@@ -5672,8 +5693,8 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
 
   tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts,
                                 l_is_temp || init_flag,
-                                (expr2->expr_type == EXPR_VARIABLE)
-                                   || scalar_to_array, dealloc);
+                                expr_is_variable (expr2) || scalar_to_array,
+                                dealloc);
   gfc_add_expr_to_block (&body, tmp);
 
   if (lss == gfc_ss_terminator)