diff --git a/test/behavior.zig b/test/behavior.zig index 5bb76b4f3fe3..3a852bb74819 100644 --- a/test/behavior.zig +++ b/test/behavior.zig @@ -91,11 +91,19 @@ test { _ = @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/12488.zig"); _ = @import("behavior/bugs/12498.zig"); @@ -122,6 +130,7 @@ test { _ = @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/13164.zig"); diff --git a/test/behavior/bugs/11995.zig b/test/behavior/bugs/11995.zig new file mode 100644 index 000000000000..255a366fb2fe --- /dev/null +++ b/test/behavior/bugs/11995.zig @@ -0,0 +1,34 @@ +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_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) 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 + var string: [5]u8 = "hello".*; + const arg_data = wuffs_base__slice_u8{ .ptr = @ptrCast([*c]u8, &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 new file mode 100644 index 000000000000..c29fb84270e2 --- /dev/null +++ b/test/behavior/bugs/12000.zig @@ -0,0 +1,16 @@ +const std = @import("std"); +const builtin = @import("builtin"); + +const T = struct { + next: @TypeOf(null, @as(*const T, undefined)), +}; + +test { + 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_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 }; + try std.testing.expect(t.next == null); +} diff --git a/test/behavior/bugs/12051.zig b/test/behavior/bugs/12051.zig new file mode 100644 index 000000000000..efbfc88404ff --- /dev/null +++ b/test/behavior/bugs/12051.zig @@ -0,0 +1,39 @@ +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_64) 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 + 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 = @bitCast(Z, @as(u32, 0)), + .d = @bitCast(Z, @as(u32, 0)), + }; + } +}; + +const Z = packed struct { + a: u32, +}; diff --git a/test/behavior/bugs/12092.zig b/test/behavior/bugs/12092.zig new file mode 100644 index 000000000000..3a7b9766a3cc --- /dev/null +++ b/test/behavior/bugs/12092.zig @@ -0,0 +1,28 @@ +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_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) 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 + var baz: u32 = 24; + try takeFoo(&.{ + .a = .{ + .b = baz, + }, + }); +} diff --git a/test/behavior/bugs/12119.zig b/test/behavior/bugs/12119.zig new file mode 100644 index 000000000000..bb12e3565a0d --- /dev/null +++ b/test/behavior/bugs/12119.zig @@ -0,0 +1,16 @@ +const std = @import("std"); +const builtin = @import("builtin"); + +const u8x32 = @Vector(32, u8); +const u32x8 = @Vector(8, u32); + +test { + 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_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 = @bitCast(u32x8, zerox32); + try std.testing.expectEqual(0, @reduce(.Add, bigsum)); +} diff --git a/test/behavior/bugs/12142.zig b/test/behavior/bugs/12142.zig new file mode 100644 index 000000000000..db303d617a20 --- /dev/null +++ b/test/behavior/bugs/12142.zig @@ -0,0 +1,37 @@ +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 @enumToInt(e); +} + +test { + 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_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 new file mode 100644 index 000000000000..a9a57a0bff0d --- /dev/null +++ b/test/behavior/bugs/12169.zig @@ -0,0 +1,14 @@ +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_64) 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 + 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/12450.zig b/test/behavior/bugs/12450.zig new file mode 100644 index 000000000000..5161e3ffd3de --- /dev/null +++ b/test/behavior/bugs/12450.zig @@ -0,0 +1,21 @@ +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_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) 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 + var f1: *align(16) Foo = @alignCast(16, @ptrCast(*align(1) Foo, &buffer[0])); + try expect(@typeInfo(@TypeOf(f1)).Pointer.alignment == 16); + try expect(@ptrToInt(f1) == @ptrToInt(&f1.a)); + try expect(@typeInfo(@TypeOf(&f1.a)).Pointer.alignment == 16); +} diff --git a/test/behavior/bugs/13113.zig b/test/behavior/bugs/13113.zig new file mode 100644 index 000000000000..cfbf7b6650ac --- /dev/null +++ b/test/behavior/bugs/13113.zig @@ -0,0 +1,21 @@ +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_wasm) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_x86_64) 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 + 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/cases/compile_errors/implicit_cast_const_array_to_mutable_slice.zig b/test/cases/compile_errors/implicit_cast_const_array_to_mutable_slice.zig index 2a80b9ffbc6d..6f67f7252555 100644 --- a/test/cases/compile_errors/implicit_cast_const_array_to_mutable_slice.zig +++ b/test/cases/compile_errors/implicit_cast_const_array_to_mutable_slice.zig @@ -13,6 +13,11 @@ export fn entry2() void { const many: [*]u8 = str; _ = many; } +export fn entry3() void { + const lang: []const u8 = "lang"; + const targets: [1][]const u8 = [_][]u8{lang}; + _ = targets; +} // error // backend=stage2 @@ -24,3 +29,5 @@ export fn entry2() void { // :8:27: note: cast discards const qualifier // :13:25: error: expected type '[*]u8', found '*const [0:0]u8' // :13:25: note: cast discards const qualifier +// :18:44: error: expected type '[]u8', found '[]const u8' +// :18:44: note: cast discards const qualifier diff --git a/test/cases/compile_errors/invalid_store_to_comptime_field.zig b/test/cases/compile_errors/invalid_store_to_comptime_field.zig index a86cb500d235..89deda92d4b5 100644 --- a/test/cases/compile_errors/invalid_store_to_comptime_field.zig +++ b/test/cases/compile_errors/invalid_store_to_comptime_field.zig @@ -61,6 +61,11 @@ pub export fn entry6() void { }; _ = State.init(false); } +pub export fn entry7() void { + const list1 = .{ "sss", 1, 2, 3 }; + const list2 = @TypeOf(list1){ .@"0" = "xxx", .@"1" = 4, .@"2" = 5, .@"3" = 6 }; + _ = list2; +} // error // target=native @@ -73,4 +78,5 @@ pub export fn entry6() void { // :25:29: note: default value set here // :41:16: error: value stored in comptime field does not match the default value of the field // :45:12: error: value stored in comptime field does not match the default value of the field +// :66:43: error: value stored in comptime field does not match the default value of the field // :59:35: error: value stored in comptime field does not match the default value of the field diff --git a/test/cases/compile_errors/invalid_struct_field.zig b/test/cases/compile_errors/invalid_struct_field.zig index d351a012f94d..4450375cb8dc 100644 --- a/test/cases/compile_errors/invalid_struct_field.zig +++ b/test/cases/compile_errors/invalid_struct_field.zig @@ -1,15 +1,22 @@ -const A = struct { x : i32, }; +const A = struct { x: i32 }; export fn f() void { - var a : A = undefined; + var a: A = undefined; a.foo = 1; const y = a.bar; _ = y; } export fn g() void { - var a : A = undefined; + var a: A = undefined; const y = a.bar; _ = y; } +export fn e() void { + const B = struct { + fn f() void {} + }; + const b: B = undefined; + @import("std").debug.print("{}{}", .{ b.f, b.f }); +} // error // backend=stage2 @@ -18,4 +25,5 @@ export fn g() void { // :4:7: error: no field named 'foo' in struct 'tmp.A' // :1:11: note: struct declared here // :10:17: error: no field named 'bar' in struct 'tmp.A' - +// :18:45: error: no field named 'f' in struct 'tmp.e.B' +// :14:15: note: struct declared here