blob: ebc910113551d24504e2a776399513798fb12070 [file] [log] [blame]
Håvard Haugenf482a0f2015-09-15 21:43:53 +02001// Copyright 2015 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package gc
6
Håvard Haugen6d017832015-09-19 23:55:27 +02007import (
8 "reflect"
9 "testing"
10)
Håvard Haugenf482a0f2015-09-15 21:43:53 +020011
12// Test all code paths for cmpstackvarlt.
13func TestCmpstackvar(t *testing.T) {
14 testdata := []struct {
15 a, b Node
16 lt bool
17 }{
18 {
19 Node{Class: PAUTO},
20 Node{Class: PFUNC},
21 false,
22 },
23 {
24 Node{Class: PFUNC},
25 Node{Class: PAUTO},
26 true,
27 },
28 {
29 Node{Class: PFUNC, Xoffset: 0},
30 Node{Class: PFUNC, Xoffset: 10},
31 true,
32 },
33 {
34 Node{Class: PFUNC, Xoffset: 20},
35 Node{Class: PFUNC, Xoffset: 10},
36 false,
37 },
38 {
39 Node{Class: PFUNC, Xoffset: 10},
40 Node{Class: PFUNC, Xoffset: 10},
41 false,
42 },
43 {
44 Node{Class: PAUTO, Used: true},
45 Node{Class: PAUTO, Used: false},
46 true,
47 },
48 {
49 Node{Class: PAUTO, Used: false},
50 Node{Class: PAUTO, Used: true},
51 false,
52 },
53 {
54 Node{Class: PAUTO, Type: &Type{Haspointers: 1}}, // haspointers -> false
55 Node{Class: PAUTO, Type: &Type{Haspointers: 2}}, // haspointers -> true
56 false,
57 },
58 {
59 Node{Class: PAUTO, Type: &Type{Haspointers: 2}}, // haspointers -> true
60 Node{Class: PAUTO, Type: &Type{Haspointers: 1}}, // haspointers -> false
61 true,
62 },
63 {
64 Node{Class: PAUTO, Type: &Type{}, Name: &Name{Needzero: true}},
65 Node{Class: PAUTO, Type: &Type{}, Name: &Name{Needzero: false}},
66 true,
67 },
68 {
69 Node{Class: PAUTO, Type: &Type{}, Name: &Name{Needzero: false}},
70 Node{Class: PAUTO, Type: &Type{}, Name: &Name{Needzero: true}},
71 false,
72 },
73 {
74 Node{Class: PAUTO, Type: &Type{Width: 1}, Name: &Name{}},
75 Node{Class: PAUTO, Type: &Type{Width: 2}, Name: &Name{}},
76 false,
77 },
78 {
79 Node{Class: PAUTO, Type: &Type{Width: 2}, Name: &Name{}},
80 Node{Class: PAUTO, Type: &Type{Width: 1}, Name: &Name{}},
81 true,
82 },
83 {
84 Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "abc"}},
85 Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "xyz"}},
86 true,
87 },
88 {
89 Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "abc"}},
90 Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "abc"}},
91 false,
92 },
93 {
94 Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "xyz"}},
95 Node{Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "abc"}},
96 false,
97 },
98 }
99 for _, d := range testdata {
100 got := cmpstackvarlt(&d.a, &d.b)
101 if got != d.lt {
102 t.Errorf("want %#v < %#v", d.a, d.b)
103 }
104 }
105}
Håvard Haugen6d017832015-09-19 23:55:27 +0200106
107func slice2nodelist(s []*Node) *NodeList {
108 var nl *NodeList
109 for _, n := range s {
110 nl = list(nl, n)
111 }
112 return nl
113}
114
115func nodelist2slice(nl *NodeList) []*Node {
116 var s []*Node
117 for l := nl; l != nil; l = l.Next {
118 s = append(s, l.N)
119 }
120 return s
121}
122
123func TestListsort(t *testing.T) {
124 inp := []*Node{
125 {Class: PFUNC, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
126 {Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
127 {Class: PFUNC, Xoffset: 0, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
128 {Class: PFUNC, Xoffset: 10, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
129 {Class: PFUNC, Xoffset: 20, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
130 {Class: PAUTO, Used: true, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
131 {Class: PAUTO, Type: &Type{Haspointers: 1}, Name: &Name{}, Sym: &Sym{}}, // haspointers -> false
132 {Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
133 {Class: PAUTO, Type: &Type{}, Name: &Name{Needzero: true}, Sym: &Sym{}},
134 {Class: PAUTO, Type: &Type{Width: 1}, Name: &Name{}, Sym: &Sym{}},
135 {Class: PAUTO, Type: &Type{Width: 2}, Name: &Name{}, Sym: &Sym{}},
136 {Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "abc"}},
137 {Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "xyz"}},
138 }
139 want := []*Node{
140 {Class: PFUNC, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
141 {Class: PFUNC, Xoffset: 0, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
142 {Class: PFUNC, Xoffset: 10, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
143 {Class: PFUNC, Xoffset: 20, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
144 {Class: PAUTO, Used: true, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
145 {Class: PAUTO, Type: &Type{}, Name: &Name{Needzero: true}, Sym: &Sym{}},
146 {Class: PAUTO, Type: &Type{Width: 2}, Name: &Name{}, Sym: &Sym{}},
147 {Class: PAUTO, Type: &Type{Width: 1}, Name: &Name{}, Sym: &Sym{}},
148 {Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
149 {Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{}},
150 {Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "abc"}},
151 {Class: PAUTO, Type: &Type{}, Name: &Name{}, Sym: &Sym{Name: "xyz"}},
152 {Class: PAUTO, Type: &Type{Haspointers: 1}, Name: &Name{}, Sym: &Sym{}}, // haspointers -> false
153 }
154 // haspointers updates Type.Haspointers as a side effect, so
155 // exercise this function on all inputs so that reflect.DeepEqual
156 // doesn't produce false positives.
157 for i := range want {
158 haspointers(want[i].Type)
159 haspointers(inp[i].Type)
160 }
161
162 nl := slice2nodelist(inp)
163 listsort(&nl, cmpstackvarlt)
164 got := nodelist2slice(nl)
165 if !reflect.DeepEqual(want, got) {
166 t.Error("listsort failed")
167 for i := range got {
168 g := got[i]
169 w := want[i]
170 eq := reflect.DeepEqual(w, g)
171 if !eq {
172 t.Log(i, w, g)
173 }
174 }
175 }
176}