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 856133858D20; Mon, 20 Feb 2023 20:42:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 856133858D20 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmx.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1676925762; i=anlauf@gmx.de; bh=33rEUMMVbwlu0/N9V5ccF2Uywtc91Irb4hkhXizQf5s=; h=X-UI-Sender-Class:From:To:Subject:Date; b=LRMbiVAGDrAOM4Lgq0Uh/s43NA/7LVEXfuBn5+UNSW1od4YU1Lsz1HXnkrNR1uvLs VKGFUK8BqcgnpFUiuaree8lnuaPZw0ATSF6p/2UWD3dEY6+EtUczBwqebq7TXL5dYu VlN4fKq0d82v5YsB5QYfUJaPBJemSdW+Wt19tf2b3I3M7ezWgrrE4qvtnrdLix5tFp zxZJfPLquG1dpDKazxFKFlbHhDRv8+kIVnoqUBDZ/05VA+WCcIwEI7FQ2VSopf7N8g KAudtlvuIOOomK2XKVs50/YZsdQ0f2UBV45PfV4JHt5C6bySgggQJt27imigQ4DaXI DHH+tzy06McFg== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from [93.207.80.146] ([93.207.80.146]) by web-mail.gmx.net (3c-app-gmx-bap60.server.lan [172.19.172.130]) (via HTTP); Mon, 20 Feb 2023 21:42:42 +0100 MIME-Version: 1.0 Message-ID: From: Harald Anlauf To: fortran , gcc-patches Subject: [PATCH] Fortran: improve checking of character length specification [PR96025] Content-Type: multipart/mixed; boundary=kenitram-c8bab8f4-8e95-4559-a2a6-820889d181fd Date: Mon, 20 Feb 2023 21:42:42 +0100 Importance: normal Sensitivity: Normal X-Priority: 3 X-Provags-ID: V03:K1:2zTYnoB5bC0d0G9Us9G2TlQIHEmyXxqhsICqDj3PLAZH2pVNwQ1RoUHb0rXsfKJvm7V01 ZucHHwVtr/0LCyFhU7p+cVyLsOST/vrY1C+9rGDeihvfKSInGh+5uGp9HZ7pixjywX1pHgfpiRmS THrLBG7oG5r5hnnuYYeHS+5YhpbFwRiQnWzs2m6Fv3f8XWmNZEMiaMUZiCl1bfSZv3yAhUe9b5dX hr5ZceO4DhabLcWhypzc6LRZOGeLl7apU+I3CpgLO6E6Mea2QcWqoqs7FCZ8q+Ccl7Mr8o1ebYLL Lw= UI-OutboundReport: notjunk:1;M01:P0:MWwcV/41s1A=;0Xf8vwEA+A/kAbz8IhH6S1H1fUt SwtKA0Ek4Ah8LuqE3oZkh34LsRKQbIo1SA0O3UBjjDbeJ4DOjiIb5IBMcVncAwZiDxez3Ejrz tAnCG9j/YLbsSPO2ij416HfAGtvyVejW6QO6eej6mvUJEoycFDwlUaELoWBhpqaBFR1XIqkXe nJs3R9jOdtY/k/rTeyJpTxml961IVBk+b9OR4Hh7tQlI1X8Wpf1P0CYthGTVYPJVnA5GgcHxN W9sfJ0XQtCsyhFWErzWGLbVj+rfmGUx7HnDShCzVHNnuIi2CnfFNVp9X06i6xY6n6Z0cxAcZn GJzAedZmW5wH5mVVb2mouCPkfvcVYgcwPJcHtuahIC5hhGpO7B1mw3DWZtwOXd/wxRxAxkAp4 +mOPrxSBJLXPOa4GrmdShDlrAT9fU9qcFO8Pr6+hAzzxQN3a3+WdRzkUtrVzoWMFxZaMjrMTr j3MoO1kZjnnnDjubUdzhGLdfMlYijEZYgGPKjlu8qemhZ5hFRWr7KdPcDLzwqkwlpDQvALct/ +F1Go00YzZTjDv+2iN1SWFSf+TxYGDSyQTtrZbBf3A8sPPOxccabykLTM4DN8hH1choFFEh5O jAQHzoZ0D6c2zaaG4V9DIQm83ssy56AghhwUA1u3U/+ZFeMoFGYSma1KYeswVFOWiqsri+NoN 7NpBsBb86x2RbSAW2kfd8I3rDx8R1nBLQRYcKLhrU38KgENRLE4trA8buG6IfpvF1iM+CMqGL DHCHzIbiewXTog65tF3tUaoI8xtbOwRl/xnM3ELICfsz7kZKHxGjrDsP9LJdg/JLLC0LWaIFA vl3tACa78yun3hR1D83zWGtispINdxnRBJy4RZQo/sD/Y= X-Spam-Status: No, score=-13.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_LOW,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --kenitram-c8bab8f4-8e95-4559-a2a6-820889d181fd Content-Type: text/plain; charset=UTF-8 Dear all, the attached patch fixes an ICE on invalid (non-integer) specification expressions for character length in function declarations. It appears that the error handling was already in place (mostly) and we need to essentially prevent run-on errors. Regtested on x86_64-pc-linux-gnu. OK for mainline? The PR is marked as a 10/11/12/13 regression, so I would like to backport this as far as it seems reasonable. Thanks, Harald --kenitram-c8bab8f4-8e95-4559-a2a6-820889d181fd Content-Type: text/x-patch Content-Disposition: attachment; filename=pr96025.diff Content-Transfer-Encoding: quoted-printable =46rom f581f63e206b54278c27a5c888c2566cb5077f11 Mon Sep 17 00:00:00 2001 From: Harald Anlauf Date: Mon, 20 Feb 2023 21:28:09 +0100 Subject: [PATCH] Fortran: improve checking of character length specificati= on [PR96025] gcc/fortran/ChangeLog: PR fortran/96025 * parse.cc (check_function_result_typed): Improve type check of specification expression for character length and return status. (parse_spec): Use status from above. * resolve.cc (resolve_fntype): Prevent use of invalid specification expression for character length. gcc/testsuite/ChangeLog: PR fortran/96025 * gfortran.dg/pr96025.f90: New test. =2D-- gcc/fortran/parse.cc | 23 ++++++++++++++++------- gcc/fortran/resolve.cc | 4 +++- gcc/testsuite/gfortran.dg/pr96025.f90 | 11 +++++++++++ 3 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/pr96025.f90 diff --git a/gcc/fortran/parse.cc b/gcc/fortran/parse.cc index f5154d97ae8..47876a3833e 100644 =2D-- a/gcc/fortran/parse.cc +++ b/gcc/fortran/parse.cc @@ -3974,21 +3974,30 @@ match_deferred_characteristics (gfc_typespec * ts) For return types specified in a FUNCTION prefix, the IMPLICIT rules of= the scope are not yet parsed so this has to be delayed up to parse_spec. = */ -static void +static bool check_function_result_typed (void) { gfc_typespec ts; gcc_assert (gfc_current_state () =3D=3D COMP_FUNCTION); - if (!gfc_current_ns->proc_name->result) return; + if (!gfc_current_ns->proc_name->result) + return true; ts =3D gfc_current_ns->proc_name->result->ts; /* Check type-parameters, at the moment only CHARACTER lengths possible= . */ /* TODO: Extend when KIND type parameters are implemented. */ if (ts.type =3D=3D BT_CHARACTER && ts.u.cl && ts.u.cl->length) - gfc_expr_check_typed (ts.u.cl->length, gfc_current_ns, true); + { + /* Reject invalid type of specification expression for length. */ + if (ts.u.cl->length->ts.type !=3D BT_INTEGER) + return false; + + gfc_expr_check_typed (ts.u.cl->length, gfc_current_ns, true); + } + + return true; } @@ -4097,8 +4106,8 @@ loop: if (verify_now) { - check_function_result_typed (); - function_result_typed =3D true; + if (check_function_result_typed ()) + function_result_typed =3D true; } } @@ -4111,8 +4120,8 @@ loop: case ST_IMPLICIT: if (!function_result_typed) { - check_function_result_typed (); - function_result_typed =3D true; + if (check_function_result_typed ()) + function_result_typed =3D true; } goto declSt; diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index fb0745927ac..427f901a438 100644 =2D-- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -17419,7 +17419,9 @@ resolve_fntype (gfc_namespace *ns) } } - if (sym->ts.type =3D=3D BT_CHARACTER) + if (sym->ts.type =3D=3D BT_CHARACTER + && sym->ts.u.cl->length + && sym->ts.u.cl->length->ts.type =3D=3D BT_INTEGER) gfc_traverse_expr (sym->ts.u.cl->length, sym, flag_fn_result_spec, 0)= ; } diff --git a/gcc/testsuite/gfortran.dg/pr96025.f90 b/gcc/testsuite/gfortra= n.dg/pr96025.f90 new file mode 100644 index 00000000000..ce292bd9664 =2D-- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr96025.f90 @@ -0,0 +1,11 @@ +! { dg-do compile } +! PR fortran/96025 - ICE in expr_check_typed_help +! Contributed by G.Steinmetz + +program p + print *, f() +contains + character(char(1)) function f() ! { dg-error "must be of INTEGER type" = } + f =3D 'f' + end +end =2D- 2.35.3 --kenitram-c8bab8f4-8e95-4559-a2a6-820889d181fd--