119 lines · cpp
1template<typename T, class P>2struct TwoOptionTemplate {};3 4template<typename T>5struct TwoOptionTemplate<T, char> {6 int member;7};8 9 10template<typename T>11struct TwoOptionTemplate<T, double> {12 float member;13};14 15template<typename T>16struct TwoOptionTemplate<T, T> {17 T** member;18};19 20TwoOptionTemplate<int, char> X0;21TwoOptionTemplate<int, float> X1;22TwoOptionTemplate<void *, wchar_t> X2;23TwoOptionTemplate<long, long> X3;24TwoOptionTemplate<float, float> X4;25TwoOptionTemplate<long, long> SingleSource;26TwoOptionTemplate<char, double> SecondDoubleSource;27 28 29template<int I, class C>30struct IntTemplateSpec {};31 32template<class C>33struct IntTemplateSpec<4, C> {34 C member;35};36 37template<int I>38struct IntTemplateSpec<I, void *> {39 int member;40 static constexpr int val = I;41};42 43template<int I>44struct IntTemplateSpec<I, double> {45 char member;46 static constexpr int val = I;47};48 49IntTemplateSpec<4, wchar_t> Y0;50IntTemplateSpec<5, void *> Y1;51IntTemplateSpec<1, long> Y2;52IntTemplateSpec<3, int> Y3;53//template<int I> constexpr int IntTemplateSpec<I, double>::val;54IntTemplateSpec<42, double> NumberSource;55static_assert(NumberSource.val == 42);56 57namespace One {58namespace Two {59 // Just an empty namespace to ensure we can deal with multiple namespace decls.60}61}62 63 64namespace One {65namespace Two {66namespace Three {67 68template<class T>69class Parent {};70 71} // namespace Three72 73} // namespace Two74 75template<typename T, typename X>76struct Child1: public Two::Three::Parent<unsigned> {77 char member;78};79 80template<class T>81struct Child1<T, One::Two::Three::Parent<T>> {82 T member;83};84 85} // namespace One86 87One::Child1<int, double> Z0Source;88 89// Test import of nested namespace specifiers90template<typename T>91struct Outer {92 template<typename U> class Inner0;93};94 95template<typename X>96template<typename Y>97class Outer<X>::Inner0 {98public:99 void f(X, Y);100 template<typename Z> struct Inner1;101};102 103template<typename X>104template<typename Y>105void Outer<X>::Inner0<Y>::f(X, Y) {}106 107template<typename X>108template<typename Y>109template<typename Z>110class Outer<X>::Inner0<Y>::Inner1 {111public:112 void f(Y, Z);113};114 115template<typename X>116template<typename Y>117template<typename Z>118void Outer<X>::Inner0<Y>::Inner1<Z>::f(Y, Z) {}119