aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2025-03-14 13:19:18 -0700
committerKeith Randall <khr@golang.org>2025-03-19 09:55:46 -0700
commitdeb6790fcfe943c640a4ef393036690eef5eef5c (patch)
tree9f683e750cdd3031f76bd5c4f67b44e35b0299f9 /src
parent56e5476e10db25ce71f562bd6ee0910a83532b04 (diff)
downloadgo-deb6790fcfe943c640a4ef393036690eef5eef5c.tar.xz
cmd/compile: remove implicit deref from len(p) where p is ptr-to-array
func f() *[4]int { return nil } _ = len(f()) should not panic. We evaluate f, but there isn't a dereference according to the spec (just "arg is evaluated"). Update #72844 Change-Id: Ia32cefc1b7aa091cd1c13016e015842b4d12d5b4 Reviewed-on: https://go-review.googlesource.com/c/go/+/658096 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Griesemer <gri@google.com> Reviewed-by: Keith Randall <khr@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/compile/internal/typecheck/expr.go6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/cmd/compile/internal/typecheck/expr.go b/src/cmd/compile/internal/typecheck/expr.go
index 2eec8d41ad..44a69f0332 100644
--- a/src/cmd/compile/internal/typecheck/expr.go
+++ b/src/cmd/compile/internal/typecheck/expr.go
@@ -634,16 +634,16 @@ func tcIndex(n *ir.IndexExpr) ir.Node {
func tcLenCap(n *ir.UnaryExpr) ir.Node {
n.X = Expr(n.X)
n.X = DefaultLit(n.X, nil)
- n.X = implicitstar(n.X)
l := n.X
t := l.Type()
if t == nil {
n.SetType(nil)
return n
}
-
var ok bool
- if n.Op() == ir.OLEN {
+ if t.IsPtr() && t.Elem().IsArray() {
+ ok = true
+ } else if n.Op() == ir.OLEN {
ok = okforlen[t.Kind()]
} else {
ok = okforcap[t.Kind()]