xref: /llvm-project/clang/test/Modules/Inputs/cxx-templates-common.h (revision 6739a10cec3d5681cc1c0f793be58756dfe0537a)
15de91b58SRichard Smith template<typename T> struct SomeTemplate {};
20e5d7b8cSRichard Smith 
30e5d7b8cSRichard Smith struct DefinedInCommon {
40e5d7b8cSRichard Smith   void f();
50e5d7b8cSRichard Smith   struct Inner {};
60e5d7b8cSRichard Smith   friend void FoundByADL(DefinedInCommon);
70e5d7b8cSRichard Smith };
801a7337cSRichard Smith 
901a7337cSRichard Smith template<typename T> struct CommonTemplate {
1001a7337cSRichard Smith   enum E { a = 1, b = 2, c = 3 };
1101a7337cSRichard Smith };
12c264d35aSRichard Smith 
13c264d35aSRichard Smith namespace Std {
14c264d35aSRichard Smith   template<typename T> struct WithFriend {
15c264d35aSRichard Smith     friend bool operator!=(const WithFriend &A, const WithFriend &B) { return false; }
16c264d35aSRichard Smith   };
17c264d35aSRichard Smith }
18561e0dceSRichard Smith 
19561e0dceSRichard Smith namespace Std {
f()20561e0dceSRichard Smith   template<typename T> void f() {
21561e0dceSRichard Smith     extern T g();
22561e0dceSRichard Smith   }
23561e0dceSRichard Smith }
243d23c420SRichard Smith 
253d23c420SRichard Smith template<typename T> struct TemplateInstantiationVisibility { typedef int type; };
26851072efSRichard Smith 
27851072efSRichard Smith template<typename T> struct Outer {
28851072efSRichard Smith   template<typename U> struct Inner {
29dc5523d3SRichard Smith     static constexpr int f();
30dc5523d3SRichard Smith     static constexpr int g();
31851072efSRichard Smith   };
32851072efSRichard Smith };
33df352058SRichard Smith 
34df352058SRichard Smith template<typename T> struct WithPartialSpecialization {};
3572544f87SRichard Smith template<typename T> struct WithPartialSpecialization<void(T)> { typedef int type; };
36df352058SRichard Smith typedef WithPartialSpecialization<int*> WithPartialSpecializationUse;
3772544f87SRichard Smith typedef WithPartialSpecialization<void(int)> WithPartialSpecializationUse2;
38871cd4c1SRichard Smith 
39871cd4c1SRichard Smith template<typename T> struct WithExplicitSpecialization;
40871cd4c1SRichard Smith typedef WithExplicitSpecialization<int> WithExplicitSpecializationUse;
418c913ecdSRichard Smith 
428c913ecdSRichard Smith template<typename T> struct WithImplicitSpecialMembers { int n; };
43234ff473SRichard Smith 
4443ccec8eSRichard Smith template<typename T> struct WithAliasTemplate {
4543ccec8eSRichard Smith   template<typename> using X = T;
4643ccec8eSRichard Smith };
4743ccec8eSRichard Smith 
48d08aeb6bSRichard Smith template<typename T> struct WithAnonymousDecls {
49d08aeb6bSRichard Smith   struct { bool k; };
50d08aeb6bSRichard Smith   union { int a, b; };
51d08aeb6bSRichard Smith   struct { int c, d; } s;
5201bdb7a9SRichard Smith   enum { e = 123 };
53d08aeb6bSRichard Smith   typedef int X;
54d08aeb6bSRichard Smith };
55d08aeb6bSRichard Smith 
56*6739a10cSRichard Smith namespace hidden_specializations {
57*6739a10cSRichard Smith   template<typename T> void fn() {}
58*6739a10cSRichard Smith 
59*6739a10cSRichard Smith   template<typename T> struct cls {
60*6739a10cSRichard Smith     static void nested_fn() {}
61*6739a10cSRichard Smith     struct nested_cls {};
62*6739a10cSRichard Smith     static int nested_var;
63*6739a10cSRichard Smith     enum class nested_enum {};
64*6739a10cSRichard Smith 
65*6739a10cSRichard Smith     template<typename U> static void nested_fn_t() {}
66*6739a10cSRichard Smith     template<typename U> struct nested_cls_t {};
67*6739a10cSRichard Smith     template<typename U> static int nested_var_t;
68*6739a10cSRichard Smith   };
69*6739a10cSRichard Smith 
70*6739a10cSRichard Smith   template<typename T> int var;
71*6739a10cSRichard Smith }
72*6739a10cSRichard Smith 
73234ff473SRichard Smith #include "cxx-templates-textual.h"
74