From a965882a340d1936e22cdda646c153ac54bf1e13 Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Fri, 5 Apr 2019 15:17:04 +0200 Subject: [PATCH] compiler: support i16 uintptr in cap builtin --- compiler/compiler.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/compiler/compiler.go b/compiler/compiler.go index b9c27a4f..5cb209b7 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -1095,16 +1095,21 @@ func (c *Compiler) parseBuiltin(frame *Frame, args []ssa.Value, callName string, if err != nil { return llvm.Value{}, err } + var llvmCap llvm.Value switch args[0].Type().(type) { case *types.Chan: // Channel. Buffered channels haven't been implemented yet so always // return 0. - return llvm.ConstInt(c.intType, 0, false), nil + llvmCap = llvm.ConstInt(c.intType, 0, false) case *types.Slice: - return c.builder.CreateExtractValue(value, 2, "cap"), nil + llvmCap = c.builder.CreateExtractValue(value, 2, "cap") default: return llvm.Value{}, c.makeError(pos, "todo: cap: unknown type") } + if c.targetData.TypeAllocSize(llvmCap.Type()) < c.targetData.TypeAllocSize(c.intType) { + llvmCap = c.builder.CreateZExt(llvmCap, c.intType, "len.int") + } + return llvmCap, nil case "close": return llvm.Value{}, c.emitChanClose(frame, args[0]) case "complex":