xref: /llvm-project/clang/test/Modules/Inputs/merge-using-decls/a.h (revision 9ab5f761176c376c0a117c53f0f111fed1bcc842)
1 struct X {
2   int v;
3   typedef int t;
4   void f(X);
5 };
6 
7 struct YA {
8   int value;
9   typedef int type;
10 };
11 
12 struct Z {
13   void f(Z);
14 };
15 
16 template<typename T> struct C : X, T {
17   using T::value;
18   using typename T::type;
19   using X::v;
20   using typename X::t;
21 };
22 
23 template<typename T> struct D : X, T {
24   using T::value;
25   using typename T::type;
26   using X::v;
27   using typename X::t;
28 };
29 
30 template<typename T> struct E : X, T {
31   using T::value;
32   using typename T::type;
33   using X::v;
34   using typename X::t;
35 };
36 
37 template<typename T> struct F : X, T {
38   using T::value;
39   using typename T::type;
40   using X::v;
41   using typename X::t;
42 };
43 
44 // Force instantiation.
45 typedef C<YA>::type I;
46 typedef D<YA>::type I;
47 typedef E<YA>::type I;
48 typedef F<YA>::type I;
49 
50 #if __cplusplus >= 201702L
51 template<typename ...T> struct G : T... {
52   using T::f...;
53 };
54 using Q = decltype(G<X, Z>());
55 #endif
56