aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2024-01-05 23:38:56 +0100
committerHarald Anlauf <anlauf@gmx.de>2024-01-06 13:14:48 +0100
commit723bd722d616bbb427264930986f080d89207caa (patch)
tree3e979d8689fd14ca17cf724e6541099761771f46 /gcc
parentfefbd85b72729cec99a6e71e5c8b637948c8ed79 (diff)
downloadgcc-723bd722d616bbb427264930986f080d89207caa.zip
gcc-723bd722d616bbb427264930986f080d89207caa.tar.gz
gcc-723bd722d616bbb427264930986f080d89207caa.tar.bz2
Fortran: bogus warnings with REPEAT intrinsic and -Wconversion-extra [PR96724]
gcc/fortran/ChangeLog: PR fortran/96724 * iresolve.cc (gfc_resolve_repeat): Force conversion to gfc_charlen_int_kind before call to gfc_multiply. gcc/testsuite/ChangeLog: PR fortran/96724 * gfortran.dg/repeat_8.f90: New test. Co-authored-by: José Rui Faustino de Sousa <jrfsousa@gmail.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/iresolve.cc10
-rw-r--r--gcc/testsuite/gfortran.dg/repeat_8.f90123
2 files changed, 132 insertions, 1 deletions
diff --git a/gcc/fortran/iresolve.cc b/gcc/fortran/iresolve.cc
index 5bb0bbc..c961cdb 100644
--- a/gcc/fortran/iresolve.cc
+++ b/gcc/fortran/iresolve.cc
@@ -2363,7 +2363,15 @@ gfc_resolve_repeat (gfc_expr *f, gfc_expr *string,
}
if (tmp)
- f->ts.u.cl->length = gfc_multiply (tmp, gfc_copy_expr (ncopies));
+ {
+ /* Force-convert to gfc_charlen_int_kind before gfc_multiply. */
+ gfc_expr *e = gfc_copy_expr (ncopies);
+ gfc_typespec ts = tmp->ts;
+ ts.kind = gfc_charlen_int_kind;
+ gfc_convert_type_warn (e, &ts, 2, 0);
+ gfc_convert_type_warn (tmp, &ts, 2, 0);
+ f->ts.u.cl->length = gfc_multiply (tmp, e);
+ }
}
diff --git a/gcc/testsuite/gfortran.dg/repeat_8.f90 b/gcc/testsuite/gfortran.dg/repeat_8.f90
new file mode 100644
index 0000000..9dd379a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/repeat_8.f90
@@ -0,0 +1,123 @@
+! { dg-do compile }
+! { dg-additional-options "-Wconversion-extra" }
+!
+! Test fix for PR fortran/96724
+!
+! Contributed by José Rui Faustino de Sousa
+
+program repeat_p
+ use, intrinsic :: iso_fortran_env, only: int8, int16, int32, int64
+ implicit none
+
+ integer, parameter :: n = 20
+ integer, parameter :: ucs4 = selected_char_kind ('ISO_10646')
+
+ integer(kind=int8), parameter :: p08 = int(n, kind=int8)
+ integer(kind=int16), parameter :: p16 = int(n, kind=int16)
+ integer(kind=int16), parameter :: p32 = int(n, kind=int32)
+ integer(kind=int16), parameter :: p64 = int(n, kind=int64)
+
+ integer(kind=int8) :: i08
+ integer(kind=int16) :: i16
+ integer(kind=int32) :: i32
+ integer(kind=int64) :: i64
+
+ character(len=n,kind=1) :: c
+ character(len=n,kind=ucs4) :: d
+
+ i08 = p08
+ c = repeat('X', 20_int8)
+ c = repeat('X', i08)
+ c = repeat('X', p08)
+ c = repeat('X', len08(c))
+ d = repeat(ucs4_'X', 20_int8)
+ d = repeat(ucs4_'X', i08)
+ d = repeat(ucs4_'X', p08)
+ d = repeat(ucs4_'X', len08(c))
+ i16 = p16
+ c = repeat('X', 20_int16)
+ c = repeat('X', i16)
+ c = repeat('X', p16)
+ c = repeat('X', len16(c))
+ d = repeat(ucs4_'X', 20_int16)
+ d = repeat(ucs4_'X', i16)
+ d = repeat(ucs4_'X', p16)
+ d = repeat(ucs4_'X', len16(c))
+ i32 = p32
+ c = repeat('X', 20_int32)
+ c = repeat('X', i32)
+ c = repeat('X', p32)
+ c = repeat('X', len32(c))
+ d = repeat(ucs4_'X', 20_int32)
+ d = repeat(ucs4_'X', i32)
+ d = repeat(ucs4_'X', p32)
+ d = repeat(ucs4_'X', len32(c))
+ i64 = p64
+ c = repeat('X', 20_int64)
+ c = repeat('X', i64)
+ c = repeat('X', p64)
+ c = repeat('X', len64(c))
+ d = repeat(ucs4_'X', 20_int64)
+ d = repeat(ucs4_'X', i64)
+ d = repeat(ucs4_'X', p64)
+ d = repeat(ucs4_'X', len64(c))
+
+contains
+
+ function len08(x) result(l)
+ character(len=*), intent(in) :: x
+ integer(kind=int8) :: l
+
+ l = int(len(x), kind=int8)
+ end function len08
+
+ function len16(x) result(l)
+ character(len=*), intent(in) :: x
+ integer(kind=int16) :: l
+
+ l = int(len(x), kind=int16)
+ end function len16
+
+ function len32(x) result(l)
+ character(len=*), intent(in) :: x
+ integer(kind=int32) :: l
+
+ l = int(len(x), kind=int32)
+ end function len32
+
+ function len64(x) result(l)
+ character(len=*), intent(in) :: x
+ integer(kind=int64) :: l
+
+ l = int(len(x), kind=int64)
+ end function len64
+
+ function ulen08(x) result(l)
+ character(len=*,kind=ucs4), intent(in) :: x
+ integer(kind=int8) :: l
+
+ l = int(len(x), kind=int8)
+ end function ulen08
+
+ function ulen16(x) result(l)
+ character(len=*,kind=ucs4), intent(in) :: x
+ integer(kind=int16) :: l
+
+ l = int(len(x), kind=int16)
+ end function ulen16
+
+ function ulen32(x) result(l)
+ character(len=*,kind=ucs4), intent(in) :: x
+ integer(kind=int32) :: l
+
+ l = int(len(x), kind=int32)
+ end function ulen32
+
+ function ulen64(x) result(l)
+ character(len=*,kind=ucs4), intent(in) :: x
+ integer(kind=int64) :: l
+
+ l = int(len(x), kind=int64)
+ end function ulen64
+
+end program repeat_p