mirror of
https://github.com/golang/go
synced 2024-11-17 07:54:41 -07:00
Revert "go/types, types2: remove unnecessary tests for x.typ == Typ[Invalid]"
This reverts commit 4c49d52439
.
Reason for revert: it is trickier than expected to enforce an invariant that x.typ == Typ[Invalid] => x.mode == invalid. For example, builtins have invalid type until their call is evaluated.
I think it is better to keep this defensive code for now. My bad for suggesting this strictness. I will send a follow-up CL with a test that exercises the panic discovered inside Google, and a bit more commentary about what 'invalid' means in both contexts.
Fixes #59603
Change-Id: If291f7268e7ef7ae6cd9bb861bb9af349a729cb2
Reviewed-on: https://go-review.googlesource.com/c/go/+/484375
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
This commit is contained in:
parent
3f747d09e4
commit
0742e6dbc0
@ -99,7 +99,7 @@ func (check *Checker) assignment(x *operand, T Type, context string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (check *Checker) initConst(lhs *Const, x *operand) {
|
func (check *Checker) initConst(lhs *Const, x *operand) {
|
||||||
if x.mode == invalid || lhs.typ == Typ[Invalid] {
|
if x.mode == invalid || x.typ == Typ[Invalid] || lhs.typ == Typ[Invalid] {
|
||||||
if lhs.typ == nil {
|
if lhs.typ == nil {
|
||||||
lhs.typ = Typ[Invalid]
|
lhs.typ = Typ[Invalid]
|
||||||
}
|
}
|
||||||
@ -133,7 +133,7 @@ func (check *Checker) initConst(lhs *Const, x *operand) {
|
|||||||
// If lhs doesn't have a type yet, it is given the type of x,
|
// If lhs doesn't have a type yet, it is given the type of x,
|
||||||
// or Typ[Invalid] in case of an error.
|
// or Typ[Invalid] in case of an error.
|
||||||
func (check *Checker) initVar(lhs *Var, x *operand, context string) {
|
func (check *Checker) initVar(lhs *Var, x *operand, context string) {
|
||||||
if x.mode == invalid || lhs.typ == Typ[Invalid] {
|
if x.mode == invalid || x.typ == Typ[Invalid] || lhs.typ == Typ[Invalid] {
|
||||||
if lhs.typ == nil {
|
if lhs.typ == nil {
|
||||||
lhs.typ = Typ[Invalid]
|
lhs.typ = Typ[Invalid]
|
||||||
}
|
}
|
||||||
@ -195,6 +195,10 @@ func (check *Checker) lhsVar(lhs syntax.Expr) Type {
|
|||||||
v.used = v_used // restore v.used
|
v.used = v_used // restore v.used
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if x.mode == invalid || x.typ == Typ[Invalid] {
|
||||||
|
return Typ[Invalid]
|
||||||
|
}
|
||||||
|
|
||||||
// spec: "Each left-hand side operand must be addressable, a map index
|
// spec: "Each left-hand side operand must be addressable, a map index
|
||||||
// expression, or the blank identifier. Operands may be parenthesized."
|
// expression, or the blank identifier. Operands may be parenthesized."
|
||||||
switch x.mode {
|
switch x.mode {
|
||||||
|
@ -97,7 +97,7 @@ func (check *Checker) assignment(x *operand, T Type, context string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (check *Checker) initConst(lhs *Const, x *operand) {
|
func (check *Checker) initConst(lhs *Const, x *operand) {
|
||||||
if x.mode == invalid || lhs.typ == Typ[Invalid] {
|
if x.mode == invalid || x.typ == Typ[Invalid] || lhs.typ == Typ[Invalid] {
|
||||||
if lhs.typ == nil {
|
if lhs.typ == nil {
|
||||||
lhs.typ = Typ[Invalid]
|
lhs.typ = Typ[Invalid]
|
||||||
}
|
}
|
||||||
@ -131,7 +131,7 @@ func (check *Checker) initConst(lhs *Const, x *operand) {
|
|||||||
// If lhs doesn't have a type yet, it is given the type of x,
|
// If lhs doesn't have a type yet, it is given the type of x,
|
||||||
// or Typ[Invalid] in case of an error.
|
// or Typ[Invalid] in case of an error.
|
||||||
func (check *Checker) initVar(lhs *Var, x *operand, context string) {
|
func (check *Checker) initVar(lhs *Var, x *operand, context string) {
|
||||||
if x.mode == invalid || lhs.typ == Typ[Invalid] {
|
if x.mode == invalid || x.typ == Typ[Invalid] || lhs.typ == Typ[Invalid] {
|
||||||
if lhs.typ == nil {
|
if lhs.typ == nil {
|
||||||
lhs.typ = Typ[Invalid]
|
lhs.typ = Typ[Invalid]
|
||||||
}
|
}
|
||||||
@ -193,6 +193,10 @@ func (check *Checker) lhsVar(lhs ast.Expr) Type {
|
|||||||
v.used = v_used // restore v.used
|
v.used = v_used // restore v.used
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if x.mode == invalid || x.typ == Typ[Invalid] {
|
||||||
|
return Typ[Invalid]
|
||||||
|
}
|
||||||
|
|
||||||
// spec: "Each left-hand side operand must be addressable, a map index
|
// spec: "Each left-hand side operand must be addressable, a map index
|
||||||
// expression, or the blank identifier. Operands may be parenthesized."
|
// expression, or the blank identifier. Operands may be parenthesized."
|
||||||
switch x.mode {
|
switch x.mode {
|
||||||
|
Loading…
Reference in New Issue
Block a user