https://gcc.gnu.org/g:f82a279e0e6bb792f70cce1f9451537c9b5eb8be
commit r13-9598-gf82a279e0e6bb792f70cce1f9451537c9b5eb8be Author: Richard Biener <rguent...@suse.de> Date: Tue Mar 11 08:40:44 2025 +0100 middle-end/119204 - ICE with strcspn folding The following makes sure to convert the folded expression to the original expression type. PR middle-end/119204 * builtins.cc (fold_builtin_strcspn): Preserve the original expression type. * gcc.dg/pr119204.c: New testcase. (cherry picked from commit 68932eeb38f66fbc0c3cf4b77ff7dde8a408f2e4) Diff: --- gcc/builtins.cc | 5 +++-- gcc/testsuite/gcc.dg/pr119204.c | 13 +++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/gcc/builtins.cc b/gcc/builtins.cc index 61cb82b8a9b5..756ee01f6d4a 100644 --- a/gcc/builtins.cc +++ b/gcc/builtins.cc @@ -10378,7 +10378,7 @@ fold_builtin_strcspn (location_t loc, tree expr, tree s1, tree s2) { /* Evaluate and ignore argument s2 in case it has side-effects. */ - return omit_one_operand_loc (loc, size_type_node, + return omit_one_operand_loc (loc, TREE_TYPE (expr), size_zero_node, s2); } @@ -10393,7 +10393,8 @@ fold_builtin_strcspn (location_t loc, tree expr, tree s1, tree s2) if (!fn) return NULL_TREE; - return build_call_expr_loc (loc, fn, 1, s1); + return fold_convert_loc (loc, TREE_TYPE (expr), + build_call_expr_loc (loc, fn, 1, s1)); } return NULL_TREE; } diff --git a/gcc/testsuite/gcc.dg/pr119204.c b/gcc/testsuite/gcc.dg/pr119204.c new file mode 100644 index 000000000000..ecbd8dd1c22a --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr119204.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-w" } */ + +extern void abort(void); +extern long long strcspn(const char *, const char *); + +void main_test(void) { + const char *const s1 = "hello world"; + char dst[64], *d2; + + if (strcspn(++d2 + 5, "") != 5 || d2 != dst + 1) + abort(); +}