compiler: fix assertion on empty interface

This fixes issue #453.
This commit is contained in:
Ayke van Laethem
2019-12-26 01:32:58 +01:00
committed by Ron Evans
parent 3656ac2fc9
commit 14474e7099
2 changed files with 9 additions and 3 deletions
+3 -3
View File
@@ -279,14 +279,14 @@ func (c *Compiler) getInterfaceMethodSet(typ *types.Named) llvm.Value {
return llvm.ConstGEP(global, []llvm.Value{zero, zero})
}
// Every method is a *i16 reference indicating the signature of this method.
// Every method is a *i8 reference indicating the signature of this method.
methods := make([]llvm.Value, typ.Underlying().(*types.Interface).NumMethods())
for i := range methods {
method := typ.Underlying().(*types.Interface).Method(i)
methods[i] = c.getMethodSignature(method)
}
value := llvm.ConstArray(methods[0].Type(), methods)
value := llvm.ConstArray(c.i8ptrType, methods)
global = llvm.AddGlobal(c.mod, value.Type(), typ.String()+"$interface")
global.SetInitializer(value)
global.SetGlobalConstant(true)
@@ -295,7 +295,7 @@ func (c *Compiler) getInterfaceMethodSet(typ *types.Named) llvm.Value {
}
// getMethodSignature returns a global variable which is a reference to an
// external *i16 indicating the indicating the signature of this method. It is
// external *i8 indicating the indicating the signature of this method. It is
// used during the interface lowering pass.
func (c *Compiler) getMethodSignature(method *types.Func) llvm.Value {
signature := ir.MethodSignature(method)
+6
View File
@@ -33,6 +33,10 @@ func main() {
// https://github.com/tinygo-org/tinygo/issues/309
itf = linkedList{}
// Test bugfix for assertion on named empty interface:
// https://github.com/tinygo-org/tinygo/issues/453
_, _ = itf.(Empty)
var n int
var f float32
var interfaceEqualTests = []struct {
@@ -251,3 +255,5 @@ func (s SleepBlocker) Sleep() {
type StaticBlocker interface {
Sleep()
}
type Empty interface{}