// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // This file is a modified concatenation of the files // $GOROOT/test/label.go and $GOROOT/test/label1.go. package labels var x int func f0() { L1 /* ERROR "label L1 declared and not used" */ : for { } L2 /* ERROR "label L2 declared and not used" */ : select { } L3 /* ERROR "label L3 declared and not used" */ : switch { } L4 /* ERROR "label L4 declared and not used" */ : if true { } L5 /* ERROR "label L5 declared and not used" */ : f0() L6: f0() L6 /* ERROR "label L6 already declared" */ : f0() if x == 20 { goto L6 } L7: for { break L7 break L8 /* ERROR "invalid break label L8" */ } // A label must be directly associated with a switch, select, or // for statement; it cannot be the label of a labeled statement. L7a /* ERROR "declared and not used" */ : L7b: for { break L7a /* ERROR "invalid break label L7a" */ continue L7a /* ERROR "invalid continue label L7a" */ continue L7b } L8: for { if x == 21 { continue L8 continue L7 /* ERROR "invalid continue label L7" */ } } L9: switch { case true: break L9 defalt /* ERROR "label defalt declared and not used" */ : } L10: select { default: break L10 break L9 /* ERROR "invalid break label L9" */ } goto L10a L10a: L10b: select { default: break L10a /* ERROR "invalid break label L10a" */ break L10b continue L10b /* ERROR "invalid continue label L10b" */ } } func f1() { L1: for { if x == 0 { break L1 } if x == 1 { continue L1 } goto L1 } L2: select { default: if x == 0 { break L2 } if x == 1 { continue L2 /* ERROR "invalid continue label L2" */ } goto L2 } L3: switch { case x > 10: if x == 11 { break L3 } if x == 12 { continue L3 /* ERROR "invalid continue label L3" */ } goto L3 } L4: if true { if x == 13 { break L4 /* ERROR "invalid break label L4" */ } if x == 14 { continue L4 /* ERROR "invalid continue label L4" */ } if x == 15 { goto L4 } } L5: f1() if x == 16 { break L5 /* ERROR "invalid break label L5" */ } if x == 17 { continue L5 /* ERROR "invalid continue label L5" */ } if x == 18 { goto L5 } for { if x == 19 { break L1 /* ERROR "invalid break label L1" */ } if x == 20 { continue L1 /* ERROR "invalid continue label L1" */ } if x == 21 { goto L1 } } } // Additional tests not in the original files. func f2() { L1 /* ERROR "label L1 declared and not used" */ : if x == 0 { for { continue L1 /* ERROR "invalid continue label L1" */ } } } func f3() { L1: L2: L3: for { break L1 /* ERROR "invalid break label L1" */ break L2 /* ERROR "invalid break label L2" */ break L3 continue L1 /* ERROR "invalid continue label L1" */ continue L2 /* ERROR "invalid continue label L2" */ continue L3 goto L1 goto L2 goto L3 } } // Blank labels are never declared. func f4() { _: _: // multiple blank labels are ok goto _ /* ERROR "label _ not declared" */ } func f5() { _: for { break _ /* ERROR "invalid break label _" */ continue _ /* ERROR "invalid continue label _" */ } } func f6() { _: switch { default: break _ /* ERROR "invalid break label _" */ } }