From patchwork Tue Jan 13 21:18:49 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Janus Weil X-Patchwork-Id: 428694 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 1DC6D14016A for ; Wed, 14 Jan 2015 08:19:03 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:date:message-id:subject:from:to:content-type; q= dns; s=default; b=nqq5eeUJkUkAy0JQfXlr7EImTCSrFjXqEqw2T7Jh395P5/ UdeT5nzZL0Sq59pKlA/mTsVDsFkd4lNySY7lT/vc25CL5jM6kYymLSjvE7ftEcWL PnocX5tq4/acmvgSWyS/dz8+ZohVDV1BgU9VeRxruBJ+Qxl7832cUAJ8LxbPI= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:date:message-id:subject:from:to:content-type; s= default; bh=KTJx/fKyzpZHbsuNSjHxYhcfk3I=; b=fEYh1TACbZEtoC4E3FHx YgpHb/x9eV1VxfQP1M7hYyNZMd2WvQ+WDX+Fsfhqn69gzkyWDHqIe/3KNwirbi3i Njs/uYR9I8NtI5rx1pFAXv054t2TD2N+Wmh+UIC+6aUteWrZ2iVg/ABezTDhJkLK eUyBfLC1yCPr/GNMoOqTUJ8= Received: (qmail 7938 invoked by alias); 13 Jan 2015 21:18:56 -0000 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 Received: (qmail 7915 invoked by uid 89); 13 Jan 2015 21:18:55 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL, BAYES_00, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-Spam-User: qpsmtpd, 2 recipients X-HELO: mail-qa0-f53.google.com Received: from mail-qa0-f53.google.com (HELO mail-qa0-f53.google.com) (209.85.216.53) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Tue, 13 Jan 2015 21:18:52 +0000 Received: by mail-qa0-f53.google.com with SMTP id n4so3990873qaq.12; Tue, 13 Jan 2015 13:18:50 -0800 (PST) MIME-Version: 1.0 X-Received: by 10.140.22.233 with SMTP id 96mr910952qgn.86.1421183929725; Tue, 13 Jan 2015 13:18:49 -0800 (PST) Received: by 10.96.71.72 with HTTP; Tue, 13 Jan 2015 13:18:49 -0800 (PST) Date: Tue, 13 Jan 2015 22:18:49 +0100 Message-ID: Subject: [Patch, Fortran, F03] PR 58023: ICE on invalid with bad PPC declaration From: Janus Weil To: gfortran , gcc-patches Hi all, the attached patch fixes an ICE-on-invalid problem with procedure-pointer components by making sure that we continue resolving all components of a derived type, even after an error is thrown. Regtested on x86_64-unknown-linux-gnu. Ok for trunk? Cheers, Janus 2015-01-13 Janus Weil PR fortran/58023 * resolve.c (resolve_fl_derived0): Continue resolving next component after error. 2015-01-13 Janus Weil PR fortran/58023 * gfortran.dg/proc_ptr_comp_43.f90: New. Index: gcc/fortran/resolve.c =================================================================== --- gcc/fortran/resolve.c (Revision 219552) +++ gcc/fortran/resolve.c (Arbeitskopie) @@ -12389,7 +12389,7 @@ resolve_fl_derived0 (gfc_symbol *sym) { gfc_error ("Coarray component %qs at %L must be allocatable with " "deferred shape", c->name, &c->loc); - return false; + continue; } /* F2008, C443. */ @@ -12398,7 +12398,7 @@ resolve_fl_derived0 (gfc_symbol *sym) { gfc_error ("Component %qs at %L of TYPE(C_PTR) or TYPE(C_FUNPTR) " "shall not be a coarray", c->name, &c->loc); - return false; + continue; } /* F2008, C444. */ @@ -12409,7 +12409,7 @@ resolve_fl_derived0 (gfc_symbol *sym) gfc_error ("Component %qs at %L with coarray component " "shall be a nonpointer, nonallocatable scalar", c->name, &c->loc); - return false; + continue; } /* F2008, C448. */ @@ -12417,7 +12417,7 @@ resolve_fl_derived0 (gfc_symbol *sym) { gfc_error ("Component %qs at %L has the CONTIGUOUS attribute but " "is not an array pointer", c->name, &c->loc); - return false; + continue; } if (c->attr.proc_pointer && c->ts.interface) @@ -12427,7 +12427,7 @@ resolve_fl_derived0 (gfc_symbol *sym) if (!sym->attr.vtype && !check_proc_interface (ifc, &c->loc)) { c->tb->error = 1; - return false; + continue; } if (ifc->attr.if_source || ifc->attr.intrinsic) @@ -12471,7 +12471,10 @@ resolve_fl_derived0 (gfc_symbol *sym) gfc_charlen *cl = gfc_new_charlen (sym->ns, ifc->ts.u.cl); if (cl->length && !cl->resolved && !gfc_resolve_expr (cl->length)) - return false; + { + c->tb->error = 1; + continue; + } c->ts.u.cl = cl; } } @@ -12514,7 +12517,7 @@ resolve_fl_derived0 (gfc_symbol *sym) "at %L has no argument %qs", c->name, c->tb->pass_arg, &c->loc, c->tb->pass_arg); c->tb->error = 1; - return false; + continue; } } else @@ -12528,7 +12531,7 @@ resolve_fl_derived0 (gfc_symbol *sym) "must have at least one argument", c->name, &c->loc); c->tb->error = 1; - return false; + continue; } me_arg = c->ts.interface->formal->sym; } @@ -12544,7 +12547,7 @@ resolve_fl_derived0 (gfc_symbol *sym) " the derived type %qs", me_arg->name, c->name, me_arg->name, &c->loc, sym->name); c->tb->error = 1; - return false; + continue; } /* Check for C453. */ @@ -12554,7 +12557,7 @@ resolve_fl_derived0 (gfc_symbol *sym) "must be scalar", me_arg->name, c->name, me_arg->name, &c->loc); c->tb->error = 1; - return false; + continue; } if (me_arg->attr.pointer) @@ -12563,7 +12566,7 @@ resolve_fl_derived0 (gfc_symbol *sym) "may not have the POINTER attribute", me_arg->name, c->name, me_arg->name, &c->loc); c->tb->error = 1; - return false; + continue; } if (me_arg->attr.allocatable) @@ -12572,12 +12575,15 @@ resolve_fl_derived0 (gfc_symbol *sym) "may not be ALLOCATABLE", me_arg->name, c->name, me_arg->name, &c->loc); c->tb->error = 1; - return false; + continue; } if (gfc_type_is_extensible (sym) && me_arg->ts.type != BT_CLASS) - gfc_error ("Non-polymorphic passed-object dummy argument of %qs" - " at %L", c->name, &c->loc); + { + gfc_error ("Non-polymorphic passed-object dummy argument of %qs" + " at %L", c->name, &c->loc); + continue; + } }