| // asmcheck |
| |
| // 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. |
| |
| // Make sure a pointer variable and a zero-sized variable |
| // aren't allocated to the same stack slot. |
| // See issue 24993. |
| |
| package codegen |
| |
| func zeroSize() { |
| c := make(chan struct{}) |
| // amd64:`MOVQ \$0, command-line-arguments\.s\+56\(SP\)` |
| var s *int |
| // force s to be a stack object, also use some (fixed) stack space |
| g(&s, 1, 2, 3, 4, 5) |
| |
| // amd64:`LEAQ command-line-arguments\..*\+55\(SP\)` |
| c <- noliteral(struct{}{}) |
| } |
| |
| // Like zeroSize, but without hiding the zero-sized struct. |
| func zeroSize2() { |
| c := make(chan struct{}) |
| // amd64:`MOVQ \$0, command-line-arguments\.s\+48\(SP\)` |
| var s *int |
| // force s to be a stack object, also use some (fixed) stack space |
| g(&s, 1, 2, 3, 4, 5) |
| |
| // amd64:`LEAQ command-line-arguments\..*stmp_\d+\(SB\)` |
| c <- struct{}{} |
| } |
| |
| //go:noinline |
| func g(**int, int, int, int, int, int) {} |
| |
| // noliteral prevents the compiler from recognizing a literal value. |
| // |
| //go:noinline |
| func noliteral[T any](t T) T { |
| return t |
| } |