@@ -101,3 +101,27 @@ int _Complex complex_real_operator_on_rvalue() {
101
101
// LLVM: store { i32, i32 } zeroinitializer, ptr %[[RET_ADDR]], align 4
102
102
// LLVM: %[[TMP_RET:.*]] = load { i32, i32 }, ptr %[[RET_ADDR]], align 4
103
103
// LLVM: ret { i32, i32 } %[[TMP_RET]]
104
+
105
+ int _Complex complex_imag_operator_on_rvalue () {
106
+ int imag = __imag__ complex_imag_operator_on_rvalue ();
107
+ return {};
108
+ }
109
+
110
+ // CIR: %[[RET_ADDR:.*]] = cir.alloca !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>, ["__retval"]
111
+ // CIR: %[[IMAG_ADDR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["imag", init]
112
+ // CIR: %[[CALL:.*]] = cir.call @_Z31complex_imag_operator_on_rvaluev() : () -> !cir.complex<!s32i>
113
+ // CIR: %[[IMAG:.*]] = cir.complex.imag %[[CALL]] : !cir.complex<!s32i> -> !s32i
114
+ // CIR: cir.store{{.*}} %[[IMAG]], %[[IMAG_ADDR]] : !s32i, !cir.ptr<!s32i>
115
+ // CIR: %[[RET_COMPLEX:.*]] = cir.const #cir.complex<#cir.int<0> : !s32i, #cir.int<0> : !s32i> : !cir.complex<!s32i>
116
+ // CIR: cir.store{{.*}} %[[RET_COMPLEX]], %[[RET_ADDR]] : !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>
117
+ // CIR: %[[TMP_RET:.*]] = cir.load %[[RET_ADDR]] : !cir.ptr<!cir.complex<!s32i>>, !cir.complex<!s32i>
118
+ // CIR: cir.return %[[TMP_RET]] : !cir.complex<!s32i>
119
+
120
+ // LLVM: %[[RET_ADDR:.*]] = alloca { i32, i32 }, i64 1, align 4
121
+ // LLVM: %[[IMAG_ADDR:.*]] = alloca i32, i64 1, align 4
122
+ // LLVM: %[[CALL:.*]] = call { i32, i32 } @_Z31complex_imag_operator_on_rvaluev()
123
+ // LLVM: %[[IMAG:.*]] = extractvalue { i32, i32 } %[[CALL]], 1
124
+ // LLVM: store i32 %[[IMAG]], ptr %[[IMAG_ADDR]], align 4
125
+ // LLVM: store { i32, i32 } zeroinitializer, ptr %[[RET_ADDR]], align 4
126
+ // LLVM: %[[TMP_RET:.*]] = load { i32, i32 }, ptr %[[RET_ADDR]], align 4
127
+ // LLVM: ret { i32, i32 } %[[TMP_RET]]
0 commit comments