1// run
2
3// Copyright 2017 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7package main
8
9import (
10	"fmt"
11)
12
13type PI struct {
14	Enabled bool
15}
16
17type SI struct {
18	M map[string]*PI
19}
20
21//go:noinline
22func (s *SI) test(name string) (*int, error) {
23	n := new(int)
24	*n = 99
25	if err := addUpdate(n, s.M[name].Enabled, "enabled"); err != nil { // this was miscompiled
26		return nil, fmt.Errorf(" error adding update for enable flag %t : %s",
27			s.M[name].Enabled, err)
28	}
29	return n, nil
30}
31
32//go:noinline
33func addUpdate(n *int, in interface{}, s ...string) error {
34	if *n != 99 {
35		println("FAIL, *n should be 99, not", *n)
36	}
37	return nil
38}
39
40func main1() {
41	s := &SI{make(map[string]*PI)}
42	s.M["dog"] = &PI{}
43	s.test("dog")
44}
45
46//go:noinline
47func g(b *byte, i interface{}) error {
48	if *b != 17 {
49		println("FAIL, *b should be 17, not", *b)
50	}
51	return nil
52}
53
54//go:noinline
55func f(x *byte, m map[string]*bool) {
56	if err := g(x, *m["hello"]); err != nil { // this was miscompiled
57		return
58	}
59}
60
61func main2() {
62	m := make(map[string]*bool)
63	x := false
64	m["hello"] = &x
65	b := byte(17)
66	f(&b, m)
67}
68
69func main() {
70	main2()
71	main1()
72}
73