PR fortran/83344 Don't set bogus constant value

Message ID 1514482664-30807-1-git-send-email-blomqvist.janne@gmail.com
State New
Headers show
Series
  • PR fortran/83344 Don't set bogus constant value
Related show

Commit Message

Janne Blomqvist Dec. 28, 2017, 5:37 p.m.
This patch does not fix PR 83344, but merely fixes an error where we
used to set a constant character length value from a non-constant
expression, and thus set it to some bogus value.

As a result of this, I have commented out part of the associate_22.f90
test which otherwise generates a warning message.

Regtested on x86_64-pc-linux-gnu, unless there are objections I'll
commit this to trunk in a few days?

gcc/fortran/ChangeLog:

2017-12-28  Janne Blomqvist  <jb@gcc.gnu.org>

	PR fortran/83344
	* resolve.c (resolve_assoc_var): Don't set the constant value
	unless the target is a constant expression.

gcc/testsuite/ChangeLog:

2017-12-28  Janne Blomqvist  <jb@gcc.gnu.org>

	PR fortran/83344
	* gfortran.dg/associate_22.f90: Comment out part of test.
---
 gcc/fortran/resolve.c                      | 3 ++-
 gcc/testsuite/gfortran.dg/associate_22.f90 | 9 +++++----
 2 files changed, 7 insertions(+), 5 deletions(-)

-- 
2.7.4

Comments

Steve Kargl Dec. 28, 2017, 6:07 p.m. | #1
On Thu, Dec 28, 2017 at 07:37:44PM +0200, Janne Blomqvist wrote:
> This patch does not fix PR 83344, but merely fixes an error where we

> used to set a constant character length value from a non-constant

> expression, and thus set it to some bogus value.

> 

> As a result of this, I have commented out part of the associate_22.f90

> test which otherwise generates a warning message.

> 

> Regtested on x86_64-pc-linux-gnu, unless there are objections I'll

> commit this to trunk in a few days?

> 


This looks ok to me.

-- 
Steve

Patch

diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index f819b71..cf75a78 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -8627,7 +8627,8 @@  resolve_assoc_var (gfc_symbol* sym, bool resolve_target)
       if (!sym->ts.u.cl)
 	sym->ts.u.cl = target->ts.u.cl;
 
-      if (!sym->ts.u.cl->length && !sym->ts.deferred)
+      if (!sym->ts.u.cl->length && !sym->ts.deferred
+	  && target->expr_type == EXPR_CONSTANT)
 	sym->ts.u.cl->length
 	  = gfc_get_int_expr (gfc_default_integer_kind,
 			      NULL, target->value.character.length);
diff --git a/gcc/testsuite/gfortran.dg/associate_22.f90 b/gcc/testsuite/gfortran.dg/associate_22.f90
index 1558992..edf5932 100644
--- a/gcc/testsuite/gfortran.dg/associate_22.f90
+++ b/gcc/testsuite/gfortran.dg/associate_22.f90
@@ -24,10 +24,11 @@  program foo
    end associate
 
    ! This failed.
-   a = trim(s) // 'abc'
-   associate(w => trim(s) // 'abc')
-      if (trim(w) /= trim(a)) call abort
-   end associate
+   ! This still doesn't work correctly, see PR 83344
+!   a = trim(s) // 'abc'
+!   associate(w => trim(s) // 'abc')
+!      if (trim(w) /= trim(a)) call abort
+!   end associate
 
    ! This failed.
    associate(x => trim('abc'))