From: Mikael Morin Date: Sun, 2 Mar 2014 18:49:18 +0000 (+0000) Subject: re PR fortran/60341 (ICE compiling Nonmem 6.2.0) X-Git-Tag: releases/gcc-4.7.4~216 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0cb04abc40c4fad870f18a940527db34a09e19ef;p=thirdparty%2Fgcc.git 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: r208259 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index a11df7ba89e9..2763fb223f0d 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2014-03-02 Mikael Morin + + PR fortran/60341 + * frontend-passes.c (optimize_comparison): Guard two union accesses + with the corresponding tag checks. + 2014-02-22 Mikael Morin PR fortran/59599 diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 59e06410fe1c..acfb14d069f4 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -883,7 +883,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 4475c32a8ff0..b2e4e614bcad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,9 +1,14 @@ +2014-03-02 Mikael Morin + + PR fortran/60341 + * gfortran.dg/str_comp_optimize_1.f90: New test. + 2014-02-26 Fabien Chêne - PR c++/37140 - * g++.dg/template/using27.C: New. - * g++.dg/template/using28.C: New. - * g++.dg/template/using29.C: New. + PR c++/37140 + * g++.dg/template/using27.C: New. + * g++.dg/template/using28.C: New. + * g++.dg/template/using29.C: New. 2014-02-22 Mikael Morin 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 000000000000..84287b475a5f --- /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 . +! Reduced by Steven G. Kargl . +! + + 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