aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCuong Manh Le <cuong.manhle.vn@gmail.com>2021-09-10 08:20:28 +0700
committerCuong Manh Le <cuong.manhle.vn@gmail.com>2021-09-14 02:52:48 +0000
commit2953cd00836323112846b21f60fa1d68aa0f9a77 (patch)
treef02f7136b80f5a6b5ab04acef1f3ef742f51013c
parentb8c802b1161528fcf8ba78b1dff5720dd5b4eb9f (diff)
downloadgo-2953cd00836323112846b21f60fa1d68aa0f9a77.tar.gz
go-2953cd00836323112846b21f60fa1d68aa0f9a77.zip
go/internal/gcimporter: prevent importReader reading type parameter twice
This is port of CL 349009 to go/internal/gcimporter. Updates #48280 Change-Id: I7d40d8b67333538ca58fe012535d54e891d0ed16 Reviewed-on: https://go-review.googlesource.com/c/go/+/349010 Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
-rw-r--r--src/go/internal/gcimporter/iimport.go13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/go/internal/gcimporter/iimport.go b/src/go/internal/gcimporter/iimport.go
index 039fc6a61b..56f6418d5e 100644
--- a/src/go/internal/gcimporter/iimport.go
+++ b/src/go/internal/gcimporter/iimport.go
@@ -284,6 +284,8 @@ type importReader struct {
prevColumn int64
}
+// obj reads import declaration for an object. It may not read
+// the entire declaration, e.g, for recursive type.
func (r *importReader) obj(name string) {
tag := r.byte()
pos := r.pos()
@@ -309,16 +311,17 @@ func (r *importReader) obj(name string) {
r.declare(types.NewFunc(pos, r.currPkg, name, sig))
case 'T', 'U':
- var tparams []*types.TypeParam
- if tag == 'U' {
- tparams = r.tparamList()
- }
// Types can be recursive. We need to setup a stub
// declaration before recursing.
obj := types.NewTypeName(pos, r.currPkg, name, nil)
named := types.NewNamed(obj, nil, nil)
- named.SetTypeParams(tparams)
+ // Declare obj before calling r.tparamList, so the new type name is recognized
+ // if used in the constraint of one of its own typeparams (see #48280).
r.declare(obj)
+ if tag == 'U' {
+ tparams := r.tparamList()
+ named.SetTypeParams(tparams)
+ }
underlying := r.p.typAt(r.uint64(), named).Underlying()
named.SetUnderlying(underlying)