Hi all,

the attached patch does a little cleanup: It occurred to me recently
that 'gfc_extend_expr' has an argument 'real_error', which is a bit
awkward. Its function would be better encoded in an enhanced range of
return values. What the patch does is to change the return value from
'gfc_try' (SUCCESS/FAILURE) to 'match'
(MATCH_YES/MATCH_NO/MATCH_ERROR). Of course we're not really
'matching' anything here, but the yes/no/error range of values is
exactly what we need in this case, so I think (ab-)using the 'match'
enum makes sense.

Regtested on x86_64-unknown-linux-gnu. Ok for trunk?

Cheers,
Janus


2011-11-02  Janus Weil  <ja...@gcc.gnu.org>

        * gfortran.h (gfc_extend_expr): Modified prototype.
        * interface.c (gfc_extend_expr): Return 'match' instead of 'gfc_try'.
        Remove argument 'real_error'.
        * resolve.c (resolve_operator): Modified call to 'gfc_extend_expr'.
Index: gcc/fortran/interface.c
===================================================================
--- gcc/fortran/interface.c	(revision 180696)
+++ gcc/fortran/interface.c	(working copy)
@@ -3220,12 +3220,10 @@ build_compcall_for_operator (gfc_expr* e, gfc_actu
    with the operator.  This subroutine builds an actual argument list
    corresponding to the operands, then searches for a compatible
    interface.  If one is found, the expression node is replaced with
-   the appropriate function call.
-   real_error is an additional output argument that specifies if FAILURE
-   is because of some real error and not because no match was found.  */
+   the appropriate function call.  */
 
-gfc_try
-gfc_extend_expr (gfc_expr *e, bool *real_error)
+match
+gfc_extend_expr (gfc_expr *e)
 {
   gfc_actual_arglist *actual;
   gfc_symbol *sym;
@@ -3239,7 +3237,6 @@ build_compcall_for_operator (gfc_expr* e, gfc_actu
   actual = gfc_get_actual_arglist ();
   actual->expr = e->value.op.op1;
 
-  *real_error = false;
   gname = NULL;
 
   if (e->value.op.op2 != NULL)
@@ -3343,16 +3340,16 @@ build_compcall_for_operator (gfc_expr* e, gfc_actu
 
 	  result = gfc_resolve_expr (e);
 	  if (result == FAILURE)
-	    *real_error = true;
+	    return MATCH_ERROR;
 
-	  return result;
+	  return MATCH_YES;
 	}
 
       /* Don't use gfc_free_actual_arglist().  */
       free (actual->next);
       free (actual);
 
-      return FAILURE;
+      return MATCH_NO;
     }
 
   /* Change the expression node to a function call.  */
@@ -3365,12 +3362,9 @@ build_compcall_for_operator (gfc_expr* e, gfc_actu
   e->user_operator = 1;
 
   if (gfc_resolve_expr (e) == FAILURE)
-    {
-      *real_error = true;
-      return FAILURE;
-    }
+    return MATCH_ERROR;
 
-  return SUCCESS;
+  return MATCH_YES;
 }
 
 
Index: gcc/fortran/gfortran.h
===================================================================
--- gcc/fortran/gfortran.h	(revision 180696)
+++ gcc/fortran/gfortran.h	(working copy)
@@ -2831,7 +2831,7 @@ void gfc_procedure_use (gfc_symbol *, gfc_actual_a
 void gfc_ppc_use (gfc_component *, gfc_actual_arglist **, locus *);
 gfc_symbol *gfc_search_interface (gfc_interface *, int,
 				  gfc_actual_arglist **);
-gfc_try gfc_extend_expr (gfc_expr *, bool *);
+match gfc_extend_expr (gfc_expr *);
 void gfc_free_formal_arglist (gfc_formal_arglist *);
 gfc_try gfc_extend_assign (gfc_code *, gfc_namespace *);
 gfc_try gfc_add_interface (gfc_symbol *);
Index: gcc/fortran/resolve.c
===================================================================
--- gcc/fortran/resolve.c	(revision 180696)
+++ gcc/fortran/resolve.c	(working copy)
@@ -4034,11 +4034,10 @@ resolve_operator (gfc_expr *e)
 bad_op:
 
   {
-    bool real_error;
-    if (gfc_extend_expr (e, &real_error) == SUCCESS)
+    match m = gfc_extend_expr (e);
+    if (m == MATCH_YES)
       return SUCCESS;
-
-    if (real_error)
+    if (m == MATCH_ERROR)
       return FAILURE;
   }
 

Reply via email to