--- /dev/null
+// Bug: fold is too eager about pushing down CLEANUP_POINT_EXPR.
+
+int d;
+
+struct A {
+ A() { }
+ ~A() { d = 1; }
+};
+
+int f (const A& a)
+{
+ return 1;
+}
+
+main ()
+{
+ if (f (A()) && d == 0)
+ return 0;
+ return 1;
+}
--- /dev/null
+// Build don't link:
+
+class A {
+public:
+ void f(const char * const * );
+};
+void f(const char * const *) {}
+
+void g()
+{
+ char *ar[10];
+ A a;
+ f(ar);
+ a.f(ar);
+}
--- /dev/null
+template <int S=0, class T=int>
+struct X
+{};
+
+template <>
+struct X<0,int>
+{};
+
+template <int S>
+struct X<S,int>
+: X<>
+{};
+
+int main()
+{
+ X<1,int> x;
+}
--- /dev/null
+template <class T>
+void f(T);
+
+class C
+{
+ template <class T>
+ friend void f(T);
+
+ int i;
+};
+
+
+template <class T>
+void f(T)
+{
+ C c;
+ c.i = 3;
+}
+
+
+int main()
+{
+ f(7);
+}
--- /dev/null
+template <class T>
+void f(T);
+
+template <class U>
+class C
+{
+ template <class T>
+ friend void f(T)
+ {
+ C<U> c;
+ c.i = 3;
+ }
+
+public:
+
+ void g()
+ {
+ f(3.0);
+ }
+
+ int i;
+};
+
+int main()
+{
+ f(7);
+ C<double> c;
+ c.g();
+}
--- /dev/null
+template <class T>
+class C;
+
+template <class T>
+struct S
+{
+ template <class U>
+ void f(U u)
+ {
+ C<U> cu;
+ cu.i = 3; // ERROR - S<double>::f<U> is a friend, but this is
+ // S<int>::f<double>.
+ }
+};
+
+
+template <class T>
+class C
+{
+ template <class U>
+ friend void S<T>::f(U);
+
+ int i;
+};
+
+
+int main()
+{
+ S<int> si;
+ si.f(3.0);
+}
--- /dev/null
+template <class T>
+class C;
+
+template <class T>
+struct S
+{
+ template <class U>
+ void f(U u1, U u2) {}
+
+ template <class U>
+ void f(U u)
+ {
+ C<T> ct;
+ ct.i = 3;
+ }
+};
+
+
+template <class T>
+class C
+{
+ template <class U>
+ friend void S<T>::f(U);
+
+ int i;
+};
+
+
+int main()
+{
+ S<int> si;
+ si.f(3.0);
+}
--- /dev/null
+template <class T>
+class C;
+
+template <class U>
+struct S
+{
+ template <class V>
+ void f(V v)
+ {
+ C<V> cv;
+ cv.i = 3;
+ }
+};
+
+
+template <class T>
+class C
+{
+ template <class U>
+ template <class V>
+ friend void S<U>::f(V);
+
+ int i;
+};
+
+
+int main()
+{
+ S<int> si;
+ si.f(3.0);
+ S<long> sl;
+ sl.f('c');
+}
--- /dev/null
+// Build don't link:
+
+template <class T>
+void f(T);
+
+class C
+{
+ friend void f<>(double);
+
+ int i;
+};
+
+
+template <class T>
+void f(T)
+{
+ C c;
+ c.i = 3; // ERROR - f<double> is a friend, this is f<int>.
+}
+
+
+int main()
+{
+ f(7);
+}
--- /dev/null
+class C
+{
+ template <class T>
+ friend void f(T);
+
+ int i;
+};
+
+
+template <class T>
+void f(T)
+{
+ C c;
+ c.i = 3;
+}
+
+
+int main()
+{
+ f(7);
+}
--- /dev/null
+class C
+{
+ template <class T>
+ friend void f(T)
+ {
+ C c;
+ c.i = 3;
+ }
+
+ int i;
+};
+
+
+int main()
+{
+ f(7);
+}
--- /dev/null
+template <class T>
+void f(T);
+
+class C
+{
+ template <class T>
+ friend void f(T)
+ {
+ C c;
+ c.i = 3;
+ }
+
+public:
+
+ void g()
+ {
+ f(3.0);
+ }
+
+ int i;
+};
+
+int main()
+{
+ f(7);
+ C c;
+ c.g();
+}
--- /dev/null
+template <class T>
+void f(T);
+
+template <class U>
+class C
+{
+ template <class T>
+ friend void f(T);
+
+ int i;
+};
+
+
+template <class T>
+void f(T)
+{
+ C<T> c;
+ c.i = 3;
+}
+
+
+int main()
+{
+ f(7);
+}
--- /dev/null
+template <class T>
+class C
+{
+ friend void f (C<T> c)
+ {
+ c.i = 3;
+ }
+
+ int i;
+};
+
+
+int main()
+{
+ C<int> ci;
+
+ f(ci);
+}
--- /dev/null
+template <class U>
+class C
+{
+ template <class T>
+ friend void f(T);
+
+ int i;
+};
+
+
+template <class T>
+void f(T)
+{
+ C<int> c;
+ c.i = 3;
+}
+
+
+int main()
+{
+ f(7);
+}
--- /dev/null
+// Build don't link:
+
+template<class T>
+struct X_two {
+ template <class T2> T2 conv_compare_ge(T2 test) {
+ T2 tmp_value = T2 (0);
+ return (tmp_value > test ? tmp_value : test);
+ }
+};
+
+template int X_two<double>::conv_compare_ge(int);
+
template<int N2, class T, int N3>
static void f(B<N2,T>, B<N3,T> b)
{
- D<N2,N3,N>::E::f(b);
+ typedef typename D<N2,N3,N>::E E;
+ E::f(b);
}
};
--- /dev/null
+// Build don't link:
+
+template <class T>
+class X {
+public:
+ T x;
+};
+
+class Y {
+public:
+ template <class T> static void f(X<T>& a) {}
+
+ void g(void);
+};
+
+void
+Y::g(void)
+{
+ X<int> a;
+
+ f(a);
+}
+
+
--- /dev/null
+template <class T, template <class T> class C>
+struct X
+{};
+
+template <class T>
+struct Y
+{};
+
+template <class T>
+struct Z
+{};
+
+template <class T>
+struct X<T,Y>
+{};
+
+int main()
+{
+ X<int,Y> a;
+ X<int,Z> b;
+}