diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-04 15:25:53 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-10-04 15:25:53 +0000 |
commit | bd6dcc04472f6df11151cebe7e8ef3d0c9fa1f71 (patch) | |
tree | f072adab37a8ccac026fd1df0c6cbd04caeea5db /gcc/builtins.c | |
parent | 805389b2340140c0b46a374f0a5dce3b9eefed40 (diff) | |
download | gcc-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.c | 13 |
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)); |