11b257afbae854c6817f26b7d61c4fed8ff7aebadDouglas Gregor@import templates_top;
239d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumann
339d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumanntemplate<typename T> class Vector;
439d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumann
539d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumanntemplate<typename T> class Vector;
639d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumann
739d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumanntemplate<typename T> class List;
839d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumanntemplate<> class List<bool> {
939d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumannpublic:
1039d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumann  void push_back(int);
1139d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumann};
1239d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumannnamespace N {
1339d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumann  template<typename T> class Set;
1439d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumann}
1539d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumannnamespace N {
1639d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumann  template<typename T> class Set {
1739d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumann  public:
1839d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumann    void insert(T);
1939d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumann  };
2039d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumann}
2139d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumann
224ed0122c1b795379cc4e11dfd62312358dcbf506Richard Smithconstexpr unsigned List<int>::*size_left = &List<int>::size;
234ed0122c1b795379cc4e11dfd62312358dcbf506Richard SmithList<int> list_left = { 0, 8 };
244ed0122c1b795379cc4e11dfd62312358dcbf506Richard Smithtypedef List<int> ListInt_left;
254ed0122c1b795379cc4e11dfd62312358dcbf506Richard Smith
2639d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumanntemplate <typename T>
2738c3bb40c2cef630c236f3f455ea98999990b8eeAxel Naumannvoid pendingInstantiationEmit(T) {}
2839d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumannvoid triggerPendingInstantiation() {
2938c3bb40c2cef630c236f3f455ea98999990b8eeAxel Naumann  pendingInstantiationEmit(12);
3038c3bb40c2cef630c236f3f455ea98999990b8eeAxel Naumann  pendingInstantiationEmit(42.);
3139d26c3e499470cd80a3e6f26f11ac681cd9712cAxel Naumann}
3238c3bb40c2cef630c236f3f455ea98999990b8eeAxel Naumann
3338c3bb40c2cef630c236f3f455ea98999990b8eeAxel Naumannvoid redeclDefinitionEmit(){}
34b60fae50d38a0291e1c5731b2fb22849d26ca342Richard Smith
35b60fae50d38a0291e1c5731b2fb22849d26ca342Richard Smithtypedef Outer<int>::Inner OuterIntInner_left;
366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesint defineListDoubleLeft() {
386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  List<double> ld;
396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ld.push_back(0.0);
406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return ld.size;
416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> struct MergePatternDecl;
446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesextern template struct ExplicitInstantiation<false, false>;
466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesextern template struct ExplicitInstantiation<false, true>;
476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesextern template struct ExplicitInstantiation<true, false>;
486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesextern template struct ExplicitInstantiation<true, true>;
496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid useExplicitInstantiation() {
516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ExplicitInstantiation<true, false>().f();
526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  ExplicitInstantiation<true, true>().f();
536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename> struct DelayUpdates;
566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> struct DelayUpdates<int>;
576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> struct DelayUpdates<T*>;
586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> void testDelayUpdates(DelayUpdates<T> *p = 0) {}
59c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
60c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid outOfLineInlineUseLeftF(void (OutOfLineInline<int>::*)() = &OutOfLineInline<int>::f);
61c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid outOfLineInlineUseLeftG(void (OutOfLineInline<int>::*)() = &OutOfLineInline<int>::g);
62c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid outOfLineInlineUseLeftH(void (OutOfLineInline<int>::*)() = &OutOfLineInline<int>::h);
63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
64176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace EmitDefaultedSpecialMembers {
65176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  inline void f() {
66176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    SmallString<256> SS;
67176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  };
68176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
69176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
70176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesinline int *getStaticDataMemberLeft() {
71176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return WithUndefinedStaticDataMember<int[]>::undefined;
72176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
73