| // RUN: %clang_cc1 -verify -std=c++11 %s | 
 | // RUN: %clang_cc1 -verify -std=c++11 -fdelayed-template-parsing %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>(); } | 
 | }; | 
 | } | 
 |  | 
 | namespace PR23194 { | 
 |   struct X { | 
 |     int operator()() const { return 0; } | 
 |   }; | 
 |   struct Y { | 
 |     Y(int) {} | 
 |   }; | 
 |   template <bool = true> int make_seed_pair() noexcept { | 
 |     struct state_t { | 
 |       X x; | 
 |       Y y{x()}; | 
 |     }; | 
 |     return 0; | 
 |   } | 
 |   int func() { | 
 |     return make_seed_pair(); | 
 |   } | 
 | } | 
 |  | 
 | namespace PR18653 { | 
 |   // Forward declarations | 
 |  | 
 |   template<typename T> void f1() { | 
 |     void g1(struct x1); | 
 |     struct x1 {}; | 
 |   } | 
 |   template void f1<int>(); | 
 |  | 
 |   template<typename T> void f1a() { | 
 |     void g1(union x1); | 
 |     union x1 {}; | 
 |   } | 
 |   template void f1a<int>(); | 
 |  | 
 |   template<typename T> void f2() { | 
 |     void g2(enum x2);  // expected-error{{ISO C++ forbids forward references to 'enum' types}} | 
 |     enum x2 { nothing }; | 
 |   } | 
 |   template void f2<int>(); | 
 |  | 
 |   template<typename T> void f3() { | 
 |     void g3(enum class x3); | 
 |     enum class x3 { nothing }; | 
 |   } | 
 |   template void f3<int>(); | 
 |  | 
 |  | 
 |   template<typename T> void f4() { | 
 |     void g4(struct x4 {} x);  // expected-error{{'x4' cannot be defined in a parameter type}} | 
 |   } | 
 |   template void f4<int>(); | 
 |  | 
 |   template<typename T> void f4a() { | 
 |     void g4(union x4 {} x);  // expected-error{{'x4' cannot be defined in a parameter type}} | 
 |   } | 
 |   template void f4a<int>(); | 
 |  | 
 |  | 
 |   template <class T> void f(); | 
 |   template <class T> struct S1 { | 
 |     void m() { | 
 |       f<class newclass>(); | 
 |       f<union newunion>(); | 
 |     } | 
 |   }; | 
 |   template struct S1<int>; | 
 |  | 
 |   template <class T> struct S2 { | 
 |     void m() { | 
 |       f<enum new_enum>();  // expected-error{{ISO C++ forbids forward references to 'enum' types}} | 
 |     } | 
 |   }; | 
 |   template struct S2<int>; | 
 |  | 
 |   template <class T> struct S3 { | 
 |     void m() { | 
 |       f<enum class new_enum>(); | 
 |     } | 
 |   }; | 
 |   template struct S3<int>; | 
 |  | 
 |   template <class T> struct S4 { | 
 |     struct local {}; | 
 |     void m() { | 
 |       f<local>(); | 
 |     } | 
 |   }; | 
 |   template struct S4<int>; | 
 |  | 
 |   template <class T> struct S4a { | 
 |     union local {}; | 
 |     void m() { | 
 |       f<local>(); | 
 |     } | 
 |   }; | 
 |   template struct S4a<int>; | 
 |  | 
 |   template <class T> struct S5 { | 
 |     enum local { nothing }; | 
 |     void m() { | 
 |       f<local>(); | 
 |     } | 
 |   }; | 
 |   template struct S5<int>; | 
 |  | 
 |   template <class T> struct S7 { | 
 |     enum class local { nothing }; | 
 |     void m() { | 
 |       f<local>(); | 
 |     } | 
 |   }; | 
 |   template struct S7<int>; | 
 |  | 
 |  | 
 |   template <class T> void fff(T *x); | 
 |   template <class T> struct S01 { | 
 |     struct local { }; | 
 |     void m() { | 
 |       local x; | 
 |       fff(&x); | 
 |     } | 
 |   }; | 
 |   template struct S01<int>; | 
 |  | 
 |   template <class T> struct S01a { | 
 |     union local { }; | 
 |     void m() { | 
 |       local x; | 
 |       fff(&x); | 
 |     } | 
 |   }; | 
 |   template struct S01a<int>; | 
 |  | 
 |   template <class T> struct S02 { | 
 |     enum local { nothing }; | 
 |     void m() { | 
 |       local x; | 
 |       fff(&x); | 
 |     } | 
 |   }; | 
 |   template struct S02<int>; | 
 |  | 
 |   template <class T> struct S03 { | 
 |     enum class local { nothing }; | 
 |     void m() { | 
 |       local x; | 
 |       fff(&x); | 
 |     } | 
 |   }; | 
 |   template struct S03<int>; | 
 |  | 
 |  | 
 |   template <class T> struct S04 { | 
 |     void m() { | 
 |       struct { } x; | 
 |       fff(&x); | 
 |     } | 
 |   }; | 
 |   template struct S04<int>; | 
 |  | 
 |   template <class T> struct S04a { | 
 |     void m() { | 
 |       union { } x; | 
 |       fff(&x); | 
 |     } | 
 |   }; | 
 |   template struct S04a<int>; | 
 |  | 
 |   template <class T> struct S05 { | 
 |     void m() { | 
 |       enum { nothing } x; | 
 |       fff(&x); | 
 |     } | 
 |   }; | 
 |   template struct S05<int>; | 
 |  | 
 |   template <class T> struct S06 { | 
 |     void m() { | 
 |       class { virtual void mmm() {} } x; | 
 |       fff(&x); | 
 |     } | 
 |   }; | 
 |   template struct S06<int>; | 
 | } | 
 |  | 
 | namespace PR20625 { | 
 | template <typename T> | 
 | void f() { | 
 |   struct N { | 
 |     static constexpr int get() { return 42; } | 
 |   }; | 
 |   constexpr int n = N::get(); | 
 |   static_assert(n == 42, "n == 42"); | 
 | } | 
 |  | 
 | void g() { f<void>(); } | 
 | } | 
 |  | 
 |  | 
 | namespace PR21332 { | 
 |   template<typename T> void f1() { | 
 |     struct S {  // expected-note{{in instantiation of member class 'S' requested here}} | 
 |       void g1(int n = T::error);  // expected-error{{type 'int' cannot be used prior to '::' because it has no members}} | 
 |     }; | 
 |   } | 
 |   template void f1<int>();  // expected-note{{in instantiation of function template specialization 'PR21332::f1<int>' requested here}} | 
 |  | 
 |   template<typename T> void f2() { | 
 |     struct S {  // expected-note{{in instantiation of member class 'S' requested here}} | 
 |       void g2() noexcept(T::error);  // expected-error{{type 'int' cannot be used prior to '::' because it has no members}} | 
 |     }; | 
 |   } | 
 |   template void f2<int>();  // expected-note{{in instantiation of function template specialization 'PR21332::f2<int>' requested here}} | 
 |  | 
 |   template<typename T> void f3() { | 
 |     enum S { | 
 |       val = T::error;  // expected-error{{expected '}' or ','}} expected-error{{type 'int' cannot be used prior to '::' because it has no members}} | 
 |     }; | 
 |   } | 
 |   template void f3<int>();  //expected-note{{in instantiation of function template specialization 'PR21332::f3<int>' requested here}} | 
 |  | 
 |   template<typename T> void f4() { | 
 |     enum class S { | 
 |       val = T::error;  // expected-error{{expected '}' or ','}} expected-error{{type 'int' cannot be used prior to '::' because it has no members}} | 
 |     }; | 
 |   } | 
 |   template void f4<int>();  // expected-note{{in instantiation of function template specialization 'PR21332::f4<int>' requested here}} | 
 |  | 
 |   template<typename T> void f5() { | 
 |     class S {  // expected-note {{in instantiation of default member initializer 'PR21332::f5()::S::val' requested here}} | 
 |       int val = T::error;  // expected-error {{type 'int' cannot be used prior to '::' because it has no members}} | 
 |      }; | 
 |   } | 
 |   template void f5<int>();  // expected-note {{in instantiation of function template specialization 'PR21332::f5<int>' requested here}} | 
 |  | 
 |   template<typename T> void f6() { | 
 |     class S {  // expected-note {{in instantiation of member function 'PR21332::f6()::S::get' requested here}} | 
 |       void get() { | 
 |         class S2 {  // expected-note {{in instantiation of member class 'S2' requested here}} | 
 |           void g1(int n = T::error);  // expected-error {{type 'int' cannot be used prior to '::' because it has no members}} | 
 |         }; | 
 |       } | 
 |     }; | 
 |   } | 
 |   template void f6<int>();  // expected-note{{in instantiation of function template specialization 'PR21332::f6<int>' requested here}} | 
 |  | 
 |   template<typename T> void f7() { | 
 |     struct S { void g() noexcept(undefined_val); };  // expected-error{{use of undeclared identifier 'undefined_val'}} | 
 |   } | 
 |   template void f7<int>(); | 
 | } | 
 |  | 
 | // rdar://23721638: Ensure that we correctly perform implicit | 
 | // conversions when instantiating the default arguments of local functions. | 
 | namespace rdar23721638 { | 
 |   struct A { | 
 |     A(const char *) = delete;  // expected-note 2 {{explicitly marked deleted here}} | 
 |   }; | 
 |  | 
 |   template <typename T> void foo() { | 
 |     struct Inner { // expected-note {{in instantiation}} | 
 |       void operator()(T a = "") {} // expected-error {{conversion function from 'const char [1]' to 'rdar23721638::A' invokes a deleted function}} | 
 |       // expected-note@-1 {{passing argument to parameter 'a' here}} | 
 |       // expected-note@-2 {{candidate function not viable}} | 
 |     }; | 
 |     Inner()(); // expected-error {{no matching function}} | 
 |   } | 
 |   template void foo<A>(); // expected-note 2 {{in instantiation}} | 
 |  | 
 |   template <typename T> void bar() { | 
 |     auto lambda = [](T a = "") {}; // expected-error {{conversion function from 'const char [1]' to 'rdar23721638::A' invokes a deleted function}} | 
 |       // expected-note@-1 {{passing argument to parameter 'a' here}} | 
 |       // expected-note@-2 {{candidate function not viable}} | 
 |       // expected-note@-3 {{conversion candidate of type}} | 
 |     lambda(); // expected-error {{no matching function}} | 
 |   } | 
 |   template void bar<A>(); // expected-note {{in instantiation}} | 
 | } | 
 |  | 
 | namespace anon_union_default_member_init { | 
 |   template<typename T> void f() { | 
 |     struct S { | 
 |       union { | 
 |         int i = 0; | 
 |       }; | 
 |     }; | 
 |   } | 
 |   void g() { f<int>(); } | 
 | } |