From c40dc677be05e2774c7805bf55002a960cb4dec5 Mon Sep 17 00:00:00 2001 From: "Norman B. Lancaster" Date: Tue, 30 Mar 2021 17:30:45 +0000 Subject: [PATCH] go/doc: avoid panic on references to functions with no body MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This change guards a call to ast.Inspect with a nil check on the first argument. This avoids a panic when inspecting a reference to a function with a nil body. This can only happen when a function body is defined outside Go. Fixes #42706 Change-Id: I91bc607b24b6224920c24cfd07e76ce7737a98d4 GitHub-Last-Rev: 08072b9ce5c1fd4ee77eba6f1acc0a84e838ad7b GitHub-Pull-Request: golang/go#43011 Reviewed-on: https://go-review.googlesource.com/c/go/+/275516 Reviewed-by: Daniel Martí Trust: Daniel Martí Trust: Emmanuel Odeke Run-TryBot: Daniel Martí TryBot-Result: Go Bot --- src/go/doc/example.go | 5 ++++- src/go/doc/example_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/go/doc/example.go b/src/go/doc/example.go index 125fd530b1..274000cecb 100644 --- a/src/go/doc/example.go +++ b/src/go/doc/example.go @@ -237,7 +237,10 @@ func playExample(file *ast.File, f *ast.FuncDecl) *ast.File { } } - ast.Inspect(d.Body, inspectFunc) + // Functions might not have a body. See #42706. + if d.Body != nil { + ast.Inspect(d.Body, inspectFunc) + } case *ast.GenDecl: for _, spec := range d.Specs { switch s := spec.(type) { diff --git a/src/go/doc/example_test.go b/src/go/doc/example_test.go index 7c96f0300a..cf1b702549 100644 --- a/src/go/doc/example_test.go +++ b/src/go/doc/example_test.go @@ -352,6 +352,25 @@ func main() { } ` +const exampleWholeFileExternalFunction = `package foo_test + +func foo(int) + +func Example() { + foo(42) + // Output: +} +` + +const exampleWholeFileExternalFunctionOutput = `package main + +func foo(int) + +func main() { + foo(42) +} +` + var exampleWholeFileTestCases = []struct { Title, Source, Play, Output string }{ @@ -367,6 +386,12 @@ var exampleWholeFileTestCases = []struct { exampleWholeFileFunctionOutput, "Hello, world!\n", }, + { + "ExternalFunction", + exampleWholeFileExternalFunction, + exampleWholeFileExternalFunctionOutput, + "", + }, } func TestExamplesWholeFile(t *testing.T) { -- 2.50.0