github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/compile/test/testdata/break_test.go (about)

     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  
     7  package main
     8  
     9  import "testing"
    10  
    11  func 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  
    22  func continueLabeled_ssa() int {
    23  	var n int
    24  Next:
    25  	for i := 0; i < 10; i++ {
    26  		if i == 6 {
    27  			continue Next
    28  		}
    29  		n = i
    30  	}
    31  	return n
    32  }
    33  
    34  func 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  
    48  func 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  
    63  func continueLabeledOuter_ssa() int {
    64  	var n int
    65  Next:
    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  
    78  func 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  
    89  func breakLabeled_ssa() int {
    90  	var n int
    91  Next:
    92  	for i := 0; i < 10; i++ {
    93  		if i == 6 {
    94  			break Next
    95  		}
    96  		n = i
    97  	}
    98  	return n
    99  }
   100  
   101  func 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  
   115  func 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  
   130  func breakLabeledOuter_ssa() int {
   131  	var n int
   132  Next:
   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  
   145  var g, h int // globals to ensure optimizations don't collapse our switch statements
   146  
   147  func 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  
   158  func switchLabeled_ssa() int {
   159  	var n int
   160  Done:
   161  	switch g {
   162  	case 0:
   163  		n = 1
   164  		break Done
   165  		n = 2
   166  	}
   167  	return n
   168  }
   169  
   170  func 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  
   185  func 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  
   201  func switchLabeledOuter_ssa() int {
   202  	var n int
   203  Done:
   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.
   218  func 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  }