fold_read_from_constant_string and expand_expr_real_1 have code to optimize constant reads from string (tree vs. rtl). If the STRING_CST array type has zero low bound, index is fold converted to sizetype and so the compare_tree_int works fine, but if it has some other low bound, it calls size_diffop_loc and that function from 2 sizetype operands creates a ssizetype difference. expand_expr_real_1 then uses tree_fits_uhwi_p + compare_tree_int and so works fine, but fold-const.c only checked if index is INTEGER_CST and calls compare_tree_int, which means for negative index it will succeed and result in UB in the compiler. 2021-02-23 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/99204 * fold-const.c (fold_read_from_constant_string): Check that tree_fits_uhwi_p (index) rather than just that index is INTEGER_CST. * gfortran.dg/pr99204.f90: New test.
11 lines
170 B
Fortran
11 lines
170 B
Fortran
! PR tree-optimization/99204
|
|
! { dg-do compile }
|
|
! { dg-options "-O2 -w" }
|
|
|
|
program pr99204
|
|
character :: c
|
|
integer :: i = -12345678
|
|
c = 'abc'(i:i)
|
|
print *, c
|
|
end
|