From c8361db176c68d1d3b4085970b8862387785e0c2 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 17 May 2010 15:53:45 -0400 Subject: re PR c++/44158 ([C++0x] wrong overload resolution for copy-initialization from an rvalue) PR c++/44158 * call.c (build_over_call): Don't do bitwise copy for move ctor. From-SVN: r159508 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/call.c | 6 ++++-- gcc/testsuite/ChangeLog | 5 +++++ 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 + + PR c++/44158 + * call.c (build_over_call): Don't do bitwise copy for move ctor. + 2010-05-17 Dodji Seketeli Jason Merrill 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 + + PR c++/44158 + * g++.dg/cpp0x/rv-trivial-bug.C: Test copy-init too. + 2010-05-17 Martin Jambor * 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(b)); - assert(move_construct == 1); + base2 b4 = static_cast(b); + assert(move_construct == 2); b = b2; assert(move_assign == 0); b = static_cast(b2); -- cgit v1.1