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