Files
llgo/compiler/cl/_testrt/unsafe/in.go
2025-01-08 14:59:01 +08:00

86 lines
1.5 KiB
Go

package main
import (
"unsafe"
"github.com/goplus/llgo/c"
)
//llgo:type C
type T func()
type M struct {
fn T
v int
}
type N struct {
fn func()
v int
}
func main() {
if unsafe.Sizeof(*(*T)(nil)) != unsafe.Sizeof(0) {
panic("error")
}
if unsafe.Sizeof(*(*M)(nil)) != unsafe.Sizeof([2]int{}) {
panic("error")
}
// TODO(lijie): inconsistent with golang
if unsafe.Sizeof(*(*N)(nil)) != unsafe.Sizeof([3]int{}) {
panic("error")
}
if unsafe.Alignof(*(*T)(nil)) != unsafe.Alignof(0) {
panic("error")
}
if unsafe.Alignof(*(*M)(nil)) != unsafe.Alignof([2]int{}) {
panic("error")
}
if unsafe.Alignof(*(*N)(nil)) != unsafe.Alignof([3]int{}) {
panic("error")
}
if unsafe.Offsetof(M{}.fn) != 0 {
panic("error")
}
if unsafe.Offsetof(M{}.v) != unsafe.Sizeof(int(0)) {
panic("error")
}
if unsafe.Offsetof(N{}.fn) != 0 {
panic("error")
}
// TODO(lijie): inconsistent with golang
if unsafe.Offsetof(N{}.v) != unsafe.Sizeof([2]int{}) {
panic("error")
}
s := unsafe.String((*byte)(unsafe.Pointer(c.Str("abc"))), 3)
if s != "abc" {
panic("error")
}
p := unsafe.StringData(s)
arr := (*[3]byte)(unsafe.Pointer(p))
if arr[0] != 'a' || arr[1] != 'b' || arr[2] != 'c' {
panic("error")
}
intArr := [2]int{1, 2}
pi := &intArr[0]
intSlice := unsafe.Slice(pi, 2)
if intSlice[0] != 1 || intSlice[1] != 2 {
panic("error")
}
pi = unsafe.SliceData(intSlice)
if *pi != 1 {
panic("error")
}
if uintptr(unsafe.Add(unsafe.Pointer(nil), 1)) != 1 {
panic("error")
}
}