From patchwork Fri Mar 13 10:33:36 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Vehreschild X-Patchwork-Id: 449907 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 DC56C1400DE for ; Fri, 13 Mar 2015 21:33:52 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass reason="1024-bit key; unprotected key" header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=fm1iTXga; dkim-adsp=none (unprotected policy); dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:subject:message-id:mime-version:content-type; q=dns; s= default; b=xPuBnOOhsLjjbHjX9kPqH59CvuL9wS7ZE/BRqcv1U9EyzrzavYpru ISCeG3bCAF8AFiRgzKG9UKDQ9hxXlSLrID0Bamvozhu+BrYjufyoAPHgtP0iW4ls 1n2t2a6Owh8iXyjXwFuMOABiSn2KQFiAMYBB/Gzj9sobkM+PbQBh0Q= 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:date :from:to:subject:message-id:mime-version:content-type; s= default; bh=jlHTAqrCcMJp1MPhPDIpdS4/azo=; b=fm1iTXgaXjJXbWeaQpcB c3bgJTT5aBEI4v6rTU3NO5rSOOQNYl546KdSO+5tW8lwzkO5uaNNJ5e6dVppVGb4 uwpsKbwUMvJL2QfGhDIc6kisD+lqrbUTtF8y50yi0YbJWTdZMtDaXeDvLv30DzWn PR96TmAF6HkMfDAHkyDRiPE= Received: (qmail 120286 invoked by alias); 13 Mar 2015 10:33:43 -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 120264 invoked by uid 89); 13 Mar 2015 10:33:42 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 X-Spam-User: qpsmtpd, 2 recipients X-HELO: mout.gmx.net Received: from mout.gmx.net (HELO mout.gmx.net) (212.227.17.22) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Fri, 13 Mar 2015 10:33:40 +0000 Received: from vepi2 ([88.75.104.20]) by mail.gmx.com (mrgmx101) with ESMTPSA (Nemesis) id 0MfAog-1Yu3w30cBO-00Olgq; Fri, 13 Mar 2015 11:33:37 +0100 Date: Fri, 13 Mar 2015 11:33:36 +0100 From: Andre Vehreschild To: GCC-Patches-ML , GCC-Fortran-ML Subject: [Patch, Fortran] Prevent segfault on illegal input Message-ID: <20150313113336.154f327b@vepi2> MIME-Version: 1.0 X-UI-Out-Filterresults: notjunk:1; Hi all, during debugging I found a segfault of gfortran, when it encounters an illegal fortran code. The mistake in Fortran is flagged correctly, but later gfortran crashes. This patch prevents the crash. Bootstraps and regtest ok on x86_64-linux-gnu. Ok for trunk? Regards, Andre diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 942a9ad..465cf2b 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -2639,6 +2639,10 @@ found: expr->ts = sym->ts; expr->value.function.name = sym->name; expr->value.function.esym = sym; + /* Prevent crash when sym->ts.u.derived->components is not set due to previous + error(s). */ + if (sym->ts.type == BT_CLASS && !CLASS_DATA (sym)) + return MATCH_ERROR; if (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->as) expr->rank = CLASS_DATA (sym)->as->rank; else if (sym->as != NULL) diff --git a/gcc/testsuite/gfortran.dg/pointer_2.f90 b/gcc/testsuite/gfortran.dg/pointer_2.f90 new file mode 100644 index 0000000..d3b95d6 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pointer_2.f90 @@ -0,0 +1,18 @@ +! { dg-do compile } +! Check that the compiler reports the errors, but does not segfault. +! Contributed by: Andre Vehreschild +! +program test + implicit none + class(*), pointer :: P + class(*), allocatable :: P2 + + allocate(P2, source=convertType(P)) + +contains + + function convertType(in) ! { dg-error "must be dummy, allocatable or pointer" } + class(*), intent(in) :: in + class(*) :: convertType + end function +end program test