aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/builtins.cc5
-rw-r--r--gcc/testsuite/gcc.dg/pr119204.c13
2 files changed, 16 insertions, 2 deletions
diff --git a/gcc/builtins.cc b/gcc/builtins.cc
index c884103..02556e6 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 0000000..ecbd8dd1
--- /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();
+}