summaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2011-10-04 15:25:53 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2011-10-04 15:25:53 +0000
commitbd6dcc04472f6df11151cebe7e8ef3d0c9fa1f71 (patch)
treef072adab37a8ccac026fd1df0c6cbd04caeea5db /gcc/builtins.c
parent805389b2340140c0b46a374f0a5dce3b9eefed40 (diff)
downloadgcc-bd6dcc04472f6df11151cebe7e8ef3d0c9fa1f71.tar.gz
PR tree-optimization/50604
* builtins.c (fold_builtin_strcpy, fold_builtin_stpcpy, fold_builtin_strncpy, fold_builtin_stxcpy_chk): Ensure last argument to memcpy has size_type_node type instead of ssizetype. * tree-ssa-strlen.c (handle_builtin_memcpy): Use size_type_node instead of TREE_TYPE (len) as type for newlen. * gcc.dg/pr50604.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@179508 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r--gcc/builtins.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c
index b79ce6f4a74..3055927f369 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -8288,7 +8288,8 @@ fold_builtin_strcpy (location_t loc, tree fndecl, tree dest, tree src, tree len)
return NULL_TREE;
}
- len = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
+ len = fold_convert_loc (loc, size_type_node, len);
+ len = size_binop_loc (loc, PLUS_EXPR, len, build_int_cst (size_type_node, 1));
return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
build_call_expr_loc (loc, fn, 3, dest, src, len));
}
@@ -8319,7 +8320,9 @@ fold_builtin_stpcpy (location_t loc, tree fndecl, tree dest, tree src)
if (!fn)
return NULL_TREE;
- lenp1 = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
+ lenp1 = size_binop_loc (loc, PLUS_EXPR,
+ fold_convert_loc (loc, size_type_node, len),
+ build_int_cst (size_type_node, 1));
/* We use dest twice in building our expression. Save it from
multiple expansions. */
dest = builtin_save_expr (dest);
@@ -8375,6 +8378,8 @@ fold_builtin_strncpy (location_t loc, tree fndecl, tree dest,
fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
if (!fn)
return NULL_TREE;
+
+ len = fold_convert_loc (loc, size_type_node, len);
return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
build_call_expr_loc (loc, fn, 3, dest, src, len));
}
@@ -12127,7 +12132,9 @@ fold_builtin_stxcpy_chk (location_t loc, tree fndecl, tree dest,
if (!fn)
return NULL_TREE;
- len = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
+ len = fold_convert_loc (loc, size_type_node, len);
+ len = size_binop_loc (loc, PLUS_EXPR, len,
+ build_int_cst (size_type_node, 1));
return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
build_call_expr_loc (loc, fn, 4,
dest, src, len, size));