aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/noder
diff options
context:
space:
mode:
authorDavid Chase <drchase@google.com>2023-11-07 17:20:35 -0500
committerDavid Chase <drchase@google.com>2023-11-15 20:07:46 +0000
commitb5e31780b612c1317c9853f9e59df5c1bd0b3552 (patch)
treed4aeef07ecf100d1f74e0db11bceab57e2f6fe2d /src/cmd/compile/internal/noder
parent6f5aba995fdea76433337d1a8030518bdadfae28 (diff)
downloadgo-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.go1
-rw-r--r--src/cmd/compile/internal/noder/reader.go4
-rw-r--r--src/cmd/compile/internal/noder/writer.go9
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))
}