aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2013-08-20 08:58:47 -0400
committerJason Merrill <jason@gcc.gnu.org>2013-08-20 08:58:47 -0400
commitc5918c2199ee193f86cfafb9ad9fb040d7a60a14 (patch)
tree8032eae83cbbc51e1a5e4e573422bc93c16f14a6 /gcc
parentf8693fafeffe58c374b04ddb44bfc281c426505a (diff)
downloadgcc-c5918c2199ee193f86cfafb9ad9fb040d7a60a14.zip
gcc-c5918c2199ee193f86cfafb9ad9fb040d7a60a14.tar.gz
gcc-c5918c2199ee193f86cfafb9ad9fb040d7a60a14.tar.bz2
re PR c++/58119 (Invalid ambiguous default type conversion with only a single invalid conversion listed.)
PR c++/58119 * cvt.c (build_expr_type_conversion): Don't complain about a template that can't match the desired type category. From-SVN: r201880
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/cvt.c23
-rw-r--r--gcc/testsuite/g++.dg/template/delete2.C26
3 files changed, 44 insertions, 11 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 5f55ca2..c18bcb5 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2013-08-20 Jason Merrill <jason@redhat.com>
+
+ PR c++/58119
+ * cvt.c (build_expr_type_conversion): Don't complain about a
+ template that can't match the desired type category.
+
2013-08-20 Gabriel Dos Reis <gdr@integrable-solutions.net>
* error.c (pp_ggc_formatted_text): New.
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c
index 532e8fd..08c026d 100644
--- a/gcc/cp/cvt.c
+++ b/gcc/cp/cvt.c
@@ -1590,17 +1590,6 @@ build_expr_type_conversion (int desires, tree expr, bool complain)
if (DECL_NONCONVERTING_P (cand))
continue;
- if (TREE_CODE (cand) == TEMPLATE_DECL)
- {
- if (complain)
- {
- error ("ambiguous default type conversion from %qT",
- basetype);
- error (" candidate conversions include %qD", cand);
- }
- return error_mark_node;
- }
-
candidate = non_reference (TREE_TYPE (TREE_TYPE (cand)));
switch (TREE_CODE (candidate))
@@ -1634,11 +1623,23 @@ build_expr_type_conversion (int desires, tree expr, bool complain)
break;
default:
+ /* A wildcard could be instantiated to match any desired
+ type, but we can't deduce the template argument. */
+ if (WILDCARD_TYPE_P (candidate))
+ win = true;
break;
}
if (win)
{
+ if (TREE_CODE (cand) == TEMPLATE_DECL)
+ {
+ if (complain)
+ error ("default type conversion can't deduce template"
+ " argument for %qD", cand);
+ return error_mark_node;
+ }
+
if (winner)
{
tree winner_type
diff --git a/gcc/testsuite/g++.dg/template/delete2.C b/gcc/testsuite/g++.dg/template/delete2.C
new file mode 100644
index 0000000..b6ab380
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/delete2.C
@@ -0,0 +1,26 @@
+// PR c++/58119
+
+template <class T>
+struct A
+{
+ operator T*();
+ template <class U>
+ operator A<U>();
+};
+
+template <class T>
+struct B
+{
+ operator T*();
+ template <class U>
+ operator A<U>*();
+};
+
+int main()
+{
+ A<int> a;
+ delete a;
+
+ B<int> b;
+ delete b; // { dg-error "template|delete" }
+}