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:
--- /dev/null
+// 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()
+}