1c50d4924SDouglas Gregor @import templates_top; 263469422SAxel Naumann 363469422SAxel Naumann template<typename T> class Vector; 463469422SAxel Naumann 563469422SAxel Naumann template<typename T> class Vector; 663469422SAxel Naumann 763469422SAxel Naumann template<typename T> class List; 863469422SAxel Naumann template<> class List<bool> { 963469422SAxel Naumann public: 1063469422SAxel Naumann void push_back(int); 1163469422SAxel Naumann }; 1263469422SAxel Naumann namespace N { 1363469422SAxel Naumann template<typename T> class Set; 1463469422SAxel Naumann } 1563469422SAxel Naumann namespace N { 1663469422SAxel Naumann template<typename T> class Set { 1763469422SAxel Naumann public: 1863469422SAxel Naumann void insert(T); 1963469422SAxel Naumann }; 2063469422SAxel Naumann } 2163469422SAxel Naumann 220b87e073SRichard Smith constexpr unsigned List<int>::*size_left = &List<int>::size; 230b87e073SRichard Smith List<int> list_left = { 0, 8 }; 240b87e073SRichard Smith typedef List<int> ListInt_left; 250b87e073SRichard Smith 2663469422SAxel Naumann template <typename T> pendingInstantiationEmit(T)27d9a25b3cSAxel Naumannvoid pendingInstantiationEmit(T) {} triggerPendingInstantiation()2863469422SAxel Naumannvoid triggerPendingInstantiation() { 29d9a25b3cSAxel Naumann pendingInstantiationEmit(12); 30d9a25b3cSAxel Naumann pendingInstantiationEmit(42.); 3163469422SAxel Naumann } 32d9a25b3cSAxel Naumann redeclDefinitionEmit()33d9a25b3cSAxel Naumannvoid redeclDefinitionEmit(){} 34d55889a6SRichard Smith 35d55889a6SRichard Smith typedef Outer<int>::Inner OuterIntInner_left; 36cd45dbc5SRichard Smith defineListDoubleLeft()37cd45dbc5SRichard Smithint defineListDoubleLeft() { 38cd45dbc5SRichard Smith List<double> ld; 39cd45dbc5SRichard Smith ld.push_back(0.0); 40cd45dbc5SRichard Smith return ld.size; 41cd45dbc5SRichard Smith } 42f17fdbd7SRichard Smith 43f17fdbd7SRichard Smith template<typename T> struct MergePatternDecl; 44eb36ddf4SRichard Smith 45eb36ddf4SRichard Smith extern template struct ExplicitInstantiation<false, false>; 46eb36ddf4SRichard Smith extern template struct ExplicitInstantiation<false, true>; 47eb36ddf4SRichard Smith extern template struct ExplicitInstantiation<true, false>; 48eb36ddf4SRichard Smith extern template struct ExplicitInstantiation<true, true>; 49eb36ddf4SRichard Smith 50eb36ddf4SRichard Smith void useExplicitInstantiation() { 51eb36ddf4SRichard Smith ExplicitInstantiation<true, false>().f(); 52eb36ddf4SRichard Smith ExplicitInstantiation<true, true>().f(); 53eb36ddf4SRichard Smith } 54d1c46746SRichard Smith 55d1c46746SRichard Smith template<typename> struct DelayUpdates; 56d1c46746SRichard Smith template<> struct DelayUpdates<int>; 57d1c46746SRichard Smith template<typename T> struct DelayUpdates<T*>; 58d1c46746SRichard Smith template<typename T> void testDelayUpdates(DelayUpdates<T> *p = 0) {} 59195d8ef4SRichard Smith 60195d8ef4SRichard Smith void outOfLineInlineUseLeftF(void (OutOfLineInline<int>::*)() = &OutOfLineInline<int>::f); 61195d8ef4SRichard Smith void outOfLineInlineUseLeftG(void (OutOfLineInline<int>::*)() = &OutOfLineInline<int>::g); 62195d8ef4SRichard Smith void outOfLineInlineUseLeftH(void (OutOfLineInline<int>::*)() = &OutOfLineInline<int>::h); 63462b6fc6SRichard Smith 64462b6fc6SRichard Smith namespace EmitDefaultedSpecialMembers { 65462b6fc6SRichard Smith inline void f() { 66462b6fc6SRichard Smith SmallString<256> SS; 67462b6fc6SRichard Smith }; 68462b6fc6SRichard Smith } 6973b21d8fSRichard Smith 7073b21d8fSRichard Smith inline int *getStaticDataMemberLeft() { 7173b21d8fSRichard Smith return WithUndefinedStaticDataMember<int[]>::undefined; 7273b21d8fSRichard Smith } 73*842e46e6SRichard Smith 74*842e46e6SRichard Smith inline WithAttributes<int> make_with_attributes_left() { return WithAttributes<int>(); } 75