aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2005-04-03 12:33:02 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2005-04-03 12:33:02 +0000
commitee307009db460dd07589e6bc2d31aad4c5a40426 (patch)
tree84435f4c3075396a4fd35c2ffd666145ccc1525f /gcc
parent00b28cb030eded609070d66ad864d6ce09261504 (diff)
downloadgcc-ee307009db460dd07589e6bc2d31aad4c5a40426.zip
gcc-ee307009db460dd07589e6bc2d31aad4c5a40426.tar.gz
gcc-ee307009db460dd07589e6bc2d31aad4c5a40426.tar.bz2
re PR c++/20723 (ICE in more_specialized_fn, more than one user-defined conversion "srp<int>" to "ptr<int>")
cp: PR c++/20723 * pt.c (more_specialized_fn): Member functions are unordered wrt non-members. Conversion operators are unordered wrt other functions. testsuite: PR c++/20723 * g++.dg/template/spec22.C: New. * g++.dg/template/spec23.C: New. From-SVN: r97489
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/pt.c10
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/template/spec22.C22
-rw-r--r--gcc/testsuite/g++.dg/template/spec23.C25
5 files changed, 68 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 4065f17..90a6892 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2005-04-03 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/20723
+ * pt.c (more_specialized_fn): Member functions are unordered wrt
+ non-members. Conversion operators are unordered wrt other
+ functions.
+
2005-04-01 Nathan Sidwell <nathan@codesourcery.com>
* call.c (add_template_candidates_real): Remove length parameter
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index f92ce90..e8b2190 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -10407,17 +10407,23 @@ more_specialized_fn (tree pat1, tree pat2, int len)
int better1 = 0;
int better2 = 0;
+ /* If only one is a member function, they are unordered. */
+ if (DECL_FUNCTION_MEMBER_P (decl1) != DECL_FUNCTION_MEMBER_P (decl2))
+ return 0;
+
/* Don't consider 'this' parameter. */
if (DECL_NONSTATIC_MEMBER_FUNCTION_P (decl1))
args1 = TREE_CHAIN (args1);
-
if (DECL_NONSTATIC_MEMBER_FUNCTION_P (decl2))
args2 = TREE_CHAIN (args2);
+ /* If only one is a conversion operator, they are unordered. */
+ if (DECL_CONV_FN_P (decl1) != DECL_CONV_FN_P (decl2))
+ return 0;
+
/* Consider the return type for a conversion function */
if (DECL_CONV_FN_P (decl1))
{
- gcc_assert (DECL_CONV_FN_P (decl2));
args1 = tree_cons (NULL_TREE, TREE_TYPE (TREE_TYPE (decl1)), args1);
args2 = tree_cons (NULL_TREE, TREE_TYPE (TREE_TYPE (decl2)), args2);
len++;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 612dcab..7191f88 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2005-04-03 Nathan Sidwell <nathan@codesourcery.com>
+
+ PR c++/20723
+ * g++.dg/template/spec22.C: New.
+ * g++.dg/template/spec23.C: New.
+
2005-04-03 Dale Ranta <dir@lanl.gov>
Francois-Xavier Coudert <coudert@clipper.ens.fr>
diff --git a/gcc/testsuite/g++.dg/template/spec22.C b/gcc/testsuite/g++.dg/template/spec22.C
new file mode 100644
index 0000000..e2d439c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/spec22.C
@@ -0,0 +1,22 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 2 Apr 2005 <nathan@codesourcery.com>
+
+// PR 20723
+// Origin: Andrew Pinski <pinskia@gcc.gnu.org>
+// Nathan Sidwell <nathan@gcc.gnu.org>
+
+template <typename T>
+int operator+ (T const &, int); // { dg-error "T = Foo" "" }
+
+struct Foo
+{
+ template <typename T>
+ int operator+ (T) const; // { dg-error "T = int" "" }
+};
+
+int main ()
+{
+ Foo f;
+
+ return f + 0; // { dg-error "ambiguous overload" "" }
+}
diff --git a/gcc/testsuite/g++.dg/template/spec23.C b/gcc/testsuite/g++.dg/template/spec23.C
new file mode 100644
index 0000000..15618b1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/spec23.C
@@ -0,0 +1,25 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 2 Apr 2005 <nathan@codesourcery.com>
+
+// PR 20723
+// Origin: Andrew Pinski <pinskia@gcc.gnu.org>
+// Nathan Sidwell <nathan@gcc.gnu.org>
+
+struct Foo
+{
+ template <typename T>
+ Foo (const T &); // { dg-error "T = Bar" "" }
+};
+
+struct Bar
+{
+ template <typename T>
+ operator T () const; // { dg-error "T = Foo" "" }
+};
+
+Foo Quux (Bar const &b)
+{
+ return b; // { dg-error "ambiguous overload" "" }
+}
+
+