forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			197 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			197 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
// RUN: %clang_cc1 -verify -std=c++11 %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>();
 | 
						|
}
 | 
						|
 | 
						|
namespace TemplatePacksAndLambdas {
 | 
						|
  template <typename ...T> int g(T...);
 | 
						|
  struct S {
 | 
						|
    template <typename ...T> static void f(int f = g([]{ static T t; return ++t; }()...)) {}
 | 
						|
  };
 | 
						|
  void h() { S::f<int, int, int>(); }
 | 
						|
}
 | 
						|
 | 
						|
namespace PR9685 {
 | 
						|
  template <class Thing> void forEach(Thing t) { t.func(); }
 | 
						|
 | 
						|
  template <typename T> void doIt() {
 | 
						|
    struct Functor {
 | 
						|
      void func() { (void)i; }
 | 
						|
      int i;
 | 
						|
    };
 | 
						|
 | 
						|
    forEach(Functor());
 | 
						|
  }
 | 
						|
 | 
						|
  void call() {
 | 
						|
    doIt<int>();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
namespace PR12702 {
 | 
						|
  struct S {
 | 
						|
    template <typename F> bool apply(F f) { return f(); }
 | 
						|
  };
 | 
						|
 | 
						|
  template <typename> struct T {
 | 
						|
    void foo() {
 | 
						|
      struct F {
 | 
						|
        int x;
 | 
						|
 | 
						|
        bool operator()() { return x == 0; }
 | 
						|
      };
 | 
						|
 | 
						|
      S().apply(F());
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  void call() { T<int>().foo(); }
 | 
						|
}
 | 
						|
 | 
						|
namespace PR17139 {
 | 
						|
  template <class T> void foo(const T &t) { t.foo(); }
 | 
						|
 | 
						|
  template <class F> void bar(F *f) {
 | 
						|
    struct B {
 | 
						|
      F *fn;
 | 
						|
      void foo() const { fn(); }
 | 
						|
    } b = { f };
 | 
						|
    foo(b);
 | 
						|
  }
 | 
						|
 | 
						|
  void go() {}
 | 
						|
 | 
						|
  void test() { bar(go); }
 | 
						|
}
 | 
						|
 | 
						|
namespace PR17740 {
 | 
						|
class C {
 | 
						|
public:
 | 
						|
  template <typename T> static void foo(T function);
 | 
						|
  template <typename T> static void bar(T function);
 | 
						|
  template <typename T> static void func(T function);
 | 
						|
};
 | 
						|
 | 
						|
template <typename T> void C::foo(T function) { function(); }
 | 
						|
 | 
						|
template <typename T> void C::bar(T function) {
 | 
						|
  foo([&function]() { function(); });
 | 
						|
}
 | 
						|
 | 
						|
template <typename T> void C::func(T function) {
 | 
						|
  struct Struct {
 | 
						|
    T mFunction;
 | 
						|
 | 
						|
    Struct(T function) : mFunction(function) {};
 | 
						|
 | 
						|
    void operator()() {
 | 
						|
      mFunction();
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
  bar(Struct(function));
 | 
						|
}
 | 
						|
 | 
						|
void call() {
 | 
						|
  C::func([]() {});
 | 
						|
}
 | 
						|
}
 | 
						|
 | 
						|
namespace PR14373 {
 | 
						|
  struct function {
 | 
						|
    template <typename _Functor> function(_Functor __f) { __f(); }
 | 
						|
  };
 | 
						|
  template <typename Func> function exec_func(Func f) {
 | 
						|
    struct functor {
 | 
						|
      functor(Func f) : func(f) {}
 | 
						|
      void operator()() const { func(); }
 | 
						|
      Func func;
 | 
						|
    };
 | 
						|
    return functor(f);
 | 
						|
  }
 | 
						|
  struct Type {
 | 
						|
    void operator()() const {}
 | 
						|
  };
 | 
						|
  int call() {
 | 
						|
    exec_func(Type());
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
namespace PR18907 {
 | 
						|
template <typename>
 | 
						|
class C : public C<int> {}; // expected-error{{within its own definition}}
 | 
						|
 | 
						|
template <typename X>
 | 
						|
void F() {
 | 
						|
  struct A : C<X> {};
 | 
						|
}
 | 
						|
 | 
						|
struct B {
 | 
						|
  void f() { F<int>(); }
 | 
						|
};
 | 
						|
}
 |