@@ -19,3 +19,27 @@ void complex_lvalue_bitcast() {
19
19
20
20
// LLVM: %[[A_ADDR:.*]] = alloca %struct.CX, i64 1, align 8
21
21
// LLVM: store { double, double } zeroinitializer, ptr %[[A_ADDR]], align 8
22
+
23
+ void complex_user_defined_cast () {
24
+ struct Point {
25
+ int x;
26
+ int y;
27
+ operator int _Complex () const { return {x, y}; }
28
+ };
29
+
30
+ Point p{1 , 2 };
31
+ int _Complex c = p;
32
+ }
33
+
34
+ // CIR-AFTER: %[[P_ADDR:.*]] = cir.alloca !rec_Point, !cir.ptr<!rec_Point>, ["p"]
35
+ // CIR-AFTER: %[[C_ADDR:.*]] = cir.alloca !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>, ["c", init]
36
+ // CIR-AFTER: %[[P_CONST:.*]] = cir.const #cir.const_record<{#cir.int<1> : !s32i, #cir.int<2> : !s32i}> : !rec_Point
37
+ // CIR-AFTER: cir.store{{.*}} %[[P_CONST]], %[[P_ADDR]] : !rec_Point, !cir.ptr<!rec_Point>
38
+ // CIR-AFTER: %[[POINT_TO_COMPLEX:.*]] = cir.call @_ZZ25complex_user_defined_castvENK5PointcvCiEv(%[[P_ADDR]]) : (!cir.ptr<!rec_Point>) -> !cir.complex<!s32i>
39
+ // CIR-AFTER: cir.store{{.*}} %[[POINT_TO_COMPLEX]], %[[C_ADDR]] : !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>
40
+
41
+ // LLVM: %[[P_ADDR:.*]] = alloca %struct.Point, i64 1, align 4
42
+ // LLVM: %[[C_ADDR:.*]] = alloca { i32, i32 }, i64 1, align 4
43
+ // LLVM: store %struct.Point { i32 1, i32 2 }, ptr %[[P_ADDR]], align 4
44
+ // LLVM: %[[POINT_TO_COMPLEX:.*]] = call { i32, i32 } @_ZZ25complex_user_defined_castvENK5PointcvCiEv(ptr %[[P_ADDR]])
45
+ // LLVM: store { i32, i32 } %[[POINT_TO_COMPLEX]], ptr %[[C_ADDR]], align 4
0 commit comments