aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2010-06-15 16:10:29 -0400
committerJason Merrill <jason@gcc.gnu.org>2010-06-15 16:10:29 -0400
commite14eaea4d4c3ce010cb58b428681e7d6723021a2 (patch)
tree17b3c4657f6d525af0a041d9852b2681b5d6d13e /gcc
parent5c77749e30496db4cb726ead698210a486d95b79 (diff)
downloadgcc-e14eaea4d4c3ce010cb58b428681e7d6723021a2.zip
gcc-e14eaea4d4c3ce010cb58b428681e7d6723021a2.tar.gz
gcc-e14eaea4d4c3ce010cb58b428681e7d6723021a2.tar.bz2
call.c (print_z_candidates): Do print viable deleted candidates.
* call.c (print_z_candidates): Do print viable deleted candidates. (joust): Don't choose a deleted function just because its worst conversion is better than another candidate's worst. From-SVN: r160808
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/call.c6
-rw-r--r--gcc/testsuite/ChangeLog2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/defaulted18.C9
4 files changed, 20 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index c82db7e..d98eaae 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2010-06-15 Jason Merrill <jason@redhat.com>
+ * call.c (print_z_candidates): Do print viable deleted candidates.
+ (joust): Don't choose a deleted function just because its worst
+ conversion is better than another candidate's worst.
+
* call.c (convert_like_real): Don't complain about
list-value-initialization from an explicit constructor.
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 60d7333..a735dc6 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -2747,11 +2747,12 @@ print_z_candidates (struct z_candidate *candidates)
if (!candidates)
return;
- /* Remove deleted candidates. */
+ /* Remove non-viable deleted candidates. */
cand1 = candidates;
for (cand2 = &cand1; *cand2; )
{
if (TREE_CODE ((*cand2)->fn) == FUNCTION_DECL
+ && !(*cand2)->viable
&& DECL_DELETED_FN ((*cand2)->fn))
*cand2 = (*cand2)->next;
else
@@ -7407,6 +7408,9 @@ tweak:
winner = -1, w = cand2, l = cand1;
if (winner)
{
+ /* Don't choose a deleted function over ambiguity. */
+ if (DECL_P (w->fn) && DECL_DELETED_FN (w->fn))
+ return 0;
if (warn)
{
pedwarn (input_location, 0,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e6ce32a..8ca6527 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,7 @@
2010-06-15 Jason Merrill <jason@redhat.com>
+ * g++.dg/cpp0x/defaulted18.C: New.
+
* g++.dg/cpp0x/initlist40.C: New.
* g++.dg/cpp0x/initlist39.C: New.
diff --git a/gcc/testsuite/g++.dg/cpp0x/defaulted18.C b/gcc/testsuite/g++.dg/cpp0x/defaulted18.C
new file mode 100644
index 0000000..ae055e3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/defaulted18.C
@@ -0,0 +1,9 @@
+// { dg-options "-std=c++0x" }
+
+void f(char i, int j) = delete; // { dg-message "<deleted>" }
+void f(int i, ...); // { dg-message "void f" }
+
+int main()
+{
+ f(1,1); // { dg-error "ambiguous" }
+}