mirror of
https://github.com/golang/go
synced 2024-09-04 15:34:21 +00:00
[dev.typeparams] cmd/compile: report mismatch between types because of //go:notinheap
types2 currently ignores pragmas, so it does not catch a conversion error when converting a pointer to a type which is NOT marked notinheap to a pointer to a convertible type, but which is marked notinheap. So, we specifically check for this error in transformConv() and report it during noder2. Change-Id: I6e9c9ee29f53fa5e490c1ac8306e2191db59eeb4 Reviewed-on: https://go-review.googlesource.com/c/go/+/333369 Run-TryBot: Dan Scales <danscales@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org> Trust: Robert Griesemer <gri@golang.org> Trust: Dan Scales <danscales@google.com>
This commit is contained in:
parent
2b1d70a137
commit
04acb8a7b9
|
@ -219,6 +219,10 @@ Outer:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for unusual case where noder2 encounters a type error that types2
|
||||||
|
// doesn't check for (e.g. notinheap incompatibility).
|
||||||
|
base.ExitIfErrors()
|
||||||
|
|
||||||
typecheck.DeclareUniverse()
|
typecheck.DeclareUniverse()
|
||||||
|
|
||||||
for _, p := range noders {
|
for _, p := range noders {
|
||||||
|
|
|
@ -85,7 +85,15 @@ func stringtoruneslit(n *ir.ConvExpr) ir.Node {
|
||||||
// etc. Corresponds to typecheck.tcConv.
|
// etc. Corresponds to typecheck.tcConv.
|
||||||
func transformConv(n *ir.ConvExpr) ir.Node {
|
func transformConv(n *ir.ConvExpr) ir.Node {
|
||||||
t := n.X.Type()
|
t := n.X.Type()
|
||||||
op, _ := typecheck.Convertop(n.X.Op() == ir.OLITERAL, t, n.Type())
|
op, why := typecheck.Convertop(n.X.Op() == ir.OLITERAL, t, n.Type())
|
||||||
|
if op == ir.OXXX {
|
||||||
|
// types2 currently ignores pragmas, so a 'notinheap' mismatch is the
|
||||||
|
// one type-related error that it does not catch. This error will be
|
||||||
|
// caught here by Convertop (see two checks near beginning of
|
||||||
|
// Convertop) and reported at the end of noding.
|
||||||
|
base.ErrorfAt(n.Pos(), "cannot convert %L to type %v%s", n.X, n.Type(), why)
|
||||||
|
return n
|
||||||
|
}
|
||||||
n.SetOp(op)
|
n.SetOp(op)
|
||||||
switch n.Op() {
|
switch n.Op() {
|
||||||
case ir.OCONVNOP:
|
case ir.OCONVNOP:
|
||||||
|
|
|
@ -2204,8 +2204,7 @@ var g3Failures = setOf(
|
||||||
|
|
||||||
"typeparam/nested.go", // -G=3 doesn't support function-local types with generics
|
"typeparam/nested.go", // -G=3 doesn't support function-local types with generics
|
||||||
|
|
||||||
"typeparam/mdempsky/4.go", // -G=3 can't export functions with labeled breaks in loops
|
"typeparam/mdempsky/4.go", // -G=3 can't export functions with labeled breaks in loops
|
||||||
"typeparam/mdempsky/11.go", // types2/noder2 should give conversion error, because of "notinheap" mismatch
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var unifiedFailures = setOf(
|
var unifiedFailures = setOf(
|
||||||
|
|
Loading…
Reference in a new issue