Patchwork [Fortran] PR54608 - fix SCAN/VERIFY simplification

login
register
mail settings
Submitter Tobias Burnus
Date Sept. 17, 2012, 5:34 p.m.
Message ID <50575F14.7020904@net-b.de>
Download mbox | patch
Permalink /patch/184515/
State New
Headers show

Comments

Tobias Burnus - Sept. 17, 2012, 5:34 p.m.
gfortran shouldn't simplify SCAN/VERIFY if the BACK= argument is present 
but not a constant.

Build and regtested on x86-64-linux.
OK for the trunk?

Tobias
Steve Kargl - Sept. 17, 2012, 5:50 p.m.
On Mon, Sep 17, 2012 at 07:34:12PM +0200, Tobias Burnus wrote:
> gfortran shouldn't simplify SCAN/VERIFY if the BACK= argument is present 
> but not a constant.
> 
> Build and regtested on x86-64-linux.
> OK for the trunk?
> 

OK.

Patch

2012-09-17  Tobias Burnus  <burnus@net-b.de>

	PR fortran/54608
	* simplify.c (gfc_simplify_scan, gfc_simplify_verify):
	Fix handling of BACK=variable.

2012-09-17  Tobias Burnus  <burnus@net-b.de>

	PR fortran/54608
	* gfortran.dg/scan_2.f90

diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index 5aa2704..1c9dff2 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -5247,7 +5247,8 @@  gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
   if (k == -1)
     return &gfc_bad_expr;
 
-  if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT)
+  if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT
+      || ( b != NULL && b->expr_type !=  EXPR_CONSTANT))
     return NULL;
 
   if (b != NULL && b->value.logical != 0)
@@ -6335,7 +6336,8 @@  gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
   if (k == -1)
     return &gfc_bad_expr;
 
-  if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT)
+  if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT
+      || ( b != NULL && b->expr_type !=  EXPR_CONSTANT))
     return NULL;
 
   if (b != NULL && b->value.logical != 0)
--- /dev/null	2012-09-17 07:46:24.707708299 +0200
+++ gcc/gcc/testsuite/gfortran.dg/scan_2.f90	2012-09-17 18:10:31.000000000 +0200
@@ -0,0 +1,35 @@ 
+! { dg-do compile }
+! { dg-options "-fdump-tree-original" }
+!
+! PR fortran/54608
+!
+! Contributed by James Van Buskirk
+!
+module m1
+   implicit none
+   contains
+      subroutine s1(A)
+         logical A
+         integer iscan, iverify
+         character(7), parameter :: tf(2) = ['.FALSE.','.TRUE. ']
+
+         iscan = scan('AA','A',back=A)
+         iverify = verify('xx','A',back=A)
+         if (iscan /= 2 .or. iverify /= 2) call abort ()
+         print *, iverify, iscan
+!         write(*,'(a)') 'SCAN test: A = '//trim(tf(iscan)) ! should print true
+!         write(*,'(a)') 'VERIFY test: A = '//trim(tf(iverify)) ! should print true
+      end subroutine s1
+end module m1
+
+program p1
+   use m1
+   implicit none
+   logical B
+
+   call s1(.TRUE.)
+end program p1
+
+! { dg-final { scan-tree-dump-times "iscan = _gfortran_string_scan \\(2," 1 "original" } }
+! { dg-final { scan-tree-dump-times "iverify = _gfortran_string_verify \\(2," 1 "original" } }
+! { dg-final { cleanup-tree-dump "original" } }