diff options
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/call.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C | 3 |
4 files changed, 16 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index acc111f..f06c6cd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2010-05-17 Jason Merrill <jason@redhat.com> + + PR c++/44158 + * call.c (build_over_call): Don't do bitwise copy for move ctor. + 2010-05-17 Dodji Seketeli <dodji@redhat.com> Jason Merrill <jason@redhat.com> diff --git a/gcc/cp/call.c b/gcc/cp/call.c index c063992..5d13007 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -5776,7 +5776,8 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) } /* [class.copy]: the copy constructor is implicitly defined even if the implementation elided its use. */ - else if (TYPE_HAS_COMPLEX_INIT_REF (DECL_CONTEXT (fn))) + else if (TYPE_HAS_COMPLEX_INIT_REF (DECL_CONTEXT (fn)) + || move_fn_p (fn)) { mark_used (fn); already_used = true; @@ -5794,7 +5795,8 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) { if (TREE_CODE (arg) == TARGET_EXPR) return arg; - else if (TYPE_HAS_TRIVIAL_INIT_REF (DECL_CONTEXT (fn))) + else if (TYPE_HAS_TRIVIAL_INIT_REF (DECL_CONTEXT (fn)) + && !move_fn_p (fn)) return build_target_expr_with_type (arg, DECL_CONTEXT (fn)); } else if (TREE_CODE (arg) == TARGET_EXPR diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 17b9c512..67cd4ad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-05-17 Jason Merrill <jason@redhat.com> + + PR c++/44158 + * g++.dg/cpp0x/rv-trivial-bug.C: Test copy-init too. + 2010-05-17 Martin Jambor <mjambor@suse.cz> * g++.dg/ipa/ivinline-1.C: New test. diff --git a/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C b/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C index de52d0f..beb8acb 100644 --- a/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C +++ b/gcc/testsuite/g++.dg/cpp0x/rv-trivial-bug.C @@ -19,7 +19,8 @@ int test2() base2 b2(b); assert(move_construct == 0); base2 b3(static_cast<base2&&>(b)); - assert(move_construct == 1); + base2 b4 = static_cast<base2&&>(b); + assert(move_construct == 2); b = b2; assert(move_assign == 0); b = static_cast<base2&&>(b2); |