authorgravatar for johnnymarler@gmail.comJonathan Marler <johnnymarler@gmail.com> 2022-11-16 23:41:54-07:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-17 12:11:43+02:00
log58d9004cea5f8aa73c76382cd21e1c88b1bc21e1
tree1b588e30e992fccf7f0acc525b0fb6fbd7971a53
parenta09a5ad574b8e85480645e0920d6cf4c7e850748

packed struct fix example and clarify least to most significant ordering

The packed struct example was mistakenly applying endianness where it shouldn't have been. This wasn't being caught because we don't currently test the examples on Big-endian systems. I updated the test to remove the endianness where it didn't apply, and added a new part of the test to demonstrate when it would apply.

1 files changed, 10 insertions(+), 7 deletions(-)

doc/langref.html.in+10-7
......@@ -3277,7 +3277,7 @@ test "default struct initialization fields" {
32773277 Unlike normal structs, {#syntax#}packed{#endsyntax#} structs have guaranteed in-memory layout:
32783278 </p>
32793279 <ul>
3280 <li>Fields remain in the order declared.</li>
3280 <li>Fields remain in the order declared, least to most significant.</li>
32813281 <li>There is no padding between fields.</li>
32823282 <li>Zig supports arbitrary width {#link|Integers#} and although normally, integers with fewer
32833283 than 8 bits will still use 1 byte of memory, in packed structs, they use
......@@ -3320,16 +3320,19 @@ fn doTheTest() !void {
33203320 try expect(@sizeOf(Divided) == 2);
33213321 var full = Full{ .number = 0x1234 };
33223322 var divided = @bitCast(Divided, full);
3323 try expect(divided.half1 == 0x34);
3324 try expect(divided.quarter3 == 0x2);
3325 try expect(divided.quarter4 == 0x1);
3326
3327 var ordered = @bitCast([2]u8, full);
33233328 switch (native_endian) {
33243329 .Big => {
3325 try expect(divided.half1 == 0x12);
3326 try expect(divided.quarter3 == 0x3);
3327 try expect(divided.quarter4 == 0x4);
3330 try expect(ordered[0] == 0x12);
3331 try expect(ordered[1] == 0x34);
33283332 },
33293333 .Little => {
3330 try expect(divided.half1 == 0x34);
3331 try expect(divided.quarter3 == 0x2);
3332 try expect(divided.quarter4 == 0x1);
3334 try expect(ordered[0] == 0x34);
3335 try expect(ordered[1] == 0x12);
33333336 },
33343337 }
33353338}