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