// #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
}
