diff options
| -rw-r--r-- | llgo/irgen/builtins.go | 6 | ||||
| -rw-r--r-- | llgo/irgen/ssa.go | 4 | ||||
| -rw-r--r-- | llgo/test/irgen/go-panic.go | 10 |
3 files changed, 16 insertions, 4 deletions
diff --git a/llgo/irgen/builtins.go b/llgo/irgen/builtins.go index 404962fd85b..8e4dc872210 100644 --- a/llgo/irgen/builtins.go +++ b/llgo/irgen/builtins.go @@ -110,7 +110,9 @@ func (fr *frame) callRecover(isDeferredRecover bool) *govalue { return newValue(llv, eface) } -func (fr *frame) callPanic(arg *govalue) { +func (fr *frame) callPanic(arg *govalue, term bool) { fr.runtime.panic.call(fr, arg.value) - fr.builder.CreateUnreachable() + if term { + fr.builder.CreateUnreachable() + } } diff --git a/llgo/irgen/ssa.go b/llgo/irgen/ssa.go index 2c7c20200bd..706eb7790e7 100644 --- a/llgo/irgen/ssa.go +++ b/llgo/irgen/ssa.go @@ -1079,7 +1079,7 @@ func (fr *frame) instruction(instr ssa.Instruction) { case *ssa.Panic: arg := fr.value(instr.X) - fr.callPanic(arg) + fr.callPanic(arg, true) case *ssa.Phi: typ := instr.Type() @@ -1190,7 +1190,7 @@ func (fr *frame) callBuiltin(typ types.Type, builtin *ssa.Builtin, args []ssa.Va return nil case "panic": - fr.callPanic(fr.value(args[0])) + fr.callPanic(fr.value(args[0]), false) return nil case "recover": diff --git a/llgo/test/irgen/go-panic.go b/llgo/test/irgen/go-panic.go new file mode 100644 index 00000000000..35b0a47bb9b --- /dev/null +++ b/llgo/test/irgen/go-panic.go @@ -0,0 +1,10 @@ +// RUN: llgo -S -emit-llvm -o - %s | FileCheck %s + +package foo + +func F() { + // CHECK: call void @__go_panic + // CHECK-NEXT: ret void + // CHECK-NEXT: } + go panic("") +} |

