]> Cypherpunks repositories - gostls13.git/commitdiff
go/types, types2: skip comparison for operands with invalid types
authorRobert Griesemer <gri@golang.org>
Mon, 15 Aug 2022 22:37:22 +0000 (15:37 -0700)
committerRobert Griesemer <gri@golang.org>
Tue, 16 Aug 2022 01:11:27 +0000 (01:11 +0000)
Fixes #54405.

Change-Id: Ia7b2709b83966fa080e41e3d4818527d1e8b49f9
Reviewed-on: https://go-review.googlesource.com/c/go/+/424054
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Robert Griesemer <gri@google.com>
Run-TryBot: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Findley <rfindley@google.com>
Auto-Submit: Robert Griesemer <gri@google.com>

src/cmd/compile/internal/types2/expr.go
src/cmd/compile/internal/types2/testdata/fixedbugs/issue54405.go [new file with mode: 0644]
src/go/types/expr.go
src/go/types/testdata/fixedbugs/issue54405.go [new file with mode: 0644]

index b11cd1e9d8dd367423d95ba3a359c4913e81eeca..ee0792e61c472c6a994f572e426eda7c77af62d7 100644 (file)
@@ -783,6 +783,12 @@ func (check *Checker) implicitTypeAndValue(x *operand, target Type) (Type, const
 
 // If switchCase is true, the operator op is ignored.
 func (check *Checker) comparison(x, y *operand, op syntax.Operator, switchCase bool) {
+       // Avoid spurious errors if any of the operands has an invalid type (issue #54405).
+       if x.typ == Typ[Invalid] || y.typ == Typ[Invalid] {
+               x.mode = invalid
+               return
+       }
+
        if switchCase {
                op = syntax.Eql
        }
diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue54405.go b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue54405.go
new file mode 100644 (file)
index 0000000..e89d5e1
--- /dev/null
@@ -0,0 +1,16 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test that we don't see spurious errors for ==
+// for values with invalid types due to prior errors.
+
+package p
+
+var x struct {
+       f *NotAType /* ERROR undeclared name */
+}
+var _ = x.f == nil // no error expected here
+
+var y *NotAType  /* ERROR undeclared name */
+var _ = y == nil // no error expected here
index 0e8dca32478ead450e4b8df5ab6feefe098d5c5d..4b60123499c89a8c3f7a126016e486066b6ef6b2 100644 (file)
@@ -736,6 +736,12 @@ func (check *Checker) implicitTypeAndValue(x *operand, target Type) (Type, const
 
 // If switchCase is true, the operator op is ignored.
 func (check *Checker) comparison(x, y *operand, op token.Token, switchCase bool) {
+       // Avoid spurious errors if any of the operands has an invalid type (issue #54405).
+       if x.typ == Typ[Invalid] || y.typ == Typ[Invalid] {
+               x.mode = invalid
+               return
+       }
+
        if switchCase {
                op = token.EQL
        }
diff --git a/src/go/types/testdata/fixedbugs/issue54405.go b/src/go/types/testdata/fixedbugs/issue54405.go
new file mode 100644 (file)
index 0000000..e89d5e1
--- /dev/null
@@ -0,0 +1,16 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Test that we don't see spurious errors for ==
+// for values with invalid types due to prior errors.
+
+package p
+
+var x struct {
+       f *NotAType /* ERROR undeclared name */
+}
+var _ = x.f == nil // no error expected here
+
+var y *NotAType  /* ERROR undeclared name */
+var _ = y == nil // no error expected here