Home | History | Annotate | Download | only in SemaTemplate
      1 // RUN: %clang_cc1 -verify -std=c++11 %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 }
     68 
     69 namespace TemplatePacksAndLambdas {
     70   template <typename ...T> int g(T...);
     71   struct S {
     72     template <typename ...T> static void f(int f = g([]{ static T t; return ++t; }()...)) {}
     73   };
     74   void h() { S::f<int, int, int>(); }
     75 }
     76 
     77 namespace PR9685 {
     78   template <class Thing> void forEach(Thing t) { t.func(); }
     79 
     80   template <typename T> void doIt() {
     81     struct Functor {
     82       void func() { (void)i; }
     83       int i;
     84     };
     85 
     86     forEach(Functor());
     87   }
     88 
     89   void call() {
     90     doIt<int>();
     91   }
     92 }
     93 
     94 namespace PR12702 {
     95   struct S {
     96     template <typename F> bool apply(F f) { return f(); }
     97   };
     98 
     99   template <typename> struct T {
    100     void foo() {
    101       struct F {
    102         int x;
    103 
    104         bool operator()() { return x == 0; }
    105       };
    106 
    107       S().apply(F());
    108     }
    109   };
    110 
    111   void call() { T<int>().foo(); }
    112 }
    113 
    114 namespace PR17139 {
    115   template <class T> void foo(const T &t) { t.foo(); }
    116 
    117   template <class F> void bar(F *f) {
    118     struct B {
    119       F *fn;
    120       void foo() const { fn(); }
    121     } b = { f };
    122     foo(b);
    123   }
    124 
    125   void go() {}
    126 
    127   void test() { bar(go); }
    128 }
    129 
    130 namespace PR17740 {
    131 class C {
    132 public:
    133   template <typename T> static void foo(T function);
    134   template <typename T> static void bar(T function);
    135   template <typename T> static void func(T function);
    136 };
    137 
    138 template <typename T> void C::foo(T function) { function(); }
    139 
    140 template <typename T> void C::bar(T function) {
    141   foo([&function]() { function(); });
    142 }
    143 
    144 template <typename T> void C::func(T function) {
    145   struct Struct {
    146     T mFunction;
    147 
    148     Struct(T function) : mFunction(function) {};
    149 
    150     void operator()() {
    151       mFunction();
    152     };
    153   };
    154 
    155   bar(Struct(function));
    156 }
    157 
    158 void call() {
    159   C::func([]() {});
    160 }
    161 }
    162 
    163 namespace PR14373 {
    164   struct function {
    165     template <typename _Functor> function(_Functor __f) { __f(); }
    166   };
    167   template <typename Func> function exec_func(Func f) {
    168     struct functor {
    169       functor(Func f) : func(f) {}
    170       void operator()() const { func(); }
    171       Func func;
    172     };
    173     return functor(f);
    174   }
    175   struct Type {
    176     void operator()() const {}
    177   };
    178   int call() {
    179     exec_func(Type());
    180     return 0;
    181   }
    182 }
    183 
    184 namespace PR18907 {
    185 template <typename>
    186 class C : public C<int> {}; // expected-error{{within its own definition}}
    187 
    188 template <typename X>
    189 void F() {
    190   struct A : C<X> {};
    191 }
    192 
    193 struct B {
    194   void f() { F<int>(); }
    195 };
    196 }
    197