aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRebecca Stambler <rstambler@golang.org>2018-08-30 11:33:19 -0400
committerIan Lance Taylor <iant@golang.org>2018-09-12 17:17:42 +0000
commit05416684165fe5c3006d142c8c44122fb117f604 (patch)
treec87ac2bcffab13ecb2090ec8fb041d579b0f7468
parent5a25f45bce6914599da1de2b10afcc7792bc6804 (diff)
downloadgo-05416684165fe5c3006d142c8c44122fb117f604.tar.gz
go-05416684165fe5c3006d142c8c44122fb117f604.zip
[release-branch.go1.11] go/types: handle nil pointer when panic is written outside of a function
The current implementation crashes when someone writes a panic outside of a function, which makes sense since that is broken code. This fix allows one to type-check broken code. Fixes #27497 Change-Id: I81b90dbd918162a20c60a821340898eaf02e648d Reviewed-on: https://go-review.googlesource.com/132235 Reviewed-by: Alan Donovan <adonovan@google.com> (cherry picked from commit c99687f87aed84342cfe92ae78924f791237c6f6) Reviewed-on: https://go-review.googlesource.com/133395 Reviewed-by: Robert Griesemer <gri@golang.org>
-rw-r--r--src/go/types/api_test.go2
-rw-r--r--src/go/types/builtins.go2
2 files changed, 3 insertions, 1 deletions
diff --git a/src/go/types/api_test.go b/src/go/types/api_test.go
index 1fe20794ea..cde07f2b4b 100644
--- a/src/go/types/api_test.go
+++ b/src/go/types/api_test.go
@@ -261,6 +261,8 @@ func TestTypesInfo(t *testing.T) {
{`package x0; func _() { var x struct {f string}; x.f := 0 }`, `x.f`, `string`},
{`package x1; func _() { var z string; type x struct {f string}; y := &x{q: z}}`, `z`, `string`},
{`package x2; func _() { var a, b string; type x struct {f string}; z := &x{f: a; f: b;}}`, `b`, `string`},
+ {`package x3; var x = panic("");`, `panic`, `func(interface{})`},
+ {`package x4; func _() { panic("") }`, `panic`, `func(interface{})`},
}
for _, test := range tests {
diff --git a/src/go/types/builtins.go b/src/go/types/builtins.go
index 05e032423c..d3f0c4d40d 100644
--- a/src/go/types/builtins.go
+++ b/src/go/types/builtins.go
@@ -476,7 +476,7 @@ func (check *Checker) builtin(x *operand, call *ast.CallExpr, id builtinId) (_ b
// panic(x)
// record panic call if inside a function with result parameters
// (for use in Checker.isTerminating)
- if check.sig.results.Len() > 0 {
+ if check.sig != nil && check.sig.results.Len() > 0 {
// function has result parameters
p := check.isPanic
if p == nil {