diff options
author | Jason Merrill <jason@redhat.com> | 2013-08-20 08:58:47 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2013-08-20 08:58:47 -0400 |
commit | c5918c2199ee193f86cfafb9ad9fb040d7a60a14 (patch) | |
tree | 8032eae83cbbc51e1a5e4e573422bc93c16f14a6 /gcc | |
parent | f8693fafeffe58c374b04ddb44bfc281c426505a (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/cvt.c | 23 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/delete2.C | 26 |
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" } +} |