ir: do not throw an error on unknown conversions
Этот коммит содержится в:
родитель
4e4f91bea7
коммит
1b283c11c1
3 изменённых файлов: 32 добавлений и 5 удалений
|
@ -206,7 +206,7 @@ func (p *Program) interpret(instrs []ssa.Instruction, paramKeys []*ssa.Parameter
|
|||
switch typeTo := instr.Type().Underlying().(type) {
|
||||
case *types.Basic:
|
||||
if typeTo.Kind() == types.String {
|
||||
return i, errors.New("todo: init: cannot convert string")
|
||||
return i, nil
|
||||
}
|
||||
|
||||
if _, ok := typeFrom.(*types.Pointer); ok && typeTo.Kind() == types.UnsafePointer {
|
||||
|
@ -217,10 +217,10 @@ func (p *Program) interpret(instrs []ssa.Instruction, paramKeys []*ssa.Parameter
|
|||
} else if typeFrom.Info()&types.IsInteger != 0 && typeTo.Info()&types.IsInteger != 0 {
|
||||
locals[instr] = &ConstValue{Expr: ssa.NewConst(x.(*ConstValue).Expr.Value, typeTo)}
|
||||
} else {
|
||||
return i, errors.New("todo: init: unknown basic-to-basic convert: " + instr.String())
|
||||
return i, nil
|
||||
}
|
||||
} else {
|
||||
return i, errors.New("todo: init: unknown basic convert: " + instr.String())
|
||||
return i, nil
|
||||
}
|
||||
case *types.Pointer:
|
||||
if typeFrom, ok := typeFrom.(*types.Basic); ok && typeFrom.Kind() == types.UnsafePointer {
|
||||
|
@ -229,7 +229,7 @@ func (p *Program) interpret(instrs []ssa.Instruction, paramKeys []*ssa.Parameter
|
|||
panic("expected unsafe pointer conversion")
|
||||
}
|
||||
default:
|
||||
return i, errors.New("todo: init: unknown convert: " + instr.String())
|
||||
return i, nil
|
||||
}
|
||||
case *ssa.DebugRef:
|
||||
// ignore
|
||||
|
@ -384,7 +384,6 @@ func canInterpret(callee *ssa.Function) bool {
|
|||
// above.
|
||||
case *ssa.Alloc:
|
||||
case *ssa.ChangeType:
|
||||
case *ssa.Convert:
|
||||
case *ssa.DebugRef:
|
||||
case *ssa.Extract:
|
||||
case *ssa.FieldAddr:
|
||||
|
|
22
testdata/init.go
предоставленный
22
testdata/init.go
предоставленный
|
@ -6,4 +6,26 @@ func init() {
|
|||
|
||||
func main() {
|
||||
println("main")
|
||||
println("v1:", v1)
|
||||
println("v2:", v2.x, v2.y)
|
||||
println("v3:", len(v3), cap(v3), v3[0], v3[3])
|
||||
println("v4:", len(v4), v4 == nil)
|
||||
println("v5:", len(v5), v5 == nil)
|
||||
println("v6:", v6)
|
||||
}
|
||||
|
||||
type (
|
||||
t2 struct {
|
||||
x int
|
||||
y int
|
||||
}
|
||||
)
|
||||
|
||||
var (
|
||||
v1 = 3
|
||||
v2 = t2{2, 5}
|
||||
v3 = []int{2, 3, 5, 7}
|
||||
v4 map[string]int
|
||||
v5 = map[string]int{}
|
||||
v6 = float64(v1) < 2.6
|
||||
)
|
||||
|
|
6
testdata/init.txt
предоставленный
6
testdata/init.txt
предоставленный
|
@ -1,2 +1,8 @@
|
|||
init
|
||||
main
|
||||
v1: 3
|
||||
v2: 2 5
|
||||
v3: 4 4 2 7
|
||||
v4: 0 true
|
||||
v5: 0 false
|
||||
v6: false
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче