]> Cypherpunks repositories - gostls13.git/commitdiff
go/doc: avoid panic on references to functions with no body
authorNorman B. Lancaster <qbradq@gmail.com>
Tue, 30 Mar 2021 17:30:45 +0000 (17:30 +0000)
committerDaniel Martí <mvdan@mvdan.cc>
Tue, 30 Mar 2021 17:51:37 +0000 (17:51 +0000)
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í <mvdan@mvdan.cc>
Trust: Daniel Martí <mvdan@mvdan.cc>
Trust: Emmanuel Odeke <emmanuel@orijtech.com>
Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
TryBot-Result: Go Bot <gobot@golang.org>

src/go/doc/example.go
src/go/doc/example_test.go

index 125fd530b133d73c9f805c0041077ba5842a732a..274000cecb7a4b194193cbe2f87e7a1d5753f867 100644 (file)
@@ -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) {
index 7c96f0300a8fb5b0622debf805728f21a7ca3c2f..cf1b702549e5242e57d60e4998873c558d5fed72 100644 (file)
@@ -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) {