| // 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 | |
| //go:noinline | |
| func f(p, q *struct{}) bool { | |
| return *p == *q | |
| } | |
| type T struct { | |
| x struct{} | |
| y int | |
| } | |
| //go:noinline | |
| func g(p, q *T) bool { | |
| return p.x == q.x | |
| } | |
| //go:noinline | |
| func h(p, q func() struct{}) bool { | |
| return p() == q() | |
| } | |
| func fi(p, q *struct{}) bool { | |
| return *p == *q | |
| } | |
| func gi(p, q *T) bool { | |
| return p.x == q.x | |
| } | |
| func hi(p, q func() struct{}) bool { | |
| return p() == q() | |
| } | |
| func main() { | |
| shouldPanic(func() { f(nil, nil) }) | |
| shouldPanic(func() { g(nil, nil) }) | |
| shouldPanic(func() { h(nil, nil) }) | |
| shouldPanic(func() { fi(nil, nil) }) | |
| shouldPanic(func() { gi(nil, nil) }) | |
| shouldPanic(func() { hi(nil, nil) }) | |
| n := 0 | |
| inc := func() struct{} { | |
| n++ | |
| return struct{}{} | |
| } | |
| h(inc, inc) | |
| if n != 2 { | |
| panic("inc not called") | |
| } | |
| hi(inc, inc) | |
| if n != 4 { | |
| panic("inc not called") | |
| } | |
| } | |
| func shouldPanic(x func()) { | |
| defer func() { | |
| if recover() == nil { | |
| panic("did not panic") | |
| } | |
| }() | |
| x() | |
| } |