@@ -1359,3 +1359,49 @@ void complex_type_argument() {
13591359// OGCG: store float %[[A_IMAG]], ptr %[[ARG_IMAG_PTR]], align 4
13601360// OGCG: %[[TMP_ARG:.*]] = load <2 x float>, ptr %[[ARG_ADDR]], align 4
13611361// OGCG: call void @_Z22complex_type_parameterCf(<2 x float> noundef %[[TMP_ARG]])
1362+
1363+ void real_on_scalar_bool () {
1364+ bool a;
1365+ bool b = __real__ a;
1366+ }
1367+
1368+ // CIR: %[[A_ADDR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["a"]
1369+ // CIR: %[[B_ADDR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["b", init]
1370+ // CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.bool>, !cir.bool
1371+ // CIR: %[[A_REAL:.*]] = cir.complex.real %[[TMP_A]] : !cir.bool -> !cir.bool
1372+ // CIR: cir.store{{.*}} %[[A_REAL]], %[[B_ADDR]] : !cir.bool, !cir.ptr<!cir.bool>
1373+
1374+ // LLVM: %[[A_ADDR:.*]] = alloca i8, i64 1, align 1
1375+ // LLVM: %[[B_ADDR:.*]] = alloca i8, i64 1, align 1
1376+ // LLVM: %[[TMP_A:.*]] = load i8, ptr %[[A_ADDR]], align 1
1377+ // LLVM: %[[TMP_A_I1:.*]] = trunc i8 %[[TMP_A]] to i1
1378+ // LLVM: %[[TMP_A_I8:.*]] = zext i1 %[[TMP_A_I1]] to i8
1379+ // LLVM: store i8 %[[TMP_A_I8]], ptr %[[B_ADDR]], align 1
1380+
1381+ // OGCG: %[[A_ADDR:.*]] = alloca i8, align 1
1382+ // OGCG: %[[B_ADDR:.*]] = alloca i8, align 1
1383+ // OGCG: %[[TMP_A:.*]] = load i8, ptr %[[A_ADDR]], align 1
1384+ // OGCG: %[[TMP_A_I1:.*]] = trunc i8 %[[TMP_A]] to i1
1385+ // OGCG: %[[TMP_A_I8:.*]] = zext i1 %[[TMP_A_I1]] to i8
1386+ // OGCG: store i8 %[[TMP_A_I8]], ptr %[[B_ADDR]], align 1
1387+
1388+ void imag_on_scalar_bool () {
1389+ bool a;
1390+ bool b = __imag__ a;
1391+ }
1392+
1393+ // CIR: %[[A_ADDR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["a"]
1394+ // CIR: %[[B_ADDR:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["b", init]
1395+ // CIR: %[[TMP_A:.*]] = cir.load{{.*}} %[[A_ADDR]] : !cir.ptr<!cir.bool>, !cir.bool
1396+ // CIR: %[[A_IMAG:.*]] = cir.complex.imag %[[TMP_A]] : !cir.bool -> !cir.bool
1397+ // CIR: cir.store{{.*}} %[[A_IMAG]], %[[B_ADDR]] : !cir.bool, !cir.ptr<!cir.bool>
1398+
1399+ // LLVM: %[[A_ADDR:.*]] = alloca i8, i64 1, align 1
1400+ // LLVM: %[[B_ADDR:.*]] = alloca i8, i64 1, align 1
1401+ // LLVM: %[[TMP_A:.*]] = load i8, ptr %[[A_ADDR]], align 1
1402+ // LLVM: %[[TMP_A_I1:.*]] = trunc i8 %[[TMP_A]] to i1
1403+ // LLVM: store i8 0, ptr %[[B_ADDR]], align 1
1404+
1405+ // OGCG: %[[A_ADDR:.*]] = alloca i8, align 1
1406+ // OGCG: %[[B_ADDR:.*]] = alloca i8, align 1
1407+ // OGCG: store i8 0, ptr %[[B_ADDR]], align 1
0 commit comments