re PR c++/39866 ([c++0x] deleted functions not removed from "no match" error messages)
authorJason Merrill <jason@redhat.com>
Wed, 14 Oct 2009 06:27:50 +0000 (02:27 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 14 Oct 2009 06:27:50 +0000 (02:27 -0400)
PR c++/39866
* call.c (print_z_candidates): Don't print deleted candidates.
(print_z_candidate): Note deleted candidates.

From-SVN: r152752

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/defaulted14.C [new file with mode: 0644]
libstdc++-v3/ChangeLog
libstdc++-v3/testsuite/20_util/unique_ptr/assign/assign_neg.cc

index 06659aa955cb35274d61e274a15bf28f4f7eecab..d36aea5d3896d2b81cf5af7c8915d09db54e9046 100644 (file)
@@ -1,3 +1,9 @@
+2009-10-14  Jason Merrill  <jason@redhat.com>
+
+       PR c++/39866
+       * call.c (print_z_candidates): Don't print deleted candidates.
+       (print_z_candidate): Note deleted candidates.
+
 2009-10-14  Larry Evans  <cppljevans@suddenlink.net>
 
        PR c++/40092
index 3fc22f2b9118730ac1ff04e0f2b1971a16161a38..ff22d9e867457926610a8be9e24d9fb10f5c17ad 100644 (file)
@@ -2718,6 +2718,8 @@ print_z_candidate (const char *msgstr, struct z_candidate *candidate)
     inform (input_location, "%s %T <conversion>", msgstr, candidate->fn);
   else if (candidate->viable == -1)
     inform (input_location, "%s %+#D <near match>", msgstr, candidate->fn);
+  else if (DECL_DELETED_FN (candidate->fn))
+    inform (input_location, "%s %+#D <deleted>", msgstr, candidate->fn);
   else
     inform (input_location, "%s %+#D", msgstr, candidate->fn);
 }
@@ -2729,6 +2731,23 @@ print_z_candidates (struct z_candidate *candidates)
   struct z_candidate *cand1;
   struct z_candidate **cand2;
 
+  if (!candidates)
+    return;
+
+  /* Remove deleted candidates.  */
+  cand1 = candidates;
+  for (cand2 = &cand1; *cand2; )
+    {
+      if (TREE_CODE ((*cand2)->fn) == FUNCTION_DECL
+         && DECL_DELETED_FN ((*cand2)->fn))
+       *cand2 = (*cand2)->next;
+      else
+       cand2 = &(*cand2)->next;
+    }
+  /* ...if there are any non-deleted ones.  */
+  if (cand1)
+    candidates = cand1;
+
   /* There may be duplicates in the set of candidates.  We put off
      checking this condition as long as possible, since we have no way
      to eliminate duplicates from a set of functions in less than n^2
@@ -2751,9 +2770,6 @@ print_z_candidates (struct z_candidate *candidates)
        }
     }
 
-  if (!candidates)
-    return;
-
   str = _("candidates are:");
   print_z_candidate (str, candidates);
   if (candidates->next)
index e2a9cfe2a39b376abcd7b60b849cf86fb3001add..1cf82ffeb7e241f37db987b0f2e3b01733b167dd 100644 (file)
@@ -1,3 +1,8 @@
+2009-10-14  Jason Merrill  <jason@redhat.com>
+
+       PR c++/39866
+       * g++.dg/cpp0x/defaulted14.C: New.
+
 2009-10-14  Larry Evans  <cppljevans@suddenlink.net>
 
        * g++.dg/cpp0x/vt-40092.C: New.
diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted14.C b/gcc/testsuite/g++.dg/cpp0x/defaulted14.C
new file mode 100644 (file)
index 0000000..235e646
--- /dev/null
@@ -0,0 +1,18 @@
+// PR c++/39866
+// { dg-options "-std=c++0x" }
+
+struct A {
+  A& operator=(const A&) = delete; // { dg-bogus "" }
+
+  void operator=(int) {}       // { dg-message "" }
+  void operator=(char) {}      // { dg-message "" }
+};
+
+struct B {};
+
+int main()
+{
+  A a;
+  a = B();             // { dg-error "no match" }
+  a = 1.0;             // { dg-error "ambiguous" }
+}
index 424967d35605a199351276b668d7421d8aceba26..35c1f3a4d7b32830934d8055cc540220666ccae9 100644 (file)
@@ -1,3 +1,7 @@
+2009-10-14  Jason Merrill  <jason@redhat.com>
+
+       * testsuite/20_util/unique_ptr/assign/assign_neg.cc: Adjust expecteds.
+
 2009-10-13  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * include/parallel/for_each_selectors.h: Minor uglification and
index f0236eb26370fed8c3542375407e43af60f9c86b..bf49aa6b080e6f08933bc4973ff47513aebb1d2a 100644 (file)
@@ -49,10 +49,13 @@ test03()
   std::unique_ptr<int[2]> p2 = p1;
 }
 
+// { dg-error "deleted function" "" { target *-*-* } 358 }
 // { dg-error "used here" "" { target *-*-* } 42 }
 // { dg-error "no matching" "" { target *-*-* } 48 }
-// { dg-error "used here" "" { target *-*-* } 49 }
-// { dg-error "candidates are" "" { target *-*-* } 213 }
+// { dg-warning "candidates are" "" { target *-*-* } 119 }
+// { dg-warning "note" "" { target *-*-* } 112 }
+// { dg-warning "note" "" { target *-*-* } 107 }
+// { dg-warning "note" "" { target *-*-* } 102 }
+// { dg-warning "note" "" { target *-*-* } 96 }
 // { dg-error "deleted function" "" { target *-*-* } 213 }
-// { dg-error "deleted function" "" { target *-*-* } 358 }
-// { dg-excess-errors "note" }
+// { dg-error "used here" "" { target *-*-* } 49 }