From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2071) id E988638432DD; Sun, 4 Dec 2022 19:34:07 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E988638432DD DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1670182447; bh=yeUen7PqLN0u23E+X3jUVBiMDjszfL3uMnrQjOU5Z4A=; h=From:To:Subject:Date:From; b=o1H9DSt7qU9C4AF4ZDVX2+Sqcp+eU4O2seRDQAxge1MLw5pVpsDzHIIdFmpJXhKyP nK9dQJoQSMDpv6e/wahFN8LJvtDTT+bih44BCGLpC0Ja1agUArP8gulkyYUzcL2akF 3kK1wK8GTIYKI2EEgQsTVmnapy3eMVcYqpzEJHeQ= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Harald Anlauf To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-4484] Fortran: error recovery handling invalid CLASS variable [PR107899] X-Act-Checkin: gcc X-Git-Author: Harald Anlauf X-Git-Refname: refs/heads/master X-Git-Oldrev: 079add3ad39d6620d34665dd9c26c21951eb657c X-Git-Newrev: 9123863828b2f86e7a6aafba38738e7204ed19ca Message-Id: <20221204193407.E988638432DD@sourceware.org> Date: Sun, 4 Dec 2022 19:34:07 +0000 (GMT) List-Id: https://gcc.gnu.org/g:9123863828b2f86e7a6aafba38738e7204ed19ca commit r13-4484-g9123863828b2f86e7a6aafba38738e7204ed19ca Author: Harald Anlauf Date: Sat Dec 3 19:21:07 2022 +0100 Fortran: error recovery handling invalid CLASS variable [PR107899] gcc/fortran/ChangeLog: PR fortran/107899 * resolve.cc (resolve_deallocate_expr): Avoid NULL pointer dereference on invalid CLASS variable. gcc/testsuite/ChangeLog: PR fortran/107899 * gfortran.dg/pr107899.f90: New test. Diff: --- gcc/fortran/resolve.cc | 2 +- gcc/testsuite/gfortran.dg/pr107899.f90 | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index 3396c6ce4a7..75dc4b59105 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -7570,7 +7570,7 @@ resolve_deallocate_expr (gfc_expr *e) sym = e->symtree->n.sym; unlimited = UNLIMITED_POLY(sym); - if (sym->ts.type == BT_CLASS) + if (sym->ts.type == BT_CLASS && sym->attr.class_ok && CLASS_DATA (sym)) { allocatable = CLASS_DATA (sym)->attr.allocatable; pointer = CLASS_DATA (sym)->attr.class_pointer; diff --git a/gcc/testsuite/gfortran.dg/pr107899.f90 b/gcc/testsuite/gfortran.dg/pr107899.f90 new file mode 100644 index 00000000000..e47b57b7b91 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr107899.f90 @@ -0,0 +1,13 @@ +! { dg-do compile } +! { dg-options "-fcoarray=single" } +! PR fortran/107899 - ICE in resolve_deallocate_expr +! Contributed by G.Steinmetz + +program p + type t + end type + class(t), target :: x[:] ! { dg-error "deferred shape" } + if (allocated (x)) then ! { dg-error "must be ALLOCATABLE" } + deallocate (x) ! { dg-error "must be ALLOCATABLE or a POINTER" } + end if +end