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" } }

Reply via email to