"abc"[1] is not like 'b', in that -"abc"[1] is uint8 math, not ideal constant math.
Delay the constantification until after ideal constant folding is over.
Fixes #11370.
Change-Id: Iba2fc00ca2455959e7bab8f4b8b4aac14b1f9858
Reviewed-on: https://go-review.googlesource.com/15740
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
case OINDEX:
switch {
case n.Left.Type.IsString():
+ if n.Bounded && Isconst(n.Left, CTSTR) && Isconst(n.Right, CTINT) {
+ // Replace "abc"[1] with 'b'.
+ // Delayed until now because "abc"[1] is not an ideal constant.
+ // See test/fixedbugs/issue11370.go.
+ return s.newValue0I(ssa.OpConst8, Types[TUINT8], int64(int8(n.Left.Val().U.(string)[n.Right.Int64()])))
+ }
a := s.expr(n.Left)
i := s.expr(n.Right)
i = s.extendIndex(i, panicindex)
if Debug['m'] != 0 && n.Bounded && !Isconst(n.Right, CTINT) {
Warn("index bounds check elided")
}
- if smallintconst(n.Right) {
- if !n.Bounded {
- yyerror("index out of bounds")
- } else {
- // replace "abc"[1] with 'b'.
- // delayed until now because "abc"[1] is not
- // an ideal constant.
- v := n.Right.Int64()
-
- Nodconst(n, n.Type, int64(n.Left.Val().U.(string)[v]))
- n.Typecheck = 1
- }
+ if smallintconst(n.Right) && !n.Bounded {
+ yyerror("index out of bounds")
}
}
--- /dev/null
+// compile
+
+// Copyright 2015 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// issue 11370: cmd/compile: "0"[0] should not be a constant
+
+package p
+
+func main() {
+ println(-"abc"[1] >> 1)
+}