mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00:00
cmd/compile/internal/types2: only mark variables as used if they are
Marking variables in erroneous variable declarations as used is convenient for tests but doesn't necessarily hide follow-on errors in real code: either the variable is not supposed to be declared in the first place and then we should get an error if it is not used, or it is there because it is intended to be used, and the we expect an error it if is not used. This brings types2 closer to go/types. Change-Id: If7ee1298fc770f7ad0cefe7e968533fd50ec2343 Reviewed-on: https://go-review.googlesource.com/c/go/+/486175 Run-TryBot: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
522eace4ca
commit
d93f02010c
@ -416,20 +416,6 @@ func (check *Checker) constDecl(obj *Const, typ, init syntax.Expr, inherited boo
|
||||
func (check *Checker) varDecl(obj *Var, lhs []*Var, typ, init syntax.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.varType(typ)
|
||||
|
@ -13,8 +13,5 @@ func _() {
|
||||
func _() {
|
||||
var ok = undef /* ERROR "undefined: undef" */
|
||||
x, ok := m[0] // must not crash
|
||||
_ = x
|
||||
// The next line is only needed for go/types, not types2.
|
||||
// TODO(gri) find cause and fix
|
||||
_ = ok
|
||||
_, _ = x, ok
|
||||
}
|
||||
|
@ -9,5 +9,5 @@ package main
|
||||
func main() {
|
||||
var c, d = 1, 2, 3 // ERROR "assignment mismatch: 2 variables but 3 values|wrong number of initializations|extra init expr"
|
||||
var e, f, g = 1, 2 // ERROR "assignment mismatch: 3 variables but 2 values|wrong number of initializations|missing init expr"
|
||||
_, _, _, _ = c, d, e, f
|
||||
_, _, _, _, _ = c, d, e, f, g
|
||||
}
|
||||
|
@ -11,5 +11,5 @@ func main() {
|
||||
_ = 1, 2 // ERROR "assignment mismatch: 1 variable but 2 values|number of variables does not match|cannot assign"
|
||||
c, d := 1 // ERROR "assignment mismatch: 2 variables but 1 value|wrong number of initializations|cannot initialize"
|
||||
e, f := 1, 2, 3 // ERROR "assignment mismatch: 2 variables but 3 values|wrong number of initializations|cannot initialize"
|
||||
_, _, _, _ = c, d, e, f
|
||||
_, _, _, _, _, _ = a, b, c, d, e, f
|
||||
}
|
||||
|
@ -15,7 +15,7 @@ func main() {
|
||||
const (
|
||||
a = 1 + iota // ERROR "invalid operation|incompatible types|cannot convert"
|
||||
)
|
||||
|
||||
_, _ = n, y
|
||||
}
|
||||
|
||||
const (
|
||||
|
Loading…
x
Reference in New Issue
Block a user