aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikael Morin <mikael@gcc.gnu.org>2014-03-01 21:14:54 +0000
committerMikael Morin <mikael@gcc.gnu.org>2014-03-01 21:14:54 +0000
commit2ce298900287e37c7442a413f658608c8ae22833 (patch)
treeb9129c9449d200fd7c5ab98022a3e108749ee455
parentc582aac943fe2574a03cb5f557a3ee1e5d6585f1 (diff)
downloadgcc-2ce298900287e37c7442a413f658608c8ae22833.zip
gcc-2ce298900287e37c7442a413f658608c8ae22833.tar.gz
gcc-2ce298900287e37c7442a413f658608c8ae22833.tar.bz2
re PR fortran/60341 (ICE compiling Nonmem 6.2.0)
fortran/ PR fortran/60341 * frontend-passes.c (optimize_comparison): Guard two union accesses with the corresponding tag checks. testsuite/ PR fortran/60341 * gfortran.dg/str_comp_optimize_1.f90: New test. From-SVN: r208249
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/frontend-passes.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/str_comp_optimize_1.f9022
4 files changed, 35 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 415a4cb..549421f 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2014-03-01 Mikael Morin <mikael@gcc.gnu.org>
+
+ PR fortran/60341
+ * frontend-passes.c (optimize_comparison): Guard two union accesses
+ with the corresponding tag checks.
+
2014-02-28 Janus Weil <janus@gcc.gnu.org>
PR fortran/60359
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c
index 52bd700..e663868 100644
--- a/gcc/fortran/frontend-passes.c
+++ b/gcc/fortran/frontend-passes.c
@@ -1391,7 +1391,9 @@ optimize_comparison (gfc_expr *e, gfc_intrinsic_op op)
/* Replace A // B < A // C with B < C, and A // B < C // B
with A < C. */
if (op1->ts.type == BT_CHARACTER && op2->ts.type == BT_CHARACTER
+ && op1->expr_type == EXPR_OP
&& op1->value.op.op == INTRINSIC_CONCAT
+ && op2->expr_type == EXPR_OP
&& op2->value.op.op == INTRINSIC_CONCAT)
{
gfc_expr *op1_left = op1->value.op.op1;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d7ef999..dd9dcba 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-03-01 Mikael Morin <mikael@gcc.gnu.org>
+
+ PR fortran/60341
+ * gfortran.dg/str_comp_optimize_1.f90: New test.
+
2014-03-01 Oleg Endo <olegendo@gcc.gnu.org>
PR target/60071
diff --git a/gcc/testsuite/gfortran.dg/str_comp_optimize_1.f90 b/gcc/testsuite/gfortran.dg/str_comp_optimize_1.f90
new file mode 100644
index 0000000..84287b4
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/str_comp_optimize_1.f90
@@ -0,0 +1,22 @@
+! { dg-do compile }
+! { dg-options "-ffrontend-optimize" }
+!
+! PR fortran/60341
+! An unguarded union access was wrongly enabling a frontend optimization on a
+! string comparison, leading to an ICE.
+!
+! Original testcase from Steve Chapel <steve.chapel@a2pg.com>.
+! Reduced by Steven G. Kargl <kargl@gcc.gnu.org>.
+!
+
+ subroutine modelg(ncm)
+ implicit none
+ integer, parameter :: pc = 30, pm = pc - 1
+ integer i
+ character*4 catt(pm,2)
+ integer ncm,iatt(pm,pc)
+ do i=1,ncm
+ if (catt(i,1)//catt(i,2).eq.'central') exit
+ end do
+ iatt(i,4)=1
+ end