From: mikael Date: Sun, 2 Mar 2014 18:49:18 +0000 (+0000) Subject: fortran/ X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=75dfcf1c8caa3180aef81026a73d2ce4f5246ced 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@208259 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index a11df7ba89e..2763fb223f0 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 59e06410fe1..acfb14d069f 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 4475c32a8ff..b2e4e614bca 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 00000000000..84287b475a5 --- /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