1 // RUN: %clang_cc1 -verify %s
2 // expected-no-diagnostics
3 template<typename T>
4 void f0() {
5   struct X;
6   typedef struct Y {
7     T (X::* f1())(int) { return 0; }
8   } Y2;
9 
10   Y2 y = Y();
11 }
12 
13 template void f0<int>();
14 
15 // PR5764
16 namespace PR5764 {
17   struct X {
18     template <typename T>
19     void Bar() {
20       typedef T ValueType;
21       struct Y {
22         Y() { V = ValueType(); }
23 
24         ValueType V;
25       };
26 
27       Y y;
28     }
29   };
30 
31   void test(X x) {
32     x.Bar<int>();
33   }
34 }
35 
36 // Instantiation of local classes with virtual functions.
37 namespace local_class_with_virtual_functions {
38   template <typename T> struct X { };
39   template <typename T> struct Y { };
40 
41   template <typename T>
42   void f() {
43     struct Z : public X<Y<T>*> {
44       virtual void g(Y<T>* y) { }
45       void g2(int x) {(void)x;}
46     };
47     Z z;
48     (void)z;
49   }
50 
51   struct S { };
52   void test() { f<S>(); }
53 }
54 
55 namespace PR8801 {
56   template<typename T>
57   void foo() {
58     class X;
59     typedef int (X::*pmf_type)();
60     class X : public T { };
61 
62     pmf_type pmf = &T::foo;
63   }
64 
65   struct Y { int foo(); };
66 
67   template void foo<Y>();
68 }
69