golang/go
View on GitHubcmd/compile: extra bounds check when accessing string using index from range over its runes
Open
#76354 opened on Nov 19, 2025
BugReportNeedsInvestigationPerformancecompiler/runtimehelp wanted
Description
Go version
go version go1.26-devel_e1a12c7 Mon Nov 17 13:45:54 2025 -0800 linux/amd64
Output of go env in your module/workspace:
Workspace is `go.godbolt.org` on `x86-64 gc (tip)` as above.
What did you do?
Compile this simple example from the standard library:
func hasUpperCase(s string) bool {
for i := range s {
if 'A' <= s[i] && s[i] <= 'Z' {
return true
}
}
return false
}
(As an aside: is there a reason why the above doesn't iterate over the bytes of s instead?)
What did you see happen?
Extra bounds check on s[i], even though per-spec i should still always be 0 <= i < len(s) even on invalid UTF-8.
What did you expect to see?
No extra bounds checks.
This also appears elsewhere in the standard library, such as strings.ToValidUTF8, fmt.truncateString, and time.tzsetNum.