]> Cypherpunks repositories - gostls13.git/commit
reflect: fix TypeAssert on nil interface values
authorJoe Tsai <joetsai@digital-static.net>
Fri, 27 Jun 2025 17:59:44 +0000 (10:59 -0700)
committerGopher Robot <gobot@golang.org>
Fri, 27 Jun 2025 23:34:47 +0000 (16:34 -0700)
commitf1e6ae2f6f5424f9f5c6dc915866d4f457c1483e
treecdbb82a774256a41b0ddbd38651d109b0b1c49df
parente81c624656e415626c7ac3a97768f5c2717979a4
reflect: fix TypeAssert on nil interface values

In the Go language a type assertion of a nil interface value
will always report false:

var err error
v, ok := err.(error) // always reports (nil, false)

Consequently, assertion on a reflect.Value.Interface()
will also report false:

var err error
rv := ValueOf(&err).Elem()
v, ok := rv.Interface().(error) // reports (nil, false)

However, prior to this change, a TypeAssert would report true:

var err error
rv := ValueOf(&err).Elem()
v, ok := TypeAssert[error](rv) // reports (nil, true)

when it should report false.

This fixes TypeAssert to match the Go language by
pushing the typ != v.typ check to the very end after
we have validated that neither v nor T are interface kinds.

Fixes #74404

Change-Id: Ie14d5cf18c8370c3e27ce4bdf4570c89519d8a16
Reviewed-on: https://go-review.googlesource.com/c/go/+/684675
Reviewed-by: Cherry Mui <cherryyz@google.com>
Auto-Submit: Joseph Tsai <joetsai@digital-static.net>
Reviewed-by: Mateusz Poliwczak <mpoliwczak34@gmail.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
src/reflect/all_test.go
src/reflect/value.go