From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mout.gmx.net (mout.gmx.net [212.227.17.21]) by sourceware.org (Postfix) with ESMTPS id 29FF83858D28; Fri, 22 Sep 2023 19:16:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 29FF83858D28 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmx.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1695410195; x=1696014995; i=anlauf@gmx.de; bh=jBAPduteDYSPp0eLcLwbHrSSq7gcsEiHi/Jq4vngIiU=; h=X-UI-Sender-Class:From:To:Subject:Date; b=XR9Lg9rPQO4Ad3PI0wC+3O/rZOrKgweNYp1kXjfUg0UZ+tkytBohlyZ0spTDEA4JIE4ET2P/+S8 2yA8P9TY4L+QqgMnF87q/U3q4ua5uEI8PNeDo+loO8l2m8GaKuE8Kq90oev+PekhRQU+J+rE9KwTE nypxKwHPOHvjZzHA4xzyZrpntTl9onGh98JrBIHbStitQ6M9RbFx+glYqavRdTAl1rQFvu5RSwXgX FV9saAgZOdtDO+PdqhInJ2zsr14FSfzTxZaCpAMMag90bvkL9QS+MRb1sIrz6QEo/Kt9yZK12lBEd 6WqK5Dara+2UU2OI5ANR+w7xRc5gdUvOtzkA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from [79.232.154.30] ([79.232.154.30]) by web-mail.gmx.net (3c-app-gmx-bap04.server.lan [172.19.172.74]) (via HTTP); Fri, 22 Sep 2023 21:16:35 +0200 MIME-Version: 1.0 Message-ID: From: Harald Anlauf To: fortran , gcc-patches Subject: [PATCH] fortran: error recovery on duplicate declaration of class variable [PR95710] Content-Type: multipart/mixed; boundary=rekceb-31a303ae-957c-4a8a-a36d-04cc9ee14931 Date: Fri, 22 Sep 2023 21:16:35 +0200 Importance: normal Sensitivity: Normal X-Priority: 3 X-Provags-ID: V03:K1:LBjFRnEKshD4X0+hxKUqvrdKUCjb2ZbPo2Ko76TGS52FhSS01JnRm/tNv0XVqA/AB6RRe +/mLLybl/JwM4Ja9eBCs8f2Zm67RfGYNZ6EweKFqXfCbPRF88e1yRPD20dEmSKMaA6yG5Gufb1Kd 6AtP2KgHE0kW5hKjbjuWlRaIZ616cP/T2pev5HYVP1DHfEH+3UJFJWoywnGdJJSCaDVCumSqVOPz Be7MPzf+nsjwNR16dlxYMmOZ43gegd0ib1zE+HiQtdL3kwMpdDdVaprco2OEfK8TXV5eaLZeUuLx N0= UI-OutboundReport: notjunk:1;M01:P0:NMA1eydau5s=;4i/KGyj8cK1J7ELA10eK1xsTPTb tJzf5N8GAA5+0SagvY3xshXqQkPiK4kAb+NLgvS7ACl49BITx7bcdUAFbdHHf+ZRo7HLOt1nX nJSBp4ZHoZsLs1E8R//IBGotIPQpr/sjb6djSbeEghcmUutFgKyJlggWFoaswOarVYxoTxEkC YKWjDC42N9uYEl2eCFIgpsp55PtZRYYDLaHc/GSs2MfhFw6uQvkXX6cs2Rw+gJylzQa0cyVQv Ypj8OJLb4qTh8cvvvPSuH2TakqsgPtzH6DnoXuWMehDLyq8n3OY2tdvCAnddm5CsskLs5MyTZ vkgYUCgm6FI5kX7k3pM1IbF/7fdV/Hqipz8nzV0OuQxJaNMZPLTSIa5/pLPzwRDfMAuMpAm2p k+vLmYSPvhg0IDosT9PcdCXOdmflsKJjY2aGC7gZtZWcrDTxHCOqcATBhElNmnc4ZJhFAm6qO nST4SvSTBZvMzA+UVvH27w1WHjSdceabTEG3MwB2hw/AoO40//ocKSYHERtudwFnH/nOxi8O8 UFu3QouImTrszqG+SwQUCVQquK24BEblpRSEEPPtBLgAWjdzgUZaUALdGdGofJ1EBOh7lSLHg ObLrApq2rYfDD18SNCQkpIlhowIPmi+1yAd8hoWllHT6nFbCQntpU3kNOpbc5MAbUzCt7BVPC UBSr87fjH0seHjSPN2fkvKv2rN9KPj/Gm4zPnmWP7CVLNiyg8sc8oKNk7wNdCyRGlpa0/oEVf F9yTPO0tFu5TYaOPzpbL4lmydo4sbjABaq9vqnSJXcl88T4FfO84dQhw5hPMaP8SvB3bhSZeD OQwl5xSpOaYNBtvj4YCzQ19A== X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --rekceb-31a303ae-957c-4a8a-a36d-04cc9ee14931 Content-Type: text/plain; charset=UTF-8 Dear all, the attached simple and obvious patch fixes several NULL pointer dereferences that are encountered for a duplicate declaration of a class variable. Another one from Gerhard's torture tests... Regtested on x86_64-pc-linux-gnu. I intend to commit within 24h unless there are comments. Thanks, Harald --rekceb-31a303ae-957c-4a8a-a36d-04cc9ee14931 Content-Type: text/x-patch Content-Disposition: attachment; filename=pr95710.diff Content-Transfer-Encoding: quoted-printable =46rom 0027c58c172889bdb5c09ecea0faf3c48624dc21 Mon Sep 17 00:00:00 2001 From: Harald Anlauf Date: Fri, 22 Sep 2023 21:06:00 +0200 Subject: [PATCH] fortran: error recovery on duplicate declaration of class variable [PR95710] gcc/fortran/ChangeLog: PR fortran/95710 * class.cc (gfc_build_class_symbol): Do not try to build class container for invalid typespec. * resolve.cc (resolve_fl_var_and_proc): Prevent NULL pointer dereference. (resolve_symbol): Likewise. gcc/testsuite/ChangeLog: PR fortran/95710 * gfortran.dg/pr95710.f90: New test. =2D-- gcc/fortran/class.cc | 4 ++++ gcc/fortran/resolve.cc | 4 +++- gcc/testsuite/gfortran.dg/pr95710.f90 | 17 +++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/pr95710.f90 diff --git a/gcc/fortran/class.cc b/gcc/fortran/class.cc index 9d0c802b867..5c43b77dba3 100644 =2D-- a/gcc/fortran/class.cc +++ b/gcc/fortran/class.cc @@ -647,6 +647,10 @@ gfc_build_class_symbol (gfc_typespec *ts, symbol_attr= ibute *attr, gcc_assert (as); + /* We cannot build the class container now. */ + if (attr->class_ok && (!ts->u.derived || !ts->u.derived->components)) + return false; + /* Class container has already been built with same name. */ if (attr->class_ok && ts->u.derived->components->attr.dimension >=3D attr->dimension diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index 1042b8c18e8..861f69ac20f 100644 =2D-- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -13326,6 +13326,7 @@ resolve_fl_var_and_proc (gfc_symbol *sym, int mp_f= lag) && sym->ts.u.derived && !sym->attr.select_type_temporary && !UNLIMITED_POLY (sym) + && CLASS_DATA (sym) && CLASS_DATA (sym)->ts.u.derived && !gfc_type_is_extensible (CLASS_DATA (sym)->ts.u.derived)) { @@ -16068,7 +16069,8 @@ resolve_symbol (gfc_symbol *sym) specification_expr =3D saved_specification_expr; } - if (sym->ts.type =3D=3D BT_CLASS && sym->attr.class_ok && sym->ts.u.der= ived) + if (sym->ts.type =3D=3D BT_CLASS && sym->attr.class_ok && sym->ts.u.der= ived + && CLASS_DATA (sym)) { as =3D CLASS_DATA (sym)->as; class_attr =3D CLASS_DATA (sym)->attr; diff --git a/gcc/testsuite/gfortran.dg/pr95710.f90 b/gcc/testsuite/gfortra= n.dg/pr95710.f90 new file mode 100644 index 00000000000..566c38d0a9d =2D-- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr95710.f90 @@ -0,0 +1,17 @@ +! { dg-do compile } +! PR fortran/95710 - ICE on duplicate declaration of class variable +! Contributed by G.Steinmetz + +module m + interface + module function s() + end + end interface +end +submodule(m) m2 +contains + module function s() + class(*), allocatable :: x + class(*), allocatable :: x ! { dg-error "Unclassifiable statement" } + end +end =2D- 2.35.3 --rekceb-31a303ae-957c-4a8a-a36d-04cc9ee14931--