|  |  |  | # 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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | exec 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.21 | 
					
						
							|  |  |  | -- 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 |