Home | History | Annotate | Download | only in test
      1 // errorcheck
      2 
      3 // Copyright 2011 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 
      7 // Verify that erroneous labels are caught by the compiler.
      8 // This set is caught by pass 2. That's why this file is label1.go.
      9 // Does not compile.
     10 
     11 package main
     12 
     13 var x int
     14 
     15 func f() {
     16 L1:
     17 	for {
     18 		if x == 0 {
     19 			break L1
     20 		}
     21 		if x == 1 {
     22 			continue L1
     23 		}
     24 		goto L1
     25 	}
     26 
     27 L2:
     28 	select {
     29 	default:
     30 		if x == 0 {
     31 			break L2
     32 		}
     33 		if x == 1 {
     34 			continue L2 // ERROR "invalid continue label .*L2|continue is not in a loop"
     35 		}
     36 		goto L2
     37 	}
     38 
     39 	for {
     40 		if x == 1 {
     41 			continue L2 // ERROR "invalid continue label .*L2"
     42 		}
     43 	}
     44 
     45 L3:
     46 	switch {
     47 	case x > 10:
     48 		if x == 11 {
     49 			break L3
     50 		}
     51 		if x == 12 {
     52 			continue L3 // ERROR "invalid continue label .*L3|continue is not in a loop"
     53 		}
     54 		goto L3
     55 	}
     56 
     57 L4:
     58 	if true {
     59 		if x == 13 {
     60 			break L4 // ERROR "invalid break label .*L4"
     61 		}
     62 		if x == 14 {
     63 			continue L4 // ERROR "invalid continue label .*L4|continue is not in a loop"
     64 		}
     65 		if x == 15 {
     66 			goto L4
     67 		}
     68 	}
     69 
     70 L5:
     71 	f()
     72 	if x == 16 {
     73 		break L5 // ERROR "invalid break label .*L5"
     74 	}
     75 	if x == 17 {
     76 		continue L5 // ERROR "invalid continue label .*L5|continue is not in a loop"
     77 	}
     78 	if x == 18 {
     79 		goto L5
     80 	}
     81 
     82 	for {
     83 		if x == 19 {
     84 			break L1 // ERROR "invalid break label .*L1"
     85 		}
     86 		if x == 20 {
     87 			continue L1 // ERROR "invalid continue label .*L1"
     88 		}
     89 		if x == 21 {
     90 			goto L1
     91 		}
     92 	}
     93 
     94 	continue // ERROR "continue is not in a loop"
     95 	for {
     96 		continue on // ERROR "continue label not defined: on"
     97 	}
     98 
     99 	break // ERROR "break is not in a loop"
    100 	for {
    101 		break dance // ERROR "break label not defined: dance"
    102 	}
    103 
    104 	for {
    105 		switch x {
    106 		case 1:
    107 			continue
    108 		}
    109 	}
    110 }
    111