code: func (f *flowBuf) gotosObeyScopes(a *compiler) {
  	for pos, src := range f.gotos {
  		tgt := f.labels[src.target]
  
  		// The target block must be a parent of this block
  		numVars := src.numVars
  		b := src.block
  		for len(numVars) > 0 && b != tgt.block {
  			b = b.outer
  			numVars = numVars[1:]
  		}
  		if b != tgt.block {
  			// We jumped into a deeper block
  			a.diagAt(pos, "goto causes variables to come into scope")
  			return
  		}
  
  		// There must be no variables in the target block that
  		// did not exist at the jump
  		tgtNumVars := tgt.numVars
  		for i := range numVars {
  			if tgtNumVars[i] > numVars[i] {
  				a.diagAt(pos, "goto causes variables to come into scope")
  				return
  			}
  		}
  	}
  }
docs: // gotosObeyScopes returns true if no goto statement causes any
  // variables to come into scope that were not in scope at the point of
  // the goto.  Reports any errors using the given compiler.