diff --git a/cl/_testlibgo/deferpanic/expect.txt b/cl/_testlibgo/deferpanic/expect.txt new file mode 100644 index 000000000..bc594a8a2 --- /dev/null +++ b/cl/_testlibgo/deferpanic/expect.txt @@ -0,0 +1,2 @@ +run main +panic in defer diff --git a/cl/_testlibgo/deferpanic/in.go b/cl/_testlibgo/deferpanic/in.go new file mode 100644 index 000000000..fd8d8de8b --- /dev/null +++ b/cl/_testlibgo/deferpanic/in.go @@ -0,0 +1,13 @@ +// LITTEST +package main + +// CHECK: define void @"{{.*}}/deferpanic.main"(){{.*}} { +func main() { + defer func() { + e := recover() + println(e.(string)) + }() + // CHECK: call void @"{{.*}}/runtime/internal/runtime.Panic" + defer panic("panic in defer") + println("run main") +} diff --git a/ssa/expr.go b/ssa/expr.go index 2b8697e7a..e37dada73 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -1473,7 +1473,11 @@ func (b Builder) BuiltinCall(fn string, args ...Expr) (ret Expr) { } } panic("invalid argument for unsafe.Offsetof: must be a selector expression") + case "panic": + b.Panic(args[0]) + return } + panic("todo: " + fn) }