15de91b58SRichard Smith @import cxx_templates_common;
25de91b58SRichard Smith
38f8f05cfSRichard Smith template<typename T> T f();
f(T t)48f8f05cfSRichard Smith template<typename T> T f(T t) { return t; }
58f8f05cfSRichard Smith namespace N {
68f8f05cfSRichard Smith template<typename T> T f();
f(T t)78f8f05cfSRichard Smith template<typename T> T f(T t) { return t; }
88f8f05cfSRichard Smith }
9bf78e646SRichard Smith
10bf78e646SRichard Smith template<typename> int template_param_kinds_1();
11bf78e646SRichard Smith template<template<typename, int, int...> class> int template_param_kinds_2();
12bf78e646SRichard Smith template<template<typename T, typename U, U> 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&> SomeTemplateIntRef;
170e5d7b8cSRichard Smith
180e5d7b8cSRichard Smith extern DefinedInCommon &defined_in_common;
190e5d7b8cSRichard Smith
20d46d6deaSRichard Smith template<int> struct MergeTemplates;
21d46d6deaSRichard Smith MergeTemplates<0> *merge_templates_b;
22d46d6deaSRichard Smith
23dc5523d3SRichard Smith template<typename T> template<typename U>
24dc5523d3SRichard Smith constexpr int Outer<T>::Inner<U>::g() { return 2; }
25dc5523d3SRichard Smith static_assert(Outer<int>::Inner<int>::g() == 2, "");
26dc5523d3SRichard Smith
27*6377f8f7SRichard Smith namespace TestInjectedClassName {
28*6377f8f7SRichard Smith template<typename T> struct X { X(); };
29*6377f8f7SRichard Smith typedef X<char[2]> B;
30*6377f8f7SRichard Smith }
31*6377f8f7SRichard Smith
320e5d7b8cSRichard Smith @import cxx_templates_b_impl;
330e5d7b8cSRichard Smith
340e5d7b8cSRichard Smith template<typename T, typename> struct Identity { typedef T type; };
350e5d7b8cSRichard Smith template<typename T> void UseDefinedInBImpl() {
360e5d7b8cSRichard Smith typename Identity<DefinedInBImpl, T>::type dependent;
370e5d7b8cSRichard Smith FoundByADL(dependent);
380e5d7b8cSRichard Smith typename Identity<DefinedInBImpl, T>::type::Inner inner;
390e5d7b8cSRichard Smith dependent.f();
400e5d7b8cSRichard Smith }
410e5d7b8cSRichard Smith
420e5d7b8cSRichard Smith extern DefinedInBImpl &defined_in_b_impl;
430e5d7b8cSRichard Smith
447ecc31b0SRichard Smith template<typename T>
457ecc31b0SRichard Smith struct RedeclareTemplateAsFriend {
467ecc31b0SRichard Smith template<typename U>
477ecc31b0SRichard Smith friend struct RedeclaredAsFriend;
487ecc31b0SRichard Smith };
497ecc31b0SRichard Smith
50d55889a6SRichard Smith void use_some_template_b() {
51d55889a6SRichard Smith SomeTemplate<char[1]> a;
52d55889a6SRichard Smith SomeTemplate<char[2]> b, c;
53d55889a6SRichard Smith b = c;
548c913ecdSRichard Smith
558c913ecdSRichard Smith WithImplicitSpecialMembers<int> wism1, wism2(wism1);
56d55889a6SRichard Smith }
57d55889a6SRichard Smith
5801a7337cSRichard Smith auto enum_b_from_b = CommonTemplate<int>::b;
5901a7337cSRichard Smith const auto enum_c_from_b = CommonTemplate<int>::c;
6001a7337cSRichard Smith
6101a7337cSRichard Smith template<int> struct UseInt;
6201a7337cSRichard Smith template<typename T> void UseRedeclaredEnum(UseInt<T() + CommonTemplate<char>::a>);
6301a7337cSRichard Smith constexpr void (*UseRedeclaredEnumB)(UseInt<1>) = UseRedeclaredEnum<int>;
6401a7337cSRichard Smith
6572544f87SRichard Smith typedef WithPartialSpecialization<void(int)>::type WithPartialSpecializationInstantiate3;
6672544f87SRichard Smith
670c1065faSRichard Smith template<typename> struct MergeSpecializations;
680c1065faSRichard Smith template<typename T> struct MergeSpecializations<T&> {
690c1065faSRichard Smith typedef int partially_specialized_in_b;
700c1065faSRichard Smith };
710c1065faSRichard Smith template<> struct MergeSpecializations<double> {
720c1065faSRichard Smith typedef int explicitly_specialized_in_b;
730c1065faSRichard Smith };
740c1065faSRichard Smith
75f59b735aSRichard Smith template<typename U> using AliasTemplate = U;
76f59b735aSRichard Smith
7743ccec8eSRichard Smith void InstantiateWithAliasTemplate(WithAliasTemplate<int>::X<char>);
78d08aeb6bSRichard Smith inline int InstantiateWithAnonymousDeclsB(WithAnonymousDecls<int> x) {
7901bdb7a9SRichard Smith return (x.k ? x.a : x.b) + (x.k ? x.s.c : x.s.d) + x.e;
8001bdb7a9SRichard Smith }
8101bdb7a9SRichard Smith inline int InstantiateWithAnonymousDeclsB2(WithAnonymousDecls<char> x) {
8201bdb7a9SRichard Smith return (x.k ? x.a : x.b) + (x.k ? x.s.c : x.s.d) + x.e;
83d08aeb6bSRichard Smith }
8443ccec8eSRichard Smith
850e5d7b8cSRichard Smith @import cxx_templates_a;
860e5d7b8cSRichard Smith template<typename T> void UseDefinedInBImplIndirectly(T &v) {
870e5d7b8cSRichard Smith PerformDelayedLookup(v);
880e5d7b8cSRichard Smith }
890e5d7b8cSRichard Smith
900e5d7b8cSRichard Smith void TriggerInstantiation() {
910e5d7b8cSRichard Smith UseDefinedInBImpl<void>();
92561e0dceSRichard Smith Std::f<int>();
93049fcd8cSRichard Smith PartiallyInstantiatePartialSpec<int*>::foo();
9472544f87SRichard Smith WithPartialSpecialization<void(int)>::type x;
950e5d7b8cSRichard Smith }
96