Patchwork [fortran,5/5] PR 45586: Use the right type in scalar to array assignments

login
register
mail settings
Submitter Mikael Morin
Date Aug. 24, 2012, 3:12 p.m.
Message ID <20120824151026.6294.48823@marvin>
Download mbox | patch
Permalink /patch/179861/
State New
Headers show

Comments

Mikael Morin - Aug. 24, 2012, 3:12 p.m.
Patch number 3 handled scalar assignments like:
scalar_some_type = some_type(...)

Patch number 4 handled array assignments like:
array_some_type = (/some_type :: .../)

This takes care of assignments like:
array_some_type = some_type(...)
i.e. scalar to array assignments.  As all the infrastructure has been installed
previously, this simply sets it up properly.

OK?
2012-08-22  Mikael Morin  <mikael@gcc.gnu.org>

	* trans-array.c (gfc_add_loop_ss_code): Use RESTRICTED field.
	* trans-expr.c (gfc_trans_assignment): Set RESTRICTED field.

Patch

diff --git a/trans-array.c b/trans-array.c
index f5051ff..432fc72 100644
--- a/trans-array.c
+++ b/trans-array.c
@@ -2489,6 +2489,7 @@  gfc_add_loop_ss_code (gfc_loopinfo * loop, gfc_ss * ss, bool subscript,
 	  /* Scalar expression.  Evaluate this now.  This includes elemental
 	     dimension indices, but not array section bounds.  */
 	  gfc_init_se (&se, NULL);
+	  se.want_restricted_types = ss_info->restricted;
 	  gfc_conv_expr (&se, expr);
 	  gfc_add_block_to_block (&outer_loop->pre, &se.pre);
 
diff --git a/trans-expr.c b/trans-expr.c
index 2a60087..6af753a 100644
--- a/trans-expr.c
+++ b/trans-expr.c
@@ -7258,8 +7258,11 @@  gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
       /* Walk the rhs.  */
       rss = gfc_walk_expr (expr2);
       if (rss == gfc_ss_terminator)
-	/* The rhs is scalar.  Add a ss for the expression.  */
-	rss = gfc_get_scalar_ss (gfc_ss_terminator, expr2);
+	{
+	  /* The rhs is scalar.  Add a ss for the expression.  */
+	  rss = gfc_get_scalar_ss (gfc_ss_terminator, expr2);
+	  gfc_ss_set_restricted (rss, !gfc_expr_attr (expr1).target);
+	}
       else if (rss->next == gfc_ss_terminator
 	       && rss->info->type == GFC_SS_CONSTRUCTOR)
 	gfc_ss_set_restricted (rss, !(gfc_expr_attr (expr1).target));