1// run
2
3// Copyright 2017 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7package main
8
9import (
10	"os"
11	"runtime"
12)
13
14func foo(x int) int {
15	return x + 1
16}
17
18func test() {
19	defer func() {
20		if r := recover(); r != nil {
21			pcs := make([]uintptr, 10)
22			n := runtime.Callers(0, pcs)
23			pcs = pcs[:n]
24			frames := runtime.CallersFrames(pcs)
25			for {
26				f, more := frames.Next()
27				if f.Function == "main.foo" {
28					println("did not expect to see call to foo in stack trace")
29					os.Exit(1)
30				}
31				if !more {
32					break
33				}
34			}
35		}
36	}()
37	var v []int
38	foo(v[0])
39}
40
41func bar(x ...int) int {
42	return x[0] + 1
43}
44
45func testVariadic() {
46	defer func() {
47		if r := recover(); r != nil {
48			pcs := make([]uintptr, 10)
49			n := runtime.Callers(0, pcs)
50			pcs = pcs[:n]
51			frames := runtime.CallersFrames(pcs)
52			for {
53				f, more := frames.Next()
54				if f.Function == "main.bar" {
55					println("did not expect to see call to bar in stack trace")
56					os.Exit(1)
57				}
58				if !more {
59					break
60				}
61			}
62		}
63	}()
64	var v []int
65	bar(v[0])
66}
67
68func main() {
69	test()
70	testVariadic()
71}
72