const std = @import("std"); const builtin = @import("builtin"); const native_endian = builtin.target.cpu.arch.endian(); const expect = std.testing.expect; const expectEqual = std.testing.expectEqual; const expectEqualSlices = std.testing.expectEqualSlices; const maxInt = std.math.maxInt; const Node = struct { val: Val, next: *Node, }; const Val = struct { x: i32, }; test "struct point to self" { var root: Node = undefined; root.val.x = 1; var node: Node = undefined; node.next = &root; node.val.x = 2; root.next = &node; try expect(node.next.next.next.val.x == 1); } test "void struct fields" { const foo = VoidStructFieldsFoo{ .a = void{}, .b = 1, .c = void{}, }; try expect(foo.b == 1); try expect(@sizeOf(VoidStructFieldsFoo) == 4); } const VoidStructFieldsFoo = struct { a: void, b: i32, c: void, }; test "return empty struct from fn" { _ = testReturnEmptyStructFromFn(); } const EmptyStruct2 = struct {}; fn testReturnEmptyStructFromFn() EmptyStruct2 { return EmptyStruct2{}; } test "pass slice of empty struct to fn" { try expect(testPassSliceOfEmptyStructToFn(&[_]EmptyStruct2{EmptyStruct2{}}) == 1); } fn testPassSliceOfEmptyStructToFn(slice: []const EmptyStruct2) usize { return slice.len; } test "for loop over pointers to struct, getting field from struct pointer" { const S = struct { const Foo = struct { name: []const u8, }; var ok = true; fn eql(a: []const u8) bool { _ = a; return true; } const ArrayList = struct { fn toSlice(self: *ArrayList) []*Foo { _ = self; return @as([*]*Foo, undefined)[0..0]; } }; fn doTheTest() !void { var objects: ArrayList = undefined; for (objects.toSlice()) |obj| { if (eql(obj.name)) { ok = false; } } try expect(ok); } }; try S.doTheTest(); } test "self-referencing struct via array member" { const T = struct { children: [1]*@This(), }; var x: T = undefined; x = T{ .children = .{&x} }; try expect(x.children[0] == &x); }