Skip to content

Commit

Permalink
cmd/compile: "abc"[1] is not an ideal constant
Browse files Browse the repository at this point in the history
"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 <[email protected]>
Reviewed-by: Russ Cox <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
  • Loading branch information
anthonycanino1 authored and rsc committed Oct 13, 2016
1 parent 0da30d5 commit 26c7b4f
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 12 deletions.
6 changes: 6 additions & 0 deletions src/cmd/compile/internal/gc/ssa.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
14 changes: 2 additions & 12 deletions src/cmd/compile/internal/gc/walk.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
}

Expand Down
13 changes: 13 additions & 0 deletions test/fixedbugs/issue11370.go
Original file line number Diff line number Diff line change
@@ -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)
}

0 comments on commit 26c7b4f

Please sign in to comment.