Files
c3c/test/test_suite/statements/various_switching.c3t
Christoffer Lerno cdabe8fd9e - Create optional with ~ instead of ?. return io::EOF?; becomes return io::EOF~.
- Deprecated use of `?` to create optional.
2026-01-20 16:10:28 +01:00

228 lines
7.5 KiB
Plaintext

// #target: macos-x64
module mymodule;
extern fn void printf(char *, ...);
faultdef FOO;
faultdef BAR, BAZ;
fn void test()
{
int? x = BAR~;
typeid z = int.typeid;
switch (z)
{
case int:
printf("Was int!\n");
case bool:
nextcase double;
case double:
nextcase;
default:
printf("Wasn't int :(\n");
}
int a = 1;
int b = 2;
int zy = b + a;
switch (zy)
{
case a:
printf("Got a\n");
case b:
printf("Got b\n");
default:
printf("None of the above\n");
}
switch
{
case a < 0:
printf("A negative\n");
case a == 1:
printf("A is 1\n");
default:
printf("Unexpected a\n");
}
}
fn void main()
{
test();
printf("Hello!\n");
}
/* #expect: mymodule.ll
define void @mymodule.test() #0 {
entry:
%x = alloca i32, align 4
%x.f = alloca i64, align 8
%z = alloca i64, align 8
%switch = alloca i64, align 8
%a = alloca i32, align 4
%b = alloca i32, align 4
%zy = alloca i32, align 4
%switch17 = alloca i32, align 4
%switch27 = alloca i8, align 1
store i64 ptrtoint (ptr @mymodule.BAR to i64), ptr %x.f, align 8
store i64 ptrtoint (ptr @"$ct.int" to i64), ptr %z, align 8
%0 = load i64, ptr %z, align 8
store i64 %0, ptr %switch, align 8
br label %switch.entry
switch.entry: ; preds = %entry
%1 = load i64, ptr %switch, align 8
br label %check_subtype
check_subtype: ; preds = %parent_type_block, %switch.entry
%2 = phi i64 [ %1, %switch.entry ], [ %typeid.parent, %parent_type_block ]
%eq = icmp eq i64 ptrtoint (ptr @"$ct.int" to i64), %2
br i1 %eq, label %result_block, label %parent_type_block
parent_type_block: ; preds = %check_subtype
%3 = inttoptr i64 %2 to ptr
%ptradd = getelementptr inbounds i8, ptr %3, i64 8
%typeid.parent = load i64, ptr %ptradd, align 8
%4 = icmp eq i64 %typeid.parent, 0
br i1 %4, label %result_block, label %check_subtype
result_block: ; preds = %parent_type_block, %check_subtype
%5 = phi i1 [ false, %parent_type_block ], [ true, %check_subtype ]
br i1 %5, label %switch.case, label %next_if
switch.case: ; preds = %result_block
call void (ptr, ...) @printf(ptr @.str)
br label %switch.exit
next_if: ; preds = %result_block
br label %check_subtype1
check_subtype1: ; preds = %parent_type_block3, %next_if
%6 = phi i64 [ %1, %next_if ], [ %typeid.parent5, %parent_type_block3 ]
%eq2 = icmp eq i64 ptrtoint (ptr @"$ct.bool" to i64), %6
br i1 %eq2, label %result_block6, label %parent_type_block3
parent_type_block3: ; preds = %check_subtype1
%7 = inttoptr i64 %6 to ptr
%ptradd4 = getelementptr inbounds i8, ptr %7, i64 8
%typeid.parent5 = load i64, ptr %ptradd4, align 8
%8 = icmp eq i64 %typeid.parent5, 0
br i1 %8, label %result_block6, label %check_subtype1
result_block6: ; preds = %parent_type_block3, %check_subtype1
%9 = phi i1 [ false, %parent_type_block3 ], [ true, %check_subtype1 ]
br i1 %9, label %switch.case7, label %next_if8
switch.case7: ; preds = %result_block6
br label %switch.case15
next_if8: ; preds = %result_block6
br label %check_subtype9
check_subtype9: ; preds = %parent_type_block11, %next_if8
%10 = phi i64 [ %1, %next_if8 ], [ %typeid.parent13, %parent_type_block11 ]
%eq10 = icmp eq i64 ptrtoint (ptr @"$ct.double" to i64), %10
br i1 %eq10, label %result_block14, label %parent_type_block11
parent_type_block11: ; preds = %check_subtype9
%11 = inttoptr i64 %10 to ptr
%ptradd12 = getelementptr inbounds i8, ptr %11, i64 8
%typeid.parent13 = load i64, ptr %ptradd12, align 8
%12 = icmp eq i64 %typeid.parent13, 0
br i1 %12, label %result_block14, label %check_subtype9
result_block14: ; preds = %parent_type_block11, %check_subtype9
%13 = phi i1 [ false, %parent_type_block11 ], [ true, %check_subtype9 ]
br i1 %13, label %switch.case15, label %next_if16
switch.case15: ; preds = %result_block14, %switch.case7
br label %switch.default
next_if16: ; preds = %result_block14
br label %switch.default
switch.default: ; preds = %next_if16, %switch.case15
call void (ptr, ...) @printf(ptr @.str.1)
br label %switch.exit
switch.exit: ; preds = %switch.default, %switch.case
store i32 1, ptr %a, align 4
store i32 2, ptr %b, align 4
%14 = load i32, ptr %b, align 4
%15 = load i32, ptr %a, align 4
%add = add i32 %14, %15
store i32 %add, ptr %zy, align 4
%16 = load i32, ptr %zy, align 4
store i32 %16, ptr %switch17, align 4
br label %switch.entry18
switch.entry18: ; preds = %switch.exit
%17 = load i32, ptr %switch17, align 4
%18 = load i32, ptr %a, align 4
%eq19 = icmp eq i32 %18, %17
br i1 %eq19, label %switch.case20, label %next_if21
switch.case20: ; preds = %switch.entry18
call void (ptr, ...) @printf(ptr @.str.2)
br label %switch.exit26
next_if21: ; preds = %switch.entry18
%19 = load i32, ptr %b, align 4
%eq22 = icmp eq i32 %19, %17
br i1 %eq22, label %switch.case23, label %next_if24
switch.case23: ; preds = %next_if21
call void (ptr, ...) @printf(ptr @.str.3)
br label %switch.exit26
next_if24: ; preds = %next_if21
br label %switch.default25
switch.default25: ; preds = %next_if24
call void (ptr, ...) @printf(ptr @.str.4)
br label %switch.exit26
switch.exit26: ; preds = %switch.default25, %switch.case23, %switch.case20
store i8 1, ptr %switch27, align 1
br label %switch.entry28
switch.entry28: ; preds = %switch.exit26
%20 = load i8, ptr %switch27, align 1
%21 = trunc i8 %20 to i1
%22 = load i32, ptr %a, align 4
%lt = icmp slt i32 %22, 0
%eq29 = icmp eq i1 %lt, %21
br i1 %eq29, label %switch.case30, label %next_if31
switch.case30: ; preds = %switch.entry28
call void (ptr, ...) @printf(ptr @.str.5)
br label %switch.exit37
next_if31: ; preds = %switch.entry28
%23 = load i32, ptr %a, align 4
%eq32 = icmp eq i32 %23, 1
%eq33 = icmp eq i1 %eq32, %21
br i1 %eq33, label %switch.case34, label %next_if35
switch.case34: ; preds = %next_if31
call void (ptr, ...) @printf(ptr @.str.6)
br label %switch.exit37
next_if35: ; preds = %next_if31
br label %switch.default36
switch.default36: ; preds = %next_if35
call void (ptr, ...) @printf(ptr @.str.7)
br label %switch.exit37
switch.exit37: ; preds = %switch.default36, %switch.case34, %switch.case30
ret void
}
; Function Attrs: nounwind uwtable
define void @mymodule.main() #0 {
entry:
call void @mymodule.test()
call void (ptr, ...) @printf(ptr @.str.8)
ret void
}