xref: /aosp_15_r20/external/clang/test/Modules/Inputs/submodules-merge-defs/defs.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li struct A { int a_member; };
use_a(A a)2*67e74705SXin Li inline int use_a(A a) { return a.a_member; }
3*67e74705SXin Li 
4*67e74705SXin Li class B {
5*67e74705SXin Li   struct Inner1 {};
6*67e74705SXin Li public:
7*67e74705SXin Li   struct Inner2;
8*67e74705SXin Li   struct Inner3;
9*67e74705SXin Li   template<typename T> void f();
10*67e74705SXin Li };
11*67e74705SXin Li struct BFriend {
12*67e74705SXin Li   friend class B::Inner3;
13*67e74705SXin Li private:
14*67e74705SXin Li   struct Inner3Base {};
15*67e74705SXin Li };
16*67e74705SXin Li // Check that lookup and access checks are performed in the right context.
17*67e74705SXin Li struct B::Inner2 : Inner1 {};
18*67e74705SXin Li struct B::Inner3 : BFriend::Inner3Base {};
f()19*67e74705SXin Li template<typename T> void B::f() {}
20*67e74705SXin Li template<> inline void B::f<int>() {}
21*67e74705SXin Li 
22*67e74705SXin Li // Check that base-specifiers are correctly disambiguated.
23*67e74705SXin Li template<int N> struct C_Base { struct D { constexpr operator int() const { return 0; } }; };
24*67e74705SXin Li const int C_Const = 0;
25*67e74705SXin Li struct C1 : C_Base<C_Base<0>::D{}> {} extern c1;
26*67e74705SXin Li struct C2 : C_Base<C_Const<0>::D{} extern c2;
27*67e74705SXin Li 
28*67e74705SXin Li typedef struct { int a; void f(); struct X; } D;
29*67e74705SXin Li struct D::X { int dx; } extern dx;
use_dx(D::X dx)30*67e74705SXin Li inline int use_dx(D::X dx) { return dx.dx; }
31*67e74705SXin Li 
E(T t)32*67e74705SXin Li template<typename T> int E(T t) { return t; }
33*67e74705SXin Li 
34*67e74705SXin Li template<typename T> struct F {
35*67e74705SXin Li   int f();
36*67e74705SXin Li   template<typename U> int g();
37*67e74705SXin Li   static int n;
38*67e74705SXin Li };
f()39*67e74705SXin Li template<typename T> int F<T>::f() { return 0; }
g()40*67e74705SXin Li template<typename T> template<typename U> int F<T>::g() { return 0; }
41*67e74705SXin Li template<typename T> int F<T>::n = 0;
f()42*67e74705SXin Li template<> inline int F<char>::f() { return 0; }
g()43*67e74705SXin Li template<> template<typename U> int F<char>::g() { return 0; }
44*67e74705SXin Li template<> struct F<void> { int h(); };
45*67e74705SXin Li inline int F<void>::h() { return 0; }
46*67e74705SXin Li template<typename T> struct F<T *> { int i(); };
47*67e74705SXin Li template<typename T> int F<T*>::i() { return 0; }
48*67e74705SXin Li 
49*67e74705SXin Li namespace G {
50*67e74705SXin Li   enum A { a, b, c, d, e };
51*67e74705SXin Li   enum { f, g, h };
52*67e74705SXin Li   typedef enum { i, j } k;
53*67e74705SXin Li   typedef enum {} l;
54*67e74705SXin Li }
55*67e74705SXin Li 
56*67e74705SXin Li template<typename T = int, int N = 3, template<typename> class K = F> int H(int a = 1);
57*67e74705SXin Li template<typename T = int, int N = 3, template<typename> class K = F> using I = decltype(H<T, N, K>());
58*67e74705SXin Li template<typename T = int, int N = 3, template<typename> class K = F> struct J {};
59*67e74705SXin Li 
60*67e74705SXin Li namespace NS {
61*67e74705SXin Li   struct A {};
62*67e74705SXin Li   template<typename T> struct B : A {};
63*67e74705SXin Li   template<typename T> struct B<T*> : B<char> {};
64*67e74705SXin Li   template<> struct B<int> : B<int*> {};
65*67e74705SXin Li   inline void f() {}
66*67e74705SXin Li }
67*67e74705SXin Li 
68*67e74705SXin Li namespace StaticInline {
69*67e74705SXin Li   struct X {};
70*67e74705SXin Li   static inline void f(X);
71*67e74705SXin Li   static inline void g(X x) { f(x); }
72*67e74705SXin Li }
73*67e74705SXin Li 
74*67e74705SXin Li namespace FriendDefArg {
75*67e74705SXin Li   template<typename = int> struct A;
76*67e74705SXin Li   template<int = 0> struct B;
77*67e74705SXin Li   template<template<typename> class = A> struct C;
78*67e74705SXin Li   template<typename = int, int = 0, template<typename> class = A> struct D {};
79*67e74705SXin Li   template<typename U> struct Y {
80*67e74705SXin Li     template<typename> friend struct A;
81*67e74705SXin Li     template<int> friend struct B;
82*67e74705SXin Li     template<template<typename> class> friend struct C;
83*67e74705SXin Li     template<typename, int, template<typename> class> friend struct D;
84*67e74705SXin Li   };
85*67e74705SXin Li }
86*67e74705SXin Li 
87*67e74705SXin Li namespace SeparateInline {
88*67e74705SXin Li   inline void f();
89*67e74705SXin Li   void f() {}
90*67e74705SXin Li   constexpr int g() { return 0; }
91*67e74705SXin Li }
92*67e74705SXin Li 
93*67e74705SXin Li namespace TrailingAttributes {
94*67e74705SXin Li   template<typename T> struct X {} __attribute__((aligned(8)));
95*67e74705SXin Li }
96*67e74705SXin Li 
97*67e74705SXin Li namespace MergeFunctionTemplateSpecializations {
98*67e74705SXin Li   template<typename T> T f();
99*67e74705SXin Li   template<typename T> struct X {
100*67e74705SXin Li     template<typename U> using Q = decltype(f<T>() + U());
101*67e74705SXin Li   };
102*67e74705SXin Li   using xiq = X<int>::Q<int>;
103*67e74705SXin Li }
104*67e74705SXin Li 
105*67e74705SXin Li enum ScopedEnum : int;
106*67e74705SXin Li enum ScopedEnum : int { a, b, c };
107*67e74705SXin Li 
108*67e74705SXin Li namespace RedeclDifferentDeclKind {
109*67e74705SXin Li   struct X {};
110*67e74705SXin Li   typedef X X;
111*67e74705SXin Li   using RedeclDifferentDeclKind::X;
112*67e74705SXin Li }
113*67e74705SXin Li 
114*67e74705SXin Li namespace Anon {
115*67e74705SXin Li   struct X {
116*67e74705SXin Li     union {
117*67e74705SXin Li       int n;
118*67e74705SXin Li     };
119*67e74705SXin Li   };
120*67e74705SXin Li }
121*67e74705SXin Li 
122*67e74705SXin Li namespace ClassTemplatePartialSpec {
123*67e74705SXin Li   template<typename T> struct F;
124*67e74705SXin Li   template<template<int> class A, int B> struct F<A<B>> {
125*67e74705SXin Li     template<typename C> F();
126*67e74705SXin Li   };
127*67e74705SXin Li   template<template<int> class A, int B> template<typename C> F<A<B>>::F() {}
128*67e74705SXin Li 
129*67e74705SXin Li   template<typename A, int B> struct F<A[B]> {
130*67e74705SXin Li     template<typename C> F();
131*67e74705SXin Li   };
132*67e74705SXin Li   template<typename A, int B> template<typename C> F<A[B]>::F() {}
133*67e74705SXin Li }
134*67e74705SXin Li 
135*67e74705SXin Li struct MemberClassTemplate {
136*67e74705SXin Li   template<typename T> struct A;
137*67e74705SXin Li };
138*67e74705SXin Li template<typename T> struct MemberClassTemplate::A {};
139*67e74705SXin Li template<typename T> struct MemberClassTemplate::A<T*> {};
140*67e74705SXin Li template<> struct MemberClassTemplate::A<int> {};
141