Hi.

In r268092 there was added a code that guard the loop
in resolve_ref. Unfortunately, one needs to prevent execution
of 'prev = &(*prev)->next' that happens before the loop guard check.

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed?
Thanks,
Martin

gcc/fortran/ChangeLog:

2019-02-04  Martin Liska  <mli...@suse.cz>

        PR fortran/89185
        * resolve.c (resolve_ref): Remove breakout variable as
        we need to prevent prev = &(*prev)->next to happen
        with *prev == NULL.
---
 gcc/fortran/resolve.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)


diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 5e95777af55..92d27fc7632 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -5046,7 +5046,6 @@ resolve_ref (gfc_expr *expr)
   int current_part_dimension, n_components, seen_part_dimension;
   gfc_ref *ref, **prev;
   bool equal_length;
-  bool breakout;
 
   for (ref = expr->ref; ref; ref = ref->next)
     if (ref->type == REF_ARRAY && ref->u.ar.as == NULL)
@@ -5055,8 +5054,8 @@ resolve_ref (gfc_expr *expr)
 	break;
       }
 
-  breakout = false;
-  for (prev = &expr->ref; !breakout && *prev != NULL; prev = &(*prev)->next)
+  for (prev = &expr->ref; *prev != NULL;
+       prev = *prev == NULL ? prev : &(*prev)->next)
     switch ((*prev)->type)
       {
       case REF_ARRAY:
@@ -5082,8 +5081,6 @@ resolve_ref (gfc_expr *expr)
 	    expr->ts.u.cl = ref->u.ss.length;
 	    ref->u.ss.length = NULL;
 	    gfc_free_ref_list (ref);
-	    if (*prev == NULL)
-	      breakout = true;
 	  }
 	break;
       }

Reply via email to