Files
c3c/test/test_suite/from_docs/examples_forswitch.c3t

245 lines
7.4 KiB
Plaintext

// #target: x64-darwin
module examples;
import std::io;
func void example_for()
{
// the for-loop is the same as C99.
for (int i = 0; i < 10; i++)
{
io::printf("%d\n", i);
}
// also equal
for (;;)
{
// ..
}
}
enum Height : uint
{
LOW = 0,
MEDIUM,
HIGH,
}
func void demo_enum(Height h)
{
switch (h)
{
case LOW:
case MEDIUM:
io::println("Not high");
// Implicit break.
case HIGH:
io::println("High");
}
// This also works
switch (h)
{
case LOW:
case MEDIUM:
io::println("Not high");
// Implicit break.
case Height.HIGH:
io::println("High");
}
// Completely empty cases are not allowed.
switch (h)
{
case LOW:
break; // Explicit break required, since switches can't be empty.
case MEDIUM:
io::println("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::println("A");
nextcase;
case MEDIUM:
int a = 2;
io::println("B");
nextcase;
case HIGH:
// a is not defined here
io::println("C");
}
}
// #expect: examples.ll
define void @examples.example_for() #0 {
entry:
%i = alloca i32, align 4
store i32 0, i32* %i, align 4
br label %for.cond
for.cond: ; preds = %for.inc, %entry
%0 = load i32, i32* %i, align 4
%lt = icmp slt i32 %0, 10
br i1 %lt, label %for.body, label %for.exit
for.body: ; preds = %for.cond
%1 = load i32, i32* %i, align 4
%2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %1)
br label %for.inc
for.inc: ; preds = %for.body
%3 = load i32, i32* %i, align 4
%add = add i32 %3, 1
store i32 %add, i32* %i, align 4
br label %for.cond
for.exit: ; preds = %for.cond
br label %infiniteloop
infiniteloop: ; preds = %infiniteloop, %for.exit
br label %infiniteloop
}
; Function Attrs: nounwind
define void @examples.demo_enum(i32 %0) #0 {
entry:
%h = alloca i32, align 4
%switch = alloca i32, align 4
%switch2 = alloca i32, align 4
%switch7 = alloca i32, align 4
%switch13 = alloca i32, align 4
%switch17 = alloca i32, align 4
%a = alloca i32, align 4
%a21 = alloca i32, align 4
store i32 %0, i32* %h, align 4
%1 = load i32, i32* %h, align 4
store i32 %1, i32* %switch, align 4
br label %switch.entry
switch.entry: ; preds = %entry
%2 = load i32, i32* %switch, align 4
switch i32 %2, label %switch.exit [
i32 0, label %switch.case
i32 1, label %switch.case
i32 2, label %switch.case1
]
switch.case: ; preds = %switch.entry, %switch.entry
%3 = call i32 @"std::io.println"(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.1, i32 0, i32 0)) #1
br label %switch.exit
switch.case1: ; preds = %switch.entry
%4 = call i32 @"std::io.println"(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i32 0, i32 0)) #1
br label %switch.exit
switch.exit: ; preds = %switch.case1, %switch.case, %switch.entry
%5 = load i32, i32* %h, align 4
store i32 %5, i32* %switch2, align 4
br label %switch.entry3
switch.entry3: ; preds = %switch.exit
%6 = load i32, i32* %switch2, align 4
switch i32 %6, label %switch.exit6 [
i32 0, label %switch.case4
i32 1, label %switch.case4
i32 2, label %switch.case5
]
switch.case4: ; preds = %switch.entry3, %switch.entry3
%7 = call i32 @"std::io.println"(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.3, i32 0, i32 0)) #1
br label %switch.exit6
switch.case5: ; preds = %switch.entry3
%8 = call i32 @"std::io.println"(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.4, i32 0, i32 0)) #1
br label %switch.exit6
switch.exit6: ; preds = %switch.case5, %switch.case4, %switch.entry3
%9 = load i32, i32* %h, align 4
store i32 %9, i32* %switch7, align 4
br label %switch.entry8
switch.entry8: ; preds = %switch.exit6
%10 = load i32, i32* %switch7, align 4
switch i32 %10, label %switch.exit12 [
i32 0, label %switch.case9
i32 1, label %switch.case10
i32 2, label %switch.case11
]
switch.case9: ; preds = %switch.entry8
br label %switch.exit12
switch.case10: ; preds = %switch.entry8
%11 = call i32 @"std::io.println"(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.5, i32 0, i32 0)) #1
br label %switch.exit12
switch.case11: ; preds = %switch.entry8
br label %switch.exit12
switch.exit12: ; preds = %switch.case11, %switch.case10, %switch.case9, %switch.entry8
%12 = load i32, i32* %h, align 4
store i32 %12, i32* %switch13, align 4
br label %switch.entry14
switch.entry14: ; preds = %switch.exit12
%13 = load i32, i32* %switch13, align 4
switch i32 %13, label %switch.default [
i32 0, label %switch.case15
i32 1, label %switch.case15
i32 2, label %switch.case15
]
switch.case15: ; preds = %switch.entry14, %switch.entry14, %switch.entry14
br label %switch.exit16
switch.default: ; preds = %switch.entry14
br label %switch.exit16
switch.exit16: ; preds = %switch.default, %switch.case15
%14 = load i32, i32* %h, align 4
store i32 %14, i32* %switch17, align 4
br label %switch.entry18
switch.entry18: ; preds = %switch.exit16
%15 = load i32, i32* %switch17, align 4
switch i32 %15, label %switch.exit23 [
i32 0, label %switch.case19
i32 1, label %switch.case20
i32 2, label %switch.case22
]
switch.case19: ; preds = %switch.entry18
store i32 1, i32* %a, align 4
%16 = call i32 @"std::io.println"(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.6, i32 0, i32 0)) #1
br label %switch.case20
switch.case20: ; preds = %switch.entry18, %switch.case19
store i32 2, i32* %a21, align 4
%17 = call i32 @"std::io.println"(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i32 0, i32 0)) #1
br label %switch.case22
switch.case22: ; preds = %switch.entry18, %switch.case20
%18 = call i32 @"std::io.println"(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.8, i32 0, i32 0)) #1
br label %switch.exit23
switch.exit23: ; preds = %switch.case22, %switch.entry18
ret void
}