From fc2eee4ee8ea2108cb6c0b20dfd2771c31a0ad34 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Fri, 20 Apr 2018 17:22:20 +0200 Subject: [PATCH] Better error checking on interface conversion --- tgo.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tgo.go b/tgo.go index 0e28ce4f..5bb416ce 100644 --- a/tgo.go +++ b/tgo.go @@ -651,10 +651,20 @@ func (c *Compiler) parseExpr(frame *Frame, expr ssa.Value) (llvm.Value, error) { if err != nil { 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()) 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 case *ssa.Phi: t, err := c.getLLVMType(expr.Type())