Source file test/fixedbugs/issue20859.go

     1  // run
     2  
     3  // Copyright 2026 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  package main
     8  
     9  var sink *[16]byte
    10  
    11  //go:noinline
    12  func use(b []byte, x byte) {
    13  	b[0] = x
    14  }
    15  
    16  //go:noinline
    17  func single(x byte) [16]byte {
    18  	var ret [16]byte
    19  	use(ret[:8], x)
    20  	use(ret[8:], x+1)
    21  	return ret
    22  }
    23  
    24  //go:noinline
    25  func addrTaken(x byte) [16]byte {
    26  	var ret [16]byte
    27  	p := &ret
    28  	p[1] = x
    29  	return ret
    30  }
    31  
    32  //go:noinline
    33  func captured(x byte) [16]byte {
    34  	var ret [16]byte
    35  	func() {
    36  		ret[2] = x
    37  	}()
    38  	return ret
    39  }
    40  
    41  //go:noinline
    42  func multi(x byte, c bool) [16]byte {
    43  	var ret [16]byte
    44  	ret[4] = x
    45  	if c {
    46  		return ret
    47  	}
    48  	ret[5] = x + 1
    49  	return ret
    50  }
    51  
    52  //go:noinline
    53  func escaped(x byte, c bool) [16]byte {
    54  	var ret [16]byte
    55  	ret[3] = x
    56  	sink = &ret
    57  	if c {
    58  		return ret
    59  	}
    60  	return [16]byte{4: 99}
    61  }
    62  
    63  //go:noinline
    64  func partial(x byte, c bool) [16]byte {
    65  	var ret [16]byte
    66  	ret[6] = x
    67  	if c {
    68  		return ret
    69  	}
    70  	return [16]byte{7: 77}
    71  }
    72  
    73  //go:noinline
    74  func partialNonCandidateLocal(x byte, c bool) [16]byte {
    75  	var ret [16]byte
    76  	ret[8] = x
    77  	if c {
    78  		return ret
    79  	}
    80  	other := [16]byte{9: 88}
    81  	return other
    82  }
    83  
    84  func check(name string, got, want [16]byte) {
    85  	if got != want {
    86  		panic(name)
    87  	}
    88  }
    89  
    90  func main() {
    91  	var want [16]byte
    92  
    93  	want[0] = 10
    94  	want[8] = 11
    95  	check("single", single(10), want)
    96  
    97  	want = [16]byte{}
    98  	want[1] = 12
    99  	check("addrTaken", addrTaken(12), want)
   100  
   101  	want = [16]byte{}
   102  	want[2] = 13
   103  	check("captured", captured(13), want)
   104  
   105  	want = [16]byte{}
   106  	want[4] = 15
   107  	check("multi true", multi(15, true), want)
   108  	want[5] = 16
   109  	check("multi false", multi(15, false), want)
   110  
   111  	want = [16]byte{}
   112  	want[3] = 14
   113  	check("escaped true", escaped(14, true), want)
   114  	if *sink != want {
   115  		panic("escaped pointer")
   116  	}
   117  	want = [16]byte{4: 99}
   118  	check("escaped false", escaped(14, false), want)
   119  
   120  	want = [16]byte{}
   121  	want[6] = 17
   122  	check("partial true", partial(17, true), want)
   123  	want = [16]byte{7: 77}
   124  	check("partial false", partial(17, false), want)
   125  
   126  	want = [16]byte{}
   127  	want[8] = 18
   128  	check("partialNonCandidateLocal true", partialNonCandidateLocal(18, true), want)
   129  	want = [16]byte{9: 88}
   130  	check("partialNonCandidateLocal false", partialNonCandidateLocal(18, false), want)
   131  }
   132  

View as plain text