diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2005-04-03 12:33:02 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2005-04-03 12:33:02 +0000 |
commit | ee307009db460dd07589e6bc2d31aad4c5a40426 (patch) | |
tree | 84435f4c3075396a4fd35c2ffd666145ccc1525f /gcc | |
parent | 00b28cb030eded609070d66ad864d6ce09261504 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/pt.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/spec22.C | 22 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/spec23.C | 25 |
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" "" } +} + + |