diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2005-03-31 17:36:17 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2005-03-31 17:36:17 +0000 |
commit | dda0439880fee40a90309ed74446c29a3ca08a05 (patch) | |
tree | 5ecfece501acdb1b2be881d9444e863d74730ab4 /gcc/testsuite | |
parent | 27954bdbc3051fbf6adfdc8675fa33f36da7c292 (diff) | |
download | gcc-dda0439880fee40a90309ed74446c29a3ca08a05.zip gcc-dda0439880fee40a90309ed74446c29a3ca08a05.tar.gz gcc-dda0439880fee40a90309ed74446c29a3ca08a05.tar.bz2 |
PR c++/19203, implement DR 214
cp:
PR c++/19203, implement DR 214
* call.c (joust): Use more_specialized_fn.
* cp-tree.h (DEDUCE_ORDER): Remove.
(more_specialized): Replace with ...
(more_specialized_fn): ... this.
* pt.c (maybe_adjust_types_for_deduction): Remove DEDUCE_ORDER
case.
(type_unification_real): Remove DEDUCE_ORDER case.
(more_specialized): Replace with ...
(more_specialized_fn): ... this. Implement DR 214.
(most_specialized_instantiation): Use get_bindings_real directly.
testsuite:
PR c++/19203, DR 214
* g++.dg/parse/ambig3.C: Not ambiguous.
* g++.dg/template/spec20.C: New.
* g++.dg/template/spec21.C: New.
From-SVN: r97336
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/ambig3.C | 15 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/spec20.C | 19 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/spec21.C | 28 |
4 files changed, 66 insertions, 3 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 66d1b01..afa03d5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2005-03-31 Nathan Sidwell <nathan@codesourcery.com> + + PR c++/19203, DR 214 + * g++.dg/parse/ambig3.C: Not ambiguous. + * g++.dg/template/spec20.C: New. + * g++.dg/template/spec21.C: New. + 2005-03-31 Steve Ellcey <sje@cup.hp.com> PR target/20045 diff --git a/gcc/testsuite/g++.dg/parse/ambig3.C b/gcc/testsuite/g++.dg/parse/ambig3.C index 72ee960..4139071 100644 --- a/gcc/testsuite/g++.dg/parse/ambig3.C +++ b/gcc/testsuite/g++.dg/parse/ambig3.C @@ -5,8 +5,17 @@ template <int> struct A { static const int i = 1; }; template <int> struct B {}; -template <typename> void foo(B<0>) {} // { dg-error "" } +template <typename> int foo(B<0>) +{ + return 0; +} -template <typename, int j> B<A<j>::i-1> foo(B<j>) { return B<0>(); } // { dg-error "" } +template <typename, int j> B<A<j>::i-1> foo(B<j>) +{ + return B<0>(); +} -void bar() { foo<int>(B<0>()); } // { dg-error "ambiguous" } +int main() +{ + return foo<int>(B<0>()); +} diff --git a/gcc/testsuite/g++.dg/template/spec20.C b/gcc/testsuite/g++.dg/template/spec20.C new file mode 100644 index 0000000..71548e4 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec20.C @@ -0,0 +1,19 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 31 Mar 2005 <nathan@codesourcery.com> + +// Origin: Giovanni Bajo <giovannibajo@libero.it> +// Bug 19203: Failure to implement DR 214 + +template <class A> +void foo(const A& a); + +template <class RET, class ARG1> +int foo(RET (&)(ARG1)); // this one + + +float decl(int); + +int bar(void) +{ + return foo(decl); +} diff --git a/gcc/testsuite/g++.dg/template/spec21.C b/gcc/testsuite/g++.dg/template/spec21.C new file mode 100644 index 0000000..e04ac5a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec21.C @@ -0,0 +1,28 @@ +// Copyright (C) 2005 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 31 Mar 2005 <nathan@codesourcery.com> + +// { dg-do run } +// DR214 + +template <class T> T f(int) {return 0;} +template <class T, class U> T f(U){return 1;} + +template <typename T, typename R> T checked_cast (R const &) {return 0;} +template <typename T, typename R> T checked_cast (R *) {return 1;} + + +int main () +{ + int i = 0; + + if (f<int>(1)) + return 1; + + if (checked_cast<int>(i) != 0) + return 2; + + if (checked_cast<int>(&i) != 1) + return 3; + + return 0; +} |