1
0
mirror of https://github.com/golang/go synced 2024-11-17 11:04:53 -07:00

go/types: remove work-around for issue #26390

This work-around is not needed anymore now that method
signatures are type-checked separately from their receiver
base types: no artificial cycles are introduced anymore
and so there is no need to artificially cut them.

Fixes #26854.

Change-Id: I2ef15ceeaa0b486f65f6cdc466d0cf06246c74d7
Reviewed-on: https://go-review.googlesource.com/c/139900
Reviewed-by: Alan Donovan <adonovan@google.com>
This commit is contained in:
Robert Griesemer 2018-10-04 17:16:33 -07:00
parent 6d51dd1e85
commit 71d40c492f

View File

@ -150,31 +150,6 @@ func (check *Checker) objDecl(obj Object, def *Named) {
}
case *TypeName:
// fixFor26390 enables a temporary work-around to handle alias type names
// that have not been given a type yet even though the underlying type
// is already known. See testdata/issue26390.src for a simple example.
// Set this flag to false to disable this code quickly (and comment
// out the new test in decls4.src that will fail again).
// TODO(gri) remove this for Go 1.12 in favor of a more comprehensive fix
const fixFor26390 = true
if fixFor26390 {
// If we have a package-level alias type name that has not been
// given a type yet but the underlying type is a type name that
// has been given a type already, don't report a cycle but use
// the underlying type name's type instead. The cycle shouldn't
// exist in the first place in this case and is due to the way
// methods are type-checked at the moment. See also the comment
// at the end of Checker.typeDecl below.
if d := check.objMap[obj]; d != nil && d.alias && obj.typ == Typ[Invalid] {
// If we can find the underlying type name syntactically
// and it has a type, use that type.
if tname := check.resolveBaseTypeName(ast.NewIdent(obj.name)); tname != nil && tname.typ != nil {
obj.typ = tname.typ
break
}
}
}
if check.typeCycle(obj) {
// break cycle
// (without this, calling underlying()