|  | // 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() | 
|  | } |