GoPLS Viewer

Home|gopls/go/pointer/testdata/maps.go
1//go:build ignore
2// +build ignore
3
4package main
5
6// Test of maps.
7
8var abc int
9
10func maps1() {
11    m1 := map[*int]*int{&a: &b// @line m1m1
12    m2 := make(map[*int]*int)   // @line m1m2
13    m2[&b] = &a
14
15    print(m1[nil]) // @pointsto command-line-arguments.b | command-line-arguments.c
16    print(m2[nil]) // @pointsto command-line-arguments.a
17
18    print(m1// @pointsto makemap@m1m1:21
19    print(m2// @pointsto makemap@m1m2:12
20
21    m1[&b] = &c
22
23    for kv := range m1 {
24        print(k// @pointsto command-line-arguments.a | command-line-arguments.b
25        print(v// @pointsto command-line-arguments.b | command-line-arguments.c
26    }
27
28    for kv := range m2 {
29        print(k// @pointsto command-line-arguments.b
30        print(v// @pointsto command-line-arguments.a
31    }
32
33    // Lookup doesn't create any aliases.
34    print(m2[&c]) // @pointsto command-line-arguments.a
35    if _ok := m2[&a]; ok {
36        print(m2[&c]) // @pointsto command-line-arguments.a
37    }
38}
39
40func maps2() {
41    m1 := map[*int]*int{&a: &b}
42    m2 := map[*int]*int{&b: &c}
43    _ = []map[*int]*int{m1m2// (no spurious merging of m1, m2)
44
45    print(m1[nil]) // @pointsto command-line-arguments.b
46    print(m2[nil]) // @pointsto command-line-arguments.c
47}
48
49var g int
50
51func maps3() {
52    // Regression test for a constraint generation bug for map range
53    // loops in which the key is unused: the (ok, k, v) tuple
54    // returned by ssa.Next may have type 'invalid' for the k and/or
55    // v components, so copying the map key or value may cause
56    // miswiring if the key has >1 components.  In the worst case,
57    // this causes a crash.  The test below used to report that
58    // pts(v) includes not just command-line-arguments.g but new(float64) too, which
59    // is ill-typed.
60
61    // sizeof(K) > 1, abstractly
62    type K struct{ abcd *float64 }
63    k := K{new(float64), nilnilnil}
64    m := map[K]*int{k: &g}
65
66    for _v := range m {
67        print(v// @pointsto command-line-arguments.g
68    }
69}
70
71var v float64
72
73func maps4() {
74    // Regression test for generating constraints for cases of key and values
75    // being blank identifiers or different types assignable from the
76    // corresponding map types in a range stmt.
77    type K struct{ a *float64 }
78    k := K{&v}
79    m := map[K]*int{k: &g}
80
81    for xy := range m {
82        print(x.a// @pointsto command-line-arguments.v
83        print(y)   // @pointsto command-line-arguments.g
84    }
85    var i struct{ a *float64 }
86    for i_ = range m {
87        print(i.a// @pointsto command-line-arguments.v
88    }
89    var j interface{}
90    for _j = range m {
91        // TODO support the statement `print(j.(*int))`
92        print(j// @pointsto command-line-arguments.g
93    }
94    for __ = range m {
95    }
96    // do something after 'for _, _ =' to exercise the
97    // effects of indexing
98    for _j = range m {
99        // TODO support the statement `print(j.(*int))`
100        print(j// @pointsto command-line-arguments.g
101    }
102}
103
104func main() {
105    maps1()
106    maps2()
107    maps3()
108    maps4()
109}
110
MembersX
maps3
maps3.K.b
maps3.K
maps4
maps4.K
maps1.RangeStmt_433.v
maps1.RangeStmt_613.k
maps4.m
maps4.RangeStmt_2411.j
maps3.K.a
v
maps2.m2
maps3.K.c
maps4.k
maps4.RangeStmt_2160.y
maps1.m1
maps1.RangeStmt_613.v
maps3.RangeStmt_1799.v
maps4.K.a
maps4.RangeStmt_2316.i
maps4.RangeStmt_2636.j
maps1.m2
maps2.m1
maps3.K.d
maps3.m
maps4.RangeStmt_2160.x
maps2
maps3.k
maps1
maps1.RangeStmt_433.k
Members
X