From patchwork Sun Jan 23 21:08:41 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Harald Anlauf X-Patchwork-Id: 50371 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 2CDFA3858426 for ; Sun, 23 Jan 2022 21:09:29 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2CDFA3858426 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1642972169; bh=uJ2KSzC+wzWMZ1jiG51UhdoeehG3jT9RQ5BArRJKq+Y=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=nWMqmpYLfz1ifRlCjBTD8+5kZiubn8vyTGQjr1076Ro1uzwej5zlp+kfr5XBCPpU+ UxQMGz3EySuK70os6Kbmqaqh/dI26j0YAnHfsrusVe3O4p5Ot6v4NVWcaOC4DugMwV ddQiG7flhAebuOd+mJodu4CBjdyP+Zuk00BqRurk= 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.20]) by sourceware.org (Postfix) with ESMTPS id DE83F3858D28; Sun, 23 Jan 2022 21:08:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org DE83F3858D28 X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [93.207.84.202] ([93.207.84.202]) by web-mail.gmx.net (3c-app-gmx-bs60.server.lan [172.19.170.144]) (via HTTP); Sun, 23 Jan 2022 22:08:41 +0100 MIME-Version: 1.0 Message-ID: To: fortran , gcc-patches Subject: [PATCH] PR fortran/104128 - ICE in gfc_widechar_to_char, at fortran/scanner.c:199 Date: Sun, 23 Jan 2022 22:08:41 +0100 Importance: normal Sensitivity: Normal X-Priority: 3 X-Provags-ID: V03:K1:RYuESTZiW/VwDx0/CFwXFJ/YeTIanccZsg09nhIUW4963i4ZY4KPfSLVBvNSgHH9+M72C uPbwTrJ9jFOvSPaAq4cnc+QX6R4whg/KzgWMQNV1r5Xav32xIjWUTv3xcrc7NCvNCtqYxQVZGLKf +a8FAvS0MuvAPaB7vTFdKxfn0/1ChHO0jN8DE5UT/RWrx3BYd6ywvTkBgB594xq+0ZyjCRxDGZpF javQtktNy1aT5qJ6iWV52UAOjLkqhBWRdqI7EZuZDe4VsN86b2gdvX3BY6cyzE4IPlelVIpxhe4d +w= X-UI-Out-Filterresults: notjunk:1;V03:K0:/TAkebOBSH8=:+fKNp44ZRHXpz2ys9wN2AA 0y1ykHVZBZ0bjeQ3PEVu1TfURrheEomKtBDXNLVk+eE/9VFTTUnhHHB8RsElhgAWDhY5Mlu9j lK9oKaSkhKtvQ/Ox9QliPtVK8UDD7TZNpmAK+yg+BtYtcG8sLrzKK8OIlMBDRVqpqlwJqDCVH LKcsh9HZYKkQloLiQsaXk0oQEXozhkE221s/ddi7lUmKg7gj7exWrqOoppg9QFxHToMTvLdIz F1lbRvflUeDVyWcbr9C/wJU1/fImtlhiMUU/LCXPuzfT35wuGHZGnAu35ODzYK2/MfqamAgwp u4M1pdwLVgkuFZa/kBW1cFbD/ykddniGqDXDsupEifXe3KYInvJUJ5QKDFI2ilLiPvQ9DzMEB c6kS3/Jl7Vx9CJsNCWTV1qRKW3bgeE60+MmB+gCj2Oshlku3M5Kv+eUCmbC4agk2PmWhwO8Lj qRcOV4jpKo0y76kHd7V/w66ZvhM69q4CyEGyHzcm85OAGcLoUxN8f0FfR9HuyZMUSA8HAG0hJ DMDYBrzdsmZaXy5KAqMeZtfiFRvNOeuWz6kep5QzM0hGINcf7ltAqqIfBpoi1owcCfOUHyhKU JB/OMAXyLCqt05uGDEuqIBc3TmP6zxMYDD1HYqD21tLkFCpghGYZFnxjuludT/1yUVQYLioq3 +pz8LuoxNX9iulJk1tvJq7iaAZ/i/hwni/DvkLuIdVcU/Oyj+QohWeCzHrlnPrbArPHYKTB34 kK4iEToXRwrJglmJFeXpKPbn+13NT+GKLgb976wZSpAJugThNPtEq8eUFgJTAV9BoMa8eV63g UtkpKsP X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, FREEMAIL_FROM, GIT_PATCH_0, KAM_NUMSUBJECT, RCVD_IN_DNSWL_LOW, 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, conversions between different character kinds using TRANSFER exhibit inconsistencies that can occur between expr->representation.string (which is char*) on the one hand, and expr->->value.character.string. One issue (in target-memory.cc) is easily fixed by simply passing a conversion flag that was likely forgotten in the past. The other issue happens in gfc_copy_expr. Before we unconditionally converted an existing representation.string to wide char, which is definitely wrong. Restricting that code path to default character kind fixed the problems I could find and produces dumps that looked fine to me. Maybe some expert here can find a better fix. Regtested on x86_64-pc-linux-gnu. OK for mainline? Maybe 11-branch? Thanks, Harald From ddf161bd2b4de1c0a9655cb61634d94c857b458b Mon Sep 17 00:00:00 2001 From: Harald Anlauf Date: Sun, 23 Jan 2022 21:55:33 +0100 Subject: [PATCH] Fortran: fix issues with internal conversion between default and wide char gcc/fortran/ChangeLog: PR fortran/104128 * expr.cc (gfc_copy_expr): Convert internal representation of string to wide char in value only for default character kind. * target-memory.cc (interpret_array): Pass flag for conversion of wide chars. (gfc_target_interpret_expr): Likewise. gcc/testsuite/ChangeLog: PR fortran/104128 * gfortran.dg/transfer_simplify_14.f90: New test. --- gcc/fortran/expr.cc | 3 ++- gcc/fortran/target-memory.cc | 7 ++--- .../gfortran.dg/transfer_simplify_14.f90 | 27 +++++++++++++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/transfer_simplify_14.f90 diff --git a/gcc/fortran/expr.cc b/gcc/fortran/expr.cc index 279d9b30991..ed82a94022f 100644 --- a/gcc/fortran/expr.cc +++ b/gcc/fortran/expr.cc @@ -312,7 +312,8 @@ gfc_copy_expr (gfc_expr *p) break; case BT_CHARACTER: - if (p->representation.string) + if (p->representation.string + && p->ts.kind == gfc_default_character_kind) q->value.character.string = gfc_char_to_widechar (q->representation.string); else diff --git a/gcc/fortran/target-memory.cc b/gcc/fortran/target-memory.cc index 361907b0e51..7ce7d736629 100644 --- a/gcc/fortran/target-memory.cc +++ b/gcc/fortran/target-memory.cc @@ -365,7 +365,8 @@ gfc_target_encode_expr (gfc_expr *source, unsigned char *buffer, static size_t -interpret_array (unsigned char *buffer, size_t buffer_size, gfc_expr *result) +interpret_array (unsigned char *buffer, size_t buffer_size, gfc_expr *result, + bool convert_widechar) { gfc_constructor_base base = NULL; size_t array_size = 1; @@ -390,7 +391,7 @@ interpret_array (unsigned char *buffer, size_t buffer_size, gfc_expr *result) gfc_constructor_append_expr (&base, e, &result->where); ptr += gfc_target_interpret_expr (&buffer[ptr], buffer_size - ptr, e, - true); + convert_widechar); } result->value.constructor = base; @@ -580,7 +581,7 @@ gfc_target_interpret_expr (unsigned char *buffer, size_t buffer_size, gfc_expr *result, bool convert_widechar) { if (result->expr_type == EXPR_ARRAY) - return interpret_array (buffer, buffer_size, result); + return interpret_array (buffer, buffer_size, result, convert_widechar); switch (result->ts.type) { diff --git a/gcc/testsuite/gfortran.dg/transfer_simplify_14.f90 b/gcc/testsuite/gfortran.dg/transfer_simplify_14.f90 new file mode 100644 index 00000000000..dfb997d81b2 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/transfer_simplify_14.f90 @@ -0,0 +1,27 @@ +! { dg-do compile } +! { dg-options "-fdump-tree-original" } +! PR fortran/104128 - ICE in gfc_widechar_to_char +! Contributed by G.Steinmetz + +program p + implicit none + integer, parameter :: k = 4 + character(*), parameter :: a = 'abc' + character(*,kind=4), parameter :: b = 'abc' + character(2,kind=k), parameter :: s = k_"FG" + character(*,kind=1), parameter :: x = transfer (s, 'abcdefgh') + character(2,kind=k), parameter :: t = transfer (x, s) + character(2,kind=k) :: u = transfer (x, s) + logical, parameter :: l = (s == t) + print *, transfer (a , 4_'xy', size=2) + print *, transfer ('xyz', [b], size=2) + print *, s + print *, t + print *, u + if (.not. l) stop 1 + if (t /= s) stop 2 + if (u /= s) stop 3 ! not optimized away +end + +! { dg-final { scan-tree-dump-times "_gfortran_stop_numeric" 1 "original" } } +! { dg-final { scan-tree-dump "_gfortran_stop_numeric \\(3, 0\\);" "original" } } -- 2.31.1