1
0
mirror of https://github.com/golang/go synced 2024-11-26 10:58:16 -07:00

[dev.regabi] go/types: no "declared but not used" errors for invalid var decls

This is a port of CL 274615, adapted to go/types. The only change was in
the positioning of expected errors in vardecl.src: in go/types they are
positioned on the identifier.

Change-Id: Iab03265a7c4287749373e4380c6db6a95f262f30
Reviewed-on: https://go-review.googlesource.com/c/go/+/289712
Trust: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
Rob Findley 2021-02-04 10:27:41 -05:00 committed by Robert Findley
parent 401d7e5a24
commit afd67f3334
3 changed files with 28 additions and 1 deletions

View File

@ -120,6 +120,7 @@ func (check *Checker) initVar(lhs *Var, x *operand, context string) Type {
if lhs.typ == nil { if lhs.typ == nil {
lhs.typ = Typ[Invalid] lhs.typ = Typ[Invalid]
} }
lhs.used = true
return nil return nil
} }

View File

@ -504,6 +504,20 @@ func (check *Checker) constDecl(obj *Const, typ, init ast.Expr, inherited bool)
func (check *Checker) varDecl(obj *Var, lhs []*Var, typ, init ast.Expr) { func (check *Checker) varDecl(obj *Var, lhs []*Var, typ, init ast.Expr) {
assert(obj.typ == nil) assert(obj.typ == nil)
// If we have undefined variable types due to errors,
// mark variables as used to avoid follow-on errors.
// Matches compiler behavior.
defer func() {
if obj.typ == Typ[Invalid] {
obj.used = true
}
for _, lhs := range lhs {
if lhs.typ == Typ[Invalid] {
lhs.used = true
}
}
}()
// determine type, if any // determine type, if any
if typ != nil { if typ != nil {
obj.typ = check.typ(typ) obj.typ = check.typ(typ)

View File

@ -158,6 +158,18 @@ func _() {
} }
} }
// Invalid variable declarations must not lead to "declared but not used errors".
func _() {
var a x // ERROR undeclared name: x
var b = x // ERROR undeclared name: x
var c int = x // ERROR undeclared name: x
var d, e, f x /* ERROR x */ /* ERROR x */ /* ERROR x */
var g, h, i = x /* ERROR x */, x /* ERROR x */, x /* ERROR x */
var j, k, l float32 = x /* ERROR x */, x /* ERROR x */, x /* ERROR x */
// but no "declared but not used" errors
}
// Invalid (unused) expressions must not lead to spurious "declared but not used errors" // Invalid (unused) expressions must not lead to spurious "declared but not used errors"
func _() { func _() {
var a, b, c int var a, b, c int
@ -203,4 +215,4 @@ func _() {
_, _, _ = x, y, z _, _, _ = x, y, z
} }
// TODO(gri) consolidate other var decl checks in this file // TODO(gri) consolidate other var decl checks in this file