diff --git a/src/cmd/compile/internal/syntax/parser.go b/src/cmd/compile/internal/syntax/parser.go index 832f991a6d3..5b7ac6cc406 100644 --- a/src/cmd/compile/internal/syntax/parser.go +++ b/src/cmd/compile/internal/syntax/parser.go @@ -758,7 +758,7 @@ func (p *parser) callStmt() *CallStmt { // already progressed, no need to advance cx = new(CallExpr) cx.pos = x.Pos() - cx.Fun = p.bad() + cx.Fun = x // assume common error of missing parentheses (function invocation) } s.Call = cx diff --git a/test/fixedbugs/issue23586.go b/test/fixedbugs/issue23586.go new file mode 100644 index 00000000000..c2d4c9ffb59 --- /dev/null +++ b/test/fixedbugs/issue23586.go @@ -0,0 +1,24 @@ +// errorcheck + +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Test that we type-check deferred/go functions even +// if they are not called (a common error). Specifically, +// we don't want to see errors such as import or variable +// declared but not used. + +package p + +import ( + "fmt" + "math" +) + +func f() { + var i int + defer func() { fmt.Println() } // ERROR "must be function call" + go func() { _ = math.Sin(0) } // ERROR "must be function call" + go func() { _ = i} // ERROR "must be function call" +}