mirror of
https://github.com/golang/go
synced 2024-11-26 08:38:01 -07:00
cmd/compile, types2: avoid confusing follow-on error in invalid type assertion
This CL avoids a useless follow-on error (that gets reported before the actual error due to source position). This addresses the first part of the issue below. Thanks to @cuonglm for the suggestion for the fix. For #49005. Change-Id: Ifdd83072a05c32e115dc58a0233868a64f336f3f Reviewed-on: https://go-review.googlesource.com/c/go/+/356449 Trust: Robert Griesemer <gri@golang.org> Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
This commit is contained in:
parent
fa7d11a0e9
commit
cf51fb5d68
@ -312,6 +312,13 @@ func (check *Checker) typInternal(e0 syntax.Expr, def *Named) (T Type) {
|
|||||||
typ := new(Pointer)
|
typ := new(Pointer)
|
||||||
def.setUnderlying(typ)
|
def.setUnderlying(typ)
|
||||||
typ.base = check.varType(e.X)
|
typ.base = check.varType(e.X)
|
||||||
|
// If typ.base is invalid, it's unlikely that *base is particularly
|
||||||
|
// useful - even a valid dereferenciation will lead to an invalid
|
||||||
|
// type again, and in some cases we get unexpected follow-on errors
|
||||||
|
// (e.g., see #49005). Return an invalid type instead.
|
||||||
|
if typ.base == Typ[Invalid] {
|
||||||
|
return Typ[Invalid]
|
||||||
|
}
|
||||||
return typ
|
return typ
|
||||||
}
|
}
|
||||||
|
|
||||||
|
13
test/fixedbugs/issue49005a.go
Normal file
13
test/fixedbugs/issue49005a.go
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// errorcheck
|
||||||
|
|
||||||
|
// Copyright 2021 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.
|
||||||
|
|
||||||
|
package p
|
||||||
|
|
||||||
|
type T interface{ M() }
|
||||||
|
|
||||||
|
func F() T
|
||||||
|
|
||||||
|
var _ = F().(*X) // ERROR "undefined: X"
|
Loading…
Reference in New Issue
Block a user