From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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: From: Harald Anlauf To: fortran , gcc-patches Subject: [PATCH] PR fortran/104128 - ICE in gfc_widechar_to_char, at fortran/scanner.c:199 Content-Type: multipart/mixed; boundary=kenitram-88c119bb-8bfb-4a21-80eb-46e24b251c2a 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: 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: Sun, 23 Jan 2022 21:08:45 -0000 --kenitram-88c119bb-8bfb-4a21-80eb-46e24b251c2a Content-Type: text/plain; charset=UTF-8 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 --kenitram-88c119bb-8bfb-4a21-80eb-46e24b251c2a Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Fortran-fix-issues-with-internal-conversion-between-.patch Content-Transfer-Encoding: quoted-printable =46rom 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 defa= ult 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. =2D-- 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 =2D-- 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 =3D=3D gfc_default_character_kind) q->value.character.string =3D 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 =2D-- a/gcc/fortran/target-memory.cc +++ b/gcc/fortran/target-memory.cc @@ -365,7 +365,8 @@ gfc_target_encode_expr (gfc_expr *source, unsigned cha= r *buffer, static size_t -interpret_array (unsigned char *buffer, size_t buffer_size, gfc_expr *res= ult) +interpret_array (unsigned char *buffer, size_t buffer_size, gfc_expr *res= ult, + bool convert_widechar) { gfc_constructor_base base =3D NULL; size_t array_size =3D 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 +=3D gfc_target_interpret_expr (&buffer[ptr], buffer_size - ptr= , e, - true); + convert_widechar); } result->value.constructor =3D 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 =3D=3D 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/test= suite/gfortran.dg/transfer_simplify_14.f90 new file mode 100644 index 00000000000..dfb997d81b2 =2D-- /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 =3D 4 + character(*), parameter :: a =3D 'abc' + character(*,kind=3D4), parameter :: b =3D 'abc' + character(2,kind=3Dk), parameter :: s =3D k_"FG" + character(*,kind=3D1), parameter :: x =3D transfer (s, 'abcdefgh') + character(2,kind=3Dk), parameter :: t =3D transfer (x, s) + character(2,kind=3Dk) :: u =3D transfer (x, s) + logical, parameter :: l =3D (s =3D=3D t) + print *, transfer (a , 4_'xy', size=3D2) + print *, transfer ('xyz', [b], size=3D2) + print *, s + print *, t + print *, u + if (.not. l) stop 1 + if (t /=3D s) stop 2 + if (u /=3D 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\\);" "origi= nal" } } =2D- 2.31.1 --kenitram-88c119bb-8bfb-4a21-80eb-46e24b251c2a--