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; }