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();
+}

Reply via email to