1
0
mirror of https://github.com/golang/go synced 2024-07-01 07:56:09 +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:
Robert Griesemer 2023-04-18 16:43:11 -07:00 committed by Gopher Robot
parent 522eace4ca
commit d93f02010c
5 changed files with 5 additions and 22 deletions

View File

@ -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)

View File

@ -12,9 +12,6 @@ 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 := m[0] // must not crash
_, _ = x, ok
}

View File

@ -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
}

View File

@ -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
}

View File

@ -15,7 +15,7 @@ func main() {
const (
a = 1 + iota // ERROR "invalid operation|incompatible types|cannot convert"
)
_, _ = n, y
}
const (