1*67e74705SXin Li @import cxx_templates_common;
2*67e74705SXin Li
3*67e74705SXin Li template<typename T> T f();
f(T t)4*67e74705SXin Li template<typename T> T f(T t) { return t; }
5*67e74705SXin Li namespace N {
6*67e74705SXin Li template<typename T> T f();
f(T t)7*67e74705SXin Li template<typename T> T f(T t) { return t; }
8*67e74705SXin Li }
9*67e74705SXin Li
10*67e74705SXin Li template<typename> int template_param_kinds_1();
11*67e74705SXin Li template<template<typename, int, int...> class> int template_param_kinds_2();
12*67e74705SXin Li template<template<typename T, typename U, U> class> int template_param_kinds_3();
13*67e74705SXin Li
14*67e74705SXin Li template<typename T> struct SomeTemplate<T&> {};
15*67e74705SXin Li template<typename T> struct SomeTemplate<T&>;
16*67e74705SXin Li typedef SomeTemplate<int&> SomeTemplateIntRef;
17*67e74705SXin Li
18*67e74705SXin Li extern DefinedInCommon &defined_in_common;
19*67e74705SXin Li
20*67e74705SXin Li template<int> struct MergeTemplates;
21*67e74705SXin Li MergeTemplates<0> *merge_templates_b;
22*67e74705SXin Li
23*67e74705SXin Li template<typename T> template<typename U>
24*67e74705SXin Li constexpr int Outer<T>::Inner<U>::g() { return 2; }
25*67e74705SXin Li static_assert(Outer<int>::Inner<int>::g() == 2, "");
26*67e74705SXin Li
27*67e74705SXin Li namespace TestInjectedClassName {
28*67e74705SXin Li template<typename T> struct X { X(); };
29*67e74705SXin Li typedef X<char[2]> B;
30*67e74705SXin Li }
31*67e74705SXin Li
32*67e74705SXin Li @import cxx_templates_b_impl;
33*67e74705SXin Li
34*67e74705SXin Li template<typename T, typename> struct Identity { typedef T type; };
35*67e74705SXin Li template<typename T> void UseDefinedInBImpl() {
36*67e74705SXin Li typename Identity<DefinedInBImpl, T>::type dependent;
37*67e74705SXin Li FoundByADL(dependent);
38*67e74705SXin Li typename Identity<DefinedInBImpl, T>::type::Inner inner;
39*67e74705SXin Li dependent.f();
40*67e74705SXin Li }
41*67e74705SXin Li
42*67e74705SXin Li extern DefinedInBImpl &defined_in_b_impl;
43*67e74705SXin Li
44*67e74705SXin Li template<typename T>
45*67e74705SXin Li struct RedeclareTemplateAsFriend {
46*67e74705SXin Li template<typename U>
47*67e74705SXin Li friend struct RedeclaredAsFriend;
48*67e74705SXin Li };
49*67e74705SXin Li
50*67e74705SXin Li void use_some_template_b() {
51*67e74705SXin Li SomeTemplate<char[1]> a;
52*67e74705SXin Li SomeTemplate<char[2]> b, c;
53*67e74705SXin Li b = c;
54*67e74705SXin Li
55*67e74705SXin Li WithImplicitSpecialMembers<int> wism1, wism2(wism1);
56*67e74705SXin Li }
57*67e74705SXin Li
58*67e74705SXin Li auto enum_b_from_b = CommonTemplate<int>::b;
59*67e74705SXin Li const auto enum_c_from_b = CommonTemplate<int>::c;
60*67e74705SXin Li
61*67e74705SXin Li template<int> struct UseInt;
62*67e74705SXin Li template<typename T> void UseRedeclaredEnum(UseInt<T() + CommonTemplate<char>::a>);
63*67e74705SXin Li constexpr void (*UseRedeclaredEnumB)(UseInt<1>) = UseRedeclaredEnum<int>;
64*67e74705SXin Li
65*67e74705SXin Li typedef WithPartialSpecialization<void(int)>::type WithPartialSpecializationInstantiate3;
66*67e74705SXin Li
67*67e74705SXin Li template<typename> struct MergeSpecializations;
68*67e74705SXin Li template<typename T> struct MergeSpecializations<T&> {
69*67e74705SXin Li typedef int partially_specialized_in_b;
70*67e74705SXin Li };
71*67e74705SXin Li template<> struct MergeSpecializations<double> {
72*67e74705SXin Li typedef int explicitly_specialized_in_b;
73*67e74705SXin Li };
74*67e74705SXin Li
75*67e74705SXin Li template<typename U> using AliasTemplate = U;
76*67e74705SXin Li
77*67e74705SXin Li void InstantiateWithAliasTemplate(WithAliasTemplate<int>::X<char>);
78*67e74705SXin Li inline int InstantiateWithAnonymousDeclsB(WithAnonymousDecls<int> x) {
79*67e74705SXin Li return (x.k ? x.a : x.b) + (x.k ? x.s.c : x.s.d) + x.e;
80*67e74705SXin Li }
81*67e74705SXin Li inline int InstantiateWithAnonymousDeclsB2(WithAnonymousDecls<char> x) {
82*67e74705SXin Li return (x.k ? x.a : x.b) + (x.k ? x.s.c : x.s.d) + x.e;
83*67e74705SXin Li }
84*67e74705SXin Li
85*67e74705SXin Li @import cxx_templates_a;
86*67e74705SXin Li template<typename T> void UseDefinedInBImplIndirectly(T &v) {
87*67e74705SXin Li PerformDelayedLookup(v);
88*67e74705SXin Li }
89*67e74705SXin Li
90*67e74705SXin Li void TriggerInstantiation() {
91*67e74705SXin Li UseDefinedInBImpl<void>();
92*67e74705SXin Li Std::f<int>();
93*67e74705SXin Li PartiallyInstantiatePartialSpec<int*>::foo();
94*67e74705SXin Li WithPartialSpecialization<void(int)>::type x;
95*67e74705SXin Li }
96