From patchwork Sun Oct 31 21:35:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Harald Anlauf X-Patchwork-Id: 46876 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 83A1C385801D for ; Sun, 31 Oct 2021 21:36:32 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 83A1C385801D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1635716192; bh=UsUNxbM3lu8EIri7P860SI6xF20wgBAmwedcKS4aZ9Y=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=Wil0v6dtdQUzCfss1hYD1nVQBuIL33u5agIvbAy36w/o3s9QymCnokDEQuWC7fVnf vpT7ZdRJZvcv7+oNS8JiNjW+Iu/tlz7Ot8TDAnEVrQxLjf95h9gRQdUjGPjF7/VgQI kJaprHGfwO1EP8ZHnBWbOlXK7bdZehEFTh0IPpec= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) by sourceware.org (Postfix) with ESMTPS id 951CF3858413; Sun, 31 Oct 2021 21:35:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 951CF3858413 X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [79.232.144.179] ([79.232.144.179]) by web-mail.gmx.net (3c-app-gmx-bap16.server.lan [172.19.172.86]) (via HTTP); Sun, 31 Oct 2021 22:35:43 +0100 MIME-Version: 1.0 Message-ID: To: fortran , gcc-patches Subject: [PATCH] PR fortran/102715 - [12 Regression] ICE in gfc_simplify_transpose, at fortran/simplify.c:8184 Date: Sun, 31 Oct 2021 22:35:43 +0100 Importance: normal Sensitivity: Normal X-Priority: 3 X-Provags-ID: V03:K1:AjgkxT1PYHqtPQzJq+9/OAtpilZNhq87yvJZYvhxVzxsmCd69h1p8CC4SGBvivKgdzrxb XfvMkAEmjBhlzG+O8Wsn4E8iJr9v0A1A/1E+R4d+VE9cMvphMIHDfKMhkFzD3uwur63vilMhPGss yi9sYHvXcj29gAvjXz5T7o2ROQnrT3dvUAGzaqqv8l85/zYbvPiDPBNJ7XoZOb0GxwOGpFQ4x/6Z jef/OBnfAfN+dlG7mmKBkvwfizfxmfDrFKC73o5KGOnN3pl6dGTYoDFl/sgFHqzC00mAiRimbMsn ac= X-UI-Out-Filterresults: notjunk:1;V03:K0:Y/VgpoZcdZU=:qfSMVgWVGZSfX/OUw73R3R NsS+NxEF3AtWK37g83j8HIYfg7T4Ki3813sOkZiHiGz0nDbtvFZ9rVrqycUdVL/VZhXGXeisc 8ADhA1Beuk2KtOZ0d99hYNBdC6a5mrOS3pKlHZuV1XbXM8Dp9K6wjEG4wU8ISFrhtAYOLOQug HdmZWDLwx19+vlRTHR7kDa6l9Nuj97w7j3X/PA/aO0V20Cs/pEoi66+GyyA2hKv7Y+sMjIYIf 6LsK5YkLxtxM7VwvZbWspGa6ip6JHzthn+Mo4Cvr4NFS8AyoaN/gh0yKTDTWsynAdnqqGttWi lUyHkeclp9s5vWundgGOvpl9/T7VH6dukElyXz2DJqocA3xwQRJUxNXCV6nJG0z7abL1p3VPR VajAAVDni0lDttAzYDoGXly2w0cHuZzSxbdYJvscauD/FJ7Meq1RywyAbe/S76LBRAVwk/zpL JjPcgtKj0G7h0t3aYCQ55hlmvCGNWoCOKUq0RafleC7sn191Wwxn9D3l4SN1LnYLsx49Y0RVH vT83BAb0ba8CvAhP+QcSbYBmbHzfhEWvBH3pbm0NG52FBpuwCJj6eVW7r4t6Zkm07NXdE10ik D8mO17eRr1vrjLmiKtp28Plf84MLPQihEeAH+4rt3dyQTPN5yGbkbYoIxLHwTMg3uXICd/6vW mM4UNdIDosSOhAQ/DBcjUsFurVJygV6oY6K19D64v2pyKdjf0Sf4y/tN6GlofLFM/kh9zbcPg zIBfW7XZ5Km1OcJiH4Sb0/MFLJ7B/THdSsC0kZUN6uDSfTaKE7tDXUdjvz523pxCdQh4ggjnA o9dZEiQ X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, GIT_PATCH_0, KAM_NUMSUBJECT, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Harald Anlauf via Gcc-patches From: Harald Anlauf Reply-To: Harald Anlauf Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Dear Fortranners, the fix for initialization of DT arrays caused an apparent regression for cases where inconsistent ranks were used in such an initialization. This caused either an ICE in subsequent uses of these arrays, or showed up in valgrind as invalid reads, all of which seemed to be related to this rank mismatch. The cleanest solution seems to be to strictly reject rank mismatch earlier than we used to, which helps error recovery. I had to adjust one testcase accordingly. The place I inserted the check does not distinguish between explicit shape and implied shape. The Intel compiler does give a slightly different error message for the implied shape case. If anyone feels strongly about this, I'm open to suggestions for better choices of handling this. Regtested on x86_64-pc-linux-gnu. OK for mainline / affected branches? Thanks, Harald commit b1b5e5da928accfe02a7289a331cbea815255a16 Author: Harald Anlauf Date: Sun Oct 31 22:20:01 2021 +0100 Fortran: error recovery on rank mismatch of array and its initializer gcc/fortran/ChangeLog: PR fortran/102715 * decl.c (add_init_expr_to_sym): Reject rank mismatch between array and its initializer. gcc/testsuite/ChangeLog: PR fortran/102715 * gfortran.dg/pr68019.f90: Adjust error message. * gfortran.dg/pr102715.f90: New test. diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 2788348d1be..141fdef8c61 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -2105,6 +2105,14 @@ add_init_expr_to_sym (const char *name, gfc_expr **initp, locus *var_locus) } } + if (sym->attr.flavor == FL_PARAMETER && sym->attr.dimension && sym->as + && sym->as->rank && init->rank && init->rank != sym->as->rank) + { + gfc_error ("Rank mismatch of array at %L and its initializer " + "(%d/%d)", &sym->declared_at, sym->as->rank, init->rank); + return false; + } + /* If sym is implied-shape, set its upper bounds from init. */ if (sym->attr.flavor == FL_PARAMETER && sym->attr.dimension && sym->as->type == AS_IMPLIED_SHAPE) diff --git a/gcc/testsuite/gfortran.dg/pr102715.f90 b/gcc/testsuite/gfortran.dg/pr102715.f90 new file mode 100644 index 00000000000..7b29a1c05a6 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr102715.f90 @@ -0,0 +1,13 @@ +! { dg-do compile } +! PR fortran/102715 - ICE in gfc_simplify_transpose + +program p + type t + end type + type(t), parameter :: a(4) = t() + type(t), parameter :: b(2,2) = reshape(a, [2]) ! { dg-error "Rank mismatch" } + type(t), parameter :: c(2,2) = transpose(b) ! { dg-error "must be of rank 2" } + type(t), parameter :: s2(*) = b(2,:) ! { dg-error "Syntax error" } + type(t), parameter :: x(*,*) = reshape(a, [2]) ! { dg-error "Rank mismatch" } + type(t), parameter :: s3(*) = x(2,:) ! { dg-error "Syntax error" } +end diff --git a/gcc/testsuite/gfortran.dg/pr68019.f90 b/gcc/testsuite/gfortran.dg/pr68019.f90 index 2e304c3a260..77fd55bd331 100644 --- a/gcc/testsuite/gfortran.dg/pr68019.f90 +++ b/gcc/testsuite/gfortran.dg/pr68019.f90 @@ -9,5 +9,5 @@ program p integer :: n end type type(t), parameter :: vec(*) = [(t(i), i = 1, 4)] - type(t), parameter :: arr(*) = reshape(vec, [2, 2]) ! { dg-error "ranks 1 and 2 in assignment" } + type(t), parameter :: arr(*) = reshape(vec, [2, 2]) ! { dg-error "Rank mismatch" } end