Files
c3c/test/test_suite/from_docs/examples_forswitch.c3t
2023-11-13 17:20:46 +01:00

714 lines
25 KiB
Plaintext

// #target: macos-x64
module examples;
import libc;
import std::io;
fn void example_for()
{
// the for-loop is the same as C99.
for (int i = 0; i < 10; i++)
{
libc::printf("%d\n", i);
}
// also equal
for (;;)
{
// ..
}
}
enum Height : uint
{
LOW,
MEDIUM,
HIGH,
}
fn void demo_enum(Height h)
{
switch (h)
{
case LOW:
case MEDIUM:
io::printn("Not high");
// Implicit break.
case HIGH:
io::printn("High");
}
// This also works
switch (h)
{
case LOW:
case MEDIUM:
io::printn("Not high");
// Implicit break.
case Height.HIGH:
io::printn("High");
}
// Completely empty cases are not allowed.
switch (h)
{
case LOW:
break; // Explicit break required, since switches can't be empty.
case MEDIUM:
io::printn("Medium");
case HIGH:
break;
}
// special checking of switching on enum types
switch (h)
{
case LOW:
case MEDIUM:
case HIGH:
break;
default: // warning: default label in switch which covers all enumeration value
break;
}
// Using "nextcase" will fallthrough to the next case statement,
// and each case statement starts its own scope.
switch (h)
{
case LOW:
int a = 1;
io::printn("A");
nextcase;
case MEDIUM:
int a = 2;
io::printn("B");
nextcase;
case HIGH:
// a is not defined here
io::printn("C");
}
}
/* #expect: examples.ll
define void @examples.example_for() #0 {
entry:
%i = alloca i32, align 4
store i32 0, ptr %i, align 4
br label %loop.cond
loop.cond: ; preds = %loop.body, %entry
%0 = load i32, ptr %i, align 4
%lt = icmp slt i32 %0, 10
br i1 %lt, label %loop.body, label %loop.exit
loop.body: ; preds = %loop.cond
%1 = load i32, ptr %i, align 4
%2 = call i32 (ptr, ...) @printf(ptr @.str, i32 %1)
%3 = load i32, ptr %i, align 4
%add = add i32 %3, 1
store i32 %add, ptr %i, align 4
br label %loop.cond
loop.exit: ; preds = %loop.cond
%4 = load ptr, ptr @std.core.builtin.panic, align 8
call void %4(ptr @.panic_msg, i64 19, ptr @.file, i64 21, ptr @.func, i64 11, i32 14)
unreachable
}
define void @examples.demo_enum(i32 %0) #0 {
entry:
%switch = alloca i32, align 4
%len = alloca i64, align 8
%error_var = alloca i64, align 8
%retparam = alloca i64, align 8
%error_var2 = alloca i64, align 8
%error_var8 = alloca i64, align 8
%len15 = alloca i64, align 8
%error_var16 = alloca i64, align 8
%retparam18 = alloca i64, align 8
%error_var24 = alloca i64, align 8
%error_var30 = alloca i64, align 8
%switch38 = alloca i32, align 4
%len41 = alloca i64, align 8
%error_var42 = alloca i64, align 8
%retparam44 = alloca i64, align 8
%error_var50 = alloca i64, align 8
%error_var56 = alloca i64, align 8
%len65 = alloca i64, align 8
%error_var66 = alloca i64, align 8
%retparam68 = alloca i64, align 8
%error_var74 = alloca i64, align 8
%error_var80 = alloca i64, align 8
%switch89 = alloca i32, align 4
%len93 = alloca i64, align 8
%error_var94 = alloca i64, align 8
%retparam96 = alloca i64, align 8
%error_var102 = alloca i64, align 8
%error_var108 = alloca i64, align 8
%switch118 = alloca i32, align 4
%switch122 = alloca i32, align 4
%a = alloca i32, align 4
%len125 = alloca i64, align 8
%error_var126 = alloca i64, align 8
%retparam128 = alloca i64, align 8
%error_var134 = alloca i64, align 8
%error_var140 = alloca i64, align 8
%a149 = alloca i32, align 4
%len150 = alloca i64, align 8
%error_var151 = alloca i64, align 8
%retparam153 = alloca i64, align 8
%error_var159 = alloca i64, align 8
%error_var165 = alloca i64, align 8
%len174 = alloca i64, align 8
%error_var175 = alloca i64, align 8
%retparam177 = alloca i64, align 8
%error_var183 = alloca i64, align 8
%error_var189 = alloca i64, align 8
store i32 %0, ptr %switch, align 4
br label %switch.entry
switch.entry: ; preds = %entry
%1 = load i32, ptr %switch, align 4
switch i32 %1, label %switch.exit [
i32 0, label %switch.case
i32 1, label %switch.case
i32 2, label %switch.case14
]
switch.case: ; preds = %switch.entry, %switch.entry
%2 = call ptr @std.io.stdout()
%3 = call i64 @std.io.File.write(ptr %retparam, ptr %2, ptr @.str.1, i64 8)
%not_err = icmp eq i64 %3, 0
%4 = call i1 @llvm.expect.i1(i1 %not_err, i1 true)
br i1 %4, label %after_check, label %assign_optional
assign_optional: ; preds = %switch.case
store i64 %3, ptr %error_var, align 8
br label %guard_block
after_check: ; preds = %switch.case
br label %noerr_block
guard_block: ; preds = %assign_optional
br label %voiderr
noerr_block: ; preds = %after_check
%5 = load i64, ptr %retparam, align 8
store i64 %5, ptr %len, align 8
%6 = call i64 @std.io.File.write_byte(ptr %2, i8 zeroext 10)
%not_err3 = icmp eq i64 %6, 0
%7 = call i1 @llvm.expect.i1(i1 %not_err3, i1 true)
br i1 %7, label %after_check5, label %assign_optional4
assign_optional4: ; preds = %noerr_block
store i64 %6, ptr %error_var2, align 8
br label %guard_block6
after_check5: ; preds = %noerr_block
br label %noerr_block7
guard_block6: ; preds = %assign_optional4
br label %voiderr
noerr_block7: ; preds = %after_check5
%8 = call i64 @std.io.File.flush(ptr %2)
%not_err9 = icmp eq i64 %8, 0
%9 = call i1 @llvm.expect.i1(i1 %not_err9, i1 true)
br i1 %9, label %after_check11, label %assign_optional10
assign_optional10: ; preds = %noerr_block7
store i64 %8, ptr %error_var8, align 8
br label %guard_block12
after_check11: ; preds = %noerr_block7
br label %noerr_block13
guard_block12: ; preds = %assign_optional10
br label %voiderr
noerr_block13: ; preds = %after_check11
%10 = load i64, ptr %len, align 8
%add = add i64 %10, 1
br label %voiderr
voiderr: ; preds = %noerr_block13, %guard_block12, %guard_block6, %guard_block
br label %switch.exit
switch.case14: ; preds = %switch.entry
%11 = call ptr @std.io.stdout()
%12 = call i64 @std.io.File.write(ptr %retparam18, ptr %11, ptr @.str.2, i64 4)
%not_err19 = icmp eq i64 %12, 0
%13 = call i1 @llvm.expect.i1(i1 %not_err19, i1 true)
br i1 %13, label %after_check21, label %assign_optional20
assign_optional20: ; preds = %switch.case14
store i64 %12, ptr %error_var16, align 8
br label %guard_block22
after_check21: ; preds = %switch.case14
br label %noerr_block23
guard_block22: ; preds = %assign_optional20
br label %voiderr37
noerr_block23: ; preds = %after_check21
%14 = load i64, ptr %retparam18, align 8
store i64 %14, ptr %len15, align 8
%15 = call i64 @std.io.File.write_byte(ptr %11, i8 zeroext 10)
%not_err25 = icmp eq i64 %15, 0
%16 = call i1 @llvm.expect.i1(i1 %not_err25, i1 true)
br i1 %16, label %after_check27, label %assign_optional26
assign_optional26: ; preds = %noerr_block23
store i64 %15, ptr %error_var24, align 8
br label %guard_block28
after_check27: ; preds = %noerr_block23
br label %noerr_block29
guard_block28: ; preds = %assign_optional26
br label %voiderr37
noerr_block29: ; preds = %after_check27
%17 = call i64 @std.io.File.flush(ptr %11)
%not_err31 = icmp eq i64 %17, 0
%18 = call i1 @llvm.expect.i1(i1 %not_err31, i1 true)
br i1 %18, label %after_check33, label %assign_optional32
assign_optional32: ; preds = %noerr_block29
store i64 %17, ptr %error_var30, align 8
br label %guard_block34
after_check33: ; preds = %noerr_block29
br label %noerr_block35
guard_block34: ; preds = %assign_optional32
br label %voiderr37
noerr_block35: ; preds = %after_check33
%19 = load i64, ptr %len15, align 8
%add36 = add i64 %19, 1
br label %voiderr37
voiderr37: ; preds = %noerr_block35, %guard_block34, %guard_block28, %guard_block22
br label %switch.exit
switch.exit: ; preds = %voiderr37, %voiderr, %switch.entry
store i32 %0, ptr %switch38, align 4
br label %switch.entry39
switch.entry39: ; preds = %switch.exit
%20 = load i32, ptr %switch38, align 4
switch i32 %20, label %switch.exit88 [
i32 0, label %switch.case40
i32 1, label %switch.case40
i32 2, label %switch.case64
]
switch.case40: ; preds = %switch.entry39, %switch.entry39
%21 = call ptr @std.io.stdout()
%22 = call i64 @std.io.File.write(ptr %retparam44, ptr %21, ptr @.str.3, i64 8)
%not_err45 = icmp eq i64 %22, 0
%23 = call i1 @llvm.expect.i1(i1 %not_err45, i1 true)
br i1 %23, label %after_check47, label %assign_optional46
assign_optional46: ; preds = %switch.case40
store i64 %22, ptr %error_var42, align 8
br label %guard_block48
after_check47: ; preds = %switch.case40
br label %noerr_block49
guard_block48: ; preds = %assign_optional46
br label %voiderr63
noerr_block49: ; preds = %after_check47
%24 = load i64, ptr %retparam44, align 8
store i64 %24, ptr %len41, align 8
%25 = call i64 @std.io.File.write_byte(ptr %21, i8 zeroext 10)
%not_err51 = icmp eq i64 %25, 0
%26 = call i1 @llvm.expect.i1(i1 %not_err51, i1 true)
br i1 %26, label %after_check53, label %assign_optional52
assign_optional52: ; preds = %noerr_block49
store i64 %25, ptr %error_var50, align 8
br label %guard_block54
after_check53: ; preds = %noerr_block49
br label %noerr_block55
guard_block54: ; preds = %assign_optional52
br label %voiderr63
noerr_block55: ; preds = %after_check53
%27 = call i64 @std.io.File.flush(ptr %21)
%not_err57 = icmp eq i64 %27, 0
%28 = call i1 @llvm.expect.i1(i1 %not_err57, i1 true)
br i1 %28, label %after_check59, label %assign_optional58
assign_optional58: ; preds = %noerr_block55
store i64 %27, ptr %error_var56, align 8
br label %guard_block60
after_check59: ; preds = %noerr_block55
br label %noerr_block61
guard_block60: ; preds = %assign_optional58
br label %voiderr63
noerr_block61: ; preds = %after_check59
%29 = load i64, ptr %len41, align 8
%add62 = add i64 %29, 1
br label %voiderr63
voiderr63: ; preds = %noerr_block61, %guard_block60, %guard_block54, %guard_block48
br label %switch.exit88
switch.case64: ; preds = %switch.entry39
%30 = call ptr @std.io.stdout()
%31 = call i64 @std.io.File.write(ptr %retparam68, ptr %30, ptr @.str.4, i64 4)
%not_err69 = icmp eq i64 %31, 0
%32 = call i1 @llvm.expect.i1(i1 %not_err69, i1 true)
br i1 %32, label %after_check71, label %assign_optional70
assign_optional70: ; preds = %switch.case64
store i64 %31, ptr %error_var66, align 8
br label %guard_block72
after_check71: ; preds = %switch.case64
br label %noerr_block73
guard_block72: ; preds = %assign_optional70
br label %voiderr87
noerr_block73: ; preds = %after_check71
%33 = load i64, ptr %retparam68, align 8
store i64 %33, ptr %len65, align 8
%34 = call i64 @std.io.File.write_byte(ptr %30, i8 zeroext 10)
%not_err75 = icmp eq i64 %34, 0
%35 = call i1 @llvm.expect.i1(i1 %not_err75, i1 true)
br i1 %35, label %after_check77, label %assign_optional76
assign_optional76: ; preds = %noerr_block73
store i64 %34, ptr %error_var74, align 8
br label %guard_block78
after_check77: ; preds = %noerr_block73
br label %noerr_block79
guard_block78: ; preds = %assign_optional76
br label %voiderr87
noerr_block79: ; preds = %after_check77
%36 = call i64 @std.io.File.flush(ptr %30)
%not_err81 = icmp eq i64 %36, 0
%37 = call i1 @llvm.expect.i1(i1 %not_err81, i1 true)
br i1 %37, label %after_check83, label %assign_optional82
assign_optional82: ; preds = %noerr_block79
store i64 %36, ptr %error_var80, align 8
br label %guard_block84
after_check83: ; preds = %noerr_block79
br label %noerr_block85
guard_block84: ; preds = %assign_optional82
br label %voiderr87
noerr_block85: ; preds = %after_check83
%38 = load i64, ptr %len65, align 8
%add86 = add i64 %38, 1
br label %voiderr87
voiderr87: ; preds = %noerr_block85, %guard_block84, %guard_block78, %guard_block72
br label %switch.exit88
switch.exit88: ; preds = %voiderr87, %voiderr63, %switch.entry39
store i32 %0, ptr %switch89, align 4
br label %switch.entry90
switch.entry90: ; preds = %switch.exit88
%39 = load i32, ptr %switch89, align 4
switch i32 %39, label %switch.exit117 [
i32 0, label %switch.case91
i32 1, label %switch.case92
i32 2, label %switch.case116
]
switch.case91: ; preds = %switch.entry90
br label %switch.exit117
switch.case92: ; preds = %switch.entry90
%40 = call ptr @std.io.stdout()
%41 = call i64 @std.io.File.write(ptr %retparam96, ptr %40, ptr @.str.5, i64 6)
%not_err97 = icmp eq i64 %41, 0
%42 = call i1 @llvm.expect.i1(i1 %not_err97, i1 true)
br i1 %42, label %after_check99, label %assign_optional98
assign_optional98: ; preds = %switch.case92
store i64 %41, ptr %error_var94, align 8
br label %guard_block100
after_check99: ; preds = %switch.case92
br label %noerr_block101
guard_block100: ; preds = %assign_optional98
br label %voiderr115
noerr_block101: ; preds = %after_check99
%43 = load i64, ptr %retparam96, align 8
store i64 %43, ptr %len93, align 8
%44 = call i64 @std.io.File.write_byte(ptr %40, i8 zeroext 10)
%not_err103 = icmp eq i64 %44, 0
%45 = call i1 @llvm.expect.i1(i1 %not_err103, i1 true)
br i1 %45, label %after_check105, label %assign_optional104
assign_optional104: ; preds = %noerr_block101
store i64 %44, ptr %error_var102, align 8
br label %guard_block106
after_check105: ; preds = %noerr_block101
br label %noerr_block107
guard_block106: ; preds = %assign_optional104
br label %voiderr115
noerr_block107: ; preds = %after_check105
%46 = call i64 @std.io.File.flush(ptr %40)
%not_err109 = icmp eq i64 %46, 0
%47 = call i1 @llvm.expect.i1(i1 %not_err109, i1 true)
br i1 %47, label %after_check111, label %assign_optional110
assign_optional110: ; preds = %noerr_block107
store i64 %46, ptr %error_var108, align 8
br label %guard_block112
after_check111: ; preds = %noerr_block107
br label %noerr_block113
guard_block112: ; preds = %assign_optional110
br label %voiderr115
noerr_block113: ; preds = %after_check111
%48 = load i64, ptr %len93, align 8
%add114 = add i64 %48, 1
br label %voiderr115
voiderr115: ; preds = %noerr_block113, %guard_block112, %guard_block106, %guard_block100
br label %switch.exit117
switch.case116: ; preds = %switch.entry90
br label %switch.exit117
switch.exit117: ; preds = %switch.case116, %voiderr115, %switch.case91, %switch.entry90
store i32 %0, ptr %switch118, align 4
br label %switch.entry119
switch.entry119: ; preds = %switch.exit117
%49 = load i32, ptr %switch118, align 4
switch i32 %49, label %switch.default [
i32 0, label %switch.case120
i32 1, label %switch.case120
i32 2, label %switch.case120
]
switch.case120: ; preds = %switch.entry119, %switch.entry119, %switch.entry119
br label %switch.exit121
switch.default: ; preds = %switch.entry119
br label %switch.exit121
switch.exit121: ; preds = %switch.default, %switch.case120
store i32 %0, ptr %switch122, align 4
br label %switch.entry123
switch.entry123: ; preds = %switch.exit121
%50 = load i32, ptr %switch122, align 4
switch i32 %50, label %switch.exit197 [
i32 0, label %switch.case124
i32 1, label %switch.case148
i32 2, label %switch.case173
]
switch.case124: ; preds = %switch.entry123
store i32 1, ptr %a, align 4
%51 = call ptr @std.io.stdout()
%52 = call i64 @std.io.File.write(ptr %retparam128, ptr %51, ptr @.str.6, i64 1)
%not_err129 = icmp eq i64 %52, 0
%53 = call i1 @llvm.expect.i1(i1 %not_err129, i1 true)
br i1 %53, label %after_check131, label %assign_optional130
assign_optional130: ; preds = %switch.case124
store i64 %52, ptr %error_var126, align 8
br label %guard_block132
after_check131: ; preds = %switch.case124
br label %noerr_block133
guard_block132: ; preds = %assign_optional130
br label %voiderr147
noerr_block133: ; preds = %after_check131
%54 = load i64, ptr %retparam128, align 8
store i64 %54, ptr %len125, align 8
%55 = call i64 @std.io.File.write_byte(ptr %51, i8 zeroext 10)
%not_err135 = icmp eq i64 %55, 0
%56 = call i1 @llvm.expect.i1(i1 %not_err135, i1 true)
br i1 %56, label %after_check137, label %assign_optional136
assign_optional136: ; preds = %noerr_block133
store i64 %55, ptr %error_var134, align 8
br label %guard_block138
after_check137: ; preds = %noerr_block133
br label %noerr_block139
guard_block138: ; preds = %assign_optional136
br label %voiderr147
noerr_block139: ; preds = %after_check137
%57 = call i64 @std.io.File.flush(ptr %51)
%not_err141 = icmp eq i64 %57, 0
%58 = call i1 @llvm.expect.i1(i1 %not_err141, i1 true)
br i1 %58, label %after_check143, label %assign_optional142
assign_optional142: ; preds = %noerr_block139
store i64 %57, ptr %error_var140, align 8
br label %guard_block144
after_check143: ; preds = %noerr_block139
br label %noerr_block145
guard_block144: ; preds = %assign_optional142
br label %voiderr147
noerr_block145: ; preds = %after_check143
%59 = load i64, ptr %len125, align 8
%add146 = add i64 %59, 1
br label %voiderr147
voiderr147: ; preds = %noerr_block145, %guard_block144, %guard_block138, %guard_block132
br label %switch.case148
switch.case148: ; preds = %switch.entry123, %voiderr147
store i32 2, ptr %a149, align 4
%60 = call ptr @std.io.stdout()
%61 = call i64 @std.io.File.write(ptr %retparam153, ptr %60, ptr @.str.7, i64 1)
%not_err154 = icmp eq i64 %61, 0
%62 = call i1 @llvm.expect.i1(i1 %not_err154, i1 true)
br i1 %62, label %after_check156, label %assign_optional155
assign_optional155: ; preds = %switch.case148
store i64 %61, ptr %error_var151, align 8
br label %guard_block157
after_check156: ; preds = %switch.case148
br label %noerr_block158
guard_block157: ; preds = %assign_optional155
br label %voiderr172
noerr_block158: ; preds = %after_check156
%63 = load i64, ptr %retparam153, align 8
store i64 %63, ptr %len150, align 8
%64 = call i64 @std.io.File.write_byte(ptr %60, i8 zeroext 10)
%not_err160 = icmp eq i64 %64, 0
%65 = call i1 @llvm.expect.i1(i1 %not_err160, i1 true)
br i1 %65, label %after_check162, label %assign_optional161
assign_optional161: ; preds = %noerr_block158
store i64 %64, ptr %error_var159, align 8
br label %guard_block163
after_check162: ; preds = %noerr_block158
br label %noerr_block164
guard_block163: ; preds = %assign_optional161
br label %voiderr172
noerr_block164: ; preds = %after_check162
%66 = call i64 @std.io.File.flush(ptr %60)
%not_err166 = icmp eq i64 %66, 0
%67 = call i1 @llvm.expect.i1(i1 %not_err166, i1 true)
br i1 %67, label %after_check168, label %assign_optional167
assign_optional167: ; preds = %noerr_block164
store i64 %66, ptr %error_var165, align 8
br label %guard_block169
after_check168: ; preds = %noerr_block164
br label %noerr_block170
guard_block169: ; preds = %assign_optional167
br label %voiderr172
noerr_block170: ; preds = %after_check168
%68 = load i64, ptr %len150, align 8
%add171 = add i64 %68, 1
br label %voiderr172
voiderr172: ; preds = %noerr_block170, %guard_block169, %guard_block163, %guard_block157
br label %switch.case173
switch.case173: ; preds = %switch.entry123, %voiderr172
%69 = call ptr @std.io.stdout()
%70 = call i64 @std.io.File.write(ptr %retparam177, ptr %69, ptr @.str.8, i64 1)
%not_err178 = icmp eq i64 %70, 0
%71 = call i1 @llvm.expect.i1(i1 %not_err178, i1 true)
br i1 %71, label %after_check180, label %assign_optional179
assign_optional179: ; preds = %switch.case173
store i64 %70, ptr %error_var175, align 8
br label %guard_block181
after_check180: ; preds = %switch.case173
br label %noerr_block182
guard_block181: ; preds = %assign_optional179
br label %voiderr196
noerr_block182: ; preds = %after_check180
%72 = load i64, ptr %retparam177, align 8
store i64 %72, ptr %len174, align 8
%73 = call i64 @std.io.File.write_byte(ptr %69, i8 zeroext 10)
%not_err184 = icmp eq i64 %73, 0
%74 = call i1 @llvm.expect.i1(i1 %not_err184, i1 true)
br i1 %74, label %after_check186, label %assign_optional185
assign_optional185: ; preds = %noerr_block182
store i64 %73, ptr %error_var183, align 8
br label %guard_block187
after_check186: ; preds = %noerr_block182
br label %noerr_block188
guard_block187: ; preds = %assign_optional185
br label %voiderr196
noerr_block188: ; preds = %after_check186
%75 = call i64 @std.io.File.flush(ptr %69)
%not_err190 = icmp eq i64 %75, 0
%76 = call i1 @llvm.expect.i1(i1 %not_err190, i1 true)
br i1 %76, label %after_check192, label %assign_optional191
assign_optional191: ; preds = %noerr_block188
store i64 %75, ptr %error_var189, align 8
br label %guard_block193
after_check192: ; preds = %noerr_block188
br label %noerr_block194
guard_block193: ; preds = %assign_optional191
br label %voiderr196
noerr_block194: ; preds = %after_check192
%77 = load i64, ptr %len174, align 8
%add195 = add i64 %77, 1
br label %voiderr196
voiderr196: ; preds = %noerr_block194, %guard_block193, %guard_block187, %guard_block181
br label %switch.exit197
switch.exit197: ; preds = %voiderr196, %switch.entry123
ret void
}