190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis// Header for PCH test cxx-templates.cpp
290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
3dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidistemplate <typename T1, typename T2>
45a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidisstruct S;
55a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis
65a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidistemplate <typename T1, typename T2>
790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisstruct S {
85a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis  S() { }
9dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  static void templ();
10dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis};
11dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis
12dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidistemplate <typename T>
13dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidisstruct S<int, T> {
14dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis    static void partial();
15dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis};
16dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis
17dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidistemplate <>
18dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidisstruct S<int, float> {
19dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis    static void explicit_special();
2090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis};
21f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
2217cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidistemplate <int x>
2317cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidisint tmpl_f2() { return x; }
2417cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis
25b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidistemplate <typename T, int y>
26f511ba6277d240bbee1064715da8362a6edee5f3Argyrios KyrtzidisT templ_f(T x) {
27dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis  int z = templ_f<int, 5>(3);
2817cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis  z = tmpl_f2<y+2>();
29ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis  T data[y];
30b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  return x+y;
31f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis}
328dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
33bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidisvoid govl(int);
34bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidisvoid govl(char);
35bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis
36bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidistemplate <typename T>
37bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidisstruct Unresolv {
38bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis  void f() {
39bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis    govl(T());
40bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis  }
41bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis};
42bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis
438dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidistemplate <typename T>
448dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidisstruct Dep {
458dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  typedef typename T::type Ty;
468dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  void f() {
478dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis    Ty x = Ty();
488dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis    T::my_f();
498dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis    int y = T::template my_templf<int>(0);
50a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis    ovl(y);
518dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  }
52a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
53a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  void ovl(int);
54a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  void ovl(float);
558dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis};
568dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
578dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidistemplate<typename T, typename A1>
588dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidisinline T make_a(const A1& a1) {
5912dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  T::depend_declref();
608dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  return T(a1);
618dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis}
628f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis
638f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidistemplate <class T> class UseBase {
648f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis  void foo();
658f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis  typedef int bar;
668f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis};
678f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis
688f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidistemplate <class T> class UseA : public UseBase<T> {
698f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis  using UseBase<T>::foo;
708f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis  using typename UseBase<T>::bar;
718f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis};
725a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis
735a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidistemplate <class T> class Sub : public UseBase<int> { };
745a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis
755a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidistemplate <class _Ret, class _Tp>
765a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis  class mem_fun_t
775a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis  {
785a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis  public:
795a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis    explicit
805a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis    mem_fun_t(_Ret (_Tp::*__pf)())
815a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis     {}
825a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis
835a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis  private:
845a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis    _Ret (_Tp::*_M_f)();
855a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis  };
865a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis
875a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidistemplate<unsigned N>
885a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidisbool isInt(int x);
895a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis
905a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidistemplate<> bool isInt<8>(int x) {
917cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  try { ++x; } catch(...) { --x; }
927cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  return true;
935a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis}
945a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis
955a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidistemplate<typename _CharT>
965a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidisint __copy_streambufs_eof(_CharT);
975a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis
985a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidisclass basic_streambuf
995a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis{
1005a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis  void m() { }
1015a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis  friend int __copy_streambufs_eof<>(int);
1025a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis};
1035a7b9c552c446d568e32a55f57e2b10ef00215ecArgyrios Kyrtzidis
104e3041be307d4c133605544a74f40c42c7531b5bbArgyrios Kyrtzidis// PR 7660
105e3041be307d4c133605544a74f40c42c7531b5bbArgyrios Kyrtzidistemplate<typename T> struct S_PR7660 { void g(void (*)(T)); };
106e3041be307d4c133605544a74f40c42c7531b5bbArgyrios Kyrtzidis template<> void S_PR7660<int>::g(void(*)(int)) {}
107cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis
108cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidis// PR 7670
109cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidistemplate<typename> class C_PR7670;
110cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidistemplate<> class C_PR7670<int>;
111cc0b1bc979b650a8a8b34b2032a074fd7724a90dArgyrios Kyrtzidistemplate<> class C_PR7670<int>;
112ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis
113ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidistemplate <bool B>
114ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidisstruct S2 {
115ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis    static bool V;
116ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis};
117ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidis
118ab411c8c2efed8f2403bf8596e780c0f2f905a19Argyrios Kyrtzidisextern template class S2<true>;
119a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis
120a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidistemplate <typename T>
121a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidisstruct S3 {
122a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    void m();
123a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis};
124a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis
125a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidistemplate <typename T>
126a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidisinline void S3<T>::m() { }
1270e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis
1280e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidistemplate <typename T>
1290e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidisstruct S4 {
1300e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis    void m() { }
1310e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis};
1320e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidisextern template struct S4<int>;
1330e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis
1340e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidisvoid S4ImplicitInst() {
1350e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis    S4<int> s;
1360e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis    s.m();
1370e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis}
138f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis
139f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidisstruct S5 {
140f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis  S5(int x);
141f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis};
142f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis
143f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidisstruct TS5 {
144f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis  S5 s;
145f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis  template <typename T>
146f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis  TS5(T y) : s(y) {}
147f84cde1cbc6a6e6c29f20b164af38dffab60366aArgyrios Kyrtzidis};
14899a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis
14999a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis// PR 8134
15099a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidistemplate<class T> void f_PR8134(T);
15199a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidistemplate<class T> void f_PR8134(T);
15299a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidisvoid g_PR8134() { f_PR8134(0); f_PR8134('x'); }
15332adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor
15432adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor// rdar8580149
15532adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregortemplate <typename T>
15632adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregorstruct S6;
15732adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor
15832adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregortemplate <typename T, unsigned N>
15932adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregorstruct S6<const T [N]>
16032adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor{
16132adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregorprivate:
16232adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor   typedef const T t1[N];
16332adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregorpublic:
16432adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor   typedef t1& t2;
16532adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor};
16632adc8bd6f05d1e26cc221102e48609da2c446baDouglas Gregor
1677c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregortemplate<typename T>
1687c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor  struct S7;
1697c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor
1707c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregortemplate<unsigned N>
1717c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregorstruct S7<int[N]> : S6<const int[N]> { };
172def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor
173def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor// Zero-length template argument lists
174def0354384d9c4431f7b58b664b59896d4623028Douglas Gregornamespace ZeroLengthExplicitTemplateArgs {
175def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor  template<typename T> void h();
176def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor
177def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor  struct Y {
178def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor    template<typename T> void f();
179def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor  };
180def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor
181def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor  template<typename T>
182def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor    void f(T *ptr) {
183def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor    T::template g<>(17);
184def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor    ptr->template g2<>(17);
185def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor    h<T>();
186def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor    h<int>();
187def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor    Y y;
188def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor    y.f<int>();
189def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor  }
190def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor
191def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor  struct X {
192def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor    template<typename T> static void g(T);
193def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor    template<typename T> void g2(T);
194def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor  };
195def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor}
19667da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor
19767da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregornamespace NonTypeTemplateParmContext {
19867da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor  template<typename T, int inlineCapacity = 0> class Vector { };
19967da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor
20067da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor  struct String {
20167da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor    template<int inlineCapacity>
20267da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor    static String adopt(Vector<char, inlineCapacity>&);
20367da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor  };
20467da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor
20567da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor  template<int inlineCapacity>
20667da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor    inline bool equalIgnoringNullity(const Vector<char, inlineCapacity>& a, const String& b) { return false; }
20767da6f6f0c20dbfebb1c383a3efaf85d925ad33eDouglas Gregor}
208a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor
209a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor// <rdar://problem/11112464>
210a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregortemplate< typename > class Foo;
211a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor
212a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregortemplate< typename T >
213a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregorclass Foo : protected T
214a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor{
215a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor public:
216a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor  Foo& operator=( const Foo& other );
217a8e0b978d63c52e39c002fbf014ce553374fedcfDouglas Gregor};
2189a4db032ecd991626d236a502e770126db32bd31Richard Smith
2199a4db032ecd991626d236a502e770126db32bd31Richard Smithtemplate<typename...A> struct NestedExpansion {
2209a4db032ecd991626d236a502e770126db32bd31Richard Smith  template<typename...B> auto f(A...a, B...b) -> decltype(g(a + b...));
2219a4db032ecd991626d236a502e770126db32bd31Richard Smith};
2229a4db032ecd991626d236a502e770126db32bd31Richard Smithtemplate struct NestedExpansion<char, char, char>;
2237640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis
2247640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidisnamespace rdar13135282 {
2257640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidistemplate < typename _Alloc >
2267640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidisvoid foo(_Alloc = _Alloc());
2277640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis
2287640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidistemplate < bool > class __pool;
2297640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis
2307640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidistemplate < template < bool > class _PoolTp >
2317640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidisstruct __common_pool {
2327640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis  typedef _PoolTp < 0 > pool_type;
2337640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis};
2347640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis
2357640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidistemplate < template < bool > class _PoolTp >
2367640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidisstruct __common_pool_base : __common_pool < _PoolTp > {};
2377640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis
2387640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidistemplate < template < bool > class _PoolTp >
2397640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidisstruct A : __common_pool_base < _PoolTp > {};
2407640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis
2417640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidistemplate < typename _Poolp = A < __pool > >
2427640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidisstruct __mt_alloc {
2437640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis  typedef typename _Poolp::pool_type __pool_type;
2447640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis  __mt_alloc() {
2457640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis    foo<__mt_alloc<> >();
2467640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis  }
2477640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis};
2487640b02a561fd2b2c58a227b262b0c1ba93622aeArgyrios Kyrtzidis}
2490378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis
2500378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidisnamespace PR13020 {
2510378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidistemplate<typename T>
2520378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidisvoid f() {
2530378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis enum E {
2540378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis   enumerator
2550378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis };
2560378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis
2570378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis T t = enumerator;
2580378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis}
2590378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis
2600378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidistemplate void f<int>();
2610378433dcdf9a5701207c2a592b10da71ad9ba5dArgyrios Kyrtzidis}
262f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith
263f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smithtemplate<typename T> void doNotDeserialize() {}
264f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smithtemplate<typename T> struct ContainsDoNotDeserialize {
265f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith  static int doNotDeserialize;
266f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith};
267f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smithtemplate<typename T> struct ContainsDoNotDeserialize2 {
268f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith  static void doNotDeserialize();
269f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smith};
270f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smithtemplate<typename T> int ContainsDoNotDeserialize<T>::doNotDeserialize = 0;
271f396ad9b1fa0c74c9db16a8158c3882c9db774e2Richard Smithtemplate<typename T> void ContainsDoNotDeserialize2<T>::doNotDeserialize() {}
2720fa93cecf26a157dec7def11ffa4080ae75fe559Eli Friedman
2730fa93cecf26a157dec7def11ffa4080ae75fe559Eli Friedman
2740fa93cecf26a157dec7def11ffa4080ae75fe559Eli Friedmantemplate<typename T> void DependentSpecializedFunc(T x) { x.foo(); }
2750fa93cecf26a157dec7def11ffa4080ae75fe559Eli Friedmantemplate<typename T> class DependentSpecializedFuncClass {
2760fa93cecf26a157dec7def11ffa4080ae75fe559Eli Friedman  void foo() {}
2770fa93cecf26a157dec7def11ffa4080ae75fe559Eli Friedman  friend void DependentSpecializedFunc<>(DependentSpecializedFuncClass);
2780fa93cecf26a157dec7def11ffa4080ae75fe559Eli Friedman};
279e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith
280e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smithnamespace cyclic_module_load {
281e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith  // Reduced from a libc++ modules crasher.
282e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith  namespace std {
283e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith    template<class> class mask_array;
284e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith    template<class> class valarray {
285e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith    public:
286e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith      valarray(const valarray &v);
287e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith    };
288e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith
289e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith    class gslice {
290e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith      valarray<int> x;
291e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith      valarray<int> stride() const { return x; }
292e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith    };
293e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith
294e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith    template<class> class mask_array {
295e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith      template<class> friend class valarray;
296e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith    };
297e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith  }
298e7bae1597f4a7088f5048695c14a8f1013a86108Richard Smith}
299dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith
300dd9459f8869f66409f7ea429053b453e33f6499cRichard Smithnamespace local_extern {
301dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith  template<typename T> int f() {
302dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith    extern int arr[3];
303dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith    {
304dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith      extern T arr;
305dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith      return sizeof(arr);
306dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith    }
307dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith  }
308dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith  template<typename T> int g() {
309dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith    extern int arr[3];
310dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith    extern T arr;
311dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith    return sizeof(arr);
312dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith  }
313dd9459f8869f66409f7ea429053b453e33f6499cRichard Smith}
314651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
315651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace rdar15468709a {
316651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename> struct decay {};
317651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
318651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename FooParamTy> auto foo(FooParamTy fooParam) -> decltype(fooParam);
319651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename BarParamTy> auto bar(BarParamTy barParam) -> decay<decltype(barParam)>;
320651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
321651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B {};
322651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
323651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void crash() {
324651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    B some;
325651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bar(some);
326651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
327651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
328651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
329651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace rdar15468709b {
330651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename> struct decay {};
331651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
332651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename... Foos> int returnsInt(Foos... foos);
333651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename... FooParamTy> auto foo(FooParamTy... fooParam) -> decltype(returnsInt(fooParam...));
335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename... BarParamTy> auto bar(BarParamTy... barParam) -> decay<decltype(returnsInt(barParam...))>;
336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B {};
338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void crash() {
340651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    B some;
341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bar(some);
342651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
343651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
344651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
345651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace rdar15468709c {
346651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename> struct decay {};
347651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<class... Foos> int returnsInt(Foos... foos);
349651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename FooParamTy> void foo(FooParamTy fooParam) { decltype(fooParam) a; }
351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  template<typename BarParamTy> auto bar(BarParamTy barParam) -> decay<decltype(barParam)>;
352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct B {};
354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
355651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void crash() {
356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    B some;
357651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    bar(some);
358651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
360651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
361