diff options
| author | Dan Scales <danscales@google.com> | 2021-07-08 12:07:01 -0700 |
|---|---|---|
| committer | Dan Scales <danscales@google.com> | 2021-07-09 16:14:34 +0000 |
| commit | 04acb8a7b9fc0212687cc25aa2598d12f6aceb74 (patch) | |
| tree | f0dc8d7577cad2527cf7abc9261f519350199c54 /src/cmd/compile/internal/noder/transform.go | |
| parent | 2b1d70a137481c0b9f652950f1ac3570f24f68b8 (diff) | |
| download | go-04acb8a7b9fc0212687cc25aa2598d12f6aceb74.tar.xz | |
[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>
Diffstat (limited to 'src/cmd/compile/internal/noder/transform.go')
| -rw-r--r-- | src/cmd/compile/internal/noder/transform.go | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/cmd/compile/internal/noder/transform.go b/src/cmd/compile/internal/noder/transform.go index e02b7e758d..efbc8f68ce 100644 --- a/src/cmd/compile/internal/noder/transform.go +++ b/src/cmd/compile/internal/noder/transform.go @@ -85,7 +85,15 @@ func stringtoruneslit(n *ir.ConvExpr) ir.Node { // etc. Corresponds to typecheck.tcConv. func transformConv(n *ir.ConvExpr) ir.Node { 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) switch n.Op() { case ir.OCONVNOP: |
