This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch, fortran] Implementation of F2018 SELECT RANK


In resolve_select_rank you have a comment about casading error.

+   /* Loop over RANK cases. Note that returning on the errors causes a
+      cascade of further errors because the case blocks do not compile
+      correctly.  */

Shouldn't gfortran stop looping if an error occurs?  See below...


+   for (body = code->block; body; body = body->block)
+     {
+       c = body->ext.block.case_list;
+       if (c->low)
+  case_value = (int) mpz_get_si (c->low->value.integer);
+       else
+  case_value = -2;
+ 
+       /* Check for repeated cases.  */
+       for (tail = code->block; tail; tail = tail->block)
+  {
+    gfc_case *d = tail->ext.block.case_list;
+    int case_value2;
+ 
+    if (tail == body)
+      break;
+ 
+    /* Check F2018: C1153.  */
+    if (!c->low && !d->low)
+      gfc_error ("RANK DEFAULT at %L is repeated at %L",
+          &c->where, &d->where);

here

+ 
+    if (!c->low || !d->low)
+      continue;
+ 
+    /* Check F2018: C1153.  */
+    case_value2 = (int) mpz_get_si (d->low->value.integer);
+    if ((case_value == case_value2) && case_value == -1)
+      gfc_error ("RANK (*) at %L is repeated at %L",
+          &c->where, &d->where);

here

+    else if (case_value == case_value2)
+      gfc_error ("RANK (%i) at %L is repeated at %L",
+          case_value, &c->where, &d->where);

here

+  }
+ 
+       if (!c->low)
+         continue;
+ 
+       /* Check F2018: C1155.  */
+       if (case_value == -1 && (gfc_expr_attr (code->expr1).allocatable
+           || gfc_expr_attr (code->expr1).pointer))
+  gfc_error ("RANK (*) at %L cannot be used with the pointer or "
+      "allocatable selector at %L", &c->where, &code->expr1->where);

here

+ 
+       if (case_value == -1 && (gfc_expr_attr (code->expr1).allocatable
+           || gfc_expr_attr (code->expr1).pointer))
+  gfc_error ("RANK (*) at %L cannot be used with the pointer or "
+      "allocatable selector at %L", &c->where, &code->expr1->where);

and here.

+     }


I would expect

    if (error)
      {
        gfc_error ();
	return;
      }

The early return will likely lead to a different cascade of errors. :(

-- 
Steve


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]