Fortran: reject bad SIZE argument while simplifying ISHFTC [PR106911]
Checks
Commit Message
Dear all,
we should not try to simplify ISHFTC if the SIZE argument
is known to be outside the allowed range. It's better to
generate an error by terminating the simplification.
Regtested on x86_64-pc-linux-gnu. OK for mainline?
Thanks,
Harald
Comments
On Sat, Dec 10, 2022 at 10:14:06PM +0100, Harald Anlauf via Fortran wrote:
> Dear all,
>
> we should not try to simplify ISHFTC if the SIZE argument
> is known to be outside the allowed range. It's better to
> generate an error by terminating the simplification.
>
> Regtested on x86_64-pc-linux-gnu. OK for mainline?
>
Yes. Thanks for the patch.
From ae4438537fbc2ed04f3b0fb32d4e02b0ed6977a1 Mon Sep 17 00:00:00 2001
From: Harald Anlauf <anlauf@gmx.de>
Date: Sat, 10 Dec 2022 22:05:15 +0100
Subject: [PATCH] Fortran: reject bad SIZE argument while simplifying ISHFTC
[PR106911]
gcc/fortran/ChangeLog:
PR fortran/106911
* simplify.cc (gfc_simplify_ishftc): If the SIZE argument is known
to be outside the allowed range, terminate simplification.
gcc/testsuite/ChangeLog:
PR fortran/106911
* gfortran.dg/pr106911.f90: New test.
---
gcc/fortran/simplify.cc | 3 +++
gcc/testsuite/gfortran.dg/pr106911.f90 | 18 ++++++++++++++++++
2 files changed, 21 insertions(+)
create mode 100644 gcc/testsuite/gfortran.dg/pr106911.f90
@@ -3955,6 +3955,9 @@ gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
return NULL;
gfc_extract_int (sz, &ssize);
+
+ if (ssize > isize || ssize <= 0)
+ return &gfc_bad_expr;
}
else
ssize = isize;
new file mode 100644
@@ -0,0 +1,18 @@
+! { dg-do compile }
+! PR fortran/106911 - ICE in gfc_convert_mpz_to_signed
+! Contributed by G.Steinmetz
+
+program p
+ implicit none
+ integer, parameter :: a = 10
+ integer, parameter :: b = 20
+ integer, parameter :: c = ishftc(1_1, a, b) ! { dg-error "must be less than or equal" }
+ integer, parameter :: d = ishftc(1_1, a, 0) ! { dg-error "must be positive" }
+ interface
+ subroutine s
+ import :: a, b
+ integer, parameter :: e = ishftc(1_1, a, b) ! { dg-error "must be less than or equal" }
+ integer, parameter :: f = ishftc(1_1, a, 0) ! { dg-error "must be positive" }
+ end
+ end interface
+end
--
2.35.3