From: jason Date: Wed, 17 Nov 2010 01:43:10 +0000 (+0000) Subject: PR c++/46497 X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=37969ee42923a945210b9bda64d2d01c0205f462 PR c++/46497 * call.c (build_over_call): Check for =delete even when trivial. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166851 138bc75d-0d04-0410-961f-82ee72b054a4 --- 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" } +}