Skip to content

Commit

Permalink
cmd/compile: support generic alias type
Browse files Browse the repository at this point in the history
Type parameters on aliases are now allowed after #46477 accepted.

Updates #46477
Fixes #68054

Change-Id: Ic2e3b6f960a898163f47666e3a6bfe43b8cc22e2
Reviewed-on: https://go-review.googlesource.com/c/go/+/593715
Reviewed-by: Robert Griesemer <[email protected]>
Reviewed-by: Matthew Dempsky <[email protected]>
LUCI-TryBot-Result: Go LUCI <[email protected]>
Auto-Submit: Robert Griesemer <[email protected]>
  • Loading branch information
cuonglm authored and gopherbot committed Jun 20, 2024
1 parent 4f77a83 commit 477ad7d
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 1 deletion.
13 changes: 12 additions & 1 deletion src/cmd/compile/internal/noder/writer.go
Original file line number Diff line number Diff line change
Expand Up @@ -543,7 +543,7 @@ func (pw *pkgWriter) typIdx(typ types2.Type, dict *writerDict) typeInfo {

case *types2.Alias:
w.Code(pkgbits.TypeNamed)
w.namedType(typ.Obj(), nil)
w.namedType(splitAlias(typ))

case *types2.TypeParam:
w.derived = true
Expand Down Expand Up @@ -2958,6 +2958,9 @@ func objTypeParams(obj types2.Object) *types2.TypeParamList {
if !obj.IsAlias() {
return obj.Type().(*types2.Named).TypeParams()
}
if alias, ok := obj.Type().(*types2.Alias); ok {
return alias.TypeParams()
}
}
return nil
}
Expand All @@ -2974,6 +2977,14 @@ func splitNamed(typ *types2.Named) (*types2.TypeName, *types2.TypeList) {
return typ.Obj(), typ.TypeArgs()
}

// splitAlias is like splitNamed, but for an alias type.
func splitAlias(typ *types2.Alias) (*types2.TypeName, *types2.TypeList) {
orig := typ.Origin()
base.Assertf(typ.Obj() == orig.Obj(), "alias type %v has object %v, but %v has object %v", typ, typ.Obj(), orig, orig.Obj())

return typ.Obj(), typ.TypeArgs()
}

func asPragmaFlag(p syntax.Pragma) ir.PragmaFlag {
if p == nil {
return 0
Expand Down
23 changes: 23 additions & 0 deletions test/fixedbugs/issue68054.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// compile -goexperiment aliastypeparams

// Copyright 2024 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 Seq[V any] = func(yield func(V) bool)

func f[E any](seq Seq[E]) {
return
}

func g() {
f(Seq[int](nil))
}

type T[P any] struct{}

type A[P any] = T[P]

var _ A[int]

0 comments on commit 477ad7d

Please sign in to comment.