{"testdata/issues.src"},
{"testdata/blank.src"},
{"testdata/issue25008b.src", "testdata/issue25008a.src"}, // order (b before a) is crucial!
+ {"testdata/issue26390.src"}, // stand-alone test to ensure case is triggered
}
var fset = token.NewFileSet()
}
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 useCycleMarking && check.typeCycle(obj) {
// break cycle
// (without this, calling underlying()
--- /dev/null
+// Copyright 2018 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 issue26390
+
+type A = T
+
+func (t *T) m() *A { return t }
+
+type T struct{}