modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/fixedbugs/issue21048.go (about) 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 7 // Issue 21048: s390x merged address generation into stores 8 // to unaligned global variables. This resulted in an illegal 9 // instruction. 10 11 package main 12 13 type T struct { 14 _ [1]byte 15 a [2]byte // offset: 1 16 _ [3]byte 17 b [2]uint16 // offset: 6 18 _ [2]byte 19 c [2]uint32 // offset: 12 20 _ [2]byte 21 d [2]int16 // offset: 22 22 _ [2]byte 23 e [2]int32 // offset: 28 24 } 25 26 var Source, Sink T 27 28 func newT() T { 29 return T{ 30 a: [2]byte{1, 2}, 31 b: [2]uint16{1, 2}, 32 c: [2]uint32{1, 2}, 33 d: [2]int16{1, 2}, 34 e: [2]int32{1, 2}, 35 } 36 } 37 38 //go:noinline 39 func moves() { 40 Sink.a = Source.a 41 Sink.b = Source.b 42 Sink.c = Source.c 43 Sink.d = Source.d 44 Sink.e = Source.e 45 } 46 47 //go:noinline 48 func loads() *T { 49 t := newT() 50 t.a = Source.a 51 t.b = Source.b 52 t.c = Source.c 53 t.d = Source.d 54 t.e = Source.e 55 return &t 56 } 57 58 //go:noinline 59 func stores() { 60 t := newT() 61 Sink.a = t.a 62 Sink.b = t.b 63 Sink.c = t.c 64 Sink.d = t.d 65 Sink.e = t.e 66 } 67 68 func main() { 69 moves() 70 loads() 71 stores() 72 }