From c4bcc71fcb21e0543b6ae017bf9381edddfb6316 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 24 Jun 2009 12:25:52 -0400 Subject: re PR c++/40342 (ambiguous overload not diagnosed) PR c++/40342 * decl.c (decls_match): Check DECL_TI_TEMPLATE too. * class.c (resolve_address_of_overloaded_function): Fix typo. From-SVN: r148910 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/class.c | 2 +- gcc/cp/decl.c | 11 +++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/template/overload10.C | 6 ++++++ 5 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/template/overload10.C (limited to 'gcc') diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8f9d6d8..de3828e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2009-06-24 Jason Merrill + + PR c++/40342 + * decl.c (decls_match): Check DECL_TI_TEMPLATE too. + * class.c (resolve_address_of_overloaded_function): Fix typo. + 2009-06-18 Aldy Hernandez * class.c (get_vtable_decl): Replace finish_decl with cp_finish_decl. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index d86ff64..12192e6 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -6185,7 +6185,7 @@ resolve_address_of_overloaded_function (tree target_type, fn = TREE_PURPOSE (matches); for (match = TREE_CHAIN (matches); match; match = TREE_CHAIN (match)) - if (!decls_match (fn, TREE_PURPOSE (matches))) + if (!decls_match (fn, TREE_PURPOSE (match))) break; if (match) diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 9ebfd27..02954b5 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -916,6 +916,17 @@ decls_match (tree newdecl, tree olddecl) tree p1 = TYPE_ARG_TYPES (f1); tree p2 = TYPE_ARG_TYPES (f2); + /* Specializations of different templates are different functions + even if they have the same type. */ + tree t1 = (DECL_USE_TEMPLATE (newdecl) + ? DECL_TI_TEMPLATE (newdecl) + : NULL_TREE); + tree t2 = (DECL_USE_TEMPLATE (olddecl) + ? DECL_TI_TEMPLATE (olddecl) + : NULL_TREE); + if (t1 != t2) + return 0; + if (CP_DECL_CONTEXT (newdecl) != CP_DECL_CONTEXT (olddecl) && ! (DECL_EXTERN_C_P (newdecl) && DECL_EXTERN_C_P (olddecl))) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ee4e4a1..6bee2dde 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-06-24 Jason Merrill + + PR c++/40342 + * g++.dg/template/overload10.C: New. + 2009-06-24 Janus Weil PR fortran/40427 diff --git a/gcc/testsuite/g++.dg/template/overload10.C b/gcc/testsuite/g++.dg/template/overload10.C new file mode 100644 index 0000000..088b9d2 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/overload10.C @@ -0,0 +1,6 @@ +// PR c++40342 + +template int f(T1 *, const T2 *); // { dg-error "" } +template int f(const T1 *, T2 *); // { dg-error "" } + +int (*p)(const int *, const int *) = f; // { dg-error "ambiguous" } -- cgit v1.1