1*5518a9d7SAndrey Ali Khan Bolshakov // RUN: %clang_cc1 -std=c++20 %s -emit-llvm -o - -triple x86_64-linux -DCONSTEXPR= | FileCheck %s
2*5518a9d7SAndrey Ali Khan Bolshakov // RUN: %clang_cc1 -std=c++20 %s -emit-llvm -o - -triple x86_64-linux -DCONSTEXPR=constexpr | FileCheck %s --check-prefix=CONST
3*5518a9d7SAndrey Ali Khan Bolshakov
id(T v)4*5518a9d7SAndrey Ali Khan Bolshakov template<typename T> CONSTEXPR T id(T v) { return v; }
5*5518a9d7SAndrey Ali Khan Bolshakov template<auto V> auto value = id(V);
6*5518a9d7SAndrey Ali Khan Bolshakov
7*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIiET_S0_(i32 noundef 1)
8*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueILi1EE = weak_odr {{.*}} i32 1,
9*5518a9d7SAndrey Ali Khan Bolshakov template int value<1>;
10*5518a9d7SAndrey Ali Khan Bolshakov
11*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIyET_S0_(i64 noundef -1)
12*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueILy18446744073709551615EE = weak_odr {{.*}} i64 -1,
13*5518a9d7SAndrey Ali Khan Bolshakov template unsigned long long value<-1ULL>;
14*5518a9d7SAndrey Ali Khan Bolshakov
15*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIfET_S0_(float noundef 1.000000e+00)
16*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueILf3f800000EE = weak_odr {{.*}} float 1.000000e+00,
17*5518a9d7SAndrey Ali Khan Bolshakov template float value<1.0f>;
18*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIdET_S0_(double noundef 1.000000e+00)
19*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueILd3ff0000000000000EE = weak_odr {{.*}} double 1.000000e+00,
20*5518a9d7SAndrey Ali Khan Bolshakov template double value<1.0>;
21*5518a9d7SAndrey Ali Khan Bolshakov
22*5518a9d7SAndrey Ali Khan Bolshakov enum E{ E1, E2};
23*5518a9d7SAndrey Ali Khan Bolshakov
24*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idI1EET_S1_(i32 noundef 1)
25*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueIL1E1EE = weak_odr {{.*}} i32 1,
26*5518a9d7SAndrey Ali Khan Bolshakov template E value<E2>;
27*5518a9d7SAndrey Ali Khan Bolshakov
28*5518a9d7SAndrey Ali Khan Bolshakov int n;
29*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIPiET_S1_(ptr noundef @n)
30*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueIXadL_Z1nEEE = weak_odr {{.*}} ptr @n,
31*5518a9d7SAndrey Ali Khan Bolshakov template int *value<&n>;
32*5518a9d7SAndrey Ali Khan Bolshakov
33*5518a9d7SAndrey Ali Khan Bolshakov struct A { int a[3]; } a;
34*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIPiET_S1_(ptr noundef @a)
35*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueIXadsoiL_Z1aEEEE = weak_odr {{.*}} ptr @a,
36*5518a9d7SAndrey Ali Khan Bolshakov template int *value<&a.a[0]>;
37*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIPiET_S1_(ptr noundef getelementptr (i8, ptr @a, i64 4))
38*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueIXadsoiL_Z1aE4EEE = weak_odr {{.*}} ptr getelementptr (i8, ptr @a, i64 4),
39*5518a9d7SAndrey Ali Khan Bolshakov template int *value<&a.a[1]>;
40*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIPiET_S1_(ptr noundef getelementptr (i8, ptr @a, i64 8))
41*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueIXadsoiL_Z1aE8EEE = weak_odr {{.*}} ptr getelementptr (i8, ptr @a, i64 8),
42*5518a9d7SAndrey Ali Khan Bolshakov template int *value<&a.a[2]>;
43*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIPiET_S1_(ptr noundef getelementptr (i8, ptr @a, i64 12))
44*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueIXadsoiL_Z1aE12pEEE = weak_odr {{.*}} ptr getelementptr (i8, ptr @a, i64 12),
45*5518a9d7SAndrey Ali Khan Bolshakov template int *value<&a.a[3]>;
46*5518a9d7SAndrey Ali Khan Bolshakov
47*5518a9d7SAndrey Ali Khan Bolshakov union U {
48*5518a9d7SAndrey Ali Khan Bolshakov int x, y;
49*5518a9d7SAndrey Ali Khan Bolshakov union {
50*5518a9d7SAndrey Ali Khan Bolshakov int x, y;
51*5518a9d7SAndrey Ali Khan Bolshakov } internal;
52*5518a9d7SAndrey Ali Khan Bolshakov } u;
53*5518a9d7SAndrey Ali Khan Bolshakov
54*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIPiET_S1_(ptr noundef @u)
55*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueIXadsoiL_Z1uE_EEE = weak_odr {{.*}} ptr @u,
56*5518a9d7SAndrey Ali Khan Bolshakov template int *value<&u.x>;
57*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIPiET_S1_(ptr noundef @u)
58*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueIXadsoiL_Z1uE_0EEE = weak_odr {{.*}} ptr @u,
59*5518a9d7SAndrey Ali Khan Bolshakov template int *value<&u.y>;
60*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIPiET_S1_(ptr noundef @u)
61*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueIXadsoiL_Z1uE_1_0EEE = weak_odr {{.*}} ptr @u,
62*5518a9d7SAndrey Ali Khan Bolshakov template int *value<&u.internal.y>;
63*5518a9d7SAndrey Ali Khan Bolshakov
64*5518a9d7SAndrey Ali Khan Bolshakov struct B { int x, y; };
65*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIM1BiET_S2_(i64 0)
66*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueIXadL_ZN1B1xEEEE = weak_odr {{.*}} i64 0,
67*5518a9d7SAndrey Ali Khan Bolshakov template int B::*value<&B::x>;
68*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIM1BiET_S2_(i64 4)
69*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueIXadL_ZN1B1yEEEE = weak_odr {{.*}} i64 4,
70*5518a9d7SAndrey Ali Khan Bolshakov template int B::*value<&B::y>;
71*5518a9d7SAndrey Ali Khan Bolshakov
72*5518a9d7SAndrey Ali Khan Bolshakov struct C : A, B { int z; };
73*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIM1CiET_S2_(i64 12)
74*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueIXmcM1CiadL_ZN1B1xEE12EEE = weak_odr {{.*}} i64 12,
75*5518a9d7SAndrey Ali Khan Bolshakov template int C::*value<(int C::*)&B::x>;
76*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIM1BiET_S2_(i64 8)
77*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueIXmcM1BiadL_ZN1C1zEEn12EEE = weak_odr {{.*}} i64 8,
78*5518a9d7SAndrey Ali Khan Bolshakov template int B::*value<(int B::*)&C::z>;
79*5518a9d7SAndrey Ali Khan Bolshakov
80*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: store i32 1,
81*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: store i32 2,
82*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: load i64,
83*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idICiET_S1_(i64 noundef %
84*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueIXtlCiLi1ELi2EEEE = weak_odr {{.*}} { i32, i32 } { i32 1, i32 2 },
85*5518a9d7SAndrey Ali Khan Bolshakov template _Complex int value<1 + 2j>;
86*5518a9d7SAndrey Ali Khan Bolshakov
87*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: store float 1.000000e+00,
88*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: store float 2.000000e+00,
89*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: load <2 x float>,
90*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idICfET_S1_(<2 x float> noundef %
91*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueIXtlCfLf3f800000ELf40000000EEEE = weak_odr {{.*}} { float, float } { float 1.000000e+00, float 2.000000e+00 },
92*5518a9d7SAndrey Ali Khan Bolshakov template _Complex float value<1.0f + 2.0fj>;
93*5518a9d7SAndrey Ali Khan Bolshakov
94*5518a9d7SAndrey Ali Khan Bolshakov using V3i __attribute__((ext_vector_type(3))) = int;
95*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIDv3_iET_S1_(<3 x i32> noundef <i32 1, i32 2, i32 3>)
96*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueIXtlDv3_iLi1ELi2ELi3EEEE = weak_odr {{.*}} <3 x i32> <i32 1, i32 2, i32 3>
97*5518a9d7SAndrey Ali Khan Bolshakov template V3i value<V3i{1, 2, 3}>;
98*5518a9d7SAndrey Ali Khan Bolshakov
99*5518a9d7SAndrey Ali Khan Bolshakov using V3f [[gnu::vector_size(12)]] = float;
100*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: call {{.*}} @_Z2idIDv3_fET_S1_(<3 x float> noundef <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>)
101*5518a9d7SAndrey Ali Khan Bolshakov // CONST: @_Z5valueIXtlDv3_fLf3f800000ELf40000000ELf40400000EEEE = weak_odr {{.*}} <3 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00>
102*5518a9d7SAndrey Ali Khan Bolshakov template V3f value<V3f{1, 2, 3}>;
103*5518a9d7SAndrey Ali Khan Bolshakov
104*5518a9d7SAndrey Ali Khan Bolshakov
105*5518a9d7SAndrey Ali Khan Bolshakov template <int& i>
setByRef()106*5518a9d7SAndrey Ali Khan Bolshakov void setByRef() {
107*5518a9d7SAndrey Ali Khan Bolshakov i = 1;
108*5518a9d7SAndrey Ali Khan Bolshakov }
109*5518a9d7SAndrey Ali Khan Bolshakov
callSetByRefWithSubobject()110*5518a9d7SAndrey Ali Khan Bolshakov void callSetByRefWithSubobject() {
111*5518a9d7SAndrey Ali Khan Bolshakov // CHECK: store i32 1, ptr getelementptr (i8, ptr @a, i64 4)
112*5518a9d7SAndrey Ali Khan Bolshakov setByRef<a.a[1]>();
113*5518a9d7SAndrey Ali Khan Bolshakov }
114