| // Copyright 2020 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. |
| |
| package main |
| |
| import "unsafe" |
| |
| func init() { |
| register("CheckPtrAlignmentNoPtr", CheckPtrAlignmentNoPtr) |
| register("CheckPtrAlignmentPtr", CheckPtrAlignmentPtr) |
| register("CheckPtrArithmetic", CheckPtrArithmetic) |
| register("CheckPtrArithmetic2", CheckPtrArithmetic2) |
| register("CheckPtrSize", CheckPtrSize) |
| register("CheckPtrSmall", CheckPtrSmall) |
| register("CheckPtrSliceOK", CheckPtrSliceOK) |
| register("CheckPtrSliceFail", CheckPtrSliceFail) |
| } |
| |
| func CheckPtrAlignmentNoPtr() { |
| var x [2]int64 |
| p := unsafe.Pointer(&x[0]) |
| sink2 = (*int64)(unsafe.Pointer(uintptr(p) + 1)) |
| } |
| |
| func CheckPtrAlignmentPtr() { |
| var x [2]int64 |
| p := unsafe.Pointer(&x[0]) |
| sink2 = (**int64)(unsafe.Pointer(uintptr(p) + 1)) |
| } |
| |
| func CheckPtrArithmetic() { |
| var x int |
| i := uintptr(unsafe.Pointer(&x)) |
| sink2 = (*int)(unsafe.Pointer(i)) |
| } |
| |
| func CheckPtrArithmetic2() { |
| var x [2]int64 |
| p := unsafe.Pointer(&x[1]) |
| var one uintptr = 1 |
| sink2 = unsafe.Pointer(uintptr(p) & ^one) |
| } |
| |
| func CheckPtrSize() { |
| p := new(int64) |
| sink2 = p |
| sink2 = (*[100]int64)(unsafe.Pointer(p)) |
| } |
| |
| func CheckPtrSmall() { |
| sink2 = unsafe.Pointer(uintptr(1)) |
| } |
| |
| func CheckPtrSliceOK() { |
| p := new([4]int64) |
| sink2 = unsafe.Slice(&p[1], 3) |
| } |
| |
| func CheckPtrSliceFail() { |
| p := new(int64) |
| sink2 = p |
| sink2 = unsafe.Slice(p, 100) |
| } |