From: Bernhard Reutner-Fischer <al...@gcc.gnu.org>

The openmp part will be cleaned up later in this series.

gcc/fortran/ChangeLog:

2017-10-22  Bernhard Reutner-Fischer  <al...@gcc.gnu.org>

        * match.h (gfc_match_defined_op_name): Adjust prototype and add
        a parameter USER_OPERATOR.
        * matchexp.c (gfc_match_defined_op_name): Use gfc_get_string and
        return a user operator if USER_OPERATOR is true.
        (match_defined_operator): Update calls to gfc_match_defined_op_name.
        * interface.c (gfc_match_generic_spec): Likewise.
        * openmp.c (gfc_match_omp_clauses): Likewise. Use gfc_get_string
        where appropriate.
        (gfc_match_omp_declare_reduction): Likewise.
---
 gcc/fortran/interface.c |  5 +++--
 gcc/fortran/match.h     |  2 +-
 gcc/fortran/matchexp.c  | 18 ++++++++++++------
 gcc/fortran/openmp.c    | 31 +++++++++++++++++--------------
 4 files changed, 33 insertions(+), 23 deletions(-)

diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index f85c76bad0f..14137cebd6c 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -160,7 +160,8 @@ gfc_match_generic_spec (interface_type *type,
   *op = INTRINSIC_NONE;
   if (gfc_match (" operator ( ") == MATCH_YES)
     {
-      m = gfc_match_defined_op_name (buffer, 1);
+      const char *oper = NULL;
+      m = gfc_match_defined_op_name (oper, 1, 0);
       if (m == MATCH_NO)
        goto syntax;
       if (m != MATCH_YES)
@@ -172,7 +173,7 @@ gfc_match_generic_spec (interface_type *type,
       if (m != MATCH_YES)
        return MATCH_ERROR;
 
-      strcpy (name, buffer);
+      strcpy (name, oper);
       *type = INTERFACE_USER_OP;
       return MATCH_YES;
     }
diff --git a/gcc/fortran/match.h b/gcc/fortran/match.h
index 418542bd5a6..b3ced3f8454 100644
--- a/gcc/fortran/match.h
+++ b/gcc/fortran/match.h
@@ -315,7 +315,7 @@ match gfc_match_write (void);
 match gfc_match_print (void);
 
 /* matchexp.c.  */
-match gfc_match_defined_op_name (char *, int);
+match gfc_match_defined_op_name (const char *&, int, bool);
 match gfc_match_expr (gfc_expr **);
 
 /* module.c.  */
diff --git a/gcc/fortran/matchexp.c b/gcc/fortran/matchexp.c
index fb81e10a6c2..bb01af9f636 100644
--- a/gcc/fortran/matchexp.c
+++ b/gcc/fortran/matchexp.c
@@ -30,10 +30,14 @@ static const char expression_syntax[] = N_("Syntax error in 
expression at %C");
 
 /* Match a user-defined operator name.  This is a normal name with a
    few restrictions.  The error_flag controls whether an error is
-   raised if 'true' or 'false' are used or not.  */
+   raised if 'true' or 'false' are used or not.
+   If USER_OPERATOR is true, a user operator is returned in RESULT
+   upon success.
+ */
 
 match
-gfc_match_defined_op_name (char *result, int error_flag)
+gfc_match_defined_op_name (const char *&result, int error_flag,
+    bool user_operator)
 {
   static const char * const badops[] = {
     "and", "or", "not", "eqv", "neqv", "eq", "ne", "ge", "le", "lt", "gt",
@@ -72,8 +76,10 @@ gfc_match_defined_op_name (char *result, int error_flag)
        gfc_error ("Bad character %qc in OPERATOR name at %C", name[i]);
        return MATCH_ERROR;
       }
-
-  strcpy (result, name);
+  if (user_operator)
+    result = gfc_get_string (".%s.", name);
+  else
+    result = gfc_get_string ("%s", name);
   return MATCH_YES;
 
 error:
@@ -91,10 +97,10 @@ error:
 static match
 match_defined_operator (gfc_user_op **result)
 {
-  char name[GFC_MAX_SYMBOL_LEN + 1];
+  const char *name = NULL;
   match m;
 
-  m = gfc_match_defined_op_name (name, 0);
+  m = gfc_match_defined_op_name (name, 0, 0);
   if (m != MATCH_YES)
     return m;
 
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index 94a7f7eaa50..a852fc490db 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -1581,6 +1581,7 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const 
omp_mask mask,
            {
              gfc_omp_reduction_op rop = OMP_REDUCTION_NONE;
              char buffer[GFC_MAX_SYMBOL_LEN + 3];
+             const char *op = NULL;
              if (gfc_match_char ('+') == MATCH_YES)
                rop = OMP_REDUCTION_PLUS;
              else if (gfc_match_char ('*') == MATCH_YES)
@@ -1596,13 +1597,10 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const 
omp_mask mask,
              else if (gfc_match (".neqv.") == MATCH_YES)
                rop = OMP_REDUCTION_NEQV;
              if (rop != OMP_REDUCTION_NONE)
-               snprintf (buffer, sizeof buffer, "operator %s",
+               op = gfc_get_string ("operator %s",
                          gfc_op2string ((gfc_intrinsic_op) rop));
-             else if (gfc_match_defined_op_name (buffer + 1, 1) == MATCH_YES)
-               {
-                 buffer[0] = '.';
-                 strcat (buffer, ".");
-               }
+             else if (gfc_match_defined_op_name (op, 1, 1) == MATCH_YES)
+               ;
              else if (gfc_match_name (buffer) == MATCH_YES)
                {
                  gfc_symbol *sym;
@@ -1660,9 +1658,13 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const 
omp_mask mask,
                }
              else
                buffer[0] = '\0';
-             gfc_omp_udr *udr
-               = (buffer[0]
-                  ? gfc_find_omp_udr (gfc_current_ns, buffer, NULL) : NULL);
+             gfc_omp_udr *udr;
+             if (op != NULL)
+               udr = gfc_find_omp_udr (gfc_current_ns, op, NULL);
+             else if (buffer[0])
+               udr = gfc_find_omp_udr (gfc_current_ns, buffer, NULL);
+             else
+               udr = NULL;
              gfc_omp_namelist **head = NULL;
              if (rop == OMP_REDUCTION_NONE && udr)
                rop = OMP_REDUCTION_USER;
@@ -1678,7 +1680,7 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const 
omp_mask mask,
                      n = *head;
                      *head = NULL;
                      gfc_error_now ("!$OMP DECLARE REDUCTION %s not found "
-                                    "at %L", buffer, &old_loc);
+                                    "at %L", op ? op : buffer, &old_loc);
                      gfc_free_omp_namelist (n);
                    }
                  else
@@ -2801,6 +2803,7 @@ gfc_match_omp_declare_reduction (void)
   match m;
   gfc_intrinsic_op op;
   char name[GFC_MAX_SYMBOL_LEN + 3];
+  const char *oper = NULL;
   auto_vec<gfc_typespec, 5> tss;
   gfc_typespec ts;
   unsigned int i;
@@ -2818,20 +2821,20 @@ gfc_match_omp_declare_reduction (void)
     return MATCH_ERROR;
   if (m == MATCH_YES)
     {
-      snprintf (name, sizeof name, "operator %s", gfc_op2string (op));
+      oper = gfc_get_string ("operator %s", gfc_op2string (op));
+      strcpy (name, oper);
       rop = (gfc_omp_reduction_op) op;
     }
   else
     {
-      m = gfc_match_defined_op_name (name + 1, 1);
+      m = gfc_match_defined_op_name (oper, 1, 1);
       if (m == MATCH_ERROR)
        return MATCH_ERROR;
       if (m == MATCH_YES)
        {
-         name[0] = '.';
-         strcat (name, ".");
          if (gfc_match (" : ") != MATCH_YES)
            return MATCH_ERROR;
+         strcpy (name, oper);
        }
       else
        {
-- 
2.19.0.rc1

Reply via email to