From patchwork Sat Jan 29 14:24:06 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Mikael Morin X-Patchwork-Id: 50565 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 2780C385800D for ; Sat, 29 Jan 2022 14:24:36 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp.smtpout.orange.fr (smtp07.smtpout.orange.fr [80.12.242.129]) by sourceware.org (Postfix) with ESMTPS id 961F43858D28 for ; Sat, 29 Jan 2022 14:24:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 961F43858D28 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=orange.fr Authentication-Results: sourceware.org; spf=none smtp.mailfrom=orange.fr Received: from [192.168.1.17] ([86.253.179.215]) by smtp.orange.fr with ESMTPA id Doe6n4WU8zH5fDoeHn2nt6; Sat, 29 Jan 2022 15:24:18 +0100 X-ME-Helo: [192.168.1.17] X-ME-Auth: MDU4MTIxYWM4YWI0ZGE4ZTUwZWZmNTExZmI2ZWZlMThkM2ZhYiE5OWRkOGM= X-ME-Date: Sat, 29 Jan 2022 15:24:18 +0100 X-ME-IP: 86.253.179.215 Message-ID: <204cec48-ce99-500a-7951-939ee51d31d6@orange.fr> Date: Sat, 29 Jan 2022 15:24:06 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0 From: Mikael Morin To: gfortran , gcc-patches Content-Language: en-US Subject: [PATCH] fortran: Unshare associate var charlen [PR104228] X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE 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: , Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Hello, the attached patch is a fix for PR104228. Even if simple, I wouldn’t call it obvious, as it’s involving character length and associate, so I don’t mind some extra review eyes. Tested on x86_64-pc-linux-gnu. Ok for master/11/10/9? From 0819226560387b2953622ee3d5d051a35606d504 Mon Sep 17 00:00:00 2001 From: Mikael Morin Date: Fri, 28 Jan 2022 22:00:57 +0100 Subject: [PATCH] fortran: Unshare associate var charlen [PR104228] PR104228 showed that character lengths were shared between associate variable and associate targets. This is problematic when the associate target is itself a variable and gets a variable to hold the length, as the length variable is added (and all the variables following it in the chain) to both the associate variable scope and the target variable scope. This caused an ICE when compiling with -O0 -fsanitize=address. This change forces the creation of a separate character length for the associate variable. It also forces the initialization of the character length variable to avoid regressing associate_32 and associate_47 tests. gcc/fortran/ChangeLog: * resolve.cc (resolve_assoc_var): Also create a new character length for non-dummy associate targets. * trans-stmt.cc (trans_associate_var): Initialize character length even if no temporary is used for the associate variable. gcc/testsuite/ChangeLog: * gfortran.dg/asan/associate_1.f90: New test. * gfortran.dg/asan/associate_2.f90: New test. --- gcc/fortran/resolve.cc | 1 - gcc/fortran/trans-stmt.cc | 2 +- .../gfortran.dg/asan/associate_1.f90 | 19 +++++++++++++++++++ .../gfortran.dg/asan/associate_2.f90 | 19 +++++++++++++++++++ 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/asan/associate_1.f90 create mode 100644 gcc/testsuite/gfortran.dg/asan/associate_2.f90 diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index 835a4783718..266e41e25b1 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -9227,7 +9227,6 @@ resolve_assoc_var (gfc_symbol* sym, bool resolve_target) sym->ts.u.cl = target->ts.u.cl; if (sym->ts.deferred && target->expr_type == EXPR_VARIABLE - && target->symtree->n.sym->attr.dummy && sym->ts.u.cl == target->ts.u.cl) { sym->ts.u.cl = gfc_new_charlen (sym->ns, NULL); diff --git a/gcc/fortran/trans-stmt.cc b/gcc/fortran/trans-stmt.cc index 04f8147d23b..30b6bd5dd2a 100644 --- a/gcc/fortran/trans-stmt.cc +++ b/gcc/fortran/trans-stmt.cc @@ -1918,7 +1918,7 @@ trans_associate_var (gfc_symbol *sym, gfc_wrapped_block *block) gfc_conv_expr_descriptor (&se, e); if (sym->ts.type == BT_CHARACTER - && !se.direct_byref && sym->ts.deferred + && sym->ts.deferred && !sym->attr.select_type_temporary && VAR_P (sym->ts.u.cl->backend_decl) && se.string_length != sym->ts.u.cl->backend_decl) diff --git a/gcc/testsuite/gfortran.dg/asan/associate_1.f90 b/gcc/testsuite/gfortran.dg/asan/associate_1.f90 new file mode 100644 index 00000000000..b5ea75498b7 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/asan/associate_1.f90 @@ -0,0 +1,19 @@ +! { dg-do compile } +! { dg-additional-options "-O0" } +! +! PR fortran/104228 +! The code generated code for the program below wrongly pushed the Y character +! length variable to both P and S scope, which was leading to an ICE when +! address sanitizer was in effect + +program p + character(:), save, allocatable :: x(:) + call s +contains + subroutine s + associate (y => x) + y = [x] + end associate + end +end + diff --git a/gcc/testsuite/gfortran.dg/asan/associate_2.f90 b/gcc/testsuite/gfortran.dg/asan/associate_2.f90 new file mode 100644 index 00000000000..9bfb2bfbafb --- /dev/null +++ b/gcc/testsuite/gfortran.dg/asan/associate_2.f90 @@ -0,0 +1,19 @@ +! { dg-do compile } +! { dg-additional-options "-O0" } +! +! PR fortran/104228 +! The code generated code for the program below wrongly pushed the Y character +! length variable to both P and S scope, which was leading to an ICE when +! address sanitizer was in effect + +program p + character(:), allocatable :: x(:) + call s +contains + subroutine s + associate (y => x) + y = [x] + end associate + end +end + -- 2.34.1