diff options
author | Mikael Morin <mikael@gcc.gnu.org> | 2014-03-01 21:14:54 +0000 |
---|---|---|
committer | Mikael Morin <mikael@gcc.gnu.org> | 2014-03-01 21:14:54 +0000 |
commit | 2ce298900287e37c7442a413f658608c8ae22833 (patch) | |
tree | b9129c9449d200fd7c5ab98022a3e108749ee455 /gcc | |
parent | c582aac943fe2574a03cb5f557a3ee1e5d6585f1 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/frontend-passes.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/str_comp_optimize_1.f90 | 22 |
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 |