mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00:00
cmd/compile: "abc"[1] is not an ideal constant
"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>
This commit is contained in:
parent
0da30d5cbd
commit
26c7b4fb1e
|
@ -1941,6 +1941,12 @@ func (s *state) expr(n *Node) *ssa.Value {
|
|||
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)
|
||||
|
|
|
@ -1263,18 +1263,8 @@ opswitch:
|
|||
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")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
13
test/fixedbugs/issue11370.go
Normal file
13
test/fixedbugs/issue11370.go
Normal file
|
@ -0,0 +1,13 @@
|
|||
// 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)
|
||||
}
|
Loading…
Reference in a new issue