]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.regabi] go/types: no "declared but not used" errors for invalid var decls
authorRob Findley <rfindley@google.com>
Thu, 4 Feb 2021 15:27:41 +0000 (10:27 -0500)
committerRobert Findley <rfindley@google.com>
Thu, 4 Feb 2021 17:13:14 +0000 (17:13 +0000)
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>
src/go/types/assignments.go
src/go/types/decl.go
src/go/types/testdata/vardecl.src

index 616564b567d7315d4723c5ed3f7ddb46b7a35a8f..d6f18c9bee1e93f3ba37e5eb4e2c8304b0c9c58e 100644 (file)
@@ -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
        }
 
index 1f0bc358a26e9ace5e0c3dcf396eaaf6079e2646..df01e9253060343fcceebf0f6f8451431b787425 100644 (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) {
        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)
index 54f5ef1e10d0983f55f65ea32f421e2b4e53ee63..6e2d1b5bd5e3b5c65454b7987bb4db9d4be3d915 100644 (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"
 func _() {
        var a, b, c int
@@ -203,4 +215,4 @@ func _() {
        _, _, _ = x, y, z
 }
 
-// TODO(gri) consolidate other var decl checks in this file
\ No newline at end of file
+// TODO(gri) consolidate other var decl checks in this file