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 <tkoe...@gcc.gnu.org> PR fortran/51338 * dependency.c (are_identical_variables): Handle case where end fields of substring references are NULL. 2011-11-29 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/51338 * gfortran.dg/assumed_charlen_substring_1.f90: New test.
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:
! { 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" } }