1// run
2
3// Copyright 2023 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
7// Make sure address calculations don't float up before
8// the corresponding nil check.
9
10package main
11
12type T struct {
13	a, b int
14}
15
16//go:noinline
17func f(x *T, p *bool, n int) {
18	*p = n != 0
19	useStack(1000)
20	g(&x.b)
21}
22
23//go:noinline
24func g(p *int) {
25}
26
27func useStack(n int) {
28	if n == 0 {
29		return
30	}
31	useStack(n - 1)
32}
33
34func main() {
35	mustPanic(func() {
36		var b bool
37		f(nil, &b, 3)
38	})
39}
40
41func mustPanic(f func()) {
42	defer func() {
43		if recover() == nil {
44			panic("expected panic, got nil")
45		}
46	}()
47	f()
48}
49