Fix assignment from array to slice
This commit is contained in:
parent
185ef7f6f9
commit
70c58f74de
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue