xref: /llvm-project/clang/test/Modules/Inputs/templates-left.h (revision 842e46e606b13e29b4136a455ad5d77249a7f9f4)
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 Naumann void pendingInstantiationEmit(T) {}
triggerPendingInstantiation()2863469422SAxel Naumann void triggerPendingInstantiation() {
29d9a25b3cSAxel Naumann   pendingInstantiationEmit(12);
30d9a25b3cSAxel Naumann   pendingInstantiationEmit(42.);
3163469422SAxel Naumann }
32d9a25b3cSAxel Naumann 
redeclDefinitionEmit()33d9a25b3cSAxel Naumann void redeclDefinitionEmit(){}
34d55889a6SRichard Smith 
35d55889a6SRichard Smith typedef Outer<int>::Inner OuterIntInner_left;
36cd45dbc5SRichard Smith 
defineListDoubleLeft()37cd45dbc5SRichard Smith int 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