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