Files
c3c/test/test_suite/statements/foreach_distinct_iterable.c3t
2024-10-01 13:00:54 +02:00

67 lines
1.7 KiB
Plaintext

// #target: macos-x64
module test;
import std;
distinct TypeA = char[];
fn char TypeA.get(self, usz i) @operator([]) {
return ((char[])self)[i];
}
fn usz TypeA.len(self) @operator(len)
{
return self.len;
}
fn int main() {
TypeA x = "AAAAA";
foreach(y : x)
{
int z = y;
}
return 0;
}
/* #expect: test.ll
et i64 %2
}
define i32 @main() #0 {
entry:
%x = alloca %"char[]", align 8
%.anon = alloca i64, align 8
%.anon1 = alloca i64, align 8
%y = alloca i8, align 1
%z = alloca i32, align 4
store %"char[]" { ptr @.str, i64 5 }, ptr %x, align 8
%lo = load ptr, ptr %x, align 8
%ptradd = getelementptr inbounds i8, ptr %x, i64 8
%hi = load i64, ptr %ptradd, align 8
%0 = call i64 @test.TypeA.len(ptr %lo, i64 %hi)
store i64 %0, ptr %.anon, align 8
store i64 0, ptr %.anon1, align 8
br label %loop.cond
loop.cond: ; preds = %loop.body, %entry
%1 = load i64, ptr %.anon1, align 8
%2 = load i64, ptr %.anon, align 8
%lt = icmp ult i64 %1, %2
br i1 %lt, label %loop.body, label %loop.exit
loop.body: ; preds = %loop.cond
%lo2 = load ptr, ptr %x, align 8
%ptradd3 = getelementptr inbounds i8, ptr %x, i64 8
%hi4 = load i64, ptr %ptradd3, align 8
%3 = load i64, ptr %.anon1, align 8
%4 = call i8 @test.TypeA.get(ptr %lo2, i64 %hi4, i64 %3)
store i8 %4, ptr %y, align 1
%5 = load i8, ptr %y, align 1
%zext = zext i8 %5 to i32
store i32 %zext, ptr %z, align 4
%6 = load i64, ptr %.anon1, align 8
%addnuw = add nuw i64 %6, 1
store i64 %addnuw, ptr %.anon1, align 8
br label %loop.cond
loop.exit: ; preds = %loop.cond
ret i32 0