|  | // run | 
|  |  | 
|  | // 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. | 
|  |  | 
|  | package main | 
|  |  | 
|  | import ( | 
|  | "runtime" | 
|  | "strings" | 
|  | ) | 
|  |  | 
|  | func f() { | 
|  | var x *string | 
|  |  | 
|  | for _, i := range *x {  // THIS IS LINE 17 | 
|  | println(i) | 
|  | } | 
|  | } | 
|  |  | 
|  | func g() { | 
|  | } | 
|  |  | 
|  | func main() { | 
|  | defer func() { | 
|  | for i := 0;; i++ { | 
|  | pc, file, line, ok := runtime.Caller(i) | 
|  | if !ok { | 
|  | print("BUG: bug348: cannot find caller\n") | 
|  | return | 
|  | } | 
|  | if !strings.Contains(file, "bug348.go") || runtime.FuncForPC(pc).Name() != "main.f" { | 
|  | // walk past runtime frames | 
|  | continue | 
|  | } | 
|  | if line != 17 { | 
|  | print("BUG: bug348: panic at ", file, ":", line, " in ", runtime.FuncForPC(pc).Name(), "\n") | 
|  | return | 
|  | } | 
|  | recover() | 
|  | return | 
|  | } | 
|  | }() | 
|  | f() | 
|  | } |