15de91b58SRichard Smith @import cxx_templates_common; 25de91b58SRichard Smith f()38f8f05cfSRichard Smithtemplate<typename T> T f() { return T(); } 48f8f05cfSRichard Smith template<typename T> T f(T); 58f8f05cfSRichard Smith namespace N { f()68f8f05cfSRichard Smith template<typename T> T f() { return T(); } 78f8f05cfSRichard Smith template<typename T> T f(T); 88f8f05cfSRichard Smith } 9bf78e646SRichard Smith 10bf78e646SRichard Smith template<int N> int template_param_kinds_1(); 11bf78e646SRichard Smith template<template<typename T, int, int> class> int template_param_kinds_2(); 12bf78e646SRichard Smith template<template<typename T, typename U, T> class> int template_param_kinds_3(); 135de91b58SRichard Smith 145de91b58SRichard Smith template<typename T> struct SomeTemplate<T*>; 155de91b58SRichard Smith template<typename T> struct SomeTemplate<T*> {}; 165de91b58SRichard Smith typedef SomeTemplate<int*> SomeTemplateIntPtr; 170e5d7b8cSRichard Smith 180e5d7b8cSRichard Smith template<typename T> void PerformDelayedLookup(T &t) { 190e5d7b8cSRichard Smith t.f(); 200e5d7b8cSRichard Smith typename T::Inner inner; 210e5d7b8cSRichard Smith FoundByADL(t); 220e5d7b8cSRichard Smith } 23b71782b7SRichard Smith 24b71782b7SRichard Smith template<typename T> void PerformDelayedLookupInDefaultArgument(T &t, int a = (FoundByADL(T()), 0)) {} 257ecc31b0SRichard Smith 267ecc31b0SRichard Smith template<typename T> struct RedeclaredAsFriend {}; 27d55889a6SRichard Smith 28d55889a6SRichard Smith void use_some_template_a() { 29d55889a6SRichard Smith SomeTemplate<char[2]> a; 30d55889a6SRichard Smith SomeTemplate<char[1]> b, c; 31d55889a6SRichard Smith b = c; 328c913ecdSRichard Smith 338c913ecdSRichard Smith (void)&WithImplicitSpecialMembers<int>::n; 34d55889a6SRichard Smith } 35d46d6deaSRichard Smith 36d46d6deaSRichard Smith template<int> struct MergeTemplates; 37d46d6deaSRichard Smith MergeTemplates<0> *merge_templates_a; 3801a7337cSRichard Smith 3901a7337cSRichard Smith auto enum_a_from_a = CommonTemplate<int>::a; 4001a7337cSRichard Smith const auto enum_c_from_a = CommonTemplate<int>::c; 4101a7337cSRichard Smith 4201a7337cSRichard Smith template<int> struct UseInt; 4301a7337cSRichard Smith template<typename T> void UseRedeclaredEnum(UseInt<T() + CommonTemplate<char>::a>); 4401a7337cSRichard Smith constexpr void (*UseRedeclaredEnumA)(UseInt<1>) = UseRedeclaredEnum<int>; 450c1065faSRichard Smith 460c1065faSRichard Smith template<typename> struct MergeSpecializations; 470c1065faSRichard Smith template<typename T> struct MergeSpecializations<T*> { 480c1065faSRichard Smith typedef int partially_specialized_in_a; 490c1065faSRichard Smith }; 500c1065faSRichard Smith template<> struct MergeSpecializations<char> { 510c1065faSRichard Smith typedef int explicitly_specialized_in_a; 520c1065faSRichard Smith }; 53c264d35aSRichard Smith 54c264d35aSRichard Smith void InstantiateWithFriend(Std::WithFriend<int> wfi) {} 55df352058SRichard Smith 56df352058SRichard Smith template<typename T> struct WithPartialSpecialization<T*> { 57df352058SRichard Smith typedef int type; 58df352058SRichard Smith T &f() { static T t; return t; } 59df352058SRichard Smith }; 60df352058SRichard Smith typedef WithPartialSpecializationUse::type WithPartialSpecializationInstantiate; 6172544f87SRichard Smith typedef WithPartialSpecialization<void(int)>::type WithPartialSpecializationInstantiate2; 62871cd4c1SRichard Smith 63871cd4c1SRichard Smith template<> struct WithExplicitSpecialization<int> { 64871cd4c1SRichard Smith int n; 65871cd4c1SRichard Smith template<typename T> T &inner_template() { 66871cd4c1SRichard Smith return n; 67871cd4c1SRichard Smith } 68871cd4c1SRichard Smith }; 69dc5523d3SRichard Smith 70dc5523d3SRichard Smith template<typename T> template<typename U> 71dc5523d3SRichard Smith constexpr int Outer<T>::Inner<U>::f() { return 1; } 72dc5523d3SRichard Smith static_assert(Outer<int>::Inner<int>::f() == 1, ""); 73547864d2SRichard Smith 74547864d2SRichard Smith template<typename T> struct MergeTemplateDefinitions { 75547864d2SRichard Smith static constexpr int f(); 76547864d2SRichard Smith static constexpr int g(); 77547864d2SRichard Smith }; 78547864d2SRichard Smith template<typename T> constexpr int MergeTemplateDefinitions<T>::f() { return 1; } 79f59b735aSRichard Smith 80f59b735aSRichard Smith template<typename T> using AliasTemplate = T; 81049fcd8cSRichard Smith 82049fcd8cSRichard Smith template<typename T> struct PartiallyInstantiatePartialSpec {}; 83049fcd8cSRichard Smith template<typename T> struct PartiallyInstantiatePartialSpec<T*> { 84049fcd8cSRichard Smith static T *foo() { return reinterpret_cast<T*>(0); } 85049fcd8cSRichard Smith static T *bar() { return reinterpret_cast<T*>(0); } 86049fcd8cSRichard Smith }; 87049fcd8cSRichard Smith typedef PartiallyInstantiatePartialSpec<int*> PartiallyInstantiatePartialSpecHelper; 8843ccec8eSRichard Smith 8943ccec8eSRichard Smith void InstantiateWithAliasTemplate(WithAliasTemplate<int>::X<char>); 9001bdb7a9SRichard Smith inline int InstantiateWithAnonymousDeclsA(WithAnonymousDecls<int> x) { return (x.k ? x.a : x.b) + (x.k ? x.s.c : x.s.d) + x.e; } 9101bdb7a9SRichard Smith inline int InstantiateWithAnonymousDeclsB2(WithAnonymousDecls<char> x); 92337f7c97SRichard Smith 93337f7c97SRichard Smith 94337f7c97SRichard Smith template<typename T1 = int> 95337f7c97SRichard Smith struct MergeAnonUnionMember { 96337f7c97SRichard Smith MergeAnonUnionMember() { (void)values.t1; } 97337f7c97SRichard Smith union { int t1; } values; 98337f7c97SRichard Smith }; 99337f7c97SRichard Smith inline MergeAnonUnionMember<> maum_a() { return {}; } 10041c79d93SRichard Smith 10141c79d93SRichard Smith template<typename T> struct DontWalkPreviousDeclAfterMerging { struct Inner { typedef T type; }; }; 102*6377f8f7SRichard Smith 103*6377f8f7SRichard Smith namespace TestInjectedClassName { 104*6377f8f7SRichard Smith template<typename T> struct X { X(); }; 105*6377f8f7SRichard Smith typedef X<char[1]> A; 106*6377f8f7SRichard Smith } 107