• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// 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
5// Tests continue and break.
6
7package main
8
9import "testing"
10
11func continuePlain_ssa() int {
12	var n int
13	for i := 0; i < 10; i++ {
14		if i == 6 {
15			continue
16		}
17		n = i
18	}
19	return n
20}
21
22func continueLabeled_ssa() int {
23	var n int
24Next:
25	for i := 0; i < 10; i++ {
26		if i == 6 {
27			continue Next
28		}
29		n = i
30	}
31	return n
32}
33
34func continuePlainInner_ssa() int {
35	var n int
36	for j := 0; j < 30; j += 10 {
37		for i := 0; i < 10; i++ {
38			if i == 6 {
39				continue
40			}
41			n = i
42		}
43		n += j
44	}
45	return n
46}
47
48func continueLabeledInner_ssa() int {
49	var n int
50	for j := 0; j < 30; j += 10 {
51	Next:
52		for i := 0; i < 10; i++ {
53			if i == 6 {
54				continue Next
55			}
56			n = i
57		}
58		n += j
59	}
60	return n
61}
62
63func continueLabeledOuter_ssa() int {
64	var n int
65Next:
66	for j := 0; j < 30; j += 10 {
67		for i := 0; i < 10; i++ {
68			if i == 6 {
69				continue Next
70			}
71			n = i
72		}
73		n += j
74	}
75	return n
76}
77
78func breakPlain_ssa() int {
79	var n int
80	for i := 0; i < 10; i++ {
81		if i == 6 {
82			break
83		}
84		n = i
85	}
86	return n
87}
88
89func breakLabeled_ssa() int {
90	var n int
91Next:
92	for i := 0; i < 10; i++ {
93		if i == 6 {
94			break Next
95		}
96		n = i
97	}
98	return n
99}
100
101func breakPlainInner_ssa() int {
102	var n int
103	for j := 0; j < 30; j += 10 {
104		for i := 0; i < 10; i++ {
105			if i == 6 {
106				break
107			}
108			n = i
109		}
110		n += j
111	}
112	return n
113}
114
115func breakLabeledInner_ssa() int {
116	var n int
117	for j := 0; j < 30; j += 10 {
118	Next:
119		for i := 0; i < 10; i++ {
120			if i == 6 {
121				break Next
122			}
123			n = i
124		}
125		n += j
126	}
127	return n
128}
129
130func breakLabeledOuter_ssa() int {
131	var n int
132Next:
133	for j := 0; j < 30; j += 10 {
134		for i := 0; i < 10; i++ {
135			if i == 6 {
136				break Next
137			}
138			n = i
139		}
140		n += j
141	}
142	return n
143}
144
145var g, h int // globals to ensure optimizations don't collapse our switch statements
146
147func switchPlain_ssa() int {
148	var n int
149	switch g {
150	case 0:
151		n = 1
152		break
153		n = 2
154	}
155	return n
156}
157
158func switchLabeled_ssa() int {
159	var n int
160Done:
161	switch g {
162	case 0:
163		n = 1
164		break Done
165		n = 2
166	}
167	return n
168}
169
170func switchPlainInner_ssa() int {
171	var n int
172	switch g {
173	case 0:
174		n = 1
175		switch h {
176		case 0:
177			n += 10
178			break
179		}
180		n = 2
181	}
182	return n
183}
184
185func switchLabeledInner_ssa() int {
186	var n int
187	switch g {
188	case 0:
189		n = 1
190	Done:
191		switch h {
192		case 0:
193			n += 10
194			break Done
195		}
196		n = 2
197	}
198	return n
199}
200
201func switchLabeledOuter_ssa() int {
202	var n int
203Done:
204	switch g {
205	case 0:
206		n = 1
207		switch h {
208		case 0:
209			n += 10
210			break Done
211		}
212		n = 2
213	}
214	return n
215}
216
217// TestBreakContinue tests that continue and break statements do what they say.
218func TestBreakContinue(t *testing.T) {
219	tests := [...]struct {
220		name string
221		fn   func() int
222		want int
223	}{
224		{"continuePlain_ssa", continuePlain_ssa, 9},
225		{"continueLabeled_ssa", continueLabeled_ssa, 9},
226		{"continuePlainInner_ssa", continuePlainInner_ssa, 29},
227		{"continueLabeledInner_ssa", continueLabeledInner_ssa, 29},
228		{"continueLabeledOuter_ssa", continueLabeledOuter_ssa, 5},
229
230		{"breakPlain_ssa", breakPlain_ssa, 5},
231		{"breakLabeled_ssa", breakLabeled_ssa, 5},
232		{"breakPlainInner_ssa", breakPlainInner_ssa, 25},
233		{"breakLabeledInner_ssa", breakLabeledInner_ssa, 25},
234		{"breakLabeledOuter_ssa", breakLabeledOuter_ssa, 5},
235
236		{"switchPlain_ssa", switchPlain_ssa, 1},
237		{"switchLabeled_ssa", switchLabeled_ssa, 1},
238		{"switchPlainInner_ssa", switchPlainInner_ssa, 2},
239		{"switchLabeledInner_ssa", switchLabeledInner_ssa, 2},
240		{"switchLabeledOuter_ssa", switchLabeledOuter_ssa, 11},
241
242		// no select tests; they're identical to switch
243	}
244
245	for _, test := range tests {
246		if got := test.fn(); got != test.want {
247			t.Errorf("%s()=%d, want %d", test.name, got, test.want)
248		}
249	}
250}
251