aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2005-03-31 17:36:17 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2005-03-31 17:36:17 +0000
commitdda0439880fee40a90309ed74446c29a3ca08a05 (patch)
tree5ecfece501acdb1b2be881d9444e863d74730ab4 /gcc/testsuite
parent27954bdbc3051fbf6adfdc8675fa33f36da7c292 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/parse/ambig3.C15
-rw-r--r--gcc/testsuite/g++.dg/template/spec20.C19
-rw-r--r--gcc/testsuite/g++.dg/template/spec21.C28
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;
+}