]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: added cheapexpr call to simplify operand of CONVIFACE
authorDavid Chase <drchase@google.com>
Fri, 24 Feb 2017 22:21:54 +0000 (17:21 -0500)
committerDavid Chase <drchase@google.com>
Sat, 25 Feb 2017 04:53:23 +0000 (04:53 +0000)
New special case for booleans and byte-sized integer types
converted to interfaces needs to ensure that the operand is
not too complex, if it were to appear in a parameter list
for example.

Added test, also increased the recursive node dump depth to
a level that was actually useful for an actual bug.

Fixes #19275.

Change-Id: If36ac3115edf439e886703f32d149ee0a46eb2a5
Reviewed-on: https://go-review.googlesource.com/37470
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
src/cmd/compile/internal/gc/fmt.go
src/cmd/compile/internal/gc/walk.go
test/fixedbugs/issue19275.go [new file with mode: 0644]

index fffa26126957e69c9bb2b3c07ac428ba10a9115a..80136685ca83508a45a4f538f75c386578b349b6 100644 (file)
@@ -1486,7 +1486,7 @@ func (n *Node) nodedump(s fmt.State, flag FmtFlag) {
 
        if recur {
                indent(s)
-               if dumpdepth > 10 {
+               if dumpdepth > 40 {
                        fmt.Fprint(s, "...")
                        return
                }
index ce4d62b82c6a1bbece6171e60963eff8fbe592cf..38039e3e1063dd1f490814ba37cd22b13fcfe535 100644 (file)
@@ -886,6 +886,7 @@ opswitch:
                        value = zerobase
                case n.Left.Type.IsBoolean() || (n.Left.Type.Size() == 1 && n.Left.Type.IsInteger()):
                        // n.Left is a bool/byte. Use staticbytes[n.Left].
+                       n.Left = cheapexpr(n.Left, init)
                        value = nod(OINDEX, staticbytes, byteindex(n.Left))
                        value.Bounded = true
                case n.Left.Class == PEXTERN && n.Left.Name != nil && n.Left.Name.Readonly:
diff --git a/test/fixedbugs/issue19275.go b/test/fixedbugs/issue19275.go
new file mode 100644 (file)
index 0000000..f7e64fc
--- /dev/null
@@ -0,0 +1,72 @@
+// run
+
+// Copyright 2017 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.
+
+package main
+
+import (
+       "fmt"
+)
+
+type PI struct {
+       Enabled bool
+}
+
+type SI struct {
+       M map[string]*PI
+}
+
+//go:noinline
+func (s *SI) test(name string) (*int, error) {
+       n := new(int)
+       *n = 99
+       if err := addUpdate(n, s.M[name].Enabled, "enabled"); err != nil { // this was miscompiled
+               return nil, fmt.Errorf(" error adding update for enable flag %t : %s",
+                       s.M[name].Enabled, err)
+       }
+       return n, nil
+}
+
+//go:noinline
+func addUpdate(n *int, in interface{}, s ...string) error {
+       if *n != 99 {
+               println("FAIL, *n should be 99, not", *n)
+       }
+       return nil
+}
+
+func main1() {
+       s := &SI{make(map[string]*PI)}
+       s.M["dog"] = &PI{}
+       s.test("dog")
+}
+
+//go:noinline
+func g(b *byte, i interface{}) error {
+       if *b != 17 {
+               println("FAIL, *b should be 17, not", *b)
+       }
+       return nil
+}
+
+//go:noinline
+func f(x *byte, m map[string]*bool) {
+       if err := g(x, *m["hello"]); err != nil { // this was miscompiled
+               return
+       }
+}
+
+func main2() {
+       m := make(map[string]*bool)
+       x := false
+       m["hello"] = &x
+       b := byte(17)
+       f(&b, m)
+}
+
+func main() {
+       main2()
+       main1()
+}