| // run |
| |
| // Copyright 2018 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 "strings" |
| |
| var X interface{} |
| |
| type T struct{} |
| |
| func scopes() { |
| p, ok := recover().(error) |
| if ok && strings.Contains(p.Error(), "different scopes") { |
| return |
| } |
| panic(p) |
| } |
| |
| func F1() { |
| type T struct{} |
| X = T{} |
| } |
| |
| func F2() { |
| type T struct{} |
| defer scopes() |
| _ = X.(T) |
| } |
| |
| func F3() { |
| defer scopes() |
| _ = X.(T) |
| } |
| |
| func F4() { |
| X = T{} |
| } |
| |
| func main() { |
| F1() // set X to F1's T |
| F2() // check that X is not F2's T |
| F3() // check that X is not package T |
| F4() // set X to package T |
| F2() // check that X is not F2's T |
| } |