Fix conversion of slices to pointers
This commit is contained in:
parent
2ce910c54a
commit
8a6d4599d1
|
@ -170,11 +170,17 @@ func (this *generator) generateValueCast (cast *entity.ValueCast) (llvm.Value, e
|
|||
|
||||
switch fromType := fromType.(type) {
|
||||
case *entity.TypeInt, *entity.TypeWord:
|
||||
// cast from integer to integer:
|
||||
// basic truncated value assignment
|
||||
return this.blockManager.NewTrunc(from, to), nil
|
||||
case *entity.TypeFloat:
|
||||
if analyzer.IsUnsigned(fromType) {
|
||||
// cast from float to unsigned integer:
|
||||
// convert float to unsigned integer
|
||||
return this.blockManager.NewFPToUI(from, to), nil
|
||||
} else {
|
||||
// cast from float to signed integer:
|
||||
// convert float to signed integer
|
||||
return this.blockManager.NewFPToSI(from, to), nil
|
||||
}
|
||||
default: return fail()
|
||||
|
@ -186,11 +192,17 @@ func (this *generator) generateValueCast (cast *entity.ValueCast) (llvm.Value, e
|
|||
|
||||
switch fromType := fromType.(type) {
|
||||
case *entity.TypeFloat:
|
||||
// cast from float to float:
|
||||
// basic truncated value assignment
|
||||
return this.blockManager.NewFPTrunc(from, to), nil
|
||||
case *entity.TypeInt, *entity.TypeWord:
|
||||
if analyzer.IsUnsigned(fromType) {
|
||||
// cast from unsigned integer to float:
|
||||
// convert unsigned integer to float
|
||||
return this.blockManager.NewUIToFP(from, to), nil
|
||||
} else {
|
||||
// cast from signed integer to float:
|
||||
// convert signed integer to float
|
||||
return this.blockManager.NewSIToFP(from, to), nil
|
||||
}
|
||||
default: return fail()
|
||||
|
@ -199,14 +211,21 @@ func (this *generator) generateValueCast (cast *entity.ValueCast) (llvm.Value, e
|
|||
case *entity.TypePointer:
|
||||
switch fromType := fromType.(type) {
|
||||
case *entity.TypeSlice:
|
||||
// cast from slice to pointer:
|
||||
// pointer will point to the first element of the slice
|
||||
from, _, err := generateFromLoc()
|
||||
if err != nil { return nil, err }
|
||||
irFromType, err := this.generateType(fromType)
|
||||
return this.blockManager.NewGetElementPtr (
|
||||
dataAddressFieldAddress := this.blockManager.NewGetElementPtr (
|
||||
irFromType, from,
|
||||
llvm.NewConstInt(llvm.I32, 0),
|
||||
llvm.NewConstInt(llvm.I32, 0)), nil
|
||||
llvm.NewConstInt(llvm.I32, 0))
|
||||
return this.blockManager.NewLoad (
|
||||
new(llvm.TypePointer),
|
||||
dataAddressFieldAddress), nil
|
||||
case *entity.TypePointer:
|
||||
// cast from pointer to pointer:
|
||||
// basic forceful value assignment
|
||||
from, to, err := generateFrom()
|
||||
if err != nil { return nil, err }
|
||||
return this.blockManager.NewBitCast(from, to), nil
|
||||
|
@ -216,6 +235,8 @@ func (this *generator) generateValueCast (cast *entity.ValueCast) (llvm.Value, e
|
|||
case *entity.TypeSlice,
|
||||
*entity.TypeArray,
|
||||
*entity.TypeStruct:
|
||||
// cast from composite type to composite type:
|
||||
// basic forceful value assignment
|
||||
from, to, err := generateFrom()
|
||||
if err != nil { return nil, err }
|
||||
return this.blockManager.NewBitCast(from, to), nil
|
||||
|
|
Loading…
Reference in New Issue