diff --git a/compiler/test-data/data/for-string-array/main.fspl b/compiler/test-data/data/for-string-array/main.fspl index 9b4bd84..28a63eb 100644 --- a/compiler/test-data/data/for-string-array/main.fspl +++ b/compiler/test-data/data/for-string-array/main.fspl @@ -4,7 +4,7 @@ for e:String in arr io::[println e] ; slice - ;slice:*:String = arr - ;for e:String in slice io::[println e] + slice:*:String = arr + for e:String in slice io::[println e] 0 } diff --git a/compiler/test-data/data/for-string-array/main.ll b/compiler/test-data/data/for-string-array/main.ll deleted file mode 100644 index 79e9514..0000000 --- a/compiler/test-data/data/for-string-array/main.ll +++ /dev/null @@ -1,66 +0,0 @@ -%"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/assignment.go b/generator/assignment.go index 0e8a776..db8236a 100644 --- a/generator/assignment.go +++ b/generator/assignment.go @@ -165,7 +165,12 @@ func (this *generator) generateAssignmentToDestination ( // TODO: add -Val suffi source, err := this.generateExpressionVal(source) if err != nil { return nil, err } this.blockManager.NewStore(source, destDataFieldLoc) - return this.blockManager.NewLoad(irDestType, irDestLoc), nil + + if destinationSpecified { + return nil, nil + } else { + return this.blockManager.NewLoad(irDestType, irDestLoc), nil + } // conversion from any type to pointer case *entity.TypePointer: @@ -192,6 +197,8 @@ func (this *generator) generateAssignmentToDestination ( // TODO: add -Val suffi switch sourceTypeBase := analyzer.ReduceToBase(source.Type()).(type) { // conversion from array to slice case *entity.TypeArray: + irIndexType, err := this.generateTypeIndex() + if err != nil { return nil, err } array, err := this.generateExpressionLoc(source) if err != nil { return nil, err } irDestType, err := this.generateType(destType) @@ -204,10 +211,12 @@ func (this *generator) generateAssignmentToDestination ( // TODO: add -Val suffi destLengthField := this.getSliceLengthFieldLoc(irDestLoc, irDestType) this.blockManager.NewStore(array, destDataField) this.blockManager.NewStore ( - llvm.NewConstInt(llvm.I32, int64(sourceTypeBase.Length)), + llvm.NewConstInt(irIndexType, int64(sourceTypeBase.Length)), destLengthField) - - if !destinationSpecified { + + if destinationSpecified { + return nil, nil + } else { return this.blockManager.NewLoad(irDestType, irDestLoc), nil } } diff --git a/generator/expression.go b/generator/expression.go index be57cfa..304e067 100644 --- a/generator/expression.go +++ b/generator/expression.go @@ -284,9 +284,7 @@ func (this *generator) generateFor (loop *entity.For, mode resultMode) (llvm.Val if isArray { irDataLoc = irOverLoc } else { - irDataLoc = this.blockManager.NewLoad ( - llvm.Pointer, - this.getSliceDataFieldLoc(irOverLoc, irOverType)) + irDataLoc = this.getSliceDataAddress(irOverLoc, irOverType) } irElementLocInData := this.blockManager.NewGetElementPtr ( irElementType, irDataLoc,