Hi PA,

Paul-Antoine Arras wrote:
I am not sure I am getting that part. Is this what you are suggesting?

Yes, something like that, but not quite, as you found out.

I think we need something like the following (untested):

diff --git gcc/fortran/openmp.cc gcc/fortran/openmp.cc
index 9d255558dc9..e3abbeeef98 100644
--- gcc/fortran/openmp.cc
+++ gcc/fortran/openmp.cc
@@ -6532,7 +6532,6 @@ gfc_match_omp_context_selector_specification (gfc_omp_declare_variant *odv)
 match
 gfc_match_omp_declare_variant (void)
 {
-  bool first_p = true;
   char buf[GFC_MAX_SYMBOL_LEN + 1];

   if (gfc_match (" (") != MATCH_YES)
@@ -6590,7 +6589,7 @@ gfc_match_omp_declare_variant (void)
       return MATCH_ERROR;
     }

-  bool has_match = false, has_adjust_args = false;
+  bool has_match = false, has_adjust_args = false, error_p = false;
   locus adjust_args_loc;

   for (;;)
@@ -6614,13 +6613,9 @@ gfc_match_omp_declare_variant (void)
     }
       else
     {
-      if (first_p)
-        {
-          gfc_error ("expected %<match%> or %<adjust_args%> at %C");
-          return MATCH_ERROR;
-        }
-      else
-        break;
+      if (!has_match)


if (gfc_match_omp_eos () != MATCH_YES)


+ error_p = true;
+      break;
     }

       if (gfc_match (" (") != MATCH_YES)
@@ -6666,8 +6661,12 @@ gfc_match_omp_declare_variant (void)
         for (gfc_omp_namelist *n = *head; n != NULL; n = n->next)
           n->u.need_device_ptr = true;
     }
+    }

-      first_p = false;
+  if (error_p)


if (error || (!has_match && !has_adjust_args))

as the missing 'match' is handled more explicitly by the next error.

+ {
+      gfc_error ("expected %<match%> or %<adjust_args%> at %C");
+      return MATCH_ERROR;
     }

* * *

The rest looks good to me.

Thanks,

Tobias


Reply via email to