aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@gcc.gnu.org>1997-11-11 01:38:34 -0500
committerJason Merrill <jason@gcc.gnu.org>1997-11-11 01:38:34 -0500
commit1afc355025f984fb0b26d68a7337f987890e6042 (patch)
tree6bcf817e082ef03d76898ab88cd6dda4a0cf2b3d /gcc
parent343fdf03d406d874d1a6fe90d94a16949a2d9f4b (diff)
downloadgcc-1afc355025f984fb0b26d68a7337f987890e6042.zip
gcc-1afc355025f984fb0b26d68a7337f987890e6042.tar.gz
gcc-1afc355025f984fb0b26d68a7337f987890e6042.tar.bz2
new tests
From-SVN: r16426
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/g++.old-deja/g++.eh/rethrow1.C45
-rw-r--r--gcc/testsuite/g++.old-deja/g++.eh/rethrow2.C45
-rw-r--r--gcc/testsuite/g++.old-deja/g++.eh/rethrow3.C38
-rw-r--r--gcc/testsuite/g++.old-deja/g++.jason/inline3.C42
-rw-r--r--gcc/testsuite/g++.old-deja/g++.jason/overload36.C15
-rw-r--r--gcc/testsuite/g++.old-deja/g++.jason/pmf9.C57
-rw-r--r--gcc/testsuite/g++.old-deja/g++.jason/template44.C61
-rw-r--r--gcc/testsuite/g++.old-deja/g++.mike/virt6.C39
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/explicit50.C15
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/explicit51.C18
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/explicit52.C18
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/explicit53.C21
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/explicit54.C35
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/explicit55.C14
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/explicit56.C16
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/explicit57.C42
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/explicit58.C41
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/explicit59.C41
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/explicit60.C43
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/explicit61.C43
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/explicit62.C19
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/explicit63.C19
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/explicit64.C23
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/explicit65.C33
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/memtemp63.C13
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/partial1.C26
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/typedef1.C18
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/typename3.C17
-rw-r--r--gcc/testsuite/g++.old-deja/g++.pt/unify1.C14
29 files changed, 871 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.old-deja/g++.eh/rethrow1.C b/gcc/testsuite/g++.old-deja/g++.eh/rethrow1.C
new file mode 100644
index 0000000..ef4dcb4
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.eh/rethrow1.C
@@ -0,0 +1,45 @@
+// Testcase for proper handling of rethrow.
+
+#include <stdio.h>
+
+int c, d;
+
+struct A
+{
+ int i;
+ A () { i = ++c; printf ("A() %d\n", i); }
+ A (const A&) { i = ++c; printf ("A(const A&) %d\n", i); }
+ ~A() { printf ("~A() %d\n", i); ++d; }
+};
+
+int
+main ()
+{
+ try
+ {
+ try
+ {
+ printf ("Throwing 1...\n");
+ throw A();
+ }
+ catch (A)
+ {
+ try
+ {
+ printf ("Throwing 2...\n");
+ throw A();
+ }
+ catch (A)
+ {
+ printf ("Throwing 3...\n");
+ throw;
+ }
+ }
+ }
+ catch (A)
+ {
+ printf ("Caught.\n");
+ }
+ printf ("c == %d, d == %d\n", c, d);
+ return c != d;
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.eh/rethrow2.C b/gcc/testsuite/g++.old-deja/g++.eh/rethrow2.C
new file mode 100644
index 0000000..2d2583b
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.eh/rethrow2.C
@@ -0,0 +1,45 @@
+// Testcase for proper handling of rethrow.
+
+#include <stdio.h>
+
+int c, d;
+
+struct A
+{
+ int i;
+ A () { i = ++c; printf ("A() %d\n", i); }
+ A (const A&) { i = ++c; printf ("A(const A&) %d\n", i); }
+ ~A() { printf ("~A() %d\n", i); ++d; }
+};
+
+int
+main ()
+{
+ try
+ {
+ try
+ {
+ printf ("Throwing 1...\n");
+ throw A();
+ }
+ catch (A)
+ {
+ try
+ {
+ printf ("Throwing 2...\n");
+ throw;
+ }
+ catch (A)
+ {
+ printf ("Throwing 3...\n");
+ throw;
+ }
+ }
+ }
+ catch (A)
+ {
+ printf ("Caught.\n");
+ }
+ printf ("c == %d, d == %d\n", c, d);
+ return c != d;
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.eh/rethrow3.C b/gcc/testsuite/g++.old-deja/g++.eh/rethrow3.C
new file mode 100644
index 0000000..355bedc
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.eh/rethrow3.C
@@ -0,0 +1,38 @@
+#include <stdio.h>
+#include <exception>
+
+static void
+eh_terminate ()
+{
+ printf ("CALLING TERMINATE\n");
+ exit (1);
+}
+
+void
+eh_test (int level)
+{
+ try
+ {
+ if (level < 2)
+ eh_test (level + 1);
+ else
+ {
+ printf ("%d: Throwing\n", level);
+ throw (level);
+ }
+ }
+ catch (int &x)
+ {
+ printf ("%d: Got level %d\n",
+ level, x);
+
+ if (level > 0)
+ throw;
+ }
+}
+
+main ()
+{
+ set_terminate (&eh_terminate);
+ eh_test (0);
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.jason/inline3.C b/gcc/testsuite/g++.old-deja/g++.jason/inline3.C
new file mode 100644
index 0000000..00d57eb
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.jason/inline3.C
@@ -0,0 +1,42 @@
+// Testcase for order of destruction.
+// Special g++ Options: -O2
+
+extern "C" int printf( char const*, ... );
+int c;
+int r;
+
+struct B {
+ B();
+ B( B const& );
+ ~B();
+};
+
+struct A {
+ A();
+ A( A const& );
+ ~A();
+ operator B ();
+};
+
+inline A::operator B () { printf( "operator B ()\n"); return B(); }
+
+A f();
+void g( B const& );
+
+int
+main()
+{
+ g( f() );
+ return r;
+}
+
+B::B() { printf( "B::B()\n" ); if (++c != 2) r = 1; }
+B::B( B const& ) { printf( "B::B( B const& )\n" ); r = 1; }
+B::~B() { printf( "B::~B()\n" ); if (--c != 1) r = 1; }
+
+A::A() { printf( "A::A()\n" ); if (++c != 1) r = 1; }
+A::A( A const& ) { printf( "A::A( A const& )\n" ); r = 1; }
+A::~A() { printf( "A::~A()\n" ); if (--c != 0) r = 1; }
+
+A f() { printf( "f()\n"); return A(); }
+void g( B const& ) { printf( "g()\n"); }
diff --git a/gcc/testsuite/g++.old-deja/g++.jason/overload36.C b/gcc/testsuite/g++.old-deja/g++.jason/overload36.C
new file mode 100644
index 0000000..f5e6fb6
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.jason/overload36.C
@@ -0,0 +1,15 @@
+// Test for subsequence checking in overload resolution.
+
+class foo {
+public:
+ void operator <<(char *) { }
+ void operator <<(const char * const &);
+};
+
+int
+main()
+{
+ char s[20];
+ foo f;
+ f << s;
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.jason/pmf9.C b/gcc/testsuite/g++.old-deja/g++.jason/pmf9.C
new file mode 100644
index 0000000..335cfcc
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.jason/pmf9.C
@@ -0,0 +1,57 @@
+// PRMS id: g++/13340
+// Build don't link:
+
+class rectangle {
+
+public:
+ rectangle();
+ int overlaps() const;
+
+};
+
+class region
+{
+ friend class region_impl;
+
+public:
+ region();
+ typedef int (region::* region_func)() const;
+
+};
+
+class region_impl {
+ friend class region;
+
+private:
+ rectangle content, mbb;
+ region_impl *link_p;
+ region_impl(const rectangle &content);
+
+public:
+ int iterate(region *region_p, region::region_func what,
+ const rectangle &clip_rect) const;
+ int iterate(region *region_p, region::region_func what,
+ const region_impl &clip_rgn) const;
+};
+
+
+int
+region_impl::iterate (region *region_p, region::region_func what,
+ const rectangle &clip_rect) const
+{
+ for (const region_impl *p = this; p != 0 && p->mbb.overlaps();
+ p = p->link_p)
+ if (p->content.overlaps())
+ if (!(region_p->*what)()) return 0;
+ return 1;
+}
+
+int
+region_impl::iterate (region *region_p, region::region_func what,
+ const region_impl &clip_rgn) const
+{
+ for (const region_impl *p = this; p != 0 && p->mbb.overlaps();
+ p = p->link_p)
+ if (!clip_rgn.iterate(region_p, what, p->content)) return 0;
+ return 1;
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.jason/template44.C b/gcc/testsuite/g++.old-deja/g++.jason/template44.C
new file mode 100644
index 0000000..93b47bd
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.jason/template44.C
@@ -0,0 +1,61 @@
+#include <stdlib.h>
+#include <string.h>
+
+template <class T>
+class List {
+public:
+ int len;
+ T *array;
+
+ int length() const { return( len ); }
+
+ List() : len( 0 ), array( 0 ) {}
+};
+
+template <class T>
+int AlgoStdCompare(const T* a, const T* b) {
+ if (*a < *b)
+ return -1;
+ else
+ return (*a > *b); // 0 if equal, 1 if greater
+}
+
+int AlgoStdCompare(const char* const* a, const char * const*b)
+{
+ return strcmp(*a,*b);
+}
+
+template <class T>
+void AlgoFixupSort(List< T >* , int, int ) {
+}
+
+template <class T>
+void AlgoSort(int (*compare)(const T *, const T *),
+ void (*fixup)( List<T> *, int first, int last),
+ List< T >* theList, int first, int last) {
+ if (last < 0)
+ last = theList->length()-1;
+
+ qsort(theList->array+first, last-first+1, sizeof(T),
+ (int (*)(const void *, const void *))compare);
+ if (fixup)
+ fixup(theList, first, last);
+}
+
+template <class T>
+void AlgoSort(List< T >* theList, int first = 0, int last = -1) {
+ int (*compare)(const T*, const T*) = AlgoStdCompare;
+ void (*fixup)( List<T> *, int first, int last) = AlgoFixupSort;
+
+ AlgoSort(compare, fixup, theList, first, last);
+}
+
+int
+main()
+{
+ List<const char *> slist;
+ AlgoSort( &slist );
+
+ List<int> ilist;
+ AlgoSort( &ilist );
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.mike/virt6.C b/gcc/testsuite/g++.old-deja/g++.mike/virt6.C
new file mode 100644
index 0000000..61491ce
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.mike/virt6.C
@@ -0,0 +1,39 @@
+// This testcase ensures that we can build vtable names for complex MI
+// classes.
+
+class C_A {
+public:
+ virtual int foo(void *) { }
+} a;
+
+class C_B : public C_A {
+} b;
+
+class C_C : public C_A {
+} c;
+
+class C_D : public C_A {
+} d;
+
+class C_E : public C_C, public C_B {
+public:
+ virtual int foo(void *) { }
+} e;
+
+class C_F : public C_D, public C_B {
+public:
+ virtual int foo(void *) { }
+} f;
+
+class C_G : public C_A {
+public:
+ virtual int foo(void *) { }
+} g;
+
+class C_H : public C_G, public C_E, public C_F {
+public:
+ virtual int foo(void *) { }
+} h;
+
+int main() {
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit50.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit50.C
new file mode 100644
index 0000000..8c424cc
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit50.C
@@ -0,0 +1,15 @@
+extern "C" void abort ();
+
+template <class T> int f ()
+{
+ return sizeof(T);
+}
+
+int main ()
+{
+ if (f<long> () != sizeof(long)
+ || f<char> () != sizeof(char)
+ || f<long> () != sizeof(long)
+ || f<long int> () != sizeof(long int))
+ abort ();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit51.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit51.C
new file mode 100644
index 0000000..e4a0a64
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit51.C
@@ -0,0 +1,18 @@
+extern "C" void abort ();
+
+template <int a> int fact ()
+{
+ return 0;
+}
+
+template <> int fact<1> ()
+{
+ return 1;
+}
+
+int main()
+{
+ if (fact<3> () != 0 || fact<1> () != 1
+ || fact<3> () != 0 || fact<1> () != 1 || fact<1+0> () != 1)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit52.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit52.C
new file mode 100644
index 0000000..368573e
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit52.C
@@ -0,0 +1,18 @@
+extern "C" void abort ();
+
+template <int a> inline int fact ()
+{
+ return a * fact<a-1> ();
+}
+
+template <> inline int fact<1> ()
+{
+ return 1;
+}
+
+int main()
+{
+ if (fact<3> () != 6 || fact<1> () != 1
+ || fact<3> () != 6 || fact<1> () != 1 || fact<1+0> () != 1)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit53.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit53.C
new file mode 100644
index 0000000..e66cca9
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit53.C
@@ -0,0 +1,21 @@
+extern "C" void abort ();
+
+template <int a> inline int fact ();
+template <> inline int fact<1> ();
+
+template <int a> inline int fact ()
+{
+ return a * fact<a-1> ();
+}
+
+template <> inline int fact<1> ()
+{
+ return 1;
+}
+
+int main()
+{
+ if (fact<3> () != 6 || fact<1> () != 1
+ || fact<3> () != 6 || fact<1> () != 1 || fact<1+0> () != 1)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit54.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit54.C
new file mode 100644
index 0000000..9d185be
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit54.C
@@ -0,0 +1,35 @@
+extern "C" void abort ();
+
+template <int a> inline int fact2 ();
+
+template <int a> inline int fact ()
+{
+ return a * fact2<a-1> ();
+}
+
+template <> inline int fact<1> ()
+{
+ return 1;
+}
+
+template <int a> inline int fact2 ()
+{
+ return a*fact<a-1>();
+}
+
+template <> inline int fact2<1> ()
+{
+ return 1;
+}
+
+int main()
+{
+ if (fact<3> () != 6 || fact<1> () != 1
+ || fact<3> () != 6 || fact<1> () != 1 || fact<1+0> () != 1)
+ abort ();
+ if (fact2<3> () != 6 || fact2<1> () != 1
+ || fact2<3> () != 6 || fact2<1> () != 1 || fact2<1+0> () != 1)
+ abort ();
+ if (fact2<4> () != 24 || fact<4> () != 24)
+ abort ();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit55.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit55.C
new file mode 100644
index 0000000..c9d3125
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit55.C
@@ -0,0 +1,14 @@
+template <class T> T* create ()
+{
+ return new T;
+}
+
+template <class T> T* create2()
+{
+ return create<T>();
+}
+
+int main()
+{
+ int *p = create2<int>();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit56.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit56.C
new file mode 100644
index 0000000..d202160
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit56.C
@@ -0,0 +1,16 @@
+template <class T> T* create ();
+
+template <class T> T* create2()
+{
+ return create<T>();
+}
+
+template <class T> T* create ()
+{
+ return new T;
+}
+
+int main()
+{
+ int *p = create2<int>();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit57.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit57.C
new file mode 100644
index 0000000..d1f0ea8
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit57.C
@@ -0,0 +1,42 @@
+extern "C" void abort ();
+
+int a = 0;
+
+template <class T> void f ();
+template <class T> void g ()
+{
+ if (a)
+ abort ();
+}
+
+template <> void g<char> ()
+{
+}
+
+template <class T> class C
+{
+ public:
+ void ff () { f<T> (); }
+ void gg () { g<T> (); }
+};
+
+template <class T> void f ()
+{
+ if (a)
+ abort ();
+}
+
+template <> void f<char> ()
+{
+}
+
+int main ()
+{
+ C<int> c;
+ c.ff();
+ c.gg();
+ a = 1;
+ C<char> d;
+ d.ff();
+ d.gg();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit58.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit58.C
new file mode 100644
index 0000000..7193d2d
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit58.C
@@ -0,0 +1,41 @@
+extern "C" void abort ();
+
+template <class T> void f ();
+template <class T> void g ()
+{
+ abort ();
+}
+
+template <> void g<char> ()
+{
+ abort ();
+}
+
+template <class T> class C
+{
+ public:
+ template <class U> void f () {}
+ template <class U> void g () {}
+ void ff () { f<T> (); }
+ void gg () { g<T> (); }
+};
+
+template <class T> void f ()
+{
+ abort ();
+}
+
+template <> void f<char> ()
+{
+ abort ();
+}
+
+int main ()
+{
+ C<int> c;
+ c.ff();
+ c.gg();
+ C<char> d;
+ d.ff();
+ d.gg();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit59.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit59.C
new file mode 100644
index 0000000..847a80a
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit59.C
@@ -0,0 +1,41 @@
+extern "C" void abort ();
+
+template <class T> void f ();
+template <class T> void g ()
+{
+ abort ();
+}
+
+template <> void g<char> ()
+{
+ abort ();
+}
+
+template <class T> class C
+{
+ public:
+ void ff () { f<T> (); }
+ void gg () { g<T> (); }
+ template <class U> void f () {}
+ template <class U> void g () {}
+};
+
+template <class T> void f ()
+{
+ abort ();
+}
+
+template <> void f<char> ()
+{
+ abort ();
+}
+
+int main ()
+{
+ C<int> c;
+ c.ff();
+ c.gg();
+ C<char> d;
+ d.ff();
+ d.gg();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit60.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit60.C
new file mode 100644
index 0000000..5fda333
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit60.C
@@ -0,0 +1,43 @@
+extern "C" void abort ();
+
+template <class T> void f ();
+template <class T> void g ()
+{
+ abort ();
+}
+
+template <> void g<char> ()
+{
+ abort ();
+}
+
+template <class T> class C
+{
+ public:
+ void ff () { f<T> (); }
+ void gg () { g<T> (); }
+ template <class U> void f () {}
+ template <class U> void g () {}
+ template <class U> void f (int) { abort(); }
+ template <class U> void g (int) { abort(); }
+};
+
+template <class T> void f ()
+{
+ abort ();
+}
+
+template <> void f<char> ()
+{
+ abort ();
+}
+
+int main ()
+{
+ C<int> c;
+ c.ff();
+ c.gg();
+ C<char> d;
+ d.ff();
+ d.gg();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit61.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit61.C
new file mode 100644
index 0000000..69b7891
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit61.C
@@ -0,0 +1,43 @@
+extern "C" void abort ();
+
+template <class T> void f ();
+template <class T> void g ()
+{
+ abort ();
+}
+
+template <> void g<char> ()
+{
+ abort ();
+}
+
+template <class T> class C
+{
+ public:
+ void ff () { f<T> (0); }
+ void gg () { g<T> (1); }
+ template <class U> void f () { abort(); }
+ template <class U> void g () { abort(); }
+ template <class U> void f (int) {}
+ template <class U> void g (int) {}
+};
+
+template <class T> void f ()
+{
+ abort ();
+}
+
+template <> void f<char> ()
+{
+ abort ();
+}
+
+int main ()
+{
+ C<int> c;
+ c.ff();
+ c.gg();
+ C<char> d;
+ d.ff();
+ d.gg();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit62.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit62.C
new file mode 100644
index 0000000..5917ce01
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit62.C
@@ -0,0 +1,19 @@
+extern "C" void abort ();
+
+template <class T> void f ()
+{
+}
+
+
+template <class T> class C
+{
+ friend void f<char> ();
+ public:
+ void ff () { f<char> (); }
+};
+
+int main ()
+{
+ C<int> c;
+ c.ff();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit63.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit63.C
new file mode 100644
index 0000000..ce4d99a
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit63.C
@@ -0,0 +1,19 @@
+extern "C" void abort ();
+
+template <class T> void f ()
+{
+}
+
+
+template <class T> class C
+{
+ friend void f<T> ();
+ public:
+ void ff () { f<T> (); }
+};
+
+int main ()
+{
+ C<int> c;
+ c.ff();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit64.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit64.C
new file mode 100644
index 0000000..2208b30
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit64.C
@@ -0,0 +1,23 @@
+extern "C" void abort ();
+
+template <class T> void f ()
+{
+ abort ();
+}
+
+template <> void f<char> ()
+{
+}
+
+template <class T> class C
+{
+ friend void f<char> ();
+ public:
+ void ff () { f<char> (); }
+};
+
+int main ()
+{
+ C<int> c;
+ c.ff();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit65.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit65.C
new file mode 100644
index 0000000..a026e8e
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit65.C
@@ -0,0 +1,33 @@
+extern "C" void abort ();
+
+template <class T> void f ()
+{
+ abort ();
+}
+
+template <> void f<char> ()
+{
+ abort ();
+}
+
+template <class T> void f (int)
+{
+ abort ();
+}
+
+template <> void f<char> (int)
+{
+}
+
+template <class T> class C
+{
+ friend void f<char> (int);
+ public:
+ void ff () { f<char> (0); }
+};
+
+int main ()
+{
+ C<int> c;
+ c.ff();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/memtemp63.C b/gcc/testsuite/g++.old-deja/g++.pt/memtemp63.C
new file mode 100644
index 0000000..6b7fc8e
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/memtemp63.C
@@ -0,0 +1,13 @@
+template <class T> struct A {
+ template <class U> void f (U u);
+};
+
+A<int> a;
+
+template <class T> template <class U> void A<T>::f (U u) { }
+
+main()
+{
+ a.f (24);
+}
+
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/partial1.C b/gcc/testsuite/g++.old-deja/g++.pt/partial1.C
new file mode 100644
index 0000000..7a92996
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/partial1.C
@@ -0,0 +1,26 @@
+template<class T_type, int N>
+class foo {
+public:
+ enum bar { z = 0 };
+};
+
+template<int N>
+class foo<double, N> {
+public:
+ enum bar { z = 1 };
+};
+
+template<class T_type>
+class foo<T_type, 2> {
+public:
+ enum bar { z = 2 };
+};
+
+int main()
+{
+ if ((foo<int,3>::z == 0) && (foo<double,3>::z == 1)
+ && (foo<float,2>::z == 2))
+ return 0;
+ else
+ return 1;
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/typedef1.C b/gcc/testsuite/g++.old-deja/g++.pt/typedef1.C
new file mode 100644
index 0000000..5de152e
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/typedef1.C
@@ -0,0 +1,18 @@
+// Testcase for handling of typedef wierdness.
+// Build don't link:
+
+template <class T>
+class A
+{
+ typedef enum
+ {
+ foo
+ } B;
+
+ A (B b);
+};
+
+template <class T>
+A<T>::A (B b)
+{
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/typename3.C b/gcc/testsuite/g++.old-deja/g++.pt/typename3.C
new file mode 100644
index 0000000..13a1fcc
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/typename3.C
@@ -0,0 +1,17 @@
+// Build don't link:
+// GROUPS passed templates
+template <class T>
+struct bar {
+ typedef typename T::baz baz;
+};
+
+template <class T>
+void foo(T)
+{
+ bar<T>::baz(); // ERROR - T is int.
+}
+
+void foobar()
+{
+ foo(3);
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/unify1.C b/gcc/testsuite/g++.old-deja/g++.pt/unify1.C
new file mode 100644
index 0000000..283e2f5
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.pt/unify1.C
@@ -0,0 +1,14 @@
+// Tests non-unification of parms that don't use template parms.
+// Build don't link:
+
+enum kind {a, b};
+
+class C { public: C () {} };
+
+template<class P>
+void f (P c, kind k) {}
+
+template<class P>
+void f (P c, P d, kind k) {}
+
+template void f (C c, C c, kind k);