diff options
| author | David Chase <drchase@google.com> | 2023-11-07 17:20:35 -0500 |
|---|---|---|
| committer | David Chase <drchase@google.com> | 2023-11-15 20:07:46 +0000 |
| commit | b5e31780b612c1317c9853f9e59df5c1bd0b3552 (patch) | |
| tree | d4aeef07ecf100d1f74e0db11bceab57e2f6fe2d /src/cmd/compile/internal/noder | |
| parent | 6f5aba995fdea76433337d1a8030518bdadfae28 (diff) | |
| download | go-b5e31780b612c1317c9853f9e59df5c1bd0b3552.tar.xz | |
cmd/compile: check for iteration after range func loop exit
When this happens, panic.
This is a revised version of a check that used #next,
where this one instead uses a per-loop #exit flag,
and catches more problematic iterators.
Updates #56413.
Updates #61405.
Change-Id: I6574f754e475bb67b9236b4f6c25979089f9b629
Reviewed-on: https://go-review.googlesource.com/c/go/+/540263
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Diffstat (limited to 'src/cmd/compile/internal/noder')
| -rw-r--r-- | src/cmd/compile/internal/noder/codes.go | 1 | ||||
| -rw-r--r-- | src/cmd/compile/internal/noder/reader.go | 4 | ||||
| -rw-r--r-- | src/cmd/compile/internal/noder/writer.go | 9 |
3 files changed, 14 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/noder/codes.go b/src/cmd/compile/internal/noder/codes.go index 88c10a74e7..8bdbfc9a88 100644 --- a/src/cmd/compile/internal/noder/codes.go +++ b/src/cmd/compile/internal/noder/codes.go @@ -62,6 +62,7 @@ const ( exprFuncInst exprRecv exprReshape + exprRuntimeBuiltin // a reference to a runtime function from transformed syntax. Followed by string name, e.g., "panicrangeexit" ) type codeAssign int diff --git a/src/cmd/compile/internal/noder/reader.go b/src/cmd/compile/internal/noder/reader.go index 3cd7b7c683..b4c2801e53 100644 --- a/src/cmd/compile/internal/noder/reader.go +++ b/src/cmd/compile/internal/noder/reader.go @@ -2442,6 +2442,10 @@ func (r *reader) expr() (res ir.Node) { n.SetTypecheck(1) } return n + + case exprRuntimeBuiltin: + builtin := typecheck.LookupRuntime(r.String()) + return builtin } } diff --git a/src/cmd/compile/internal/noder/writer.go b/src/cmd/compile/internal/noder/writer.go index ddbe2f84e4..46d5213694 100644 --- a/src/cmd/compile/internal/noder/writer.go +++ b/src/cmd/compile/internal/noder/writer.go @@ -1715,6 +1715,15 @@ func (w *writer) expr(expr syntax.Expr) { targs := inst.TypeArgs if tv, ok := w.p.maybeTypeAndValue(expr); ok { + if tv.IsRuntimeHelper() { + if pkg := obj.Pkg(); pkg != nil && pkg.Name() == "runtime" { + objName := obj.Name() + w.Code(exprRuntimeBuiltin) + w.String(objName) + return + } + } + if tv.IsType() { w.p.fatalf(expr, "unexpected type expression %v", syntax.String(expr)) } |
