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