From: Richard Guenther Date: Sun, 10 Jan 2010 19:37:45 +0000 (+0000) Subject: re PR middle-end/42667 (internal compiler error: in insert_into_preds_of_block, at... X-Git-Tag: releases/gcc-4.5.0~1300 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ab996409bcd1b433b9428fe1b4a5ca5b8e66e6e4;p=thirdparty%2Fgcc.git re PR middle-end/42667 (internal compiler error: in insert_into_preds_of_block, at tree-ssa-pre.c:3146) 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. From-SVN: r155791 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 73263cd05051..8869f7fa9d6d 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 607117a4017c..ac9693400e4a 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 f3a033e02502..c2effe95337e 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 000000000000..eac80014bebc --- /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)); +} +