@@ -350,3 +350,159 @@ test "@ptrCast restructures sliced comptime-only array" {
350350 comptime assert (sub [2 ] == 5 );
351351 comptime assert (sub [3 ] == 6 );
352352}
353+
354+ test "@ptrCast slice multiplying length" {
355+ if (builtin .zig_backend == .stage2_arm ) return error .SkipZigTest ; // TODO
356+ if (builtin .zig_backend == .stage2_aarch64 ) return error .SkipZigTest ; // TODO
357+ if (builtin .zig_backend == .stage2_sparc64 ) return error .SkipZigTest ; // TODO
358+ if (builtin .zig_backend == .stage2_spirv64 ) return error .SkipZigTest ;
359+
360+ const S = struct {
361+ fn doTheTest (zero : u32 ) ! void {
362+ const in : []const u32 = &.{ zero , zero };
363+ const out : []const u8 = @ptrCast (in );
364+ try expect (out .len == 8 );
365+ try expect (@as ([* ]const u8 , @ptrCast (in .ptr )) == out .ptr );
366+ }
367+ };
368+ try S .doTheTest (0 );
369+ try comptime S .doTheTest (0 );
370+ }
371+
372+ test "@ptrCast array pointer to slice multiplying length" {
373+ if (builtin .zig_backend == .stage2_arm ) return error .SkipZigTest ; // TODO
374+ if (builtin .zig_backend == .stage2_aarch64 ) return error .SkipZigTest ; // TODO
375+ if (builtin .zig_backend == .stage2_sparc64 ) return error .SkipZigTest ; // TODO
376+ if (builtin .zig_backend == .stage2_spirv64 ) return error .SkipZigTest ;
377+
378+ const S = struct {
379+ fn doTheTest (zero : u32 ) ! void {
380+ const in : * const [2 ]u32 = &.{ zero , zero };
381+ const out : []const u8 = @ptrCast (in );
382+ try expect (out .len == 8 );
383+ try expect (out .ptr == @as ([* ]const u8 , @ptrCast (in .ptr )));
384+ }
385+ };
386+ try S .doTheTest (0 );
387+ try comptime S .doTheTest (0 );
388+ }
389+
390+ test "@ptrCast slice dividing length" {
391+ if (builtin .zig_backend == .stage2_arm ) return error .SkipZigTest ; // TODO
392+ if (builtin .zig_backend == .stage2_aarch64 ) return error .SkipZigTest ; // TODO
393+ if (builtin .zig_backend == .stage2_sparc64 ) return error .SkipZigTest ; // TODO
394+ if (builtin .zig_backend == .stage2_spirv64 ) return error .SkipZigTest ;
395+
396+ const S = struct {
397+ fn doTheTest (zero : u8 ) ! void {
398+ const in : []const u8 = &.{ zero , zero , zero , zero , zero , zero , zero , zero };
399+ const out : []align (1 ) const u32 = @ptrCast (in );
400+ try expect (out .len == 2 );
401+ try expect (out .ptr == @as ([* ]align (1 ) const u32 , @ptrCast (in .ptr )));
402+ }
403+ };
404+ try S .doTheTest (0 );
405+ try comptime S .doTheTest (0 );
406+ }
407+
408+ test "@ptrCast array pointer to slice dividing length" {
409+ if (builtin .zig_backend == .stage2_arm ) return error .SkipZigTest ; // TODO
410+ if (builtin .zig_backend == .stage2_aarch64 ) return error .SkipZigTest ; // TODO
411+ if (builtin .zig_backend == .stage2_sparc64 ) return error .SkipZigTest ; // TODO
412+ if (builtin .zig_backend == .stage2_spirv64 ) return error .SkipZigTest ;
413+
414+ const S = struct {
415+ fn doTheTest (zero : u8 ) ! void {
416+ const in : * const [8 ]u8 = &.{ zero , zero , zero , zero , zero , zero , zero , zero };
417+ const out : []align (1 ) const u32 = @ptrCast (in );
418+ try expect (out .len == 2 );
419+ try expect (out .ptr == @as ([* ]align (1 ) const u32 , @ptrCast (in .ptr )));
420+ }
421+ };
422+ try S .doTheTest (0 );
423+ try comptime S .doTheTest (0 );
424+ }
425+
426+ test "@ptrCast slice with complex length increase" {
427+ if (builtin .zig_backend == .stage2_arm ) return error .SkipZigTest ; // TODO
428+ if (builtin .zig_backend == .stage2_aarch64 ) return error .SkipZigTest ; // TODO
429+ if (builtin .zig_backend == .stage2_sparc64 ) return error .SkipZigTest ; // TODO
430+ if (builtin .zig_backend == .stage2_spirv64 ) return error .SkipZigTest ;
431+
432+ const TwoBytes = [2 ]u8 ;
433+ const ThreeBytes = [3 ]u8 ;
434+
435+ const S = struct {
436+ fn doTheTest (zero : ThreeBytes ) ! void {
437+ const in : []const ThreeBytes = &.{ zero , zero };
438+ const out : []const TwoBytes = @ptrCast (in );
439+ try expect (out .len == 3 );
440+ try expect (out .ptr == @as ([* ]const TwoBytes , @ptrCast (in .ptr )));
441+ }
442+ };
443+ try S .doTheTest (@splat (0 ));
444+ try comptime S .doTheTest (@splat (0 ));
445+ }
446+
447+ test "@ptrCast array pointer to slice with complex length increase" {
448+ if (builtin .zig_backend == .stage2_arm ) return error .SkipZigTest ; // TODO
449+ if (builtin .zig_backend == .stage2_aarch64 ) return error .SkipZigTest ; // TODO
450+ if (builtin .zig_backend == .stage2_sparc64 ) return error .SkipZigTest ; // TODO
451+ if (builtin .zig_backend == .stage2_spirv64 ) return error .SkipZigTest ;
452+
453+ const TwoBytes = [2 ]u8 ;
454+ const ThreeBytes = [3 ]u8 ;
455+
456+ const S = struct {
457+ fn doTheTest (zero : ThreeBytes ) ! void {
458+ const in : * const [2 ]ThreeBytes = &.{ zero , zero };
459+ const out : []const TwoBytes = @ptrCast (in );
460+ try expect (out .len == 3 );
461+ try expect (out .ptr == @as ([* ]const TwoBytes , @ptrCast (in .ptr )));
462+ }
463+ };
464+ try S .doTheTest (@splat (0 ));
465+ try comptime S .doTheTest (@splat (0 ));
466+ }
467+
468+ test "@ptrCast slice with complex length decrease" {
469+ if (builtin .zig_backend == .stage2_arm ) return error .SkipZigTest ; // TODO
470+ if (builtin .zig_backend == .stage2_aarch64 ) return error .SkipZigTest ; // TODO
471+ if (builtin .zig_backend == .stage2_sparc64 ) return error .SkipZigTest ; // TODO
472+ if (builtin .zig_backend == .stage2_spirv64 ) return error .SkipZigTest ;
473+
474+ const TwoBytes = [2 ]u8 ;
475+ const ThreeBytes = [3 ]u8 ;
476+
477+ const S = struct {
478+ fn doTheTest (zero : TwoBytes ) ! void {
479+ const in : []const TwoBytes = &.{ zero , zero , zero };
480+ const out : []const ThreeBytes = @ptrCast (in );
481+ try expect (out .len == 2 );
482+ try expect (out .ptr == @as ([* ]const ThreeBytes , @ptrCast (in .ptr )));
483+ }
484+ };
485+ try S .doTheTest (@splat (0 ));
486+ try comptime S .doTheTest (@splat (0 ));
487+ }
488+
489+ test "@ptrCast array pointer to slice with complex length decrease" {
490+ if (builtin .zig_backend == .stage2_arm ) return error .SkipZigTest ; // TODO
491+ if (builtin .zig_backend == .stage2_aarch64 ) return error .SkipZigTest ; // TODO
492+ if (builtin .zig_backend == .stage2_sparc64 ) return error .SkipZigTest ; // TODO
493+ if (builtin .zig_backend == .stage2_spirv64 ) return error .SkipZigTest ;
494+
495+ const TwoBytes = [2 ]u8 ;
496+ const ThreeBytes = [3 ]u8 ;
497+
498+ const S = struct {
499+ fn doTheTest (zero : TwoBytes ) ! void {
500+ const in : * const [3 ]TwoBytes = &.{ zero , zero , zero };
501+ const out : []const ThreeBytes = @ptrCast (in );
502+ try expect (out .len == 2 );
503+ try expect (out .ptr == @as ([* ]const ThreeBytes , @ptrCast (in .ptr )));
504+ }
505+ };
506+ try S .doTheTest (@splat (0 ));
507+ try comptime S .doTheTest (@splat (0 ));
508+ }
0 commit comments