aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <burnus@gcc.gnu.org>2012-09-17 19:53:37 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2012-09-17 19:53:37 +0200
commit61aa9333bad2876fb298f454dfd3d42836226f5e (patch)
tree78a487dabf506ac90d65b5d1faa23368d7747b19
parentf588eb27dd5ec50e54b282096211228dead9d4ba (diff)
downloadgcc-61aa9333bad2876fb298f454dfd3d42836226f5e.zip
gcc-61aa9333bad2876fb298f454dfd3d42836226f5e.tar.gz
gcc-61aa9333bad2876fb298f454dfd3d42836226f5e.tar.bz2
re PR fortran/54608 (Wrong-code with SCAN and VERIFY)
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: New. From-SVN: r191403
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/simplify.c6
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/scan_2.f9035
4 files changed, 51 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 3d7e009..3552ffc 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+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 Janus Weil <janus@gcc.gnu.org>
PR fortran/54285
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)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f978693..6bebf2e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,4 +1,9 @@
-2012-09-14 Jason Merrill <jason@redhat.com>
+2012-09-17 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/54608
+ * gfortran.dg/scan_2.f90: New.
+
+2012-09-17 Jason Merrill <jason@redhat.com>
PR c++/53661
* g++.dg/init/aggr9.C: New.
diff --git a/gcc/testsuite/gfortran.dg/scan_2.f90 b/gcc/testsuite/gfortran.dg/scan_2.f90
new file mode 100644
index 0000000..1e68130
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/scan_2.f90
@@ -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" } }