xref: /llvm-project/clang/test/Modules/Inputs/cxx-templates-b.h (revision 6377f8f7fb1f0ed32fd80acf733659fb7982011b)
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