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  <rguenther@suse.de>

	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
This commit is contained in:
Richard Guenther 2010-01-10 19:37:45 +00:00 committed by Richard Biener
parent 8b6f089bcb
commit ab996409bc
4 changed files with 29 additions and 9 deletions

View File

@ -1,3 +1,10 @@
2010-01-10 Richard Guenther <rguenther@suse.de>
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 <jakub@redhat.com>
* config/rs6000/rs6000.c (rs6000_emit_set_long_const): Shorten

View File

@ -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);

View File

@ -1,3 +1,8 @@
2010-01-10 Richard Guenther <rguenther@suse.de>
PR middle-end/42667
* gcc.dg/torture/pr42667.c: New testcase.
2010-01-09 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/32489

View File

@ -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));
}