mirror of
https://github.com/golang/go
synced 2024-09-15 22:20:06 +00:00
[dev.typeparams] cmd/compile/internal/types2: fix generic type indirection
Change-Id: If25ceb2aa403b94608760be331faa2aff11c47cc Reviewed-on: https://go-review.googlesource.com/c/go/+/333890 Trust: Robert Griesemer <gri@golang.org> Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
This commit is contained in:
parent
dd8bdf4a1f
commit
3a047326e8
|
@ -1479,13 +1479,24 @@ func (check *Checker) exprInternal(x *operand, e syntax.Expr, hint Type) exprKin
|
||||||
case typexpr:
|
case typexpr:
|
||||||
x.typ = &Pointer{base: x.typ}
|
x.typ = &Pointer{base: x.typ}
|
||||||
default:
|
default:
|
||||||
if typ := asPointer(x.typ); typ != nil {
|
var base Type
|
||||||
x.mode = variable
|
if !underIs(x.typ, func(u Type) bool {
|
||||||
x.typ = typ.base
|
p, _ := u.(*Pointer)
|
||||||
} else {
|
if p == nil {
|
||||||
check.errorf(x, invalidOp+"cannot indirect %s", x)
|
check.errorf(x, invalidOp+"cannot indirect %s", x)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if base != nil && !Identical(p.base, base) {
|
||||||
|
check.errorf(x, invalidOp+"pointers of %s must have identical base types", x)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
base = p.base
|
||||||
|
return true
|
||||||
|
}) {
|
||||||
goto Error
|
goto Error
|
||||||
}
|
}
|
||||||
|
x.mode = variable
|
||||||
|
x.typ = base
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
29
src/cmd/compile/internal/types2/testdata/examples/operations.go2
vendored
Normal file
29
src/cmd/compile/internal/types2/testdata/examples/operations.go2
vendored
Normal 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
|
||||||
|
}
|
Loading…
Reference in a new issue