From patchwork Thu Nov 3 21:56:47 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Janus Weil X-Patchwork-Id: 123513 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id E5AD7B6F88 for ; Fri, 4 Nov 2011 08:59:32 +1100 (EST) Received: (qmail 873 invoked by alias); 3 Nov 2011 21:59:28 -0000 Received: (qmail 857 invoked by uid 22791); 3 Nov 2011 21:59:27 -0000 X-SWARE-Spam-Status: No, hits=-2.1 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW X-Spam-Check-By: sourceware.org Received: from mail-yw0-f47.google.com (HELO mail-yw0-f47.google.com) (209.85.213.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 03 Nov 2011 21:59:12 +0000 Received: by ywf9 with SMTP id 9so1980031ywf.20 for ; Thu, 03 Nov 2011 14:59:12 -0700 (PDT) MIME-Version: 1.0 Received: by 10.150.141.5 with SMTP id o5mr7743609ybd.13.1320357409398; Thu, 03 Nov 2011 14:56:49 -0700 (PDT) Received: by 10.147.137.17 with HTTP; Thu, 3 Nov 2011 14:56:47 -0700 (PDT) In-Reply-To: <20111103000451.GA15310@troutmask.apl.washington.edu> References: <20111103000451.GA15310@troutmask.apl.washington.edu> Date: Thu, 3 Nov 2011 22:56:47 +0100 Message-ID: Subject: Re: [Patch, Fortran] Cleanup of gfc_extend_expr From: Janus Weil To: Steve Kargl Cc: Steven Bosscher , gfortran , gcc-patches Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org > At least add a comment about the re-use (abuse?) of the > enum. Updated patch attached, which adds a short comment on the usage of 'match'. > This should reduce confusion months from when > someone wonders why gfc_extend_expr returns a "match" > for a non-matching function. Well, I think my approach is not as far-fetched as you seem to imply: There are already a good number of procedures which use the 'match' enum, although they're not related to matching at all. Listing only those that occur in gfortran.h (I'm sure there are more): * match gfc_mod_pointee_as (gfc_array_spec *); * match gfc_intrinsic_func_interface (gfc_expr *, int); * match gfc_intrinsic_sub_interface (gfc_code *, int); * match gfc_iso_c_sub_interface(gfc_code *, gfc_symbol *); The reason for this is of course that the YES/NO/ERROR triple is not only useful in matching, but also in many other situations. Cheers, Janus Index: gcc/fortran/interface.c =================================================================== --- gcc/fortran/interface.c (revision 180820) +++ gcc/fortran/interface.c (working copy) @@ -3220,12 +3220,11 @@ 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. We use the 'match' enum to specify + whether a replacement has been made or not, or if an error occurred. */ -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 +3238,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 +3341,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 +3363,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 180820) +++ 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 180820) +++ 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; }