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