mirror of
https://github.com/golang/go
synced 2024-11-11 23:40:22 -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:
parent
401d7e5a24
commit
afd67f3334
@ -120,6 +120,7 @@ func (check *Checker) initVar(lhs *Var, x *operand, context string) Type {
|
||||
if lhs.typ == nil {
|
||||
lhs.typ = Typ[Invalid]
|
||||
}
|
||||
lhs.used = true
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
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
|
||||
if typ != nil {
|
||||
obj.typ = check.typ(typ)
|
||||
|
14
src/go/types/testdata/vardecl.src
vendored
14
src/go/types/testdata/vardecl.src
vendored
@ -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"
|
||||
func _() {
|
||||
var a, b, c int
|
||||
@ -203,4 +215,4 @@ func _() {
|
||||
_, _, _ = x, y, z
|
||||
}
|
||||
|
||||
// TODO(gri) consolidate other var decl checks in this file
|
||||
// TODO(gri) consolidate other var decl checks in this file
|
||||
|
Loading…
Reference in New Issue
Block a user