diff --git a/compiler/test-data/data/for-string-array/main.fspl b/compiler/test-data/data/for-string-array/main.fspl index 4331023..9b4bd84 100644 --- a/compiler/test-data/data/for-string-array/main.fspl +++ b/compiler/test-data/data/for-string-array/main.fspl @@ -1,10 +1,10 @@ [main]:I32 'main' = { ; array - arr:5:String = (* 'a' 'b' 'c') + arr:3:String = (* 'a' 'b' 'c') for e:String in arr io::[println e] ; slice ;slice:*:String = arr ;for e:String in slice io::[println e] - ;0 + 0 } diff --git a/compiler/test-data/data/for-string-array/main.ll b/compiler/test-data/data/for-string-array/main.ll new file mode 100644 index 0000000..79e9514 --- /dev/null +++ b/compiler/test-data/data/for-string-array/main.ll @@ -0,0 +1,66 @@ +%"AAAAAAAAAAAAAAAAAAAAAA==::Index" = type i64 +%"AAAAAAAAAAAAAAAAAAAAAA==::String" = type { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" } +%"+VqqFGEsRc2zrv0kBJzIGw==::FileDescriptor" = type i64 +declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"Qxtg3cmQQIauMKrWJGsgfQ==::print"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %string) +declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"Qxtg3cmQQIauMKrWJGsgfQ==::println"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %string) +define i32 @main() { +0: + %1 = alloca [3 x %"AAAAAAAAAAAAAAAAAAAAAA==::String"] + %2 = getelementptr [3 x %"AAAAAAAAAAAAAAAAAAAAAA==::String"], ptr %1, i32 0, i32 0 + %3 = alloca [1 x i8] + %4 = getelementptr [1 x i8], ptr %3, i32 0, i32 0 + store i8 97, ptr %4 + %5 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %2, i32 0, i32 0 + store ptr %3, ptr %5 + %6 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %2, i32 0, i32 1 + store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" 1, ptr %6 + %7 = getelementptr [3 x %"AAAAAAAAAAAAAAAAAAAAAA==::String"], ptr %1, i32 0, i32 1 + %8 = alloca [1 x i8] + %9 = getelementptr [1 x i8], ptr %8, i32 0, i32 0 + store i8 98, ptr %9 + %10 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %7, i32 0, i32 0 + store ptr %8, ptr %10 + %11 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %7, i32 0, i32 1 + store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" 1, ptr %11 + %12 = getelementptr [3 x %"AAAAAAAAAAAAAAAAAAAAAA==::String"], ptr %1, i32 0, i32 2 + %13 = alloca [1 x i8] + %14 = getelementptr [1 x i8], ptr %13, i32 0, i32 0 + store i8 99, ptr %14 + %15 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %12, i32 0, i32 0 + store ptr %13, ptr %15 + %16 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %12, i32 0, i32 1 + store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" 1, ptr %16 + %17 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::Index" + store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" zeroinitializer, ptr %17 + %18 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::String" + %19 = alloca %"AAAAAAAAAAAAAAAAAAAAAA==::String" + %20 = alloca [1 x i8] + br label %21 +21: + %22 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %17 + %23 = icmp ult %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %22, 3 + br i1 %23, label %24, label %35 +24: + %25 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %17 + %26 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %1, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %25 + %27 = load %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %26 + store %"AAAAAAAAAAAAAAAAAAAAAA==::String" %27, ptr %18 + %28 = getelementptr [1 x i8], ptr %20, i32 0, i32 0 + store i8 105, ptr %28 + %29 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %19, i32 0, i32 0 + store ptr %20, ptr %29 + %30 = getelementptr %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %19, i32 0, i32 1 + store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" 1, ptr %30 + %31 = load %"AAAAAAAAAAAAAAAAAAAAAA==::String", ptr %19 + %32 = call %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"Qxtg3cmQQIauMKrWJGsgfQ==::println"(%"AAAAAAAAAAAAAAAAAAAAAA==::String" %31) + %33 = load %"AAAAAAAAAAAAAAAAAAAAAA==::Index", ptr %17 + %34 = add %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %33, 1 + store %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %34, ptr %17 + br label %24 +35: + ret i32 0 +} +declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @puts(ptr %string) +declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @read(%"+VqqFGEsRc2zrv0kBJzIGw==::FileDescriptor" %file, ptr %buffer, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %count) +declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @write(%"+VqqFGEsRc2zrv0kBJzIGw==::FileDescriptor" %file, ptr %buffer, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" %count) +declare %"AAAAAAAAAAAAAAAAAAAAAA==::Index" @"Qxtg3cmQQIauMKrWJGsgfQ==::File.write"(ptr %this, { ptr, %"AAAAAAAAAAAAAAAAAAAAAA==::Index" } %buffer) diff --git a/generator/expression.go b/generator/expression.go index fcb5919..be57cfa 100644 --- a/generator/expression.go +++ b/generator/expression.go @@ -322,7 +322,7 @@ func (this *generator) generateFor (loop *entity.For, mode resultMode) (llvm.Val // loop back around if !final.Terminated () { - final.NewBr(body) + final.NewBr(header) } return irValue, loopEntry.loc, nil }