public inbox for fortran@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] PR fortran/68053 -- Reduce initialization expression to constant value
@ 2015-11-08 22:36 Steve Kargl
  2015-11-08 22:37 ` Steve Kargl
  0 siblings, 1 reply; 3+ messages in thread
From: Steve Kargl @ 2015-11-08 22:36 UTC (permalink / raw)
  To: fortran, gcc-patches

The attached patch has been built and regression tested
on i386-*-freebsd and x86_64-*-freebsd.  If an array
index in an initialization expression is an array element
from an array named constant, the array index needs to be
reduced.  This patch causes the reduction to occur.
OK to commit?

2015-11-08  Steven g. Kargl  <kargl@gcc.gnu.org>

	PR fortran/68053
	* decl.c (add_init_expr_to_sym):  Try to reduce initialization expression
	before testing for a constant value.

2015-11-08  Steven g. Kargl  <kargl@gcc.gnu.org>

	PR fortran/68053
	* gfortran.dg/pr68053.f90: New test.
-- 
Steve

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] PR fortran/68053 -- Reduce initialization expression to constant value
  2015-11-08 22:36 [PATCH] PR fortran/68053 -- Reduce initialization expression to constant value Steve Kargl
@ 2015-11-08 22:37 ` Steve Kargl
  2015-11-09  5:38   ` Paul Richard Thomas
  0 siblings, 1 reply; 3+ messages in thread
From: Steve Kargl @ 2015-11-08 22:37 UTC (permalink / raw)
  To: fortran, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 716 bytes --]

On Sun, Nov 08, 2015 at 02:35:58PM -0800, Steve Kargl wrote:
> The attached patch has been built and regression tested
> on i386-*-freebsd and x86_64-*-freebsd.  If an array
> index in an initialization expression is an array element
> from an array named constant, the array index needs to be
> reduced.  This patch causes the reduction to occur.
> OK to commit?
> 
> 2015-11-08  Steven g. Kargl  <kargl@gcc.gnu.org>
> 
> 	PR fortran/68053
> 	* decl.c (add_init_expr_to_sym):  Try to reduce initialization expression
> 	before testing for a constant value.
> 
> 2015-11-08  Steven g. Kargl  <kargl@gcc.gnu.org>
> 
> 	PR fortran/68053
> 	* gfortran.dg/pr68053.f90: New test.

Now with the patch attached!

-- 
Steve

[-- Attachment #2: pr68053.diff --]
[-- Type: text/x-diff, Size: 2287 bytes --]

Index: gcc/fortran/decl.c
===================================================================
--- gcc/fortran/decl.c	(revision 229970)
+++ gcc/fortran/decl.c	(working copy)
@@ -1529,26 +1529,34 @@ add_init_expr_to_sym (const char *name, 
 	  for (dim = 0; dim < sym->as->rank; ++dim)
 	    {
 	      int k;
-	      gfc_expr* lower;
-	      gfc_expr* e;
+	      gfc_expr *e, *lower;
 
 	      lower = sym->as->lower[dim];
-	      if (lower->expr_type != EXPR_CONSTANT)
+
+	      /* If the lower bound is an array element from another 
+		 parameterized array, then it is marked with EXPR_VARIABLE and
+		 is an initialization expression.  Try to reduce it.  */
+	      if (lower->expr_type == EXPR_VARIABLE)
+		gfc_reduce_init_expr (lower);
+
+	      if (lower->expr_type == EXPR_CONSTANT)
+		{
+		  /* All dimensions must be without upper bound.  */
+		  gcc_assert (!sym->as->upper[dim]);
+
+		  k = lower->ts.kind;
+		  e = gfc_get_constant_expr (BT_INTEGER, k, &sym->declared_at);
+		  mpz_add (e->value.integer, lower->value.integer,
+			   init->shape[dim]);
+		  mpz_sub_ui (e->value.integer, e->value.integer, 1);
+		  sym->as->upper[dim] = e;
+		}
+	      else
 		{
 		  gfc_error ("Non-constant lower bound in implied-shape"
 			     " declaration at %L", &lower->where);
 		  return false;
 		}
-
-	      /* All dimensions must be without upper bound.  */
-	      gcc_assert (!sym->as->upper[dim]);
-
-	      k = lower->ts.kind;
-	      e = gfc_get_constant_expr (BT_INTEGER, k, &sym->declared_at);
-	      mpz_add (e->value.integer,
-		       lower->value.integer, init->shape[dim]);
-	      mpz_sub_ui (e->value.integer, e->value.integer, 1);
-	      sym->as->upper[dim] = e;
 	    }
 
 	  sym->as->type = AS_EXPLICIT;
Index: gcc/testsuite/gfortran.dg/pr68053.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr68053.f90	(revision 0)
+++ gcc/testsuite/gfortran.dg/pr68053.f90	(working copy)
@@ -0,0 +1,10 @@
+! { dg-do run }
+! PR fortran/68053
+! Original code contributed by Gerhard Steinmetz
+! <gerhard dot steinmetx dot fortran at t-online dot de>
+program p
+   integer, parameter :: n(3) = [1,2,3]
+   integer, parameter :: x(1) = 7
+   integer, parameter :: z(n(2):*) = x
+   if (lbound(z,1) /= 2) call abort
+end

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] PR fortran/68053 -- Reduce initialization expression to constant value
  2015-11-08 22:37 ` Steve Kargl
@ 2015-11-09  5:38   ` Paul Richard Thomas
  0 siblings, 0 replies; 3+ messages in thread
From: Paul Richard Thomas @ 2015-11-09  5:38 UTC (permalink / raw)
  To: Steve Kargl; +Cc: fortran, gcc-patches

Dear Steve,

Thanks for beavering away on these front-end issues.

OK for trunk

Paul

On 8 November 2015 at 23:37, Steve Kargl
<sgk@troutmask.apl.washington.edu> wrote:
> On Sun, Nov 08, 2015 at 02:35:58PM -0800, Steve Kargl wrote:
>> The attached patch has been built and regression tested
>> on i386-*-freebsd and x86_64-*-freebsd.  If an array
>> index in an initialization expression is an array element
>> from an array named constant, the array index needs to be
>> reduced.  This patch causes the reduction to occur.
>> OK to commit?
>>
>> 2015-11-08  Steven g. Kargl  <kargl@gcc.gnu.org>
>>
>>       PR fortran/68053
>>       * decl.c (add_init_expr_to_sym):  Try to reduce initialization expression
>>       before testing for a constant value.
>>
>> 2015-11-08  Steven g. Kargl  <kargl@gcc.gnu.org>
>>
>>       PR fortran/68053
>>       * gfortran.dg/pr68053.f90: New test.
>
> Now with the patch attached!
>
> --
> Steve



-- 
Outside of a dog, a book is a man's best friend. Inside of a dog it's
too dark to read.

Groucho Marx

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-11-09  5:38 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-08 22:36 [PATCH] PR fortran/68053 -- Reduce initialization expression to constant value Steve Kargl
2015-11-08 22:37 ` Steve Kargl
2015-11-09  5:38   ` Paul Richard Thomas

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).