Commit be5e6908 by Jason Merrill Committed by Jason Merrill

call.c (convert_like_real): Don't make a temp for copy-list-init.

	* call.c (convert_like_real): Don't make a temp for copy-list-init.
	(build_over_call): Don't handle that here.
	(build_new_method_call): Use COMPLETE_OR_OPEN_TYPE_P for error.

From-SVN: r166852
parent 66753821
2010-11-16 Jason Merrill <jason@redhat.com> 2010-11-16 Jason Merrill <jason@redhat.com>
* call.c (convert_like_real): Don't make a temp for copy-list-init.
(build_over_call): Don't handle that here.
(build_new_method_call): Use COMPLETE_OR_OPEN_TYPE_P for error.
PR c++/46497 PR c++/46497
* call.c (build_over_call): Check for =delete even when trivial. * call.c (build_over_call): Check for =delete even when trivial.
......
...@@ -5290,6 +5290,10 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, ...@@ -5290,6 +5290,10 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
conversion (i.e. the second step of copy-initialization), so conversion (i.e. the second step of copy-initialization), so
don't allow any more. */ don't allow any more. */
flags |= LOOKUP_NO_CONVERSION; flags |= LOOKUP_NO_CONVERSION;
if (TREE_CODE (expr) == TARGET_EXPR
&& TARGET_EXPR_LIST_INIT_P (expr))
/* Copy-list-initialization doesn't actually involve a copy. */
return expr;
expr = build_temp (expr, totype, flags, &diag_kind, complain); expr = build_temp (expr, totype, flags, &diag_kind, complain);
if (diag_kind && fn) if (diag_kind && fn)
{ {
...@@ -6049,15 +6053,9 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) ...@@ -6049,15 +6053,9 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
else else
arg = cp_build_indirect_ref (arg, RO_NULL, complain); arg = cp_build_indirect_ref (arg, RO_NULL, complain);
if (TREE_CODE (arg) == TARGET_EXPR
&& TARGET_EXPR_LIST_INIT_P (arg))
{
/* Copy-list-initialization doesn't require the constructor
to be defined. */
}
/* [class.copy]: the copy constructor is implicitly defined even if /* [class.copy]: the copy constructor is implicitly defined even if
the implementation elided its use. */ the implementation elided its use. */
else if (!trivial || DECL_DELETED_FN (fn)) if (!trivial || DECL_DELETED_FN (fn))
{ {
mark_used (fn); mark_used (fn);
already_used = true; already_used = true;
...@@ -6641,7 +6639,7 @@ build_new_method_call (tree instance, tree fns, VEC(tree,gc) **args, ...@@ -6641,7 +6639,7 @@ build_new_method_call (tree instance, tree fns, VEC(tree,gc) **args,
{ {
if (complain & tf_error) if (complain & tf_error)
{ {
if (!COMPLETE_TYPE_P (basetype)) if (!COMPLETE_OR_OPEN_TYPE_P (basetype))
cxx_incomplete_type_error (instance_ptr, basetype); cxx_incomplete_type_error (instance_ptr, basetype);
else if (optype) else if (optype)
error ("no matching function for call to %<%T::operator %T(%A)%#V%>", error ("no matching function for call to %<%T::operator %T(%A)%#V%>",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment