From patchwork Wed Nov 30 19:56:31 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [fortran] Fix PR 51338 - ICE with front-end optimization and assumed character lengths Date: Wed, 30 Nov 2011 09:56:31 -0000 From: Thomas Koenig X-Patchwork-Id: 128562 Message-Id: <4ED68A6F.101@netcologne.de> To: "fortran@gcc.gnu.org" , gcc-patches Hello world, the attached patch fixes PR 51338. I chose a different approach from what Bud did in the PR, because I rather wanted to fix the specific code path when two NULL expressions were handled to gfc_dep_compare_expr where determining the right answer is straightforward rather than possibly introducing a (future?) logic error. Regression-tested. OK for trunk? Thomas 2011-11-29 Thomas Koenig PR fortran/51338 * dependency.c (are_identical_variables): Handle case where end fields of substring references are NULL. 2011-11-29 Thomas Koenig PR fortran/51338 * gfortran.dg/assumed_charlen_substring_1.f90: New test. ! { dg-do compile } ! { dg-options "-O -fdump-tree-original" } ! PR 51338 - this used to ICE. ! Original test case by Bud Davis. subroutine foo(a,b) character(len=*) :: a if (a(1:) /= a(1:)) call do_not_use end subroutine foo ! { dg-final { scan-tree-dump-times "do_not_use" 0 "original" } } ! { dg-final { cleanup-tree-dump "original" } } Index: dependency.c =================================================================== --- dependency.c (Revision 181745) +++ dependency.c (Arbeitskopie) @@ -173,9 +173,18 @@ are_identical_variables (gfc_expr *e1, gfc_expr *e break; case REF_SUBSTRING: - if (gfc_dep_compare_expr (r1->u.ss.start, r2->u.ss.start) != 0 - || gfc_dep_compare_expr (r1->u.ss.end, r2->u.ss.end) != 0) + if (gfc_dep_compare_expr (r1->u.ss.start, r2->u.ss.start) != 0) return false; + + /* This can only happen for assumed-length character arguments. + If both are NULL, the end length compares equal, because we + are looking at the same variable. */ + if (r1->u.ss.end == NULL && r2->u.ss.end == NULL) + break; + + if (gfc_dep_compare_expr (r1->u.ss.end, r2->u.ss.end) != 0) + return false; + break; default: