https://gcc.gnu.org/g:68932eeb38f66fbc0c3cf4b77ff7dde8a408f2e4
commit r15-7955-g68932eeb38f66fbc0c3cf4b77ff7dde8a408f2e4 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. 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 c8841032f039..02556e6615ad 100644 --- a/gcc/builtins.cc +++ b/gcc/builtins.cc @@ -11360,7 +11360,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); } @@ -11375,7 +11375,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(); +}