1 @import cxx_templates_common;
2 
3 template<typename T> T f();
4 template<typename T> T f(T t) { return t; }
5 namespace N {
6   template<typename T> T f();
7   template<typename T> T f(T t) { return t; }
8 }
9 
10 template<typename> int template_param_kinds_1();
11 template<template<typename, int, int...> class> int template_param_kinds_2();
12 template<template<typename T, typename U, U> class> int template_param_kinds_3();
13 
14 template<typename T> struct SomeTemplate<T&> {};
15 template<typename T> struct SomeTemplate<T&>;
16 typedef SomeTemplate<int&> SomeTemplateIntRef;
17 
18 extern DefinedInCommon &defined_in_common;
19 
20 template<int> struct MergeTemplates;
21 MergeTemplates<0> *merge_templates_b;
22 
23 @import cxx_templates_b_impl;
24 
25 template<typename T, typename> struct Identity { typedef T type; };
26 template<typename T> void UseDefinedInBImpl() {
27   typename Identity<DefinedInBImpl, T>::type dependent;
28   FoundByADL(dependent);
29   typename Identity<DefinedInBImpl, T>::type::Inner inner;
30   dependent.f();
31 }
32 
33 extern DefinedInBImpl &defined_in_b_impl;
34 
35 template<typename T>
36 struct RedeclareTemplateAsFriend {
37   template<typename U>
38   friend struct RedeclaredAsFriend;
39 };
40 
41 void use_some_template_b() {
42   SomeTemplate<char[1]> a;
43   SomeTemplate<char[2]> b, c;
44   b = c;
45 }
46 
47 auto enum_b_from_b = CommonTemplate<int>::b;
48 const auto enum_c_from_b = CommonTemplate<int>::c;
49 
50 template<int> struct UseInt;
51 template<typename T> void UseRedeclaredEnum(UseInt<T() + CommonTemplate<char>::a>);
52 constexpr void (*UseRedeclaredEnumB)(UseInt<1>) = UseRedeclaredEnum<int>;
53 
54 template<typename> struct MergeSpecializations;
55 template<typename T> struct MergeSpecializations<T&> {
56   typedef int partially_specialized_in_b;
57 };
58 template<> struct MergeSpecializations<double> {
59   typedef int explicitly_specialized_in_b;
60 };
61 
62 @import cxx_templates_a;
63 template<typename T> void UseDefinedInBImplIndirectly(T &v) {
64   PerformDelayedLookup(v);
65 }
66 
67 void TriggerInstantiation() {
68   UseDefinedInBImpl<void>();
69 }
70