Home | History | Annotate | Download | only in SemaTemplate
      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