From c7cbde74ab6588e15c6bf29b8b80aac43583a926 Mon Sep 17 00:00:00 2001 From: rguenth Date: Sun, 10 Jan 2010 19:37:45 +0000 Subject: [PATCH] 2010-01-10 Richard Guenther PR middle-end/42667 * builtins.c (fold_builtin_strlen): Add type argument and convert the resulting length to it. (fold_builtin_1): Adjust. * gcc.dg/torture/pr42667.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155791 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/builtins.c | 13 ++++--------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr42667.c | 13 +++++++++++++ 4 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr42667.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 73263cd..8869f7f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-01-10 Richard Guenther + + PR middle-end/42667 + * builtins.c (fold_builtin_strlen): Add type argument and + convert the resulting length to it. + (fold_builtin_1): Adjust. + 2010-01-09 Jakub Jelinek * config/rs6000/rs6000.c (rs6000_emit_set_long_const): Shorten diff --git a/gcc/builtins.c b/gcc/builtins.c index 607117a..ac96934 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -135,7 +135,7 @@ static rtx expand_builtin_expect (tree, rtx); static tree fold_builtin_constant_p (tree); static tree fold_builtin_expect (location_t, tree, tree); static tree fold_builtin_classify_type (tree); -static tree fold_builtin_strlen (location_t, tree); +static tree fold_builtin_strlen (location_t, tree, tree); static tree fold_builtin_inf (location_t, tree, int); static tree fold_builtin_nan (tree, tree, int); static tree rewrite_call_expr (location_t, tree, int, tree, int, ...); @@ -6617,7 +6617,7 @@ fold_builtin_classify_type (tree arg) /* Fold a call to __builtin_strlen with argument ARG. */ static tree -fold_builtin_strlen (location_t loc, tree arg) +fold_builtin_strlen (location_t loc, tree type, tree arg) { if (!validate_arg (arg, POINTER_TYPE)) return NULL_TREE; @@ -6626,12 +6626,7 @@ fold_builtin_strlen (location_t loc, tree arg) tree len = c_strlen (arg, 0); if (len) - { - /* Convert from the internal "sizetype" type to "size_t". */ - if (size_type_node) - len = fold_convert_loc (loc, size_type_node, len); - return len; - } + return fold_convert_loc (loc, type, len); return NULL_TREE; } @@ -9659,7 +9654,7 @@ fold_builtin_1 (location_t loc, tree fndecl, tree arg0, bool ignore) return fold_builtin_classify_type (arg0); case BUILT_IN_STRLEN: - return fold_builtin_strlen (loc, arg0); + return fold_builtin_strlen (loc, type, arg0); CASE_FLT_FN (BUILT_IN_FABS): return fold_builtin_fabs (loc, arg0, type); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f3a033e..c2effe9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-01-10 Richard Guenther + + PR middle-end/42667 + * gcc.dg/torture/pr42667.c: New testcase. + 2010-01-09 Jerry DeLisle PR fortran/32489 diff --git a/gcc/testsuite/gcc.dg/torture/pr42667.c b/gcc/testsuite/gcc.dg/torture/pr42667.c new file mode 100644 index 0000000..eac8001 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr42667.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-w" } */ + +extern int strlen(const char *); +void WriteTextDots(int len); + +void OnDisplay(char * string) +{ + if (!string) + string = "(none)"; + WriteTextDots(strlen(string)); +} + -- 2.7.4