// autolabel generates a new Name node for use with
// an automatically generated label.
-// prefix is a short mnemonic (e.g. "s" for switch)
+// prefix is a short mnemonic (e.g. ".s" for switch)
// to help with debugging.
+// It should begin with "." to avoid conflicts with
+// user labels.
func autolabel(prefix string) *Node {
+ if prefix[0] != '.' {
+ Fatalf("autolabel prefix must start with '.', have %q", prefix)
+ }
fn := Curfn
if Curfn == nil {
Fatalf("autolabel outside function")
}
n := fn.Func.Label
fn.Func.Label++
- return newname(LookupN("."+prefix, int(n)))
+ return newname(LookupN(prefix, int(n)))
}
var initSyms []*Sym
n.Op = OCASE
needvar := n.List.Len() != 1 || n.List.First().Op == OLITERAL
- jmp := Nod(OGOTO, autolabel("s"), nil)
+ jmp := Nod(OGOTO, autolabel(".s"), nil)
if n.List.Len() == 0 {
if def != nil {
Yyerror("more than one default case")
i.Nbody.Set1(typenil)
} else {
// Jump to default case.
- lbl := autolabel("s")
+ lbl := autolabel(".s")
i.Nbody.Set1(Nod(OGOTO, lbl, nil))
// Wrap default case with label.
blk := Nod(OBLOCK, nil, nil)