mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
- 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.
82 lines
2.4 KiB
Plaintext
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
|
|
}
|