68 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -verify %s
 | 
						|
template<typename T>
 | 
						|
void f0() {
 | 
						|
  struct X;
 | 
						|
  typedef struct Y {
 | 
						|
    T (X::* f1())(int) { return 0; }
 | 
						|
  } Y2;
 | 
						|
 | 
						|
  Y2 y = Y();
 | 
						|
}
 | 
						|
 | 
						|
template void f0<int>();
 | 
						|
 | 
						|
// PR5764
 | 
						|
namespace PR5764 {
 | 
						|
  struct X {
 | 
						|
    template <typename T>
 | 
						|
    void Bar() {
 | 
						|
      typedef T ValueType;
 | 
						|
      struct Y {
 | 
						|
        Y() { V = ValueType(); }
 | 
						|
 | 
						|
        ValueType V;
 | 
						|
      };
 | 
						|
 | 
						|
      Y y;
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  void test(X x) {
 | 
						|
    x.Bar<int>();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// Instantiation of local classes with virtual functions.
 | 
						|
namespace local_class_with_virtual_functions {
 | 
						|
  template <typename T> struct X { };
 | 
						|
  template <typename T> struct Y { };
 | 
						|
 | 
						|
  template <typename T>
 | 
						|
  void f() {
 | 
						|
    struct Z : public X<Y<T>*> {
 | 
						|
      virtual void g(Y<T>* y) { }
 | 
						|
      void g2(int x) {(void)x;}
 | 
						|
    };
 | 
						|
    Z z;
 | 
						|
    (void)z;
 | 
						|
  }
 | 
						|
 | 
						|
  struct S { };
 | 
						|
  void test() { f<S>(); }
 | 
						|
}
 | 
						|
 | 
						|
namespace PR8801 {
 | 
						|
  template<typename T>
 | 
						|
  void foo() {
 | 
						|
    class X;
 | 
						|
    typedef int (X::*pmf_type)();
 | 
						|
    class X : public T { };
 | 
						|
    
 | 
						|
    pmf_type pmf = &T::foo;
 | 
						|
  }
 | 
						|
 | 
						|
  struct Y { int foo(); };
 | 
						|
 | 
						|
  template void foo<Y>();
 | 
						|
}
 |