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