ensure the alignment of sync/atomic types works
Added in Go 1.19, types like sync/atomic.Uint64 are handy, because they ensure proper alignment even on 32-bit GOOSes. However, this was done via a magic `type align64 struct{}`, which the compiler spotted by name. To keep that magic working, do not obfuscate the name. Neither package path was being obfuscated, as both packages contain compiler intrinsics already. Fixes #686.pull/706/head
parent
30927da637
commit
9d04637009
@ -0,0 +1,51 @@
|
|||||||
|
# amd64 can typically run 386 programs,
|
||||||
|
# which is handy to actually make this test useful.
|
||||||
|
# We assume that the same applies to arm64.
|
||||||
|
# Note that darwin is an exception compared to linux and windows,
|
||||||
|
# as darwin/386 and darwin/arm are not supported.
|
||||||
|
[amd64] [!darwin] env GOARCH=386
|
||||||
|
[arm64] [!darwin] env GOARCH=arm
|
||||||
|
|
||||||
|
garble build
|
||||||
|
exec ./main
|
||||||
|
cmp stderr main.stderr
|
||||||
|
|
||||||
|
[short] stop # no need to verify this with -short
|
||||||
|
|
||||||
|
go build
|
||||||
|
exec ./main
|
||||||
|
cmp stderr main.stderr
|
||||||
|
-- go.mod --
|
||||||
|
module test/main
|
||||||
|
|
||||||
|
go 1.20
|
||||||
|
-- main.go --
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
var unalignedUint64 struct {
|
||||||
|
// If sync/atomic's support in the compiler is broken,
|
||||||
|
// then u64 is not aligned to 64 bits on 32-bit platforms,
|
||||||
|
// and that may cause a panic.
|
||||||
|
_ bool
|
||||||
|
u64 atomic.Uint64
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
wg.Add(1)
|
||||||
|
go func() {
|
||||||
|
unalignedUint64.u64.Add(2)
|
||||||
|
wg.Done()
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
wg.Wait()
|
||||||
|
println(unalignedUint64.u64.Load())
|
||||||
|
}
|
||||||
|
-- main.stderr --
|
||||||
|
20
|
Loading…
Reference in New Issue