Better error checking on interface conversion
Этот коммит содержится в:
родитель
12eb9eec3c
коммит
fc2eee4ee8
1 изменённых файлов: 12 добавлений и 2 удалений
14
tgo.go
14
tgo.go
|
@ -651,10 +651,20 @@ func (c *Compiler) parseExpr(frame *Frame, expr ssa.Value) (llvm.Value, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return llvm.Value{}, err
|
return llvm.Value{}, err
|
||||||
}
|
}
|
||||||
bitcast := c.builder.CreateIntToPtr(val, llvm.PointerType(llvm.Int8Type(), 0), "")
|
var itfValue llvm.Value
|
||||||
|
switch typ := expr.X.Type().(type) {
|
||||||
|
case *types.Basic:
|
||||||
|
if typ.Info() & types.IsInteger != 0 {
|
||||||
|
itfValue = c.builder.CreateIntToPtr(val, llvm.PointerType(llvm.Int8Type(), 0), "")
|
||||||
|
} else {
|
||||||
|
return llvm.Value{}, errors.New("todo: make interface: unknown basic type")
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return llvm.Value{}, errors.New("todo: make interface: unknown type")
|
||||||
|
}
|
||||||
itfType := c.getInterfaceType(expr.X.Type())
|
itfType := c.getInterfaceType(expr.X.Type())
|
||||||
itf := c.ctx.ConstStruct([]llvm.Value{itfType, llvm.Undef(llvm.PointerType(llvm.Int8Type(), 0))}, false)
|
itf := c.ctx.ConstStruct([]llvm.Value{itfType, llvm.Undef(llvm.PointerType(llvm.Int8Type(), 0))}, false)
|
||||||
itf = c.builder.CreateInsertValue(itf, bitcast, 1, "")
|
itf = c.builder.CreateInsertValue(itf, itfValue, 1, "")
|
||||||
return itf, nil
|
return itf, nil
|
||||||
case *ssa.Phi:
|
case *ssa.Phi:
|
||||||
t, err := c.getLLVMType(expr.Type())
|
t, err := c.getLLVMType(expr.Type())
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче