OSDN Git Service

* call.c (convert_like_real): Don't make a temp for copy-list-init.
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 17 Nov 2010 01:43:19 +0000 (01:43 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 17 Nov 2010 01:43:19 +0000 (01:43 +0000)
(build_over_call): Don't handle that here.
(build_new_method_call): Use COMPLETE_OR_OPEN_TYPE_P for error.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166852 138bc75d-0d04-0410-961f-82ee72b054a4

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

index d651ba8..8c76af6 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 7fa1cf6..5e74bd2 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%>",