[dev.typeparams] go/types: fix generic type indirection

This is a port of CL 333890 to go/types.

Change-Id: I8ee20f405dad98083bb5e91636044d132a95d909
Reviewed-on: https://go-review.googlesource.com/c/go/+/335081
Trust: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
Rob Findley 2021-07-16 20:50:18 -04:00 committed by Robert Findley
parent 62f6f130fe
commit 82f875d735
2 changed files with 45 additions and 5 deletions

View file

@ -1400,13 +1400,24 @@ func (check *Checker) exprInternal(x *operand, e ast.Expr, hint Type) exprKind {
case typexpr:
x.typ = &Pointer{base: x.typ}
default:
if typ := asPointer(x.typ); typ != nil {
x.mode = variable
x.typ = typ.base
} else {
check.invalidOp(x, _InvalidIndirection, "cannot indirect %s", x)
var base Type
if !underIs(x.typ, func(u Type) bool {
p, _ := u.(*Pointer)
if p == nil {
check.invalidOp(x, _InvalidIndirection, "cannot indirect %s", x)
return false
}
if base != nil && !Identical(p.base, base) {
check.invalidOp(x, _Todo, "pointers of %s must have identical base types", x)
return false
}
base = p.base
return true
}) {
goto Error
}
x.mode = variable
x.typ = base
}
case *ast.UnaryExpr:

View file

@ -0,0 +1,29 @@
// 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
// indirection
func _[P any](p P) {
_ = *p // ERROR cannot indirect p
}
func _[P interface{ int }](p P) {
_ = *p // ERROR cannot indirect p
}
func _[P interface{ *int }](p P) {
_ = *p
}
func _[P interface{ *int | *string }](p P) {
_ = *p // ERROR must have identical base types
}
type intPtr *int
func _[P interface{ *int | intPtr } ](p P) {
var _ int = *p
}