Files
c3c/test/test_suite/statements/switch_const_non_int.c3t
Christoffer Lerno 85dc9c45ab - Deprecate @compact use for comparison. Old behaviour is enabled using --use-old-compact-eq.
- Switch available for types implementing `@operator(==)`.
- `Type.is_eq` is now true for types with `==` overload.
- Functions being tested for overload are now always checked before test.
- Compile time indexing at compile time in a $typeof was no considered compile time.
2025-08-14 15:53:35 +02:00

82 lines
2.4 KiB
Plaintext

// #target: macos-x64
module test;
import std;
struct Foo
{
int value;
}
fn bool Foo.eq(&self, Foo other) @operator(==) => self.value == other.value;
const Foo FOO1 = { 15 };
const Foo FOO2 = { 20 };
fn void main()
{
Foo f = FOO1;
switch (f)
{
case FOO1:
String s = "Matched FOO1";
case FOO2:
String s = "Matched FOO2";
default:
String s = "No match found";
}
}
/* #expect: test.ll
define void @test.main() #0 {
entry:
%f = alloca %Foo, align 4
%switch = alloca %Foo, align 4
%literal = alloca %Foo, align 4
%taddr = alloca %Foo, align 4
%taddr1 = alloca %Foo, align 4
%s = alloca %"char[]", align 8
%literal2 = alloca %Foo, align 4
%taddr3 = alloca %Foo, align 4
%s7 = alloca %"char[]", align 8
%s9 = alloca %"char[]", align 8
call void @llvm.memcpy.p0.p0.i32(ptr align 4 %f, ptr align 4 @test.FOO1, i32 4, i1 false)
call void @llvm.memcpy.p0.p0.i32(ptr align 4 %switch, ptr align 4 %f, i32 4, i1 false)
br label %switch.entry
switch.entry: ; preds = %entry
%0 = load %Foo, ptr %switch, align 4
call void @llvm.memcpy.p0.p0.i32(ptr align 4 %literal, ptr align 4 @.__const, i32 4, i1 false)
%1 = load %Foo, ptr %literal, align 4
store %Foo %1, ptr %taddr, align 4
store %Foo %0, ptr %taddr1, align 4
%cmp = call i32 @memcmp(ptr %taddr, ptr %taddr1, i64 4)
%eq = icmp eq i32 %cmp, 0
br i1 %eq, label %switch.case, label %next_if
switch.case: ; preds = %switch.entry
store %"char[]" { ptr @.str, i64 12 }, ptr %s, align 8
br label %switch.exit
next_if: ; preds = %switch.entry
call void @llvm.memcpy.p0.p0.i32(ptr align 4 %literal2, ptr align 4 @.__const.2, i32 4, i1 false)
%2 = load %Foo, ptr %literal2, align 4
store %Foo %2, ptr %taddr3, align 4
%cmp4 = call i32 @memcmp(ptr %taddr3, ptr %taddr1, i64 4)
%eq5 = icmp eq i32 %cmp4, 0
br i1 %eq5, label %switch.case6, label %next_if8
switch.case6: ; preds = %next_if
store %"char[]" { ptr @.str.3, i64 12 }, ptr %s7, align 8
br label %switch.exit
next_if8: ; preds = %next_if
br label %switch.default
switch.default: ; preds = %next_if8
store %"char[]" { ptr @.str.4, i64 14 }, ptr %s9, align 8
br label %switch.exit
switch.exit: ; preds = %switch.default, %switch.case6, %switch.case
ret void
}