| // 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 | |
| } |