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