From 804cee3b93cb7084c16ee61d3bcb57f7d3c9f0bc Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Tue, 2 Jan 2024 17:33:41 +0200 Subject: [PATCH] categorize `behavior/bugs/.zig` tests --- test/behavior.zig | 131 +-------- test/behavior/array.zig | 118 ++++++++ test/behavior/basic.zig | 181 +++++++++++++ test/behavior/bit_shifting.zig | 6 + test/behavior/bool.zig | 9 + test/behavior/bugs/10138.zig | 34 --- test/behavior/bugs/10147.zig | 20 -- test/behavior/bugs/1025.zig | 14 - test/behavior/bugs/10684.zig | 17 -- test/behavior/bugs/1076.zig | 27 -- test/behavior/bugs/10970.zig | 20 -- test/behavior/bugs/11046.zig | 22 -- test/behavior/bugs/11100.zig | 13 - test/behavior/bugs/11139.zig | 26 -- test/behavior/bugs/11159.zig | 19 -- test/behavior/bugs/11162.zig | 16 -- test/behavior/bugs/11165.zig | 44 --- test/behavior/bugs/11179.zig | 19 -- test/behavior/bugs/11181.zig | 25 -- test/behavior/bugs/11213.zig | 33 --- test/behavior/bugs/11787.zig | 19 -- test/behavior/bugs/11816.zig | 14 - test/behavior/bugs/11995.zig | 33 --- test/behavior/bugs/12000.zig | 16 -- test/behavior/bugs/12003.zig | 7 - test/behavior/bugs/12025.zig | 13 - test/behavior/bugs/12033.zig | 13 - test/behavior/bugs/12043.zig | 13 - test/behavior/bugs/12051.zig | 40 --- test/behavior/bugs/12092.zig | 28 -- test/behavior/bugs/12119.zig | 15 -- test/behavior/bugs/12142.zig | 36 --- test/behavior/bugs/12169.zig | 19 -- test/behavior/bugs/12430.zig | 11 - test/behavior/bugs/12450.zig | 22 -- test/behavior/bugs/12486.zig | 49 ---- test/behavior/bugs/12498.zig | 9 - test/behavior/bugs/12551.zig | 11 - test/behavior/bugs/12571.zig | 23 -- test/behavior/bugs/12644.zig | 16 -- test/behavior/bugs/12723.zig | 8 - test/behavior/bugs/1277.zig | 21 -- test/behavior/bugs/12776.zig | 47 ---- test/behavior/bugs/12786.zig | 28 -- test/behavior/bugs/12794.zig | 38 --- test/behavior/bugs/12801-1.zig | 13 - test/behavior/bugs/12801-2.zig | 25 -- test/behavior/bugs/12885.zig | 34 --- test/behavior/bugs/12890.zig | 18 -- test/behavior/bugs/12891.zig | 83 ------ test/behavior/bugs/12911.zig | 9 - test/behavior/bugs/12928.zig | 30 --- test/behavior/bugs/12945.zig | 13 - test/behavior/bugs/12972.zig | 18 -- test/behavior/bugs/12984.zig | 20 -- test/behavior/bugs/13064.zig | 17 -- test/behavior/bugs/13065.zig | 22 -- test/behavior/bugs/13068.zig | 14 - test/behavior/bugs/13069.zig | 17 -- test/behavior/bugs/1310.zig | 27 -- test/behavior/bugs/13112.zig | 7 - test/behavior/bugs/13113.zig | 20 -- test/behavior/bugs/13128.zig | 29 -- test/behavior/bugs/13159.zig | 18 -- test/behavior/bugs/13171.zig | 16 -- test/behavior/bugs/13209.zig | 5 - test/behavior/bugs/13285.zig | 15 -- test/behavior/bugs/13366.zig | 28 -- test/behavior/bugs/13435.zig | 22 -- test/behavior/bugs/13664.zig | 28 -- test/behavior/bugs/13714.zig | 5 - test/behavior/bugs/13785.zig | 14 - test/behavior/bugs/1381.zig | 27 -- test/behavior/bugs/1421.zig | 14 - test/behavior/bugs/1442.zig | 17 -- test/behavior/bugs/1467.zig | 8 - test/behavior/bugs/14854.zig | 14 - test/behavior/bugs/1486.zig | 14 - test/behavior/bugs/1500.zig | 16 -- test/behavior/bugs/15778.zig | 23 -- test/behavior/bugs/1607.zig | 20 -- test/behavior/bugs/1735.zig | 50 ---- test/behavior/bugs/1851.zig | 40 --- test/behavior/bugs/1914.zig | 32 --- test/behavior/bugs/2006.zig | 15 -- test/behavior/bugs/2114.zig | 27 -- test/behavior/bugs/2346.zig | 10 - test/behavior/bugs/2557.zig | 6 - test/behavior/bugs/2578.zig | 20 -- test/behavior/bugs/2622.zig | 14 - test/behavior/bugs/2692.zig | 13 - test/behavior/bugs/2727.zig | 16 -- test/behavior/bugs/2889.zig | 36 --- test/behavior/bugs/3007.zig | 28 -- test/behavior/bugs/3046.zig | 24 -- test/behavior/bugs/3112.zig | 23 -- test/behavior/bugs/3367.zig | 15 -- test/behavior/bugs/3384.zig | 11 - test/behavior/bugs/3468.zig | 7 - test/behavior/bugs/3586.zig | 16 -- test/behavior/bugs/3742.zig | 45 ---- test/behavior/bugs/394.zig | 19 -- test/behavior/bugs/421.zig | 21 -- test/behavior/bugs/4328.zig | 82 ------ test/behavior/bugs/4560.zig | 40 --- test/behavior/bugs/4769_a.zig | 1 - test/behavior/bugs/4769_b.zig | 1 - test/behavior/bugs/4954.zig | 14 - test/behavior/bugs/5398.zig | 36 --- test/behavior/bugs/5413.zig | 6 - test/behavior/bugs/5474.zig | 63 ----- test/behavior/bugs/5487.zig | 17 -- test/behavior/bugs/6047.zig | 20 -- test/behavior/bugs/624.zig | 30 --- test/behavior/bugs/6305.zig | 10 - test/behavior/bugs/6456.zig | 46 ---- test/behavior/bugs/655.zig | 12 - test/behavior/bugs/655_other_file.zig | 1 - test/behavior/bugs/656.zig | 37 --- test/behavior/bugs/6781.zig | 84 ------ test/behavior/bugs/679.zig | 19 -- test/behavior/bugs/6850.zig | 12 - test/behavior/bugs/6905.zig | 23 -- test/behavior/bugs/6947.zig | 14 - test/behavior/bugs/7003.zig | 9 - test/behavior/bugs/704.zig | 11 - test/behavior/bugs/7047.zig | 23 -- test/behavior/bugs/718.zig | 23 -- test/behavior/bugs/7187.zig | 15 -- test/behavior/bugs/726.zig | 26 -- test/behavior/bugs/7325.zig | 113 -------- test/behavior/bugs/8277.zig | 16 -- test/behavior/bugs/828.zig | 43 --- test/behavior/bugs/8646.zig | 16 -- test/behavior/bugs/920.zig | 80 ------ test/behavior/bugs/9584.zig | 69 ----- test/behavior/call.zig | 127 +++++++++ test/behavior/cast.zig | 38 +++ .../a.zig} | 1 - .../b.zig} | 0 test/behavior/enum.zig | 7 + test/behavior/error.zig | 56 ++++ test/behavior/floatop.zig | 81 ++++++ test/behavior/for.zig | 21 ++ test/behavior/generics.zig | 98 +++++++ test/behavior/globals.zig | 19 ++ test/behavior/hasdecl.zig | 9 + test/behavior/if.zig | 8 + test/behavior/int_comparison_elision.zig | 5 + test/behavior/math.zig | 37 +++ test/behavior/memset.zig | 20 ++ ...ltiple_externs_with_conflicting_types.zig} | 6 +- test/behavior/optional.zig | 14 + test/behavior/packed-struct.zig | 158 +++++++++++ test/behavior/packed-union.zig | 28 ++ test/behavior/pointers.zig | 65 +++++ test/behavior/sizeof_and_typeof.zig | 114 ++++++++ test/behavior/slice.zig | 64 +++++ test/behavior/string_literals.zig | 16 ++ test/behavior/struct.zig | 252 +++++++++++++++++- test/behavior/switch.zig | 19 ++ test/behavior/this.zig | 20 ++ test/behavior/try.zig | 21 ++ test/behavior/tuple.zig | 73 +++++ test/behavior/type.zig | 166 ++++++++++++ test/behavior/undefined.zig | 13 + test/behavior/union.zig | 140 ++++++++++ test/behavior/usingnamespace.zig | 15 ++ test/behavior/vector.zig | 36 +++ test/behavior/while.zig | 34 +++ ...on_with_unspecified_calling_convention.zig | 2 +- .../invalid_extern_function_call.zig | 2 +- 172 files changed, 2080 insertions(+), 3268 deletions(-) delete mode 100644 test/behavior/bugs/10138.zig delete mode 100644 test/behavior/bugs/10147.zig delete mode 100644 test/behavior/bugs/1025.zig delete mode 100644 test/behavior/bugs/10684.zig delete mode 100644 test/behavior/bugs/1076.zig delete mode 100644 test/behavior/bugs/10970.zig delete mode 100644 test/behavior/bugs/11046.zig delete mode 100644 test/behavior/bugs/11100.zig delete mode 100644 test/behavior/bugs/11139.zig delete mode 100644 test/behavior/bugs/11159.zig delete mode 100644 test/behavior/bugs/11162.zig delete mode 100644 test/behavior/bugs/11165.zig delete mode 100644 test/behavior/bugs/11179.zig delete mode 100644 test/behavior/bugs/11181.zig delete mode 100644 test/behavior/bugs/11213.zig delete mode 100644 test/behavior/bugs/11787.zig delete mode 100644 test/behavior/bugs/11816.zig delete mode 100644 test/behavior/bugs/11995.zig delete mode 100644 test/behavior/bugs/12000.zig delete mode 100644 test/behavior/bugs/12003.zig delete mode 100644 test/behavior/bugs/12025.zig delete mode 100644 test/behavior/bugs/12033.zig delete mode 100644 test/behavior/bugs/12043.zig delete mode 100644 test/behavior/bugs/12051.zig delete mode 100644 test/behavior/bugs/12092.zig delete mode 100644 test/behavior/bugs/12119.zig delete mode 100644 test/behavior/bugs/12142.zig delete mode 100644 test/behavior/bugs/12169.zig delete mode 100644 test/behavior/bugs/12430.zig delete mode 100644 test/behavior/bugs/12450.zig delete mode 100644 test/behavior/bugs/12486.zig delete mode 100644 test/behavior/bugs/12498.zig delete mode 100644 test/behavior/bugs/12551.zig delete mode 100644 test/behavior/bugs/12571.zig delete mode 100644 test/behavior/bugs/12644.zig delete mode 100644 test/behavior/bugs/12723.zig delete mode 100644 test/behavior/bugs/1277.zig delete mode 100644 test/behavior/bugs/12776.zig delete mode 100644 test/behavior/bugs/12786.zig delete mode 100644 test/behavior/bugs/12794.zig delete mode 100644 test/behavior/bugs/12801-1.zig delete mode 100644 test/behavior/bugs/12801-2.zig delete mode 100644 test/behavior/bugs/12885.zig delete mode 100644 test/behavior/bugs/12890.zig delete mode 100644 test/behavior/bugs/12891.zig delete mode 100644 test/behavior/bugs/12911.zig delete mode 100644 test/behavior/bugs/12928.zig delete mode 100644 test/behavior/bugs/12945.zig delete mode 100644 test/behavior/bugs/12972.zig delete mode 100644 test/behavior/bugs/12984.zig delete mode 100644 test/behavior/bugs/13064.zig delete mode 100644 test/behavior/bugs/13065.zig delete mode 100644 test/behavior/bugs/13068.zig delete mode 100644 test/behavior/bugs/13069.zig delete mode 100644 test/behavior/bugs/1310.zig delete mode 100644 test/behavior/bugs/13112.zig delete mode 100644 test/behavior/bugs/13113.zig delete mode 100644 test/behavior/bugs/13128.zig delete mode 100644 test/behavior/bugs/13159.zig delete mode 100644 test/behavior/bugs/13171.zig delete mode 100644 test/behavior/bugs/13209.zig delete mode 100644 test/behavior/bugs/13285.zig delete mode 100644 test/behavior/bugs/13366.zig delete mode 100644 test/behavior/bugs/13435.zig delete mode 100644 test/behavior/bugs/13664.zig delete mode 100644 test/behavior/bugs/13714.zig delete mode 100644 test/behavior/bugs/13785.zig delete mode 100644 test/behavior/bugs/1381.zig delete mode 100644 test/behavior/bugs/1421.zig delete mode 100644 test/behavior/bugs/1442.zig delete mode 100644 test/behavior/bugs/1467.zig delete mode 100644 test/behavior/bugs/14854.zig delete mode 100644 test/behavior/bugs/1486.zig delete mode 100644 test/behavior/bugs/1500.zig delete mode 100644 test/behavior/bugs/15778.zig delete mode 100644 test/behavior/bugs/1607.zig delete mode 100644 test/behavior/bugs/1735.zig delete mode 100644 test/behavior/bugs/1851.zig delete mode 100644 test/behavior/bugs/1914.zig delete mode 100644 test/behavior/bugs/2006.zig delete mode 100644 test/behavior/bugs/2114.zig delete mode 100644 test/behavior/bugs/2346.zig delete mode 100644 test/behavior/bugs/2557.zig delete mode 100644 test/behavior/bugs/2578.zig delete mode 100644 test/behavior/bugs/2622.zig delete mode 100644 test/behavior/bugs/2692.zig delete mode 100644 test/behavior/bugs/2727.zig delete mode 100644 test/behavior/bugs/2889.zig delete mode 100644 test/behavior/bugs/3007.zig delete mode 100644 test/behavior/bugs/3046.zig delete mode 100644 test/behavior/bugs/3112.zig delete mode 100644 test/behavior/bugs/3367.zig delete mode 100644 test/behavior/bugs/3384.zig delete mode 100644 test/behavior/bugs/3468.zig delete mode 100644 test/behavior/bugs/3586.zig delete mode 100644 test/behavior/bugs/3742.zig delete mode 100644 test/behavior/bugs/394.zig delete mode 100644 test/behavior/bugs/421.zig delete mode 100644 test/behavior/bugs/4328.zig delete mode 100644 test/behavior/bugs/4560.zig delete mode 100644 test/behavior/bugs/4769_a.zig delete mode 100644 test/behavior/bugs/4769_b.zig delete mode 100644 test/behavior/bugs/4954.zig delete mode 100644 test/behavior/bugs/5398.zig delete mode 100644 test/behavior/bugs/5413.zig delete mode 100644 test/behavior/bugs/5474.zig delete mode 100644 test/behavior/bugs/5487.zig delete mode 100644 test/behavior/bugs/6047.zig delete mode 100644 test/behavior/bugs/624.zig delete mode 100644 test/behavior/bugs/6305.zig delete mode 100644 test/behavior/bugs/6456.zig delete mode 100644 test/behavior/bugs/655.zig delete mode 100644 test/behavior/bugs/655_other_file.zig delete mode 100644 test/behavior/bugs/656.zig delete mode 100644 test/behavior/bugs/6781.zig delete mode 100644 test/behavior/bugs/679.zig delete mode 100644 test/behavior/bugs/6850.zig delete mode 100644 test/behavior/bugs/6905.zig delete mode 100644 test/behavior/bugs/6947.zig delete mode 100644 test/behavior/bugs/7003.zig delete mode 100644 test/behavior/bugs/704.zig delete mode 100644 test/behavior/bugs/7047.zig delete mode 100644 test/behavior/bugs/718.zig delete mode 100644 test/behavior/bugs/7187.zig delete mode 100644 test/behavior/bugs/726.zig delete mode 100644 test/behavior/bugs/7325.zig delete mode 100644 test/behavior/bugs/8277.zig delete mode 100644 test/behavior/bugs/828.zig delete mode 100644 test/behavior/bugs/8646.zig delete mode 100644 test/behavior/bugs/920.zig delete mode 100644 test/behavior/bugs/9584.zig rename test/behavior/{bugs/529_other_file.zig => conflicting_externs/a.zig} (98%) rename test/behavior/{bugs/529_other_file_2.zig => conflicting_externs/b.zig} (100%) rename test/behavior/{bugs/529.zig => multiple_externs_with_conflicting_types.zig} (77%) diff --git a/test/behavior.zig b/test/behavior.zig index 5c9d714165..d890a3c25f 100644 --- a/test/behavior.zig +++ b/test/behavior.zig @@ -12,136 +12,6 @@ test { _ = @import("behavior/bitcast.zig"); _ = @import("behavior/bitreverse.zig"); _ = @import("behavior/bool.zig"); - // Ideally, all tests would be categorized and independent from GitHub, but - // if that's too much trouble, having test coverage this way is better than nothing. - _ = @import("behavior/bugs/394.zig"); - _ = @import("behavior/bugs/421.zig"); - _ = @import("behavior/bugs/529.zig"); - _ = @import("behavior/bugs/624.zig"); - _ = @import("behavior/bugs/655.zig"); - _ = @import("behavior/bugs/656.zig"); - _ = @import("behavior/bugs/679.zig"); - _ = @import("behavior/bugs/704.zig"); - _ = @import("behavior/bugs/718.zig"); - _ = @import("behavior/bugs/726.zig"); - _ = @import("behavior/bugs/828.zig"); - _ = @import("behavior/bugs/920.zig"); - _ = @import("behavior/bugs/1025.zig"); - _ = @import("behavior/bugs/1076.zig"); - _ = @import("behavior/bugs/1277.zig"); - _ = @import("behavior/bugs/1310.zig"); - _ = @import("behavior/bugs/1381.zig"); - _ = @import("behavior/bugs/1421.zig"); - _ = @import("behavior/bugs/1442.zig"); - _ = @import("behavior/bugs/1486.zig"); - _ = @import("behavior/bugs/1500.zig"); - _ = @import("behavior/bugs/1607.zig"); - _ = @import("behavior/bugs/1735.zig"); - _ = @import("behavior/bugs/1851.zig"); - _ = @import("behavior/bugs/1914.zig"); - _ = @import("behavior/bugs/2006.zig"); - _ = @import("behavior/bugs/2114.zig"); - _ = @import("behavior/bugs/2346.zig"); - _ = @import("behavior/bugs/2557.zig"); - _ = @import("behavior/bugs/2578.zig"); - _ = @import("behavior/bugs/2622.zig"); - _ = @import("behavior/bugs/2692.zig"); - _ = @import("behavior/bugs/2727.zig"); - _ = @import("behavior/bugs/2889.zig"); - _ = @import("behavior/bugs/3007.zig"); - _ = @import("behavior/bugs/3046.zig"); - _ = @import("behavior/bugs/3112.zig"); - _ = @import("behavior/bugs/3367.zig"); - _ = @import("behavior/bugs/3384.zig"); - _ = @import("behavior/bugs/3586.zig"); - _ = @import("behavior/bugs/3742.zig"); - _ = @import("behavior/bugs/4328.zig"); - _ = @import("behavior/bugs/4560.zig"); - _ = @import("behavior/bugs/4769_a.zig"); - _ = @import("behavior/bugs/4769_b.zig"); - _ = @import("behavior/bugs/4954.zig"); - _ = @import("behavior/bugs/5398.zig"); - _ = @import("behavior/bugs/5413.zig"); - _ = @import("behavior/bugs/5474.zig"); - _ = @import("behavior/bugs/5487.zig"); - _ = @import("behavior/bugs/6047.zig"); - _ = @import("behavior/bugs/6456.zig"); - _ = @import("behavior/bugs/6781.zig"); - _ = @import("behavior/bugs/6850.zig"); - _ = @import("behavior/bugs/6905.zig"); - _ = @import("behavior/bugs/6947.zig"); - _ = @import("behavior/bugs/7003.zig"); - _ = @import("behavior/bugs/7047.zig"); - _ = @import("behavior/bugs/7187.zig"); - _ = @import("behavior/bugs/7325.zig"); - _ = @import("behavior/bugs/8277.zig"); - _ = @import("behavior/bugs/8646.zig"); - _ = @import("behavior/bugs/9584.zig"); - _ = @import("behavior/bugs/10138.zig"); - _ = @import("behavior/bugs/10147.zig"); - _ = @import("behavior/bugs/10970.zig"); - _ = @import("behavior/bugs/10684.zig"); - _ = @import("behavior/bugs/11046.zig"); - _ = @import("behavior/bugs/11100.zig"); - _ = @import("behavior/bugs/11139.zig"); - _ = @import("behavior/bugs/11159.zig"); - _ = @import("behavior/bugs/11162.zig"); - _ = @import("behavior/bugs/11165.zig"); - _ = @import("behavior/bugs/11179.zig"); - _ = @import("behavior/bugs/11181.zig"); - _ = @import("behavior/bugs/11213.zig"); - _ = @import("behavior/bugs/11787.zig"); - _ = @import("behavior/bugs/11816.zig"); - _ = @import("behavior/bugs/11995.zig"); - _ = @import("behavior/bugs/12000.zig"); - _ = @import("behavior/bugs/12003.zig"); - _ = @import("behavior/bugs/12025.zig"); - _ = @import("behavior/bugs/12033.zig"); - _ = @import("behavior/bugs/12043.zig"); - _ = @import("behavior/bugs/12051.zig"); - _ = @import("behavior/bugs/12092.zig"); - _ = @import("behavior/bugs/12119.zig"); - _ = @import("behavior/bugs/12142.zig"); - _ = @import("behavior/bugs/12169.zig"); - _ = @import("behavior/bugs/12430.zig"); - _ = @import("behavior/bugs/12450.zig"); - _ = @import("behavior/bugs/12486.zig"); - _ = @import("behavior/bugs/12498.zig"); - _ = @import("behavior/bugs/12551.zig"); - _ = @import("behavior/bugs/12571.zig"); - _ = @import("behavior/bugs/12644.zig"); - _ = @import("behavior/bugs/12723.zig"); - _ = @import("behavior/bugs/12776.zig"); - _ = @import("behavior/bugs/12786.zig"); - _ = @import("behavior/bugs/12794.zig"); - _ = @import("behavior/bugs/12801-1.zig"); - _ = @import("behavior/bugs/12801-2.zig"); - _ = @import("behavior/bugs/12885.zig"); - _ = @import("behavior/bugs/12890.zig"); - _ = @import("behavior/bugs/12891.zig"); - _ = @import("behavior/bugs/12911.zig"); - _ = @import("behavior/bugs/12928.zig"); - _ = @import("behavior/bugs/12945.zig"); - _ = @import("behavior/bugs/12972.zig"); - _ = @import("behavior/bugs/12984.zig"); - _ = @import("behavior/bugs/13064.zig"); - _ = @import("behavior/bugs/13065.zig"); - _ = @import("behavior/bugs/13068.zig"); - _ = @import("behavior/bugs/13069.zig"); - _ = @import("behavior/bugs/13112.zig"); - _ = @import("behavior/bugs/13113.zig"); - _ = @import("behavior/bugs/13128.zig"); - _ = @import("behavior/bugs/13159.zig"); - _ = @import("behavior/bugs/13171.zig"); - _ = @import("behavior/bugs/13209.zig"); - _ = @import("behavior/bugs/13285.zig"); - _ = @import("behavior/bugs/13366.zig"); - _ = @import("behavior/bugs/13435.zig"); - _ = @import("behavior/bugs/13664.zig"); - _ = @import("behavior/bugs/13714.zig"); - _ = @import("behavior/bugs/13785.zig"); - _ = @import("behavior/bugs/14854.zig"); - _ = @import("behavior/bugs/15778.zig"); _ = @import("behavior/byteswap.zig"); _ = @import("behavior/byval_arg_var.zig"); _ = @import("behavior/c_char_signedness.zig"); @@ -189,6 +59,7 @@ test { _ = @import("behavior/memset.zig"); _ = @import("behavior/merge_error_sets.zig"); _ = @import("behavior/muladd.zig"); + _ = @import("behavior/multiple_externs_with_conflicting_types.zig"); _ = @import("behavior/namespace_depends_on_compile_var.zig"); _ = @import("behavior/nan.zig"); _ = @import("behavior/null.zig"); diff --git a/test/behavior/array.zig b/test/behavior/array.zig index e9a7f4b9c0..8204453de6 100644 --- a/test/behavior/array.zig +++ b/test/behavior/array.zig @@ -827,3 +827,121 @@ test "tuple initialized through reference to anonymous array init provides resul try expect(foo[0] == 12345); try expect(@intFromPtr(foo[1]) == 0x1000); } + +test "copied array element doesn't alias source" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + var x: [10][10]u32 = undefined; + + x[0][1] = 0; + const a = x[0]; + x[0][1] = 15; + + try expect(a[1] == 0); +} + +test "array initialized with string literal" { + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const S = struct { + a: u32, + c: [5]u8, + }; + const U = union { + s: S, + }; + const s_1 = S{ + .a = undefined, + .c = "12345".*, // this caused problems + }; + + var u_2 = U{ .s = s_1 }; + _ = &u_2; + try std.testing.expectEqualStrings("12345", &u_2.s.c); +} + +test "array initialized with array with sentinel" { + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const S = struct { + a: u32, + c: [5]u8, + }; + const U = union { + s: S, + }; + const c = [5:0]u8{ 1, 2, 3, 4, 5 }; + const s_1 = S{ + .a = undefined, + .c = c, // this caused problems + }; + var u_2 = U{ .s = s_1 }; + _ = &u_2; + try std.testing.expectEqualSlices(u8, &.{ 1, 2, 3, 4, 5 }, &u_2.s.c); +} + +test "store array of array of structs at comptime" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const S = struct { + fn storeArrayOfArrayOfStructs() u8 { + const S = struct { + x: u8, + }; + + var cases = [_][1]S{ + [_]S{ + S{ .x = 15 }, + }, + }; + _ = &cases; + return cases[0][0].x; + } + }; + + try expect(S.storeArrayOfArrayOfStructs() == 15); + try comptime expect(S.storeArrayOfArrayOfStructs() == 15); +} + +test "accessing multidimensional global array at comptime" { + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const S = struct { + const array = [_][]const []const u8{ + &.{"hello"}, + &.{ "world", "hello" }, + }; + }; + + try std.testing.expect(S.array[0].len == 1); + try std.testing.expectEqualStrings("hello", S.array[0][0]); +} + +test "union that needs padding bytes inside an array" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const B = union(enum) { + D: u8, + E: u16, + }; + const A = union(enum) { + B: B, + C: u8, + }; + var as = [_]A{ + A{ .B = B{ .D = 1 } }, + A{ .B = B{ .D = 1 } }, + }; + _ = &as; + + const a = as[0].B; + try std.testing.expect(a.D == 1); +} diff --git a/test/behavior/basic.zig b/test/behavior/basic.zig index a0081839e0..32afd06e02 100644 --- a/test/behavior/basic.zig +++ b/test/behavior/basic.zig @@ -1219,3 +1219,184 @@ test "integer compare" { try comptime S.doTheTestSigned(T); } } + +test "reference to inferred local variable works as expected" { + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const Crasher = struct { + lets_crash: u64 = 0, + }; + + var a: Crasher = undefined; + const crasher_ptr = &a; + var crasher_local = crasher_ptr.*; + const crasher_local_ptr = &crasher_local; + crasher_local_ptr.lets_crash = 1; + + try expect(crasher_local.lets_crash != a.lets_crash); +} + +test "@Type returned from block" { + const T = comptime b: { + break :b @Type(.{ .Int = .{ + .signedness = .unsigned, + .bits = 8, + } }); + }; + try std.testing.expect(T == u8); +} + +test "comptime variable initialized with addresses of literals" { + comptime var st = .{ + .foo = &1, + .bar = &2, + }; + _ = &st; + + inline for (@typeInfo(@TypeOf(st)).Struct.fields) |field| { + _ = field; + } +} + +test "pointer to tuple field can be dereferenced at comptime" { + comptime { + const tuple_with_ptrs = .{ &0, &0 }; + const field_ptr = (&tuple_with_ptrs.@"0"); + _ = field_ptr.*; + } +} + +test "proper value is returned from labeled block" { + const S = struct { + fn hash(v: *u32, key: anytype) void { + const Key = @TypeOf(key); + if (@typeInfo(Key) == .ErrorSet) { + v.* += 1; + return; + } + switch (@typeInfo(Key)) { + .ErrorUnion => blk: { + const payload = key catch |err| { + hash(v, err); + break :blk; + }; + + hash(v, payload); + }, + + else => unreachable, + } + } + }; + const g: error{Test}!void = error.Test; + + var v: u32 = 0; + S.hash(&v, g); + try expect(v == 1); +} + +test "const inferred array of slices" { + const T = struct { v: bool }; + + const decls = [_][]const T{ + &[_]T{ + .{ .v = false }, + }, + }; + _ = decls; +} + +test "var inferred array of slices" { + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const T = struct { v: bool }; + + var decls = [_][]const T{ + &[_]T{ + .{ .v = false }, + }, + }; + _ = &decls; +} + +test "copy array of self-referential struct" { + const ListNode = struct { + next: ?*const @This() = null, + }; + comptime var nodes = [_]ListNode{ .{}, .{} }; + nodes[0].next = &nodes[1]; + const copied_nodes = nodes; + _ = copied_nodes; +} + +test "break out of block based on comptime known values" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const S = struct { + const source = "A-"; + + fn parseNote() ?i32 { + const letter = source[0]; + const modifier = source[1]; + + const semitone = blk: { + if (letter == 'C' and modifier == '-') break :blk @as(i32, 0); + if (letter == 'C' and modifier == '#') break :blk @as(i32, 1); + if (letter == 'D' and modifier == '-') break :blk @as(i32, 2); + if (letter == 'D' and modifier == '#') break :blk @as(i32, 3); + if (letter == 'E' and modifier == '-') break :blk @as(i32, 4); + if (letter == 'F' and modifier == '-') break :blk @as(i32, 5); + if (letter == 'F' and modifier == '#') break :blk @as(i32, 6); + if (letter == 'G' and modifier == '-') break :blk @as(i32, 7); + if (letter == 'G' and modifier == '#') break :blk @as(i32, 8); + if (letter == 'A' and modifier == '-') break :blk @as(i32, 9); + if (letter == 'A' and modifier == '#') break :blk @as(i32, 10); + if (letter == 'B' and modifier == '-') break :blk @as(i32, 11); + return null; + }; + + return semitone; + } + }; + const result = S.parseNote(); + try std.testing.expect(result.? == 9); +} + +test "allocation and looping over 3-byte integer" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + if (builtin.zig_backend == .stage2_llvm and builtin.os.tag == .macos) { + return error.SkipZigTest; // TODO + } + + if (builtin.zig_backend == .stage2_llvm and builtin.cpu.arch == .wasm32) { + return error.SkipZigTest; // TODO + } + + try expect(@sizeOf(u24) == 4); + try expect(@sizeOf([1]u24) == 4); + try expect(@alignOf(u24) == 4); + try expect(@alignOf([1]u24) == 4); + + var x = try std.testing.allocator.alloc(u24, 2); + defer std.testing.allocator.free(x); + try expect(x.len == 2); + x[0] = 0xFFFFFF; + x[1] = 0xFFFFFF; + + const bytes = std.mem.sliceAsBytes(x); + try expect(@TypeOf(bytes) == []align(4) u8); + try expect(bytes.len == 8); + + for (bytes) |*b| { + b.* = 0x00; + } + + try expect(x[0] == 0x00); + try expect(x[1] == 0x00); +} diff --git a/test/behavior/bit_shifting.zig b/test/behavior/bit_shifting.zig index a25506efc6..216d9eeaa5 100644 --- a/test/behavior/bit_shifting.zig +++ b/test/behavior/bit_shifting.zig @@ -152,3 +152,9 @@ test "Saturating Shift Left where lhs is of a computed type" { try expect(value.value == 2); try expect(value.exponent == 0); } + +comptime { + var image: [1]u8 = undefined; + _ = ℑ + _ = @shlExact(@as(u16, image[0]), 8); +} diff --git a/test/behavior/bool.zig b/test/behavior/bool.zig index 5d09e5f8a0..4b72022d40 100644 --- a/test/behavior/bool.zig +++ b/test/behavior/bool.zig @@ -90,3 +90,12 @@ fn testShortCircuit(f: bool, t: bool) !void { try expect(hit_3); try expect(hit_4); } + +test "or with noreturn operand" { + const S = struct { + fn foo(a: u32, b: u32) bool { + return a == 5 or b == 2 or @panic("oh no"); + } + }; + _ = S.foo(2, 2); +} diff --git a/test/behavior/bugs/10138.zig b/test/behavior/bugs/10138.zig deleted file mode 100644 index 56d8450f33..0000000000 --- a/test/behavior/bugs/10138.zig +++ /dev/null @@ -1,34 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -test "registers get overwritten when ignoring return" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.cpu.arch != .x86_64 or builtin.os.tag != .linux) return error.SkipZigTest; - - const fd = open(); - _ = write(fd, "a", 1); - _ = close(fd); -} - -fn open() usize { - return 42; -} - -fn write(fd: usize, a: [*]const u8, len: usize) usize { - return syscall4(.WRITE, fd, @intFromPtr(a), len); -} - -fn syscall4(n: enum { WRITE }, a: usize, b: usize, c: usize) usize { - _ = n; - _ = a; - _ = b; - _ = c; - return 23; -} - -fn close(fd: usize) usize { - if (fd != 42) - unreachable; - return 0; -} diff --git a/test/behavior/bugs/10147.zig b/test/behavior/bugs/10147.zig deleted file mode 100644 index b8d6090479..0000000000 --- a/test/behavior/bugs/10147.zig +++ /dev/null @@ -1,20 +0,0 @@ -const builtin = @import("builtin"); -const std = @import("std"); - -test "test calling @clz on both vector and scalar inputs" { - if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - var x: u32 = 0x1; - _ = &x; - var y: @Vector(4, u32) = [_]u32{ 0x1, 0x1, 0x1, 0x1 }; - _ = &y; - const a = @clz(x); - const b = @clz(y); - try std.testing.expectEqual(@as(u6, 31), a); - try std.testing.expectEqual([_]u6{ 31, 31, 31, 31 }, b); -} diff --git a/test/behavior/bugs/1025.zig b/test/behavior/bugs/1025.zig deleted file mode 100644 index 62d3687ddb..0000000000 --- a/test/behavior/bugs/1025.zig +++ /dev/null @@ -1,14 +0,0 @@ -const builtin = @import("builtin"); - -const A = struct { - B: type, -}; - -fn getA() A { - return A{ .B = u8 }; -} - -test "bug 1025" { - const a = getA(); - try @import("std").testing.expect(a.B == u8); -} diff --git a/test/behavior/bugs/10684.zig b/test/behavior/bugs/10684.zig deleted file mode 100644 index f09dd35771..0000000000 --- a/test/behavior/bugs/10684.zig +++ /dev/null @@ -1,17 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const expectEqualStrings = std.testing.expectEqualStrings; - -test "slicing slices" { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - const foo = "1234"; - const bar = foo[0..4]; - try expectEqualStrings("1234", bar); - try expectEqualStrings("2", bar[1..2]); - try expectEqualStrings("3", bar[2..3]); - try expectEqualStrings("4", bar[3..4]); - try expectEqualStrings("34", bar[2..4]); -} diff --git a/test/behavior/bugs/1076.zig b/test/behavior/bugs/1076.zig deleted file mode 100644 index 26d863d901..0000000000 --- a/test/behavior/bugs/1076.zig +++ /dev/null @@ -1,27 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const mem = std.mem; -const expect = std.testing.expect; - -test "comptime code should not modify constant data" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - try testCastPtrOfArrayToSliceAndPtr(); - try comptime testCastPtrOfArrayToSliceAndPtr(); -} - -fn testCastPtrOfArrayToSliceAndPtr() !void { - { - var array = "aoeu".*; - const x: [*]u8 = &array; - x[0] += 1; - try expect(mem.eql(u8, array[0..], "boeu")); - } - { - var array: [4]u8 = "aoeu".*; - const x: [*]u8 = &array; - x[0] += 1; - try expect(mem.eql(u8, array[0..], "boeu")); - } -} diff --git a/test/behavior/bugs/10970.zig b/test/behavior/bugs/10970.zig deleted file mode 100644 index cd1c78ad98..0000000000 --- a/test/behavior/bugs/10970.zig +++ /dev/null @@ -1,20 +0,0 @@ -const builtin = @import("builtin"); - -fn retOpt() ?u32 { - return null; -} -test "breaking from a loop in an if statement" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - var cond = true; - _ = &cond; - const opt = while (cond) { - if (retOpt()) |opt| { - break opt; - } - break 1; - } else 2; - _ = opt; -} diff --git a/test/behavior/bugs/11046.zig b/test/behavior/bugs/11046.zig deleted file mode 100644 index 3c08dc649e..0000000000 --- a/test/behavior/bugs/11046.zig +++ /dev/null @@ -1,22 +0,0 @@ -const builtin = @import("builtin"); - -fn foo() !void { - var a = true; - _ = &a; - if (a) return error.Foo; - return error.Bar; -} -fn bar() !void { - try foo(); -} - -test "fixed" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - bar() catch |err| switch (err) { - error.Foo => {}, // error: expected (inferred error set of bar), found error{Foo} - error.Bar => {}, - }; -} diff --git a/test/behavior/bugs/11100.zig b/test/behavior/bugs/11100.zig deleted file mode 100644 index 7e4ef7ce67..0000000000 --- a/test/behavior/bugs/11100.zig +++ /dev/null @@ -1,13 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -pub fn do() bool { - inline for (.{"a"}) |_| { - if (true) return false; - } - return true; -} - -test "bug" { - try std.testing.expect(!do()); -} diff --git a/test/behavior/bugs/11139.zig b/test/behavior/bugs/11139.zig deleted file mode 100644 index 93b25f3921..0000000000 --- a/test/behavior/bugs/11139.zig +++ /dev/null @@ -1,26 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const expect = std.testing.expect; - -test "store array of array of structs at comptime" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - try expect(storeArrayOfArrayOfStructs() == 15); - try comptime expect(storeArrayOfArrayOfStructs() == 15); -} - -fn storeArrayOfArrayOfStructs() u8 { - const S = struct { - x: u8, - }; - - var cases = [_][1]S{ - [_]S{ - S{ .x = 15 }, - }, - }; - _ = &cases; - return cases[0][0].x; -} diff --git a/test/behavior/bugs/11159.zig b/test/behavior/bugs/11159.zig deleted file mode 100644 index 56ffb45b82..0000000000 --- a/test/behavior/bugs/11159.zig +++ /dev/null @@ -1,19 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -test { - const T = @TypeOf(.{ @as(i32, 0), @as(u32, 0) }); - var a: T = .{ 0, 0 }; - _ = &a; -} - -test { - const S = struct { - comptime x: i32 = 0, - comptime y: u32 = 0, - }; - var a: S = .{}; - _ = &a; - var b = S{}; - _ = &b; -} diff --git a/test/behavior/bugs/11162.zig b/test/behavior/bugs/11162.zig deleted file mode 100644 index 918cf1c793..0000000000 --- a/test/behavior/bugs/11162.zig +++ /dev/null @@ -1,16 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const expect = std.testing.expect; - -test "aggregate initializers should allow initializing comptime fields, verifying equality" { - if (true) return error.SkipZigTest; // TODO - - var x: u32 = 15; - _ = &x; - const T = @TypeOf(.{ @as(i32, -1234), @as(u32, 5678), x }); - const a: T = .{ -1234, 5678, x + 1 }; - - try expect(a[0] == -1234); - try expect(a[1] == 5678); - try expect(a[2] == 16); -} diff --git a/test/behavior/bugs/11165.zig b/test/behavior/bugs/11165.zig deleted file mode 100644 index ff4695f647..0000000000 --- a/test/behavior/bugs/11165.zig +++ /dev/null @@ -1,44 +0,0 @@ -const builtin = @import("builtin"); - -test "bytes" { - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - const S = struct { - a: u32, - c: [5]u8, - }; - - const U = union { - s: S, - }; - - const s_1 = S{ - .a = undefined, - .c = "12345".*, // this caused problems - }; - - var u_2 = U{ .s = s_1 }; - _ = &u_2; -} - -test "aggregate" { - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - const S = struct { - a: u32, - c: [5]u8, - }; - - const U = union { - s: S, - }; - - const c = [5:0]u8{ 1, 2, 3, 4, 5 }; - const s_1 = S{ - .a = undefined, - .c = c, // this caused problems - }; - - var u_2 = U{ .s = s_1 }; - _ = &u_2; -} diff --git a/test/behavior/bugs/11179.zig b/test/behavior/bugs/11179.zig deleted file mode 100644 index ca3a27c5d1..0000000000 --- a/test/behavior/bugs/11179.zig +++ /dev/null @@ -1,19 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const Type = std.builtin.Type; - -test "Tuple" { - const fields_list = fields(@TypeOf(.{})); - if (fields_list.len != 0) - @compileError("Argument count mismatch"); -} - -pub fn fields(comptime T: type) switch (@typeInfo(T)) { - .Struct => []const Type.StructField, - else => unreachable, -} { - return switch (@typeInfo(T)) { - .Struct => |info| info.fields, - else => unreachable, - }; -} diff --git a/test/behavior/bugs/11181.zig b/test/behavior/bugs/11181.zig deleted file mode 100644 index 7819fe0ad8..0000000000 --- a/test/behavior/bugs/11181.zig +++ /dev/null @@ -1,25 +0,0 @@ -const builtin = @import("builtin"); - -test "const inferred array of slices" { - const T = struct { v: bool }; - - const decls = [_][]const T{ - &[_]T{ - .{ .v = false }, - }, - }; - _ = decls; -} - -test "var inferred array of slices" { - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - const T = struct { v: bool }; - - var decls = [_][]const T{ - &[_]T{ - .{ .v = false }, - }, - }; - _ = &decls; -} diff --git a/test/behavior/bugs/11213.zig b/test/behavior/bugs/11213.zig deleted file mode 100644 index 7f13b6efd8..0000000000 --- a/test/behavior/bugs/11213.zig +++ /dev/null @@ -1,33 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const testing = std.testing; - -test { - const g: error{Test}!void = error.Test; - - var v: u32 = 0; - hash(&v, g); - try testing.expect(v == 1); -} - -fn hash(v: *u32, key: anytype) void { - const Key = @TypeOf(key); - - if (@typeInfo(Key) == .ErrorSet) { - v.* += 1; - return; - } - - switch (@typeInfo(Key)) { - .ErrorUnion => blk: { - const payload = key catch |err| { - hash(v, err); - break :blk; - }; - - hash(v, payload); - }, - - else => unreachable, - } -} diff --git a/test/behavior/bugs/11787.zig b/test/behavior/bugs/11787.zig deleted file mode 100644 index 7b395d155b..0000000000 --- a/test/behavior/bugs/11787.zig +++ /dev/null @@ -1,19 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const testing = std.testing; - -test "slicing zero length array field of struct" { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - const S = struct { - a: [0]usize, - fn foo(self: *@This(), start: usize, end: usize) []usize { - return self.a[start..end]; - } - }; - var s: S = undefined; - try testing.expect(s.foo(0, 0).len == 0); -} diff --git a/test/behavior/bugs/11816.zig b/test/behavior/bugs/11816.zig deleted file mode 100644 index cb548ef2e9..0000000000 --- a/test/behavior/bugs/11816.zig +++ /dev/null @@ -1,14 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -test { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - var x: u32 = 3; - const val: usize = while (true) switch (x) { - 1 => break 2, - else => x -= 1, - }; - try std.testing.expect(val == 2); -} diff --git a/test/behavior/bugs/11995.zig b/test/behavior/bugs/11995.zig deleted file mode 100644 index 8ddf80fd8e..0000000000 --- a/test/behavior/bugs/11995.zig +++ /dev/null @@ -1,33 +0,0 @@ -const std = @import("std"); -const testing = std.testing; -const builtin = @import("builtin"); - -fn wuffs_base__make_io_buffer(arg_data: wuffs_base__slice_u8, arg_meta: *wuffs_base__io_buffer_meta) callconv(.C) void { - arg_data.ptr[0] = 'w'; - arg_meta.closed = false; -} -const wuffs_base__io_buffer_meta = extern struct { - wi: usize, - ri: usize, - pos: u64, - closed: bool, -}; -const wuffs_base__slice_u8 = extern struct { - ptr: [*c]u8, - len: usize, -}; -test { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - var string: [5]u8 = "hello".*; - const arg_data = wuffs_base__slice_u8{ .ptr = @as([*c]u8, @ptrCast(&string)), .len = string.len }; - var arg_meta = wuffs_base__io_buffer_meta{ .wi = 1, .ri = 2, .pos = 3, .closed = true }; - wuffs_base__make_io_buffer(arg_data, &arg_meta); - try std.testing.expectEqualStrings("wello", arg_data.ptr[0..arg_data.len]); - try std.testing.expectEqual(@as(usize, 1), arg_meta.wi); - try std.testing.expectEqual(@as(usize, 2), arg_meta.ri); - try std.testing.expectEqual(@as(u64, 3), arg_meta.pos); - try std.testing.expect(!arg_meta.closed); -} diff --git a/test/behavior/bugs/12000.zig b/test/behavior/bugs/12000.zig deleted file mode 100644 index d13e402d87..0000000000 --- a/test/behavior/bugs/12000.zig +++ /dev/null @@ -1,16 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -const T = struct { - next: @TypeOf(null, @as(*const T, undefined)), -}; - -test { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - var t: T = .{ .next = null }; - _ = &t; - try std.testing.expect(t.next == null); -} diff --git a/test/behavior/bugs/12003.zig b/test/behavior/bugs/12003.zig deleted file mode 100644 index 98c74b77ab..0000000000 --- a/test/behavior/bugs/12003.zig +++ /dev/null @@ -1,7 +0,0 @@ -test { - comptime { - const tuple_with_ptrs = .{ &0, &0 }; - const field_ptr = (&tuple_with_ptrs.@"0"); - _ = field_ptr.*; - } -} diff --git a/test/behavior/bugs/12025.zig b/test/behavior/bugs/12025.zig deleted file mode 100644 index 73eca7c99b..0000000000 --- a/test/behavior/bugs/12025.zig +++ /dev/null @@ -1,13 +0,0 @@ -const builtin = @import("builtin"); - -test { - comptime var st = .{ - .foo = &1, - .bar = &2, - }; - _ = &st; - - inline for (@typeInfo(@TypeOf(st)).Struct.fields) |field| { - _ = field; - } -} diff --git a/test/behavior/bugs/12033.zig b/test/behavior/bugs/12033.zig deleted file mode 100644 index b7ff501e35..0000000000 --- a/test/behavior/bugs/12033.zig +++ /dev/null @@ -1,13 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -test { - const string = "Hello!\x00World!"; - try std.testing.expect(@TypeOf(string) == *const [13:0]u8); - - const slice_without_sentinel: []const u8 = string[0..6]; - try std.testing.expect(@TypeOf(slice_without_sentinel) == []const u8); - - const slice_with_sentinel: [:0]const u8 = string[0..6 :0]; - try std.testing.expect(@TypeOf(slice_with_sentinel) == [:0]const u8); -} diff --git a/test/behavior/bugs/12043.zig b/test/behavior/bugs/12043.zig deleted file mode 100644 index 1b04ecab46..0000000000 --- a/test/behavior/bugs/12043.zig +++ /dev/null @@ -1,13 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const expect = std.testing.expect; - -var ok = false; -fn foo(x: anytype) void { - ok = x; -} -test { - const x = &foo; - x(true); - try expect(ok); -} diff --git a/test/behavior/bugs/12051.zig b/test/behavior/bugs/12051.zig deleted file mode 100644 index a8665af2a4..0000000000 --- a/test/behavior/bugs/12051.zig +++ /dev/null @@ -1,40 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -test { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - const x = X{}; - try std.testing.expectEqual(@as(u16, 0), x.y.a); - try std.testing.expectEqual(false, x.y.b); - try std.testing.expectEqual(Z{ .a = 0 }, x.y.c); - try std.testing.expectEqual(Z{ .a = 0 }, x.y.d); -} - -const X = struct { - y: Y = Y.init(), -}; - -const Y = struct { - a: u16, - b: bool, - c: Z, - d: Z, - - fn init() Y { - return .{ - .a = 0, - .b = false, - .c = @as(Z, @bitCast(@as(u32, 0))), - .d = @as(Z, @bitCast(@as(u32, 0))), - }; - } -}; - -const Z = packed struct { - a: u32, -}; diff --git a/test/behavior/bugs/12092.zig b/test/behavior/bugs/12092.zig deleted file mode 100644 index 673a0f1f47..0000000000 --- a/test/behavior/bugs/12092.zig +++ /dev/null @@ -1,28 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -const Foo = struct { - a: Bar, -}; - -const Bar = struct { - b: u32, -}; - -fn takeFoo(foo: *const Foo) !void { - try std.testing.expectEqual(@as(u32, 24), foo.a.b); -} - -test { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - var baz: u32 = 24; - _ = &baz; - try takeFoo(&.{ - .a = .{ - .b = baz, - }, - }); -} diff --git a/test/behavior/bugs/12119.zig b/test/behavior/bugs/12119.zig deleted file mode 100644 index 20ee7a9756..0000000000 --- a/test/behavior/bugs/12119.zig +++ /dev/null @@ -1,15 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -const u8x32 = @Vector(32, u8); -const u32x8 = @Vector(8, u32); - -test { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - const zerox32: u8x32 = [_]u8{0} ** 32; - const bigsum: u32x8 = @as(u32x8, @bitCast(zerox32)); - try std.testing.expectEqual(0, @reduce(.Add, bigsum)); -} diff --git a/test/behavior/bugs/12142.zig b/test/behavior/bugs/12142.zig deleted file mode 100644 index 14fb8af15a..0000000000 --- a/test/behavior/bugs/12142.zig +++ /dev/null @@ -1,36 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -const Holder = struct { - array: []const u8, -}; - -const Test = struct { - holders: []const Holder, -}; - -const Letter = enum(u8) { - A = 0x41, - B, -}; - -fn letter(e: Letter) u8 { - return @intFromEnum(e); -} - -test { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - const test_struct = Test{ - .holders = &.{ - Holder{ - .array = &.{ - letter(.A), - }, - }, - }, - }; - try std.testing.expectEqualStrings("A", test_struct.holders[0].array); -} diff --git a/test/behavior/bugs/12169.zig b/test/behavior/bugs/12169.zig deleted file mode 100644 index c8bf7ae543..0000000000 --- a/test/behavior/bugs/12169.zig +++ /dev/null @@ -1,19 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -test { - if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - if (comptime builtin.zig_backend == .stage2_llvm and builtin.cpu.arch.endian() == .big) { - // https://github.com/ziglang/zig/issues/13782 - return error.SkipZigTest; - } - - const a = @Vector(2, bool){ true, true }; - const b = @Vector(1, bool){true}; - try std.testing.expect(@reduce(.And, a)); - try std.testing.expect(@reduce(.And, b)); -} diff --git a/test/behavior/bugs/12430.zig b/test/behavior/bugs/12430.zig deleted file mode 100644 index cbf1658b1c..0000000000 --- a/test/behavior/bugs/12430.zig +++ /dev/null @@ -1,11 +0,0 @@ -const std = @import("std"); - -test { - const T = comptime b: { - break :b @Type(.{ .Int = .{ - .signedness = .unsigned, - .bits = 8, - } }); - }; - try std.testing.expect(T == u8); -} diff --git a/test/behavior/bugs/12450.zig b/test/behavior/bugs/12450.zig deleted file mode 100644 index d02915a8c0..0000000000 --- a/test/behavior/bugs/12450.zig +++ /dev/null @@ -1,22 +0,0 @@ -const expect = @import("std").testing.expect; -const builtin = @import("builtin"); - -const Foo = packed struct { - a: i32, - b: u8, -}; - -var buffer: [256]u8 = undefined; - -test { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - var f1: *align(16) Foo = @alignCast(@as(*align(1) Foo, @ptrCast(&buffer[0]))); - try expect(@typeInfo(@TypeOf(f1)).Pointer.alignment == 16); - try expect(@intFromPtr(f1) == @intFromPtr(&f1.a)); - try expect(@typeInfo(@TypeOf(&f1.a)).Pointer.alignment == 16); -} diff --git a/test/behavior/bugs/12486.zig b/test/behavior/bugs/12486.zig deleted file mode 100644 index f0d357efd1..0000000000 --- a/test/behavior/bugs/12486.zig +++ /dev/null @@ -1,49 +0,0 @@ -const SomeEnum = union(enum) { - EnumVariant: u8, -}; - -const SomeStruct = struct { - struct_field: u8, -}; - -const OptEnum = struct { - opt_enum: ?SomeEnum, -}; - -const ErrEnum = struct { - err_enum: anyerror!SomeEnum, -}; - -const OptStruct = struct { - opt_struct: ?SomeStruct, -}; - -const ErrStruct = struct { - err_struct: anyerror!SomeStruct, -}; - -test { - _ = OptEnum{ - .opt_enum = .{ - .EnumVariant = 1, - }, - }; - - _ = ErrEnum{ - .err_enum = .{ - .EnumVariant = 1, - }, - }; - - _ = OptStruct{ - .opt_struct = .{ - .struct_field = 1, - }, - }; - - _ = ErrStruct{ - .err_struct = .{ - .struct_field = 1, - }, - }; -} diff --git a/test/behavior/bugs/12498.zig b/test/behavior/bugs/12498.zig deleted file mode 100644 index fd9ee98d29..0000000000 --- a/test/behavior/bugs/12498.zig +++ /dev/null @@ -1,9 +0,0 @@ -const std = @import("std"); -const expect = std.testing.expect; - -const S = struct { a: usize }; -test "lazy abi size used in comparison" { - var rhs: i32 = 100; - _ = &rhs; - try expect(@sizeOf(S) < rhs); -} diff --git a/test/behavior/bugs/12551.zig b/test/behavior/bugs/12551.zig deleted file mode 100644 index df01e5cbdd..0000000000 --- a/test/behavior/bugs/12551.zig +++ /dev/null @@ -1,11 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -test { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - try std.testing.expect(for ([1]u8{0}) |x| { - if (x == 0) break true; - } else false); -} diff --git a/test/behavior/bugs/12571.zig b/test/behavior/bugs/12571.zig deleted file mode 100644 index f474c32824..0000000000 --- a/test/behavior/bugs/12571.zig +++ /dev/null @@ -1,23 +0,0 @@ -const builtin = @import("builtin"); -const std = @import("std"); -const expect = std.testing.expect; - -const Frame = packed struct { - num: u20, -}; - -const Entry = packed struct { - other: u12, - frame: Frame, -}; - -test { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - const frame = Frame{ .num = 0x7FDE }; - var entry = Entry{ .other = 0, .frame = .{ .num = 0xFFFFF } }; - entry.frame = frame; - try expect(entry.frame.num == 0x7FDE); -} diff --git a/test/behavior/bugs/12644.zig b/test/behavior/bugs/12644.zig deleted file mode 100644 index d1514d2e47..0000000000 --- a/test/behavior/bugs/12644.zig +++ /dev/null @@ -1,16 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -inline fn foo(comptime T: type) !T { - return error.AnError; -} - -fn main0() !void { - _ = try foo(u8); -} - -test "issue12644" { - main0() catch |e| { - try std.testing.expect(e == error.AnError); - }; -} diff --git a/test/behavior/bugs/12723.zig b/test/behavior/bugs/12723.zig deleted file mode 100644 index 955cc11c11..0000000000 --- a/test/behavior/bugs/12723.zig +++ /dev/null @@ -1,8 +0,0 @@ -const expect = @import("std").testing.expect; - -test "Non-exhaustive enum backed by comptime_int" { - const E = enum(comptime_int) { a, b, c, _ }; - comptime var e: E = .a; - e = @as(E, @enumFromInt(378089457309184723749)); - try expect(@intFromEnum(e) == 378089457309184723749); -} diff --git a/test/behavior/bugs/1277.zig b/test/behavior/bugs/1277.zig deleted file mode 100644 index d5312a378e..0000000000 --- a/test/behavior/bugs/1277.zig +++ /dev/null @@ -1,21 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -const S = struct { - f: ?*const fn () i32, -}; - -const s = S{ .f = &f }; - -fn f() i32 { - return 1234; -} - -test "don't emit an LLVM global for a const function when it's in an optional in a struct" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - try std.testing.expect(s.f.?() == 1234); -} diff --git a/test/behavior/bugs/12776.zig b/test/behavior/bugs/12776.zig deleted file mode 100644 index 8195a9df6f..0000000000 --- a/test/behavior/bugs/12776.zig +++ /dev/null @@ -1,47 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -const RAM = struct { - data: [0xFFFF + 1]u8, - fn new() !RAM { - return RAM{ .data = [_]u8{0} ** 0x10000 }; - } - fn get(self: *RAM, addr: u16) u8 { - return self.data[addr]; - } -}; - -const CPU = packed struct { - interrupts: bool, - ram: *RAM, - fn new(ram: *RAM) !CPU { - return CPU{ - .ram = ram, - .interrupts = false, - }; - } - fn tick(self: *CPU) !void { - var queued_interrupts = self.ram.get(0xFFFF) & self.ram.get(0xFF0F); - _ = &queued_interrupts; - if (self.interrupts and queued_interrupts != 0) { - self.interrupts = false; - } - } -}; - -test { - if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_x86_64) { - // Careful enabling this test, fails randomly. - return error.SkipZigTest; - } - - var ram = try RAM.new(); - var cpu = try CPU.new(&ram); - try cpu.tick(); - try std.testing.expect(cpu.interrupts == false); -} diff --git a/test/behavior/bugs/12786.zig b/test/behavior/bugs/12786.zig deleted file mode 100644 index 958b1ebf86..0000000000 --- a/test/behavior/bugs/12786.zig +++ /dev/null @@ -1,28 +0,0 @@ -const std = @import("std"); - -fn NamespacedGlobals(comptime modules: anytype) type { - return @Type(.{ - .Struct = .{ - .layout = .Auto, - .is_tuple = false, - .fields = &.{ - .{ - .name = "globals", - .type = modules.mach.globals, - .default_value = null, - .is_comptime = false, - .alignment = @alignOf(modules.mach.globals), - }, - }, - .decls = &[_]std.builtin.Type.Declaration{}, - }, - }); -} - -test { - _ = NamespacedGlobals(.{ - .mach = .{ - .globals = struct {}, - }, - }); -} diff --git a/test/behavior/bugs/12794.zig b/test/behavior/bugs/12794.zig deleted file mode 100644 index 2d4f8bafd9..0000000000 --- a/test/behavior/bugs/12794.zig +++ /dev/null @@ -1,38 +0,0 @@ -const std = @import("std"); - -fn NamespacedComponents(comptime modules: anytype) type { - return @Type(.{ - .Struct = .{ - .layout = .Auto, - .is_tuple = false, - .fields = &.{.{ - .name = "components", - .type = @TypeOf(modules.components), - .default_value = null, - .is_comptime = false, - .alignment = @alignOf(@TypeOf(modules.components)), - }}, - .decls = &[_]std.builtin.Type.Declaration{}, - }, - }); -} - -fn namespacedComponents(comptime modules: anytype) NamespacedComponents(modules) { - var x: NamespacedComponents(modules) = undefined; - x.components = modules.components; - return x; -} - -pub fn World(comptime modules: anytype) type { - const all_components = namespacedComponents(modules); - _ = all_components; - return struct {}; -} - -test { - _ = World(.{ - .components = .{ - .location = struct {}, - }, - }); -} diff --git a/test/behavior/bugs/12801-1.zig b/test/behavior/bugs/12801-1.zig deleted file mode 100644 index ff94382d1f..0000000000 --- a/test/behavior/bugs/12801-1.zig +++ /dev/null @@ -1,13 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -comptime capacity: fn () u64 = capacity_, -fn capacity_() u64 { - return 64; -} - -test { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - try std.testing.expect((@This(){}).capacity() == 64); -} diff --git a/test/behavior/bugs/12801-2.zig b/test/behavior/bugs/12801-2.zig deleted file mode 100644 index 6b145e9925..0000000000 --- a/test/behavior/bugs/12801-2.zig +++ /dev/null @@ -1,25 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -const Auto = struct { - auto: [max_len]u8 = undefined, - offset: u64 = 0, - - comptime capacity: *const fn () u64 = capacity, - - const max_len: u64 = 32; - - fn capacity() u64 { - return max_len; - } -}; -test { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - const a: Auto = .{ .offset = 16, .capacity = Auto.capacity }; - try std.testing.expect(a.capacity() == 32); - try std.testing.expect((a.capacity)() == 32); -} diff --git a/test/behavior/bugs/12885.zig b/test/behavior/bugs/12885.zig deleted file mode 100644 index 517def14a1..0000000000 --- a/test/behavior/bugs/12885.zig +++ /dev/null @@ -1,34 +0,0 @@ -const std = @import("std"); -const builtin = std.builtin; -const expect = std.testing.expect; - -const info = .{ - .args = [_]builtin.Type.Error{ - .{ .name = "bar" }, - }, -}; -const Foo = @Type(.{ - .ErrorSet = &info.args, -}); -test "ErrorSet comptime_field_ptr" { - try expect(Foo == error{bar}); -} - -const fn_info = .{ - .params = [_]builtin.Type.Fn.Param{ - .{ .is_generic = false, .is_noalias = false, .type = u8 }, - }, -}; -const Bar = @Type(.{ - .Fn = .{ - .calling_convention = .Unspecified, - .alignment = 0, - .is_generic = false, - .is_var_args = false, - .return_type = void, - .params = &fn_info.params, - }, -}); -test "fn comptime_field_ptr" { - try expect(@typeInfo(Bar) == .Fn); -} diff --git a/test/behavior/bugs/12890.zig b/test/behavior/bugs/12890.zig deleted file mode 100644 index 1316c2745e..0000000000 --- a/test/behavior/bugs/12890.zig +++ /dev/null @@ -1,18 +0,0 @@ -const expect = @import("std").testing.expect; -const builtin = @import("builtin"); - -fn a(b: []u3, c: u3) void { - switch (c) { - 0...1 => b[c] = c, - 2...3 => b[c] = c, - 4...7 => |d| b[d] = c, - } -} -test { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - var arr: [8]u3 = undefined; - a(&arr, 5); - try expect(arr[5] == 5); -} diff --git a/test/behavior/bugs/12891.zig b/test/behavior/bugs/12891.zig deleted file mode 100644 index 20caab294c..0000000000 --- a/test/behavior/bugs/12891.zig +++ /dev/null @@ -1,83 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -test "issue12891" { - const f = 10.0; - var i: usize = 0; - _ = &i; - try std.testing.expect(i < f); -} -test "nan" { - const f = comptime std.math.nan(f64); - var i: usize = 0; - _ = &i; - try std.testing.expect(!(f < i)); -} -test "inf" { - const f = comptime std.math.inf(f64); - var i: usize = 0; - _ = &i; - try std.testing.expect(f > i); -} -test "-inf < 0" { - const f = comptime -std.math.inf(f64); - var i: usize = 0; - _ = &i; - try std.testing.expect(f < i); -} -test "inf >= 1" { - const f = comptime std.math.inf(f64); - var i: usize = 1; - _ = &i; - try std.testing.expect(f >= i); -} -test "isNan(nan * 1)" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - const nan_times_one = comptime std.math.nan(f64) * 1; - try std.testing.expect(std.math.isNan(nan_times_one)); -} -test "runtime isNan(nan * 1)" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - const nan_times_one = std.math.nan(f64) * 1; - try std.testing.expect(std.math.isNan(nan_times_one)); -} -test "isNan(nan * 0)" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - const nan_times_zero = comptime std.math.nan(f64) * 0; - try std.testing.expect(std.math.isNan(nan_times_zero)); - const zero_times_nan = 0 * comptime std.math.nan(f64); - try std.testing.expect(std.math.isNan(zero_times_nan)); -} -test "isNan(inf * 0)" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - const inf_times_zero = comptime std.math.inf(f64) * 0; - try std.testing.expect(std.math.isNan(inf_times_zero)); - const zero_times_inf = 0 * comptime std.math.inf(f64); - try std.testing.expect(std.math.isNan(zero_times_inf)); -} -test "runtime isNan(nan * 0)" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - const nan_times_zero = std.math.nan(f64) * 0; - try std.testing.expect(std.math.isNan(nan_times_zero)); - const zero_times_nan = 0 * std.math.nan(f64); - try std.testing.expect(std.math.isNan(zero_times_nan)); -} -test "runtime isNan(inf * 0)" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - const inf_times_zero = std.math.inf(f64) * 0; - try std.testing.expect(std.math.isNan(inf_times_zero)); - const zero_times_inf = 0 * std.math.inf(f64); - try std.testing.expect(std.math.isNan(zero_times_inf)); -} diff --git a/test/behavior/bugs/12911.zig b/test/behavior/bugs/12911.zig deleted file mode 100644 index acd725fbeb..0000000000 --- a/test/behavior/bugs/12911.zig +++ /dev/null @@ -1,9 +0,0 @@ -const builtin = @import("builtin"); - -const Item = struct { field: u8 }; -const Thing = struct { - array: [1]Item, -}; -test { - _ = Thing{ .array = undefined }; -} diff --git a/test/behavior/bugs/12928.zig b/test/behavior/bugs/12928.zig deleted file mode 100644 index 1d8afdd7c9..0000000000 --- a/test/behavior/bugs/12928.zig +++ /dev/null @@ -1,30 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const expect = std.testing.expect; - -const A = extern struct { - value: *volatile B, -}; -const B = extern struct { - a: u32, - b: i32, -}; - -test { - var a: *A = undefined; - try expect(@TypeOf(&a.value.a) == *volatile u32); - try expect(@TypeOf(&a.value.b) == *volatile i32); -} - -const C = extern struct { - value: *volatile D, -}; -const D = extern union { - a: u32, - b: i32, -}; -test { - var c: *C = undefined; - try expect(@TypeOf(&c.value.a) == *volatile u32); - try expect(@TypeOf(&c.value.b) == *volatile i32); -} diff --git a/test/behavior/bugs/12945.zig b/test/behavior/bugs/12945.zig deleted file mode 100644 index 4eb7701ba4..0000000000 --- a/test/behavior/bugs/12945.zig +++ /dev/null @@ -1,13 +0,0 @@ -const std = @import("std"); -const expect = std.testing.expect; - -fn A( - comptime T: type, - comptime destroycb: ?*const fn (?*T) callconv(.C) void, -) !void { - try expect(destroycb == null); -} - -test { - try A(u32, null); -} diff --git a/test/behavior/bugs/12972.zig b/test/behavior/bugs/12972.zig deleted file mode 100644 index f27a6bac8d..0000000000 --- a/test/behavior/bugs/12972.zig +++ /dev/null @@ -1,18 +0,0 @@ -const builtin = @import("builtin"); - -pub fn f(_: [:null]const ?u8) void {} - -test { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - const c: u8 = 42; - f(&[_:null]?u8{c}); - f(&.{c}); - - var v: u8 = 42; - _ = &v; - f(&[_:null]?u8{v}); - f(&.{v}); -} diff --git a/test/behavior/bugs/12984.zig b/test/behavior/bugs/12984.zig deleted file mode 100644 index 5cbb021ba9..0000000000 --- a/test/behavior/bugs/12984.zig +++ /dev/null @@ -1,20 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -pub fn DeleagateWithContext(comptime Function: type) type { - const ArgArgs = std.meta.ArgsTuple(Function); - return struct { - t: ArgArgs, - }; -} - -pub const OnConfirm = DeleagateWithContext(fn (bool) void); -pub const CustomDraw = DeleagateWithContext(fn (?OnConfirm) void); - -test "simple test" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - - var c: CustomDraw = undefined; - _ = &c; -} diff --git a/test/behavior/bugs/13064.zig b/test/behavior/bugs/13064.zig deleted file mode 100644 index a6fea11e86..0000000000 --- a/test/behavior/bugs/13064.zig +++ /dev/null @@ -1,17 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const expect = std.testing.expect; - -test { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - var x: [10][10]u32 = undefined; - - x[0][1] = 0; - const a = x[0]; - x[0][1] = 15; - - try expect(a[1] == 0); -} diff --git a/test/behavior/bugs/13065.zig b/test/behavior/bugs/13065.zig deleted file mode 100644 index 74f1d01c8c..0000000000 --- a/test/behavior/bugs/13065.zig +++ /dev/null @@ -1,22 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const expect = std.testing.expect; - -const U = union(enum) { - array: [10]u32, - other: u32, -}; - -test { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - var x = U{ .array = undefined }; - - x.array[1] = 0; - const a = x.array; - x.array[1] = 15; - - try expect(a[1] == 0); -} diff --git a/test/behavior/bugs/13068.zig b/test/behavior/bugs/13068.zig deleted file mode 100644 index 03492ea3ff..0000000000 --- a/test/behavior/bugs/13068.zig +++ /dev/null @@ -1,14 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -pub const allocator = std.heap.page_allocator; -var list = std.ArrayList(u32).init(allocator); - -test { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - list.items.len = 0; -} diff --git a/test/behavior/bugs/13069.zig b/test/behavior/bugs/13069.zig deleted file mode 100644 index 916f3ba800..0000000000 --- a/test/behavior/bugs/13069.zig +++ /dev/null @@ -1,17 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const expect = std.testing.expect; - -test { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - var opt_x: ?[3]f32 = [_]f32{0.0} ** 3; - - const x = opt_x.?; - opt_x.?[0] = 15.0; - - try expect(x[0] == 0.0); -} diff --git a/test/behavior/bugs/1310.zig b/test/behavior/bugs/1310.zig deleted file mode 100644 index 876ab79431..0000000000 --- a/test/behavior/bugs/1310.zig +++ /dev/null @@ -1,27 +0,0 @@ -const std = @import("std"); -const expect = std.testing.expect; -const builtin = @import("builtin"); - -pub const VM = ?[*]const struct_InvocationTable_; -pub const struct_InvocationTable_ = extern struct { - GetVM: ?*const fn (?[*]VM) callconv(.C) c_int, -}; - -pub const struct_VM_ = extern struct { - functions: ?[*]const struct_InvocationTable_, -}; - -//excised output from stdlib.h etc - -pub const InvocationTable_ = struct_InvocationTable_; -pub const VM_ = struct_VM_; - -fn agent_callback(_vm: [*]VM, options: [*]u8) callconv(.C) i32 { - _ = _vm; - _ = options; - return 11; -} - -test { - try expect(agent_callback(undefined, undefined) == 11); -} diff --git a/test/behavior/bugs/13112.zig b/test/behavior/bugs/13112.zig deleted file mode 100644 index 6941a20e09..0000000000 --- a/test/behavior/bugs/13112.zig +++ /dev/null @@ -1,7 +0,0 @@ -fn nice(a: u32, b: u32) bool { - return a == 5 or b == 2 or @panic("oh no"); -} - -test { - _ = nice(2, 2); -} diff --git a/test/behavior/bugs/13113.zig b/test/behavior/bugs/13113.zig deleted file mode 100644 index 5a496aa29d..0000000000 --- a/test/behavior/bugs/13113.zig +++ /dev/null @@ -1,20 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -const Foo = extern struct { - a: u8 align(1), - b: u16 align(1), -}; - -test { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - const foo = Foo{ - .a = 1, - .b = 2, - }; - try std.testing.expectEqual(1, foo.a); - try std.testing.expectEqual(2, foo.b); -} diff --git a/test/behavior/bugs/13128.zig b/test/behavior/bugs/13128.zig deleted file mode 100644 index fff5be8e7e..0000000000 --- a/test/behavior/bugs/13128.zig +++ /dev/null @@ -1,29 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const expect = std.testing.expect; - -const U = union(enum) { - x: u128, - y: [17]u8, -}; - -fn foo(val: U) !void { - try expect(val.x == 1); -} - -test "runtime union init, most-aligned field != largest" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - var x: u8 = 1; - _ = &x; - try foo(.{ .x = x }); - - const val: U = @unionInit(U, "x", x); - try expect(val.x == 1); - - const val2: U = .{ .x = x }; - try expect(val2.x == 1); -} diff --git a/test/behavior/bugs/13159.zig b/test/behavior/bugs/13159.zig deleted file mode 100644 index db28f9e5be..0000000000 --- a/test/behavior/bugs/13159.zig +++ /dev/null @@ -1,18 +0,0 @@ -const builtin = @import("builtin"); -const std = @import("std"); -const expect = std.testing.expect; - -const Bar = packed struct { - const Baz = enum { - fizz, - buzz, - }; -}; - -test { - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - var foo = Bar.Baz.fizz; - _ = &foo; - try expect(foo == .fizz); -} diff --git a/test/behavior/bugs/13171.zig b/test/behavior/bugs/13171.zig deleted file mode 100644 index 11579a7356..0000000000 --- a/test/behavior/bugs/13171.zig +++ /dev/null @@ -1,16 +0,0 @@ -const std = @import("std"); -const expect = std.testing.expect; - -fn BuildType(comptime T: type) type { - return struct { - val: union { - b: T, - }, - }; -} - -test { - const TestStruct = BuildType(u32); - const c = TestStruct{ .val = .{ .b = 10 } }; - try expect(c.val.b == 10); -} diff --git a/test/behavior/bugs/13209.zig b/test/behavior/bugs/13209.zig deleted file mode 100644 index f85f0d342c..0000000000 --- a/test/behavior/bugs/13209.zig +++ /dev/null @@ -1,5 +0,0 @@ -const std = @import("std"); -test { - try std.testing.expect(-1 == @as(i8, -3) >> 2); - try std.testing.expect(-1 == -3 >> 2000); -} diff --git a/test/behavior/bugs/13285.zig b/test/behavior/bugs/13285.zig deleted file mode 100644 index a50cf71e55..0000000000 --- a/test/behavior/bugs/13285.zig +++ /dev/null @@ -1,15 +0,0 @@ -const builtin = @import("builtin"); - -const Crasher = struct { - lets_crash: u64 = 0, -}; - -test { - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - var a: Crasher = undefined; - const crasher_ptr = &a; - var crasher_local = crasher_ptr.*; - const crasher_local_ptr = &crasher_local; - crasher_local_ptr.lets_crash = 1; -} diff --git a/test/behavior/bugs/13366.zig b/test/behavior/bugs/13366.zig deleted file mode 100644 index c87f122929..0000000000 --- a/test/behavior/bugs/13366.zig +++ /dev/null @@ -1,28 +0,0 @@ -const builtin = @import("builtin"); -const std = @import("std"); -const expect = std.testing.expect; - -const ComptimeReason = union(enum) { - c_import: struct { - a: u32, - }, -}; - -const Block = struct { - reason: ?*const ComptimeReason, -}; - -test { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - var a: u32 = 16; - _ = &a; - var reason = .{ .c_import = .{ .a = a } }; - var block = Block{ - .reason = &reason, - }; - _ = █ - try expect(block.reason.?.c_import.a == 16); -} diff --git a/test/behavior/bugs/13435.zig b/test/behavior/bugs/13435.zig deleted file mode 100644 index 86a43afa0c..0000000000 --- a/test/behavior/bugs/13435.zig +++ /dev/null @@ -1,22 +0,0 @@ -const std = @import("std"); - -fn CreateUnion(comptime T: type) type { - return @Type(.{ - .Union = .{ - .layout = .Auto, - .tag_type = null, - .fields = &[_]std.builtin.Type.UnionField{ - .{ - .name = "field", - .type = T, - .alignment = @alignOf(T), - }, - }, - .decls = &[_]std.builtin.Type.Declaration{}, - }, - }); -} - -test { - _ = CreateUnion(struct {}); -} diff --git a/test/behavior/bugs/13664.zig b/test/behavior/bugs/13664.zig deleted file mode 100644 index 02b719cfba..0000000000 --- a/test/behavior/bugs/13664.zig +++ /dev/null @@ -1,28 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -const Fields = packed struct { - timestamp: u50, - random_bits: u13, -}; -const ID = packed union { - value: u63, - fields: Fields, -}; -fn value() i64 { - return 1341; -} -test { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; - - const timestamp: i64 = value(); - const id = ID{ .fields = Fields{ - .timestamp = @as(u50, @intCast(timestamp)), - .random_bits = 420, - } }; - try std.testing.expect((ID{ .value = id.value }).fields.timestamp == timestamp); -} diff --git a/test/behavior/bugs/13714.zig b/test/behavior/bugs/13714.zig deleted file mode 100644 index b1902720c5..0000000000 --- a/test/behavior/bugs/13714.zig +++ /dev/null @@ -1,5 +0,0 @@ -comptime { - var image: [1]u8 = undefined; - _ = ℑ - _ = @shlExact(@as(u16, image[0]), 8); -} diff --git a/test/behavior/bugs/13785.zig b/test/behavior/bugs/13785.zig deleted file mode 100644 index e3c71d954c..0000000000 --- a/test/behavior/bugs/13785.zig +++ /dev/null @@ -1,14 +0,0 @@ -const builtin = @import("builtin"); -const std = @import("std"); - -const S = packed struct { a: u0 = 0 }; -test { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - var a: u8 = 0; - _ = &a; - try std.io.null_writer.print("\n{} {}\n", .{ a, S{} }); -} diff --git a/test/behavior/bugs/1381.zig b/test/behavior/bugs/1381.zig deleted file mode 100644 index 090883e875..0000000000 --- a/test/behavior/bugs/1381.zig +++ /dev/null @@ -1,27 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -const B = union(enum) { - D: u8, - E: u16, -}; - -const A = union(enum) { - B: B, - C: u8, -}; - -test "union that needs padding bytes inside an array" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - var as = [_]A{ - A{ .B = B{ .D = 1 } }, - A{ .B = B{ .D = 1 } }, - }; - _ = &as; - - const a = as[0].B; - try std.testing.expect(a.D == 1); -} diff --git a/test/behavior/bugs/1421.zig b/test/behavior/bugs/1421.zig deleted file mode 100644 index 1c85c3089e..0000000000 --- a/test/behavior/bugs/1421.zig +++ /dev/null @@ -1,14 +0,0 @@ -const std = @import("std"); -const expect = std.testing.expect; -const builtin = @import("builtin"); - -const S = struct { - fn method() std.builtin.Type { - return @typeInfo(S); - } -}; - -test "functions with return type required to be comptime are generic" { - const ti = S.method(); - try expect(@as(std.builtin.TypeId, ti) == std.builtin.TypeId.Struct); -} diff --git a/test/behavior/bugs/1442.zig b/test/behavior/bugs/1442.zig deleted file mode 100644 index 3d02686c48..0000000000 --- a/test/behavior/bugs/1442.zig +++ /dev/null @@ -1,17 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -const Union = union(enum) { - Text: []const u8, - Color: u32, -}; - -test "const error union field alignment" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - var union_or_err: anyerror!Union = Union{ .Color = 1234 }; - _ = &union_or_err; - try std.testing.expect((union_or_err catch unreachable).Color == 1234); -} diff --git a/test/behavior/bugs/1467.zig b/test/behavior/bugs/1467.zig deleted file mode 100644 index e062e66c8d..0000000000 --- a/test/behavior/bugs/1467.zig +++ /dev/null @@ -1,8 +0,0 @@ -pub const E = enum(u32) { A, B, C }; -pub const S = extern struct { - e: E, -}; -test "bug 1467" { - const s: S = undefined; - _ = s; -} diff --git a/test/behavior/bugs/14854.zig b/test/behavior/bugs/14854.zig deleted file mode 100644 index 8f01ccb3f4..0000000000 --- a/test/behavior/bugs/14854.zig +++ /dev/null @@ -1,14 +0,0 @@ -const testing = @import("std").testing; -const builtin = @import("builtin"); - -test { - try testing.expect(getGeneric(u8, getU8) == 123); -} - -fn getU8() callconv(.C) u8 { - return 123; -} - -fn getGeneric(comptime T: type, supplier: fn () callconv(.C) T) T { - return supplier(); -} diff --git a/test/behavior/bugs/1486.zig b/test/behavior/bugs/1486.zig deleted file mode 100644 index ceeaf8811e..0000000000 --- a/test/behavior/bugs/1486.zig +++ /dev/null @@ -1,14 +0,0 @@ -const std = @import("std"); -const expect = std.testing.expect; -const builtin = @import("builtin"); - -const ptr = &global; -var global: usize = 123; - -test "constant pointer to global variable causes runtime load" { - if (builtin.zig_backend == .stage2_aarch64 and builtin.os.tag == .macos) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - global = 1234; - try expect(&global == ptr); - try expect(ptr.* == 1234); -} diff --git a/test/behavior/bugs/1500.zig b/test/behavior/bugs/1500.zig deleted file mode 100644 index ac0d76f879..0000000000 --- a/test/behavior/bugs/1500.zig +++ /dev/null @@ -1,16 +0,0 @@ -const builtin = @import("builtin"); -const A = struct { - b: B, -}; - -const B = *const fn (A) void; - -test "allow these dependencies" { - var a: A = undefined; - var b: B = undefined; - _ = .{ &a, &b }; - if (false) { - a; - b; - } -} diff --git a/test/behavior/bugs/15778.zig b/test/behavior/bugs/15778.zig deleted file mode 100644 index 5754eb6e11..0000000000 --- a/test/behavior/bugs/15778.zig +++ /dev/null @@ -1,23 +0,0 @@ -const builtin = @import("builtin"); - -test { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - const a = @Vector(0, i32){}; - const b = @Vector(0, i32){}; - _ = a + b; -} - -test { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - const a = @Vector(0, f32){}; - const b = @Vector(0, f32){}; - _ = a - b; -} diff --git a/test/behavior/bugs/1607.zig b/test/behavior/bugs/1607.zig deleted file mode 100644 index 6fbd8fe075..0000000000 --- a/test/behavior/bugs/1607.zig +++ /dev/null @@ -1,20 +0,0 @@ -const std = @import("std"); -const testing = std.testing; -const builtin = @import("builtin"); - -const a = [_]u8{ 1, 2, 3 }; - -fn checkAddress(s: []const u8) !void { - for (s, 0..) |*i, j| { - try testing.expect(i == &a[j]); - } -} - -test "slices pointing at the same address as global array." { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - try checkAddress(&a); - try comptime checkAddress(&a); -} diff --git a/test/behavior/bugs/1735.zig b/test/behavior/bugs/1735.zig deleted file mode 100644 index 0115143b94..0000000000 --- a/test/behavior/bugs/1735.zig +++ /dev/null @@ -1,50 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -const mystruct = struct { - pending: ?listofstructs, -}; -pub fn DoublyLinkedList(comptime T: type) type { - return struct { - const Self = @This(); - - pub const Node = struct { - prev: ?*Node, - next: ?*Node, - data: T, - }; - - first: ?*Node, - last: ?*Node, - len: usize, - - pub fn init() Self { - return Self{ - .first = null, - .last = null, - .len = 0, - }; - } - }; -} -const listofstructs = DoublyLinkedList(mystruct); - -const a = struct { - const Self = @This(); - - foo: listofstructs, - - pub fn init() Self { - return Self{ - .foo = listofstructs.init(), - }; - } -}; - -test "initialization" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - const t = a.init(); - try std.testing.expect(t.foo.len == 0); -} diff --git a/test/behavior/bugs/1851.zig b/test/behavior/bugs/1851.zig deleted file mode 100644 index a61e17e8df..0000000000 --- a/test/behavior/bugs/1851.zig +++ /dev/null @@ -1,40 +0,0 @@ -const builtin = @import("builtin"); -const std = @import("std"); -const expect = std.testing.expect; - -test "allocation and looping over 3-byte integer" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - if (builtin.zig_backend == .stage2_llvm and builtin.os.tag == .macos) { - return error.SkipZigTest; // TODO - } - - if (builtin.zig_backend == .stage2_llvm and builtin.cpu.arch == .wasm32) { - return error.SkipZigTest; // TODO - } - - try expect(@sizeOf(u24) == 4); - try expect(@sizeOf([1]u24) == 4); - try expect(@alignOf(u24) == 4); - try expect(@alignOf([1]u24) == 4); - - var x = try std.testing.allocator.alloc(u24, 2); - defer std.testing.allocator.free(x); - try expect(x.len == 2); - x[0] = 0xFFFFFF; - x[1] = 0xFFFFFF; - - const bytes = std.mem.sliceAsBytes(x); - try expect(@TypeOf(bytes) == []align(4) u8); - try expect(bytes.len == 8); - - for (bytes) |*b| { - b.* = 0x00; - } - - try expect(x[0] == 0x00); - try expect(x[1] == 0x00); -} diff --git a/test/behavior/bugs/1914.zig b/test/behavior/bugs/1914.zig deleted file mode 100644 index bd3f830e60..0000000000 --- a/test/behavior/bugs/1914.zig +++ /dev/null @@ -1,32 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -const A = struct { - b_list_pointer: *const []B, -}; -const B = struct { - a_pointer: *const A, -}; - -const b_list: []B = &[_]B{}; -const a = A{ .b_list_pointer = &b_list }; - -test "segfault bug" { - const assert = std.debug.assert; - const obj = B{ .a_pointer = &a }; - assert(obj.a_pointer == &a); // this makes zig crash -} - -const A2 = struct { - pointer: *B, -}; - -pub const B2 = struct { - pointer_array: []*A2, -}; - -var b_value = B2{ .pointer_array = &[_]*A2{} }; - -test "basic stuff" { - std.debug.assert(&b_value == &b_value); -} diff --git a/test/behavior/bugs/2006.zig b/test/behavior/bugs/2006.zig deleted file mode 100644 index 3a4e61b11d..0000000000 --- a/test/behavior/bugs/2006.zig +++ /dev/null @@ -1,15 +0,0 @@ -const std = @import("std"); -const expect = std.testing.expect; -const builtin = @import("builtin"); - -const S = struct { - p: *S, -}; -test "bug 2006" { - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - var a: S = undefined; - a = S{ .p = undefined }; - try expect(@sizeOf(S) != 0); - try expect(@sizeOf(*void) == @sizeOf(*i32)); -} diff --git a/test/behavior/bugs/2114.zig b/test/behavior/bugs/2114.zig deleted file mode 100644 index dfbf58d333..0000000000 --- a/test/behavior/bugs/2114.zig +++ /dev/null @@ -1,27 +0,0 @@ -const builtin = @import("builtin"); -const std = @import("std"); -const expect = std.testing.expect; -const math = std.math; - -fn ctz(x: anytype) usize { - return @ctz(x); -} - -test "fixed" { - if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - try testCtz(); - try comptime testCtz(); -} - -fn testCtz() !void { - try expect(ctz(@as(u128, 0x40000000000000000000000000000000)) == 126); - try expect(math.rotl(u128, @as(u128, 0x40000000000000000000000000000000), @as(u8, 1)) == @as(u128, 0x80000000000000000000000000000000)); - try expect(ctz(@as(u128, 0x80000000000000000000000000000000)) == 127); - try expect(ctz(math.rotl(u128, @as(u128, 0x40000000000000000000000000000000), @as(u8, 1))) == 127); -} diff --git a/test/behavior/bugs/2346.zig b/test/behavior/bugs/2346.zig deleted file mode 100644 index 3f3bbb9b56..0000000000 --- a/test/behavior/bugs/2346.zig +++ /dev/null @@ -1,10 +0,0 @@ -const builtin = @import("builtin"); - -test "fixed" { - const a: *void = undefined; - const b: *[1]void = a; - _ = b; - const c: *[0]u8 = undefined; - const d: []u8 = c; - _ = d; -} diff --git a/test/behavior/bugs/2557.zig b/test/behavior/bugs/2557.zig deleted file mode 100644 index 3f05b628ab..0000000000 --- a/test/behavior/bugs/2557.zig +++ /dev/null @@ -1,6 +0,0 @@ -test { - var a = if (true) { - return; - } else true; - _ = &a; -} diff --git a/test/behavior/bugs/2578.zig b/test/behavior/bugs/2578.zig deleted file mode 100644 index ff8ba141fa..0000000000 --- a/test/behavior/bugs/2578.zig +++ /dev/null @@ -1,20 +0,0 @@ -const builtin = @import("builtin"); - -const Foo = struct { - y: u8, -}; - -var foo: Foo = undefined; -const t = &foo; - -fn bar(pointer: ?*anyopaque) void { - _ = pointer; -} - -test "fixed" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - bar(t); -} diff --git a/test/behavior/bugs/2622.zig b/test/behavior/bugs/2622.zig deleted file mode 100644 index 1189cec4cc..0000000000 --- a/test/behavior/bugs/2622.zig +++ /dev/null @@ -1,14 +0,0 @@ -const builtin = @import("builtin"); - -var buf: []u8 = undefined; - -test "reslice of undefined global var slice" { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - var mem: [100]u8 = [_]u8{0} ** 100; - buf = &mem; - const x = buf[0..1]; - try @import("std").testing.expect(x.len == 1 and x[0] == 0); -} diff --git a/test/behavior/bugs/2692.zig b/test/behavior/bugs/2692.zig deleted file mode 100644 index d89b3b5449..0000000000 --- a/test/behavior/bugs/2692.zig +++ /dev/null @@ -1,13 +0,0 @@ -const builtin = @import("builtin"); - -fn foo(a: []u8) void { - _ = a; -} - -test "address of 0 length array" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - var pt: [0]u8 = undefined; - foo(&pt); -} diff --git a/test/behavior/bugs/2727.zig b/test/behavior/bugs/2727.zig deleted file mode 100644 index 4681980d5b..0000000000 --- a/test/behavior/bugs/2727.zig +++ /dev/null @@ -1,16 +0,0 @@ -const builtin = @import("builtin"); - -fn t() bool { - return true; -} - -test { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - comptime var i: usize = 0; - inline while (i < 2) : (i += 1) { - if (t()) {} else return; - } -} diff --git a/test/behavior/bugs/2889.zig b/test/behavior/bugs/2889.zig deleted file mode 100644 index 69ec35355a..0000000000 --- a/test/behavior/bugs/2889.zig +++ /dev/null @@ -1,36 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -const source = "A-"; - -fn parseNote() ?i32 { - const letter = source[0]; - const modifier = source[1]; - - const semitone = blk: { - if (letter == 'C' and modifier == '-') break :blk @as(i32, 0); - if (letter == 'C' and modifier == '#') break :blk @as(i32, 1); - if (letter == 'D' and modifier == '-') break :blk @as(i32, 2); - if (letter == 'D' and modifier == '#') break :blk @as(i32, 3); - if (letter == 'E' and modifier == '-') break :blk @as(i32, 4); - if (letter == 'F' and modifier == '-') break :blk @as(i32, 5); - if (letter == 'F' and modifier == '#') break :blk @as(i32, 6); - if (letter == 'G' and modifier == '-') break :blk @as(i32, 7); - if (letter == 'G' and modifier == '#') break :blk @as(i32, 8); - if (letter == 'A' and modifier == '-') break :blk @as(i32, 9); - if (letter == 'A' and modifier == '#') break :blk @as(i32, 10); - if (letter == 'B' and modifier == '-') break :blk @as(i32, 11); - return null; - }; - - return semitone; -} - -test "fixed" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - const result = parseNote(); - try std.testing.expect(result.? == 9); -} diff --git a/test/behavior/bugs/3007.zig b/test/behavior/bugs/3007.zig deleted file mode 100644 index 3ae1562e9b..0000000000 --- a/test/behavior/bugs/3007.zig +++ /dev/null @@ -1,28 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -const Foo = struct { - free: bool, - - pub const FooError = error{NotFree}; -}; - -var foo = Foo{ .free = true }; -var default_foo: ?*Foo = null; - -fn get_foo() Foo.FooError!*Foo { - if (foo.free) { - foo.free = false; - return &foo; - } - return error.NotFree; -} - -test "fixed" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - default_foo = get_foo() catch null; // This Line - try std.testing.expect(!default_foo.?.free); -} diff --git a/test/behavior/bugs/3046.zig b/test/behavior/bugs/3046.zig deleted file mode 100644 index 24e18043a0..0000000000 --- a/test/behavior/bugs/3046.zig +++ /dev/null @@ -1,24 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const expect = std.testing.expect; - -const SomeStruct = struct { - field: i32, -}; - -fn couldFail() anyerror!i32 { - return 1; -} - -var some_struct: SomeStruct = undefined; - -test "fixed" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - some_struct = SomeStruct{ - .field = couldFail() catch @as(i32, 0), - }; - try expect(some_struct.field == 1); -} diff --git a/test/behavior/bugs/3112.zig b/test/behavior/bugs/3112.zig deleted file mode 100644 index b1dc2e2908..0000000000 --- a/test/behavior/bugs/3112.zig +++ /dev/null @@ -1,23 +0,0 @@ -const builtin = @import("builtin"); -const std = @import("std"); -const expect = std.testing.expect; - -const State = struct { - const Self = @This(); - enter: *const fn (previous: ?Self) void, -}; - -fn prev(p: ?State) void { - expect(p == null) catch @panic("test failure"); -} - -test "zig test crash" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - var global: State = undefined; - global.enter = prev; - global.enter(null); -} diff --git a/test/behavior/bugs/3367.zig b/test/behavior/bugs/3367.zig deleted file mode 100644 index 68b7d90ae8..0000000000 --- a/test/behavior/bugs/3367.zig +++ /dev/null @@ -1,15 +0,0 @@ -const builtin = @import("builtin"); -const Foo = struct { - usingnamespace Mixin; -}; - -const Mixin = struct { - pub fn two(self: Foo) void { - _ = self; - } -}; - -test "container member access usingnamespace decls" { - var foo = Foo{}; - foo.two(); -} diff --git a/test/behavior/bugs/3384.zig b/test/behavior/bugs/3384.zig deleted file mode 100644 index c45aae5180..0000000000 --- a/test/behavior/bugs/3384.zig +++ /dev/null @@ -1,11 +0,0 @@ -const std = @import("std"); -const expect = std.testing.expect; - -test "resolve array slice using builtin" { - try expect(@hasDecl(@This(), "std") == true); - try expect(@hasDecl(@This(), "std"[0..0]) == false); - try expect(@hasDecl(@This(), "std"[0..1]) == false); - try expect(@hasDecl(@This(), "std"[0..2]) == false); - try expect(@hasDecl(@This(), "std"[0..3]) == true); - try expect(@hasDecl(@This(), "std"[0..]) == true); -} diff --git a/test/behavior/bugs/3468.zig b/test/behavior/bugs/3468.zig deleted file mode 100644 index 293e608aec..0000000000 --- a/test/behavior/bugs/3468.zig +++ /dev/null @@ -1,7 +0,0 @@ -// zig fmt: off -test "pointer deref next to assignment" { - var a:i32=2; - var b=&a; - b.*=3; - _=&b; -} diff --git a/test/behavior/bugs/3586.zig b/test/behavior/bugs/3586.zig deleted file mode 100644 index 5bc682b149..0000000000 --- a/test/behavior/bugs/3586.zig +++ /dev/null @@ -1,16 +0,0 @@ -const builtin = @import("builtin"); - -const NoteParams = struct {}; - -const Container = struct { - params: ?NoteParams, -}; - -test "fixed" { - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - var ctr = Container{ - .params = NoteParams{}, - }; - _ = &ctr; -} diff --git a/test/behavior/bugs/3742.zig b/test/behavior/bugs/3742.zig deleted file mode 100644 index e0d46e72c3..0000000000 --- a/test/behavior/bugs/3742.zig +++ /dev/null @@ -1,45 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -pub const GET = struct { - key: []const u8, - - pub fn init(key: []const u8) GET { - return .{ .key = key }; - } - - pub const Redis = struct { - pub const Command = struct { - pub fn serialize(self: GET, comptime rootSerializer: type) void { - return rootSerializer.serializeCommand(.{ "GET", self.key }); - } - }; - }; -}; - -pub fn isCommand(comptime T: type) bool { - const tid = @typeInfo(T); - return (tid == .Struct or tid == .Enum or tid == .Union) and - @hasDecl(T, "Redis") and @hasDecl(T.Redis, "Command"); -} - -pub const ArgSerializer = struct { - pub fn serializeCommand(command: anytype) void { - const CmdT = @TypeOf(command); - - if (comptime isCommand(CmdT)) { - // COMMENTING THE NEXT LINE REMOVES THE ERROR - return CmdT.Redis.Command.serialize(command, ArgSerializer); - } - } -}; - -test "fixed" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_llvm and - builtin.cpu.arch == .aarch64 and builtin.os.tag == .windows) return error.SkipZigTest; - - ArgSerializer.serializeCommand(GET.init("banana")); -} diff --git a/test/behavior/bugs/394.zig b/test/behavior/bugs/394.zig deleted file mode 100644 index 37864edbc5..0000000000 --- a/test/behavior/bugs/394.zig +++ /dev/null @@ -1,19 +0,0 @@ -const E = union(enum) { - A: [9]u8, - B: u64, -}; -const S = struct { - x: u8, - y: E, -}; - -const expect = @import("std").testing.expect; -const builtin = @import("builtin"); - -test "fixed" { - const x = S{ - .x = 3, - .y = E{ .B = 1 }, - }; - try expect(x.x == 3); -} diff --git a/test/behavior/bugs/421.zig b/test/behavior/bugs/421.zig deleted file mode 100644 index f92bfb9899..0000000000 --- a/test/behavior/bugs/421.zig +++ /dev/null @@ -1,21 +0,0 @@ -const builtin = @import("builtin"); -const expect = @import("std").testing.expect; - -test "bitCast to array" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - try comptime testBitCastArray(); - try testBitCastArray(); -} - -fn testBitCastArray() !void { - try expect(extractOne64(0x0123456789abcdef0123456789abcdef) == 0x0123456789abcdef); -} - -fn extractOne64(a: u128) u64 { - const x = @as([2]u64, @bitCast(a)); - return x[1]; -} diff --git a/test/behavior/bugs/4328.zig b/test/behavior/bugs/4328.zig deleted file mode 100644 index 846f751815..0000000000 --- a/test/behavior/bugs/4328.zig +++ /dev/null @@ -1,82 +0,0 @@ -const expect = @import("std").testing.expect; -const builtin = @import("builtin"); - -const FILE = extern struct { - dummy_field: u8, -}; - -extern fn c_printf([*c]const u8, ...) c_int; -extern fn c_fputs([*c]const u8, noalias [*c]FILE) c_int; -extern fn c_ftell([*c]FILE) c_long; -extern fn c_fopen([*c]const u8, [*c]const u8) [*c]FILE; - -const S = extern struct { - state: c_short, - - extern fn s_do_thing([*c]const S, b: c_int) c_short; -}; - -test "Extern function calls in @TypeOf" { - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - const Test = struct { - fn test_fn_1(a: anytype, b: anytype) @TypeOf(c_printf("%d %s\n", a, b)) { - return 0; - } - - fn test_fn_2(s: anytype, a: anytype) @TypeOf(s.s_do_thing(a)) { - return 1; - } - - fn doTheTest() !void { - try expect(@TypeOf(test_fn_1(0, 42)) == c_int); - try expect(@TypeOf(test_fn_2(&S{ .state = 1 }, 0)) == c_short); - } - }; - - try Test.doTheTest(); - try comptime Test.doTheTest(); -} - -test "Peer resolution of extern function calls in @TypeOf" { - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - const Test = struct { - fn test_fn() @TypeOf(c_ftell(null), c_fputs(null, null)) { - return 0; - } - - fn doTheTest() !void { - try expect(@TypeOf(test_fn()) == c_long); - } - }; - - try Test.doTheTest(); - try comptime Test.doTheTest(); -} - -test "Extern function calls, dereferences and field access in @TypeOf" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - const Test = struct { - fn test_fn_1(a: c_long) @TypeOf(c_fopen("test", "r").*) { - _ = a; - return .{ .dummy_field = 0 }; - } - - fn test_fn_2(a: anytype) @TypeOf(c_fopen("test", "r").*.dummy_field) { - _ = a; - return 255; - } - - fn doTheTest() !void { - try expect(@TypeOf(test_fn_1(0)) == FILE); - try expect(@TypeOf(test_fn_2(0)) == u8); - } - }; - - try Test.doTheTest(); - try comptime Test.doTheTest(); -} diff --git a/test/behavior/bugs/4560.zig b/test/behavior/bugs/4560.zig deleted file mode 100644 index 4f6e456755..0000000000 --- a/test/behavior/bugs/4560.zig +++ /dev/null @@ -1,40 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -test "fixed" { - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - var s: S = .{ - .a = 1, - .b = .{ - .size = 123, - .max_distance_from_start_index = 456, - }, - }; - _ = &s; - try std.testing.expect(s.a == 1); - try std.testing.expect(s.b.size == 123); - try std.testing.expect(s.b.max_distance_from_start_index == 456); -} - -const S = struct { - a: u32, - b: Map, - - const Map = StringHashMap(*S); -}; - -pub fn StringHashMap(comptime V: type) type { - return HashMap([]const u8, V); -} - -pub fn HashMap(comptime K: type, comptime V: type) type { - if (false) { - K; - V; - } - return struct { - size: usize, - max_distance_from_start_index: usize, - }; -} diff --git a/test/behavior/bugs/4769_a.zig b/test/behavior/bugs/4769_a.zig deleted file mode 100644 index 8337712ea5..0000000000 --- a/test/behavior/bugs/4769_a.zig +++ /dev/null @@ -1 +0,0 @@ -// diff --git a/test/behavior/bugs/4769_b.zig b/test/behavior/bugs/4769_b.zig deleted file mode 100644 index 9d0f028e57..0000000000 --- a/test/behavior/bugs/4769_b.zig +++ /dev/null @@ -1 +0,0 @@ -//! diff --git a/test/behavior/bugs/4954.zig b/test/behavior/bugs/4954.zig deleted file mode 100644 index 8cae03d314..0000000000 --- a/test/behavior/bugs/4954.zig +++ /dev/null @@ -1,14 +0,0 @@ -const builtin = @import("builtin"); - -fn f(buf: []u8) void { - _ = &buf[@sizeOf(u32)]; -} - -test "crash" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - var buf: [4096]u8 = undefined; - f(&buf); -} diff --git a/test/behavior/bugs/5398.zig b/test/behavior/bugs/5398.zig deleted file mode 100644 index 6f75bd9436..0000000000 --- a/test/behavior/bugs/5398.zig +++ /dev/null @@ -1,36 +0,0 @@ -const std = @import("std"); -const testing = std.testing; -const builtin = @import("builtin"); - -pub const Mesh = struct { - id: u32, -}; -pub const Material = struct { - transparent: bool = true, - emits_shadows: bool = true, - render_color: bool = true, -}; -pub const Renderable = struct { - material: Material, - // The compiler inserts some padding here to ensure Mesh is correctly aligned. - mesh: Mesh, -}; - -var renderable: Renderable = undefined; - -test "assignment of field with padding" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - renderable = Renderable{ - .mesh = Mesh{ .id = 0 }, - .material = Material{ - .transparent = false, - .emits_shadows = false, - }, - }; - try testing.expect(false == renderable.material.transparent); - try testing.expect(false == renderable.material.emits_shadows); - try testing.expect(true == renderable.material.render_color); -} diff --git a/test/behavior/bugs/5413.zig b/test/behavior/bugs/5413.zig deleted file mode 100644 index fab8e043aa..0000000000 --- a/test/behavior/bugs/5413.zig +++ /dev/null @@ -1,6 +0,0 @@ -const expect = @import("std").testing.expect; - -test "Peer type resolution with string literals and unknown length u8 pointers" { - try expect(@TypeOf("", "a", @as([*:0]const u8, "")) == [*:0]const u8); - try expect(@TypeOf(@as([*:0]const u8, "baz"), "foo", "bar") == [*:0]const u8); -} diff --git a/test/behavior/bugs/5474.zig b/test/behavior/bugs/5474.zig deleted file mode 100644 index ee58a93124..0000000000 --- a/test/behavior/bugs/5474.zig +++ /dev/null @@ -1,63 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -// baseline (control) struct with array of scalar -const Box0 = struct { - items: [4]Item, - - const Item = struct { - num: u32, - }; -}; - -// struct with array of empty struct -const Box1 = struct { - items: [4]Item, - - const Item = struct {}; -}; - -// struct with array of zero-size struct -const Box2 = struct { - items: [4]Item, - - const Item = struct { - nothing: void, - }; -}; - -fn mutable() !void { - var box0: Box0 = .{ .items = undefined }; - try std.testing.expect(@typeInfo(@TypeOf(box0.items[0..])).Pointer.is_const == false); - - var box1: Box1 = .{ .items = undefined }; - try std.testing.expect(@typeInfo(@TypeOf(box1.items[0..])).Pointer.is_const == false); - - var box2: Box2 = .{ .items = undefined }; - try std.testing.expect(@typeInfo(@TypeOf(box2.items[0..])).Pointer.is_const == false); -} - -fn constant() !void { - const box0: Box0 = .{ .items = undefined }; - try std.testing.expect(@typeInfo(@TypeOf(box0.items[0..])).Pointer.is_const == true); - - const box1: Box1 = .{ .items = undefined }; - try std.testing.expect(@typeInfo(@TypeOf(box1.items[0..])).Pointer.is_const == true); - - const box2: Box2 = .{ .items = undefined }; - try std.testing.expect(@typeInfo(@TypeOf(box2.items[0..])).Pointer.is_const == true); -} - -test "pointer-to-array constness for zero-size elements, var" { - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - try mutable(); - try comptime mutable(); -} - -test "pointer-to-array constness for zero-size elements, const" { - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - try constant(); - try comptime constant(); -} diff --git a/test/behavior/bugs/5487.zig b/test/behavior/bugs/5487.zig deleted file mode 100644 index 3ea8cad220..0000000000 --- a/test/behavior/bugs/5487.zig +++ /dev/null @@ -1,17 +0,0 @@ -const io = @import("std").io; -const builtin = @import("builtin"); - -pub fn write(_: void, bytes: []const u8) !usize { - _ = bytes; - return 0; -} -pub fn writer() io.Writer(void, @typeInfo(@typeInfo(@TypeOf(write)).Fn.return_type.?).ErrorUnion.error_set, write) { - return io.Writer(void, @typeInfo(@typeInfo(@TypeOf(write)).Fn.return_type.?).ErrorUnion.error_set, write){ .context = {} }; -} - -test "crash" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - _ = io.multiWriter(.{writer()}); -} diff --git a/test/behavior/bugs/6047.zig b/test/behavior/bugs/6047.zig deleted file mode 100644 index 0288a52627..0000000000 --- a/test/behavior/bugs/6047.zig +++ /dev/null @@ -1,20 +0,0 @@ -const builtin = @import("builtin"); - -fn getError() !void { - return error.Test; -} - -fn getError2() !void { - var a: u8 = 'c'; - _ = &a; - try if (a == 'a') getError() else if (a == 'b') getError() else getError(); -} - -test "`try`ing an if/else expression" { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - try @import("std").testing.expectError(error.Test, getError2()); -} diff --git a/test/behavior/bugs/624.zig b/test/behavior/bugs/624.zig deleted file mode 100644 index 14d6bbdfb1..0000000000 --- a/test/behavior/bugs/624.zig +++ /dev/null @@ -1,30 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const expect = std.testing.expect; - -const TestContext = struct { - server_context: *ListenerContext, -}; - -const ListenerContext = struct { - context_alloc: *ContextAllocator, -}; - -const ContextAllocator = MemoryPool(TestContext); - -fn MemoryPool(comptime T: type) type { - _ = T; - return struct { - n: usize, - }; -} - -test "foo" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - var allocator = ContextAllocator{ .n = 10 }; - _ = &allocator; - try expect(allocator.n == 10); -} diff --git a/test/behavior/bugs/6305.zig b/test/behavior/bugs/6305.zig deleted file mode 100644 index 6912944ad1..0000000000 --- a/test/behavior/bugs/6305.zig +++ /dev/null @@ -1,10 +0,0 @@ -const ListNode = struct { - next: ?*const @This() = null, -}; - -test "copy array of self-referential struct" { - comptime var nodes = [_]ListNode{ .{}, .{} }; - nodes[0].next = &nodes[1]; - const copy = nodes; - _ = copy; -} diff --git a/test/behavior/bugs/6456.zig b/test/behavior/bugs/6456.zig deleted file mode 100644 index c74319a5bf..0000000000 --- a/test/behavior/bugs/6456.zig +++ /dev/null @@ -1,46 +0,0 @@ -const builtin = @import("builtin"); -const std = @import("std"); -const testing = std.testing; -const StructField = std.builtin.Type.StructField; -const Declaration = std.builtin.Type.Declaration; - -const text = - \\f1 - \\f2 - \\f3 -; - -test "issue 6456" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - comptime { - var fields: []const StructField = &[0]StructField{}; - - var it = std.mem.tokenizeScalar(u8, text, '\n'); - while (it.next()) |name| { - fields = fields ++ &[_]StructField{StructField{ - .alignment = 0, - .name = name, - .type = usize, - .default_value = null, - .is_comptime = false, - }}; - } - - const T = @Type(.{ - .Struct = .{ - .layout = .Auto, - .is_tuple = false, - .fields = fields, - .decls = &[_]Declaration{}, - }, - }); - - const gen_fields = @typeInfo(T).Struct.fields; - try testing.expectEqual(3, gen_fields.len); - try testing.expectEqualStrings("f1", gen_fields[0].name); - try testing.expectEqualStrings("f2", gen_fields[1].name); - try testing.expectEqualStrings("f3", gen_fields[2].name); - } -} diff --git a/test/behavior/bugs/655.zig b/test/behavior/bugs/655.zig deleted file mode 100644 index d958513e6f..0000000000 --- a/test/behavior/bugs/655.zig +++ /dev/null @@ -1,12 +0,0 @@ -const std = @import("std"); -const other_file = @import("655_other_file.zig"); - -test "function with *const parameter with type dereferenced by namespace" { - const x: other_file.Integer = 1234; - try comptime std.testing.expect(@TypeOf(&x) == *const other_file.Integer); - try foo(&x); -} - -fn foo(x: *const other_file.Integer) !void { - try std.testing.expect(x.* == 1234); -} diff --git a/test/behavior/bugs/655_other_file.zig b/test/behavior/bugs/655_other_file.zig deleted file mode 100644 index df1df44955..0000000000 --- a/test/behavior/bugs/655_other_file.zig +++ /dev/null @@ -1 +0,0 @@ -pub const Integer = u32; diff --git a/test/behavior/bugs/656.zig b/test/behavior/bugs/656.zig deleted file mode 100644 index a44ccb3647..0000000000 --- a/test/behavior/bugs/656.zig +++ /dev/null @@ -1,37 +0,0 @@ -const expect = @import("std").testing.expect; -const builtin = @import("builtin"); - -const PrefixOp = union(enum) { - Return, - AddrOf: Value, -}; - -const Value = struct { - align_expr: ?u32, -}; - -test "optional if after an if in a switch prong of a switch with 2 prongs in an else" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - try foo(false, true); -} - -fn foo(a: bool, b: bool) !void { - var prefix_op = PrefixOp{ - .AddrOf = Value{ .align_expr = 1234 }, - }; - _ = &prefix_op; - if (a) {} else { - switch (prefix_op) { - PrefixOp.AddrOf => |addr_of_info| { - if (b) {} - if (addr_of_info.align_expr) |align_expr| { - try expect(align_expr == 1234); - } - }, - PrefixOp.Return => {}, - } - } -} diff --git a/test/behavior/bugs/6781.zig b/test/behavior/bugs/6781.zig deleted file mode 100644 index fdbb1dd917..0000000000 --- a/test/behavior/bugs/6781.zig +++ /dev/null @@ -1,84 +0,0 @@ -const builtin = @import("builtin"); -const std = @import("std"); -const assert = std.debug.assert; - -const segfault = true; - -pub const JournalHeader = packed struct { - hash_chain_root: u128 = undefined, - prev_hash_chain_root: u128, - checksum: u128 = undefined, - magic: u64, - command: u32, - size: u32, - - pub fn calculate_checksum(self: *const JournalHeader, entry: []const u8) u128 { - assert(entry.len >= @sizeOf(JournalHeader)); - assert(entry.len == self.size); - - const checksum_offset = @offsetOf(JournalHeader, "checksum"); - const checksum_size = @sizeOf(@TypeOf(self.checksum)); - assert(checksum_offset == 0 + 16 + 16); - assert(checksum_size == 16); - - var target: [32]u8 = undefined; - std.crypto.hash.Blake3.hash(entry[checksum_offset + checksum_size ..], target[0..], .{}); - return @as(u128, @bitCast(target[0..checksum_size].*)); - } - - pub fn calculate_hash_chain_root(self: *const JournalHeader) u128 { - const hash_chain_root_size = @sizeOf(@TypeOf(self.hash_chain_root)); - assert(hash_chain_root_size == 16); - - const prev_hash_chain_root_offset = @offsetOf(JournalHeader, "prev_hash_chain_root"); - const prev_hash_chain_root_size = @sizeOf(@TypeOf(self.prev_hash_chain_root)); - assert(prev_hash_chain_root_offset == 0 + 16); - assert(prev_hash_chain_root_size == 16); - - const checksum_offset = @offsetOf(JournalHeader, "checksum"); - const checksum_size = @sizeOf(@TypeOf(self.checksum)); - assert(checksum_offset == 0 + 16 + 16); - assert(checksum_size == 16); - - assert(prev_hash_chain_root_offset + prev_hash_chain_root_size == checksum_offset); - - const header = @as([@sizeOf(JournalHeader)]u8, @bitCast(self.*)); - const source = header[prev_hash_chain_root_offset .. checksum_offset + checksum_size]; - assert(source.len == prev_hash_chain_root_size + checksum_size); - var target: [32]u8 = undefined; - std.crypto.hash.Blake3.hash(source, target[0..], .{}); - if (segfault) { - return @as(u128, @bitCast(target[0..hash_chain_root_size].*)); - } else { - var array = target[0..hash_chain_root_size].*; - _ = &array; - return @bitCast(array); - } - } - - pub fn set_checksum_and_hash_chain_root(self: *JournalHeader, entry: []const u8) void { - self.checksum = self.calculate_checksum(entry); - self.hash_chain_root = self.calculate_hash_chain_root(); - } -}; - -test "fixed" { - if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest; - - var buffer align(@alignOf(JournalHeader)) = [_]u8{0} ** 65536; - var entry = std.mem.bytesAsValue(JournalHeader, buffer[0..@sizeOf(JournalHeader)]); - entry.* = .{ - .prev_hash_chain_root = 0, - .magic = 0, - .command = 0, - .size = 64 + 128, - }; - entry.set_checksum_and_hash_chain_root(buffer[0..entry.size]); - try std.io.null_writer.print("{}\n", .{entry}); -} diff --git a/test/behavior/bugs/679.zig b/test/behavior/bugs/679.zig deleted file mode 100644 index 81de1bb038..0000000000 --- a/test/behavior/bugs/679.zig +++ /dev/null @@ -1,19 +0,0 @@ -const std = @import("std"); -const expect = std.testing.expect; - -pub fn List(comptime T: type) type { - _ = T; - return u32; -} - -const ElementList = List(Element); -const Element = struct { - link: ElementList, -}; - -test "false dependency loop in struct definition" { - const listType = ElementList; - var x: listType = 42; - _ = &x; - try expect(x == 42); -} diff --git a/test/behavior/bugs/6850.zig b/test/behavior/bugs/6850.zig deleted file mode 100644 index 6dafd524c5..0000000000 --- a/test/behavior/bugs/6850.zig +++ /dev/null @@ -1,12 +0,0 @@ -const std = @import("std"); - -test "lazy sizeof comparison with zero" { - const Empty = struct {}; - const T = *Empty; - - try std.testing.expect(hasNoBits(T)); -} - -fn hasNoBits(comptime T: type) bool { - return @sizeOf(T) == @sizeOf(*i32); -} diff --git a/test/behavior/bugs/6905.zig b/test/behavior/bugs/6905.zig deleted file mode 100644 index 2d473e108c..0000000000 --- a/test/behavior/bugs/6905.zig +++ /dev/null @@ -1,23 +0,0 @@ -const expect = @import("std").testing.expect; -const builtin = @import("builtin"); - -test "sentinel-terminated 0-length slices" { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - const u32s: [4]u32 = [_]u32{ 0, 1, 2, 3 }; - - var index: u8 = 2; - _ = &index; - const slice = u32s[index..index :2]; - const array_ptr = u32s[2..2 :2]; - const comptime_known_array_value = u32s[2..2 :2].*; - var runtime_array_value = u32s[2..2 :2].*; - _ = &runtime_array_value; - - try expect(slice[0] == 2); - try expect(array_ptr[0] == 2); - try expect(comptime_known_array_value[0] == 2); - try expect(runtime_array_value[0] == 2); -} diff --git a/test/behavior/bugs/6947.zig b/test/behavior/bugs/6947.zig deleted file mode 100644 index 25b35bdb89..0000000000 --- a/test/behavior/bugs/6947.zig +++ /dev/null @@ -1,14 +0,0 @@ -const builtin = @import("builtin"); - -fn destroy(ptr: *void) void { - _ = ptr; -} - -test { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - var slice: []void = undefined; - destroy(&slice[0]); -} diff --git a/test/behavior/bugs/7003.zig b/test/behavior/bugs/7003.zig deleted file mode 100644 index 3568f36d2b..0000000000 --- a/test/behavior/bugs/7003.zig +++ /dev/null @@ -1,9 +0,0 @@ -test "@Type should resolve its children types" { - const sparse = enum(u2) { a, b, c }; - const dense = enum(u2) { a, b, c, d }; - - comptime var sparse_info = @typeInfo(anyerror!sparse); - sparse_info.ErrorUnion.payload = dense; - const B = @Type(sparse_info); - _ = B; -} diff --git a/test/behavior/bugs/704.zig b/test/behavior/bugs/704.zig deleted file mode 100644 index a3fb786da4..0000000000 --- a/test/behavior/bugs/704.zig +++ /dev/null @@ -1,11 +0,0 @@ -const builtin = @import("builtin"); - -const xxx = struct { - pub fn bar(self: *xxx) void { - _ = self; - } -}; -test "bug 704" { - var x: xxx = undefined; - x.bar(); -} diff --git a/test/behavior/bugs/7047.zig b/test/behavior/bugs/7047.zig deleted file mode 100644 index 534624fa72..0000000000 --- a/test/behavior/bugs/7047.zig +++ /dev/null @@ -1,23 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -const U = union(enum) { - T: type, - N: void, -}; - -fn S(comptime query: U) type { - return struct { - fn tag() type { - return query.T; - } - }; -} - -test "compiler doesn't consider equal unions with different 'type' payload" { - const s1 = S(U{ .T = u32 }).tag(); - try std.testing.expectEqual(u32, s1); - - const s2 = S(U{ .T = u64 }).tag(); - try std.testing.expectEqual(u64, s2); -} diff --git a/test/behavior/bugs/718.zig b/test/behavior/bugs/718.zig deleted file mode 100644 index 0dad101e4b..0000000000 --- a/test/behavior/bugs/718.zig +++ /dev/null @@ -1,23 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const mem = std.mem; -const expect = std.testing.expect; -const Keys = struct { - up: bool, - down: bool, - left: bool, - right: bool, -}; -var keys: Keys = undefined; -test "zero keys with @memset" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - @memset(@as([*]u8, @ptrCast(&keys))[0..@sizeOf(@TypeOf(keys))], 0); - try expect(!keys.up); - try expect(!keys.down); - try expect(!keys.left); - try expect(!keys.right); -} diff --git a/test/behavior/bugs/7187.zig b/test/behavior/bugs/7187.zig deleted file mode 100644 index 0af9512963..0000000000 --- a/test/behavior/bugs/7187.zig +++ /dev/null @@ -1,15 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const expect = std.testing.expect; - -test "miscompilation with bool return type" { - var x: usize = 1; - var y: bool = getFalse(); - _ = .{ &x, &y }; - - try expect(x == 1); -} - -fn getFalse() bool { - return false; -} diff --git a/test/behavior/bugs/726.zig b/test/behavior/bugs/726.zig deleted file mode 100644 index e6fd6a92b3..0000000000 --- a/test/behavior/bugs/726.zig +++ /dev/null @@ -1,26 +0,0 @@ -const expect = @import("std").testing.expect; -const builtin = @import("builtin"); - -test "@ptrCast from const to nullable" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - const c: u8 = 4; - var x: ?*const u8 = @ptrCast(&c); - _ = &x; - try expect(x.?.* == 4); -} - -test "@ptrCast from var in empty struct to nullable" { - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - const container = struct { - var c: u8 = 4; - }; - var x: ?*const u8 = @ptrCast(&container.c); - _ = &x; - try expect(x.?.* == 4); -} diff --git a/test/behavior/bugs/7325.zig b/test/behavior/bugs/7325.zig deleted file mode 100644 index 85c3b385f0..0000000000 --- a/test/behavior/bugs/7325.zig +++ /dev/null @@ -1,113 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); -const testing = std.testing; - -const string = "hello world"; - -const TempRef = struct { - index: usize, - is_weak: bool, -}; - -const BuiltinEnum = struct { - name: []const u8, -}; - -const ParamType = union(enum) { - boolean, - buffer, - one_of: BuiltinEnum, -}; - -const CallArg = struct { - value: Expression, -}; - -const Expression = union(enum) { - literal_boolean: bool, - literal_enum_value: EnumLiteral, -}; - -const EnumLiteral = struct { - label: []const u8, -}; - -const ExpressionResult = union(enum) { - temp_buffer: TempRef, - literal_boolean: bool, - literal_enum_value: []const u8, -}; - -fn commitCalleeParam(result: ExpressionResult, callee_param_type: ParamType) ExpressionResult { - switch (callee_param_type) { - .boolean => { - return result; - }, - .buffer => { - return ExpressionResult{ - .temp_buffer = .{ .index = 0, .is_weak = false }, - }; - }, - .one_of => { - return result; - }, - } -} - -fn genExpression(expr: Expression) !ExpressionResult { - switch (expr) { - .literal_boolean => |value| { - return ExpressionResult{ - .literal_boolean = value, - }; - }, - .literal_enum_value => |v| { - try testing.expectEqualStrings(string, v.label); - const result: ExpressionResult = .{ - .literal_enum_value = v.label, - }; - switch (result) { - .literal_enum_value => |w| { - try testing.expectEqualStrings(string, w); - }, - else => {}, - } - return result; - }, - } -} - -test { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - var param: ParamType = .{ - .one_of = .{ .name = "name" }, - }; - _ = ¶m; - var arg: CallArg = .{ - .value = .{ - .literal_enum_value = .{ - .label = string, - }, - }, - }; - _ = &arg; - - const result = try genExpression(arg.value); - switch (result) { - .literal_enum_value => |w| { - try testing.expectEqualStrings(string, w); - }, - else => {}, - } - - const derp = commitCalleeParam(result, param); - switch (derp) { - .literal_enum_value => |w| { - try testing.expectEqualStrings(string, w); - }, - else => {}, - } -} diff --git a/test/behavior/bugs/8277.zig b/test/behavior/bugs/8277.zig deleted file mode 100644 index 8d64d49223..0000000000 --- a/test/behavior/bugs/8277.zig +++ /dev/null @@ -1,16 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -test "@sizeOf reified union zero-size payload fields" { - comptime { - try std.testing.expect(0 == @sizeOf(@Type(@typeInfo(union {})))); - try std.testing.expect(0 == @sizeOf(@Type(@typeInfo(union { a: void })))); - if (builtin.mode == .Debug or builtin.mode == .ReleaseSafe) { - try std.testing.expect(1 == @sizeOf(@Type(@typeInfo(union { a: void, b: void })))); - try std.testing.expect(1 == @sizeOf(@Type(@typeInfo(union { a: void, b: void, c: void })))); - } else { - try std.testing.expect(0 == @sizeOf(@Type(@typeInfo(union { a: void, b: void })))); - try std.testing.expect(0 == @sizeOf(@Type(@typeInfo(union { a: void, b: void, c: void })))); - } - } -} diff --git a/test/behavior/bugs/828.zig b/test/behavior/bugs/828.zig deleted file mode 100644 index 220d98ce09..0000000000 --- a/test/behavior/bugs/828.zig +++ /dev/null @@ -1,43 +0,0 @@ -const builtin = @import("builtin"); - -const CountBy = struct { - a: usize, - - const One = CountBy{ .a = 1 }; - - pub fn counter(self: *const CountBy) Counter { - _ = self; - return Counter{ .i = 0 }; - } -}; - -const Counter = struct { - i: usize, - - pub fn count(self: *Counter) bool { - self.i += 1; - return self.i <= 10; - } -}; - -fn constCount(comptime cb: *const CountBy, comptime unused: u32) void { - _ = unused; - comptime { - var cnt = cb.counter(); - if (cnt.i != 0) @compileError("Counter instance reused!"); - while (cnt.count()) {} - } -} - -test "comptime struct return should not return the same instance" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - - //the first parameter must be passed by reference to trigger the bug - //a second parameter is required to trigger the bug - const ValA = constCount(&CountBy.One, 12); - const ValB = constCount(&CountBy.One, 15); - if (false) { - ValA; - ValB; - } -} diff --git a/test/behavior/bugs/8646.zig b/test/behavior/bugs/8646.zig deleted file mode 100644 index b835b81b54..0000000000 --- a/test/behavior/bugs/8646.zig +++ /dev/null @@ -1,16 +0,0 @@ -const std = @import("std"); -const builtin = @import("builtin"); - -const array = [_][]const []const u8{ - &.{"hello"}, - &.{ "world", "hello" }, -}; - -test { - if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - - try std.testing.expect(array[0].len == 1); - try std.testing.expectEqualStrings("hello", array[0][0]); -} diff --git a/test/behavior/bugs/920.zig b/test/behavior/bugs/920.zig deleted file mode 100644 index bf74180515..0000000000 --- a/test/behavior/bugs/920.zig +++ /dev/null @@ -1,80 +0,0 @@ -const builtin = @import("builtin"); -const std = @import("std"); -const Random = std.rand.Random; - -const ZigTable = struct { - r: f64, - x: [257]f64, - f: [257]f64, - - pdf: *const fn (f64) f64, - is_symmetric: bool, - zero_case: *const fn (*Random, f64) f64, -}; - -fn ZigTableGen(comptime is_symmetric: bool, comptime r: f64, comptime v: f64, comptime f: fn (f64) f64, comptime f_inv: fn (f64) f64, comptime zero_case: fn (*Random, f64) f64) ZigTable { - var tables: ZigTable = undefined; - - tables.is_symmetric = is_symmetric; - tables.r = r; - tables.pdf = f; - tables.zero_case = zero_case; - - tables.x[0] = v / f(r); - tables.x[1] = r; - - for (tables.x[2..256], 0..) |*entry, i| { - const last = tables.x[2 + i - 1]; - entry.* = f_inv(v / last + f(last)); - } - tables.x[256] = 0; - - for (tables.f[0..], 0..) |*entry, i| { - entry.* = f(tables.x[i]); - } - - return tables; -} - -const norm_r = 3.6541528853610088; -const norm_v = 0.00492867323399; - -fn norm_f(x: f64) f64 { - return @exp(-x * x / 2.0); -} -fn norm_f_inv(y: f64) f64 { - return @sqrt(-2.0 * @log(y)); -} -fn norm_zero_case(random: *Random, u: f64) f64 { - _ = random; - _ = u; - return 0.0; -} - -const NormalDist = blk: { - @setEvalBranchQuota(30000); - break :blk ZigTableGen(true, norm_r, norm_v, norm_f, norm_f_inv, norm_zero_case); -}; - -test "bug 920 fixed" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest; - - const NormalDist1 = blk: { - break :blk ZigTableGen(true, norm_r, norm_v, norm_f, norm_f_inv, norm_zero_case); - }; - - for (NormalDist1.f, 0..) |_, i| { - // Here we use `expectApproxEqAbs` instead of `expectEqual` to account for the small - // differences in math functions of different libcs. For example, if the compiler - // links against glibc, but the target is musl libc, then these values might be - // slightly different. - // Arguably, this is a bug in the compiler because comptime should emulate the target, - // including rounding errors in libc math functions. However that behavior is not - // what this particular test is intended to cover. - try std.testing.expectApproxEqAbs(NormalDist1.f[i], NormalDist.f[i], @sqrt(std.math.floatEps(f64))); - } -} diff --git a/test/behavior/bugs/9584.zig b/test/behavior/bugs/9584.zig deleted file mode 100644 index 0e41307bf4..0000000000 --- a/test/behavior/bugs/9584.zig +++ /dev/null @@ -1,69 +0,0 @@ -const builtin = @import("builtin"); -const std = @import("std"); - -const A = packed struct { - a: bool, - b: bool, - c: bool, - d: bool, - - e: bool, - f: bool, - g: bool, - h: bool, -}; - -const X = union { - x: A, - y: u64, -}; - -pub fn a( - x0: i32, - x1: i32, - x2: i32, - x3: i32, - x4: i32, - flag_a: bool, - flag_b: bool, -) !void { - _ = x0; - _ = x1; - _ = x2; - _ = x3; - _ = x4; - _ = flag_a; - // With this bug present, `flag_b` would actually contain the value 17. - // Note: this bug only presents itself on debug mode. - const flag_b_byte: u8 = @intFromBool(flag_b); - try std.testing.expect(flag_b_byte == 1); -} - -pub fn b(x: *X) !void { - try a(0, 1, 2, 3, 4, x.x.a, x.x.b); -} - -test { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - - var flags = A{ - .a = false, - .b = true, - .c = false, - .d = false, - - .e = false, - .f = true, - .g = false, - .h = false, - }; - _ = &flags; - var x = X{ - .x = flags, - }; - try b(&x); - comptime if (@sizeOf(A) != 1) unreachable; -} diff --git a/test/behavior/call.zig b/test/behavior/call.zig index b579f85213..178ec3c10e 100644 --- a/test/behavior/call.zig +++ b/test/behavior/call.zig @@ -520,3 +520,130 @@ test "call coerced function" { const a = T{ .x = 3 }; try std.testing.expect(a.incr().x == 4); } + +test "call function in comptime field" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const S = struct { + comptime capacity: fn () u64 = capacity_, + fn capacity_() u64 { + return 64; + } + }; + try std.testing.expect((S{}).capacity() == 64); +} + +test "call function pointer in comptime field" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const Auto = struct { + auto: [max_len]u8 = undefined, + offset: u64 = 0, + + comptime capacity: *const fn () u64 = capacity, + + const max_len: u64 = 32; + + fn capacity() u64 { + return max_len; + } + }; + + const a: Auto = .{ .offset = 16, .capacity = Auto.capacity }; + try std.testing.expect(a.capacity() == 32); + try std.testing.expect((a.capacity)() == 32); +} + +test "generic function pointer can be called" { + const S = struct { + var ok = false; + fn foo(x: anytype) void { + ok = x; + } + }; + const x = &S.foo; + x(true); + try expect(S.ok); +} + +test "value returned from comptime function is comptime known" { + const S = struct { + fn fields(comptime T: type) switch (@typeInfo(T)) { + .Struct => []const std.builtin.Type.StructField, + else => unreachable, + } { + return switch (@typeInfo(T)) { + .Struct => |info| info.fields, + else => unreachable, + }; + } + }; + const fields_list = S.fields(@TypeOf(.{})); + if (fields_list.len != 0) + @compileError("Argument count mismatch"); +} + +test "registers get overwritten when ignoring return" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.cpu.arch != .x86_64 or builtin.os.tag != .linux) return error.SkipZigTest; + + const S = struct { + fn open() usize { + return 42; + } + fn write(fd: usize, a: [*]const u8, len: usize) usize { + return syscall4(.WRITE, fd, @intFromPtr(a), len); + } + fn syscall4(_: enum { WRITE }, _: usize, _: usize, _: usize) usize { + return 23; + } + fn close(fd: usize) usize { + if (fd != 42) + unreachable; + return 0; + } + }; + + const fd = S.open(); + _ = S.write(fd, "a", 1); + _ = S.close(fd); +} + +test "call with union with zero sized field is not memorized incorrectly" { + const U = union(enum) { + T: type, + N: void, + fn S(comptime query: @This()) type { + return struct { + fn tag() type { + return query.T; + } + }; + } + }; + const s1 = U.S(U{ .T = u32 }).tag(); + try std.testing.expectEqual(u32, s1); + + const s2 = U.S(U{ .T = u64 }).tag(); + try std.testing.expectEqual(u64, s2); +} + +test "function call with cast to anyopaque pointer" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + const Foo = struct { + y: u8, + var foo: @This() = undefined; + const t = &foo; + + fn bar(pointer: ?*anyopaque) void { + _ = pointer; + } + }; + Foo.bar(Foo.t); +} diff --git a/test/behavior/cast.zig b/test/behavior/cast.zig index d7f347c800..3515349349 100644 --- a/test/behavior/cast.zig +++ b/test/behavior/cast.zig @@ -2521,3 +2521,41 @@ test "result type is preserved into comptime block" { const x: u32 = comptime @intCast(123); try expect(x == 123); } + +test "implicit cast from ptr to tuple to ptr to struct" { + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const ComptimeReason = union(enum) { + c_import: struct { + a: u32, + }, + }; + + const Block = struct { + reason: ?*const ComptimeReason, + }; + + var a: u32 = 16; + _ = &a; + var reason = .{ .c_import = .{ .a = a } }; + var block = Block{ + .reason = &reason, + }; + _ = █ + try expect(block.reason.?.c_import.a == 16); +} + +test "bitcast vector" { + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const u8x32 = @Vector(32, u8); + const u32x8 = @Vector(8, u32); + + const zerox32: u8x32 = [_]u8{0} ** 32; + const bigsum: u32x8 = @bitCast(zerox32); + try std.testing.expectEqual(0, @reduce(.Add, bigsum)); +} diff --git a/test/behavior/bugs/529_other_file.zig b/test/behavior/conflicting_externs/a.zig similarity index 98% rename from test/behavior/bugs/529_other_file.zig rename to test/behavior/conflicting_externs/a.zig index 4ee4e31a10..0c42f1dd89 100644 --- a/test/behavior/bugs/529_other_file.zig +++ b/test/behavior/conflicting_externs/a.zig @@ -1,5 +1,4 @@ pub const A = extern struct { field: c_int, }; - pub extern fn issue529(?*A) void; diff --git a/test/behavior/bugs/529_other_file_2.zig b/test/behavior/conflicting_externs/b.zig similarity index 100% rename from test/behavior/bugs/529_other_file_2.zig rename to test/behavior/conflicting_externs/b.zig diff --git a/test/behavior/enum.zig b/test/behavior/enum.zig index 6c111c3751..4e623f96cf 100644 --- a/test/behavior/enum.zig +++ b/test/behavior/enum.zig @@ -1235,3 +1235,10 @@ fn getLazyInitialized(param: enum(u8) { }) u8 { return @intFromEnum(param); } + +test "Non-exhaustive enum backed by comptime_int" { + const E = enum(comptime_int) { a, b, c, _ }; + comptime var e: E = .a; + e = @as(E, @enumFromInt(378089457309184723749)); + try expect(@intFromEnum(e) == 378089457309184723749); +} diff --git a/test/behavior/error.zig b/test/behavior/error.zig index 715cd6e445..0caf09055e 100644 --- a/test/behavior/error.zig +++ b/test/behavior/error.zig @@ -970,3 +970,59 @@ test "try used in recursive function with inferred error set" { }; try expectError(error.a, Value.x(a)); } + +test "generic inline function returns inferred error set" { + const S = struct { + inline fn retErr(comptime T: type) !T { + return error.AnError; + } + + fn main0() !void { + _ = try retErr(u8); + } + }; + S.main0() catch |e| { + try std.testing.expect(e == error.AnError); + }; +} + +test "function called at runtime is properly analyzed for inferred error set" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const S = struct { + fn foo() !void { + var a = true; + _ = &a; + if (a) return error.Foo; + return error.Bar; + } + fn bar() !void { + try @This().foo(); + } + }; + + S.bar() catch |err| switch (err) { + error.Foo => {}, + error.Bar => {}, + }; +} + +test "generic type constructed from inferred error set of unresolved function" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const S = struct { + fn write(_: void, bytes: []const u8) !usize { + _ = bytes; + return 0; + } + const T = std.io.Writer(void, @typeInfo(@typeInfo(@TypeOf(write)).Fn.return_type.?).ErrorUnion.error_set, write); + fn writer() T { + return .{ .context = {} }; + } + }; + _ = std.io.multiWriter(.{S.writer()}); +} diff --git a/test/behavior/floatop.zig b/test/behavior/floatop.zig index e1c870bce6..568fe6deef 100644 --- a/test/behavior/floatop.zig +++ b/test/behavior/floatop.zig @@ -1556,3 +1556,84 @@ test "comptime fixed-width float non-zero divided by zero produces signed Inf" { test "comptime_float zero divided by zero produces zero" { try expect((0.0 / 0.0) == 0.0); } + +test "comptime float compared with runtime int" { + const f = 10.0; + var i: usize = 0; + _ = &i; + try std.testing.expect(i < f); +} +test "comptime nan < runtime 0" { + const f = comptime std.math.nan(f64); + var i: usize = 0; + _ = &i; + try std.testing.expect(!(f < i)); +} +test "comptime inf > runtime 0" { + const f = comptime std.math.inf(f64); + var i: usize = 0; + _ = &i; + try std.testing.expect(f > i); +} +test "comptime -inf < runtime 0" { + const f = comptime -std.math.inf(f64); + var i: usize = 0; + _ = &i; + try std.testing.expect(f < i); +} +test "comptime inf >= runtime 1" { + const f = comptime std.math.inf(f64); + var i: usize = 1; + _ = &i; + try std.testing.expect(f >= i); +} +test "comptime isNan(nan * 1)" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const nan_times_one = comptime std.math.nan(f64) * 1; + try std.testing.expect(std.math.isNan(nan_times_one)); +} +test "runtime isNan(nan * 1)" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const nan_times_one = std.math.nan(f64) * 1; + try std.testing.expect(std.math.isNan(nan_times_one)); +} +test "comptime isNan(nan * 0)" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const nan_times_zero = comptime std.math.nan(f64) * 0; + try std.testing.expect(std.math.isNan(nan_times_zero)); + const zero_times_nan = 0 * comptime std.math.nan(f64); + try std.testing.expect(std.math.isNan(zero_times_nan)); +} +test "runtime isNan(nan * 0)" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const nan_times_zero = std.math.nan(f64) * 0; + try std.testing.expect(std.math.isNan(nan_times_zero)); + const zero_times_nan = 0 * std.math.nan(f64); + try std.testing.expect(std.math.isNan(zero_times_nan)); +} +test "comptime isNan(inf * 0)" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const inf_times_zero = comptime std.math.inf(f64) * 0; + try std.testing.expect(std.math.isNan(inf_times_zero)); + const zero_times_inf = 0 * comptime std.math.inf(f64); + try std.testing.expect(std.math.isNan(zero_times_inf)); +} +test "runtime isNan(inf * 0)" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const inf_times_zero = std.math.inf(f64) * 0; + try std.testing.expect(std.math.isNan(inf_times_zero)); + const zero_times_inf = 0 * std.math.inf(f64); + try std.testing.expect(std.math.isNan(zero_times_inf)); +} diff --git a/test/behavior/for.zig b/test/behavior/for.zig index 33df3c3112..53e21f5ce5 100644 --- a/test/behavior/for.zig +++ b/test/behavior/for.zig @@ -504,3 +504,24 @@ test "inferred alloc ptr of for loop" { try expectEqual(@as(?bool, true), opt); } } + +test "for loop results in a bool" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + try std.testing.expect(for ([1]u8{0}) |x| { + if (x == 0) break true; + } else false); +} + +test "return from inline for" { + const S = struct { + fn do() bool { + inline for (.{"a"}) |_| { + if (true) return false; + } + return true; + } + }; + try std.testing.expect(!S.do()); +} diff --git a/test/behavior/generics.zig b/test/behavior/generics.zig index d0c97bdbf3..f50e6bf7f4 100644 --- a/test/behavior/generics.zig +++ b/test/behavior/generics.zig @@ -460,3 +460,101 @@ test "coerced function body has inequal value with its uncoerced body" { }; try expect(S.A.do() == 1234); } + +test "generic function returns value from callconv(.C) function" { + const S = struct { + fn getU8() callconv(.C) u8 { + return 123; + } + + fn getGeneric(comptime T: type, supplier: fn () callconv(.C) T) T { + return supplier(); + } + }; + + try testing.expect(S.getGeneric(u8, S.getU8) == 123); +} + +test "union in struct captures argument" { + const S = struct { + fn BuildType(comptime T: type) type { + return struct { + val: union { + b: T, + }, + }; + } + }; + const TestStruct = S.BuildType(u32); + const c = TestStruct{ .val = .{ .b = 10 } }; + try expect(c.val.b == 10); +} + +test "function argument tuple used as struct field" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + + const S = struct { + fn DeleagateWithContext(comptime Function: type) type { + const ArgArgs = std.meta.ArgsTuple(Function); + return struct { + t: ArgArgs, + }; + } + + const OnConfirm = DeleagateWithContext(fn (bool) void); + const CustomDraw = DeleagateWithContext(fn (?OnConfirm) void); + }; + + var c: S.CustomDraw = undefined; + c.t[0] = null; + try expect(c.t[0] == null); +} + +test "comptime callconv(.C) function ptr uses comptime type argument" { + const S = struct { + fn A( + comptime T: type, + comptime destroycb: ?*const fn (?*T) callconv(.C) void, + ) !void { + try expect(destroycb == null); + } + }; + try S.A(u32, null); +} + +test "call generic function with from function called by the generic function" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_llvm and + builtin.cpu.arch == .aarch64 and builtin.os.tag == .windows) return error.SkipZigTest; + + const GET = struct { + key: []const u8, + const GET = @This(); + const Redis = struct { + const Command = struct { + fn serialize(self: GET, comptime RootSerializer: type) void { + return RootSerializer.serializeCommand(.{ "GET", self.key }); + } + }; + }; + }; + const ArgSerializer = struct { + fn isCommand(comptime T: type) bool { + const tid = @typeInfo(T); + return (tid == .Struct or tid == .Enum or tid == .Union) and + @hasDecl(T, "Redis") and @hasDecl(T.Redis, "Command"); + } + fn serializeCommand(command: anytype) void { + const CmdT = @TypeOf(command); + + if (comptime isCommand(CmdT)) { + return CmdT.Redis.Command.serialize(command, @This()); + } + } + }; + + ArgSerializer.serializeCommand(GET{ .key = "banana" }); +} diff --git a/test/behavior/globals.zig b/test/behavior/globals.zig index 99ebd2bc80..46d9610ed6 100644 --- a/test/behavior/globals.zig +++ b/test/behavior/globals.zig @@ -27,3 +27,22 @@ test "store to global vector" { vpos = @Vector(2, f32){ 0.0, 1.0 }; try expect(vpos[1] == 1.0); } + +test "slices pointing at the same address as global array." { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const S = struct { + const a = [_]u8{ 1, 2, 3 }; + + fn checkAddress(s: []const u8) !void { + for (s, 0..) |*i, j| { + try expect(i == &a[j]); + } + } + }; + + try S.checkAddress(&S.a); + try comptime S.checkAddress(&S.a); +} diff --git a/test/behavior/hasdecl.zig b/test/behavior/hasdecl.zig index 381e79760c..e297979ba2 100644 --- a/test/behavior/hasdecl.zig +++ b/test/behavior/hasdecl.zig @@ -19,3 +19,12 @@ test "@hasDecl" { try expect(@hasDecl(Bar, "blah")); try expect(!@hasDecl(Bar, "nope")); } + +test "@hasDecl using a sliced string literal" { + try expect(@hasDecl(@This(), "std") == true); + try expect(@hasDecl(@This(), "std"[0..0]) == false); + try expect(@hasDecl(@This(), "std"[0..1]) == false); + try expect(@hasDecl(@This(), "std"[0..2]) == false); + try expect(@hasDecl(@This(), "std"[0..3]) == true); + try expect(@hasDecl(@This(), "std"[0..]) == true); +} diff --git a/test/behavior/if.zig b/test/behavior/if.zig index bef02fd1ce..69ad917e6a 100644 --- a/test/behavior/if.zig +++ b/test/behavior/if.zig @@ -200,3 +200,11 @@ test "if value shouldn't be load-elided if used later (optionals)" { try std.testing.expectEqual(c, 1); } + +test "variable type inferred from if expression" { + var a = if (true) { + return; + } else true; + _ = &a; + return error.TestFailed; +} diff --git a/test/behavior/int_comparison_elision.zig b/test/behavior/int_comparison_elision.zig index 9ac9e1fca1..28102ef295 100644 --- a/test/behavior/int_comparison_elision.zig +++ b/test/behavior/int_comparison_elision.zig @@ -106,3 +106,8 @@ fn testIntEdges(comptime T: type) void { if (undef_const == max + 1) @compileError("analyzed impossible branch"); if (undef_const != max + 1) {} else @compileError("analyzed impossible branch"); } + +test "comparison elided on large integer value" { + try std.testing.expect(-1 == @as(i8, -3) >> 2); + try std.testing.expect(-1 == -3 >> 2000); +} diff --git a/test/behavior/math.zig b/test/behavior/math.zig index 4f9f7a673d..3b7e692b83 100644 --- a/test/behavior/math.zig +++ b/test/behavior/math.zig @@ -164,6 +164,25 @@ fn testOneCtz(comptime T: type, x: T) u32 { return @ctz(x); } +test "@ctz 128-bit integers" { + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + try testCtz128(); + try comptime testCtz128(); +} + +fn testCtz128() !void { + try expect(testOneCtz(u128, @as(u128, 0x40000000000000000000000000000000)) == 126); + try expect(math.rotl(u128, @as(u128, 0x40000000000000000000000000000000), @as(u8, 1)) == @as(u128, 0x80000000000000000000000000000000)); + try expect(testOneCtz(u128, @as(u128, 0x80000000000000000000000000000000)) == 127); + try expect(testOneCtz(u128, math.rotl(u128, @as(u128, 0x40000000000000000000000000000000), @as(u8, 1))) == 127); +} + test "@ctz vectors" { if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO @@ -1700,3 +1719,21 @@ test "mod lazy values" { _ = y; } } + +test "@clz works on both vector and scalar inputs" { + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + var x: u32 = 0x1; + _ = &x; + var y: @Vector(4, u32) = [_]u32{ 0x1, 0x1, 0x1, 0x1 }; + _ = &y; + const a = @clz(x); + const b = @clz(y); + try std.testing.expectEqual(@as(u6, 31), a); + try std.testing.expectEqual([_]u6{ 31, 31, 31, 31 }, b); +} diff --git a/test/behavior/memset.zig b/test/behavior/memset.zig index 966443f9cc..69f890e146 100644 --- a/test/behavior/memset.zig +++ b/test/behavior/memset.zig @@ -156,3 +156,23 @@ test "@memset provides result type" { for (buf1) |s| try expect(s.x == 12); for (buf2) |s| try expect(s.x == 34); } + +test "zero keys with @memset" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const Keys = struct { + up: bool, + down: bool, + left: bool, + right: bool, + var keys: @This() = undefined; + }; + @memset(@as([*]u8, @ptrCast(&Keys.keys))[0..@sizeOf(@TypeOf(Keys.keys))], 0); + try expect(!Keys.keys.up); + try expect(!Keys.keys.down); + try expect(!Keys.keys.left); + try expect(!Keys.keys.right); +} diff --git a/test/behavior/bugs/529.zig b/test/behavior/multiple_externs_with_conflicting_types.zig similarity index 77% rename from test/behavior/bugs/529.zig rename to test/behavior/multiple_externs_with_conflicting_types.zig index 5705399061..c61a3b3f91 100644 --- a/test/behavior/bugs/529.zig +++ b/test/behavior/multiple_externs_with_conflicting_types.zig @@ -5,18 +5,18 @@ const A = extern struct { extern fn issue529(?*A) void; comptime { - _ = @import("529_other_file_2.zig"); + _ = @import("conflicting_externs/b.zig"); } const builtin = @import("builtin"); -test "issue 529 fixed" { +test "call extern function defined with conflicting type" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest; - @import("529_other_file.zig").issue529(null); + @import("conflicting_externs/a.zig").issue529(null); issue529(null); } diff --git a/test/behavior/optional.zig b/test/behavior/optional.zig index d6dd27db3b..05c644cedf 100644 --- a/test/behavior/optional.zig +++ b/test/behavior/optional.zig @@ -495,3 +495,17 @@ test "variable of optional of noreturn" { _ = &null_opv; try std.testing.expectEqual(@as(?noreturn, null), null_opv); } + +test "copied optional doesn't alias source" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + var opt_x: ?[3]f32 = [_]f32{0.0} ** 3; + + const x = opt_x.?; + opt_x.?[0] = 15.0; + + try expect(x[0] == 0.0); +} diff --git a/test/behavior/packed-struct.zig b/test/behavior/packed-struct.zig index d99bcc1b6e..59951495ad 100644 --- a/test/behavior/packed-struct.zig +++ b/test/behavior/packed-struct.zig @@ -1071,3 +1071,161 @@ test "assigning packed struct inside another packed struct" { try expectEqual(val, S.mem.inner); try expect(S.mem.padding == 0); } + +test "packed struct used as part of anon decl name" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const S = packed struct { a: u0 = 0 }; + var a: u8 = 0; + _ = &a; + try std.io.null_writer.print("\n{} {}\n", .{ a, S{} }); +} + +test "packed struct acts as a namespace" { + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const Bar = packed struct { + const Baz = enum { + fizz, + buzz, + }; + }; + var foo = Bar.Baz.fizz; + _ = &foo; + try expect(foo == .fizz); +} + +test "pointer loaded correctly from packed struct" { + const RAM = struct { + data: [0xFFFF + 1]u8, + fn new() !@This() { + return .{ .data = [_]u8{0} ** 0x10000 }; + } + fn get(self: *@This(), addr: u16) u8 { + return self.data[addr]; + } + }; + + const CPU = packed struct { + interrupts: bool, + ram: *RAM, + fn new(ram: *RAM) !@This() { + return .{ + .ram = ram, + .interrupts = false, + }; + } + fn tick(self: *@This()) !void { + const queued_interrupts = self.ram.get(0xFFFF) & self.ram.get(0xFF0F); + if (self.interrupts and queued_interrupts != 0) { + self.interrupts = false; + } + } + }; + if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64) { + // Careful enabling this test, fails randomly. + return error.SkipZigTest; + } + + var ram = try RAM.new(); + var cpu = try CPU.new(&ram); + try cpu.tick(); + try std.testing.expect(cpu.interrupts == false); +} + +test "assignment to non-byte-aligned field in packed struct" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const Frame = packed struct { + num: u20, + }; + + const Entry = packed struct { + other: u12, + frame: Frame, + }; + + const frame = Frame{ .num = 0x7FDE }; + var entry = Entry{ .other = 0, .frame = .{ .num = 0xFFFFF } }; + entry.frame = frame; + try expect(entry.frame.num == 0x7FDE); +} + +test "packed struct field pointer aligned properly" { + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO + + const Foo = packed struct { + a: i32, + b: u8, + + var buffer: [256]u8 = undefined; + }; + + var f1: *align(16) Foo = @alignCast(@as(*align(1) Foo, @ptrCast(&Foo.buffer[0]))); + try expect(@typeInfo(@TypeOf(f1)).Pointer.alignment == 16); + try expect(@intFromPtr(f1) == @intFromPtr(&f1.a)); + try expect(@typeInfo(@TypeOf(&f1.a)).Pointer.alignment == 16); +} + +test "load flag from packed struct in union" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const A = packed struct { + a: bool, + b: bool, + c: bool, + d: bool, + + e: bool, + f: bool, + g: bool, + h: bool, + }; + + const X = union { + x: A, + y: u64, + + pub fn a(_: i32, _: i32, _: i32, _: i32, _: i32, _: bool, flag_b: bool) !void { + const flag_b_byte: u8 = @intFromBool(flag_b); + try std.testing.expect(flag_b_byte == 1); + } + pub fn b(x: *@This()) !void { + try a(0, 1, 2, 3, 4, x.x.a, x.x.b); + } + }; + var flags = A{ + .a = false, + .b = true, + .c = false, + .d = false, + + .e = false, + .f = true, + .g = false, + .h = false, + }; + _ = &flags; + var x = X{ + .x = flags, + }; + try X.b(&x); + comptime if (@sizeOf(A) != 1) unreachable; +} diff --git a/test/behavior/packed-union.zig b/test/behavior/packed-union.zig index cd71f965c4..e3bf915417 100644 --- a/test/behavior/packed-union.zig +++ b/test/behavior/packed-union.zig @@ -114,3 +114,31 @@ test "packed union in packed struct" { try std.testing.expectEqual(RequestType.read, Request.init(.{ .key = 3 }).active_type); } + +test "packed union initialized with a runtime value" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; + + const Fields = packed struct { + timestamp: u50, + random_bits: u13, + }; + const ID = packed union { + value: u63, + fields: Fields, + + fn value() i64 { + return 1341; + } + }; + + const timestamp: i64 = ID.value(); + const id = ID{ .fields = Fields{ + .timestamp = @as(u50, @intCast(timestamp)), + .random_bits = 420, + } }; + try std.testing.expect((ID{ .value = id.value }).fields.timestamp == timestamp); +} diff --git a/test/behavior/pointers.zig b/test/behavior/pointers.zig index 3e3e67cc4e..68ff5b66f7 100644 --- a/test/behavior/pointers.zig +++ b/test/behavior/pointers.zig @@ -555,3 +555,68 @@ test "result type found through optional pointer" { try expect(ptr2.?[0] == 123); try expect(ptr2.?[1] == 0xCD); } + +const Box0 = struct { + items: [4]Item, + + const Item = struct { + num: u32, + }; +}; +const Box1 = struct { + items: [4]Item, + + const Item = struct {}; +}; +const Box2 = struct { + items: [4]Item, + + const Item = struct { + nothing: void, + }; +}; + +fn mutable() !void { + var box0: Box0 = .{ .items = undefined }; + try std.testing.expect(@typeInfo(@TypeOf(box0.items[0..])).Pointer.is_const == false); + + var box1: Box1 = .{ .items = undefined }; + try std.testing.expect(@typeInfo(@TypeOf(box1.items[0..])).Pointer.is_const == false); + + var box2: Box2 = .{ .items = undefined }; + try std.testing.expect(@typeInfo(@TypeOf(box2.items[0..])).Pointer.is_const == false); +} + +fn constant() !void { + const box0: Box0 = .{ .items = undefined }; + try std.testing.expect(@typeInfo(@TypeOf(box0.items[0..])).Pointer.is_const == true); + + const box1: Box1 = .{ .items = undefined }; + try std.testing.expect(@typeInfo(@TypeOf(box1.items[0..])).Pointer.is_const == true); + + const box2: Box2 = .{ .items = undefined }; + try std.testing.expect(@typeInfo(@TypeOf(box2.items[0..])).Pointer.is_const == true); +} + +test "pointer-to-array constness for zero-size elements, var" { + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + try mutable(); + try comptime mutable(); +} + +test "pointer-to-array constness for zero-size elements, const" { + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + try constant(); + try comptime constant(); +} + +test "cast pointers with zero sized elements" { + const a: *void = undefined; + const b: *[1]void = a; + _ = b; + const c: *[0]u8 = undefined; + const d: []u8 = c; + _ = d; +} diff --git a/test/behavior/sizeof_and_typeof.zig b/test/behavior/sizeof_and_typeof.zig index 00f891a70f..5289c51a24 100644 --- a/test/behavior/sizeof_and_typeof.zig +++ b/test/behavior/sizeof_and_typeof.zig @@ -314,3 +314,117 @@ test "@bitSizeOf on array of structs" { try expectEqual(128, @bitSizeOf([2]S)); } + +test "lazy abi size used in comparison" { + const S = struct { a: usize }; + var rhs: i32 = 100; + _ = &rhs; + try expect(@sizeOf(S) < rhs); +} + +test "peer type resolution with @TypeOf doesn't trigger dependency loop check" { + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const T = struct { + next: @TypeOf(null, @as(*const @This(), undefined)), + }; + var t: T = .{ .next = null }; + _ = &t; + try std.testing.expect(t.next == null); +} + +test "@sizeOf reified union zero-size payload fields" { + comptime { + try std.testing.expect(0 == @sizeOf(@Type(@typeInfo(union {})))); + try std.testing.expect(0 == @sizeOf(@Type(@typeInfo(union { a: void })))); + if (builtin.mode == .Debug or builtin.mode == .ReleaseSafe) { + try std.testing.expect(1 == @sizeOf(@Type(@typeInfo(union { a: void, b: void })))); + try std.testing.expect(1 == @sizeOf(@Type(@typeInfo(union { a: void, b: void, c: void })))); + } else { + try std.testing.expect(0 == @sizeOf(@Type(@typeInfo(union { a: void, b: void })))); + try std.testing.expect(0 == @sizeOf(@Type(@typeInfo(union { a: void, b: void, c: void })))); + } + } +} + +const FILE = extern struct { + dummy_field: u8, +}; + +extern fn c_printf([*c]const u8, ...) c_int; +extern fn c_fputs([*c]const u8, noalias [*c]FILE) c_int; +extern fn c_ftell([*c]FILE) c_long; +extern fn c_fopen([*c]const u8, [*c]const u8) [*c]FILE; + +test "Extern function calls in @TypeOf" { + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const S = extern struct { + state: c_short, + + extern fn s_do_thing([*c]const @This(), b: c_int) c_short; + }; + + const Test = struct { + fn test_fn_1(a: anytype, b: anytype) @TypeOf(c_printf("%d %s\n", a, b)) { + return 0; + } + + fn test_fn_2(s: anytype, a: anytype) @TypeOf(s.s_do_thing(a)) { + return 1; + } + + fn doTheTest() !void { + try expect(@TypeOf(test_fn_1(0, 42)) == c_int); + try expect(@TypeOf(test_fn_2(&S{ .state = 1 }, 0)) == c_short); + } + }; + + try Test.doTheTest(); + try comptime Test.doTheTest(); +} + +test "Peer resolution of extern function calls in @TypeOf" { + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const Test = struct { + fn test_fn() @TypeOf(c_ftell(null), c_fputs(null, null)) { + return 0; + } + + fn doTheTest() !void { + try expect(@TypeOf(test_fn()) == c_long); + } + }; + + try Test.doTheTest(); + try comptime Test.doTheTest(); +} + +test "Extern function calls, dereferences and field access in @TypeOf" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const Test = struct { + fn test_fn_1(a: c_long) @TypeOf(c_fopen("test", "r").*) { + _ = a; + return .{ .dummy_field = 0 }; + } + + fn test_fn_2(a: anytype) @TypeOf(c_fopen("test", "r").*.dummy_field) { + _ = a; + return 255; + } + + fn doTheTest() !void { + try expect(@TypeOf(test_fn_1(0)) == FILE); + try expect(@TypeOf(test_fn_2(0)) == u8); + } + }; + + try Test.doTheTest(); + try comptime Test.doTheTest(); +} diff --git a/test/behavior/slice.zig b/test/behavior/slice.zig index e34e9a501a..2ff8debfb6 100644 --- a/test/behavior/slice.zig +++ b/test/behavior/slice.zig @@ -912,3 +912,67 @@ test "modify slice length at comptime" { try expectEqualSlices(u8, &.{10}, a); try expectEqualSlices(u8, &.{ 10, 20 }, b); } + +test "slicing zero length array field of struct" { + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const S = struct { + a: [0]usize, + fn foo(self: *@This(), start: usize, end: usize) []usize { + return self.a[start..end]; + } + }; + var s: S = undefined; + try expect(s.foo(0, 0).len == 0); +} + +test "slicing slices gives correct result" { + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const foo = "1234"; + const bar = foo[0..4]; + try expectEqualStrings("1234", bar); + try expectEqualStrings("2", bar[1..2]); + try expectEqualStrings("3", bar[2..3]); + try expectEqualStrings("4", bar[3..4]); + try expectEqualStrings("34", bar[2..4]); +} + +test "get address of element of zero-sized slice" { + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const S = struct { + fn destroy(_: *void) void {} + }; + + var slice: []void = undefined; + S.destroy(&slice[0]); +} + +test "sentinel-terminated 0-length slices" { + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const u32s: [4]u32 = [_]u32{ 0, 1, 2, 3 }; + + var index: u8 = 2; + _ = &index; + const slice = u32s[index..index :2]; + const array_ptr = u32s[2..2 :2]; + const comptime_known_array_value = u32s[2..2 :2].*; + var runtime_array_value = u32s[2..2 :2].*; + _ = &runtime_array_value; + + try expect(slice[0] == 2); + try expect(array_ptr[0] == 2); + try expect(comptime_known_array_value[0] == 2); + try expect(runtime_array_value[0] == 2); +} diff --git a/test/behavior/string_literals.zig b/test/behavior/string_literals.zig index 04ec145e3f..01f285bf0c 100644 --- a/test/behavior/string_literals.zig +++ b/test/behavior/string_literals.zig @@ -80,3 +80,19 @@ test "string literal pointer sentinel" { try std.testing.expect(@TypeOf(string_literal.ptr) == [*:0]const u8); } + +test "sentinel slice of string literal" { + const string = "Hello!\x00World!"; + try std.testing.expect(@TypeOf(string) == *const [13:0]u8); + + const slice_without_sentinel: []const u8 = string[0..6]; + try std.testing.expect(@TypeOf(slice_without_sentinel) == []const u8); + + const slice_with_sentinel: [:0]const u8 = string[0..6 :0]; + try std.testing.expect(@TypeOf(slice_with_sentinel) == [:0]const u8); +} + +test "Peer type resolution with string literals and unknown length u8 pointers" { + try std.testing.expect(@TypeOf("", "a", @as([*:0]const u8, "")) == [*:0]const u8); + try std.testing.expect(@TypeOf(@as([*:0]const u8, "baz"), "foo", "bar") == [*:0]const u8); +} diff --git a/test/behavior/struct.zig b/test/behavior/struct.zig index 7eb5e62282..d03e4ebf32 100644 --- a/test/behavior/struct.zig +++ b/test/behavior/struct.zig @@ -203,18 +203,18 @@ test "return struct byval from function" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - const bar = makeBar2(1234, 5678); - try expect(bar.y == 5678); -} -const Bar = struct { - x: i32, - y: i32, -}; -fn makeBar2(x: i32, y: i32) Bar { - return Bar{ - .x = x, - .y = y, + const Bar = struct { + x: i32, + y: i32, + fn makeBar2(x: i32, y: i32) @This() { + return .{ + .x = x, + .y = y, + }; + } }; + const bar = Bar.makeBar2(1234, 5678); + try expect(bar.y == 5678); } test "call method with mutable reference to struct with no fields" { @@ -1883,10 +1883,234 @@ test "field calls do not force struct field init resolution" { } test "tuple with comptime-only field" { - const x = getTuple(); + const S = struct { + fn getTuple() struct { comptime_int } { + return struct { comptime comptime_int = 0 }{0}; + } + }; + + const x = S.getTuple(); try expect(x.@"0" == 0); } -fn getTuple() struct { comptime_int } { - return struct { comptime comptime_int = 0 }{0}; +test "extern struct fields are aligned to 1" { + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const Foo = extern struct { + a: u8 align(1), + b: u16 align(1), + }; + + const foo = Foo{ + .a = 1, + .b = 2, + }; + try std.testing.expectEqual(1, foo.a); + try std.testing.expectEqual(2, foo.b); +} + +test "assign to slice.len of global variable" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const S = struct { + const allocator = std.testing.allocator; + var list = std.ArrayList(u32).init(allocator); + }; + + S.list.items.len = 0; + try expect(S.list.items.len == 0); +} + +test "pointers to fields of volatile pointer to struct are also volatile" { + const B = extern struct { + a: u32, + b: i32, + }; + const A = extern struct { + value: *volatile B, + }; + + var a: *A = undefined; + try expect(@TypeOf(&a.value.a) == *volatile u32); + try expect(@TypeOf(&a.value.b) == *volatile i32); +} + +test "pointers to fields of volatile pointer to union are also volatile" { + const D = extern union { + a: u32, + b: i32, + }; + const C = extern struct { + value: *volatile D, + }; + + var c: *C = undefined; + try expect(@TypeOf(&c.value.a) == *volatile u32); + try expect(@TypeOf(&c.value.b) == *volatile i32); +} + +test "array of structs inside struct initialized with undefined" { + const Item = struct { field: u8 }; + const Thing = struct { + array: [1]Item, + }; + _ = Thing{ .array = undefined }; +} + +test "runtime call in nested initializer" { + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const Holder = struct { + array: []const u8, + }; + const Test = struct { + holders: []const Holder, + }; + const Letter = enum(u8) { + A = 0x41, + B, + + fn letter(e: @This()) u8 { + return @intFromEnum(e); + } + }; + + const test_struct = Test{ + .holders = &.{ + Holder{ + .array = &.{ + Letter.letter(.A), + }, + }, + }, + }; + try std.testing.expectEqualStrings("A", test_struct.holders[0].array); +} + +test "runtime value in nested initializer passed as pointer to function" { + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const Bar = struct { + b: u32, + }; + const Foo = struct { + a: Bar, + + fn takeFoo(foo: *const @This()) !void { + try std.testing.expectEqual(@as(u32, 24), foo.a.b); + } + }; + + var baz: u32 = 24; + _ = &baz; + try Foo.takeFoo(&.{ + .a = .{ + .b = baz, + }, + }); +} + +test "struct field default value is a call" { + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const Z = packed struct { + a: u32, + }; + const Y = struct { + a: u16, + b: bool, + c: Z, + d: Z, + + fn init() @This() { + return .{ + .a = 0, + .b = false, + .c = @as(Z, @bitCast(@as(u32, 0))), + .d = @as(Z, @bitCast(@as(u32, 0))), + }; + } + }; + const X = struct { + y: Y = Y.init(), + }; + + const x = X{}; + try std.testing.expectEqual(@as(u16, 0), x.y.a); + try std.testing.expectEqual(false, x.y.b); + try std.testing.expectEqual(Z{ .a = 0 }, x.y.c); + try std.testing.expectEqual(Z{ .a = 0 }, x.y.d); +} + +test "aggregate initializers should allow initializing comptime fields, verifying equality" { + var x: u32 = 15; + _ = &x; + const T = @TypeOf(.{ @as(i32, -1234), @as(u32, 5678), x }); + const a: T = .{ -1234, 5678, x + 1 }; + + try expect(a[0] == -1234); + try expect(a[1] == 5678); + try expect(a[2] == 16); +} + +test "assignment of field with padding" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const Mesh = extern struct { + id: u32, + }; + const Material = extern struct { + transparent: bool = true, + emits_shadows: bool = true, + render_color: bool = true, + }; + const Renderable = extern struct { + material: Material, + mesh: Mesh, + }; + var renderable: Renderable = undefined; + renderable = Renderable{ + .mesh = Mesh{ .id = 0 }, + .material = Material{ + .transparent = false, + .emits_shadows = false, + }, + }; + try expect(false == renderable.material.transparent); + try expect(false == renderable.material.emits_shadows); + try expect(true == renderable.material.render_color); +} + +test "initiate global variable with runtime value" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const S = struct { + field: i32, + fn couldFail() anyerror!i32 { + return 1; + } + var some_struct: @This() = undefined; + }; + + S.some_struct = .{ + .field = S.couldFail() catch 0, + }; + try expect(S.some_struct.field == 1); } diff --git a/test/behavior/switch.zig b/test/behavior/switch.zig index ae4923609f..353146e50e 100644 --- a/test/behavior/switch.zig +++ b/test/behavior/switch.zig @@ -831,3 +831,22 @@ test "peer type resolution on switch captures ignores unused payload bits" { try expect(x == 123); } + +test "switch prong captures range" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const S = struct { + fn a(b: []u3, c: u3) void { + switch (c) { + 0...1 => b[c] = c, + 2...3 => b[c] = c, + 4...7 => |d| b[d] = c, + } + } + }; + + var arr: [8]u3 = undefined; + S.a(&arr, 5); + try expect(arr[5] == 5); +} diff --git a/test/behavior/this.zig b/test/behavior/this.zig index a68e44df89..3f8fe13316 100644 --- a/test/behavior/this.zig +++ b/test/behavior/this.zig @@ -35,3 +35,23 @@ test "this refer to container" { try expect(pt.x == 13); try expect(pt.y == 35); } + +const State = struct { + const Self = @This(); + enter: *const fn (previous: ?Self) void, +}; + +fn prev(p: ?State) void { + expect(p == null) catch @panic("test failure"); +} + +test "this used as optional function parameter" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + var global: State = undefined; + global.enter = prev; + global.enter(null); +} diff --git a/test/behavior/try.zig b/test/behavior/try.zig index d2ac927338..cc76658e93 100644 --- a/test/behavior/try.zig +++ b/test/behavior/try.zig @@ -45,3 +45,24 @@ test "try then not executed with assignment" { try expect(err == error.ItBroke); } } + +test "`try`ing an if/else expression" { + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const S = struct { + fn getError() !void { + return error.Test; + } + + fn getError2() !void { + var a: u8 = 'c'; + _ = &a; + try if (a == 'a') getError() else if (a == 'b') getError() else getError(); + } + }; + + try std.testing.expectError(error.Test, S.getError2()); +} diff --git a/test/behavior/tuple.zig b/test/behavior/tuple.zig index 303f3b2df5..dd0f7f1007 100644 --- a/test/behavior/tuple.zig +++ b/test/behavior/tuple.zig @@ -488,3 +488,76 @@ test "tuple with comptime fields with non empty initializer" { const a: struct { comptime comptime_int = 0 } = .{0}; _ = a; } + +test "tuple with runtime value coerced into a slice with a sentinel" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + + const S = struct { + fn f(a: [:null]const ?u8) !void { + try expect(a[0] == 42); + } + }; + + const c: u8 = 42; + try S.f(&[_:null]?u8{c}); + try S.f(&.{c}); + + var v: u8 = 42; + _ = &v; + try S.f(&[_:null]?u8{v}); + try S.f(&.{v}); +} + +test "tuple implicitly coerced to optional/error union struct/union" { + const SomeUnion = union(enum) { + variant: u8, + }; + const SomeStruct = struct { + struct_field: u8, + }; + const OptEnum = struct { + opt_union: ?SomeUnion, + }; + const ErrEnum = struct { + err_union: anyerror!SomeUnion, + }; + const OptStruct = struct { + opt_struct: ?SomeStruct, + }; + const ErrStruct = struct { + err_struct: anyerror!SomeStruct, + }; + + try expect((OptEnum{ + .opt_union = .{ + .variant = 1, + }, + }).opt_union.?.variant == 1); + + try expect(((ErrEnum{ + .err_union = .{ + .variant = 1, + }, + }).err_union catch unreachable).variant == 1); + + try expect((OptStruct{ + .opt_struct = .{ + .struct_field = 1, + }, + }).opt_struct.?.struct_field == 1); + + try expect(((ErrStruct{ + .err_struct = .{ + .struct_field = 1, + }, + }).err_struct catch unreachable).struct_field == 1); +} + +test "comptime fields in tuple can be initialized" { + const T = @TypeOf(.{ @as(i32, 0), @as(u32, 0) }); + var a: T = .{ 0, 0 }; + _ = &a; +} diff --git a/test/behavior/type.zig b/test/behavior/type.zig index f27823d2eb..7cb9212c30 100644 --- a/test/behavior/type.zig +++ b/test/behavior/type.zig @@ -568,3 +568,169 @@ test "reified struct field name from optional payload" { } } } + +test "reified union uses @alignOf" { + const S = struct { + fn CreateUnion(comptime T: type) type { + return @Type(.{ + .Union = .{ + .layout = .Auto, + .tag_type = null, + .fields = &[_]std.builtin.Type.UnionField{ + .{ + .name = "field", + .type = T, + .alignment = @alignOf(T), + }, + }, + .decls = &.{}, + }, + }); + } + }; + _ = S.CreateUnion(struct {}); +} + +test "reified struct uses @alignOf" { + const S = struct { + fn NamespacedGlobals(comptime modules: anytype) type { + return @Type(.{ + .Struct = .{ + .layout = .Auto, + .is_tuple = false, + .fields = &.{ + .{ + .name = "globals", + .type = modules.mach.globals, + .default_value = null, + .is_comptime = false, + .alignment = @alignOf(modules.mach.globals), + }, + }, + .decls = &.{}, + }, + }); + } + }; + _ = S.NamespacedGlobals(.{ + .mach = .{ + .globals = struct {}, + }, + }); +} + +test "reified error set initialized with field pointer" { + const S = struct { + const info = .{ + .args = [_]Type.Error{ + .{ .name = "bar" }, + }, + }; + const Foo = @Type(.{ + .ErrorSet = &info.args, + }); + }; + try testing.expect(S.Foo == error{bar}); +} +test "reified function type params initialized with field pointer" { + const S = struct { + const fn_info = .{ + .params = [_]Type.Fn.Param{ + .{ .is_generic = false, .is_noalias = false, .type = u8 }, + }, + }; + const Bar = @Type(.{ + .Fn = .{ + .calling_convention = .Unspecified, + .alignment = 0, + .is_generic = false, + .is_var_args = false, + .return_type = void, + .params = &fn_info.params, + }, + }); + }; + try testing.expect(@typeInfo(S.Bar) == .Fn); +} + +test "empty struct assigned to reified struct field" { + const S = struct { + fn NamespacedComponents(comptime modules: anytype) type { + return @Type(.{ + .Struct = .{ + .layout = .Auto, + .is_tuple = false, + .fields = &.{.{ + .name = "components", + .type = @TypeOf(modules.components), + .default_value = null, + .is_comptime = false, + .alignment = @alignOf(@TypeOf(modules.components)), + }}, + .decls = &.{}, + }, + }); + } + + fn namespacedComponents(comptime modules: anytype) NamespacedComponents(modules) { + var x: NamespacedComponents(modules) = undefined; + x.components = modules.components; + return x; + } + }; + _ = S.namespacedComponents(.{ + .components = .{ + .location = struct {}, + }, + }); +} + +test "@Type should resolve its children types" { + const sparse = enum(u2) { a, b, c }; + const dense = enum(u2) { a, b, c, d }; + + comptime var sparse_info = @typeInfo(anyerror!sparse); + sparse_info.ErrorUnion.payload = dense; + const B = @Type(sparse_info); + try testing.expectEqual(anyerror!dense, B); +} + +test "struct field names sliced at comptime from larger string" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const text = + \\f1 + \\f2 + \\f3 + ; + comptime { + var fields: []const Type.StructField = &[0]Type.StructField{}; + + var it = std.mem.tokenizeScalar(u8, text, '\n'); + while (it.next()) |name| { + fields = fields ++ &[_]Type.StructField{.{ + .alignment = 0, + .name = name, + .type = usize, + .default_value = null, + .is_comptime = false, + }}; + } + + const T = @Type(.{ + .Struct = .{ + .layout = .Auto, + .is_tuple = false, + .fields = fields, + .decls = &.{}, + }, + }); + + const gen_fields = @typeInfo(T).Struct.fields; + try testing.expectEqual(3, gen_fields.len); + try testing.expectEqualStrings("f1", gen_fields[0].name); + try testing.expectEqualStrings("f2", gen_fields[1].name); + try testing.expectEqualStrings("f3", gen_fields[2].name); + } +} diff --git a/test/behavior/undefined.zig b/test/behavior/undefined.zig index 6ae2807b2d..b26002e080 100644 --- a/test/behavior/undefined.zig +++ b/test/behavior/undefined.zig @@ -84,3 +84,16 @@ test "type name of undefined" { const x = undefined; try expect(mem.eql(u8, @typeName(@TypeOf(x)), "@TypeOf(undefined)")); } + +var buf: []u8 = undefined; + +test "reslice of undefined global var slice" { + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + var stack_buf: [100]u8 = [_]u8{0} ** 100; + buf = &stack_buf; + const x = buf[0..1]; + try @import("std").testing.expect(x.len == 1 and x[0] == 0); +} diff --git a/test/behavior/union.zig b/test/behavior/union.zig index a34442c180..86e00151e2 100644 --- a/test/behavior/union.zig +++ b/test/behavior/union.zig @@ -2112,3 +2112,143 @@ test "pass nested union with rls" { _ = &c; try expectEqual(@as(u7, 32), Union.getC(.{ .b = .{ .c = c } })); } + +test "runtime union init, most-aligned field != largest" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const U = union(enum) { + x: u128, + y: [17]u8, + + fn foo(val: @This()) !void { + try expect(val.x == 1); + } + }; + var x: u8 = 1; + _ = &x; + try U.foo(.{ .x = x }); + + const val: U = @unionInit(U, "x", x); + try expect(val.x == 1); + + const val2: U = .{ .x = x }; + try expect(val2.x == 1); +} + +test "copied union field doesn't alias source" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const U = union(enum) { + array: [10]u32, + other: u32, + }; + + var x = U{ .array = undefined }; + + x.array[1] = 0; + const a = x.array; + x.array[1] = 15; + + try expect(a[1] == 0); +} + +test "create union(enum) from other union(enum)" { + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + const string = "hello world"; + const TempRef = struct { + index: usize, + is_weak: bool, + }; + const BuiltinEnum = struct { + name: []const u8, + }; + const ParamType = union(enum) { + boolean, + buffer, + one_of: BuiltinEnum, + }; + const EnumLiteral = struct { + label: []const u8, + }; + + const ExpressionResult = union(enum) { + temp_buffer: TempRef, + literal_boolean: bool, + literal_enum_value: []const u8, + + fn commitCalleeParam(result: @This(), callee_param_type: ParamType) @This() { + switch (callee_param_type) { + .boolean => return result, + .buffer => return .{ + .temp_buffer = .{ .index = 0, .is_weak = false }, + }, + .one_of => return result, + } + } + }; + const Expression = union(enum) { + literal_boolean: bool, + literal_enum_value: EnumLiteral, + + fn genExpression(expr: @This()) !ExpressionResult { + switch (expr) { + .literal_boolean => |value| return .{ + .literal_boolean = value, + }, + .literal_enum_value => |v| { + try std.testing.expectEqualStrings(string, v.label); + const result: ExpressionResult = .{ + .literal_enum_value = v.label, + }; + switch (result) { + .literal_enum_value => |w| { + try std.testing.expectEqualStrings(string, w); + }, + else => {}, + } + return result; + }, + } + } + }; + const CallArg = struct { + value: Expression, + }; + + var param: ParamType = .{ + .one_of = .{ .name = "name" }, + }; + _ = ¶m; + var arg: CallArg = .{ + .value = .{ + .literal_enum_value = .{ + .label = string, + }, + }, + }; + _ = &arg; + + const result = try arg.value.genExpression(); + switch (result) { + .literal_enum_value => |w| { + try std.testing.expectEqualStrings(string, w); + }, + else => {}, + } + + const derp = result.commitCalleeParam(param); + switch (derp) { + .literal_enum_value => |w| { + try std.testing.expectEqualStrings(string, w); + }, + else => {}, + } +} diff --git a/test/behavior/usingnamespace.zig b/test/behavior/usingnamespace.zig index d67a0958e3..201a3143cf 100644 --- a/test/behavior/usingnamespace.zig +++ b/test/behavior/usingnamespace.zig @@ -82,3 +82,18 @@ test { comptime { _ = @import("usingnamespace/file_1.zig"); } + +const Bar = struct { + usingnamespace Mixin; +}; + +const Mixin = struct { + pub fn two(self: Bar) void { + _ = self; + } +}; + +test "container member access usingnamespace decls" { + var foo = Bar{}; + foo.two(); +} diff --git a/test/behavior/vector.zig b/test/behavior/vector.zig index db42658c43..36dd7ca265 100644 --- a/test/behavior/vector.zig +++ b/test/behavior/vector.zig @@ -1530,3 +1530,39 @@ test "index into comptime-known vector is comptime-known" { const vec: @Vector(2, f16) = [2]f16{ 1.5, 3.5 }; if (vec[0] != 1.5) @compileError("vec should be comptime"); } + +test "arithmetic on zero-length vectors" { + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + { + const a = @Vector(0, i32){}; + const b = @Vector(0, i32){}; + _ = a + b; + } + { + const a = @Vector(0, i32){}; + const b = @Vector(0, i32){}; + _ = a - b; + } +} + +test "@reduce on bool vector" { + if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + if (comptime builtin.zig_backend == .stage2_llvm and builtin.cpu.arch.endian() == .big) { + // https://github.com/ziglang/zig/issues/13782 + return error.SkipZigTest; + } + + const a = @Vector(2, bool){ true, true }; + const b = @Vector(1, bool){true}; + try std.testing.expect(@reduce(.And, a)); + try std.testing.expect(@reduce(.And, b)); +} diff --git a/test/behavior/while.zig b/test/behavior/while.zig index 5dc3aef3f0..51ae8c5d98 100644 --- a/test/behavior/while.zig +++ b/test/behavior/while.zig @@ -367,3 +367,37 @@ test "while loop with comptime true condition needs no else block to return valu }; try expect(x == 69); } + +test "int returned from switch in while" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + var x: u32 = 3; + const val: usize = while (true) switch (x) { + 1 => break 2, + else => x -= 1, + }; + try std.testing.expect(val == 2); +} + +test "breaking from a loop in an if statement" { + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + const S = struct { + fn retOpt() ?u32 { + return null; + } + }; + + var cond = true; + _ = &cond; + const opt = while (cond) { + if (S.retOpt()) |opt| { + break opt; + } + break 1; + } else 2; + _ = opt; +} diff --git a/test/cases/compile_errors/extern_function_with_unspecified_calling_convention.zig b/test/cases/compile_errors/extern_function_with_unspecified_calling_convention.zig index ed5d4387e8..fc712bb7c2 100644 --- a/test/cases/compile_errors/extern_function_with_unspecified_calling_convention.zig +++ b/test/cases/compile_errors/extern_function_with_unspecified_calling_convention.zig @@ -1,5 +1,5 @@ const Foo = extern struct { - f: *const fn() void, + f: *const fn () void, }; export fn entry() void { diff --git a/test/cases/compile_errors/invalid_extern_function_call.zig b/test/cases/compile_errors/invalid_extern_function_call.zig index f9ed51439c..986b39c498 100644 --- a/test/cases/compile_errors/invalid_extern_function_call.zig +++ b/test/cases/compile_errors/invalid_extern_function_call.zig @@ -1,4 +1,4 @@ -const x = @extern(*const fn() callconv(.C) void, .{ .name = "foo" }); +const x = @extern(*const fn () callconv(.C) void, .{ .name = "foo" }); export fn entry0() void { comptime x();