The following makes sure to convert the folded expression to the
original expression type.

Bootstrapped and tested on x86_64-unknown-linux-gnu, OK?

Thanks,
Richard.

        PR middle-end/119204
        * builtins.cc (fold_builtin_strcspn): Preserve the original
        expression type.

        * gcc.dg/pr119204.c: New testcase.
---
 gcc/builtins.cc                 |  5 +++--
 gcc/testsuite/gcc.dg/pr119204.c | 13 +++++++++++++
 2 files changed, 16 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/pr119204.c

diff --git a/gcc/builtins.cc b/gcc/builtins.cc
index c8841032f03..02556e6615a 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 00000000000..ecbd8dd1c22
--- /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();
+}
-- 
2.43.0

Reply via email to