diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-07-22 03:45:37 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-07-22 03:45:37 +0000 |
commit | 1fb5285bcaf6bc3b4fdc0f2605549f74954ded29 (patch) | |
tree | 27ca6255ab8e5023a9107be93aafb36e5fce54a0 /gcc/cp/call.c | |
parent | 390a9c9c6e813d6a43e65a46fdba529f904ae43f (diff) | |
download | gcc-1fb5285bcaf6bc3b4fdc0f2605549f74954ded29.tar.gz |
PR c++/71913 - missing copy elision with new.
* call.c (unsafe_copy_elision_p): It's OK to elide when
initializing an unknown object.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@238621 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/call.c')
-rw-r--r-- | gcc/cp/call.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/gcc/cp/call.c b/gcc/cp/call.c index d917d9afed4..061e7084d37 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -7275,10 +7275,11 @@ unsafe_copy_elision_p (tree target, tree exp) if (TREE_CODE (exp) != TARGET_EXPR) return false; tree type = TYPE_MAIN_VARIANT (TREE_TYPE (exp)); - if (type == CLASSTYPE_AS_BASE (type)) + /* It's safe to elide the copy for a class with no tail padding. */ + if (tree_int_cst_equal (TYPE_SIZE (type), CLASSTYPE_SIZE (type))) return false; - if (!is_base_field_ref (target) - && resolves_to_fixed_type_p (target, NULL)) + /* It's safe to elide the copy if we aren't initializing a base object. */ + if (!is_base_field_ref (target)) return false; tree init = TARGET_EXPR_INITIAL (exp); /* build_compound_expr pushes COMPOUND_EXPR inside TARGET_EXPR. */ |