]> gcc.gnu.org Git - gcc.git/commitdiff
call.c (convert_like_real): Don't make a temp for copy-list-init.
authorJason Merrill <jason@redhat.com>
Wed, 17 Nov 2010 01:43:19 +0000 (20:43 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 17 Nov 2010 01:43:19 +0000 (20:43 -0500)
* 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

gcc/cp/ChangeLog
gcc/cp/call.c

index d651ba8edcf45dd221d27f5ce37dd15d4d9b251d..8c76af67bcd39e0188bd577fccb854ec7d912aa9 100644 (file)
@@ -1,5 +1,9 @@
 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
        * call.c (build_over_call): Check for =delete even when trivial.
 
index 7fa1cf633a297d5cebe38f5d337301c807909999..5e74bd237f56910ac645272842aa41bc93f0f56f 100644 (file)
@@ -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
           don't allow any more.  */
        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);
       if (diag_kind && fn)
        {
@@ -6049,15 +6053,9 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain)
       else
        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
         the implementation elided its use.  */
-      else if (!trivial || DECL_DELETED_FN (fn))
+      if (!trivial || DECL_DELETED_FN (fn))
        {
          mark_used (fn);
          already_used = true;
@@ -6641,7 +6639,7 @@ build_new_method_call (tree instance, tree fns, VEC(tree,gc) **args,
     {
       if (complain & tf_error)
        {
-         if (!COMPLETE_TYPE_P (basetype))
+         if (!COMPLETE_OR_OPEN_TYPE_P (basetype))
            cxx_incomplete_type_error (instance_ptr, basetype);
          else if (optype)
            error ("no matching function for call to %<%T::operator %T(%A)%#V%>",
This page took 0.079167 seconds and 5 git commands to generate.