// Written by David Hallas to trigger this bug in Valgrind:
// https://bugs.kde.org/show_bug.cgi?id=359133

#define CONCAT2(x, y) x##y
#define CONCAT(x, y) CONCAT2(x, y)

#define AllLetters ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ
#define TemplateName(name) CONCAT(AllLetters, name)
#define TemplateDef(name) class TemplateName(name) {};

TemplateDef(1)
TemplateDef(2)
TemplateDef(3)
TemplateDef(4)
TemplateDef(5)
TemplateDef(6)
TemplateDef(7)
TemplateDef(8)
TemplateDef(9)
TemplateDef(10)
TemplateDef(11)
TemplateDef(12)
TemplateDef(13)
TemplateDef(14)
TemplateDef(15)
TemplateDef(16)
TemplateDef(17)
TemplateDef(18)
TemplateDef(19)
TemplateDef(20)
TemplateDef(21)
TemplateDef(22)
TemplateDef(23)
TemplateDef(24)
TemplateDef(25)
TemplateDef(26)
TemplateDef(27)
TemplateDef(28)
TemplateDef(29)
TemplateDef(30)
TemplateDef(31)
TemplateDef(32)
TemplateDef(33)
TemplateDef(34)
TemplateDef(35)
TemplateDef(36)
TemplateDef(37)
TemplateDef(38)
TemplateDef(39)
TemplateDef(40)
TemplateDef(41)
TemplateDef(42)
TemplateDef(43)
TemplateDef(44)
TemplateDef(45)
TemplateDef(46)
TemplateDef(47)
TemplateDef(48)
TemplateDef(49)
TemplateDef(50)

class MyTemplate {
public:
	template<typename... T>
	void foo();
};

template<>
void MyTemplate::foo<
		TemplateName(1),
		TemplateName(2),
		TemplateName(3),
		TemplateName(4),
		TemplateName(5),
		TemplateName(6),
		TemplateName(7),
		TemplateName(8),
		TemplateName(9),
		TemplateName(10),
		TemplateName(11),
		TemplateName(12),
		TemplateName(13),
		TemplateName(14),
		TemplateName(15),
		TemplateName(16),
		TemplateName(17),
		TemplateName(18),
		TemplateName(19),
		TemplateName(20),
		TemplateName(21),
		TemplateName(22),
		TemplateName(23),
		TemplateName(24),
		TemplateName(25),
		TemplateName(26),
		TemplateName(27),
		TemplateName(28),
		TemplateName(29),
		TemplateName(30),
		TemplateName(31),
		TemplateName(32),
		TemplateName(33),
		TemplateName(34),
		TemplateName(35),
		TemplateName(36),
		TemplateName(37),
		TemplateName(38),
		TemplateName(39),
		TemplateName(40),
		TemplateName(41),
		TemplateName(42),
		TemplateName(43),
		TemplateName(44),
		TemplateName(45),
		TemplateName(46),
		TemplateName(47),
		TemplateName(48),
		TemplateName(49),
		TemplateName(50)
>();

template<>
void MyTemplate::foo<
		TemplateName(1),
		TemplateName(2),
		TemplateName(3),
		TemplateName(4),
		TemplateName(5),
		TemplateName(6),
		TemplateName(7),
		TemplateName(8),
		TemplateName(9),
		TemplateName(10),
		TemplateName(11),
		TemplateName(12),
		TemplateName(13),
		TemplateName(14),
		TemplateName(15),
		TemplateName(16),
		TemplateName(17),
		TemplateName(18),
		TemplateName(19),
		TemplateName(20),
		TemplateName(21),
		TemplateName(22),
		TemplateName(23),
		TemplateName(24),
		TemplateName(25),
		TemplateName(26),
		TemplateName(27),
		TemplateName(28),
		TemplateName(29),
		TemplateName(30),
		TemplateName(31),
		TemplateName(32),
		TemplateName(33),
		TemplateName(34),
		TemplateName(35),
		TemplateName(36),
		TemplateName(37),
		TemplateName(38),
		TemplateName(39),
		TemplateName(40),
		TemplateName(41),
		TemplateName(42),
		TemplateName(43),
		TemplateName(44),
		TemplateName(45),
		TemplateName(46),
		TemplateName(47),
		TemplateName(48),
		TemplateName(49),
		TemplateName(50)
>()
{
}

int main(int argc, char* argv[])
{
	MyTemplate instance;
	instance.foo<
		TemplateName(1),
		TemplateName(2),
		TemplateName(3),
		TemplateName(4),
		TemplateName(5),
		TemplateName(6),
		TemplateName(7),
		TemplateName(8),
		TemplateName(9),
		TemplateName(10),
		TemplateName(11),
		TemplateName(12),
		TemplateName(13),
		TemplateName(14),
		TemplateName(15),
		TemplateName(16),
		TemplateName(17),
		TemplateName(18),
		TemplateName(19),
		TemplateName(20),
		TemplateName(21),
		TemplateName(22),
		TemplateName(23),
		TemplateName(24),
		TemplateName(25),
		TemplateName(26),
		TemplateName(27),
		TemplateName(28),
		TemplateName(29),
		TemplateName(30),
		TemplateName(31),
		TemplateName(32),
		TemplateName(33),
		TemplateName(34),
		TemplateName(35),
		TemplateName(36),
		TemplateName(37),
		TemplateName(38),
		TemplateName(39),
		TemplateName(40),
		TemplateName(41),
		TemplateName(42),
		TemplateName(43),
		TemplateName(44),
		TemplateName(45),
		TemplateName(46),
		TemplateName(47),
		TemplateName(48),
		TemplateName(49),
		TemplateName(50)
	>();
	return 0;
}
