19db7f57c1e3db8a2d06a833a4e0341f0fe310640Richard Smith@import cxx_templates_common; 29db7f57c1e3db8a2d06a833a4e0341f0fe310640Richard Smith 3acd954bd8f28383e7538c4d0fd989763744f5e99Richard Smithtemplate<typename T> T f(); 4acd954bd8f28383e7538c4d0fd989763744f5e99Richard Smithtemplate<typename T> T f(T t) { return t; } 5acd954bd8f28383e7538c4d0fd989763744f5e99Richard Smithnamespace N { 6acd954bd8f28383e7538c4d0fd989763744f5e99Richard Smith template<typename T> T f(); 7acd954bd8f28383e7538c4d0fd989763744f5e99Richard Smith template<typename T> T f(T t) { return t; } 8acd954bd8f28383e7538c4d0fd989763744f5e99Richard Smith} 998f0723ca24c604d72a10047b10b60743ac71f27Richard Smith 1098f0723ca24c604d72a10047b10b60743ac71f27Richard Smithtemplate<typename> int template_param_kinds_1(); 1198f0723ca24c604d72a10047b10b60743ac71f27Richard Smithtemplate<template<typename, int, int...> class> int template_param_kinds_2(); 1298f0723ca24c604d72a10047b10b60743ac71f27Richard Smithtemplate<template<typename T, typename U, U> class> int template_param_kinds_3(); 139db7f57c1e3db8a2d06a833a4e0341f0fe310640Richard Smith 149db7f57c1e3db8a2d06a833a4e0341f0fe310640Richard Smithtemplate<typename T> struct SomeTemplate<T&> {}; 159db7f57c1e3db8a2d06a833a4e0341f0fe310640Richard Smithtemplate<typename T> struct SomeTemplate<T&>; 169db7f57c1e3db8a2d06a833a4e0341f0fe310640Richard Smithtypedef SomeTemplate<int&> SomeTemplateIntRef; 17b775100fea6d8955149897dae1adca50ca471d17Richard Smith 18b775100fea6d8955149897dae1adca50ca471d17Richard Smithextern DefinedInCommon &defined_in_common; 19b775100fea6d8955149897dae1adca50ca471d17Richard Smith 208bfc1e118169229960b90a4ef8761ee0eb296755Richard Smithtemplate<int> struct MergeTemplates; 218bfc1e118169229960b90a4ef8761ee0eb296755Richard SmithMergeTemplates<0> *merge_templates_b; 228bfc1e118169229960b90a4ef8761ee0eb296755Richard Smith 23b775100fea6d8955149897dae1adca50ca471d17Richard Smith@import cxx_templates_b_impl; 24b775100fea6d8955149897dae1adca50ca471d17Richard Smith 25b775100fea6d8955149897dae1adca50ca471d17Richard Smithtemplate<typename T, typename> struct Identity { typedef T type; }; 26b775100fea6d8955149897dae1adca50ca471d17Richard Smithtemplate<typename T> void UseDefinedInBImpl() { 27b775100fea6d8955149897dae1adca50ca471d17Richard Smith typename Identity<DefinedInBImpl, T>::type dependent; 28b775100fea6d8955149897dae1adca50ca471d17Richard Smith FoundByADL(dependent); 29b775100fea6d8955149897dae1adca50ca471d17Richard Smith typename Identity<DefinedInBImpl, T>::type::Inner inner; 30b775100fea6d8955149897dae1adca50ca471d17Richard Smith dependent.f(); 31b775100fea6d8955149897dae1adca50ca471d17Richard Smith} 32b775100fea6d8955149897dae1adca50ca471d17Richard Smith 33b775100fea6d8955149897dae1adca50ca471d17Richard Smithextern DefinedInBImpl &defined_in_b_impl; 34b775100fea6d8955149897dae1adca50ca471d17Richard Smith 351888b910a5512262228e785cc9caf90296c06a45Richard Smithtemplate<typename T> 361888b910a5512262228e785cc9caf90296c06a45Richard Smithstruct RedeclareTemplateAsFriend { 371888b910a5512262228e785cc9caf90296c06a45Richard Smith template<typename U> 381888b910a5512262228e785cc9caf90296c06a45Richard Smith friend struct RedeclaredAsFriend; 391888b910a5512262228e785cc9caf90296c06a45Richard Smith}; 401888b910a5512262228e785cc9caf90296c06a45Richard Smith 41b60fae50d38a0291e1c5731b2fb22849d26ca342Richard Smithvoid use_some_template_b() { 42b60fae50d38a0291e1c5731b2fb22849d26ca342Richard Smith SomeTemplate<char[1]> a; 43b60fae50d38a0291e1c5731b2fb22849d26ca342Richard Smith SomeTemplate<char[2]> b, c; 44b60fae50d38a0291e1c5731b2fb22849d26ca342Richard Smith b = c; 45b60fae50d38a0291e1c5731b2fb22849d26ca342Richard Smith} 46b60fae50d38a0291e1c5731b2fb22849d26ca342Richard Smith 47d692a84e18fb48e6442bee83364f1d301f5b8404Richard Smithauto enum_b_from_b = CommonTemplate<int>::b; 48d692a84e18fb48e6442bee83364f1d301f5b8404Richard Smithconst auto enum_c_from_b = CommonTemplate<int>::c; 49d692a84e18fb48e6442bee83364f1d301f5b8404Richard Smith 50d692a84e18fb48e6442bee83364f1d301f5b8404Richard Smithtemplate<int> struct UseInt; 51d692a84e18fb48e6442bee83364f1d301f5b8404Richard Smithtemplate<typename T> void UseRedeclaredEnum(UseInt<T() + CommonTemplate<char>::a>); 52d692a84e18fb48e6442bee83364f1d301f5b8404Richard Smithconstexpr void (*UseRedeclaredEnumB)(UseInt<1>) = UseRedeclaredEnum<int>; 53d692a84e18fb48e6442bee83364f1d301f5b8404Richard Smith 547a3dfcdfb32c08f2f6f4a90a097bb240fdc1a94cRichard Smithtemplate<typename> struct MergeSpecializations; 557a3dfcdfb32c08f2f6f4a90a097bb240fdc1a94cRichard Smithtemplate<typename T> struct MergeSpecializations<T&> { 567a3dfcdfb32c08f2f6f4a90a097bb240fdc1a94cRichard Smith typedef int partially_specialized_in_b; 577a3dfcdfb32c08f2f6f4a90a097bb240fdc1a94cRichard Smith}; 587a3dfcdfb32c08f2f6f4a90a097bb240fdc1a94cRichard Smithtemplate<> struct MergeSpecializations<double> { 597a3dfcdfb32c08f2f6f4a90a097bb240fdc1a94cRichard Smith typedef int explicitly_specialized_in_b; 607a3dfcdfb32c08f2f6f4a90a097bb240fdc1a94cRichard Smith}; 617a3dfcdfb32c08f2f6f4a90a097bb240fdc1a94cRichard Smith 62b775100fea6d8955149897dae1adca50ca471d17Richard Smith@import cxx_templates_a; 63b775100fea6d8955149897dae1adca50ca471d17Richard Smithtemplate<typename T> void UseDefinedInBImplIndirectly(T &v) { 64b775100fea6d8955149897dae1adca50ca471d17Richard Smith PerformDelayedLookup(v); 65b775100fea6d8955149897dae1adca50ca471d17Richard Smith} 66b775100fea6d8955149897dae1adca50ca471d17Richard Smith 67b775100fea6d8955149897dae1adca50ca471d17Richard Smithvoid TriggerInstantiation() { 68b775100fea6d8955149897dae1adca50ca471d17Richard Smith UseDefinedInBImpl<void>(); 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Std::f<int>(); 70b775100fea6d8955149897dae1adca50ca471d17Richard Smith} 71