From 66753821b5fd89c3fc5711240ecd7a3230586bf2 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 16 Nov 2010 20:43:10 -0500 Subject: [PATCH] re PR c++/46497 ([C++0x] Defaulted vs declared move constructor vs is_convertible) PR c++/46497 * call.c (build_over_call): Check for =delete even when trivial. From-SVN: r166851 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/call.c | 5 +++-- gcc/testsuite/ChangeLog | 2 ++ gcc/testsuite/g++.dg/cpp0x/defaulted20.C | 19 +++++++++++++++++++ 4 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/defaulted20.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e32c3b7e877..d651ba8edcf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2010-11-16 Jason Merrill + PR c++/46497 + * call.c (build_over_call): Check for =delete even when trivial. + DR 1004 * decl.c (make_unbound_class_template): Handle using injected-type-name as template. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index eb7247dad93..7fa1cf633a2 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -6057,7 +6057,7 @@ 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 (!trivial) + else if (!trivial || DECL_DELETED_FN (fn)) { mark_used (fn); already_used = true; @@ -6086,7 +6086,8 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) } } else if (DECL_OVERLOADED_OPERATOR_P (fn) == NOP_EXPR - && trivial_fn_p (fn)) + && trivial_fn_p (fn) + && !DECL_DELETED_FN (fn)) { tree to = stabilize_reference (cp_build_indirect_ref (argarray[0], RO_NULL, complain)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e40c1e9760b..76540df89d5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2010-11-16 Jason Merrill + * g++.dg/cpp0x/defaulted20.C: New. + * g++.dg/template/injected2.C: New. 2010-11-17 Nicola Pero diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted20.C b/gcc/testsuite/g++.dg/cpp0x/defaulted20.C new file mode 100644 index 00000000000..d9ad04fec4e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/defaulted20.C @@ -0,0 +1,19 @@ +// PR c++/46497 +// { dg-options -std=c++0x } + +struct A { + A(A&&) = default; // { dg-message "A::A" } +}; +struct B { + const A a; + B(const B&) = default; + B(B&&) = default; // { dg-error "implicitly deleted|no match" } +}; + +void g(B); // { dg-error "argument 1" } +B&& f(); + +int main() +{ + g(f()); // { dg-error "deleted" } +}