From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa3.mentor.iphmx.com (esa3.mentor.iphmx.com [68.232.137.180]) by sourceware.org (Postfix) with ESMTPS id 57AF43971835; Tue, 16 Feb 2021 11:15:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 57AF43971835 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=Tobias_Burnus@mentor.com IronPort-SDR: McXzKipWHQvIvkMxHD+HA3w7hQOLLksmYb972EeHXwECzQL9DaHmrBournlD8u73uK9ecf4iD1 Q3hMO3cZYSQuKFGe5pbB5bfXB7+Nyh78vnVQG6yU1AA1e50XvJIMR9YH3mHcsPe57wGhJrOabk SE2ZDGZ0KXNk6pn0PwetAhoyP4+CnMiRJ+6SmbyKrvnU3G0/gktf4XF0JFIzNjnATlBlR8m3GL Gewpypw/7JqTI3F0a1VCaDGqvrvemPH7Hd+U548Q5IJn3M7H4Pjkt7YVWTsmYHCvxc3EgeVaH7 J24= X-IronPort-AV: E=Sophos;i="5.81,183,1610438400"; d="diff'?scan'208";a="58156840" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa3.mentor.iphmx.com with ESMTP; 16 Feb 2021 03:15:46 -0800 IronPort-SDR: wj9Z478jajV8zPcW6/wDqdROceMk+DSKml3MZTXgeO+kIGxo1uvshzXsf/UUIearEsUzCGhEIf 9lrk0AABO4S2mkLtgr0N2mWWK1rUx3rYf/byz3BNJPynJaQdduC3FuONbysKs5bIFj2zEmLKHh TKF4USEHcbf05dQsT4OkgxRdjV4v6Yzvb/Ko6nkhhc7/3Fvj67UC8XhLhuFn7fCXx0J8i59N/r mdoOpbgWHnqN2rCfhkbMXd/eNuAv8pzQ27WPBazFi89WY0n6S3RSnV5LPkznI89rd/JtHeIUD4 5jY= To: gcc-patches , fortran From: Tobias Burnus Subject: [Patch] Fortran: Reject DT as fmt in I/O statments [PR99111] Message-ID: Date: Tue, 16 Feb 2021 12:15:41 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------93B30BCA23C4CA23264D4A3A" Content-Language: en-US X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: SVR-IES-MBX-07.mgc.mentorg.com (139.181.222.7) To svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: fortran@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Fortran mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 16 Feb 2021 11:15:50 -0000 --------------93B30BCA23C4CA23264D4A3A Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: quoted-printable GCC started to accept as legacy extension array-valued non-characters, which works for integer (+ real/logical). Some other =E2=80=93 mostly unrelated patch regarding resolving array constructors (r10-5607-gde89b5748d68b76b, PR92996) turned this into an ICE. While it might be in theory fixable for derived types, just rejecting DT + CLASS + c_(fun)ptr makes more sense. I am not quite sure about the error-message wording. Better suggestions? In the 'rank > 0' branch, Hollerith should not occur and (as legacy extension) integer etc. are permitted. =E2=80=94 Thoughts? Otherwise: OK for GCC 11 and GCC 10? (ICE is new in GCC 10.) Tobias ----------------- Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 M=C3=BCnchen R= egistergericht M=C3=BCnchen HRB 106955, Gesch=C3=A4ftsf=C3=BChrer: Thomas H= eurung, Frank Th=C3=BCrauf --------------93B30BCA23C4CA23264D4A3A Content-Type: text/x-patch; charset="UTF-8"; name="fmt-fix.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="fmt-fix.diff" Fortran: Reject DT as fmt in I/O statments [PR99111] gcc/fortran/ChangeLog: PR fortran/99111 * io.c (resolve_tag_format): Reject BT_DERIVED/CLASS/VOID as (array-valued) FORMAT tag. gcc/testsuite/ChangeLog: PR fortran/99111 * gfortran.dg/fmt_nonchar_1.f90: New test. * gfortran.dg/fmt_nonchar_2.f90: New test. gcc/fortran/io.c | 7 +++++ gcc/testsuite/gfortran.dg/fmt_nonchar_1.f90 | 46 +++++++++++++++++++++++++++++ gcc/testsuite/gfortran.dg/fmt_nonchar_2.f90 | 22 ++++++++++++++ 3 files changed, 75 insertions(+) diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c index da6ad177ec3..40cd76eb585 100644 --- a/gcc/fortran/io.c +++ b/gcc/fortran/io.c @@ -1762,6 +1762,13 @@ resolve_tag_format (gfc_expr *e) It may be assigned an Hollerith constant. */ if (e->ts.type != BT_CHARACTER) { + if (e->ts.type == BT_DERIVED || e->ts.type == BT_CLASS + || e->ts.type == BT_VOID) + { + gfc_error ("Non-character non-Hollerith in FORMAT tag at %L", + &e->where); + return false; + } if (!gfc_notify_std (GFC_STD_LEGACY, "Non-character in FORMAT tag " "at %L", &e->where)) return false; diff --git a/gcc/testsuite/gfortran.dg/fmt_nonchar_1.f90 b/gcc/testsuite/gfortran.dg/fmt_nonchar_1.f90 new file mode 100644 index 00000000000..431b61569e2 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/fmt_nonchar_1.f90 @@ -0,0 +1,46 @@ +! { dg-do compile } +! +! PR fortran/99111 +! +program p + use iso_c_binding + implicit none + type t + integer :: a(1) + end type + type(t), parameter :: x(3) = [t(transfer('("he', 1)), & + t(transfer('llo ', 1)), & + t(transfer('W1")', 1))] + type t2 + procedure(), pointer, nopass :: ppt + end type t2 + type(t2) :: ppcomp(1) + interface + function fptr() + procedure(), pointer :: fptr + end function + end interface + class(t), allocatable :: cl(:) + type(c_ptr) :: cptr(1) + type(c_funptr) :: cfunptr(1) + procedure(), pointer :: proc + external proc2 + + print x ! { dg-error "Non-character non-Hollerith in FORMAT tag" } + print cl ! { dg-error "Non-character non-Hollerith in FORMAT tag" } + print cptr ! { dg-error "Non-character non-Hollerith in FORMAT tag" } + print cfunptr ! { dg-error "Non-character non-Hollerith in FORMAT tag" } + + print proc ! { dg-error "Syntax error in PRINT statement" } + print proc2 ! { dg-error "Syntax error in PRINT statement" } + print ppcomp%ppt ! { dg-error "Syntax error in PRINT statement" } + + print fptr() ! { dg-error "must be of type default-kind CHARACTER or of INTEGER" } + + call bar(1) +contains + subroutine bar (xx) + type(*) :: xx + print xx ! { dg-error "Assumed-type variable xx at ... may only be used as actual argument" } + end +end diff --git a/gcc/testsuite/gfortran.dg/fmt_nonchar_2.f90 b/gcc/testsuite/gfortran.dg/fmt_nonchar_2.f90 new file mode 100644 index 00000000000..7c0f524c3c9 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/fmt_nonchar_2.f90 @@ -0,0 +1,22 @@ +! { dg-do run } +! +! PR fortran/99111 +! +program p + implicit none + type t + integer :: a(1) + end type + type(t), parameter :: x(3) = [t(transfer('("he', 1)), & + t(transfer('llo ', 1)), & + t(transfer('W1")', 1))] + + integer, parameter :: y(3) = transfer('("hello W2")', 1, size=3) + real, parameter :: z(3) = transfer('("hello W3")', 1.0, size=3) + + print y ! { dg-warning "Legacy Extension: Non-character in FORMAT" } + print z ! { dg-warning "Legacy Extension: Non-character in FORMAT" } + print x%a(1) ! { dg-warning "Legacy Extension: Non-character in FORMAT" } +end + +! { dg-output "hello W2(\n|\r\n|\r)hello W3(\n|\r\n|\r)hello W1" } --------------93B30BCA23C4CA23264D4A3A--