diff options
-rw-r--r-- | gcc/builtins.cc | 5 | ||||
-rw-r--r-- | 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 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(); +} |