diff --git a/test/compile_errors.zig b/test/compile_errors.zig index e0d90e3ee22dfeec0274f527ae01a500ed827cf7..14f32c150e84aaa3b291bdbd504dfe3ca55b96a3 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -39,180 +39,6 @@ pub fn addCases(ctx: *TestContext) !void { try ctx.addErrorCasesFromDir("stage1", test_dir, .stage1, .Exe, true, one_test_case_per_file); } } - { - var case = ctx.obj("stage2 compile errors", .{}); - - case.addError( - \\export fn a() usize { - \\ return @embedFile("/root/foo").len; - \\} - , &[_][]const u8{ - ":2:23: error: embed of file outside package path: '/root/foo'", - }); - - case.addError( - \\export fn a() usize { - \\ return @import("../../above.zig").len; - \\} - , &[_][]const u8{ - ":2:20: error: import of file outside package path: '../../above.zig'", - }); - - case.addError( - \\comptime { - \\ var array = [_:0]u8{ 1, 2, 3, 4 }; - \\ var src_slice: [:0]u8 = &array; - \\ var slice = src_slice[2..6]; - \\ _ = slice; - \\} - \\comptime { - \\ var array = [_:0]u8{ 1, 2, 3, 4 }; - \\ var slice = array[2..6]; - \\ _ = slice; - \\} - \\comptime { - \\ var array = [_]u8{ 1, 2, 3, 4 }; - \\ var slice = array[2..5]; - \\ _ = slice; - \\} - \\comptime { - \\ var array = [_:0]u8{ 1, 2, 3, 4 }; - \\ var slice = array[3..2]; - \\ _ = slice; - \\} - , &[_][]const u8{ - ":4:26: error: end index 6 out of bounds for slice of length 4 +1 (sentinel)", - ":9:22: error: end index 6 out of bounds for array of length 4 +1 (sentinel)", - ":14:22: error: end index 5 out of bounds for array of length 4", - ":19:22: error: start index 3 is larger than end index 2", - }); - } - - ctx.objErrStage1("exported enum without explicit integer tag type", - \\const E = enum { one, two }; - \\comptime { - \\ @export(E, .{ .name = "E" }); - \\} - \\const e: E = .two; - \\comptime { - \\ @export(e, .{ .name = "e" }); - \\} - , &.{ - "tmp.zig:3:13: error: exported enum without explicit integer tag type", - "tmp.zig:7:13: error: exported enum value without explicit integer tag type", - }); - - ctx.objErrStage1("issue #9346: return outside of function scope", - \\pub const empty = return 1; - , &.{"tmp.zig:1:19: error: 'return' outside function scope"}); - - ctx.exeErrStage1("std.fmt error for unused arguments", - \\pub fn main() !void { - \\ @import("std").debug.print("{d} {d} {d} {d} {d}", .{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}); - \\} - , &.{ - "?:?:?: error: 10 unused arguments in '{d} {d} {d} {d} {d}'", - }); - - ctx.objErrStage1("lazy pointer with undefined element type", - \\export fn foo() void { - \\ comptime var T: type = undefined; - \\ const S = struct { x: *T }; - \\ const I = @typeInfo(S); - \\ _ = I; - \\} - , &[_][]const u8{ - ":3:28: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("pointer arithmetic on pointer-to-array", - \\export fn foo() void { - \\ var x: [10]u8 = undefined; - \\ var y = &x; - \\ var z = y + 1; - \\ _ = z; - \\} - , &[_][]const u8{ - "tmp.zig:4:17: error: integer value 1 cannot be coerced to type '*[10]u8'", - }); - - ctx.objErrStage1("pointer attributes checked when coercing pointer to anon literal", - \\comptime { - \\ const c: [][]const u8 = &.{"hello", "world" }; - \\ _ = c; - \\} - \\comptime { - \\ const c: *[2][]const u8 = &.{"hello", "world" }; - \\ _ = c; - \\} - \\const S = struct {a: u8 = 1, b: u32 = 2}; - \\comptime { - \\ const c: *S = &.{}; - \\ _ = c; - \\} - , &[_][]const u8{ - "tmp.zig:2:31: error: cannot cast pointer to array literal to slice type '[][]const u8'", - "tmp.zig:2:31: note: cast discards const qualifier", - "tmp.zig:6:33: error: cannot cast pointer to array literal to '*[2][]const u8'", - "tmp.zig:6:33: note: cast discards const qualifier", - "tmp.zig:11:21: error: expected type '*S', found '*const struct:11:21'", - "tmp.zig:11:21: note: cast discards const qualifier", - }); - - ctx.objErrStage1("@Type() union payload is undefined", - \\const Foo = @Type(.{ - \\ .Struct = undefined, - \\}); - \\comptime { _ = Foo; } - , &[_][]const u8{ - "tmp.zig:1:20: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("wrong initializer for union payload of type 'type'", - \\const U = union(enum) { - \\ A: type, - \\}; - \\const S = struct { - \\ u: U, - \\}; - \\export fn entry() void { - \\ comptime var v: S = undefined; - \\ v.u.A = U{ .A = i32 }; - \\} - , &[_][]const u8{ - "tmp.zig:9:8: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("union with too small explicit signed tag type", - \\const U = union(enum(i2)) { - \\ A: u8, - \\ B: u8, - \\ C: u8, - \\ D: u8, - \\}; - \\export fn entry() void { - \\ _ = U{ .D = 1 }; - \\} - , &[_][]const u8{ - "tmp.zig:1:22: error: specified integer tag type cannot represent every field", - "tmp.zig:1:22: note: type i2 cannot fit values in range 0...3", - }); - - ctx.objErrStage1("union with too small explicit unsigned tag type", - \\const U = union(enum(u2)) { - \\ A: u8, - \\ B: u8, - \\ C: u8, - \\ D: u8, - \\ E: u8, - \\}; - \\export fn entry() void { - \\ _ = U{ .E = 1 }; - \\} - , &[_][]const u8{ - "tmp.zig:1:22: error: specified integer tag type cannot represent every field", - "tmp.zig:1:22: note: type u2 cannot fit values in range 0...4", - }); { const case = ctx.obj("callconv(.Interrupt) on unsupported platform", .{ @@ -308,1550 +134,6 @@ pub fn addCases(ctx: *TestContext) !void { }); } - ctx.objErrStage1("unreachable executed at comptime", - \\fn foo(comptime x: i32) i32 { - \\ comptime { - \\ if (x >= 0) return -x; - \\ unreachable; - \\ } - \\} - \\export fn entry() void { - \\ _ = foo(-42); - \\} - , &[_][]const u8{ - "tmp.zig:4:9: error: reached unreachable code", - "tmp.zig:8:12: note: called from here", - }); - - ctx.objErrStage1("@Type with Type.Int", - \\const builtin = @import("std").builtin; - \\export fn entry() void { - \\ _ = @Type(builtin.Type.Int{ - \\ .signedness = .signed, - \\ .bits = 8, - \\ }); - \\} - , &[_][]const u8{ - "tmp.zig:3:31: error: expected type 'std.builtin.Type', found 'std.builtin.Type.Int'", - }); - - ctx.objErrStage1("indexing a undefined slice at comptime", - \\comptime { - \\ var slice: []u8 = undefined; - \\ slice[0] = 2; - \\} - , &[_][]const u8{ - "tmp.zig:3:10: error: index 0 outside slice of size 0", - }); - - ctx.objErrStage1("array in c exported function", - \\export fn zig_array(x: [10]u8) void { - \\ try std.testing.expect(std.mem.eql(u8, &x, "1234567890")); - \\} - \\const std = @import("std"); - \\export fn zig_return_array() [10]u8 { - \\ return "1234567890".*; - \\} - , &[_][]const u8{ - "tmp.zig:1:24: error: parameter of type '[10]u8' not allowed in function with calling convention 'C'", - "tmp.zig:5:30: error: return type '[10]u8' not allowed in function with calling convention 'C'", - }); - - ctx.objErrStage1("@Type for exhaustive enum with undefined tag type", - \\const Tag = @Type(.{ - \\ .Enum = .{ - \\ .layout = .Auto, - \\ .tag_type = undefined, - \\ .fields = &.{}, - \\ .decls = &.{}, - \\ .is_exhaustive = false, - \\ }, - \\}); - \\export fn entry() void { - \\ _ = @intToEnum(Tag, 0); - \\} - , &[_][]const u8{ - "tmp.zig:1:20: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("extern struct with non-extern-compatible integer tag type", - \\pub const E = enum(u31) { A, B, C }; - \\pub const S = extern struct { - \\ e: E, - \\}; - \\export fn entry() void { - \\ const s: S = undefined; - \\ _ = s; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: extern structs cannot contain fields of type 'E'", - }); - - ctx.objErrStage1("@Type for exhaustive enum with non-integer tag type", - \\const Tag = @Type(.{ - \\ .Enum = .{ - \\ .layout = .Auto, - \\ .tag_type = bool, - \\ .fields = &.{}, - \\ .decls = &.{}, - \\ .is_exhaustive = false, - \\ }, - \\}); - \\export fn entry() void { - \\ _ = @intToEnum(Tag, 0); - \\} - , &[_][]const u8{ - "tmp.zig:1:20: error: Type.Enum.tag_type must be an integer type, not 'bool'", - }); - - ctx.objErrStage1("extern struct with extern-compatible but inferred integer tag type", - \\pub const E = enum { - \\@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",@"11",@"12", - \\@"13",@"14",@"15",@"16",@"17",@"18",@"19",@"20",@"21",@"22",@"23", - \\@"24",@"25",@"26",@"27",@"28",@"29",@"30",@"31",@"32",@"33",@"34", - \\@"35",@"36",@"37",@"38",@"39",@"40",@"41",@"42",@"43",@"44",@"45", - \\@"46",@"47",@"48",@"49",@"50",@"51",@"52",@"53",@"54",@"55",@"56", - \\@"57",@"58",@"59",@"60",@"61",@"62",@"63",@"64",@"65",@"66",@"67", - \\@"68",@"69",@"70",@"71",@"72",@"73",@"74",@"75",@"76",@"77",@"78", - \\@"79",@"80",@"81",@"82",@"83",@"84",@"85",@"86",@"87",@"88",@"89", - \\@"90",@"91",@"92",@"93",@"94",@"95",@"96",@"97",@"98",@"99",@"100", - \\@"101",@"102",@"103",@"104",@"105",@"106",@"107",@"108",@"109", - \\@"110",@"111",@"112",@"113",@"114",@"115",@"116",@"117",@"118", - \\@"119",@"120",@"121",@"122",@"123",@"124",@"125",@"126",@"127", - \\@"128",@"129",@"130",@"131",@"132",@"133",@"134",@"135",@"136", - \\@"137",@"138",@"139",@"140",@"141",@"142",@"143",@"144",@"145", - \\@"146",@"147",@"148",@"149",@"150",@"151",@"152",@"153",@"154", - \\@"155",@"156",@"157",@"158",@"159",@"160",@"161",@"162",@"163", - \\@"164",@"165",@"166",@"167",@"168",@"169",@"170",@"171",@"172", - \\@"173",@"174",@"175",@"176",@"177",@"178",@"179",@"180",@"181", - \\@"182",@"183",@"184",@"185",@"186",@"187",@"188",@"189",@"190", - \\@"191",@"192",@"193",@"194",@"195",@"196",@"197",@"198",@"199", - \\@"200",@"201",@"202",@"203",@"204",@"205",@"206",@"207",@"208", - \\@"209",@"210",@"211",@"212",@"213",@"214",@"215",@"216",@"217", - \\@"218",@"219",@"220",@"221",@"222",@"223",@"224",@"225",@"226", - \\@"227",@"228",@"229",@"230",@"231",@"232",@"233",@"234",@"235", - \\@"236",@"237",@"238",@"239",@"240",@"241",@"242",@"243",@"244", - \\@"245",@"246",@"247",@"248",@"249",@"250",@"251",@"252",@"253", - \\@"254",@"255" - \\}; - \\pub const S = extern struct { - \\ e: E, - \\}; - \\export fn entry() void { - \\ if (@typeInfo(E).Enum.tag_type != u8) @compileError("did not infer u8 tag type"); - \\ const s: S = undefined; - \\ _ = s; - \\} - , &[_][]const u8{ - "tmp.zig:31:5: error: extern structs cannot contain fields of type 'E'", - }); - - ctx.objErrStage1("@Type for tagged union with extra enum field", - \\const Tag = @Type(.{ - \\ .Enum = .{ - \\ .layout = .Auto, - \\ .tag_type = u2, - \\ .fields = &.{ - \\ .{ .name = "signed", .value = 0 }, - \\ .{ .name = "unsigned", .value = 1 }, - \\ .{ .name = "arst", .value = 2 }, - \\ }, - \\ .decls = &.{}, - \\ .is_exhaustive = true, - \\ }, - \\}); - \\const Tagged = @Type(.{ - \\ .Union = .{ - \\ .layout = .Auto, - \\ .tag_type = Tag, - \\ .fields = &.{ - \\ .{ .name = "signed", .field_type = i32, .alignment = @alignOf(i32) }, - \\ .{ .name = "unsigned", .field_type = u32, .alignment = @alignOf(u32) }, - \\ }, - \\ .decls = &.{}, - \\ }, - \\}); - \\export fn entry() void { - \\ var tagged = Tagged{ .signed = -1 }; - \\ tagged = .{ .unsigned = 1 }; - \\} - , &[_][]const u8{ - "tmp.zig:14:23: error: enum field missing: 'arst'", - }); - - ctx.objErrStage1("field access of opaque type", - \\const MyType = opaque {}; - \\ - \\export fn entry() bool { - \\ var x: i32 = 1; - \\ return bar(@ptrCast(*MyType, &x)); - \\} - \\ - \\fn bar(x: *MyType) bool { - \\ return x.blah; - \\} - , &[_][]const u8{ - "tmp.zig:9:13: error: no member named 'blah' in opaque type 'MyType'", - }); - - ctx.objErrStage1("opaque type with field", - \\const Opaque = opaque { foo: i32 }; - \\export fn entry() void { - \\ const foo: ?*Opaque = null; - \\ _ = foo; - \\} - , &[_][]const u8{ - "tmp.zig:1:25: error: opaque types cannot have fields", - }); - - ctx.objErrStage1("@Type(.Fn) with is_generic = true", - \\const Foo = @Type(.{ - \\ .Fn = .{ - \\ .calling_convention = .Unspecified, - \\ .alignment = 0, - \\ .is_generic = true, - \\ .is_var_args = false, - \\ .return_type = u0, - \\ .args = &.{}, - \\ }, - \\}); - \\comptime { _ = Foo; } - , &[_][]const u8{ - "tmp.zig:1:20: error: Type.Fn.is_generic must be false for @Type", - }); - - ctx.objErrStage1("@Type(.Fn) with is_var_args = true and non-C callconv", - \\const Foo = @Type(.{ - \\ .Fn = .{ - \\ .calling_convention = .Unspecified, - \\ .alignment = 0, - \\ .is_generic = false, - \\ .is_var_args = true, - \\ .return_type = u0, - \\ .args = &.{}, - \\ }, - \\}); - \\comptime { _ = Foo; } - , &[_][]const u8{ - "tmp.zig:1:20: error: varargs functions must have C calling convention", - }); - - ctx.objErrStage1("@Type(.Fn) with return_type = null", - \\const Foo = @Type(.{ - \\ .Fn = .{ - \\ .calling_convention = .Unspecified, - \\ .alignment = 0, - \\ .is_generic = false, - \\ .is_var_args = false, - \\ .return_type = null, - \\ .args = &.{}, - \\ }, - \\}); - \\comptime { _ = Foo; } - , &[_][]const u8{ - "tmp.zig:1:20: error: Type.Fn.return_type must be non-null for @Type", - }); - - ctx.objErrStage1("@Type for union with opaque field", - \\const Untagged = @Type(.{ - \\ .Union = .{ - \\ .layout = .Auto, - \\ .tag_type = null, - \\ .fields = &.{ - \\ .{ .name = "foo", .field_type = opaque {}, .alignment = 1 }, - \\ }, - \\ .decls = &.{}, - \\ }, - \\}); - \\export fn entry() void { - \\ _ = Untagged{}; - \\} - , &[_][]const u8{ - "tmp.zig:1:25: error: opaque types have unknown size and therefore cannot be directly embedded in unions", - }); - - ctx.objErrStage1("slice sentinel mismatch", - \\export fn entry() void { - \\ const x = @import("std").meta.Vector(3, f32){ 25, 75, 5, 0 }; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:62: error: index 3 outside vector of size 3", - }); - - ctx.objErrStage1("slice sentinel mismatch", - \\export fn entry() void { - \\ const y: [:1]const u8 = &[_:2]u8{ 1, 2 }; - \\ _ = y; - \\} - , &[_][]const u8{ - "tmp.zig:2:37: error: expected type '[:1]const u8', found '*const [2:2]u8'", - }); - - ctx.objErrStage1("@Type for union with zero fields", - \\const Untagged = @Type(.{ - \\ .Union = .{ - \\ .layout = .Auto, - \\ .tag_type = null, - \\ .fields = &.{}, - \\ .decls = &.{}, - \\ }, - \\}); - \\export fn entry() void { - \\ _ = Untagged{}; - \\} - , &[_][]const u8{ - "tmp.zig:1:25: error: unions must have 1 or more fields", - }); - - ctx.objErrStage1("@Type for exhaustive enum with zero fields", - \\const Tag = @Type(.{ - \\ .Enum = .{ - \\ .layout = .Auto, - \\ .tag_type = u1, - \\ .fields = &.{}, - \\ .decls = &.{}, - \\ .is_exhaustive = true, - \\ }, - \\}); - \\export fn entry() void { - \\ _ = @intToEnum(Tag, 0); - \\} - , &[_][]const u8{ - "tmp.zig:1:20: error: enums must have 1 or more fields", - }); - - ctx.objErrStage1("@Type for tagged union with extra union field", - \\const Tag = @Type(.{ - \\ .Enum = .{ - \\ .layout = .Auto, - \\ .tag_type = u1, - \\ .fields = &.{ - \\ .{ .name = "signed", .value = 0 }, - \\ .{ .name = "unsigned", .value = 1 }, - \\ }, - \\ .decls = &.{}, - \\ .is_exhaustive = true, - \\ }, - \\}); - \\const Tagged = @Type(.{ - \\ .Union = .{ - \\ .layout = .Auto, - \\ .tag_type = Tag, - \\ .fields = &.{ - \\ .{ .name = "signed", .field_type = i32, .alignment = @alignOf(i32) }, - \\ .{ .name = "unsigned", .field_type = u32, .alignment = @alignOf(u32) }, - \\ .{ .name = "arst", .field_type = f32, .alignment = @alignOf(f32) }, - \\ }, - \\ .decls = &.{}, - \\ }, - \\}); - \\export fn entry() void { - \\ var tagged = Tagged{ .signed = -1 }; - \\ tagged = .{ .unsigned = 1 }; - \\} - , &[_][]const u8{ - "tmp.zig:13:23: error: enum field not found: 'arst'", - "tmp.zig:1:20: note: enum declared here", - }); - - ctx.objErrStage1("@Type with undefined", - \\comptime { - \\ _ = @Type(.{ .Array = .{ .len = 0, .child = u8, .sentinel = undefined } }); - \\} - \\comptime { - \\ _ = @Type(.{ - \\ .Struct = .{ - \\ .fields = undefined, - \\ .decls = undefined, - \\ .is_tuple = false, - \\ .layout = .Auto, - \\ }, - \\ }); - \\} - , &[_][]const u8{ - "tmp.zig:2:16: error: use of undefined value here causes undefined behavior", - "tmp.zig:5:16: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("struct with declarations unavailable for @Type", - \\export fn entry() void { - \\ _ = @Type(@typeInfo(struct { const foo = 1; })); - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: Type.Struct.decls must be empty for @Type", - }); - - ctx.objErrStage1("enum with declarations unavailable for @Type", - \\export fn entry() void { - \\ _ = @Type(@typeInfo(enum { foo, const bar = 1; })); - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: Type.Enum.decls must be empty for @Type", - }); - - ctx.testErrStage1("reject extern variables with initializers", - \\extern var foo: int = 2; - , &[_][]const u8{ - "tmp.zig:1:23: error: extern variables have no initializers", - }); - - ctx.testErrStage1("duplicate/unused labels", - \\comptime { - \\ blk: { blk: while (false) {} } - \\} - \\comptime { - \\ blk: while (false) { blk: for (@as([0]void, undefined)) |_| {} } - \\} - \\comptime { - \\ blk: for (@as([0]void, undefined)) |_| { blk: {} } - \\} - \\comptime { - \\ blk: {} - \\} - \\comptime { - \\ blk: while(false) {} - \\} - \\comptime { - \\ blk: for(@as([0]void, undefined)) |_| {} - \\} - , &[_][]const u8{ - "tmp.zig:2:12: error: redefinition of label 'blk'", - "tmp.zig:2:5: note: previous definition here", - "tmp.zig:5:26: error: redefinition of label 'blk'", - "tmp.zig:5:5: note: previous definition here", - "tmp.zig:8:46: error: redefinition of label 'blk'", - "tmp.zig:8:5: note: previous definition here", - "tmp.zig:11:5: error: unused block label", - "tmp.zig:14:5: error: unused while loop label", - "tmp.zig:17:5: error: unused for loop label", - }); - - ctx.testErrStage1("@alignCast of zero sized types", - \\export fn foo() void { - \\ const a: *void = undefined; - \\ _ = @alignCast(2, a); - \\} - \\export fn bar() void { - \\ const a: ?*void = undefined; - \\ _ = @alignCast(2, a); - \\} - \\export fn baz() void { - \\ const a: []void = undefined; - \\ _ = @alignCast(2, a); - \\} - \\export fn qux() void { - \\ const a = struct { - \\ fn a(comptime b: u32) void { _ = b; } - \\ }.a; - \\ _ = @alignCast(2, a); - \\} - , &[_][]const u8{ - "tmp.zig:3:23: error: cannot adjust alignment of zero sized type '*void'", - "tmp.zig:7:23: error: cannot adjust alignment of zero sized type '?*void'", - "tmp.zig:11:23: error: cannot adjust alignment of zero sized type '[]void'", - "tmp.zig:17:23: error: cannot adjust alignment of zero sized type 'fn(u32) anytype'", - }); - - ctx.testErrStage1("invalid non-exhaustive enum to union", - \\const E = enum(u8) { - \\ a, - \\ b, - \\ _, - \\}; - \\const U = union(E) { - \\ a, - \\ b, - \\}; - \\export fn foo() void { - \\ var e = @intToEnum(E, 15); - \\ var u: U = e; - \\ _ = u; - \\} - \\export fn bar() void { - \\ const e = @intToEnum(E, 15); - \\ var u: U = e; - \\ _ = u; - \\} - , &[_][]const u8{ - "tmp.zig:12:16: error: runtime cast to union 'U' from non-exhaustive enum", - "tmp.zig:17:16: error: no tag by value 15", - }); - - ctx.testErrStage1("switching with exhaustive enum has '_' prong ", - \\const E = enum{ - \\ a, - \\ b, - \\}; - \\pub export fn entry() void { - \\ var e: E = .b; - \\ switch (e) { - \\ .a => {}, - \\ .b => {}, - \\ _ => {}, - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:7:5: error: switch on exhaustive enum has `_` prong", - }); - - ctx.testErrStage1("invalid pointer with @Type", - \\export fn entry() void { - \\ _ = @Type(.{ .Pointer = .{ - \\ .size = .One, - \\ .is_const = false, - \\ .is_volatile = false, - \\ .alignment = 1, - \\ .address_space = .generic, - \\ .child = u8, - \\ .is_allowzero = false, - \\ .sentinel = &@as(u8, 0), - \\ }}); - \\} - , &[_][]const u8{ - "tmp.zig:2:16: error: sentinels are only allowed on slices and unknown-length pointers", - }); - - ctx.objErrStage1("@Type(.Pointer) with invalid address space ", - \\export fn entry() void { - \\ _ = @Type(.{ .Pointer = .{ - \\ .size = .One, - \\ .is_const = false, - \\ .is_volatile = false, - \\ .alignment = 1, - \\ .address_space = .gs, - \\ .child = u8, - \\ .is_allowzero = false, - \\ .sentinel = null, - \\ }}); - \\} - , &[_][]const u8{ - "tmp.zig:2:16: error: address space 'gs' not available in stage 1 compiler, must be .generic", - }); - - ctx.testErrStage1("helpful return type error message", - \\export fn foo() u32 { - \\ return error.Ohno; - \\} - \\fn bar() !u32 { - \\ return error.Ohno; - \\} - \\export fn baz() void { - \\ try bar(); - \\} - \\export fn qux() u32 { - \\ return bar(); - \\} - \\export fn quux() u32 { - \\ var buf: u32 = 0; - \\ buf = bar(); - \\} - , &[_][]const u8{ - "tmp.zig:2:17: error: expected type 'u32', found 'error{Ohno}'", - "tmp.zig:1:17: note: function cannot return an error", - "tmp.zig:8:5: error: expected type 'void', found '@typeInfo(@typeInfo(@TypeOf(bar)).Fn.return_type.?).ErrorUnion.error_set'", - "tmp.zig:7:17: note: function cannot return an error", - "tmp.zig:11:15: error: cannot convert error union to payload type. consider using `try`, `catch`, or `if`. expected type 'u32', found '@typeInfo(@typeInfo(@TypeOf(bar)).Fn.return_type.?).ErrorUnion.error_set!u32'", - "tmp.zig:10:17: note: function cannot return an error", - "tmp.zig:15:14: error: cannot convert error union to payload type. consider using `try`, `catch`, or `if`. expected type 'u32', found '@typeInfo(@typeInfo(@TypeOf(bar)).Fn.return_type.?).ErrorUnion.error_set!u32'", - "tmp.zig:14:5: note: cannot store an error in type 'u32'", - }); - - ctx.testErrStage1("int/float conversion to comptime_int/float", - \\export fn foo() void { - \\ var a: f32 = 2; - \\ _ = @floatToInt(comptime_int, a); - \\} - \\export fn bar() void { - \\ var a: u32 = 2; - \\ _ = @intToFloat(comptime_float, a); - \\} - , &[_][]const u8{ - "tmp.zig:3:35: error: unable to evaluate constant expression", - "tmp.zig:7:37: error: unable to evaluate constant expression", - }); - - ctx.objErrStage1("extern variable has no type", - \\extern var foo; - \\pub export fn entry() void { - \\ foo; - \\} - , &[_][]const u8{ - "tmp.zig:1:8: error: unable to infer variable type", - }); - - ctx.objErrStage1("@src outside function", - \\comptime { - \\ @src(); - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: @src outside function", - }); - - ctx.objErrStage1("call assigned to constant", - \\const Foo = struct { - \\ x: i32, - \\}; - \\fn foo() Foo { - \\ return .{ .x = 42 }; - \\} - \\fn bar(val: anytype) Foo { - \\ return .{ .x = val }; - \\} - \\export fn entry() void { - \\ const baz: Foo = undefined; - \\ baz = foo(); - \\} - \\export fn entry1() void { - \\ const baz: Foo = undefined; - \\ baz = bar(42); - \\} - , &[_][]const u8{ - "tmp.zig:12:14: error: cannot assign to constant", - "tmp.zig:16:14: error: cannot assign to constant", - }); - - ctx.objErrStage1("invalid pointer syntax", - \\export fn foo() void { - \\ var guid: *:0 const u8 = undefined; - \\} - , &[_][]const u8{ - "tmp.zig:2:16: error: expected type expression, found ':'", - }); - - ctx.objErrStage1("declaration between fields", - \\const S = struct { - \\ const foo = 2; - \\ const bar = 2; - \\ const baz = 2; - \\ a: struct { - \\ a: u32, - \\ b: u32, - \\ }, - \\ const foo1 = 2; - \\ const bar1 = 2; - \\ const baz1 = 2; - \\ b: usize, - \\}; - \\comptime { - \\ _ = S; - \\} - , &[_][]const u8{ - "tmp.zig:9:5: error: declarations are not allowed between container fields", - "tmp.zig:5:5: note: field before declarations here", - "tmp.zig:12:5: note: field after declarations here", - }); - - ctx.objErrStage1("non-extern function with var args", - \\fn foo(args: ...) void {} - \\export fn entry() void { - \\ foo(); - \\} - , &[_][]const u8{ - "tmp.zig:1:14: error: expected type expression, found '...'", - }); - - ctx.testErrStage1("invalid int casts", - \\export fn foo() void { - \\ var a: u32 = 2; - \\ _ = @intCast(comptime_int, a); - \\} - \\export fn bar() void { - \\ var a: u32 = 2; - \\ _ = @intToFloat(u32, a); - \\} - \\export fn baz() void { - \\ var a: u32 = 2; - \\ _ = @floatToInt(u32, a); - \\} - \\export fn qux() void { - \\ var a: f32 = 2; - \\ _ = @intCast(u32, a); - \\} - , &[_][]const u8{ - "tmp.zig:3:32: error: unable to evaluate constant expression", - "tmp.zig:7:21: error: expected float type, found 'u32'", - "tmp.zig:11:26: error: expected float type, found 'u32'", - "tmp.zig:15:23: error: expected integer type, found 'f32'", - }); - - ctx.testErrStage1("invalid float casts", - \\export fn foo() void { - \\ var a: f32 = 2; - \\ _ = @floatCast(comptime_float, a); - \\} - \\export fn bar() void { - \\ var a: f32 = 2; - \\ _ = @floatToInt(f32, a); - \\} - \\export fn baz() void { - \\ var a: f32 = 2; - \\ _ = @intToFloat(f32, a); - \\} - \\export fn qux() void { - \\ var a: u32 = 2; - \\ _ = @floatCast(f32, a); - \\} - , &[_][]const u8{ - "tmp.zig:3:36: error: unable to evaluate constant expression", - "tmp.zig:7:21: error: expected integer type, found 'f32'", - "tmp.zig:11:26: error: expected int type, found 'f32'", - "tmp.zig:15:25: error: expected float type, found 'u32'", - }); - - ctx.testErrStage1("invalid assignments", - \\export fn entry1() void { - \\ var a: []const u8 = "foo"; - \\ a[0..2] = "bar"; - \\} - \\export fn entry2() void { - \\ var a: u8 = 2; - \\ a + 2 = 3; - \\} - \\export fn entry4() void { - \\ 2 + 2 = 3; - \\} - , &[_][]const u8{ - "tmp.zig:3:6: error: invalid left-hand side to assignment", - "tmp.zig:7:7: error: invalid left-hand side to assignment", - "tmp.zig:10:7: error: invalid left-hand side to assignment", - }); - - ctx.testErrStage1("reassign to array parameter", - \\fn reassign(a: [3]f32) void { - \\ a = [3]f32{4, 5, 6}; - \\} - \\export fn entry() void { - \\ reassign(.{1, 2, 3}); - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: cannot assign to constant", - }); - - ctx.testErrStage1("reassign to slice parameter", - \\pub fn reassign(s: []const u8) void { - \\ s = s[0..]; - \\} - \\export fn entry() void { - \\ reassign("foo"); - \\} - , &[_][]const u8{ - "tmp.zig:2:10: error: cannot assign to constant", - }); - - ctx.testErrStage1("reassign to struct parameter", - \\const S = struct { - \\ x: u32, - \\}; - \\fn reassign(s: S) void { - \\ s = S{.x = 2}; - \\} - \\export fn entry() void { - \\ reassign(S{.x = 3}); - \\} - , &[_][]const u8{ - "tmp.zig:5:10: error: cannot assign to constant", - }); - - ctx.testErrStage1("reference to const data", - \\export fn foo() void { - \\ var ptr = &[_]u8{0,0,0,0}; - \\ ptr[1] = 2; - \\} - \\export fn bar() void { - \\ var ptr = &@as(u32, 2); - \\ ptr.* = 2; - \\} - \\export fn baz() void { - \\ var ptr = &true; - \\ ptr.* = false; - \\} - \\export fn qux() void { - \\ const S = struct{ - \\ x: usize, - \\ y: usize, - \\ }; - \\ var ptr = &S{.x=1,.y=2}; - \\ ptr.x = 2; - \\} - , &[_][]const u8{ - "tmp.zig:3:14: error: cannot assign to constant", - "tmp.zig:7:13: error: cannot assign to constant", - "tmp.zig:11:13: error: cannot assign to constant", - "tmp.zig:19:13: error: cannot assign to constant", - }); - - ctx.testErrStage1("cast between ?T where T is not a pointer", - \\pub const fnty1 = ?fn (i8) void; - \\pub const fnty2 = ?fn (u64) void; - \\export fn entry() void { - \\ var a: fnty1 = undefined; - \\ var b: fnty2 = undefined; - \\ a = b; - \\} - , &[_][]const u8{ - "tmp.zig:6:9: error: expected type '?fn(i8) void', found '?fn(u64) void'", - "tmp.zig:6:9: note: optional type child 'fn(u64) void' cannot cast into optional type child 'fn(i8) void'", - }); - - ctx.testErrStage1("unused variable error on errdefer", - \\fn foo() !void { - \\ errdefer |a| unreachable; - \\ return error.A; - \\} - \\export fn entry() void { - \\ foo() catch unreachable; - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: unused variable: 'a'", - }); - - ctx.testErrStage1("comparison of non-tagged union and enum literal", - \\export fn entry() void { - \\ const U = union { A: u32, B: u64 }; - \\ var u = U{ .A = 42 }; - \\ var ok = u == .A; - \\ _ = ok; - \\} - , &[_][]const u8{ - "tmp.zig:4:16: error: comparison of union and enum literal is only valid for tagged union types", - "tmp.zig:2:15: note: type U is not a tagged union", - }); - - ctx.testErrStage1("shift on type with non-power-of-two size", - \\export fn entry() void { - \\ const S = struct { - \\ fn a() void { - \\ var x: u24 = 42; - \\ _ = x >> 24; - \\ } - \\ fn b() void { - \\ var x: u24 = 42; - \\ _ = x << 24; - \\ } - \\ fn c() void { - \\ var x: u24 = 42; - \\ _ = @shlExact(x, 24); - \\ } - \\ fn d() void { - \\ var x: u24 = 42; - \\ _ = @shrExact(x, 24); - \\ } - \\ }; - \\ S.a(); - \\ S.b(); - \\ S.c(); - \\ S.d(); - \\} - , &[_][]const u8{ - "tmp.zig:5:19: error: RHS of shift is too large for LHS type", - "tmp.zig:9:19: error: RHS of shift is too large for LHS type", - "tmp.zig:13:17: error: RHS of shift is too large for LHS type", - "tmp.zig:17:17: error: RHS of shift is too large for LHS type", - }); - - ctx.testErrStage1("combination of nosuspend and async", - \\export fn entry() void { - \\ nosuspend { - \\ const bar = async foo(); - \\ suspend {} - \\ resume bar; - \\ } - \\} - \\fn foo() void {} - , &[_][]const u8{ - "tmp.zig:4:9: error: suspend inside nosuspend block", - "tmp.zig:2:5: note: nosuspend block here", - }); - - ctx.objErrStage1("atomicrmw with bool op not .Xchg", - \\export fn entry() void { - \\ var x = false; - \\ _ = @atomicRmw(bool, &x, .Add, true, .SeqCst); - \\} - , &[_][]const u8{ - "tmp.zig:3:30: error: @atomicRmw with bool only allowed with .Xchg", - }); - - ctx.testErrStage1("@TypeOf with no arguments", - \\export fn entry() void { - \\ _ = @TypeOf(); - \\} - , &[_][]const u8{ - "tmp.zig:2:9: error: expected at least 1 argument, found 0", - }); - - ctx.testErrStage1("@TypeOf with incompatible arguments", - \\export fn entry() void { - \\ var var_1: f32 = undefined; - \\ var var_2: u32 = undefined; - \\ _ = @TypeOf(var_1, var_2); - \\} - , &[_][]const u8{ - "tmp.zig:4:9: error: incompatible types: 'f32' and 'u32'", - }); - - ctx.testErrStage1("type mismatch with tuple concatenation", - \\export fn entry() void { - \\ var x = .{}; - \\ x = x ++ .{ 1, 2, 3 }; - \\} - , &[_][]const u8{ - "tmp.zig:3:11: error: expected type 'struct:2:14', found 'struct:3:11'", - }); - - ctx.testErrStage1("@tagName on invalid value of non-exhaustive enum", - \\test "enum" { - \\ const E = enum(u8) {A, B, _}; - \\ _ = @tagName(@intToEnum(E, 5)); - \\} - , &[_][]const u8{ - "tmp.zig:3:18: error: no tag by value 5", - }); - - ctx.testErrStage1("@ptrToInt with pointer to zero-sized type", - \\export fn entry() void { - \\ var pointer: ?*u0 = null; - \\ var x = @ptrToInt(pointer); - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:3:23: error: pointer to size 0 type has no address", - }); - - ctx.testErrStage1("access invalid @typeInfo decl", - \\const A = B; - \\test "Crash" { - \\ _ = @typeInfo(@This()).Struct.decls[0]; - \\} - , &[_][]const u8{ - "tmp.zig:1:11: error: use of undeclared identifier 'B'", - }); - - ctx.testErrStage1("reject extern function definitions with body", - \\extern "c" fn definitelyNotInLibC(a: i32, b: i32) i32 { - \\ return a + b; - \\} - , &[_][]const u8{ - "tmp.zig:1:1: error: extern functions have no body", - }); - - ctx.testErrStage1("duplicate field in anonymous struct literal", - \\export fn entry() void { - \\ const anon = .{ - \\ .inner = .{ - \\ .a = .{ - \\ .something = "text", - \\ }, - \\ .a = .{}, - \\ }, - \\ }; - \\ _ = anon; - \\} - , &[_][]const u8{ - "tmp.zig:7:13: error: duplicate field", - "tmp.zig:4:13: note: other field here", - }); - - ctx.testErrStage1("type mismatch in C prototype with varargs", - \\const fn_ty = ?fn ([*c]u8, ...) callconv(.C) void; - \\extern fn fn_decl(fmt: [*:0]u8, ...) void; - \\ - \\export fn main() void { - \\ const x: fn_ty = fn_decl; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:5:22: error: expected type 'fn([*c]u8, ...) callconv(.C) void', found 'fn([*:0]u8, ...) callconv(.C) void'", - }); - - ctx.objErrStage1("function call assigned to incorrect type", - \\export fn entry() void { - \\ var arr: [4]f32 = undefined; - \\ arr = concat(); - \\} - \\fn concat() [16]f32 { - \\ return [1]f32{0}**16; - \\} - , &[_][]const u8{ - "tmp.zig:3:17: error: expected type '[4]f32', found '[16]f32'", - }); - - ctx.objErrStage1("generic function call assigned to incorrect type", - \\pub export fn entry() void { - \\ var res: []i32 = undefined; - \\ res = myAlloc(i32); - \\} - \\fn myAlloc(comptime arg: type) anyerror!arg{ - \\ unreachable; - \\} - , &[_][]const u8{ - "tmp.zig:3:18: error: expected type '[]i32', found 'anyerror!i32", - }); - - ctx.testErrStage1("non-exhaustive enum marker assigned a value", - \\const A = enum { - \\ a, - \\ b, - \\ _ = 1, - \\}; - \\const B = enum { - \\ a, - \\ b, - \\ _, - \\}; - \\comptime { _ = A; _ = B; } - , &[_][]const u8{ - "tmp.zig:4:9: error: '_' is used to mark an enum as non-exhaustive and cannot be assigned a value", - "tmp.zig:6:11: error: non-exhaustive enum missing integer tag type", - "tmp.zig:9:5: note: marked non-exhaustive here", - }); - - ctx.testErrStage1("non-exhaustive enums", - \\const B = enum(u1) { - \\ a, - \\ _, - \\ b, - \\}; - \\const C = enum(u1) { - \\ a, - \\ b, - \\ _, - \\}; - \\pub export fn entry() void { - \\ _ = B; - \\ _ = C; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: '_' field of non-exhaustive enum must be last", - "tmp.zig:6:11: error: non-exhaustive enum specifies every value", - }); - - ctx.testErrStage1("switching with non-exhaustive enums", - \\const E = enum(u8) { - \\ a, - \\ b, - \\ _, - \\}; - \\const U = union(E) { - \\ a: i32, - \\ b: u32, - \\}; - \\pub export fn entry() void { - \\ var e: E = .b; - \\ switch (e) { // error: switch not handling the tag `b` - \\ .a => {}, - \\ _ => {}, - \\ } - \\ switch (e) { // error: switch on non-exhaustive enum must include `else` or `_` prong - \\ .a => {}, - \\ .b => {}, - \\ } - \\ var u = U{.a = 2}; - \\ switch (u) { // error: `_` prong not allowed when switching on tagged union - \\ .a => {}, - \\ .b => {}, - \\ _ => {}, - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:12:5: error: enumeration value 'E.b' not handled in switch", - "tmp.zig:16:5: error: switch on non-exhaustive enum must include `else` or `_` prong", - "tmp.zig:21:5: error: `_` prong not allowed when switching on tagged union", - }); - - ctx.objErrStage1("switch expression - unreachable else prong (bool)", - \\fn foo(x: bool) void { - \\ switch (x) { - \\ true => {}, - \\ false => {}, - \\ else => {}, - \\ } - \\} - \\export fn entry() usize { return @sizeOf(@TypeOf(foo)); } - , &[_][]const u8{ - "tmp.zig:5:9: error: unreachable else prong, all cases already handled", - }); - - ctx.objErrStage1("switch expression - unreachable else prong (u1)", - \\fn foo(x: u1) void { - \\ switch (x) { - \\ 0 => {}, - \\ 1 => {}, - \\ else => {}, - \\ } - \\} - \\export fn entry() usize { return @sizeOf(@TypeOf(foo)); } - , &[_][]const u8{ - "tmp.zig:5:9: error: unreachable else prong, all cases already handled", - }); - - ctx.objErrStage1("switch expression - unreachable else prong (u2)", - \\fn foo(x: u2) void { - \\ switch (x) { - \\ 0 => {}, - \\ 1 => {}, - \\ 2 => {}, - \\ 3 => {}, - \\ else => {}, - \\ } - \\} - \\export fn entry() usize { return @sizeOf(@TypeOf(foo)); } - , &[_][]const u8{ - "tmp.zig:7:9: error: unreachable else prong, all cases already handled", - }); - - ctx.objErrStage1("switch expression - unreachable else prong (range u8)", - \\fn foo(x: u8) void { - \\ switch (x) { - \\ 0 => {}, - \\ 1 => {}, - \\ 2 => {}, - \\ 3 => {}, - \\ 4...255 => {}, - \\ else => {}, - \\ } - \\} - \\export fn entry() usize { return @sizeOf(@TypeOf(foo)); } - , &[_][]const u8{ - "tmp.zig:8:9: error: unreachable else prong, all cases already handled", - }); - - ctx.objErrStage1("switch expression - unreachable else prong (range i8)", - \\fn foo(x: i8) void { - \\ switch (x) { - \\ -128...0 => {}, - \\ 1 => {}, - \\ 2 => {}, - \\ 3 => {}, - \\ 4...127 => {}, - \\ else => {}, - \\ } - \\} - \\export fn entry() usize { return @sizeOf(@TypeOf(foo)); } - , &[_][]const u8{ - "tmp.zig:8:9: error: unreachable else prong, all cases already handled", - }); - - ctx.objErrStage1("switch expression - unreachable else prong (enum)", - \\const TestEnum = enum{ T1, T2 }; - \\ - \\fn err(x: u8) TestEnum { - \\ switch (x) { - \\ 0 => return TestEnum.T1, - \\ else => return TestEnum.T2, - \\ } - \\} - \\ - \\fn foo(x: u8) void { - \\ switch (err(x)) { - \\ TestEnum.T1 => {}, - \\ TestEnum.T2 => {}, - \\ else => {}, - \\ } - \\} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(foo)); } - , &[_][]const u8{ - "tmp.zig:14:9: error: unreachable else prong, all cases already handled", - }); - - ctx.testErrStage1("@export with empty name string", - \\pub export fn entry() void { } - \\comptime { - \\ @export(entry, .{ .name = "" }); - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: exported symbol name cannot be empty", - }); - - ctx.testErrStage1("switch ranges endpoints are validated", - \\pub export fn entry() void { - \\ var x: i32 = 0; - \\ switch (x) { - \\ 6...1 => {}, - \\ -1...-5 => {}, - \\ else => unreachable, - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:4:9: error: range start value is greater than the end value", - "tmp.zig:5:9: error: range start value is greater than the end value", - }); - - ctx.testErrStage1("errors in for loop bodies are propagated", - \\pub export fn entry() void { - \\ var arr: [100]u8 = undefined; - \\ for (arr) |bits| _ = @popCount(bits); - \\} - , &[_][]const u8{ - "tmp.zig:3:26: error: expected 2 arguments, found 1", - }); - - ctx.testErrStage1("@call rejects non comptime-known fn - always_inline", - \\pub export fn entry() void { - \\ var call_me: fn () void = undefined; - \\ @call(.{ .modifier = .always_inline }, call_me, .{}); - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: the specified modifier requires a comptime-known function", - }); - - ctx.testErrStage1("@call rejects non comptime-known fn - compile_time", - \\pub export fn entry() void { - \\ var call_me: fn () void = undefined; - \\ @call(.{ .modifier = .compile_time }, call_me, .{}); - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: the specified modifier requires a comptime-known function", - }); - - ctx.testErrStage1("error in struct initializer doesn't crash the compiler", - \\pub export fn entry() void { - \\ const bitfield = struct { - \\ e: u8, - \\ e: u8, - \\ }; - \\ var a = .{@sizeOf(bitfield)}; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:4:9: error: duplicate struct field: 'e'", - }); - - ctx.testErrStage1("repeated invalid field access to generic function returning type crashes compiler. #2655", - \\pub fn A() type { - \\ return Q; - \\} - \\test "1" { - \\ _ = A().a; - \\ _ = A().a; - \\} - , &[_][]const u8{ - "tmp.zig:2:12: error: use of undeclared identifier 'Q'", - }); - - ctx.objErrStage1("bitCast to enum type", - \\export fn entry() void { - \\ const y = @bitCast(enum(u32) { a, b }, @as(u32, 3)); - \\ _ = y; - \\} - , &[_][]const u8{ - "tmp.zig:2:24: error: cannot cast a value of type 'y'", - }); - - ctx.objErrStage1("comparing against undefined produces undefined value", - \\export fn entry() void { - \\ if (2 == undefined) {} - \\} - , &[_][]const u8{ - "tmp.zig:2:11: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("comptime ptrcast of zero-sized type", - \\fn foo() void { - \\ const node: struct {} = undefined; - \\ const vla_ptr = @ptrCast([*]const u8, &node); - \\ _ = vla_ptr; - \\} - \\comptime { foo(); } - , &[_][]const u8{ - "tmp.zig:3:21: error: '*const struct:2:17' and '[*]const u8' do not have the same in-memory representation", - }); - - ctx.objErrStage1("slice sentinel mismatch", - \\fn foo() [:0]u8 { - \\ var x: []u8 = undefined; - \\ return x; - \\} - \\comptime { _ = foo; } - , &[_][]const u8{ - "tmp.zig:3:12: error: expected type '[:0]u8', found '[]u8'", - "tmp.zig:3:12: note: destination pointer requires a terminating '0' sentinel", - }); - - ctx.objErrStage1("cmpxchg with float", - \\export fn entry() void { - \\ var x: f32 = 0; - \\ _ = @cmpxchgWeak(f32, &x, 1, 2, .SeqCst, .SeqCst); - \\} - , &[_][]const u8{ - "tmp.zig:3:22: error: expected bool, integer, enum or pointer type, found 'f32'", - }); - - ctx.objErrStage1("atomicrmw with float op not .Xchg, .Add or .Sub", - \\export fn entry() void { - \\ var x: f32 = 0; - \\ _ = @atomicRmw(f32, &x, .And, 2, .SeqCst); - \\} - , &[_][]const u8{ - "tmp.zig:3:29: error: @atomicRmw with float only allowed with .Xchg, .Add and .Sub", - }); - - ctx.objErrStage1("intToPtr with misaligned address", - \\pub fn main() void { - \\ var y = @intToPtr([*]align(4) u8, 5); - \\ _ = y; - \\} - , &[_][]const u8{ - "tmp.zig:2:13: error: pointer type '[*]align(4) u8' requires aligned address", - }); - - ctx.objErrStage1("invalid float literal", - \\const std = @import("std"); - \\ - \\pub fn main() void { - \\ var bad_float :f32 = 0.0; - \\ bad_float = bad_float + .20; - \\ std.debug.assert(bad_float < 1.0); - \\} - , &[_][]const u8{ - "tmp.zig:5:29: error: expected expression, found '.'", - }); - - ctx.objErrStage1("invalid exponent in float literal - 1", - \\fn main() void { - \\ var bad: f128 = 0x1.0p1ab1; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:28: note: invalid byte: 'a'", - }); - - ctx.objErrStage1("invalid exponent in float literal - 2", - \\fn main() void { - \\ var bad: f128 = 0x1.0p50F; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:29: note: invalid byte: 'F'", - }); - - ctx.objErrStage1("invalid underscore placement in float literal - 1", - \\fn main() void { - \\ var bad: f128 = 0._0; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:23: note: invalid byte: '_'", - }); - - ctx.objErrStage1("invalid underscore placement in float literal - 2", - \\fn main() void { - \\ var bad: f128 = 0_.0; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:23: note: invalid byte: '.'", - }); - - ctx.objErrStage1("invalid underscore placement in float literal - 3", - \\fn main() void { - \\ var bad: f128 = 0.0_; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:25: note: invalid byte: ';'", - }); - - ctx.objErrStage1("invalid underscore placement in float literal - 4", - \\fn main() void { - \\ var bad: f128 = 1.0e_1; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:25: note: invalid byte: '_'", - }); - - ctx.objErrStage1("invalid underscore placement in float literal - 5", - \\fn main() void { - \\ var bad: f128 = 1.0e+_1; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:26: note: invalid byte: '_'", - }); - - ctx.objErrStage1("invalid underscore placement in float literal - 6", - \\fn main() void { - \\ var bad: f128 = 1.0e-_1; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:26: note: invalid byte: '_'", - }); - - ctx.objErrStage1("invalid underscore placement in float literal - 7", - \\fn main() void { - \\ var bad: f128 = 1.0e-1_; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:28: note: invalid byte: ';'", - }); - - ctx.objErrStage1("invalid underscore placement in float literal - 9", - \\fn main() void { - \\ var bad: f128 = 1__0.0e-1; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:23: note: invalid byte: '_'", - }); - - ctx.objErrStage1("invalid underscore placement in float literal - 10", - \\fn main() void { - \\ var bad: f128 = 1.0__0e-1; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:25: note: invalid byte: '_'", - }); - - ctx.objErrStage1("invalid underscore placement in float literal - 11", - \\fn main() void { - \\ var bad: f128 = 1.0e-1__0; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:28: note: invalid byte: '_'", - }); - - ctx.objErrStage1("invalid underscore placement in float literal - 12", - \\fn main() void { - \\ var bad: f128 = 0_x0.0; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:23: note: invalid byte: 'x'", - }); - - ctx.objErrStage1("invalid underscore placement in float literal - 13", - \\fn main() void { - \\ var bad: f128 = 0x_0.0; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:23: note: invalid byte: '_'", - }); - - ctx.objErrStage1("invalid underscore placement in float literal - 14", - \\fn main() void { - \\ var bad: f128 = 0x0.0_p1; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:27: note: invalid byte: 'p'", - }); - - ctx.objErrStage1("invalid underscore placement in int literal - 1", - \\fn main() void { - \\ var bad: u128 = 0010_; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:26: note: invalid byte: ';'", - }); - - ctx.objErrStage1("invalid underscore placement in int literal - 2", - \\fn main() void { - \\ var bad: u128 = 0b0010_; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:28: note: invalid byte: ';'", - }); - - ctx.objErrStage1("invalid underscore placement in int literal - 3", - \\fn main() void { - \\ var bad: u128 = 0o0010_; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:28: note: invalid byte: ';'", - }); - - ctx.objErrStage1("invalid underscore placement in int literal - 4", - \\fn main() void { - \\ var bad: u128 = 0x0010_; - \\ _ = bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:28: note: invalid byte: ';'", - }); - - ctx.objErrStage1("comptime struct field, no init value", - \\const Foo = struct { - \\ comptime b: i32, - \\}; - \\export fn entry() void { - \\ var f: Foo = undefined; - \\ _ = f; - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: comptime field without default initialization value", - }); - - ctx.objErrStage1("bad usage of @call", - \\export fn entry1() void { - \\ @call(.{}, foo, {}); - \\} - \\export fn entry2() void { - \\ comptime @call(.{ .modifier = .never_inline }, foo, .{}); - \\} - \\export fn entry3() void { - \\ comptime @call(.{ .modifier = .never_tail }, foo, .{}); - \\} - \\export fn entry4() void { - \\ @call(.{ .modifier = .never_inline }, bar, .{}); - \\} - \\export fn entry5(c: bool) void { - \\ var baz = if (c) baz1 else baz2; - \\ @call(.{ .modifier = .compile_time }, baz, .{}); - \\} - \\fn foo() void {} - \\fn bar() callconv(.Inline) void {} - \\fn baz1() void {} - \\fn baz2() void {} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected tuple or struct, found 'void'", - "tmp.zig:5:14: error: unable to perform 'never_inline' call at compile-time", - "tmp.zig:8:14: error: unable to perform 'never_tail' call at compile-time", - "tmp.zig:11:5: error: no-inline call of inline function", - "tmp.zig:15:5: error: the specified modifier requires a comptime-known function", - }); - - ctx.objErrStage1("exported async function", - \\export fn foo() callconv(.Async) void {} - , &[_][]const u8{ - "tmp.zig:1:1: error: exported function cannot be async", - }); - - ctx.exeErrStage1("main missing name", - \\pub fn (main) void {} - , &[_][]const u8{ - "tmp.zig:1:5: error: missing function name", - }); - { const case = ctx.obj("call with new stack on unsupported target", .{ .cpu_arch = .wasm32, @@ -1899,361 +181,6 @@ pub fn addCases(ctx: *TestContext) !void { "tmp.zig:12:31: note: destination array requires a terminating '0' sentinel", }); - ctx.objErrStage1("empty switch on an integer", - \\export fn entry() void { - \\ var x: u32 = 0; - \\ switch(x) {} - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: switch must handle all possibilities", - }); - - ctx.objErrStage1("incorrect return type", - \\ pub export fn entry() void{ - \\ _ = foo(); - \\ } - \\ const A = struct { - \\ a: u32, - \\ }; - \\ fn foo() A { - \\ return bar(); - \\ } - \\ const B = struct { - \\ a: u32, - \\ }; - \\ fn bar() B { - \\ unreachable; - \\ } - , &[_][]const u8{ - "tmp.zig:8:16: error: expected type 'A', found 'B'", - }); - - ctx.objErrStage1("regression test #2980: base type u32 is not type checked properly when assigning a value within a struct", - \\const Foo = struct { - \\ ptr: ?*usize, - \\ uval: u32, - \\}; - \\fn get_uval(x: u32) !u32 { - \\ _ = x; - \\ return error.NotFound; - \\} - \\export fn entry() void { - \\ const afoo = Foo{ - \\ .ptr = null, - \\ .uval = get_uval(42), - \\ }; - \\ _ = afoo; - \\} - , &[_][]const u8{ - "tmp.zig:12:25: error: cannot convert error union to payload type. consider using `try`, `catch`, or `if`. expected type 'u32', found '@typeInfo(@typeInfo(@TypeOf(get_uval)).Fn.return_type.?).ErrorUnion.error_set!u32'", - }); - - ctx.objErrStage1("assigning to struct or union fields that are not optionals with a function that returns an optional", - \\fn maybe(is: bool) ?u8 { - \\ if (is) return @as(u8, 10) else return null; - \\} - \\const U = union { - \\ Ye: u8, - \\}; - \\const S = struct { - \\ num: u8, - \\}; - \\export fn entry() void { - \\ var u = U{ .Ye = maybe(false) }; - \\ var s = S{ .num = maybe(false) }; - \\ _ = u; - \\ _ = s; - \\} - , &[_][]const u8{ - "tmp.zig:11:27: error: cannot convert optional to payload type. consider using `.?`, `orelse`, or `if`. expected type 'u8', found '?u8'", - }); - - ctx.objErrStage1("missing result type for phi node", - \\fn foo() !void { - \\ return anyerror.Foo; - \\} - \\export fn entry() void { - \\ foo() catch 0; - \\} - , &[_][]const u8{ - "tmp.zig:5:17: error: integer value 0 cannot be coerced to type 'void'", - }); - - ctx.objErrStage1("atomicrmw with enum op not .Xchg", - \\export fn entry() void { - \\ const E = enum(u8) { - \\ a, - \\ b, - \\ c, - \\ d, - \\ }; - \\ var x: E = .a; - \\ _ = @atomicRmw(E, &x, .Add, .b, .SeqCst); - \\} - , &[_][]const u8{ - "tmp.zig:9:27: error: @atomicRmw with enum only allowed with .Xchg", - }); - - ctx.objErrStage1("disallow coercion from non-null-terminated pointer to null-terminated pointer", - \\extern fn puts(s: [*:0]const u8) c_int; - \\pub fn main() void { - \\ const no_zero_array = [_]u8{'h', 'e', 'l', 'l', 'o'}; - \\ const no_zero_ptr: [*]const u8 = &no_zero_array; - \\ _ = puts(no_zero_ptr); - \\} - , &[_][]const u8{ - "tmp.zig:5:14: error: expected type '[*:0]const u8', found '[*]const u8'", - }); - - ctx.objErrStage1("atomic orderings of atomicStore Acquire or AcqRel", - \\export fn entry() void { - \\ var x: u32 = 0; - \\ @atomicStore(u32, &x, 1, .Acquire); - \\} - , &[_][]const u8{ - "tmp.zig:3:30: error: @atomicStore atomic ordering must not be Acquire or AcqRel", - }); - - ctx.objErrStage1("missing const in slice with nested array type", - \\const Geo3DTex2D = struct { vertices: [][2]f32 }; - \\pub fn getGeo3DTex2D() Geo3DTex2D { - \\ return Geo3DTex2D{ - \\ .vertices = [_][2]f32{ - \\ [_]f32{ -0.5, -0.5}, - \\ }, - \\ }; - \\} - \\export fn entry() void { - \\ var geo_data = getGeo3DTex2D(); - \\ _ = geo_data; - \\} - , &[_][]const u8{ - "tmp.zig:4:30: error: array literal requires address-of operator (&) to coerce to slice type '[][2]f32'", - }); - - ctx.objErrStage1("slicing of global undefined pointer", - \\var buf: *[1]u8 = undefined; - \\export fn entry() void { - \\ _ = buf[0..1]; - \\} - , &[_][]const u8{ - "tmp.zig:3:12: error: non-zero length slice of undefined pointer", - }); - - ctx.objErrStage1("using invalid types in function call raises an error", - \\const MenuEffect = enum {}; - \\fn func(effect: MenuEffect) void { _ = effect; } - \\export fn entry() void { - \\ func(MenuEffect.ThisDoesNotExist); - \\} - , &[_][]const u8{ - "tmp.zig:1:20: error: enum declarations must have at least one tag", - }); - - ctx.objErrStage1("store vector pointer with unknown runtime index", - \\export fn entry() void { - \\ var v: @import("std").meta.Vector(4, i32) = [_]i32{ 1, 5, 3, undefined }; - \\ - \\ var i: u32 = 0; - \\ storev(&v[i], 42); - \\} - \\ - \\fn storev(ptr: anytype, val: i32) void { - \\ ptr.* = val; - \\} - , &[_][]const u8{ - "tmp.zig:9:8: error: unable to determine vector element index of type '*align(16:0:4:?) i32", - }); - - ctx.objErrStage1("load vector pointer with unknown runtime index", - \\export fn entry() void { - \\ var v: @import("std").meta.Vector(4, i32) = [_]i32{ 1, 5, 3, undefined }; - \\ - \\ var i: u32 = 0; - \\ var x = loadv(&v[i]); - \\ _ = x; - \\} - \\ - \\fn loadv(ptr: anytype) i32 { - \\ return ptr.*; - \\} - , &[_][]const u8{ - "tmp.zig:10:12: error: unable to determine vector element index of type '*align(16:0:4:?) i32", - }); - - ctx.objErrStage1("using an unknown len ptr type instead of array", - \\const resolutions = [*][*]const u8{ - \\ "[320 240 ]", - \\ null, - \\}; - \\comptime { - \\ _ = resolutions; - \\} - , &[_][]const u8{ - "tmp.zig:1:21: error: expected array type or [_], found '[*][*]const u8'", - }); - - ctx.objErrStage1("comparison with error union and error value", - \\export fn entry() void { - \\ var number_or_error: anyerror!i32 = error.SomethingAwful; - \\ _ = number_or_error == error.SomethingAwful; - \\} - , &[_][]const u8{ - "tmp.zig:3:25: error: operator not allowed for type 'anyerror!i32'", - }); - - ctx.objErrStage1("switch with overlapping case ranges", - \\export fn entry() void { - \\ var q: u8 = 0; - \\ switch (q) { - \\ 1...2 => {}, - \\ 0...255 => {}, - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:5:9: error: duplicate switch value", - }); - - ctx.objErrStage1("invalid optional type in extern struct", - \\const stroo = extern struct { - \\ moo: ?[*c]u8, - \\}; - \\export fn testf(fluff: *stroo) void { _ = fluff; } - , &[_][]const u8{ - "tmp.zig:2:5: error: extern structs cannot contain fields of type '?[*c]u8'", - }); - - ctx.objErrStage1("attempt to negate a non-integer, non-float or non-vector type", - \\fn foo() anyerror!u32 { - \\ return 1; - \\} - \\ - \\export fn entry() void { - \\ const x = -foo(); - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:6:15: error: negation of type 'anyerror!u32'", - }); - - ctx.objErrStage1("attempt to create 17 bit float type", - \\const builtin = @import("std").builtin; - \\comptime { - \\ _ = @Type(.{ .Float = .{ .bits = 17 } }); - \\} - , &[_][]const u8{ - "tmp.zig:3:16: error: 17-bit float unsupported", - }); - - ctx.objErrStage1("wrong type for @Type", - \\export fn entry() void { - \\ _ = @Type(0); - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: expected type 'std.builtin.Type', found 'comptime_int'", - }); - - ctx.objErrStage1("@Type with non-constant expression", - \\const builtin = @import("std").builtin; - \\var globalTypeInfo : builtin.Type = undefined; - \\export fn entry() void { - \\ _ = @Type(globalTypeInfo); - \\} - , &[_][]const u8{ - "tmp.zig:4:15: error: unable to evaluate constant expression", - }); - - ctx.objErrStage1("wrong type for argument tuple to @asyncCall", - \\export fn entry1() void { - \\ var frame: @Frame(foo) = undefined; - \\ @asyncCall(&frame, {}, foo, {}); - \\} - \\ - \\fn foo() i32 { - \\ return 0; - \\} - , &[_][]const u8{ - "tmp.zig:3:33: error: expected tuple or struct, found 'void'", - }); - - ctx.objErrStage1("wrong type for result ptr to @asyncCall", - \\export fn entry() void { - \\ _ = async amain(); - \\} - \\fn amain() i32 { - \\ var frame: @Frame(foo) = undefined; - \\ return await @asyncCall(&frame, false, foo, .{}); - \\} - \\fn foo() i32 { - \\ return 1234; - \\} - , &[_][]const u8{ - "tmp.zig:6:37: error: expected type '*i32', found 'bool'", - }); - - ctx.objErrStage1("shift amount has to be an integer type", - \\export fn entry() void { - \\ const x = 1 << &@as(u8, 10); - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: shift amount has to be an integer type, but found '*const u8'", - }); - - ctx.objErrStage1("bit shifting only works on integer types", - \\export fn entry() void { - \\ const x = &@as(u8, 1) << 10; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:16: error: bit shifting operation expected integer type, found '*const u8'", - }); - - ctx.objErrStage1("struct depends on itself via optional field", - \\const LhsExpr = struct { - \\ rhsExpr: ?AstObject, - \\}; - \\const AstObject = union { - \\ lhsExpr: LhsExpr, - \\}; - \\export fn entry() void { - \\ const lhsExpr = LhsExpr{ .rhsExpr = null }; - \\ const obj = AstObject{ .lhsExpr = lhsExpr }; - \\ _ = obj; - \\} - , &[_][]const u8{ - "tmp.zig:1:17: error: struct 'LhsExpr' depends on itself", - "tmp.zig:5:5: note: while checking this field", - "tmp.zig:2:5: note: while checking this field", - }); - - ctx.objErrStage1("alignment of enum field specified", - \\const Number = enum { - \\ a, - \\ b align(i32), - \\}; - \\export fn entry1() void { - \\ var x: Number = undefined; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:3:7: error: expected ',' after field", - }); - - ctx.objErrStage1("bad alignment type", - \\export fn entry1() void { - \\ var x: []align(true) i32 = undefined; - \\ _ = x; - \\} - \\export fn entry2() void { - \\ var x: *align(@as(f64, 12.34)) i32 = undefined; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:20: error: expected type 'u29', found 'bool'", - "tmp.zig:6:19: error: fractional component prevents float value 12.340000 from being casted to type 'u29'", - }); - { const case = ctx.obj("variable in inline assembly template cannot be found", .{ .cpu_arch = .x86_64, @@ -2274,55 +201,6 @@ pub fn addCases(ctx: *TestContext) !void { }); } - ctx.objErrStage1("indirect recursion of async functions detected", - \\var frame: ?anyframe = null; - \\ - \\export fn a() void { - \\ _ = async rangeSum(10); - \\ while (frame) |f| resume f; - \\} - \\ - \\fn rangeSum(x: i32) i32 { - \\ suspend { - \\ frame = @frame(); - \\ } - \\ frame = null; - \\ - \\ if (x == 0) return 0; - \\ var child = rangeSumIndirect(x - 1); - \\ return child + 1; - \\} - \\ - \\fn rangeSumIndirect(x: i32) i32 { - \\ suspend { - \\ frame = @frame(); - \\ } - \\ frame = null; - \\ - \\ if (x == 0) return 0; - \\ var child = rangeSum(x - 1); - \\ return child + 1; - \\} - , &[_][]const u8{ - "tmp.zig:8:1: error: '@Frame(rangeSum)' depends on itself", - "tmp.zig:15:33: note: when analyzing type '@Frame(rangeSum)' here", - "tmp.zig:26:25: note: when analyzing type '@Frame(rangeSumIndirect)' here", - }); - - ctx.objErrStage1("non-async function pointer eventually is inferred to become async", - \\export fn a() void { - \\ var non_async_fn: fn () void = undefined; - \\ non_async_fn = func; - \\} - \\fn func() void { - \\ suspend {} - \\} - , &[_][]const u8{ - "tmp.zig:5:1: error: 'func' cannot be async", - "tmp.zig:3:20: note: required to be non-async here", - "tmp.zig:6:5: note: suspends here", - }); - { const case = ctx.obj("bad alignment in @asyncCall", .{ .cpu_arch = .aarch64, @@ -2342,633 +220,6 @@ pub fn addCases(ctx: *TestContext) !void { }); } - ctx.objErrStage1("atomic orderings of fence Acquire or stricter", - \\export fn entry() void { - \\ @fence(.Monotonic); - \\} - , &[_][]const u8{ - "tmp.zig:2:12: error: atomic ordering must be Acquire or stricter", - }); - - ctx.objErrStage1("bad alignment in implicit cast from array pointer to slice", - \\export fn a() void { - \\ var x: [10]u8 = undefined; - \\ var y: []align(16) u8 = &x; - \\ _ = y; - \\} - , &[_][]const u8{ - "tmp.zig:3:30: error: expected type '[]align(16) u8', found '*[10]u8'", - }); - - ctx.objErrStage1("result location incompatibility mismatching handle_is_ptr (generic call)", - \\export fn entry() void { - \\ var damn = Container{ - \\ .not_optional = getOptional(i32), - \\ }; - \\ _ = damn; - \\} - \\pub fn getOptional(comptime T: type) ?T { - \\ return 0; - \\} - \\pub const Container = struct { - \\ not_optional: i32, - \\}; - , &[_][]const u8{ - "tmp.zig:3:36: error: cannot convert optional to payload type. consider using `.?`, `orelse`, or `if`. expected type 'i32', found '?i32'", - }); - - ctx.objErrStage1("result location incompatibility mismatching handle_is_ptr", - \\export fn entry() void { - \\ var damn = Container{ - \\ .not_optional = getOptional(), - \\ }; - \\ _ = damn; - \\} - \\pub fn getOptional() ?i32 { - \\ return 0; - \\} - \\pub const Container = struct { - \\ not_optional: i32, - \\}; - , &[_][]const u8{ - "tmp.zig:3:36: error: cannot convert optional to payload type. consider using `.?`, `orelse`, or `if`. expected type 'i32', found '?i32'", - }); - - ctx.objErrStage1("const frame cast to anyframe", - \\export fn a() void { - \\ const f = async func(); - \\ resume f; - \\} - \\export fn b() void { - \\ const f = async func(); - \\ var x: anyframe = &f; - \\ _ = x; - \\} - \\fn func() void { - \\ suspend {} - \\} - , &[_][]const u8{ - "tmp.zig:3:12: error: expected type 'anyframe', found '*const @Frame(func)'", - "tmp.zig:7:24: error: expected type 'anyframe', found '*const @Frame(func)'", - }); - - ctx.objErrStage1("prevent bad implicit casting of anyframe types", - \\export fn a() void { - \\ var x: anyframe = undefined; - \\ var y: anyframe->i32 = x; - \\ _ = y; - \\} - \\export fn b() void { - \\ var x: i32 = undefined; - \\ var y: anyframe->i32 = x; - \\ _ = y; - \\} - \\export fn c() void { - \\ var x: @Frame(func) = undefined; - \\ var y: anyframe->i32 = &x; - \\ _ = y; - \\} - \\fn func() void {} - , &[_][]const u8{ - "tmp.zig:3:28: error: expected type 'anyframe->i32', found 'anyframe'", - "tmp.zig:8:28: error: expected type 'anyframe->i32', found 'i32'", - "tmp.zig:13:29: error: expected type 'anyframe->i32', found '*@Frame(func)'", - }); - - ctx.objErrStage1("wrong frame type used for async call", - \\export fn entry() void { - \\ var frame: @Frame(foo) = undefined; - \\ frame = async bar(); - \\} - \\fn foo() void { - \\ suspend {} - \\} - \\fn bar() void { - \\ suspend {} - \\} - , &[_][]const u8{ - "tmp.zig:3:13: error: expected type '*@Frame(bar)', found '*@Frame(foo)'", - }); - - ctx.objErrStage1("@Frame() of generic function", - \\export fn entry() void { - \\ var frame: @Frame(func) = undefined; - \\ _ = frame; - \\} - \\fn func(comptime T: type) void { - \\ var x: T = undefined; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:16: error: @Frame() of generic function", - }); - - ctx.objErrStage1("@frame() causes function to be async", - \\export fn entry() void { - \\ func(); - \\} - \\fn func() void { - \\ _ = @frame(); - \\} - , &[_][]const u8{ - "tmp.zig:1:1: error: function with calling convention 'C' cannot be async", - "tmp.zig:5:9: note: @frame() causes function to be async", - }); - - ctx.objErrStage1("invalid suspend in exported function", - \\export fn entry() void { - \\ var frame = async func(); - \\ var result = await frame; - \\ _ = result; - \\} - \\fn func() void { - \\ suspend {} - \\} - , &[_][]const u8{ - "tmp.zig:1:1: error: function with calling convention 'C' cannot be async", - "tmp.zig:3:18: note: await here is a suspend point", - }); - - ctx.objErrStage1("async function indirectly depends on its own frame", - \\export fn entry() void { - \\ _ = async amain(); - \\} - \\fn amain() callconv(.Async) void { - \\ other(); - \\} - \\fn other() void { - \\ var x: [@sizeOf(@Frame(amain))]u8 = undefined; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:4:1: error: unable to determine async function frame of 'amain'", - "tmp.zig:5:10: note: analysis of function 'other' depends on the frame", - }); - - ctx.objErrStage1("async function depends on its own frame", - \\export fn entry() void { - \\ _ = async amain(); - \\} - \\fn amain() callconv(.Async) void { - \\ var x: [@sizeOf(@Frame(amain))]u8 = undefined; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:4:1: error: cannot resolve '@Frame(amain)': function not fully analyzed yet", - }); - - ctx.objErrStage1("non async function pointer passed to @asyncCall", - \\export fn entry() void { - \\ var ptr = afunc; - \\ var bytes: [100]u8 align(16) = undefined; - \\ _ = @asyncCall(&bytes, {}, ptr, .{}); - \\} - \\fn afunc() void { } - , &[_][]const u8{ - "tmp.zig:4:32: error: expected async function, found 'fn() void'", - }); - - ctx.objErrStage1("runtime-known async function called", - \\export fn entry() void { - \\ _ = async amain(); - \\} - \\fn amain() void { - \\ var ptr = afunc; - \\ _ = ptr(); - \\} - \\fn afunc() callconv(.Async) void {} - , &[_][]const u8{ - "tmp.zig:6:12: error: function is not comptime-known; @asyncCall required", - }); - - ctx.objErrStage1("runtime-known function called with async keyword", - \\export fn entry() void { - \\ var ptr = afunc; - \\ _ = async ptr(); - \\} - \\ - \\fn afunc() callconv(.Async) void { } - , &[_][]const u8{ - "tmp.zig:3:15: error: function is not comptime-known; @asyncCall required", - }); - - ctx.objErrStage1("function with ccc indirectly calling async function", - \\export fn entry() void { - \\ foo(); - \\} - \\fn foo() void { - \\ bar(); - \\} - \\fn bar() void { - \\ suspend {} - \\} - , &[_][]const u8{ - "tmp.zig:1:1: error: function with calling convention 'C' cannot be async", - "tmp.zig:2:8: note: async function call here", - "tmp.zig:5:8: note: async function call here", - "tmp.zig:8:5: note: suspends here", - }); - - ctx.objErrStage1("capture group on switch prong with incompatible payload types", - \\const Union = union(enum) { - \\ A: usize, - \\ B: isize, - \\}; - \\comptime { - \\ var u = Union{ .A = 8 }; - \\ switch (u) { - \\ .A, .B => |e| { - \\ _ = e; - \\ unreachable; - \\ }, - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:8:20: error: capture group with incompatible types", - "tmp.zig:8:9: note: type 'usize' here", - "tmp.zig:8:13: note: type 'isize' here", - }); - - ctx.objErrStage1("wrong type to @hasField", - \\export fn entry() bool { - \\ return @hasField(i32, "hi"); - \\} - , &[_][]const u8{ - "tmp.zig:2:22: error: type 'i32' does not support @hasField", - }); - - ctx.objErrStage1("slice passed as array init type with elems", - \\export fn entry() void { - \\ const x = []u8{1, 2}; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: array literal requires address-of operator (&) to coerce to slice type '[]u8'", - }); - - ctx.objErrStage1("slice passed as array init type", - \\export fn entry() void { - \\ const x = []u8{}; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: array literal requires address-of operator (&) to coerce to slice type '[]u8'", - }); - - ctx.objErrStage1("inferred array size invalid here", - \\export fn entry() void { - \\ const x = [_]u8; - \\ _ = x; - \\} - \\export fn entry2() void { - \\ const S = struct { a: *const [_]u8 }; - \\ var a = .{ S{} }; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:2:16: error: unable to infer array size", - "tmp.zig:6:35: error: unable to infer array size", - }); - - ctx.objErrStage1("initializing array with struct syntax", - \\export fn entry() void { - \\ const x = [_]u8{ .y = 2 }; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: initializing array with struct syntax", - }); - - ctx.objErrStage1("compile error in struct init expression", - \\const Foo = struct { - \\ a: i32 = crap, - \\ b: i32, - \\}; - \\export fn entry() void { - \\ var x = Foo{ - \\ .b = 5, - \\ }; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:14: error: use of undeclared identifier 'crap'", - }); - - ctx.objErrStage1("undefined as field type is rejected", - \\const Foo = struct { - \\ a: undefined, - \\}; - \\export fn entry1() void { - \\ const foo: Foo = undefined; - \\ _ = foo; - \\} - , &[_][]const u8{ - "tmp.zig:2:8: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("@hasDecl with non-container", - \\export fn entry() void { - \\ _ = @hasDecl(i32, "hi"); - \\} - , &[_][]const u8{ - "tmp.zig:2:18: error: expected struct, enum, or union; found 'i32'", - }); - - ctx.objErrStage1("field access of slices", - \\export fn entry() void { - \\ var slice: []i32 = undefined; - \\ const info = @TypeOf(slice).unknown; - \\ _ = info; - \\} - , &[_][]const u8{ - "tmp.zig:3:32: error: type 'type' does not support field access", - }); - - ctx.objErrStage1("peer cast then implicit cast const pointer to mutable C pointer", - \\export fn func() void { - \\ var strValue: [*c]u8 = undefined; - \\ strValue = strValue orelse ""; - \\} - , &[_][]const u8{ - "tmp.zig:3:32: error: expected type '[*c]u8', found '*const [0:0]u8'", - "tmp.zig:3:32: note: cast discards const qualifier", - }); - - ctx.objErrStage1("overflow in enum value allocation", - \\const Moo = enum(u8) { - \\ Last = 255, - \\ Over, - \\}; - \\pub fn main() void { - \\ var y = Moo.Last; - \\ _ = y; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: enumeration value 256 too large for type 'u8'", - }); - - ctx.objErrStage1("attempt to cast enum literal to error", - \\export fn entry() void { - \\ switch (error.Hi) { - \\ .Hi => {}, - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: expected type 'error{Hi}', found '@Type(.EnumLiteral)'", - }); - - ctx.objErrStage1("@sizeOf bad type", - \\export fn entry() usize { - \\ return @sizeOf(@TypeOf(null)); - \\} - , &[_][]const u8{ - "tmp.zig:2:20: error: no size available for type '@Type(.Null)'", - }); - - ctx.objErrStage1("generic function where return type is self-referenced", - \\fn Foo(comptime T: type) Foo(T) { - \\ return struct{ x: T }; - \\} - \\export fn entry() void { - \\ const t = Foo(u32) { - \\ .x = 1 - \\ }; - \\ _ = t; - \\} - , &[_][]const u8{ - "tmp.zig:1:29: error: evaluation exceeded 1000 backwards branches", - }); - - ctx.objErrStage1("@ptrToInt 0 to non optional pointer", - \\export fn entry() void { - \\ var b = @intToPtr(*i32, 0); - \\ _ = b; - \\} - , &[_][]const u8{ - "tmp.zig:2:13: error: pointer type '*i32' does not allow address zero", - }); - - ctx.objErrStage1("cast enum literal to enum but it doesn't match", - \\const Foo = enum { - \\ a, - \\ b, - \\}; - \\export fn entry() void { - \\ const x: Foo = .c; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:6:20: error: enum 'Foo' has no field named 'c'", - "tmp.zig:1:13: note: 'Foo' declared here", - }); - - ctx.objErrStage1("discarding error value", - \\export fn entry() void { - \\ _ = foo(); - \\} - \\fn foo() !void { - \\ return error.OutOfMemory; - \\} - , &[_][]const u8{ - "tmp.zig:2:12: error: error is discarded. consider using `try`, `catch`, or `if`", - }); - - ctx.objErrStage1("volatile on global assembly", - \\comptime { - \\ asm volatile (""); - \\} - , &[_][]const u8{ - "tmp.zig:2:9: error: volatile is meaningless on global assembly", - }); - - ctx.objErrStage1("invalid multiple dereferences", - \\export fn a() void { - \\ var box = Box{ .field = 0 }; - \\ box.*.field = 1; - \\} - \\export fn b() void { - \\ var box = Box{ .field = 0 }; - \\ var boxPtr = &box; - \\ boxPtr.*.*.field = 1; - \\} - \\pub const Box = struct { - \\ field: i32, - \\}; - , &[_][]const u8{ - "tmp.zig:3:8: error: attempt to dereference non-pointer type 'Box'", - "tmp.zig:8:13: error: attempt to dereference non-pointer type 'Box'", - }); - - ctx.objErrStage1("usingnamespace with wrong type", - \\usingnamespace void; - , &[_][]const u8{ - "tmp.zig:1:1: error: expected struct, enum, or union; found 'void'", - }); - - ctx.objErrStage1("ignored expression in while continuation", - \\export fn a() void { - \\ while (true) : (bad()) {} - \\} - \\export fn b() void { - \\ var x: anyerror!i32 = 1234; - \\ while (x) |_| : (bad()) {} else |_| {} - \\} - \\export fn c() void { - \\ var x: ?i32 = 1234; - \\ while (x) |_| : (bad()) {} - \\} - \\fn bad() anyerror!void { - \\ return error.Bad; - \\} - , &[_][]const u8{ - "tmp.zig:2:24: error: error is ignored. consider using `try`, `catch`, or `if`", - "tmp.zig:6:25: error: error is ignored. consider using `try`, `catch`, or `if`", - "tmp.zig:10:25: error: error is ignored. consider using `try`, `catch`, or `if`", - }); - - ctx.objErrStage1("empty while loop body", - \\export fn a() void { - \\ while(true); - \\} - , &[_][]const u8{ - "tmp.zig:2:16: error: expected block or assignment, found ';'", - }); - - ctx.objErrStage1("empty for loop body", - \\export fn a() void { - \\ for(undefined) |x|; - \\} - , &[_][]const u8{ - "tmp.zig:2:23: error: expected block or assignment, found ';'", - }); - - ctx.objErrStage1("empty if body", - \\export fn a() void { - \\ if(true); - \\} - , &[_][]const u8{ - "tmp.zig:2:13: error: expected block or assignment, found ';'", - }); - - ctx.objErrStage1("import outside package path", - \\comptime{ - \\ _ = @import("../a.zig"); - \\} - , &[_][]const u8{ - "tmp.zig:2:9: error: import of file outside package path: '../a.zig'", - }); - - ctx.objErrStage1("bogus compile var", - \\const x = @import("builtin").bogus; - \\export fn entry() usize { return @sizeOf(@TypeOf(x)); } - , &[_][]const u8{ - "tmp.zig:1:29: error: container 'builtin' has no member called 'bogus'", - }); - - ctx.objErrStage1("wrong panic signature, runtime function", - \\test "" {} - \\ - \\pub fn panic() void {} - \\ - , &[_][]const u8{ - "error: expected type 'fn([]const u8, ?*std.builtin.StackTrace) noreturn', found 'fn() void'", - }); - - ctx.objErrStage1("wrong panic signature, generic function", - \\pub fn panic(comptime msg: []const u8, error_return_trace: ?*builtin.StackTrace) noreturn { - \\ _ = msg; _ = error_return_trace; - \\ while (true) {} - \\} - \\const builtin = @import("std").builtin; - , &[_][]const u8{ - "error: expected type 'fn([]const u8, ?*std.builtin.StackTrace) noreturn', found 'fn([]const u8,anytype) anytype'", - "note: only one of the functions is generic", - }); - - ctx.objErrStage1("direct struct loop", - \\const A = struct { a : A, }; - \\export fn entry() usize { return @sizeOf(A); } - , &[_][]const u8{ - "tmp.zig:1:11: error: struct 'A' depends on itself", - }); - - ctx.objErrStage1("indirect struct loop", - \\const A = struct { b : B, }; - \\const B = struct { c : C, }; - \\const C = struct { a : A, }; - \\export fn entry() usize { return @sizeOf(A); } - , &[_][]const u8{ - "tmp.zig:1:11: error: struct 'A' depends on itself", - }); - - ctx.objErrStage1("instantiating an undefined value for an invalid struct that contains itself", - \\const Foo = struct { - \\ x: Foo, - \\}; - \\ - \\var foo: Foo = undefined; - \\ - \\export fn entry() usize { - \\ return @sizeOf(@TypeOf(foo.x)); - \\} - , &[_][]const u8{ - "tmp.zig:1:13: error: struct 'Foo' depends on itself", - }); - - ctx.objErrStage1("enum field value references enum", - \\pub const Foo = enum(c_int) { - \\ A = Foo.B, - \\ C = D, - \\}; - \\export fn entry() void { - \\ var s: Foo = Foo.E; - \\ _ = s; - \\} - \\const D = 1; - , &[_][]const u8{ - "tmp.zig:1:17: error: enum 'Foo' depends on itself", - }); - - ctx.objErrStage1("top level decl dependency loop", - \\const a : @TypeOf(b) = 0; - \\const b : @TypeOf(a) = 0; - \\export fn entry() void { - \\ const c = a + b; - \\ _ = c; - \\} - , &[_][]const u8{ - "tmp.zig:2:19: error: dependency loop detected", - }); - - ctx.testErrStage1("not an enum type", - \\export fn entry() void { - \\ var self: Error = undefined; - \\ switch (self) { - \\ InvalidToken => |x| return x.token, - \\ ExpectedVarDeclOrFn => |x| return x.token, - \\ } - \\} - \\const Error = union(enum) { - \\ A: InvalidToken, - \\ B: ExpectedVarDeclOrFn, - \\}; - \\const InvalidToken = struct {}; - \\const ExpectedVarDeclOrFn = struct {}; - , &[_][]const u8{ - "tmp.zig:4:9: error: expected type '@typeInfo(Error).Union.tag_type.?', found 'type'", - }); - - ctx.testErrStage1("binary OR operator on error sets", - \\pub const A = error.A; - \\pub const AB = A | error.B; - \\export fn entry() void { - \\ var x: AB = undefined; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:18: error: invalid operands to binary expression: 'error{A}' and 'error{B}'", - }); - if (builtin.os.tag == .linux) { ctx.testErrStage1("implicit dependency on libc", \\extern "c" fn exit(u8) void; @@ -2990,1048 +241,6 @@ pub fn addCases(ctx: *TestContext) !void { }); } - ctx.testErrStage1("comptime vector overflow shows the index", - \\comptime { - \\ var a: @import("std").meta.Vector(4, u8) = [_]u8{ 1, 2, 255, 4 }; - \\ var b: @import("std").meta.Vector(4, u8) = [_]u8{ 5, 6, 1, 8 }; - \\ var x = a + b; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:4:15: error: operation caused overflow", - "tmp.zig:4:15: note: when computing vector element at index 2", - }); - - ctx.testErrStage1("packed struct with fields of not allowed types", - \\const A = packed struct { - \\ x: anyerror, - \\}; - \\const B = packed struct { - \\ x: [2]u24, - \\}; - \\const C = packed struct { - \\ x: [1]anyerror, - \\}; - \\const D = packed struct { - \\ x: [1]S, - \\}; - \\const E = packed struct { - \\ x: [1]U, - \\}; - \\const F = packed struct { - \\ x: ?anyerror, - \\}; - \\const G = packed struct { - \\ x: Enum, - \\}; - \\export fn entry1() void { - \\ var a: A = undefined; - \\ _ = a; - \\} - \\export fn entry2() void { - \\ var b: B = undefined; - \\ _ = b; - \\} - \\export fn entry3() void { - \\ var r: C = undefined; - \\ _ = r; - \\} - \\export fn entry4() void { - \\ var d: D = undefined; - \\ _ = d; - \\} - \\export fn entry5() void { - \\ var e: E = undefined; - \\ _ = e; - \\} - \\export fn entry6() void { - \\ var f: F = undefined; - \\ _ = f; - \\} - \\export fn entry7() void { - \\ var g: G = undefined; - \\ _ = g; - \\} - \\const S = struct { - \\ x: i32, - \\}; - \\const U = struct { - \\ A: i32, - \\ B: u32, - \\}; - \\const Enum = enum { - \\ A, - \\ B, - \\}; - , &[_][]const u8{ - "tmp.zig:2:5: error: type 'anyerror' not allowed in packed struct; no guaranteed in-memory representation", - "tmp.zig:5:5: error: array of 'u24' not allowed in packed struct due to padding bits (must be padded from 48 to 64 bits)", - "tmp.zig:8:5: error: type 'anyerror' not allowed in packed struct; no guaranteed in-memory representation", - "tmp.zig:11:5: error: non-packed, non-extern struct 'S' not allowed in packed struct; no guaranteed in-memory representation", - "tmp.zig:14:5: error: non-packed, non-extern struct 'U' not allowed in packed struct; no guaranteed in-memory representation", - "tmp.zig:17:5: error: type '?anyerror' not allowed in packed struct; no guaranteed in-memory representation", - "tmp.zig:20:5: error: type 'Enum' not allowed in packed struct; no guaranteed in-memory representation", - "tmp.zig:57:14: note: enum declaration does not specify an integer tag type", - }); - - ctx.objErrStage1("deduplicate undeclared identifier", - \\export fn a() void { - \\ x += 1; - \\} - \\export fn b() void { - \\ x += 1; - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: use of undeclared identifier 'x'", - }); - - ctx.objErrStage1("export generic function", - \\export fn foo(num: anytype) i32 { - \\ _ = num; - \\ return 0; - \\} - , &[_][]const u8{ - "tmp.zig:1:15: error: parameter of type 'anytype' not allowed in function with calling convention 'C'", - }); - - ctx.objErrStage1("C pointer to anyopaque", - \\export fn a() void { - \\ var x: *anyopaque = undefined; - \\ var y: [*c]anyopaque = x; - \\ _ = y; - \\} - , &[_][]const u8{ - "tmp.zig:3:16: error: C pointers cannot point to opaque types", - }); - - ctx.objErrStage1("directly embedding opaque type in struct and union", - \\const O = opaque {}; - \\const Foo = struct { - \\ o: O, - \\}; - \\const Bar = union { - \\ One: i32, - \\ Two: O, - \\}; - \\export fn a() void { - \\ var foo: Foo = undefined; - \\ _ = foo; - \\} - \\export fn b() void { - \\ var bar: Bar = undefined; - \\ _ = bar; - \\} - \\export fn c() void { - \\ var baz: *opaque {} = undefined; - \\ const qux = .{baz.*}; - \\ _ = qux; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: opaque types have unknown size and therefore cannot be directly embedded in structs", - "tmp.zig:7:5: error: opaque types have unknown size and therefore cannot be directly embedded in unions", - "tmp.zig:19:22: error: opaque types have unknown size and therefore cannot be directly embedded in structs", - }); - - ctx.objErrStage1("implicit cast between C pointer and Zig pointer - bad const/align/child", - \\export fn a() void { - \\ var x: [*c]u8 = undefined; - \\ var y: *align(4) u8 = x; - \\ _ = y; - \\} - \\export fn b() void { - \\ var x: [*c]const u8 = undefined; - \\ var y: *u8 = x; - \\ _ = y; - \\} - \\export fn c() void { - \\ var x: [*c]u8 = undefined; - \\ var y: *u32 = x; - \\ _ = y; - \\} - \\export fn d() void { - \\ var y: *align(1) u32 = undefined; - \\ var x: [*c]u32 = y; - \\ _ = x; - \\} - \\export fn e() void { - \\ var y: *const u8 = undefined; - \\ var x: [*c]u8 = y; - \\ _ = x; - \\} - \\export fn f() void { - \\ var y: *u8 = undefined; - \\ var x: [*c]u32 = y; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:3:27: error: cast increases pointer alignment", - "tmp.zig:8:18: error: cast discards const qualifier", - "tmp.zig:13:19: error: expected type '*u32', found '[*c]u8'", - "tmp.zig:13:19: note: pointer type child 'u8' cannot cast into pointer type child 'u32'", - "tmp.zig:18:22: error: cast increases pointer alignment", - "tmp.zig:23:21: error: cast discards const qualifier", - "tmp.zig:28:22: error: expected type '[*c]u32', found '*u8'", - }); - - ctx.objErrStage1("implicit casting null c pointer to zig pointer", - \\comptime { - \\ var c_ptr: [*c]u8 = 0; - \\ var zig_ptr: *u8 = c_ptr; - \\ _ = zig_ptr; - \\} - , &[_][]const u8{ - "tmp.zig:3:24: error: null pointer casted to type '*u8'", - }); - - ctx.objErrStage1("implicit casting undefined c pointer to zig pointer", - \\comptime { - \\ var c_ptr: [*c]u8 = undefined; - \\ var zig_ptr: *u8 = c_ptr; - \\ _ = zig_ptr; - \\} - , &[_][]const u8{ - "tmp.zig:3:24: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("implicit casting C pointers which would mess up null semantics", - \\export fn entry() void { - \\ var slice: []const u8 = "aoeu"; - \\ const opt_many_ptr: [*]const u8 = slice.ptr; - \\ var ptr_opt_many_ptr = &opt_many_ptr; - \\ var c_ptr: [*c]const [*c]const u8 = ptr_opt_many_ptr; - \\ ptr_opt_many_ptr = c_ptr; - \\} - \\export fn entry2() void { - \\ var buf: [4]u8 = "aoeu".*; - \\ var slice: []u8 = &buf; - \\ var opt_many_ptr: [*]u8 = slice.ptr; - \\ var ptr_opt_many_ptr = &opt_many_ptr; - \\ var c_ptr: [*c][*c]const u8 = ptr_opt_many_ptr; - \\ _ = c_ptr; - \\} - , &[_][]const u8{ - "tmp.zig:6:24: error: expected type '*const [*]const u8', found '[*c]const [*c]const u8'", - "tmp.zig:6:24: note: pointer type child '[*c]const u8' cannot cast into pointer type child '[*]const u8'", - "tmp.zig:6:24: note: '[*c]const u8' could have null values which are illegal in type '[*]const u8'", - "tmp.zig:13:35: error: expected type '[*c][*c]const u8', found '*[*]u8'", - "tmp.zig:13:35: note: pointer type child '[*]u8' cannot cast into pointer type child '[*c]const u8'", - "tmp.zig:13:35: note: mutable '[*c]const u8' allows illegal null values stored to type '[*]u8'", - }); - - ctx.objErrStage1("implicit casting too big integers to C pointers", - \\export fn a() void { - \\ var ptr: [*c]u8 = (1 << 64) + 1; - \\ _ = ptr; - \\} - \\export fn b() void { - \\ var x: u65 = 0x1234; - \\ var ptr: [*c]u8 = x; - \\ _ = ptr; - \\} - , &[_][]const u8{ - "tmp.zig:2:33: error: integer value 18446744073709551617 cannot be coerced to type 'usize'", - "tmp.zig:7:23: error: integer type 'u65' too big for implicit @intToPtr to type '[*c]u8'", - }); - - ctx.objErrStage1("C pointer pointing to non C ABI compatible type or has align attr", - \\const Foo = struct {}; - \\export fn a() void { - \\ const T = [*c]Foo; - \\ var t: T = undefined; - \\ _ = t; - \\} - , &[_][]const u8{ - "tmp.zig:3:19: error: C pointers cannot point to non-C-ABI-compatible type 'Foo'", - }); - - ctx.objErrStage1("compile log statement warning deduplication in generic fn", - \\export fn entry() void { - \\ inner(1); - \\ inner(2); - \\} - \\fn inner(comptime n: usize) void { - \\ comptime var i = 0; - \\ inline while (i < n) : (i += 1) { @compileLog("!@#$"); } - \\} - , &[_][]const u8{ - "tmp.zig:7:39: error: found compile log statement", - }); - - ctx.objErrStage1("assign to invalid dereference", - \\export fn entry() void { - \\ 'a'.* = 1; - \\} - , &[_][]const u8{ - "tmp.zig:2:8: error: attempt to dereference non-pointer type 'comptime_int'", - }); - - ctx.objErrStage1("take slice of invalid dereference", - \\export fn entry() void { - \\ const x = 'a'.*[0..]; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:18: error: attempt to dereference non-pointer type 'comptime_int'", - }); - - ctx.objErrStage1("@truncate undefined value", - \\export fn entry() void { - \\ var z = @truncate(u8, @as(u16, undefined)); - \\ _ = z; - \\} - , &[_][]const u8{ - "tmp.zig:2:27: error: use of undefined value here causes undefined behavior", - }); - - ctx.testErrStage1("return invalid type from test", - \\test "example" { return 1; } - , &[_][]const u8{ - "tmp.zig:1:25: error: expected type 'void', found 'comptime_int'", - }); - - ctx.objErrStage1("threadlocal qualifier on const", - \\threadlocal const x: i32 = 1234; - \\export fn entry() i32 { - \\ return x; - \\} - , &[_][]const u8{ - "tmp.zig:1:1: error: threadlocal variable cannot be constant", - }); - - ctx.objErrStage1("@bitCast same size but bit count mismatch", - \\export fn entry(byte: u8) void { - \\ var oops = @bitCast(u7, byte); - \\ _ = oops; - \\} - , &[_][]const u8{ - "tmp.zig:2:25: error: destination type 'u7' has 7 bits but source type 'u8' has 8 bits", - }); - - ctx.objErrStage1("@bitCast with different sizes inside an expression", - \\export fn entry() void { - \\ var foo = (@bitCast(u8, @as(f32, 1.0)) == 0xf); - \\ _ = foo; - \\} - , &[_][]const u8{ - "tmp.zig:2:25: error: destination type 'u8' has size 1 but source type 'f32' has size 4", - }); - - ctx.objErrStage1("attempted `&&`", - \\export fn entry(a: bool, b: bool) i32 { - \\ if (a && b) { - \\ return 1234; - \\ } - \\ return 5678; - \\} - , &[_][]const u8{ - "tmp.zig:2:11: error: ambiguous use of '&&'; use 'and' for logical AND, or change whitespace to ' & &' for bitwise AND", - }); - - ctx.objErrStage1("attempted `||` on boolean values", - \\export fn entry(a: bool, b: bool) i32 { - \\ if (a || b) { - \\ return 1234; - \\ } - \\ return 5678; - \\} - , &[_][]const u8{ - "tmp.zig:2:9: error: expected error set type, found 'bool'", - "tmp.zig:2:11: note: `||` merges error sets; `or` performs boolean OR", - }); - - ctx.objErrStage1("compile log a pointer to an opaque value", - \\export fn entry() void { - \\ @compileLog(@ptrCast(*const anyopaque, &entry)); - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: found compile log statement", - }); - - ctx.objErrStage1("duplicate boolean switch value", - \\comptime { - \\ const x = switch (true) { - \\ true => false, - \\ false => true, - \\ true => false, - \\ }; - \\ _ = x; - \\} - \\comptime { - \\ const x = switch (true) { - \\ false => true, - \\ true => false, - \\ false => true, - \\ }; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:5:9: error: duplicate switch value", - "tmp.zig:13:9: error: duplicate switch value", - }); - - ctx.objErrStage1("missing boolean switch value", - \\comptime { - \\ const x = switch (true) { - \\ true => false, - \\ }; - \\ _ = x; - \\} - \\comptime { - \\ const x = switch (true) { - \\ false => true, - \\ }; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: switch must handle all possibilities", - "tmp.zig:8:15: error: switch must handle all possibilities", - }); - - ctx.objErrStage1("reading past end of pointer casted array", - \\comptime { - \\ const array: [4]u8 = "aoeu".*; - \\ const sub_array = array[1..]; - \\ const int_ptr = @ptrCast(*const u24, sub_array); - \\ const deref = int_ptr.*; - \\ _ = deref; - \\} - , &[_][]const u8{ - "tmp.zig:5:26: error: attempt to read 4 bytes from [4]u8 at index 1 which is 3 bytes", - }); - - ctx.objErrStage1("error note for function parameter incompatibility", - \\fn do_the_thing(func: fn (arg: i32) void) void { _ = func; } - \\fn bar(arg: bool) void { _ = arg; } - \\export fn entry() void { - \\ do_the_thing(bar); - \\} - , &[_][]const u8{ - "tmp.zig:4:18: error: expected type 'fn(i32) void', found 'fn(bool) void", - "tmp.zig:4:18: note: parameter 0: 'bool' cannot cast into 'i32'", - }); - ctx.objErrStage1("cast negative value to unsigned integer", - \\comptime { - \\ const value: i32 = -1; - \\ const unsigned = @intCast(u32, value); - \\ _ = unsigned; - \\} - \\export fn entry1() void { - \\ const value: i32 = -1; - \\ const unsigned: u32 = value; - \\ _ = unsigned; - \\} - , &[_][]const u8{ - "tmp.zig:3:22: error: attempt to cast negative value to unsigned integer", - "tmp.zig:8:27: error: cannot cast negative value -1 to unsigned integer type 'u32'", - }); - - ctx.objErrStage1("integer cast truncates bits", - \\export fn entry1() void { - \\ const spartan_count: u16 = 300; - \\ const byte = @intCast(u8, spartan_count); - \\ _ = byte; - \\} - \\export fn entry2() void { - \\ const spartan_count: u16 = 300; - \\ const byte: u8 = spartan_count; - \\ _ = byte; - \\} - \\export fn entry3() void { - \\ var spartan_count: u16 = 300; - \\ var byte: u8 = spartan_count; - \\ _ = byte; - \\} - \\export fn entry4() void { - \\ var signed: i8 = -1; - \\ var unsigned: u64 = signed; - \\ _ = unsigned; - \\} - , &[_][]const u8{ - "tmp.zig:3:18: error: cast from 'u16' to 'u8' truncates bits", - "tmp.zig:8:22: error: integer value 300 cannot be coerced to type 'u8'", - "tmp.zig:13:20: error: expected type 'u8', found 'u16'", - "tmp.zig:13:20: note: unsigned 8-bit int cannot represent all possible unsigned 16-bit values", - "tmp.zig:18:25: error: expected type 'u64', found 'i8'", - "tmp.zig:18:25: note: unsigned 64-bit int cannot represent all possible signed 8-bit values", - }); - - ctx.objErrStage1("comptime implicit cast f64 to f32", - \\export fn entry() void { - \\ const x: f64 = 16777217; - \\ const y: f32 = x; - \\ _ = y; - \\} - , &[_][]const u8{ - "tmp.zig:3:20: error: cast of value 16777217.000000 to type 'f32' loses information", - }); - - ctx.objErrStage1("implicit cast from f64 to f32", - \\var x: f64 = 1.0; - \\var y: f32 = x; - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(y)); } - , &[_][]const u8{ - "tmp.zig:2:14: error: expected type 'f32', found 'f64'", - }); - - ctx.objErrStage1("exceeded maximum bit width of integer", - \\export fn entry1() void { - \\ const T = u65536; - \\ _ = T; - \\} - \\export fn entry2() void { - \\ var x: i65536 = 1; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: primitive integer type 'u65536' exceeds maximum bit width of 65535", - "tmp.zig:6:12: error: primitive integer type 'i65536' exceeds maximum bit width of 65535", - }); - - ctx.objErrStage1("compile error when evaluating return type of inferred error set", - \\const Car = struct { - \\ foo: *SymbolThatDoesNotExist, - \\ pub fn init() !Car {} - \\}; - \\export fn entry() void { - \\ const car = Car.init(); - \\ _ = car; - \\} - , &[_][]const u8{ - "tmp.zig:2:11: error: use of undeclared identifier 'SymbolThatDoesNotExist'", - }); - - ctx.objErrStage1("don't implicit cast double pointer to *anyopaque", - \\export fn entry() void { - \\ var a: u32 = 1; - \\ var ptr: *align(@alignOf(u32)) anyopaque = &a; - \\ var b: *u32 = @ptrCast(*u32, ptr); - \\ var ptr2: *anyopaque = &b; - \\ _ = ptr2; - \\} - , &[_][]const u8{ - "tmp.zig:5:29: error: expected type '*anyopaque', found '**u32'", - }); - - ctx.objErrStage1("runtime index into comptime type slice", - \\const Struct = struct { - \\ a: u32, - \\}; - \\fn getIndex() usize { - \\ return 2; - \\} - \\export fn entry() void { - \\ const index = getIndex(); - \\ const field = @typeInfo(Struct).Struct.fields[index]; - \\ _ = field; - \\} - , &[_][]const u8{ - "tmp.zig:9:51: error: values of type 'std.builtin.Type.StructField' must be comptime known, but index value is runtime known", - }); - - ctx.objErrStage1("compile log statement inside function which must be comptime evaluated", - \\fn Foo(comptime T: type) type { - \\ @compileLog(@typeName(T)); - \\ return T; - \\} - \\export fn entry() void { - \\ _ = Foo(i32); - \\ _ = @typeName(Foo(i32)); - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: found compile log statement", - }); - - ctx.objErrStage1("comptime slice of an undefined slice", - \\comptime { - \\ var a: []u8 = undefined; - \\ var b = a[0..10]; - \\ _ = b; - \\} - , &[_][]const u8{ - "tmp.zig:3:14: error: slice of undefined", - }); - - ctx.objErrStage1("implicit cast const array to mutable slice", - \\export fn entry() void { - \\ const buffer: [1]u8 = [_]u8{8}; - \\ const sliceA: []u8 = &buffer; - \\ _ = sliceA; - \\} - , &[_][]const u8{ - "tmp.zig:3:27: error: cannot cast pointer to array literal to slice type '[]u8'", - "tmp.zig:3:27: note: cast discards const qualifier", - }); - - ctx.objErrStage1("deref slice and get len field", - \\export fn entry() void { - \\ var a: []u8 = undefined; - \\ _ = a.*.len; - \\} - , &[_][]const u8{ - "tmp.zig:3:10: error: attempt to dereference non-pointer type '[]u8'", - }); - - ctx.objErrStage1("@ptrCast a 0 bit type to a non- 0 bit type", - \\export fn entry() bool { - \\ var x: u0 = 0; - \\ const p = @ptrCast(?*u0, &x); - \\ return p == null; - \\} - , &[_][]const u8{ - "tmp.zig:3:15: error: '*u0' and '?*u0' do not have the same in-memory representation", - "tmp.zig:3:31: note: '*u0' has no in-memory bits", - "tmp.zig:3:24: note: '?*u0' has in-memory bits", - }); - - ctx.objErrStage1("comparing a non-optional pointer against null", - \\export fn entry() void { - \\ var x: i32 = 1; - \\ _ = &x == null; - \\} - , &[_][]const u8{ - "tmp.zig:3:12: error: comparison of '*i32' with null", - }); - - ctx.objErrStage1("non error sets used in merge error sets operator", - \\export fn foo() void { - \\ const Errors = u8 || u16; - \\ _ = Errors; - \\} - \\export fn bar() void { - \\ const Errors = error{} || u16; - \\ _ = Errors; - \\} - , &[_][]const u8{ - "tmp.zig:2:20: error: expected error set type, found type 'u8'", - "tmp.zig:2:23: note: `||` merges error sets; `or` performs boolean OR", - "tmp.zig:6:31: error: expected error set type, found type 'u16'", - "tmp.zig:6:28: note: `||` merges error sets; `or` performs boolean OR", - }); - - ctx.objErrStage1("variable initialization compile error then referenced", - \\fn Undeclared() type { - \\ return T; - \\} - \\fn Gen() type { - \\ const X = Undeclared(); - \\ return struct { - \\ x: X, - \\ }; - \\} - \\export fn entry() void { - \\ const S = Gen(); - \\ _ = S; - \\} - , &[_][]const u8{ - "tmp.zig:2:12: error: use of undeclared identifier 'T'", - }); - - ctx.objErrStage1("refer to the type of a generic function", - \\export fn entry() void { - \\ const Func = fn (type) void; - \\ const f: Func = undefined; - \\ f(i32); - \\} - , &[_][]const u8{ - "tmp.zig:4:5: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("accessing runtime parameter from outer function", - \\fn outer(y: u32) fn (u32) u32 { - \\ const st = struct { - \\ fn get(z: u32) u32 { - \\ return z + y; - \\ } - \\ }; - \\ return st.get; - \\} - \\export fn entry() void { - \\ var func = outer(10); - \\ var x = func(3); - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:4:24: error: 'y' not accessible from inner function", - "tmp.zig:3:28: note: crossed function definition here", - "tmp.zig:1:10: note: declared here", - }); - - ctx.objErrStage1("non int passed to @intToFloat", - \\export fn entry() void { - \\ const x = @intToFloat(f32, 1.1); - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:32: error: expected int type, found 'comptime_float'", - }); - - ctx.objErrStage1("non float passed to @floatToInt", - \\export fn entry() void { - \\ const x = @floatToInt(i32, @as(i32, 54)); - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:32: error: expected float type, found 'i32'", - }); - - ctx.objErrStage1("out of range comptime_int passed to @floatToInt", - \\export fn entry() void { - \\ const x = @floatToInt(i8, 200); - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:31: error: integer value 200 cannot be coerced to type 'i8'", - }); - - ctx.objErrStage1("load too many bytes from comptime reinterpreted pointer", - \\export fn entry() void { - \\ const float: f32 = 5.99999999999994648725e-01; - \\ const float_ptr = &float; - \\ const int_ptr = @ptrCast(*const i64, float_ptr); - \\ const int_val = int_ptr.*; - \\ _ = int_val; - \\} - , &[_][]const u8{ - "tmp.zig:5:28: error: attempt to read 8 bytes from pointer to f32 which is 4 bytes", - }); - - ctx.objErrStage1("invalid type used in array type", - \\const Item = struct { - \\ field: SomeNonexistentType, - \\}; - \\var items: [100]Item = undefined; - \\export fn entry() void { - \\ const a = items[0]; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:2:12: error: use of undeclared identifier 'SomeNonexistentType'", - }); - - ctx.objErrStage1("comptime continue inside runtime catch", - \\export fn entry() void { - \\ const ints = [_]u8{ 1, 2 }; - \\ inline for (ints) |_| { - \\ bad() catch continue; - \\ } - \\} - \\fn bad() !void { - \\ return error.Bad; - \\} - , &[_][]const u8{ - "tmp.zig:4:21: error: comptime control flow inside runtime block", - "tmp.zig:4:15: note: runtime block created here", - }); - - ctx.objErrStage1("comptime continue inside runtime switch", - \\export fn entry() void { - \\ var p: i32 = undefined; - \\ comptime var q = true; - \\ inline while (q) { - \\ switch (p) { - \\ 11 => continue, - \\ else => {}, - \\ } - \\ q = false; - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:6:19: error: comptime control flow inside runtime block", - "tmp.zig:5:9: note: runtime block created here", - }); - - ctx.objErrStage1("comptime continue inside runtime while error", - \\export fn entry() void { - \\ var p: anyerror!usize = undefined; - \\ comptime var q = true; - \\ outer: inline while (q) { - \\ while (p) |_| { - \\ continue :outer; - \\ } else |_| {} - \\ q = false; - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:6:13: error: comptime control flow inside runtime block", - "tmp.zig:5:9: note: runtime block created here", - }); - - ctx.objErrStage1("comptime continue inside runtime while optional", - \\export fn entry() void { - \\ var p: ?usize = undefined; - \\ comptime var q = true; - \\ outer: inline while (q) { - \\ while (p) |_| continue :outer; - \\ q = false; - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:5:23: error: comptime control flow inside runtime block", - "tmp.zig:5:9: note: runtime block created here", - }); - - ctx.objErrStage1("comptime continue inside runtime while bool", - \\export fn entry() void { - \\ var p: usize = undefined; - \\ comptime var q = true; - \\ outer: inline while (q) { - \\ while (p == 11) continue :outer; - \\ q = false; - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:5:25: error: comptime control flow inside runtime block", - "tmp.zig:5:9: note: runtime block created here", - }); - - ctx.objErrStage1("comptime continue inside runtime if error", - \\export fn entry() void { - \\ var p: anyerror!i32 = undefined; - \\ comptime var q = true; - \\ inline while (q) { - \\ if (p) |_| continue else |_| {} - \\ q = false; - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:5:20: error: comptime control flow inside runtime block", - "tmp.zig:5:9: note: runtime block created here", - }); - - ctx.objErrStage1("comptime continue inside runtime if optional", - \\export fn entry() void { - \\ var p: ?i32 = undefined; - \\ comptime var q = true; - \\ inline while (q) { - \\ if (p) |_| continue; - \\ q = false; - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:5:20: error: comptime control flow inside runtime block", - "tmp.zig:5:9: note: runtime block created here", - }); - - ctx.objErrStage1("comptime continue inside runtime if bool", - \\export fn entry() void { - \\ var p: usize = undefined; - \\ comptime var q = true; - \\ inline while (q) { - \\ if (p == 11) continue; - \\ q = false; - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:5:22: error: comptime control flow inside runtime block", - "tmp.zig:5:9: note: runtime block created here", - }); - - ctx.objErrStage1("switch with invalid expression parameter", - \\export fn entry() void { - \\ Test(i32); - \\} - \\fn Test(comptime T: type) void { - \\ const x = switch (T) { - \\ []u8 => |x| x, - \\ i32 => |x| x, - \\ else => unreachable, - \\ }; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:7:17: error: switch on type 'type' provides no expression parameter", - }); - - ctx.objErrStage1("function prototype with no body", - \\fn foo() void; - \\export fn entry() void { - \\ foo(); - \\} - , &[_][]const u8{ - "tmp.zig:1:1: error: non-extern function has no body", - }); - - ctx.objErrStage1("@frame() called outside of function definition", - \\var handle_undef: anyframe = undefined; - \\var handle_dummy: anyframe = @frame(); - \\export fn entry() bool { - \\ return handle_undef == handle_dummy; - \\} - , &[_][]const u8{ - "tmp.zig:2:30: error: @frame() called outside of function definition", - }); - - ctx.objErrStage1("`_` is not a declarable symbol", - \\export fn f1() usize { - \\ var _: usize = 2; - \\ return _; - \\} - , &[_][]const u8{ - "tmp.zig:2:9: error: '_' used as an identifier without @\"_\" syntax", - }); - - ctx.objErrStage1("`_` should not be usable inside for", - \\export fn returns() void { - \\ for ([_]void{}) |_, i| { - \\ for ([_]void{}) |_, j| { - \\ return _; - \\ } - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:4:20: error: '_' used as an identifier without @\"_\" syntax", - }); - - ctx.objErrStage1("`_` should not be usable inside while", - \\export fn returns() void { - \\ while (optionalReturn()) |_| { - \\ while (optionalReturn()) |_| { - \\ return _; - \\ } - \\ } - \\} - \\fn optionalReturn() ?u32 { - \\ return 1; - \\} - , &[_][]const u8{ - "tmp.zig:4:20: error: '_' used as an identifier without @\"_\" syntax", - }); - - ctx.objErrStage1("`_` should not be usable inside while else", - \\export fn returns() void { - \\ while (optionalReturnError()) |_| { - \\ while (optionalReturnError()) |_| { - \\ return; - \\ } else |_| { - \\ if (_ == error.optionalReturnError) return; - \\ } - \\ } - \\} - \\fn optionalReturnError() !?u32 { - \\ return error.optionalReturnError; - \\} - , &[_][]const u8{ - "tmp.zig:6:17: error: '_' used as an identifier without @\"_\" syntax", - }); - - ctx.objErrStage1("while loop body expression ignored", - \\fn returns() usize { - \\ return 2; - \\} - \\export fn f1() void { - \\ while (true) returns(); - \\} - \\export fn f2() void { - \\ var x: ?i32 = null; - \\ while (x) |_| returns(); - \\} - \\export fn f3() void { - \\ var x: anyerror!i32 = error.Bad; - \\ while (x) |_| returns() else |_| unreachable; - \\} - , &[_][]const u8{ - "tmp.zig:5:25: error: expression value is ignored", - "tmp.zig:9:26: error: expression value is ignored", - "tmp.zig:13:26: error: expression value is ignored", - }); - - ctx.objErrStage1("missing parameter name of generic function", - \\fn dump(anytype) void {} - \\export fn entry() void { - \\ var a: u8 = 9; - \\ dump(a); - \\} - , &[_][]const u8{ - "tmp.zig:1:9: error: missing parameter name", - }); - - ctx.objErrStage1("non-inline for loop on a type that requires comptime", - \\const Foo = struct { - \\ name: []const u8, - \\ T: type, - \\}; - \\export fn entry() void { - \\ const xx: [2]Foo = undefined; - \\ for (xx) |f| { _ = f;} - \\} - , &[_][]const u8{ - "tmp.zig:7:5: error: values of type 'Foo' must be comptime known, but index value is runtime known", - }); - - ctx.objErrStage1("generic fn as parameter without comptime keyword", - \\fn f(_: fn (anytype) void) void {} - \\fn g(_: anytype) void {} - \\export fn entry() void { - \\ f(g); - \\} - , &[_][]const u8{ - "tmp.zig:1:9: error: parameter of type 'fn(anytype) anytype' must be declared comptime", - }); - - ctx.objErrStage1("optional pointer to void in extern struct", - \\const Foo = extern struct { - \\ x: ?*const void, - \\}; - \\const Bar = extern struct { - \\ foo: Foo, - \\ y: i32, - \\}; - \\export fn entry(bar: *Bar) void {_ = bar;} - , &[_][]const u8{ - "tmp.zig:2:5: error: extern structs cannot contain fields of type '?*const void'", - }); - - ctx.objErrStage1("use of comptime-known undefined function value", - \\const Cmd = struct { - \\ exec: fn () void, - \\}; - \\export fn entry() void { - \\ const command = Cmd{ .exec = undefined }; - \\ command.exec(); - \\} - , &[_][]const u8{ - "tmp.zig:6:12: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("use of comptime-known undefined function value", - \\const Cmd = struct { - \\ exec: fn () void, - \\}; - \\export fn entry() void { - \\ const command = Cmd{ .exec = undefined }; - \\ command.exec(); - \\} - , &[_][]const u8{ - "tmp.zig:6:12: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("bad @alignCast at comptime", - \\comptime { - \\ const ptr = @intToPtr(*align(1) i32, 0x1); - \\ const aligned = @alignCast(4, ptr); - \\ _ = aligned; - \\} - , &[_][]const u8{ - "tmp.zig:3:35: error: pointer address 0x1 is not aligned to 4 bytes", - }); - - ctx.objErrStage1("@ptrToInt on *void", - \\export fn entry() bool { - \\ return @ptrToInt(&{}) == @ptrToInt(&{}); - \\} - , &[_][]const u8{ - "tmp.zig:2:23: error: pointer to size 0 type has no address", - }); - - ctx.objErrStage1("@popCount - non-integer", - \\export fn entry(x: f32) u32 { - \\ return @popCount(f32, x); - \\} - , &[_][]const u8{ - "tmp.zig:2:22: error: expected integer type, found 'f32'", - }); - { const case = ctx.obj("wrong same named struct", .{}); case.backend = .stage1; @@ -4066,2558 +275,6 @@ pub fn addCases(ctx: *TestContext) !void { }); } - ctx.objErrStage1("@floatToInt comptime safety", - \\comptime { - \\ _ = @floatToInt(i8, @as(f32, -129.1)); - \\} - \\comptime { - \\ _ = @floatToInt(u8, @as(f32, -1.1)); - \\} - \\comptime { - \\ _ = @floatToInt(u8, @as(f32, 256.1)); - \\} - , &[_][]const u8{ - "tmp.zig:2:9: error: integer value '-129' cannot be stored in type 'i8'", - "tmp.zig:5:9: error: integer value '-1' cannot be stored in type 'u8'", - "tmp.zig:8:9: error: integer value '256' cannot be stored in type 'u8'", - }); - - ctx.objErrStage1("use anyopaque as return type of fn ptr", - \\export fn entry() void { - \\ const a: fn () anyopaque = undefined; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:2:20: error: return type cannot be opaque", - }); - - ctx.objErrStage1("use implicit casts to assign null to non-nullable pointer", - \\export fn entry() void { - \\ var x: i32 = 1234; - \\ var p: *i32 = &x; - \\ var pp: *?*i32 = &p; - \\ pp.* = null; - \\ var y = p.*; - \\ _ = y; - \\} - , &[_][]const u8{ - "tmp.zig:4:23: error: expected type '*?*i32', found '**i32'", - }); - - ctx.objErrStage1("attempted implicit cast from T to [*]const T", - \\export fn entry() void { - \\ const x: [*]const bool = true; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:30: error: expected type '[*]const bool', found 'bool'", - }); - - ctx.objErrStage1("dereference unknown length pointer", - \\export fn entry(x: [*]i32) i32 { - \\ return x.*; - \\} - , &[_][]const u8{ - "tmp.zig:2:13: error: index syntax required for unknown-length pointer type '[*]i32'", - }); - - ctx.objErrStage1("field access of unknown length pointer", - \\const Foo = extern struct { - \\ a: i32, - \\}; - \\ - \\export fn entry(foo: [*]Foo) void { - \\ foo.a += 1; - \\} - , &[_][]const u8{ - "tmp.zig:6:8: error: type '[*]Foo' does not support field access", - }); - - ctx.objErrStage1("unknown length pointer to opaque", - \\export const T = [*]opaque {}; - , &[_][]const u8{ - "tmp.zig:1:21: error: unknown-length pointer to opaque", - }); - - ctx.objErrStage1("error when evaluating return type", - \\const Foo = struct { - \\ map: @as(i32, i32), - \\ - \\ fn init() Foo { - \\ return undefined; - \\ } - \\}; - \\export fn entry() void { - \\ var rule_set = try Foo.init(); - \\ _ = rule_set; - \\} - , &[_][]const u8{ - "tmp.zig:2:19: error: expected type 'i32', found 'type'", - }); - - ctx.objErrStage1("slicing single-item pointer", - \\export fn entry(ptr: *i32) void { - \\ const slice = ptr[0..2]; - \\ _ = slice; - \\} - , &[_][]const u8{ - "tmp.zig:2:22: error: slice of single-item pointer", - }); - - ctx.objErrStage1("indexing single-item pointer", - \\export fn entry(ptr: *i32) i32 { - \\ return ptr[1]; - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: index of single-item pointer", - }); - - ctx.objErrStage1("nested error set mismatch", - \\const NextError = error{NextError}; - \\const OtherError = error{OutOfMemory}; - \\ - \\export fn entry() void { - \\ const a: ?NextError!i32 = foo(); - \\ _ = a; - \\} - \\ - \\fn foo() ?OtherError!i32 { - \\ return null; - \\} - , &[_][]const u8{ - "tmp.zig:5:34: error: expected type '?NextError!i32', found '?OtherError!i32'", - "tmp.zig:5:34: note: optional type child 'OtherError!i32' cannot cast into optional type child 'NextError!i32'", - "tmp.zig:5:34: note: error set 'OtherError' cannot cast into error set 'NextError'", - "tmp.zig:2:26: note: 'error.OutOfMemory' not a member of destination error set", - }); - - ctx.objErrStage1("invalid deref on switch target", - \\comptime { - \\ var tile = Tile.Empty; - \\ switch (tile.*) { - \\ Tile.Empty => {}, - \\ Tile.Filled => {}, - \\ } - \\} - \\const Tile = enum { - \\ Empty, - \\ Filled, - \\}; - , &[_][]const u8{ - "tmp.zig:3:17: error: attempt to dereference non-pointer type 'Tile'", - }); - - ctx.objErrStage1("invalid field access in comptime", - \\comptime { var x = doesnt_exist.whatever; _ = x; } - , &[_][]const u8{ - "tmp.zig:1:20: error: use of undeclared identifier 'doesnt_exist'", - }); - - ctx.objErrStage1("suspend inside suspend block", - \\export fn entry() void { - \\ _ = async foo(); - \\} - \\fn foo() void { - \\ suspend { - \\ suspend { - \\ } - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:6:9: error: cannot suspend inside suspend block", - "tmp.zig:5:5: note: other suspend block here", - }); - - ctx.objErrStage1("assign inline fn to non-comptime var", - \\export fn entry() void { - \\ var a = b; - \\ _ = a; - \\} - \\fn b() callconv(.Inline) void { } - , &[_][]const u8{ - "tmp.zig:2:5: error: functions marked inline must be stored in const or comptime var", - "tmp.zig:5:1: note: declared here", - }); - - ctx.objErrStage1("wrong type passed to @panic", - \\export fn entry() void { - \\ var e = error.Foo; - \\ @panic(e); - \\} - , &[_][]const u8{ - "tmp.zig:3:12: error: expected type '[]const u8', found 'error{Foo}'", - }); - - ctx.objErrStage1("@tagName used on union with no associated enum tag", - \\const FloatInt = extern union { - \\ Float: f32, - \\ Int: i32, - \\}; - \\export fn entry() void { - \\ var fi = FloatInt{.Float = 123.45}; - \\ var tagName = @tagName(fi); - \\ _ = tagName; - \\} - , &[_][]const u8{ - "tmp.zig:7:19: error: union has no associated enum", - "tmp.zig:1:18: note: declared here", - }); - - ctx.objErrStage1("returning error from void async function", - \\export fn entry() void { - \\ _ = async amain(); - \\} - \\fn amain() callconv(.Async) void { - \\ return error.ShouldBeCompileError; - \\} - , &[_][]const u8{ - "tmp.zig:5:17: error: expected type 'void', found 'error{ShouldBeCompileError}'", - }); - - ctx.objErrStage1("@ptrCast discards const qualifier", - \\export fn entry() void { - \\ const x: i32 = 1234; - \\ const y = @ptrCast(*i32, &x); - \\ _ = y; - \\} - , &[_][]const u8{ - "tmp.zig:3:15: error: cast discards const qualifier", - }); - - ctx.objErrStage1("comptime slice of undefined pointer non-zero len", - \\export fn entry() void { - \\ const slice = @as([*]i32, undefined)[0..1]; - \\ _ = slice; - \\} - , &[_][]const u8{ - "tmp.zig:2:41: error: non-zero length slice of undefined pointer", - }); - - ctx.objErrStage1("type checking function pointers", - \\fn a(b: fn (*const u8) void) void { - \\ b('a'); - \\} - \\fn c(d: u8) void {_ = d;} - \\export fn entry() void { - \\ a(c); - \\} - , &[_][]const u8{ - "tmp.zig:6:7: error: expected type 'fn(*const u8) void', found 'fn(u8) void'", - }); - - ctx.objErrStage1("no else prong on switch on global error set", - \\export fn entry() void { - \\ foo(error.A); - \\} - \\fn foo(a: anyerror) void { - \\ switch (a) { - \\ error.A => {}, - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:5:5: error: else prong required when switching on type 'anyerror'", - }); - - ctx.objErrStage1("error not handled in switch", - \\export fn entry() void { - \\ foo(452) catch |err| switch (err) { - \\ error.Foo => {}, - \\ }; - \\} - \\fn foo(x: i32) !void { - \\ switch (x) { - \\ 0 ... 10 => return error.Foo, - \\ 11 ... 20 => return error.Bar, - \\ 21 ... 30 => return error.Baz, - \\ else => {}, - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:2:26: error: error.Baz not handled in switch", - "tmp.zig:2:26: error: error.Bar not handled in switch", - }); - - ctx.objErrStage1("duplicate error in switch", - \\export fn entry() void { - \\ foo(452) catch |err| switch (err) { - \\ error.Foo => {}, - \\ error.Bar => {}, - \\ error.Foo => {}, - \\ else => {}, - \\ }; - \\} - \\fn foo(x: i32) !void { - \\ switch (x) { - \\ 0 ... 10 => return error.Foo, - \\ 11 ... 20 => return error.Bar, - \\ else => {}, - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:5:14: error: duplicate switch value: '@typeInfo(@typeInfo(@TypeOf(foo)).Fn.return_type.?).ErrorUnion.error_set.Foo'", - "tmp.zig:3:14: note: other value here", - }); - - ctx.objErrStage1("invalid cast from integral type to enum", - \\const E = enum(usize) { One, Two }; - \\ - \\export fn entry() void { - \\ foo(1); - \\} - \\ - \\fn foo(x: usize) void { - \\ switch (x) { - \\ E.One => {}, - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:9:10: error: expected type 'usize', found 'E'", - }); - - ctx.objErrStage1("range operator in switch used on error set", - \\export fn entry() void { - \\ try foo(452) catch |err| switch (err) { - \\ error.A ... error.B => {}, - \\ else => {}, - \\ }; - \\} - \\fn foo(x: i32) !void { - \\ switch (x) { - \\ 0 ... 10 => return error.Foo, - \\ 11 ... 20 => return error.Bar, - \\ else => {}, - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:3:17: error: operator not allowed for errors", - }); - - ctx.objErrStage1("inferring error set of function pointer", - \\comptime { - \\ const z: ?fn()!void = null; - \\} - , &[_][]const u8{ - "tmp.zig:2:19: error: function prototype may not have inferred error set", - }); - - ctx.objErrStage1("access non-existent member of error set", - \\const Foo = error{A}; - \\comptime { - \\ const z = Foo.Bar; - \\ _ = z; - \\} - , &[_][]const u8{ - "tmp.zig:3:18: error: no error named 'Bar' in 'Foo'", - }); - - ctx.objErrStage1("error union operator with non error set LHS", - \\comptime { - \\ const z = i32!i32; - \\ var x: z = undefined; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: expected error set type, found type 'i32'", - }); - - ctx.objErrStage1("error equality but sets have no common members", - \\const Set1 = error{A, C}; - \\const Set2 = error{B, D}; - \\export fn entry() void { - \\ foo(Set1.A); - \\} - \\fn foo(x: Set1) void { - \\ if (x == Set2.B) { - \\ - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:7:11: error: error sets 'Set1' and 'Set2' have no common errors", - }); - - ctx.objErrStage1("only equality binary operator allowed for error sets", - \\comptime { - \\ const z = error.A > error.B; - \\ _ = z; - \\} - , &[_][]const u8{ - "tmp.zig:2:23: error: operator not allowed for errors", - }); - - ctx.objErrStage1("explicit error set cast known at comptime violates error sets", - \\const Set1 = error {A, B}; - \\const Set2 = error {A, C}; - \\comptime { - \\ var x = Set1.B; - \\ var y = @errSetCast(Set2, x); - \\ _ = y; - \\} - , &[_][]const u8{ - "tmp.zig:5:13: error: error.B not a member of error set 'Set2'", - }); - - ctx.objErrStage1("cast error union of global error set to error union of smaller error set", - \\const SmallErrorSet = error{A}; - \\export fn entry() void { - \\ var x: SmallErrorSet!i32 = foo(); - \\ _ = x; - \\} - \\fn foo() anyerror!i32 { - \\ return error.B; - \\} - , &[_][]const u8{ - "tmp.zig:3:35: error: expected type 'SmallErrorSet!i32', found 'anyerror!i32'", - "tmp.zig:3:35: note: error set 'anyerror' cannot cast into error set 'SmallErrorSet'", - "tmp.zig:3:35: note: cannot cast global error set into smaller set", - }); - - ctx.objErrStage1("cast global error set to error set", - \\const SmallErrorSet = error{A}; - \\export fn entry() void { - \\ var x: SmallErrorSet = foo(); - \\ _ = x; - \\} - \\fn foo() anyerror { - \\ return error.B; - \\} - , &[_][]const u8{ - "tmp.zig:3:31: error: expected type 'SmallErrorSet', found 'anyerror'", - "tmp.zig:3:31: note: cannot cast global error set into smaller set", - }); - ctx.objErrStage1("recursive inferred error set", - \\export fn entry() void { - \\ foo() catch unreachable; - \\} - \\fn foo() !void { - \\ try foo(); - \\} - , &[_][]const u8{ - "tmp.zig:5:5: error: cannot resolve inferred error set '@typeInfo(@typeInfo(@TypeOf(foo)).Fn.return_type.?).ErrorUnion.error_set': function 'foo' not fully analyzed yet", - }); - - ctx.objErrStage1("implicit cast of error set not a subset", - \\const Set1 = error{A, B}; - \\const Set2 = error{A, C}; - \\export fn entry() void { - \\ foo(Set1.B); - \\} - \\fn foo(set1: Set1) void { - \\ var x: Set2 = set1; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:7:19: error: expected type 'Set2', found 'Set1'", - "tmp.zig:1:23: note: 'error.B' not a member of destination error set", - }); - - ctx.objErrStage1("int to err global invalid number", - \\const Set1 = error{ - \\ A, - \\ B, - \\}; - \\comptime { - \\ var x: u16 = 3; - \\ var y = @intToError(x); - \\ _ = y; - \\} - , &[_][]const u8{ - "tmp.zig:7:13: error: integer value 3 represents no error", - }); - - ctx.objErrStage1("int to err non global invalid number", - \\const Set1 = error{ - \\ A, - \\ B, - \\}; - \\const Set2 = error{ - \\ A, - \\ C, - \\}; - \\comptime { - \\ var x = @errorToInt(Set1.B); - \\ var y = @errSetCast(Set2, @intToError(x)); - \\ _ = y; - \\} - , &[_][]const u8{ - "tmp.zig:11:13: error: error.B not a member of error set 'Set2'", - }); - - ctx.objErrStage1("duplicate error value in error set", - \\const Foo = error { - \\ Bar, - \\ Bar, - \\}; - \\export fn entry() void { - \\ const a: Foo = undefined; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: duplicate error set field 'Bar'", - "tmp.zig:2:5: note: previous declaration here", - }); - - ctx.objErrStage1("cast negative integer literal to usize", - \\export fn entry() void { - \\ const x = @as(usize, -10); - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:26: error: cannot cast negative value -10 to unsigned integer type 'usize'", - }); - - ctx.objErrStage1("use invalid number literal as array index", - \\var v = 25; - \\export fn entry() void { - \\ var arr: [v]u8 = undefined; - \\ _ = arr; - \\} - , &[_][]const u8{ - "tmp.zig:1:1: error: unable to infer variable type", - }); - - ctx.objErrStage1("duplicate struct field", - \\const Foo = struct { - \\ Bar: i32, - \\ Bar: usize, - \\}; - \\export fn entry() void { - \\ const a: Foo = undefined; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: duplicate struct field: 'Bar'", - "tmp.zig:2:5: note: other field here", - }); - - ctx.objErrStage1("duplicate union field", - \\const Foo = union { - \\ Bar: i32, - \\ Bar: usize, - \\}; - \\export fn entry() void { - \\ const a: Foo = undefined; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: duplicate union field: 'Bar'", - "tmp.zig:2:5: note: other field here", - }); - - ctx.objErrStage1("duplicate enum field", - \\const Foo = enum { - \\ Bar, - \\ Bar, - \\}; - \\ - \\export fn entry() void { - \\ const a: Foo = undefined; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: duplicate enum field: 'Bar'", - "tmp.zig:2:5: note: other field here", - }); - - ctx.objErrStage1("calling function with naked calling convention", - \\export fn entry() void { - \\ foo(); - \\} - \\fn foo() callconv(.Naked) void { } - , &[_][]const u8{ - "tmp.zig:2:5: error: unable to call function with naked calling convention", - "tmp.zig:4:1: note: declared here", - }); - - ctx.objErrStage1("function with invalid return type", - \\export fn foo() boid {} - , &[_][]const u8{ - "tmp.zig:1:17: error: use of undeclared identifier 'boid'", - }); - - ctx.objErrStage1("function with non-extern non-packed enum parameter", - \\const Foo = enum { A, B, C }; - \\export fn entry(foo: Foo) void { _ = foo; } - , &[_][]const u8{ - "tmp.zig:2:22: error: parameter of type 'Foo' not allowed in function with calling convention 'C'", - }); - - ctx.objErrStage1("function with non-extern non-packed struct parameter", - \\const Foo = struct { - \\ A: i32, - \\ B: f32, - \\ C: bool, - \\}; - \\export fn entry(foo: Foo) void { _ = foo; } - , &[_][]const u8{ - "tmp.zig:6:22: error: parameter of type 'Foo' not allowed in function with calling convention 'C'", - }); - - ctx.objErrStage1("function with non-extern non-packed union parameter", - \\const Foo = union { - \\ A: i32, - \\ B: f32, - \\ C: bool, - \\}; - \\export fn entry(foo: Foo) void { _ = foo; } - , &[_][]const u8{ - "tmp.zig:6:22: error: parameter of type 'Foo' not allowed in function with calling convention 'C'", - }); - - ctx.objErrStage1("switch on enum with 1 field with no prongs", - \\const Foo = enum { M }; - \\ - \\export fn entry() void { - \\ var f = Foo.M; - \\ switch (f) {} - \\} - , &[_][]const u8{ - "tmp.zig:5:5: error: enumeration value 'Foo.M' not handled in switch", - }); - - ctx.objErrStage1("shift by negative comptime integer", - \\comptime { - \\ var a = 1 >> -1; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:2:18: error: shift by negative value -1", - }); - - ctx.objErrStage1("@panic called at compile time", - \\export fn entry() void { - \\ comptime { - \\ @panic("aoeu",); - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: encountered @panic at compile-time", - }); - - ctx.objErrStage1("wrong return type for main", - \\pub fn main() f32 { } - , &[_][]const u8{ - "error: expected return type of main to be 'void', '!void', 'noreturn', 'u8', or '!u8'", - }); - - ctx.objErrStage1("double ?? on main return value", - \\pub fn main() ??void { - \\} - , &[_][]const u8{ - "error: expected return type of main to be 'void', '!void', 'noreturn', 'u8', or '!u8'", - }); - - ctx.objErrStage1("bad identifier in function with struct defined inside function which references local const", - \\export fn entry() void { - \\ const BlockKind = u32; - \\ - \\ const Block = struct { - \\ kind: BlockKind, - \\ }; - \\ - \\ bogus; - \\ - \\ _ = Block; - \\} - , &[_][]const u8{ - "tmp.zig:8:5: error: use of undeclared identifier 'bogus'", - }); - - ctx.objErrStage1("labeled break not found", - \\export fn entry() void { - \\ blah: while (true) { - \\ while (true) { - \\ break :outer; - \\ } - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:4:20: error: label not found: 'outer'", - }); - - ctx.objErrStage1("labeled continue not found", - \\export fn entry() void { - \\ var i: usize = 0; - \\ blah: while (i < 10) : (i += 1) { - \\ while (true) { - \\ continue :outer; - \\ } - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:5:23: error: label not found: 'outer'", - }); - - ctx.objErrStage1("attempt to use 0 bit type in extern fn", - \\extern fn foo(ptr: fn(*void) callconv(.C) void) void; - \\ - \\export fn entry() void { - \\ foo(bar); - \\} - \\ - \\fn bar(x: *void) callconv(.C) void { _ = x; } - \\export fn entry2() void { - \\ bar(&{}); - \\} - , &[_][]const u8{ - "tmp.zig:1:23: error: parameter of type '*void' has 0 bits; not allowed in function with calling convention 'C'", - "tmp.zig:7:11: error: parameter of type '*void' has 0 bits; not allowed in function with calling convention 'C'", - }); - - ctx.objErrStage1("implicit semicolon - block statement", - \\export fn entry() void { - \\ {} - \\ var good = {}; - \\ ({}) - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:9: error: expected ';' after statement", - }); - - ctx.objErrStage1("implicit semicolon - block expr", - \\export fn entry() void { - \\ _ = {}; - \\ var good = {}; - \\ _ = {} - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:11: error: expected ';' after statement", - }); - - ctx.objErrStage1("implicit semicolon - comptime statement", - \\export fn entry() void { - \\ comptime {} - \\ var good = {}; - \\ comptime ({}) - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:18: error: expected ';' after statement", - }); - - ctx.objErrStage1("implicit semicolon - comptime expression", - \\export fn entry() void { - \\ _ = comptime {}; - \\ var good = {}; - \\ _ = comptime {} - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:20: error: expected ';' after statement", - }); - - ctx.objErrStage1("implicit semicolon - defer", - \\export fn entry() void { - \\ defer {} - \\ var good = {}; - \\ defer ({}) - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:15: error: expected ';' after statement", - }); - - ctx.objErrStage1("implicit semicolon - if statement", - \\export fn entry() void { - \\ if(true) {} - \\ var good = {}; - \\ if(true) ({}) - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:18: error: expected ';' or 'else' after statement", - }); - - ctx.objErrStage1("implicit semicolon - if expression", - \\export fn entry() void { - \\ _ = if(true) {}; - \\ var good = {}; - \\ _ = if(true) {} - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:20: error: expected ';' after statement", - }); - - ctx.objErrStage1("implicit semicolon - if-else statement", - \\export fn entry() void { - \\ if(true) {} else {} - \\ var good = {}; - \\ if(true) ({}) else ({}) - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:28: error: expected ';' after statement", - }); - - ctx.objErrStage1("implicit semicolon - if-else expression", - \\export fn entry() void { - \\ _ = if(true) {} else {}; - \\ var good = {}; - \\ _ = if(true) {} else {} - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:28: error: expected ';' after statement", - }); - - ctx.objErrStage1("implicit semicolon - if-else-if statement", - \\export fn entry() void { - \\ if(true) {} else if(true) {} - \\ var good = {}; - \\ if(true) ({}) else if(true) ({}) - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:37: error: expected ';' or 'else' after statement", - }); - - ctx.objErrStage1("implicit semicolon - if-else-if expression", - \\export fn entry() void { - \\ _ = if(true) {} else if(true) {}; - \\ var good = {}; - \\ _ = if(true) {} else if(true) {} - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:37: error: expected ';' after statement", - }); - - ctx.objErrStage1("implicit semicolon - if-else-if-else statement", - \\export fn entry() void { - \\ if(true) {} else if(true) {} else {} - \\ var good = {}; - \\ if(true) ({}) else if(true) ({}) else ({}) - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:47: error: expected ';' after statement", - }); - - ctx.objErrStage1("implicit semicolon - if-else-if-else expression", - \\export fn entry() void { - \\ _ = if(true) {} else if(true) {} else {}; - \\ var good = {}; - \\ _ = if(true) {} else if(true) {} else {} - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:45: error: expected ';' after statement", - }); - - ctx.objErrStage1("implicit semicolon - test statement", - \\export fn entry() void { - \\ if (foo()) |_| {} - \\ var good = {}; - \\ if (foo()) |_| ({}) - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:24: error: expected ';' or 'else' after statement", - }); - - ctx.objErrStage1("implicit semicolon - test expression", - \\export fn entry() void { - \\ _ = if (foo()) |_| {}; - \\ var good = {}; - \\ _ = if (foo()) |_| {} - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:26: error: expected ';' after statement", - }); - - ctx.objErrStage1("implicit semicolon - while statement", - \\export fn entry() void { - \\ while(true) {} - \\ var good = {}; - \\ while(true) 1 - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:18: error: expected ';' or 'else' after statement", - }); - - ctx.objErrStage1("implicit semicolon - while expression", - \\export fn entry() void { - \\ _ = while(true) {}; - \\ var good = {}; - \\ _ = while(true) {} - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:23: error: expected ';' after statement", - }); - - ctx.objErrStage1("implicit semicolon - while-continue statement", - \\export fn entry() void { - \\ while(true):({}) {} - \\ var good = {}; - \\ while(true):({}) ({}) - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:26: error: expected ';' or 'else' after statement", - }); - - ctx.objErrStage1("implicit semicolon - while-continue expression", - \\export fn entry() void { - \\ _ = while(true):({}) {}; - \\ var good = {}; - \\ _ = while(true):({}) {} - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:28: error: expected ';' after statement", - }); - - ctx.objErrStage1("implicit semicolon - for statement", - \\export fn entry() void { - \\ for(foo()) |_| {} - \\ var good = {}; - \\ for(foo()) |_| ({}) - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:24: error: expected ';' or 'else' after statement", - }); - - ctx.objErrStage1("implicit semicolon - for expression", - \\export fn entry() void { - \\ _ = for(foo()) |_| {}; - \\ var good = {}; - \\ _ = for(foo()) |_| {} - \\ var bad = {}; - \\} - , &[_][]const u8{ - "tmp.zig:4:26: error: expected ';' after statement", - }); - - ctx.objErrStage1("multiple function definitions", - \\fn a() void {} - \\fn a() void {} - \\export fn entry() void { a(); } - , &[_][]const u8{ - "tmp.zig:2:1: error: redeclaration of 'a'", - "tmp.zig:1:1: note: other declaration here", - }); - - ctx.objErrStage1("unreachable with return", - \\fn a() noreturn {return;} - \\export fn entry() void { a(); } - , &[_][]const u8{ - "tmp.zig:1:18: error: expected type 'noreturn', found 'void'", - }); - - ctx.objErrStage1("control reaches end of non-void function", - \\fn a() i32 {} - \\export fn entry() void { _ = a(); } - , &[_][]const u8{ - "tmp.zig:1:12: error: expected type 'i32', found 'void'", - }); - - ctx.objErrStage1("undefined function call", - \\export fn a() void { - \\ b(); - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: use of undeclared identifier 'b'", - }); - - ctx.objErrStage1("wrong number of arguments", - \\export fn a() void { - \\ c(1); - \\} - \\fn c(d: i32, e: i32, f: i32) void { _ = d; _ = e; _ = f; } - , &[_][]const u8{ - "tmp.zig:2:6: error: expected 3 argument(s), found 1", - }); - - ctx.objErrStage1("invalid type", - \\fn a() bogus {} - \\export fn entry() void { _ = a(); } - , &[_][]const u8{ - "tmp.zig:1:8: error: use of undeclared identifier 'bogus'", - }); - - ctx.objErrStage1("pointer to noreturn", - \\fn a() *noreturn {} - \\export fn entry() void { _ = a(); } - , &[_][]const u8{ - "tmp.zig:1:9: error: pointer to noreturn not allowed", - }); - - ctx.objErrStage1("unreachable code", - \\export fn a() void { - \\ return; - \\ b(); - \\} - \\ - \\fn b() void {} - , &[_][]const u8{ - "tmp.zig:3:6: error: unreachable code", - "tmp.zig:2:5: note: control flow is diverted here", - }); - - ctx.objErrStage1("unreachable code - nested returns", - \\export fn a() i32 { - \\ return return 1; - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: unreachable code", - "tmp.zig:2:12: note: control flow is diverted here", - }); - - ctx.objErrStage1("unreachable code - double break", - \\export fn a() void { - \\ const b = blk: { - \\ break :blk break :blk @as(u32, 1); - \\ }; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: unreachable code", - "tmp.zig:3:20: note: control flow is diverted here", - }); - - ctx.objErrStage1("chained comparison operators", - \\export fn a(value: u32) bool { - \\ return 1 < value < 1000; - \\} - , &[_][]const u8{ - "tmp.zig:2:22: error: comparison operators cannot be chained", - }); - - ctx.objErrStage1("bad import", - \\const bogus = @import("bogus-does-not-exist.zig",); - , &[_][]const u8{ - "tmp.zig:1:23: error: unable to load '${DIR}bogus-does-not-exist.zig': FileNotFound", - }); - - ctx.objErrStage1("undeclared identifier", - \\export fn a() void { - \\ return - \\ b + - \\ c; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: use of undeclared identifier 'b'", - }); - - ctx.objErrStage1("parameter redeclaration", - \\fn f(a : i32, a : i32) void { - \\} - \\export fn entry() void { f(1, 2); } - , &[_][]const u8{ - "tmp.zig:1:15: error: redeclaration of function parameter 'a'", - "tmp.zig:1:6: note: previous declaration here", - }); - - ctx.objErrStage1("local variable redeclaration", - \\export fn f() void { - \\ const a : i32 = 0; - \\ var a = 0; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: redeclaration of local constant 'a'", - "tmp.zig:2:11: note: previous declaration here", - }); - - ctx.objErrStage1("local variable redeclares parameter", - \\fn f(a : i32) void { - \\ const a = 0; - \\} - \\export fn entry() void { f(1); } - , &[_][]const u8{ - "tmp.zig:2:11: error: redeclaration of function parameter 'a'", - "tmp.zig:1:6: note: previous declaration here", - }); - - ctx.objErrStage1("variable has wrong type", - \\export fn f() i32 { - \\ const a = "a"; - \\ return a; - \\} - , &[_][]const u8{ - "tmp.zig:3:12: error: expected type 'i32', found '*const [1:0]u8'", - }); - - ctx.objErrStage1("if condition is bool, not int", - \\export fn f() void { - \\ if (0) {} - \\} - , &[_][]const u8{ - "tmp.zig:2:9: error: expected type 'bool', found 'comptime_int'", - }); - - ctx.objErrStage1("assign unreachable", - \\export fn f() void { - \\ const a = return; - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: unreachable code", - "tmp.zig:2:15: note: control flow is diverted here", - }); - - ctx.objErrStage1("unreachable variable", - \\export fn f() void { - \\ const a: noreturn = {}; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:2:25: error: expected type 'noreturn', found 'void'", - }); - - ctx.objErrStage1("unreachable parameter", - \\fn f(a: noreturn) void { _ = a; } - \\export fn entry() void { f(); } - , &[_][]const u8{ - "tmp.zig:1:9: error: parameter of type 'noreturn' not allowed", - }); - - ctx.objErrStage1("assign to constant variable", - \\export fn f() void { - \\ const a = 3; - \\ a = 4; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: cannot assign to constant", - }); - - ctx.objErrStage1("use of undeclared identifier", - \\export fn f() void { - \\ b = 3; - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: use of undeclared identifier 'b'", - }); - - ctx.objErrStage1("const is a statement, not an expression", - \\export fn f() void { - \\ (const a = 0); - \\} - , &[_][]const u8{ - "tmp.zig:2:6: error: expected expression, found 'const'", - }); - - ctx.objErrStage1("array access of undeclared identifier", - \\export fn f() void { - \\ i[i] = i[i]; - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: use of undeclared identifier 'i'", - }); - - ctx.objErrStage1("array access of non array", - \\export fn f() void { - \\ var bad : bool = undefined; - \\ bad[0] = bad[0]; - \\} - \\export fn g() void { - \\ var bad : bool = undefined; - \\ _ = bad[0]; - \\} - , &[_][]const u8{ - "tmp.zig:3:8: error: array access of non-array type 'bool'", - "tmp.zig:7:12: error: array access of non-array type 'bool'", - }); - - ctx.objErrStage1("array access with non integer index", - \\export fn f() void { - \\ var array = "aoeu"; - \\ var bad = false; - \\ array[bad] = array[bad]; - \\} - \\export fn g() void { - \\ var array = "aoeu"; - \\ var bad = false; - \\ _ = array[bad]; - \\} - , &[_][]const u8{ - "tmp.zig:4:11: error: expected type 'usize', found 'bool'", - "tmp.zig:9:15: error: expected type 'usize', found 'bool'", - }); - - ctx.objErrStage1("write to const global variable", - \\const x : i32 = 99; - \\fn f() void { - \\ x = 1; - \\} - \\export fn entry() void { f(); } - , &[_][]const u8{ - "tmp.zig:3:9: error: cannot assign to constant", - }); - - ctx.objErrStage1("missing else clause", - \\fn f(b: bool) void { - \\ const x : i32 = if (b) h: { break :h 1; }; - \\ _ = x; - \\} - \\fn g(b: bool) void { - \\ const y = if (b) h: { break :h @as(i32, 1); }; - \\ _ = y; - \\} - \\export fn entry() void { f(true); g(true); } - , &[_][]const u8{ - "tmp.zig:2:21: error: expected type 'i32', found 'void'", - "tmp.zig:6:15: error: incompatible types: 'i32' and 'void'", - }); - - ctx.objErrStage1("invalid struct field", - \\const A = struct { x : i32, }; - \\export fn f() void { - \\ var a : A = undefined; - \\ a.foo = 1; - \\ const y = a.bar; - \\ _ = y; - \\} - \\export fn g() void { - \\ var a : A = undefined; - \\ const y = a.bar; - \\ _ = y; - \\} - , &[_][]const u8{ - "tmp.zig:4:6: error: no member named 'foo' in struct 'A'", - "tmp.zig:10:16: error: no member named 'bar' in struct 'A'", - }); - - ctx.objErrStage1("redefinition of struct", - \\const A = struct { x : i32, }; - \\const A = struct { y : i32, }; - , &[_][]const u8{ - "tmp.zig:2:1: error: redeclaration of 'A'", - "tmp.zig:1:1: note: other declaration here", - }); - - ctx.objErrStage1("redefinition of enums", - \\const A = enum {x}; - \\const A = enum {x}; - , &[_][]const u8{ - "tmp.zig:2:1: error: redeclaration of 'A'", - "tmp.zig:1:1: note: other declaration here", - }); - - ctx.objErrStage1("redefinition of global variables", - \\var a : i32 = 1; - \\var a : i32 = 2; - , &[_][]const u8{ - "tmp.zig:2:1: error: redeclaration of 'a'", - "tmp.zig:1:1: note: other declaration here", - }); - - ctx.objErrStage1("duplicate field in struct value expression", - \\const A = struct { - \\ x : i32, - \\ y : i32, - \\ z : i32, - \\}; - \\export fn f() void { - \\ const a = A { - \\ .z = 1, - \\ .y = 2, - \\ .x = 3, - \\ .z = 4, - \\ }; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:11:9: error: duplicate field", - }); - - ctx.objErrStage1("missing field in struct value expression", - \\const A = struct { - \\ x : i32, - \\ y : i32, - \\ z : i32, - \\}; - \\export fn f() void { - \\ // we want the error on the '{' not the 'A' because - \\ // the A could be a complicated expression - \\ const a = A { - \\ .z = 4, - \\ .y = 2, - \\ }; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:9:17: error: missing field: 'x'", - }); - - ctx.objErrStage1("invalid field in struct value expression", - \\const A = struct { - \\ x : i32, - \\ y : i32, - \\ z : i32, - \\}; - \\export fn f() void { - \\ const a = A { - \\ .z = 4, - \\ .y = 2, - \\ .foo = 42, - \\ }; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:10:9: error: no member named 'foo' in struct 'A'", - }); - - ctx.objErrStage1("invalid break expression", - \\export fn f() void { - \\ break; - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: break expression outside loop", - }); - - ctx.objErrStage1("invalid continue expression", - \\export fn f() void { - \\ continue; - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: continue expression outside loop", - }); - - ctx.objErrStage1("invalid maybe type", - \\export fn f() void { - \\ if (true) |x| { _ = x; } - \\} - , &[_][]const u8{ - "tmp.zig:2:9: error: expected optional type, found 'bool'", - }); - - ctx.objErrStage1("cast unreachable", - \\fn f() i32 { - \\ return @as(i32, return 1); - \\} - \\export fn entry() void { _ = f(); } - , &[_][]const u8{ - "tmp.zig:2:12: error: unreachable code", - "tmp.zig:2:21: note: control flow is diverted here", - }); - - ctx.objErrStage1("invalid builtin fn", - \\fn f() @bogus(foo) { - \\} - \\export fn entry() void { _ = f(); } - , &[_][]const u8{ - "tmp.zig:1:8: error: invalid builtin function: '@bogus'", - }); - - ctx.objErrStage1("noalias on non pointer param", - \\fn f(noalias x: i32) void { _ = x; } - \\export fn entry() void { f(1234); } - , &[_][]const u8{ - "tmp.zig:1:6: error: noalias on non-pointer parameter", - }); - - ctx.objErrStage1("struct init syntax for array", - \\const foo = [3]u16{ .x = 1024 }; - \\comptime { - \\ _ = foo; - \\} - , &[_][]const u8{ - "tmp.zig:1:13: error: initializing array with struct syntax", - }); - - ctx.objErrStage1("type variables must be constant", - \\var foo = u8; - \\export fn entry() foo { - \\ return 1; - \\} - , &[_][]const u8{ - "tmp.zig:1:1: error: variable of type 'type' must be constant", - }); - - ctx.objErrStage1("parameter shadowing global", - \\const Foo = struct {}; - \\fn f(Foo: i32) void {} - \\export fn entry() void { - \\ f(1234); - \\} - , &[_][]const u8{ - "tmp.zig:2:6: error: local shadows declaration of 'Foo'", - "tmp.zig:1:1: note: declared here", - }); - - ctx.objErrStage1("local variable shadowing global", - \\const Foo = struct {}; - \\const Bar = struct {}; - \\ - \\export fn entry() void { - \\ var Bar : i32 = undefined; - \\ _ = Bar; - \\} - , &[_][]const u8{ - "tmp.zig:5:9: error: local shadows declaration of 'Bar'", - "tmp.zig:2:1: note: declared here", - }); - - ctx.objErrStage1("local shadows global that occurs later", - \\pub fn main() void { - \\ var foo = true; - \\ _ = foo; - \\} - \\fn foo() void {} - , &[_][]const u8{ - "tmp.zig:2:9: error: local shadows declaration of 'foo'", - "tmp.zig:5:1: note: declared here", - }); - - ctx.objErrStage1("switch expression - missing enumeration prong", - \\const Number = enum { - \\ One, - \\ Two, - \\ Three, - \\ Four, - \\}; - \\fn f(n: Number) i32 { - \\ switch (n) { - \\ Number.One => 1, - \\ Number.Two => 2, - \\ Number.Three => @as(i32, 3), - \\ } - \\} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(f)); } - , &[_][]const u8{ - "tmp.zig:8:5: error: enumeration value 'Number.Four' not handled in switch", - }); - - ctx.objErrStage1("switch expression - duplicate enumeration prong", - \\const Number = enum { - \\ One, - \\ Two, - \\ Three, - \\ Four, - \\}; - \\fn f(n: Number) i32 { - \\ switch (n) { - \\ Number.One => 1, - \\ Number.Two => 2, - \\ Number.Three => @as(i32, 3), - \\ Number.Four => 4, - \\ Number.Two => 2, - \\ } - \\} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(f)); } - , &[_][]const u8{ - "tmp.zig:13:15: error: duplicate switch value", - "tmp.zig:10:15: note: other value here", - }); - - ctx.objErrStage1("switch expression - duplicate enumeration prong when else present", - \\const Number = enum { - \\ One, - \\ Two, - \\ Three, - \\ Four, - \\}; - \\fn f(n: Number) i32 { - \\ switch (n) { - \\ Number.One => 1, - \\ Number.Two => 2, - \\ Number.Three => @as(i32, 3), - \\ Number.Four => 4, - \\ Number.Two => 2, - \\ else => 10, - \\ } - \\} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(f)); } - , &[_][]const u8{ - "tmp.zig:13:15: error: duplicate switch value", - "tmp.zig:10:15: note: other value here", - }); - - ctx.objErrStage1("switch expression - multiple else prongs", - \\fn f(x: u32) void { - \\ const value: bool = switch (x) { - \\ 1234 => false, - \\ else => true, - \\ else => true, - \\ }; - \\} - \\export fn entry() void { - \\ f(1234); - \\} - , &[_][]const u8{ - "tmp.zig:5:9: error: multiple else prongs in switch expression", - }); - - ctx.objErrStage1("switch expression - non exhaustive integer prongs", - \\fn foo(x: u8) void { - \\ switch (x) { - \\ 0 => {}, - \\ } - \\} - \\export fn entry() usize { return @sizeOf(@TypeOf(foo)); } - , &[_][]const u8{ - "tmp.zig:2:5: error: switch must handle all possibilities", - }); - - ctx.objErrStage1("switch expression - duplicate or overlapping integer value", - \\fn foo(x: u8) u8 { - \\ return switch (x) { - \\ 0 ... 100 => @as(u8, 0), - \\ 101 ... 200 => 1, - \\ 201, 203 ... 207 => 2, - \\ 206 ... 255 => 3, - \\ }; - \\} - \\export fn entry() usize { return @sizeOf(@TypeOf(foo)); } - , &[_][]const u8{ - "tmp.zig:6:9: error: duplicate switch value", - "tmp.zig:5:14: note: previous value here", - }); - - ctx.objErrStage1("switch expression - duplicate type", - \\fn foo(comptime T: type, x: T) u8 { - \\ _ = x; - \\ return switch (T) { - \\ u32 => 0, - \\ u64 => 1, - \\ u32 => 2, - \\ else => 3, - \\ }; - \\} - \\export fn entry() usize { return @sizeOf(@TypeOf(foo(u32, 0))); } - , &[_][]const u8{ - "tmp.zig:6:9: error: duplicate switch value", - "tmp.zig:4:9: note: previous value here", - }); - - ctx.objErrStage1("switch expression - duplicate type (struct alias)", - \\const Test = struct { - \\ bar: i32, - \\}; - \\const Test2 = Test; - \\fn foo(comptime T: type, x: T) u8 { - \\ _ = x; - \\ return switch (T) { - \\ Test => 0, - \\ u64 => 1, - \\ Test2 => 2, - \\ else => 3, - \\ }; - \\} - \\export fn entry() usize { return @sizeOf(@TypeOf(foo(u32, 0))); } - , &[_][]const u8{ - "tmp.zig:10:9: error: duplicate switch value", - "tmp.zig:8:9: note: previous value here", - }); - - ctx.objErrStage1("switch expression - switch on pointer type with no else", - \\fn foo(x: *u8) void { - \\ switch (x) { - \\ &y => {}, - \\ } - \\} - \\const y: u8 = 100; - \\export fn entry() usize { return @sizeOf(@TypeOf(foo)); } - , &[_][]const u8{ - "tmp.zig:2:5: error: else prong required when switching on type '*u8'", - }); - - ctx.objErrStage1("global variable initializer must be constant expression", - \\extern fn foo() i32; - \\const x = foo(); - \\export fn entry() i32 { return x; } - , &[_][]const u8{ - "tmp.zig:2:11: error: unable to evaluate constant expression", - }); - - ctx.objErrStage1("array concatenation with wrong type", - \\const src = "aoeu"; - \\const derp: usize = 1234; - \\const a = derp ++ "foo"; - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(a)); } - , &[_][]const u8{ - "tmp.zig:3:11: error: expected array, found 'usize'", - }); - - ctx.objErrStage1("non compile time array concatenation", - \\fn f() []u8 { - \\ return s ++ "foo"; - \\} - \\var s: [10]u8 = undefined; - \\export fn entry() usize { return @sizeOf(@TypeOf(f)); } - , &[_][]const u8{ - "tmp.zig:2:12: error: unable to evaluate constant expression", - }); - - ctx.objErrStage1("@cImport with bogus include", - \\const c = @cImport(@cInclude("bogus.h")); - \\export fn entry() usize { return @sizeOf(@TypeOf(c.bogo)); } - , &[_][]const u8{ - "tmp.zig:1:11: error: C import failed", - ".h:1:10: note: 'bogus.h' file not found", - }); - - ctx.objErrStage1("address of number literal", - \\const x = 3; - \\const y = &x; - \\fn foo() *const i32 { return y; } - \\export fn entry() usize { return @sizeOf(@TypeOf(foo)); } - , &[_][]const u8{ - "tmp.zig:3:30: error: expected type '*const i32', found '*const comptime_int'", - }); - - ctx.objErrStage1("integer overflow error", - \\const x : u8 = 300; - \\export fn entry() usize { return @sizeOf(@TypeOf(x)); } - , &[_][]const u8{ - "tmp.zig:1:16: error: integer value 300 cannot be coerced to type 'u8'", - }); - - ctx.objErrStage1("invalid shift amount error", - \\const x : u8 = 2; - \\fn f() u16 { - \\ return x << 8; - \\} - \\export fn entry() u16 { return f(); } - , &[_][]const u8{ - "tmp.zig:3:17: error: integer value 8 cannot be coerced to type 'u3'", - }); - - ctx.objErrStage1("missing function call param", - \\const Foo = struct { - \\ a: i32, - \\ b: i32, - \\ - \\ fn member_a(foo: *const Foo) i32 { - \\ return foo.a; - \\ } - \\ fn member_b(foo: *const Foo) i32 { - \\ return foo.b; - \\ } - \\}; - \\ - \\const member_fn_type = @TypeOf(Foo.member_a); - \\const members = [_]member_fn_type { - \\ Foo.member_a, - \\ Foo.member_b, - \\}; - \\ - \\fn f(foo: *const Foo, index: usize) void { - \\ const result = members[index](); - \\ _ = foo; - \\ _ = result; - \\} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(f)); } - , &[_][]const u8{ - "tmp.zig:20:34: error: expected 1 argument(s), found 0", - }); - - ctx.objErrStage1("missing function name", - \\fn () void {} - \\export fn entry() usize { return @sizeOf(@TypeOf(f)); } - , &[_][]const u8{ - "tmp.zig:1:1: error: missing function name", - }); - - ctx.objErrStage1("missing param name", - \\fn f(i32) void {} - \\export fn entry() usize { return @sizeOf(@TypeOf(f)); } - , &[_][]const u8{ - "tmp.zig:1:6: error: missing parameter name", - }); - - ctx.objErrStage1("wrong function type", - \\const fns = [_]fn() void { a, b, c }; - \\fn a() i32 {return 0;} - \\fn b() i32 {return 1;} - \\fn c() i32 {return 2;} - \\export fn entry() usize { return @sizeOf(@TypeOf(fns)); } - , &[_][]const u8{ - "tmp.zig:1:28: error: expected type 'fn() void', found 'fn() i32'", - }); - - ctx.objErrStage1("extern function pointer mismatch", - \\const fns = [_](fn(i32)i32) { a, b, c }; - \\pub fn a(x: i32) i32 {return x + 0;} - \\pub fn b(x: i32) i32 {return x + 1;} - \\export fn c(x: i32) i32 {return x + 2;} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(fns)); } - , &[_][]const u8{ - "tmp.zig:1:37: error: expected type 'fn(i32) i32', found 'fn(i32) callconv(.C) i32'", - }); - - ctx.objErrStage1("colliding invalid top level functions", - \\fn func() bogus {} - \\fn func() bogus {} - \\export fn entry() usize { return @sizeOf(@TypeOf(func)); } - , &[_][]const u8{ - "tmp.zig:2:1: error: redeclaration of 'func'", - "tmp.zig:1:1: note: other declaration here", - }); - - ctx.objErrStage1("non constant expression in array size", - \\const Foo = struct { - \\ y: [get()]u8, - \\}; - \\var global_var: usize = 1; - \\fn get() usize { return global_var; } - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(Foo)); } - , &[_][]const u8{ - "tmp.zig:5:25: error: cannot store runtime value in compile time variable", - "tmp.zig:2:12: note: called from here", - }); - - ctx.objErrStage1("addition with non numbers", - \\const Foo = struct { - \\ field: i32, - \\}; - \\const x = Foo {.field = 1} + Foo {.field = 2}; - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(x)); } - , &[_][]const u8{ - "tmp.zig:4:28: error: invalid operands to binary expression: 'Foo' and 'Foo'", - }); - - ctx.objErrStage1("division by zero", - \\const lit_int_x = 1 / 0; - \\const lit_float_x = 1.0 / 0.0; - \\const int_x = @as(u32, 1) / @as(u32, 0); - \\const float_x = @as(f32, 1.0) / @as(f32, 0.0); - \\ - \\export fn entry1() usize { return @sizeOf(@TypeOf(lit_int_x)); } - \\export fn entry2() usize { return @sizeOf(@TypeOf(lit_float_x)); } - \\export fn entry3() usize { return @sizeOf(@TypeOf(int_x)); } - \\export fn entry4() usize { return @sizeOf(@TypeOf(float_x)); } - , &[_][]const u8{ - "tmp.zig:1:21: error: division by zero", - "tmp.zig:2:25: error: division by zero", - "tmp.zig:3:27: error: division by zero", - "tmp.zig:4:31: error: division by zero", - }); - - ctx.objErrStage1("normal string with newline", - \\const foo = "a - \\b"; - , &[_][]const u8{ - "tmp.zig:1:13: error: expected expression, found 'invalid bytes'", - "tmp.zig:1:15: note: invalid byte: '\\n'", - }); - - ctx.objErrStage1("invalid comparison for function pointers", - \\fn foo() void {} - \\const invalid = foo > foo; - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(invalid)); } - , &[_][]const u8{ - "tmp.zig:2:21: error: operator not allowed for type 'fn() void'", - }); - - ctx.objErrStage1("generic function instance with non-constant expression", - \\fn foo(comptime x: i32, y: i32) i32 { return x + y; } - \\fn test1(a: i32, b: i32) i32 { - \\ return foo(a, b); - \\} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(test1)); } - , &[_][]const u8{ - "tmp.zig:3:16: error: runtime value cannot be passed to comptime arg", - }); - - ctx.objErrStage1("assign null to non-optional pointer", - \\const a: *u8 = null; - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(a)); } - , &[_][]const u8{ - "tmp.zig:1:16: error: expected type '*u8', found '@Type(.Null)'", - }); - - ctx.objErrStage1("indexing an array of size zero", - \\const array = [_]u8{}; - \\export fn foo() void { - \\ const pointer = &array[0]; - \\ _ = pointer; - \\} - , &[_][]const u8{ - "tmp.zig:3:27: error: accessing a zero length array is not allowed", - }); - - ctx.objErrStage1("indexing an array of size zero with runtime index", - \\const array = [_]u8{}; - \\export fn foo() void { - \\ var index: usize = 0; - \\ const pointer = &array[index]; - \\ _ = pointer; - \\} - , &[_][]const u8{ - "tmp.zig:4:27: error: accessing a zero length array is not allowed", - }); - - ctx.objErrStage1("compile time division by zero", - \\const y = foo(0); - \\fn foo(x: u32) u32 { - \\ return 1 / x; - \\} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(y)); } - , &[_][]const u8{ - "tmp.zig:3:14: error: division by zero", - }); - - ctx.objErrStage1("branch on undefined value", - \\const x = if (undefined) true else false; - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(x)); } - , &[_][]const u8{ - "tmp.zig:1:15: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("div on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ _ = a / a; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("div assign on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ a /= a; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("mod on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ _ = a % a; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("mod assign on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ a %= a; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("add on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ _ = a + a; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("add assign on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ a += a; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("add wrap on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ _ = a +% a; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("add wrap assign on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ a +%= a; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("sub on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ _ = a - a; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("sub assign on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ a -= a; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("sub wrap on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ _ = a -% a; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("sub wrap assign on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ a -%= a; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("mult on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ _ = a * a; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("mult assign on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ a *= a; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("mult wrap on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ _ = a *% a; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("mult wrap assign on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ a *%= a; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("shift left on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ _ = a << 2; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("shift left assign on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ a <<= 2; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("shift right on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ _ = a >> 2; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("shift left assign on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ a >>= 2; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("bin and on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ _ = a & a; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("bin and assign on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ a &= a; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("bin or on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ _ = a | a; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("bin or assign on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ a |= a; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("bin xor on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ _ = a ^ a; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("bin xor assign on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ a ^= a; - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("comparison operators with undefined value", - \\// operator == - \\comptime { - \\ var a: i64 = undefined; - \\ var x: i32 = 0; - \\ if (a == a) x += 1; - \\} - \\// operator != - \\comptime { - \\ var a: i64 = undefined; - \\ var x: i32 = 0; - \\ if (a != a) x += 1; - \\} - \\// operator > - \\comptime { - \\ var a: i64 = undefined; - \\ var x: i32 = 0; - \\ if (a > a) x += 1; - \\} - \\// operator < - \\comptime { - \\ var a: i64 = undefined; - \\ var x: i32 = 0; - \\ if (a < a) x += 1; - \\} - \\// operator >= - \\comptime { - \\ var a: i64 = undefined; - \\ var x: i32 = 0; - \\ if (a >= a) x += 1; - \\} - \\// operator <= - \\comptime { - \\ var a: i64 = undefined; - \\ var x: i32 = 0; - \\ if (a <= a) x += 1; - \\} - , &[_][]const u8{ - "tmp.zig:5:11: error: use of undefined value here causes undefined behavior", - "tmp.zig:11:11: error: use of undefined value here causes undefined behavior", - "tmp.zig:17:11: error: use of undefined value here causes undefined behavior", - "tmp.zig:23:11: error: use of undefined value here causes undefined behavior", - "tmp.zig:29:11: error: use of undefined value here causes undefined behavior", - "tmp.zig:35:11: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("and on undefined value", - \\comptime { - \\ var a: bool = undefined; - \\ _ = a and a; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("or on undefined value", - \\comptime { - \\ var a: bool = undefined; - \\ _ = a or a; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("negate on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ _ = -a; - \\} - , &[_][]const u8{ - "tmp.zig:3:10: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("negate wrap on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ _ = -%a; - \\} - , &[_][]const u8{ - "tmp.zig:3:11: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("bin not on undefined value", - \\comptime { - \\ var a: i64 = undefined; - \\ _ = ~a; - \\} - , &[_][]const u8{ - "tmp.zig:3:10: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("bool not on undefined value", - \\comptime { - \\ var a: bool = undefined; - \\ _ = !a; - \\} - , &[_][]const u8{ - "tmp.zig:3:10: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("orelse on undefined value", - \\comptime { - \\ var a: ?bool = undefined; - \\ _ = a orelse false; - \\} - , &[_][]const u8{ - "tmp.zig:3:11: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("catch on undefined value", - \\comptime { - \\ var a: anyerror!bool = undefined; - \\ _ = a catch false; - \\} - , &[_][]const u8{ - "tmp.zig:3:11: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("deref on undefined value", - \\comptime { - \\ var a: *u8 = undefined; - \\ _ = a.*; - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: attempt to dereference undefined value", - }); - - ctx.objErrStage1("endless loop in function evaluation", - \\const seventh_fib_number = fibonacci(7); - \\fn fibonacci(x: i32) i32 { - \\ return fibonacci(x - 1) + fibonacci(x - 2); - \\} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(seventh_fib_number)); } - , &[_][]const u8{ - "tmp.zig:3:21: error: evaluation exceeded 1000 backwards branches", - }); - - ctx.objErrStage1("@embedFile with bogus file", - \\const resource = @embedFile("bogus.txt",); - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(resource)); } - , &[_][]const u8{ - "tmp.zig:1:29: error: unable to find '", - }); - - ctx.objErrStage1("non-const expression in struct literal outside function", - \\const Foo = struct { - \\ x: i32, - \\}; - \\const a = Foo {.x = get_it()}; - \\extern fn get_it() i32; - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(a)); } - , &[_][]const u8{ - "tmp.zig:4:21: error: unable to evaluate constant expression", - }); - - ctx.objErrStage1("non-const expression function call with struct return value outside function", - \\const Foo = struct { - \\ x: i32, - \\}; - \\const a = get_it(); - \\fn get_it() Foo { - \\ global_side_effect = true; - \\ return Foo {.x = 13}; - \\} - \\var global_side_effect = false; - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(a)); } - , &[_][]const u8{ - "tmp.zig:6:26: error: unable to evaluate constant expression", - }); - - ctx.objErrStage1("undeclared identifier error should mark fn as impure", - \\export fn foo() void { - \\ test_a_thing(); - \\} - \\fn test_a_thing() void { - \\ bad_fn_call(); - \\} - , &[_][]const u8{ - "tmp.zig:5:5: error: use of undeclared identifier 'bad_fn_call'", - }); - - ctx.objErrStage1("illegal comparison of types", - \\fn bad_eql_1(a: []u8, b: []u8) bool { - \\ return a == b; - \\} - \\const EnumWithData = union(enum) { - \\ One: void, - \\ Two: i32, - \\}; - \\fn bad_eql_2(a: *const EnumWithData, b: *const EnumWithData) bool { - \\ return a.* == b.*; - \\} - \\ - \\export fn entry1() usize { return @sizeOf(@TypeOf(bad_eql_1)); } - \\export fn entry2() usize { return @sizeOf(@TypeOf(bad_eql_2)); } - , &[_][]const u8{ - "tmp.zig:2:14: error: operator not allowed for type '[]u8'", - "tmp.zig:9:16: error: operator not allowed for type 'EnumWithData'", - }); - - ctx.objErrStage1("non-const switch number literal", - \\export fn foo() void { - \\ const x = switch (bar()) { - \\ 1, 2 => 1, - \\ 3, 4 => 2, - \\ else => 3, - \\ }; - \\ _ = x; - \\} - \\fn bar() i32 { - \\ return 2; - \\} - , &[_][]const u8{ - "tmp.zig:5:17: error: cannot store runtime value in type 'comptime_int'", - }); - - ctx.objErrStage1("atomic orderings of cmpxchg - failure stricter than success", - \\const AtomicOrder = @import("std").builtin.AtomicOrder; - \\export fn f() void { - \\ var x: i32 = 1234; - \\ while (!@cmpxchgWeak(i32, &x, 1234, 5678, AtomicOrder.Monotonic, AtomicOrder.SeqCst)) {} - \\} - , &[_][]const u8{ - "tmp.zig:4:81: error: failure atomic ordering must be no stricter than success", - }); - - ctx.objErrStage1("atomic orderings of cmpxchg - success Monotonic or stricter", - \\const AtomicOrder = @import("std").builtin.AtomicOrder; - \\export fn f() void { - \\ var x: i32 = 1234; - \\ while (!@cmpxchgWeak(i32, &x, 1234, 5678, AtomicOrder.Unordered, AtomicOrder.Unordered)) {} - \\} - , &[_][]const u8{ - "tmp.zig:4:58: error: success atomic ordering must be Monotonic or stricter", - }); - - ctx.objErrStage1("negation overflow in function evaluation", - \\const y = neg(-128); - \\fn neg(x: i8) i8 { - \\ return -x; - \\} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(y)); } - , &[_][]const u8{ - "tmp.zig:3:12: error: negation caused overflow", - }); - - ctx.objErrStage1("add overflow in function evaluation", - \\const y = add(65530, 10); - \\fn add(a: u16, b: u16) u16 { - \\ return a + b; - \\} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(y)); } - , &[_][]const u8{ - "tmp.zig:3:14: error: operation caused overflow", - }); - - ctx.objErrStage1("sub overflow in function evaluation", - \\const y = sub(10, 20); - \\fn sub(a: u16, b: u16) u16 { - \\ return a - b; - \\} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(y)); } - , &[_][]const u8{ - "tmp.zig:3:14: error: operation caused overflow", - }); - - ctx.objErrStage1("mul overflow in function evaluation", - \\const y = mul(300, 6000); - \\fn mul(a: u16, b: u16) u16 { - \\ return a * b; - \\} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(y)); } - , &[_][]const u8{ - "tmp.zig:3:14: error: operation caused overflow", - }); - - ctx.objErrStage1("truncate sign mismatch", - \\export fn entry1() i8 { - \\ var x: u32 = 10; - \\ return @truncate(i8, x); - \\} - \\export fn entry2() u8 { - \\ var x: i32 = -10; - \\ return @truncate(u8, x); - \\} - \\export fn entry3() i8 { - \\ comptime var x: u32 = 10; - \\ return @truncate(i8, x); - \\} - \\export fn entry4() u8 { - \\ comptime var x: i32 = -10; - \\ return @truncate(u8, x); - \\} - , &[_][]const u8{ - "tmp.zig:3:26: error: expected signed integer type, found 'u32'", - "tmp.zig:7:26: error: expected unsigned integer type, found 'i32'", - "tmp.zig:11:26: error: expected signed integer type, found 'u32'", - "tmp.zig:15:26: error: expected unsigned integer type, found 'i32'", - }); - - ctx.objErrStage1("try in function with non error return type", - \\export fn f() void { - \\ try something(); - \\} - \\fn something() anyerror!void { } - , &[_][]const u8{ - "tmp.zig:2:5: error: expected type 'void', found 'anyerror'", - }); - - ctx.objErrStage1("invalid pointer for var type", - \\extern fn ext() usize; - \\var bytes: [ext()]u8 = undefined; - \\export fn f() void { - \\ for (bytes) |*b, i| { - \\ b.* = @as(u8, i); - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:2:13: error: unable to evaluate constant expression", - }); - - ctx.objErrStage1("export function with comptime parameter", - \\export fn foo(comptime x: i32, y: i32) i32{ - \\ return x + y; - \\} - , &[_][]const u8{ - "tmp.zig:1:15: error: comptime parameter not allowed in function with calling convention 'C'", - }); - - ctx.objErrStage1("extern function with comptime parameter", - \\extern fn foo(comptime x: i32, y: i32) i32; - \\fn f() i32 { - \\ return foo(1, 2); - \\} - \\export fn entry() usize { return @sizeOf(@TypeOf(f)); } - , &[_][]const u8{ - "tmp.zig:1:15: error: comptime parameter not allowed in function with calling convention 'C'", - }); - - ctx.objErrStage1("non-pure function returns type", - \\var a: u32 = 0; - \\pub fn List(comptime T: type) type { - \\ a += 1; - \\ return SmallList(T, 8); - \\} - \\ - \\pub fn SmallList(comptime T: type, comptime STATIC_SIZE: usize) type { - \\ return struct { - \\ items: []T, - \\ length: usize, - \\ prealloc_items: [STATIC_SIZE]T, - \\ }; - \\} - \\ - \\export fn function_with_return_type_type() void { - \\ var list: List(i32) = undefined; - \\ list.length = 10; - \\} - , &[_][]const u8{ - "tmp.zig:3:7: error: unable to evaluate constant expression", - }); - - ctx.objErrStage1("bogus method call on slice", - \\var self = "aoeu"; - \\fn f(m: []const u8) void { - \\ m.copy(u8, self[0..], m); - \\} - \\export fn entry() usize { return @sizeOf(@TypeOf(f)); } - , &[_][]const u8{ - "tmp.zig:3:6: error: no member named 'copy' in '[]const u8'", - }); - - ctx.objErrStage1("wrong number of arguments for method fn call", - \\const Foo = struct { - \\ fn method(self: *const Foo, a: i32) void {_ = self; _ = a;} - \\}; - \\fn f(foo: *const Foo) void { - \\ - \\ foo.method(1, 2); - \\} - \\export fn entry() usize { return @sizeOf(@TypeOf(f)); } - , &[_][]const u8{ - "tmp.zig:6:15: error: expected 2 argument(s), found 3", - }); - - ctx.objErrStage1("assign through constant pointer", - \\export fn f() void { - \\ var cstr = "Hat"; - \\ cstr[0] = 'W'; - \\} - , &[_][]const u8{ - "tmp.zig:3:13: error: cannot assign to constant", - }); - - ctx.objErrStage1("assign through constant slice", - \\export fn f() void { - \\ var cstr: []const u8 = "Hat"; - \\ cstr[0] = 'W'; - \\} - , &[_][]const u8{ - "tmp.zig:3:13: error: cannot assign to constant", - }); - - ctx.objErrStage1("main function with bogus args type", - \\pub fn main(args: [][]bogus) !void {_ = args;} - , &[_][]const u8{ - "tmp.zig:1:23: error: use of undeclared identifier 'bogus'", - }); - - ctx.objErrStage1("misspelled type with pointer only reference", - \\const JasonHM = u8; - \\const JasonList = *JsonNode; - \\ - \\const JsonOA = union(enum) { - \\ JSONArray: JsonList, - \\ JSONObject: JasonHM, - \\}; - \\ - \\const JsonType = union(enum) { - \\ JSONNull: void, - \\ JSONInteger: isize, - \\ JSONDouble: f64, - \\ JSONBool: bool, - \\ JSONString: []u8, - \\ JSONArray: void, - \\ JSONObject: void, - \\}; - \\ - \\pub const JsonNode = struct { - \\ kind: JsonType, - \\ jobject: ?JsonOA, - \\}; - \\ - \\fn foo() void { - \\ var jll: JasonList = undefined; - \\ jll.init(1234); - \\ var jd = JsonNode {.kind = JsonType.JSONArray , .jobject = JsonOA.JSONArray {jll} }; - \\ _ = jd; - \\} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(foo)); } - , &[_][]const u8{ - "tmp.zig:5:16: error: use of undeclared identifier 'JsonList'", - }); - - ctx.objErrStage1("method call with first arg type primitive", - \\const Foo = struct { - \\ x: i32, - \\ - \\ fn init(x: i32) Foo { - \\ return Foo { - \\ .x = x, - \\ }; - \\ } - \\}; - \\ - \\export fn f() void { - \\ const derp = Foo.init(3); - \\ - \\ derp.init(); - \\} - , &[_][]const u8{ - "tmp.zig:14:5: error: expected type 'i32', found 'Foo'", - }); - - ctx.objErrStage1("method call with first arg type wrong container", - \\pub const List = struct { - \\ len: usize, - \\ allocator: *Allocator, - \\ - \\ pub fn init(allocator: *Allocator) List { - \\ return List { - \\ .len = 0, - \\ .allocator = allocator, - \\ }; - \\ } - \\}; - \\ - \\pub var global_allocator = Allocator { - \\ .field = 1234, - \\}; - \\ - \\pub const Allocator = struct { - \\ field: i32, - \\}; - \\ - \\export fn foo() void { - \\ var x = List.init(&global_allocator); - \\ x.init(); - \\} - , &[_][]const u8{ - "tmp.zig:23:5: error: expected type '*Allocator', found '*List'", - }); - - ctx.objErrStage1("binary not on number literal", - \\const TINY_QUANTUM_SHIFT = 4; - \\const TINY_QUANTUM_SIZE = 1 << TINY_QUANTUM_SHIFT; - \\var block_aligned_stuff: usize = (4 + TINY_QUANTUM_SIZE) & ~(TINY_QUANTUM_SIZE - 1); - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(block_aligned_stuff)); } - , &[_][]const u8{ - "tmp.zig:3:60: error: unable to perform binary not operation on type 'comptime_int'", - }); - { const case = ctx.obj("multiple files with private function error", .{}); case.backend = .stage1; @@ -6684,223 +341,6 @@ pub fn addCases(ctx: *TestContext) !void { }); } - ctx.objErrStage1("container init with non-type", - \\const zero: i32 = 0; - \\const a = zero{1}; - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(a)); } - , &[_][]const u8{ - "tmp.zig:2:11: error: expected type 'type', found 'i32'", - }); - - ctx.objErrStage1("assign to constant field", - \\const Foo = struct { - \\ field: i32, - \\}; - \\export fn derp() void { - \\ const f = Foo {.field = 1234,}; - \\ f.field = 0; - \\} - , &[_][]const u8{ - "tmp.zig:6:15: error: cannot assign to constant", - }); - - ctx.objErrStage1("return from defer expression", - \\pub fn testTrickyDefer() !void { - \\ defer canFail() catch {}; - \\ - \\ defer try canFail(); - \\ - \\ const a = maybeInt() orelse return; - \\} - \\ - \\fn canFail() anyerror!void { } - \\ - \\pub fn maybeInt() ?i32 { - \\ return 0; - \\} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(testTrickyDefer)); } - , &[_][]const u8{ - "tmp.zig:4:11: error: 'try' not allowed inside defer expression", - }); - - ctx.objErrStage1("assign too big number to u16", - \\export fn foo() void { - \\ var vga_mem: u16 = 0xB8000; - \\ _ = vga_mem; - \\} - , &[_][]const u8{ - "tmp.zig:2:24: error: integer value 753664 cannot be coerced to type 'u16'", - }); - - ctx.objErrStage1("global variable alignment non power of 2", - \\const some_data: [100]u8 align(3) = undefined; - \\export fn entry() usize { return @sizeOf(@TypeOf(some_data)); } - , &[_][]const u8{ - "tmp.zig:1:32: error: alignment value 3 is not a power of 2", - }); - - ctx.objErrStage1("function alignment non power of 2", - \\extern fn foo() align(3) void; - \\export fn entry() void { return foo(); } - , &[_][]const u8{ - "tmp.zig:1:23: error: alignment value 3 is not a power of 2", - }); - - ctx.objErrStage1("compile log", - \\export fn foo() void { - \\ comptime bar(12, "hi",); - \\} - \\fn bar(a: i32, b: []const u8) void { - \\ @compileLog("begin",); - \\ @compileLog("a", a, "b", b); - \\ @compileLog("end",); - \\} - , &[_][]const u8{ - "tmp.zig:5:5: error: found compile log statement", - "tmp.zig:6:5: error: found compile log statement", - "tmp.zig:7:5: error: found compile log statement", - }); - - ctx.objErrStage1("casting bit offset pointer to regular pointer", - \\const BitField = packed struct { - \\ a: u3, - \\ b: u3, - \\ c: u2, - \\}; - \\ - \\fn foo(bit_field: *const BitField) u3 { - \\ return bar(&bit_field.b); - \\} - \\ - \\fn bar(x: *const u3) u3 { - \\ return x.*; - \\} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(foo)); } - , &[_][]const u8{ - "tmp.zig:8:26: error: expected type '*const u3', found '*align(:3:1) const u3'", - }); - - ctx.objErrStage1("referring to a struct that is invalid", - \\const UsbDeviceRequest = struct { - \\ Type: u8, - \\}; - \\ - \\export fn foo() void { - \\ comptime assert(@sizeOf(UsbDeviceRequest) == 0x8); - \\} - \\ - \\fn assert(ok: bool) void { - \\ if (!ok) unreachable; - \\} - , &[_][]const u8{ - "tmp.zig:10:14: error: reached unreachable code", - }); - - ctx.objErrStage1("control flow uses comptime var at runtime", - \\export fn foo() void { - \\ comptime var i = 0; - \\ while (i < 5) : (i += 1) { - \\ bar(); - \\ } - \\} - \\ - \\fn bar() void { } - , &[_][]const u8{ - "tmp.zig:3:5: error: control flow attempts to use compile-time variable at runtime", - "tmp.zig:3:24: note: compile-time variable assigned here", - }); - - ctx.objErrStage1("ignored return value", - \\export fn foo() void { - \\ bar(); - \\} - \\fn bar() i32 { return 0; } - , &[_][]const u8{ - "tmp.zig:2:8: error: expression value is ignored", - }); - - ctx.objErrStage1("ignored assert-err-ok return value", - \\export fn foo() void { - \\ bar() catch unreachable; - \\} - \\fn bar() anyerror!i32 { return 0; } - , &[_][]const u8{ - "tmp.zig:2:11: error: expression value is ignored", - }); - - ctx.objErrStage1("ignored statement value", - \\export fn foo() void { - \\ 1; - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: expression value is ignored", - }); - - ctx.objErrStage1("ignored comptime statement value", - \\export fn foo() void { - \\ comptime {1;} - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: expression value is ignored", - }); - - ctx.objErrStage1("ignored comptime value", - \\export fn foo() void { - \\ comptime 1; - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: expression value is ignored", - }); - - ctx.objErrStage1("ignored deferred statement value", - \\export fn foo() void { - \\ defer {1;} - \\} - , &[_][]const u8{ - "tmp.zig:2:12: error: expression value is ignored", - }); - - ctx.objErrStage1("ignored deferred function call", - \\export fn foo() void { - \\ defer bar(); - \\} - \\fn bar() anyerror!i32 { return 0; } - , &[_][]const u8{ - "tmp.zig:2:14: error: error is ignored. consider using `try`, `catch`, or `if`", - }); - - ctx.objErrStage1("dereference an array", - \\var s_buffer: [10]u8 = undefined; - \\pub fn pass(in: []u8) []u8 { - \\ var out = &s_buffer; - \\ out.*.* = in[0]; - \\ return out.*[0..1]; - \\} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(pass)); } - , &[_][]const u8{ - "tmp.zig:4:10: error: attempt to dereference non-pointer type '[10]u8'", - }); - - ctx.objErrStage1("pass const ptr to mutable ptr fn", - \\fn foo() bool { - \\ const a = @as([]const u8, "a",); - \\ const b = &a; - \\ return ptrEql(b, b); - \\} - \\fn ptrEql(a: *[]const u8, b: *[]const u8) bool { - \\ _ = a; _ = b; - \\ return true; - \\} - \\ - \\export fn entry() usize { return @sizeOf(@TypeOf(foo)); } - , &[_][]const u8{ - "tmp.zig:4:19: error: expected type '*[]const u8', found '*const []const u8'", - }); - { const case = ctx.obj("export collision", .{}); case.backend = .stage1; @@ -6922,801 +362,6 @@ pub fn addCases(ctx: *TestContext) !void { }); } - ctx.objErrStage1("implicit cast from array to mutable slice", - \\var global_array: [10]i32 = undefined; - \\fn foo(param: []i32) void {_ = param;} - \\export fn entry() void { - \\ foo(global_array); - \\} - , &[_][]const u8{ - "tmp.zig:4:9: error: expected type '[]i32', found '[10]i32'", - }); - - ctx.objErrStage1("ptrcast to non-pointer", - \\export fn entry(a: *i32) usize { - \\ return @ptrCast(usize, a); - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: expected pointer, found 'usize'", - }); - - ctx.objErrStage1("asm at compile time", - \\comptime { - \\ doSomeAsm(); - \\} - \\ - \\fn doSomeAsm() void { - \\ asm volatile ( - \\ \\.globl aoeu; - \\ \\.type aoeu, @function; - \\ \\.set aoeu, derp; - \\ ); - \\} - , &[_][]const u8{ - "tmp.zig:6:5: error: unable to evaluate constant expression", - }); - - ctx.objErrStage1("invalid member of builtin enum", - \\const builtin = @import("std").builtin; - \\export fn entry() void { - \\ const foo = builtin.Mode.x86; - \\ _ = foo; - \\} - , &[_][]const u8{ - "tmp.zig:3:29: error: container 'std.builtin.Mode' has no member called 'x86'", - }); - - ctx.objErrStage1("int to ptr of 0 bits", - \\export fn foo() void { - \\ var x: usize = 0x1000; - \\ var y: *void = @intToPtr(*void, x); - \\ _ = y; - \\} - , &[_][]const u8{ - "tmp.zig:3:30: error: type '*void' has 0 bits and cannot store information", - }); - - ctx.objErrStage1("@fieldParentPtr - non struct", - \\const Foo = i32; - \\export fn foo(a: *i32) *Foo { - \\ return @fieldParentPtr(Foo, "a", a); - \\} - , &[_][]const u8{ - "tmp.zig:3:28: error: expected struct type, found 'i32'", - }); - - ctx.objErrStage1("@fieldParentPtr - bad field name", - \\const Foo = extern struct { - \\ derp: i32, - \\}; - \\export fn foo(a: *i32) *Foo { - \\ return @fieldParentPtr(Foo, "a", a); - \\} - , &[_][]const u8{ - "tmp.zig:5:33: error: struct 'Foo' has no field 'a'", - }); - - ctx.objErrStage1("@fieldParentPtr - field pointer is not pointer", - \\const Foo = extern struct { - \\ a: i32, - \\}; - \\export fn foo(a: i32) *Foo { - \\ return @fieldParentPtr(Foo, "a", a); - \\} - , &[_][]const u8{ - "tmp.zig:5:38: error: expected pointer, found 'i32'", - }); - - ctx.objErrStage1("@fieldParentPtr - comptime field ptr not based on struct", - \\const Foo = struct { - \\ a: i32, - \\ b: i32, - \\}; - \\const foo = Foo { .a = 1, .b = 2, }; - \\ - \\comptime { - \\ const field_ptr = @intToPtr(*i32, 0x1234); - \\ const another_foo_ptr = @fieldParentPtr(Foo, "b", field_ptr); - \\ _ = another_foo_ptr; - \\} - , &[_][]const u8{ - "tmp.zig:9:55: error: pointer value not based on parent struct", - }); - - ctx.objErrStage1("@fieldParentPtr - comptime wrong field index", - \\const Foo = struct { - \\ a: i32, - \\ b: i32, - \\}; - \\const foo = Foo { .a = 1, .b = 2, }; - \\ - \\comptime { - \\ const another_foo_ptr = @fieldParentPtr(Foo, "b", &foo.a); - \\ _ = another_foo_ptr; - \\} - , &[_][]const u8{ - "tmp.zig:8:29: error: field 'b' has index 1 but pointer value is index 0 of struct 'Foo'", - }); - - ctx.objErrStage1("@offsetOf - non struct", - \\const Foo = i32; - \\export fn foo() usize { - \\ return @offsetOf(Foo, "a",); - \\} - , &[_][]const u8{ - "tmp.zig:3:22: error: expected struct type, found 'i32'", - }); - - ctx.objErrStage1("@offsetOf - bad field name", - \\const Foo = struct { - \\ derp: i32, - \\}; - \\export fn foo() usize { - \\ return @offsetOf(Foo, "a",); - \\} - , &[_][]const u8{ - "tmp.zig:5:27: error: struct 'Foo' has no field 'a'", - }); - - ctx.exeErrStage1("missing main fn in executable", - \\ - , &[_][]const u8{ - "error: root source file has no member called 'main'", - }); - - ctx.exeErrStage1("private main fn", - \\fn main() void {} - , &[_][]const u8{ - "error: 'main' is private", - "tmp.zig:1:1: note: declared here", - }); - - ctx.objErrStage1("setting a section on a local variable", - \\export fn entry() i32 { - \\ var foo: i32 linksection(".text2") = 1234; - \\ return foo; - \\} - , &[_][]const u8{ - "tmp.zig:2:30: error: cannot set section of local variable 'foo'", - }); - - ctx.objErrStage1("ambiguous decl reference", - \\fn foo() void {} - \\fn bar() void { - \\ const S = struct { - \\ fn baz() void { - \\ foo(); - \\ } - \\ fn foo() void {} - \\ }; - \\ S.baz(); - \\} - \\export fn entry() void { - \\ bar(); - \\} - , &[_][]const u8{ - "tmp.zig:5:13: error: ambiguous reference", - "tmp.zig:7:9: note: declared here", - "tmp.zig:1:1: note: also declared here", - }); - - ctx.objErrStage1("while expected bool, got optional", - \\export fn foo() void { - \\ while (bar()) {} - \\} - \\fn bar() ?i32 { return 1; } - , &[_][]const u8{ - "tmp.zig:2:15: error: expected type 'bool', found '?i32'", - }); - - ctx.objErrStage1("while expected bool, got error union", - \\export fn foo() void { - \\ while (bar()) {} - \\} - \\fn bar() anyerror!i32 { return 1; } - , &[_][]const u8{ - "tmp.zig:2:15: error: expected type 'bool', found 'anyerror!i32'", - }); - - ctx.objErrStage1("while expected optional, got bool", - \\export fn foo() void { - \\ while (bar()) |x| {_ = x;} - \\} - \\fn bar() bool { return true; } - , &[_][]const u8{ - "tmp.zig:2:15: error: expected optional type, found 'bool'", - }); - - ctx.objErrStage1("while expected optional, got error union", - \\export fn foo() void { - \\ while (bar()) |x| {_ = x;} - \\} - \\fn bar() anyerror!i32 { return 1; } - , &[_][]const u8{ - "tmp.zig:2:15: error: expected optional type, found 'anyerror!i32'", - }); - - ctx.objErrStage1("while expected error union, got bool", - \\export fn foo() void { - \\ while (bar()) |x| {_ = x;} else |err| {_ = err;} - \\} - \\fn bar() bool { return true; } - , &[_][]const u8{ - "tmp.zig:2:15: error: expected error union type, found 'bool'", - }); - - ctx.objErrStage1("while expected error union, got optional", - \\export fn foo() void { - \\ while (bar()) |x| {_ = x;} else |err| {_ = err;} - \\} - \\fn bar() ?i32 { return 1; } - , &[_][]const u8{ - "tmp.zig:2:15: error: expected error union type, found '?i32'", - }); - - // TODO test this in stage2, but we won't even try in stage1 - //ctx.objErrStage1("inline fn calls itself indirectly", - // \\export fn foo() void { - // \\ bar(); - // \\} - // \\fn bar() callconv(.Inline) void { - // \\ baz(); - // \\ quux(); - // \\} - // \\fn baz() callconv(.Inline) void { - // \\ bar(); - // \\ quux(); - // \\} - // \\extern fn quux() void; - //, &[_][]const u8{ - // "tmp.zig:4:1: error: unable to inline function", - //}); - - //ctx.objErrStage1("save reference to inline function", - // \\export fn foo() void { - // \\ quux(@ptrToInt(bar)); - // \\} - // \\fn bar() callconv(.Inline) void { } - // \\extern fn quux(usize) void; - //, &[_][]const u8{ - // "tmp.zig:4:1: error: unable to inline function", - //}); - - ctx.objErrStage1("signed integer division", - \\export fn foo(a: i32, b: i32) i32 { - \\ return a / b; - \\} - , &[_][]const u8{ - "tmp.zig:2:14: error: division with 'i32' and 'i32': signed integers must use @divTrunc, @divFloor, or @divExact", - }); - - ctx.objErrStage1("signed integer remainder division", - \\export fn foo(a: i32, b: i32) i32 { - \\ return a % b; - \\} - , &[_][]const u8{ - "tmp.zig:2:14: error: remainder division with 'i32' and 'i32': signed integers and floats must use @rem or @mod", - }); - - ctx.objErrStage1("compile-time division by zero", - \\comptime { - \\ const a: i32 = 1; - \\ const b: i32 = 0; - \\ const c = a / b; - \\ _ = c; - \\} - , &[_][]const u8{ - "tmp.zig:4:17: error: division by zero", - }); - - ctx.objErrStage1("compile-time remainder division by zero", - \\comptime { - \\ const a: i32 = 1; - \\ const b: i32 = 0; - \\ const c = a % b; - \\ _ = c; - \\} - , &[_][]const u8{ - "tmp.zig:4:17: error: division by zero", - }); - - ctx.objErrStage1("@setRuntimeSafety twice for same scope", - \\export fn foo() void { - \\ @setRuntimeSafety(false); - \\ @setRuntimeSafety(false); - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: runtime safety set twice for same scope", - "tmp.zig:2:5: note: first set here", - }); - - ctx.objErrStage1("@setFloatMode twice for same scope", - \\export fn foo() void { - \\ @setFloatMode(@import("std").builtin.FloatMode.Optimized); - \\ @setFloatMode(@import("std").builtin.FloatMode.Optimized); - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: float mode set twice for same scope", - "tmp.zig:2:5: note: first set here", - }); - - ctx.objErrStage1("array access of type", - \\export fn foo() void { - \\ var b: u8[40] = undefined; - \\ _ = b; - \\} - , &[_][]const u8{ - "tmp.zig:2:14: error: array access of non-array type 'type'", - }); - - ctx.objErrStage1("cannot break out of defer expression", - \\export fn foo() void { - \\ while (true) { - \\ defer { - \\ break; - \\ } - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:4:13: error: cannot break out of defer expression", - }); - - ctx.objErrStage1("cannot continue out of defer expression", - \\export fn foo() void { - \\ while (true) { - \\ defer { - \\ continue; - \\ } - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:4:13: error: cannot continue out of defer expression", - }); - - ctx.objErrStage1("calling a generic function only known at runtime", - \\var foos = [_]fn(anytype) void { foo1, foo2 }; - \\ - \\fn foo1(arg: anytype) void {_ = arg;} - \\fn foo2(arg: anytype) void {_ = arg;} - \\ - \\pub fn main() !void { - \\ foos[0](true); - \\} - , &[_][]const u8{ - "tmp.zig:7:9: error: calling a generic function requires compile-time known function value", - }); - - ctx.objErrStage1("@compileError shows traceback of references that caused it", - \\const foo = @compileError("aoeu",); - \\ - \\const bar = baz + foo; - \\const baz = 1; - \\ - \\export fn entry() i32 { - \\ return bar; - \\} - , &[_][]const u8{ - "tmp.zig:1:13: error: aoeu", - }); - - ctx.objErrStage1("float literal too large error", - \\comptime { - \\ const a = 0x1.0p18495; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: float literal out of range of any type", - }); - - ctx.objErrStage1("float literal too small error (denormal)", - \\comptime { - \\ const a = 0x1.0p-19000; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: float literal out of range of any type", - }); - - ctx.objErrStage1("explicit cast float literal to integer when there is a fraction component", - \\export fn entry() i32 { - \\ return @as(i32, 12.34); - \\} - , &[_][]const u8{ - "tmp.zig:2:21: error: fractional component prevents float value 12.340000 from being casted to type 'i32'", - }); - - ctx.objErrStage1("non pointer given to @ptrToInt", - \\export fn entry(x: i32) usize { - \\ return @ptrToInt(x); - \\} - , &[_][]const u8{ - "tmp.zig:2:22: error: expected pointer, found 'i32'", - }); - - ctx.objErrStage1("@shlExact shifts out 1 bits", - \\comptime { - \\ const x = @shlExact(@as(u8, 0b01010101), 2); - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: operation caused overflow", - }); - - ctx.objErrStage1("@shrExact shifts out 1 bits", - \\comptime { - \\ const x = @shrExact(@as(u8, 0b10101010), 2); - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: exact shift shifted out 1 bits", - }); - - ctx.objErrStage1("shifting without int type or comptime known", - \\export fn entry(x: u8) u8 { - \\ return 0x11 << x; - \\} - , &[_][]const u8{ - "tmp.zig:2:17: error: LHS of shift must be a fixed-width integer type, or RHS must be compile-time known", - }); - - ctx.objErrStage1("shifting RHS is log2 of LHS int bit width", - \\export fn entry(x: u8, y: u8) u8 { - \\ return x << y; - \\} - , &[_][]const u8{ - "tmp.zig:2:17: error: expected type 'u3', found 'u8'", - }); - - ctx.objErrStage1("locally shadowing a primitive type", - \\export fn foo() void { - \\ const u8 = u16; - \\ const a: u8 = 300; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:2:11: error: name shadows primitive 'u8'", - "tmp.zig:2:11: note: consider using @\"u8\" to disambiguate", - }); - - ctx.objErrStage1("primitives take precedence over declarations", - \\const @"u8" = u16; - \\export fn entry() void { - \\ const a: u8 = 300; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:3:19: error: integer value 300 cannot be coerced to type 'u8'", - }); - - ctx.objErrStage1("declaration with same name as primitive must use special syntax", - \\const u8 = u16; - \\export fn entry() void { - \\ const a: u8 = 300; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:1:7: error: name shadows primitive 'u8'", - "tmp.zig:1:7: note: consider using @\"u8\" to disambiguate", - }); - - ctx.objErrStage1("implicitly increasing pointer alignment", - \\const Foo = packed struct { - \\ a: u8, - \\ b: u32, - \\}; - \\ - \\export fn entry() void { - \\ var foo = Foo { .a = 1, .b = 10 }; - \\ bar(&foo.b); - \\} - \\ - \\fn bar(x: *u32) void { - \\ x.* += 1; - \\} - , &[_][]const u8{ - "tmp.zig:8:13: error: expected type '*u32', found '*align(1) u32'", - }); - - ctx.objErrStage1("implicitly increasing slice alignment", - \\const Foo = packed struct { - \\ a: u8, - \\ b: u32, - \\}; - \\ - \\export fn entry() void { - \\ var foo = Foo { .a = 1, .b = 10 }; - \\ foo.b += 1; - \\ bar(@as(*[1]u32, &foo.b)[0..]); - \\} - \\ - \\fn bar(x: []u32) void { - \\ x[0] += 1; - \\} - , &[_][]const u8{ - "tmp.zig:9:26: error: cast increases pointer alignment", - "tmp.zig:9:26: note: '*align(1) u32' has alignment 1", - "tmp.zig:9:26: note: '*[1]u32' has alignment 4", - }); - - ctx.objErrStage1("increase pointer alignment in @ptrCast", - \\export fn entry() u32 { - \\ var bytes: [4]u8 = [_]u8{0x01, 0x02, 0x03, 0x04}; - \\ const ptr = @ptrCast(*u32, &bytes[0]); - \\ return ptr.*; - \\} - , &[_][]const u8{ - "tmp.zig:3:17: error: cast increases pointer alignment", - "tmp.zig:3:38: note: '*u8' has alignment 1", - "tmp.zig:3:26: note: '*u32' has alignment 4", - }); - - ctx.objErrStage1("@alignCast expects pointer or slice", - \\export fn entry() void { - \\ @alignCast(4, @as(u32, 3)); - \\} - , &[_][]const u8{ - "tmp.zig:2:19: error: expected pointer or slice, found 'u32'", - }); - - ctx.objErrStage1("passing an under-aligned function pointer", - \\export fn entry() void { - \\ testImplicitlyDecreaseFnAlign(alignedSmall, 1234); - \\} - \\fn testImplicitlyDecreaseFnAlign(ptr: fn () align(8) i32, answer: i32) void { - \\ if (ptr() != answer) unreachable; - \\} - \\fn alignedSmall() align(4) i32 { return 1234; } - , &[_][]const u8{ - "tmp.zig:2:35: error: expected type 'fn() align(8) i32', found 'fn() align(4) i32'", - }); - - ctx.objErrStage1("passing a not-aligned-enough pointer to cmpxchg", - \\const AtomicOrder = @import("std").builtin.AtomicOrder; - \\export fn entry() bool { - \\ var x: i32 align(1) = 1234; - \\ while (!@cmpxchgWeak(i32, &x, 1234, 5678, AtomicOrder.SeqCst, AtomicOrder.SeqCst)) {} - \\ return x == 5678; - \\} - , &[_][]const u8{ - "tmp.zig:4:32: error: expected type '*i32', found '*align(1) i32'", - }); - - ctx.objErrStage1("wrong size to an array literal", - \\comptime { - \\ const array = [2]u8{1, 2, 3}; - \\ _ = array; - \\} - , &[_][]const u8{ - "tmp.zig:2:31: error: index 2 outside array of size 2", - }); - - ctx.objErrStage1("wrong pointer coerced to pointer to opaque {}", - \\const Derp = opaque {}; - \\extern fn bar(d: *Derp) void; - \\export fn foo() void { - \\ var x = @as(u8, 1); - \\ bar(@ptrCast(*anyopaque, &x)); - \\} - , &[_][]const u8{ - "tmp.zig:5:9: error: expected type '*Derp', found '*anyopaque'", - }); - - ctx.objErrStage1("non-const variables of things that require const variables", - \\export fn entry1() void { - \\ var m2 = &2; - \\ _ = m2; - \\} - \\export fn entry2() void { - \\ var a = undefined; - \\ _ = a; - \\} - \\export fn entry3() void { - \\ var b = 1; - \\ _ = b; - \\} - \\export fn entry4() void { - \\ var c = 1.0; - \\ _ = c; - \\} - \\export fn entry5() void { - \\ var d = null; - \\ _ = d; - \\} - \\export fn entry6(opaque_: *Opaque) void { - \\ var e = opaque_.*; - \\ _ = e; - \\} - \\export fn entry7() void { - \\ var f = i32; - \\ _ = f; - \\} - \\export fn entry8() void { - \\ var h = (Foo {}).bar; - \\ _ = h; - \\} - \\const Opaque = opaque {}; - \\const Foo = struct { - \\ fn bar(self: *const Foo) void {_ = self;} - \\}; - , &[_][]const u8{ - "tmp.zig:2:4: error: variable of type '*const comptime_int' must be const or comptime", - "tmp.zig:6:4: error: variable of type '@Type(.Undefined)' must be const or comptime", - "tmp.zig:10:4: error: variable of type 'comptime_int' must be const or comptime", - "tmp.zig:10:4: note: to modify this variable at runtime, it must be given an explicit fixed-size number type", - "tmp.zig:14:4: error: variable of type 'comptime_float' must be const or comptime", - "tmp.zig:14:4: note: to modify this variable at runtime, it must be given an explicit fixed-size number type", - "tmp.zig:18:4: error: variable of type '@Type(.Null)' must be const or comptime", - "tmp.zig:22:4: error: variable of type 'Opaque' not allowed", - "tmp.zig:26:4: error: variable of type 'type' must be const or comptime", - "tmp.zig:30:4: error: variable of type '(bound fn(*const Foo) void)' must be const or comptime", - }); - - ctx.objErrStage1("variable with type 'noreturn'", - \\export fn entry9() void { - \\ var z: noreturn = return; - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: unreachable code", - "tmp.zig:2:23: note: control flow is diverted here", - }); - - ctx.objErrStage1("wrong types given to atomic order args in cmpxchg", - \\export fn entry() void { - \\ var x: i32 = 1234; - \\ while (!@cmpxchgWeak(i32, &x, 1234, 5678, @as(u32, 1234), @as(u32, 1234))) {} - \\} - , &[_][]const u8{ - "tmp.zig:3:47: error: expected type 'std.builtin.AtomicOrder', found 'u32'", - }); - - ctx.objErrStage1("wrong types given to @export", - \\fn entry() callconv(.C) void { } - \\comptime { - \\ @export(entry, .{.name = "entry", .linkage = @as(u32, 1234) }); - \\} - , &[_][]const u8{ - "tmp.zig:3:59: error: expected type 'std.builtin.GlobalLinkage', found 'comptime_int'", - }); - - ctx.objErrStage1("struct with invalid field", - \\const std = @import("std",); - \\const Allocator = std.mem.Allocator; - \\const ArrayList = std.ArrayList; - \\ - \\const HeaderWeight = enum { - \\ H1, H2, H3, H4, H5, H6, - \\}; - \\ - \\const MdText = ArrayList(u8); - \\ - \\const MdNode = union(enum) { - \\ Header: struct { - \\ text: MdText, - \\ weight: HeaderValue, - \\ }, - \\}; - \\ - \\export fn entry() void { - \\ const a = MdNode.Header { - \\ .text = MdText.init(std.testing.allocator), - \\ .weight = HeaderWeight.H1, - \\ }; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:14:17: error: use of undeclared identifier 'HeaderValue'", - }); - - ctx.objErrStage1("@setAlignStack outside function", - \\comptime { - \\ @setAlignStack(16); - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: @setAlignStack outside function", - }); - - ctx.objErrStage1("@setAlignStack in naked function", - \\export fn entry() callconv(.Naked) void { - \\ @setAlignStack(16); - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: @setAlignStack in naked function", - }); - - ctx.objErrStage1("@setAlignStack in inline function", - \\export fn entry() void { - \\ foo(); - \\} - \\fn foo() callconv(.Inline) void { - \\ @setAlignStack(16); - \\} - , &[_][]const u8{ - "tmp.zig:5:5: error: @setAlignStack in inline function", - }); - - ctx.objErrStage1("@setAlignStack set twice", - \\export fn entry() void { - \\ @setAlignStack(16); - \\ @setAlignStack(16); - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: alignstack set twice", - "tmp.zig:2:5: note: first set here", - }); - - ctx.objErrStage1("@setAlignStack too big", - \\export fn entry() void { - \\ @setAlignStack(511 + 1); - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: attempt to @setAlignStack(512); maximum is 256", - }); - - ctx.objErrStage1("storing runtime value in compile time variable then using it", - \\const Mode = @import("std").builtin.Mode; - \\ - \\fn Free(comptime filename: []const u8) TestCase { - \\ return TestCase { - \\ .filename = filename, - \\ .problem_type = ProblemType.Free, - \\ }; - \\} - \\ - \\fn LibC(comptime filename: []const u8) TestCase { - \\ return TestCase { - \\ .filename = filename, - \\ .problem_type = ProblemType.LinkLibC, - \\ }; - \\} - \\ - \\const TestCase = struct { - \\ filename: []const u8, - \\ problem_type: ProblemType, - \\}; - \\ - \\const ProblemType = enum { - \\ Free, - \\ LinkLibC, - \\}; - \\ - \\export fn entry() void { - \\ const tests = [_]TestCase { - \\ Free("001"), - \\ Free("002"), - \\ LibC("078"), - \\ Free("116"), - \\ Free("117"), - \\ }; - \\ - \\ for ([_]Mode { Mode.Debug, Mode.ReleaseSafe, Mode.ReleaseFast }) |mode| { - \\ _ = mode; - \\ inline for (tests) |test_case| { - \\ const foo = test_case.filename ++ ".zig"; - \\ _ = foo; - \\ } - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:38:29: error: cannot store runtime value in compile time variable", - }); - - ctx.objErrStage1("invalid legacy unicode escape", - \\export fn entry() void { - \\ const a = '\U1234'; - \\} - , &[_][]const u8{ - "tmp.zig:2:15: error: expected expression, found 'invalid bytes'", - "tmp.zig:2:18: note: invalid byte: '1'", - }); - - ctx.objErrStage1("invalid empty unicode escape", - \\export fn entry() void { - \\ const a = '\u{}'; - \\} - , &[_][]const u8{ - "tmp.zig:2:19: error: empty unicode escape sequence", - }); - ctx.objErrStage1("non-printable invalid character", "\xff\xfe" ++ "fn foo() bool {\r\n" ++ " return true;\r\n" ++ @@ -7731,1070 +376,33 @@ pub fn addCases(ctx: *TestContext) !void { "tmp.zig:2:1: error: invalid character: '\\t'", }); - ctx.objErrStage1("calling var args extern function, passing array instead of pointer", - \\export fn entry() void { - \\ foo("hello".*,); - \\} - \\pub extern fn foo(format: *const u8, ...) void; - , &[_][]const u8{ - "tmp.zig:2:16: error: expected type '*const u8', found '[5:0]u8'", - }); - - ctx.objErrStage1("constant inside comptime function has compile error", - \\const ContextAllocator = MemoryPool(usize); - \\ - \\pub fn MemoryPool(comptime T: type) type { - \\ const free_list_t = @compileError("aoeu",); - \\ - \\ return struct { - \\ free_list: free_list_t, - \\ }; - \\} - \\ - \\export fn entry() void { - \\ var allocator: ContextAllocator = undefined; - \\} - , &[_][]const u8{ - "tmp.zig:4:5: error: unreachable code", - "tmp.zig:4:25: note: control flow is diverted here", - "tmp.zig:12:9: error: unused local variable", - }); - - ctx.objErrStage1("specify enum tag type that is too small", - \\const Small = enum (u2) { - \\ One, - \\ Two, - \\ Three, - \\ Four, - \\ Five, - \\}; - \\ - \\export fn entry() void { - \\ var x = Small.One; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:6:5: error: enumeration value 4 too large for type 'u2'", - }); - - ctx.objErrStage1("specify non-integer enum tag type", - \\const Small = enum (f32) { - \\ One, - \\ Two, - \\ Three, - \\}; - \\ - \\export fn entry() void { - \\ var x = Small.One; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:1:21: error: expected integer, found 'f32'", - }); - - ctx.objErrStage1("implicitly casting enum to tag type", - \\const Small = enum(u2) { - \\ One, - \\ Two, - \\ Three, - \\ Four, - \\}; - \\ - \\export fn entry() void { - \\ var x: u2 = Small.Two; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:9:22: error: expected type 'u2', found 'Small'", - }); - - ctx.objErrStage1("explicitly casting non tag type to enum", - \\const Small = enum(u2) { - \\ One, - \\ Two, - \\ Three, - \\ Four, - \\}; - \\ - \\export fn entry() void { - \\ var y = @as(f32, 3); - \\ var x = @intToEnum(Small, y); - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:10:31: error: expected integer type, found 'f32'", - }); - - ctx.objErrStage1("union fields with value assignments", - \\const MultipleChoice = union { - \\ A: i32 = 20, - \\}; - \\export fn entry() void { - \\ var x: MultipleChoice = undefined; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:1:24: error: explicitly valued tagged union missing integer tag type", - "tmp.zig:2:14: note: tag value specified here", - }); - - ctx.objErrStage1("enum with 0 fields", - \\const Foo = enum {}; - , &[_][]const u8{ - "tmp.zig:1:13: error: enum declarations must have at least one tag", - }); - - ctx.objErrStage1("union with 0 fields", - \\const Foo = union {}; - , &[_][]const u8{ - "tmp.zig:1:13: error: union declarations must have at least one tag", - }); - - ctx.objErrStage1("enum value already taken", - \\const MultipleChoice = enum(u32) { - \\ A = 20, - \\ B = 40, - \\ C = 60, - \\ D = 1000, - \\ E = 60, - \\}; - \\export fn entry() void { - \\ var x = MultipleChoice.C; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:6:5: error: enum tag value 60 already taken", - "tmp.zig:4:5: note: other occurrence here", - }); - - ctx.objErrStage1("union with specified enum omits field", - \\const Letter = enum { - \\ A, - \\ B, - \\ C, - \\}; - \\const Payload = union(Letter) { - \\ A: i32, - \\ B: f64, - \\}; - \\export fn entry() usize { - \\ return @sizeOf(Payload); - \\} - , &[_][]const u8{ - "tmp.zig:6:17: error: enum field missing: 'C'", - "tmp.zig:4:5: note: declared here", - }); - - ctx.objErrStage1("non-integer tag type to automatic union enum", - \\const Foo = union(enum(f32)) { - \\ A: i32, - \\}; - \\export fn entry() void { - \\ const x = @typeInfo(Foo).Union.tag_type.?; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:1:24: error: expected integer tag type, found 'f32'", - }); - - ctx.objErrStage1("non-enum tag type passed to union", - \\const Foo = union(u32) { - \\ A: i32, - \\}; - \\export fn entry() void { - \\ const x = @typeInfo(Foo).Union.tag_type.?; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:1:19: error: expected enum tag type, found 'u32'", - }); - - ctx.objErrStage1("union auto-enum value already taken", - \\const MultipleChoice = union(enum(u32)) { - \\ A = 20, - \\ B = 40, - \\ C = 60, - \\ D = 1000, - \\ E = 60, - \\}; - \\export fn entry() void { - \\ var x = MultipleChoice { .C = {} }; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:6:9: error: enum tag value 60 already taken", - "tmp.zig:4:9: note: other occurrence here", - }); - - ctx.objErrStage1("union enum field does not match enum", - \\const Letter = enum { - \\ A, - \\ B, - \\ C, - \\}; - \\const Payload = union(Letter) { - \\ A: i32, - \\ B: f64, - \\ C: bool, - \\ D: bool, - \\}; - \\export fn entry() void { - \\ var a = Payload {.A = 1234}; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:10:5: error: enum field not found: 'D'", - "tmp.zig:1:16: note: enum declared here", - }); - - ctx.objErrStage1("field type supplied in an enum", - \\const Letter = enum { - \\ A: void, - \\ B, - \\ C, - \\}; - , &[_][]const u8{ - "tmp.zig:2:8: error: enum fields do not have types", - "tmp.zig:1:16: note: consider 'union(enum)' here to make it a tagged union", - }); - - ctx.objErrStage1("struct field missing type", - \\const Letter = struct { - \\ A, - \\}; - \\export fn entry() void { - \\ var a = Letter { .A = {} }; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: struct field missing type", - }); - - ctx.objErrStage1("extern union field missing type", - \\const Letter = extern union { - \\ A, - \\}; - \\export fn entry() void { - \\ var a = Letter { .A = {} }; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: union field missing type", - }); - - ctx.objErrStage1("extern union given enum tag type", - \\const Letter = enum { - \\ A, - \\ B, - \\ C, - \\}; - \\const Payload = extern union(Letter) { - \\ A: i32, - \\ B: f64, - \\ C: bool, - \\}; - \\export fn entry() void { - \\ var a = Payload { .A = 1234 }; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:6:30: error: extern union does not support enum tag type", - }); - - ctx.objErrStage1("packed union given enum tag type", - \\const Letter = enum { - \\ A, - \\ B, - \\ C, - \\}; - \\const Payload = packed union(Letter) { - \\ A: i32, - \\ B: f64, - \\ C: bool, - \\}; - \\export fn entry() void { - \\ var a = Payload { .A = 1234 }; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:6:30: error: packed union does not support enum tag type", - }); - - ctx.objErrStage1("packed union with automatic layout field", - \\const Foo = struct { - \\ a: u32, - \\ b: f32, - \\}; - \\const Payload = packed union { - \\ A: Foo, - \\ B: bool, - \\}; - \\export fn entry() void { - \\ var a = Payload { .B = true }; - \\ _ = a; - \\} - , &[_][]const u8{ - "tmp.zig:6:5: error: non-packed, non-extern struct 'Foo' not allowed in packed union; no guaranteed in-memory representation", - }); - - ctx.objErrStage1("switch on union with no attached enum", - \\const Payload = union { - \\ A: i32, - \\ B: f64, - \\ C: bool, - \\}; - \\export fn entry() void { - \\ const a = Payload { .A = 1234 }; - \\ foo(a); - \\} - \\fn foo(a: *const Payload) void { - \\ switch (a.*) { - \\ Payload.A => {}, - \\ else => unreachable, - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:11:14: error: switch on union which has no attached enum", - "tmp.zig:1:17: note: consider 'union(enum)' here", - }); - - ctx.objErrStage1("enum in field count range but not matching tag", - \\const Foo = enum(u32) { - \\ A = 10, - \\ B = 11, - \\}; - \\export fn entry() void { - \\ var x = @intToEnum(Foo, 0); - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:6:13: error: enum 'Foo' has no tag matching integer value 0", - "tmp.zig:1:13: note: 'Foo' declared here", - }); - - ctx.objErrStage1("comptime cast enum to union but field has payload", - \\const Letter = enum { A, B, C }; - \\const Value = union(Letter) { - \\ A: i32, - \\ B, - \\ C, - \\}; - \\export fn entry() void { - \\ var x: Value = Letter.A; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:8:26: error: cast to union 'Value' must initialize 'i32' field 'A'", - "tmp.zig:3:5: note: field 'A' declared here", - }); - - ctx.objErrStage1("runtime cast to union which has non-void fields", - \\const Letter = enum { A, B, C }; - \\const Value = union(Letter) { - \\ A: i32, - \\ B, - \\ C, - \\}; - \\export fn entry() void { - \\ foo(Letter.A); - \\} - \\fn foo(l: Letter) void { - \\ var x: Value = l; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:11:20: error: runtime cast to union 'Value' which has non-void fields", - "tmp.zig:3:5: note: field 'A' has type 'i32'", - }); - - ctx.objErrStage1("taking byte offset of void field in struct", - \\const Empty = struct { - \\ val: void, - \\}; - \\export fn foo() void { - \\ const fieldOffset = @offsetOf(Empty, "val",); - \\ _ = fieldOffset; - \\} - , &[_][]const u8{ - "tmp.zig:5:42: error: zero-bit field 'val' in struct 'Empty' has no offset", - }); - - ctx.objErrStage1("taking bit offset of void field in struct", - \\const Empty = struct { - \\ val: void, - \\}; - \\export fn foo() void { - \\ const fieldOffset = @bitOffsetOf(Empty, "val",); - \\ _ = fieldOffset; - \\} - , &[_][]const u8{ - "tmp.zig:5:45: error: zero-bit field 'val' in struct 'Empty' has no offset", - }); - - ctx.objErrStage1("invalid union field access in comptime", - \\const Foo = union { - \\ Bar: u8, - \\ Baz: void, - \\}; - \\comptime { - \\ var foo = Foo {.Baz = {}}; - \\ const bar_val = foo.Bar; - \\ _ = bar_val; - \\} - , &[_][]const u8{ - "tmp.zig:7:24: error: accessing union field 'Bar' while field 'Baz' is set", - }); - - ctx.objErrStage1("unsupported modifier at start of asm output constraint", - \\export fn foo() void { - \\ var bar: u32 = 3; - \\ asm volatile ("" : [baz]"+r"(bar) : : ""); - \\} - , &[_][]const u8{ - "tmp.zig:3:5: error: invalid modifier starting output constraint for 'baz': '+', only '=' is supported. Compiler TODO: see https://github.com/ziglang/zig/issues/215", - }); - - ctx.objErrStage1("comptime_int in asm input", - \\export fn foo() void { - \\ asm volatile ("" : : [bar]"r"(3) : ""); - \\} - , &[_][]const u8{ - "tmp.zig:2:35: error: expected sized integer or sized float, found comptime_int", - }); - - ctx.objErrStage1("comptime_float in asm input", - \\export fn foo() void { - \\ asm volatile ("" : : [bar]"r"(3.17) : ""); - \\} - , &[_][]const u8{ - "tmp.zig:2:35: error: expected sized integer or sized float, found comptime_float", - }); - - ctx.objErrStage1("runtime assignment to comptime struct type", - \\const Foo = struct { - \\ Bar: u8, - \\ Baz: type, - \\}; - \\export fn f() void { - \\ var x: u8 = 0; - \\ const foo = Foo { .Bar = x, .Baz = u8 }; - \\ _ = foo; - \\} - , &[_][]const u8{ - "tmp.zig:7:23: error: unable to evaluate constant expression", - }); - - ctx.objErrStage1("runtime assignment to comptime union type", - \\const Foo = union { - \\ Bar: u8, - \\ Baz: type, - \\}; - \\export fn f() void { - \\ var x: u8 = 0; - \\ const foo = Foo { .Bar = x }; - \\ _ = foo; - \\} - , &[_][]const u8{ - "tmp.zig:7:23: error: unable to evaluate constant expression", - }); - - ctx.testErrStage1("@shuffle with selected index past first vector length", - \\export fn entry() void { - \\ const v: @import("std").meta.Vector(4, u32) = [4]u32{ 10, 11, 12, 13 }; - \\ const x: @import("std").meta.Vector(4, u32) = [4]u32{ 14, 15, 16, 17 }; - \\ var z = @shuffle(u32, v, x, [8]i32{ 0, 1, 2, 3, 7, 6, 5, 4 }); - \\ _ = z; - \\} - , &[_][]const u8{ - "tmp.zig:4:39: error: mask index '4' has out-of-bounds selection", - "tmp.zig:4:27: note: selected index '7' out of bounds of @Vector(4, u32)", - "tmp.zig:4:30: note: selections from the second vector are specified with negative numbers", - }); - - ctx.testErrStage1("nested vectors", - \\export fn entry() void { - \\ const V1 = @import("std").meta.Vector(4, u8); - \\ const V2 = @Type(.{ .Vector = .{ .len = 4, .child = V1 } }); - \\ var v: V2 = undefined; - \\ _ = v; - \\} - , &[_][]const u8{ - "tmp.zig:3:23: error: vector element type must be integer, float, bool, or pointer; '@Vector(4, u8)' is invalid", - }); - - ctx.testErrStage1("bad @splat type", - \\export fn entry() void { - \\ const c = 4; - \\ var v = @splat(4, c); - \\ _ = v; - \\} - , &[_][]const u8{ - "tmp.zig:3:23: error: vector element type must be integer, float, bool, or pointer; 'comptime_int' is invalid", - }); - - ctx.objErrStage1("compileLog of tagged enum doesn't crash the compiler", - \\const Bar = union(enum(u32)) { - \\ X: i32 = 1 - \\}; - \\ - \\fn testCompileLog(x: Bar) void { - \\ @compileLog(x); - \\} - \\ - \\pub fn main () void { - \\ comptime testCompileLog(Bar{.X = 123}); - \\} - , &[_][]const u8{ - "tmp.zig:6:5: error: found compile log statement", - }); - - ctx.objErrStage1("attempted implicit cast from *const T to *[1]T", - \\export fn entry(byte: u8) void { - \\ const w: i32 = 1234; - \\ var x: *const i32 = &w; - \\ var y: *[1]i32 = x; - \\ y[0] += 1; - \\ _ = byte; - \\} - , &[_][]const u8{ - "tmp.zig:4:22: error: expected type '*[1]i32', found '*const i32'", - "tmp.zig:4:22: note: cast discards const qualifier", - }); - - ctx.objErrStage1("attempted implicit cast from *const T to []T", - \\export fn entry() void { - \\ const u: u32 = 42; - \\ const x: []u32 = &u; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:3:23: error: expected type '[]u32', found '*const u32'", - }); - - ctx.objErrStage1("for loop body expression ignored", - \\fn returns() usize { - \\ return 2; - \\} - \\export fn f1() void { - \\ for ("hello") |_| returns(); - \\} - \\export fn f2() void { - \\ var x: anyerror!i32 = error.Bad; - \\ for ("hello") |_| returns() else unreachable; - \\ _ = x; - \\} - , &[_][]const u8{ - "tmp.zig:5:30: error: expression value is ignored", - "tmp.zig:9:30: error: expression value is ignored", - }); - - ctx.objErrStage1("aligned variable of zero-bit type", - \\export fn f() void { - \\ var s: struct {} align(4) = undefined; - \\ _ = s; - \\} - , &[_][]const u8{ - "tmp.zig:2:5: error: variable 's' of zero-bit type 'struct:2:12' has no in-memory representation, it cannot be aligned", - }); - - ctx.objErrStage1("function returning opaque type", - \\const FooType = opaque {}; - \\export fn bar() !FooType { - \\ return error.InvalidValue; - \\} - \\export fn bav() !@TypeOf(null) { - \\ return error.InvalidValue; - \\} - \\export fn baz() !@TypeOf(undefined) { - \\ return error.InvalidValue; - \\} - , &[_][]const u8{ - "tmp.zig:2:18: error: Opaque return type 'FooType' not allowed", - "tmp.zig:1:1: note: type declared here", - "tmp.zig:5:18: error: Null return type '@Type(.Null)' not allowed", - "tmp.zig:8:18: error: Undefined return type '@Type(.Undefined)' not allowed", - }); - - ctx.objErrStage1("generic function returning opaque type", - \\const FooType = opaque {}; - \\fn generic(comptime T: type) !T { - \\ return undefined; - \\} - \\export fn bar() void { - \\ _ = generic(FooType); - \\} - \\export fn bav() void { - \\ _ = generic(@TypeOf(null)); - \\} - \\export fn baz() void { - \\ _ = generic(@TypeOf(undefined)); - \\} - , &[_][]const u8{ - "tmp.zig:6:16: error: call to generic function with Opaque return type 'FooType' not allowed", - "tmp.zig:2:1: note: function declared here", - "tmp.zig:1:1: note: type declared here", - "tmp.zig:9:16: error: call to generic function with Null return type '@Type(.Null)' not allowed", - "tmp.zig:2:1: note: function declared here", - "tmp.zig:12:16: error: call to generic function with Undefined return type '@Type(.Undefined)' not allowed", - "tmp.zig:2:1: note: function declared here", - }); - - ctx.objErrStage1("function parameter is opaque", - \\const FooType = opaque {}; - \\export fn entry1() void { - \\ const someFuncPtr: fn (FooType) void = undefined; - \\ _ = someFuncPtr; - \\} - \\ - \\export fn entry2() void { - \\ const someFuncPtr: fn (@TypeOf(null)) void = undefined; - \\ _ = someFuncPtr; - \\} - \\ - \\fn foo(p: FooType) void {_ = p;} - \\export fn entry3() void { - \\ _ = foo; - \\} - \\ - \\fn bar(p: @TypeOf(null)) void {_ = p;} - \\export fn entry4() void { - \\ _ = bar; - \\} - , &[_][]const u8{ - "tmp.zig:3:28: error: parameter of opaque type 'FooType' not allowed", - "tmp.zig:8:28: error: parameter of type '@Type(.Null)' not allowed", - "tmp.zig:12:11: error: parameter of opaque type 'FooType' not allowed", - "tmp.zig:17:11: error: parameter of type '@Type(.Null)' not allowed", - }); - - ctx.objErrStage1( // fixed bug #2032 - "compile diagnostic string for top level decl type", - \\export fn entry() void { - \\ var foo: u32 = @This(){}; - \\ _ = foo; - \\} - , &[_][]const u8{ - "tmp.zig:2:27: error: type 'u32' does not support array initialization", - }); - - ctx.objErrStage1("issue #2687: coerce from undefined array pointer to slice", - \\export fn foo1() void { - \\ const a: *[1]u8 = undefined; - \\ var b: []u8 = a; - \\ _ = b; - \\} - \\export fn foo2() void { - \\ comptime { - \\ var a: *[1]u8 = undefined; - \\ var b: []u8 = a; - \\ _ = b; - \\ } - \\} - \\export fn foo3() void { - \\ comptime { - \\ const a: *[1]u8 = undefined; - \\ var b: []u8 = a; - \\ _ = b; - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:3:19: error: use of undefined value here causes undefined behavior", - "tmp.zig:9:23: error: use of undefined value here causes undefined behavior", - "tmp.zig:16:23: error: use of undefined value here causes undefined behavior", - }); - - ctx.objErrStage1("issue #3818: bitcast from parray/slice to u16", - \\export fn foo1() void { - \\ var bytes = [_]u8{1, 2}; - \\ const word: u16 = @bitCast(u16, bytes[0..]); - \\ _ = word; - \\} - \\export fn foo2() void { - \\ var bytes: []const u8 = &[_]u8{1, 2}; - \\ const word: u16 = @bitCast(u16, bytes); - \\ _ = word; - \\} - , &[_][]const u8{ - "tmp.zig:3:42: error: unable to @bitCast from pointer type '*[2]u8'", - "tmp.zig:8:32: error: destination type 'u16' has size 2 but source type '[]const u8' has size 16", - }); - - // issue #7810 - ctx.objErrStage1("comptime slice-len increment beyond bounds", - \\export fn foo_slice_len_increment_beyond_bounds() void { - \\ comptime { - \\ var buf_storage: [8]u8 = undefined; - \\ var buf: []const u8 = buf_storage[0..]; - \\ buf.len += 1; - \\ buf[8] = 42; - \\ } - \\} - , &[_][]const u8{ - ":6:12: error: out of bounds slice", - }); - - ctx.objErrStage1("comptime slice-sentinel is out of bounds (unterminated)", - \\export fn foo_array() void { - \\ comptime { - \\ var target = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ const slice = target[0..14 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_ptr_array() void { - \\ comptime { - \\ var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target = &buf; - \\ const slice = target[0..14 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_vector_ConstPtrSpecialBaseArray() void { - \\ comptime { - \\ var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*]u8 = &buf; - \\ const slice = target[0..14 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_vector_ConstPtrSpecialRef() void { - \\ comptime { - \\ var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*]u8 = @ptrCast([*]u8, &buf); - \\ const slice = target[0..14 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_cvector_ConstPtrSpecialBaseArray() void { - \\ comptime { - \\ var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*c]u8 = &buf; - \\ const slice = target[0..14 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_cvector_ConstPtrSpecialRef() void { - \\ comptime { - \\ var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*c]u8 = @ptrCast([*c]u8, &buf); - \\ const slice = target[0..14 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_slice() void { - \\ comptime { - \\ var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: []u8 = &buf; - \\ const slice = target[0..14 :0]; - \\ _ = slice; - \\ } - \\} - , &[_][]const u8{ - ":4:29: error: slice-sentinel is out of bounds", - ":12:29: error: slice-sentinel is out of bounds", - ":20:29: error: slice-sentinel is out of bounds", - ":28:29: error: slice-sentinel is out of bounds", - ":36:29: error: slice-sentinel is out of bounds", - ":44:29: error: slice-sentinel is out of bounds", - ":52:29: error: slice-sentinel is out of bounds", - }); - - ctx.objErrStage1("comptime slice-sentinel is out of bounds (terminated)", - \\export fn foo_array() void { - \\ comptime { - \\ var target = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ const slice = target[0..15 :1]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_ptr_array() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target = &buf; - \\ const slice = target[0..15 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_vector_ConstPtrSpecialBaseArray() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*]u8 = &buf; - \\ const slice = target[0..15 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_vector_ConstPtrSpecialRef() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*]u8 = @ptrCast([*]u8, &buf); - \\ const slice = target[0..15 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_cvector_ConstPtrSpecialBaseArray() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*c]u8 = &buf; - \\ const slice = target[0..15 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_cvector_ConstPtrSpecialRef() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*c]u8 = @ptrCast([*c]u8, &buf); - \\ const slice = target[0..15 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_slice() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: []u8 = &buf; - \\ const slice = target[0..15 :0]; - \\ _ = slice; - \\ } - \\} - , &[_][]const u8{ - ":4:29: error: out of bounds slice", - ":12:29: error: out of bounds slice", - ":20:29: error: out of bounds slice", - ":28:29: error: out of bounds slice", - ":36:29: error: out of bounds slice", - ":44:29: error: out of bounds slice", - ":52:29: error: out of bounds slice", - }); - - ctx.objErrStage1("comptime slice-sentinel does not match memory at target index (unterminated)", - \\export fn foo_array() void { - \\ comptime { - \\ var target = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ const slice = target[0..3 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_ptr_array() void { - \\ comptime { - \\ var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target = &buf; - \\ const slice = target[0..3 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_vector_ConstPtrSpecialBaseArray() void { - \\ comptime { - \\ var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*]u8 = &buf; - \\ const slice = target[0..3 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_vector_ConstPtrSpecialRef() void { - \\ comptime { - \\ var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*]u8 = @ptrCast([*]u8, &buf); - \\ const slice = target[0..3 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_cvector_ConstPtrSpecialBaseArray() void { - \\ comptime { - \\ var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*c]u8 = &buf; - \\ const slice = target[0..3 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_cvector_ConstPtrSpecialRef() void { - \\ comptime { - \\ var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*c]u8 = @ptrCast([*c]u8, &buf); - \\ const slice = target[0..3 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_slice() void { - \\ comptime { - \\ var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: []u8 = &buf; - \\ const slice = target[0..3 :0]; - \\ _ = slice; - \\ } - \\} - , &[_][]const u8{ - ":4:29: error: slice-sentinel does not match memory at target index", - ":12:29: error: slice-sentinel does not match memory at target index", - ":20:29: error: slice-sentinel does not match memory at target index", - ":28:29: error: slice-sentinel does not match memory at target index", - ":36:29: error: slice-sentinel does not match memory at target index", - ":44:29: error: slice-sentinel does not match memory at target index", - ":52:29: error: slice-sentinel does not match memory at target index", - }); - - ctx.objErrStage1("comptime slice-sentinel does not match memory at target index (terminated)", - \\export fn foo_array() void { - \\ comptime { - \\ var target = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ const slice = target[0..3 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_ptr_array() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target = &buf; - \\ const slice = target[0..3 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_vector_ConstPtrSpecialBaseArray() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*]u8 = &buf; - \\ const slice = target[0..3 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_vector_ConstPtrSpecialRef() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*]u8 = @ptrCast([*]u8, &buf); - \\ const slice = target[0..3 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_cvector_ConstPtrSpecialBaseArray() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*c]u8 = &buf; - \\ const slice = target[0..3 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_cvector_ConstPtrSpecialRef() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*c]u8 = @ptrCast([*c]u8, &buf); - \\ const slice = target[0..3 :0]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_slice() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: []u8 = &buf; - \\ const slice = target[0..3 :0]; - \\ _ = slice; - \\ } - \\} - , &[_][]const u8{ - ":4:29: error: slice-sentinel does not match memory at target index", - ":12:29: error: slice-sentinel does not match memory at target index", - ":20:29: error: slice-sentinel does not match memory at target index", - ":28:29: error: slice-sentinel does not match memory at target index", - ":36:29: error: slice-sentinel does not match memory at target index", - ":44:29: error: slice-sentinel does not match memory at target index", - ":52:29: error: slice-sentinel does not match memory at target index", - }); - - ctx.objErrStage1("comptime slice-sentinel does not match target-sentinel", - \\export fn foo_array() void { - \\ comptime { - \\ var target = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ const slice = target[0..14 :255]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_ptr_array() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target = &buf; - \\ const slice = target[0..14 :255]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_vector_ConstPtrSpecialBaseArray() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*]u8 = &buf; - \\ const slice = target[0..14 :255]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_vector_ConstPtrSpecialRef() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*]u8 = @ptrCast([*]u8, &buf); - \\ const slice = target[0..14 :255]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_cvector_ConstPtrSpecialBaseArray() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*c]u8 = &buf; - \\ const slice = target[0..14 :255]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_cvector_ConstPtrSpecialRef() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: [*c]u8 = @ptrCast([*c]u8, &buf); - \\ const slice = target[0..14 :255]; - \\ _ = slice; - \\ } - \\} - \\export fn foo_slice() void { - \\ comptime { - \\ var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; - \\ var target: []u8 = &buf; - \\ const slice = target[0..14 :255]; - \\ _ = slice; - \\ } - \\} - , &[_][]const u8{ - ":4:29: error: slice-sentinel does not match target-sentinel", - ":12:29: error: slice-sentinel does not match target-sentinel", - ":20:29: error: slice-sentinel does not match target-sentinel", - ":28:29: error: slice-sentinel does not match target-sentinel", - ":36:29: error: slice-sentinel does not match target-sentinel", - ":44:29: error: slice-sentinel does not match target-sentinel", - ":52:29: error: slice-sentinel does not match target-sentinel", - }); - - ctx.objErrStage1("issue #4207: coerce from non-terminated-slice to terminated-pointer", - \\export fn foo() [*:0]const u8 { - \\ var buffer: [64]u8 = undefined; - \\ return buffer[0..]; - \\} - , &[_][]const u8{ - ":3:18: error: expected type '[*:0]const u8', found '*[64]u8'", - ":3:18: note: destination pointer requires a terminating '0' sentinel", - }); - - ctx.objErrStage1("issue #5221: invalid struct init type referenced by @typeInfo and passed into function", - \\fn ignore(comptime param: anytype) void {_ = param;} - \\ - \\export fn foo() void { - \\ const MyStruct = struct { - \\ wrong_type: []u8 = "foo", - \\ }; - \\ - \\ comptime ignore(@typeInfo(MyStruct).Struct.fields[0]); - \\} - , &[_][]const u8{ - ":5:28: error: cannot cast pointer to array literal to slice type '[]u8'", - ":5:28: note: cast discards const qualifier", - }); - - ctx.objErrStage1("integer underflow error", - \\export fn entry() void { - \\ _ = @intToPtr(*anyopaque, ~@as(usize, @import("std").math.maxInt(usize)) - 1); - \\} - , &[_][]const u8{ - ":2:78: error: operation caused overflow", - }); + // TODO test this in stage2, but we won't even try in stage1 + //ctx.objErrStage1("inline fn calls itself indirectly", + // \\export fn foo() void { + // \\ bar(); + // \\} + // \\fn bar() callconv(.Inline) void { + // \\ baz(); + // \\ quux(); + // \\} + // \\fn baz() callconv(.Inline) void { + // \\ bar(); + // \\ quux(); + // \\} + // \\extern fn quux() void; + //, &[_][]const u8{ + // "tmp.zig:4:1: error: unable to inline function", + //}); + + //ctx.objErrStage1("save reference to inline function", + // \\export fn foo() void { + // \\ quux(@ptrToInt(bar)); + // \\} + // \\fn bar() callconv(.Inline) void { } + // \\extern fn quux(usize) void; + //, &[_][]const u8{ + // "tmp.zig:4:1: error: unable to inline function", + //}); { const case = ctx.obj("align(N) expr function pointers is a compile error", .{ @@ -8812,165 +420,4 @@ pub fn addCases(ctx: *TestContext) !void { "tmp.zig:1:23: error: align(N) expr is not allowed on function prototypes in wasm32/wasm64", }); } - - ctx.objErrStage1("compare optional to non-optional with invalid types", - \\export fn inconsistentChildType() void { - \\ var x: ?i32 = undefined; - \\ const y: comptime_int = 10; - \\ _ = (x == y); - \\} - \\ - \\export fn optionalToOptional() void { - \\ var x: ?i32 = undefined; - \\ var y: ?i32 = undefined; - \\ _ = (x == y); - \\} - \\ - \\export fn optionalVector() void { - \\ var x: ?@Vector(10, i32) = undefined; - \\ var y: @Vector(10, i32) = undefined; - \\ _ = (x == y); - \\} - \\ - \\export fn invalidChildType() void { - \\ var x: ?[3]i32 = undefined; - \\ var y: [3]i32 = undefined; - \\ _ = (x == y); - \\} - , &[_][]const u8{ - ":4:12: error: cannot compare types '?i32' and 'comptime_int'", - ":4:12: note: optional child type 'i32' must be the same as non-optional type 'comptime_int'", - ":10:12: error: cannot compare types '?i32' and '?i32'", - ":10:12: note: optional to optional comparison is only supported for optional pointer types", - ":16:12: error: TODO add comparison of optional vector", - ":22:12: error: cannot compare types '?[3]i32' and '[3]i32'", - ":22:12: note: operator not supported for type '[3]i32'", - }); - - ctx.objErrStage1("slice cannot have its bytes reinterpreted", - \\export fn foo() void { - \\ const bytes = [1]u8{ 0xfa } ** 16; - \\ var value = @ptrCast(*const []const u8, &bytes).*; - \\ _ = value; - \\} - , &[_][]const u8{ - ":3:52: error: slice '[]const u8' cannot have its bytes reinterpreted", - }); - - ctx.objErrStage1("wasmMemorySize is a compile error in non-Wasm targets", - \\export fn foo() void { - \\ _ = @wasmMemorySize(0); - \\ return; - \\} - , &[_][]const u8{ - "tmp.zig:2:9: error: @wasmMemorySize is a wasm32 feature only", - }); - - ctx.objErrStage1("wasmMemoryGrow is a compile error in non-Wasm targets", - \\export fn foo() void { - \\ _ = @wasmMemoryGrow(0, 1); - \\ return; - \\} - , &[_][]const u8{ - "tmp.zig:2:9: error: @wasmMemoryGrow is a wasm32 feature only", - }); - ctx.objErrStage1("Issue #5586: Make unary minus for unsigned types a compile error", - \\export fn f1(x: u32) u32 { - \\ const y = -%x; - \\ return -y; - \\} - \\const V = @import("std").meta.Vector; - \\export fn f2(x: V(4, u32)) V(4, u32) { - \\ const y = -%x; - \\ return -y; - \\} - , &[_][]const u8{ - "tmp.zig:3:12: error: negation of type 'u32'", - "tmp.zig:8:12: error: negation of type 'u32'", - }); - - ctx.objErrStage1("Issue #5618: coercion of ?*anyopaque to *anyopaque must fail.", - \\export fn foo() void { - \\ var u: ?*anyopaque = null; - \\ var v: *anyopaque = undefined; - \\ v = u; - \\} - , &[_][]const u8{ - "tmp.zig:4:9: error: cannot convert optional to payload type. consider using `.?`, `orelse`, or `if`. expected type '*anyopaque', found '?*anyopaque'", - }); - - ctx.objErrStage1("Issue #6823: don't allow .* to be followed by **", - \\fn foo() void { - \\ var sequence = "repeat".*** 10; - \\ _ = sequence; - \\} - , &[_][]const u8{ - // Ideally this would be column 30 but it's not very important. - "tmp.zig:2:28: error: '.*' cannot be followed by '*'. Are you missing a space?", - }); - - ctx.objErrStage1("Issue #9165: windows tcp server compilation error", - \\const std = @import("std"); - \\const builtin = @import("builtin"); - \\pub const io_mode = .evented; - \\pub fn main() !void { - \\ if (builtin.os.tag == .windows) { - \\ _ = try (std.net.StreamServer.init(.{})).accept(); - \\ } else { - \\ @compileError("Unsupported OS"); - \\ } - \\} - , &[_][]const u8{ - "error: Unsupported OS", - }); - - ctx.objErrStage1("attempt to close over comptime variable from outer scope", - \\fn SimpleList(comptime L: usize) type { - \\ var T = u8; - \\ return struct { - \\ array: [L]T, - \\ }; - \\} - , &[_][]const u8{ - "tmp.zig:4:19: error: mutable 'T' not accessible from here", - "tmp.zig:2:9: note: declared mutable here", - "tmp.zig:3:12: note: crosses namespace boundary here", - }); - - ctx.objErrStage1("saturating arithmetic does not allow floats", - \\export fn a() void { - \\ _ = @as(f32, 1.0) +| @as(f32, 1.0); - \\} - , &[_][]const u8{ - "error: invalid operands to binary expression: 'f32' and 'f32'", - }); - - ctx.objErrStage1("saturating shl does not allow negative rhs at comptime", - \\export fn a() void { - \\ _ = @as(i32, 1) <<| @as(i32, -2); - \\} - , &[_][]const u8{ - "error: shift by negative value -2", - }); - - ctx.objErrStage1("saturating shl assign does not allow negative rhs at comptime", - \\export fn a() void { - \\ comptime { - \\ var x = @as(i32, 1); - \\ x <<|= @as(i32, -2); - \\ } - \\} - , &[_][]const u8{ - "error: shift by negative value -2", - }); - - ctx.objErrStage1("undeclared identifier in unanalyzed branch", - \\export fn a() void { - \\ if (false) { - \\ lol_this_doesnt_exist = nonsense; - \\ } - \\} - , &[_][]const u8{ - "tmp.zig:3:9: error: use of undeclared identifier 'lol_this_doesnt_exist'", - }); } diff --git a/test/compile_errors/stage1/exe/main_missing_name.zig b/test/compile_errors/stage1/exe/main_missing_name.zig new file mode 100644 index 0000000000000000000000000000000000000000..c029665367f5e7d6c4c4ee222f362fedcdff83b8 --- /dev/null +++ b/test/compile_errors/stage1/exe/main_missing_name.zig @@ -0,0 +1,5 @@ +pub fn (main) void {} + +// main missing name +// +// tmp.zig:1:5: error: missing function name diff --git a/test/compile_errors/stage1/exe/missing_main_fn_in_executable.zig b/test/compile_errors/stage1/exe/missing_main_fn_in_executable.zig new file mode 100644 index 0000000000000000000000000000000000000000..eb9ab469fd7205f969eacdb5d4014bac6d142312 --- /dev/null +++ b/test/compile_errors/stage1/exe/missing_main_fn_in_executable.zig @@ -0,0 +1,5 @@ + + +// missing main fn in executable +// +// error: root source file has no member called 'main' diff --git a/test/compile_errors/stage1/exe/private_main_fn.zig b/test/compile_errors/stage1/exe/private_main_fn.zig new file mode 100644 index 0000000000000000000000000000000000000000..da617899a50f80acdc792e22733a3721e84edaf8 --- /dev/null +++ b/test/compile_errors/stage1/exe/private_main_fn.zig @@ -0,0 +1,6 @@ +fn main() void {} + +// private main fn +// +// error: 'main' is private +// tmp.zig:1:1: note: declared here diff --git a/test/compile_errors/stage1/exe/std.fmt_error_for_unused_arguments.zig b/test/compile_errors/stage1/exe/std.fmt_error_for_unused_arguments.zig new file mode 100644 index 0000000000000000000000000000000000000000..7da78d5b03eea75d36b30b4bde7d001a2c90c764 --- /dev/null +++ b/test/compile_errors/stage1/exe/std.fmt_error_for_unused_arguments.zig @@ -0,0 +1,7 @@ +pub fn main() !void { + @import("std").debug.print("{d} {d} {d} {d} {d}", .{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}); +} + +// std.fmt error for unused arguments +// +// ?:?:?: error: 10 unused arguments in '{d} {d} {d} {d} {d}' diff --git a/test/compile_errors/stage1/obj/C_pointer_pointing_to_non_C_ABI_compatible_type_or_has_align_attr.zig b/test/compile_errors/stage1/obj/C_pointer_pointing_to_non_C_ABI_compatible_type_or_has_align_attr.zig new file mode 100644 index 0000000000000000000000000000000000000000..24fd0d1b9ffa2efaab1881a04cd6f39543ba1a36 --- /dev/null +++ b/test/compile_errors/stage1/obj/C_pointer_pointing_to_non_C_ABI_compatible_type_or_has_align_attr.zig @@ -0,0 +1,10 @@ +const Foo = struct {}; +export fn a() void { + const T = [*c]Foo; + var t: T = undefined; + _ = t; +} + +// C pointer pointing to non C ABI compatible type or has align attr +// +// tmp.zig:3:19: error: C pointers cannot point to non-C-ABI-compatible type 'Foo' diff --git a/test/compile_errors/stage1/obj/C_pointer_to_anyopaque.zig b/test/compile_errors/stage1/obj/C_pointer_to_anyopaque.zig new file mode 100644 index 0000000000000000000000000000000000000000..301299614545d30e5337d4f215d5e125ea946669 --- /dev/null +++ b/test/compile_errors/stage1/obj/C_pointer_to_anyopaque.zig @@ -0,0 +1,9 @@ +export fn a() void { + var x: *anyopaque = undefined; + var y: [*c]anyopaque = x; + _ = y; +} + +// C pointer to anyopaque +// +// tmp.zig:3:16: error: C pointers cannot point to opaque types diff --git a/test/compile_errors/stage1/obj/Frame_of_generic_function.zig b/test/compile_errors/stage1/obj/Frame_of_generic_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..b9b2280dd7df878abfe44cb469b0d11134f3677e --- /dev/null +++ b/test/compile_errors/stage1/obj/Frame_of_generic_function.zig @@ -0,0 +1,12 @@ +export fn entry() void { + var frame: @Frame(func) = undefined; + _ = frame; +} +fn func(comptime T: type) void { + var x: T = undefined; + _ = x; +} + +// @Frame() of generic function +// +// tmp.zig:2:16: error: @Frame() of generic function diff --git a/test/compile_errors/stage1/obj/Issue_5586_Make_unary_minus_for_unsigned_types_a_compile_error.zig b/test/compile_errors/stage1/obj/Issue_5586_Make_unary_minus_for_unsigned_types_a_compile_error.zig new file mode 100644 index 0000000000000000000000000000000000000000..d01e68e4eb8051456ab847723eaf92fb2df0acf6 --- /dev/null +++ b/test/compile_errors/stage1/obj/Issue_5586_Make_unary_minus_for_unsigned_types_a_compile_error.zig @@ -0,0 +1,14 @@ +export fn f1(x: u32) u32 { + const y = -%x; + return -y; +} +const V = @import("std").meta.Vector; +export fn f2(x: V(4, u32)) V(4, u32) { + const y = -%x; + return -y; +} + +// Issue #5586: Make unary minus for unsigned types a compile error +// +// tmp.zig:3:12: error: negation of type 'u32' +// tmp.zig:8:12: error: negation of type 'u32' diff --git a/test/compile_errors/stage1/obj/Issue_6823_dont_allow_._to_be_followed_by_.zig b/test/compile_errors/stage1/obj/Issue_6823_dont_allow_._to_be_followed_by_.zig new file mode 100644 index 0000000000000000000000000000000000000000..c21df43362be681dcb239ca9cb13dacb5c34db2c --- /dev/null +++ b/test/compile_errors/stage1/obj/Issue_6823_dont_allow_._to_be_followed_by_.zig @@ -0,0 +1,8 @@ +fn foo() void { + var sequence = "repeat".*** 10; + _ = sequence; +} + +// Issue #6823: don't allow .* to be followed by ** +// +// tmp.zig:2:28: error: '.*' cannot be followed by '*'. Are you missing a space? diff --git a/test/compile_errors/stage1/obj/Issue_9165_windows_tcp_server_compilation_error.zig b/test/compile_errors/stage1/obj/Issue_9165_windows_tcp_server_compilation_error.zig new file mode 100644 index 0000000000000000000000000000000000000000..e3b9d4b009ca59e6fe544e5fcf2cd56fad06ad6b --- /dev/null +++ b/test/compile_errors/stage1/obj/Issue_9165_windows_tcp_server_compilation_error.zig @@ -0,0 +1,14 @@ +const std = @import("std"); +const builtin = @import("builtin"); +pub const io_mode = .evented; +pub fn main() !void { + if (builtin.os.tag == .windows) { + _ = try (std.net.StreamServer.init(.{})).accept(); + } else { + @compileError("Unsupported OS"); + } +} + +// Issue #9165: windows tcp server compilation error +// +// error: Unsupported OS diff --git a/test/compile_errors/stage1/obj/access_non-existent_member_of_error_set.zig b/test/compile_errors/stage1/obj/access_non-existent_member_of_error_set.zig new file mode 100644 index 0000000000000000000000000000000000000000..42a54b08cd03e459f89f96a55298e858128ee06c --- /dev/null +++ b/test/compile_errors/stage1/obj/access_non-existent_member_of_error_set.zig @@ -0,0 +1,9 @@ +const Foo = error{A}; +comptime { + const z = Foo.Bar; + _ = z; +} + +// access non-existent member of error set +// +// tmp.zig:3:18: error: no error named 'Bar' in 'Foo' diff --git a/test/compile_errors/stage1/obj/accessing_runtime_parameter_from_outer_function.zig b/test/compile_errors/stage1/obj/accessing_runtime_parameter_from_outer_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..68b23c6a43dcbaab1a97a3b05167d440f8ae9626 --- /dev/null +++ b/test/compile_errors/stage1/obj/accessing_runtime_parameter_from_outer_function.zig @@ -0,0 +1,19 @@ +fn outer(y: u32) fn (u32) u32 { + const st = struct { + fn get(z: u32) u32 { + return z + y; + } + }; + return st.get; +} +export fn entry() void { + var func = outer(10); + var x = func(3); + _ = x; +} + +// accessing runtime parameter from outer function +// +// tmp.zig:4:24: error: 'y' not accessible from inner function +// tmp.zig:3:28: note: crossed function definition here +// tmp.zig:1:10: note: declared here diff --git a/test/compile_errors/stage1/obj/add_assign_on_undefined_value.zig b/test/compile_errors/stage1/obj/add_assign_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..0076cf1bab658acc1e0643b51988e59fe0e6f1f0 --- /dev/null +++ b/test/compile_errors/stage1/obj/add_assign_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + a += a; +} + +// add assign on undefined value +// +// tmp.zig:3:5: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/add_on_undefined_value.zig b/test/compile_errors/stage1/obj/add_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..5f64c6999b230dff39b512e262f68ec05e09f866 --- /dev/null +++ b/test/compile_errors/stage1/obj/add_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + _ = a + a; +} + +// add on undefined value +// +// tmp.zig:3:9: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/add_overflow_in_function_evaluation.zig b/test/compile_errors/stage1/obj/add_overflow_in_function_evaluation.zig new file mode 100644 index 0000000000000000000000000000000000000000..b01e005a045064d91fe3e3b0070f7d11daf0841e --- /dev/null +++ b/test/compile_errors/stage1/obj/add_overflow_in_function_evaluation.zig @@ -0,0 +1,10 @@ +const y = add(65530, 10); +fn add(a: u16, b: u16) u16 { + return a + b; +} + +export fn entry() usize { return @sizeOf(@TypeOf(y)); } + +// add overflow in function evaluation +// +// tmp.zig:3:14: error: operation caused overflow diff --git a/test/compile_errors/stage1/obj/add_wrap_assign_on_undefined_value.zig b/test/compile_errors/stage1/obj/add_wrap_assign_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..37dbf9106f818d0dc09d55b69f3ceda18ac6d2fd --- /dev/null +++ b/test/compile_errors/stage1/obj/add_wrap_assign_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + a +%= a; +} + +// add wrap assign on undefined value +// +// tmp.zig:3:5: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/add_wrap_on_undefined_value.zig b/test/compile_errors/stage1/obj/add_wrap_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..3ba9bd11c6fdc4927d15812a8e70243b1c052f24 --- /dev/null +++ b/test/compile_errors/stage1/obj/add_wrap_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + _ = a +% a; +} + +// add wrap on undefined value +// +// tmp.zig:3:9: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/addition_with_non_numbers.zig b/test/compile_errors/stage1/obj/addition_with_non_numbers.zig new file mode 100644 index 0000000000000000000000000000000000000000..296b9f41039aaead3f06ec95ca2db40d22e198b9 --- /dev/null +++ b/test/compile_errors/stage1/obj/addition_with_non_numbers.zig @@ -0,0 +1,10 @@ +const Foo = struct { + field: i32, +}; +const x = Foo {.field = 1} + Foo {.field = 2}; + +export fn entry() usize { return @sizeOf(@TypeOf(x)); } + +// addition with non numbers +// +// tmp.zig:4:28: error: invalid operands to binary expression: 'Foo' and 'Foo' diff --git a/test/compile_errors/stage1/obj/address_of_number_literal.zig b/test/compile_errors/stage1/obj/address_of_number_literal.zig new file mode 100644 index 0000000000000000000000000000000000000000..ee61f2180fb3afd3031cc7df897636befb08955e --- /dev/null +++ b/test/compile_errors/stage1/obj/address_of_number_literal.zig @@ -0,0 +1,8 @@ +const x = 3; +const y = &x; +fn foo() *const i32 { return y; } +export fn entry() usize { return @sizeOf(@TypeOf(foo)); } + +// address of number literal +// +// tmp.zig:3:30: error: expected type '*const i32', found '*const comptime_int' diff --git a/test/compile_errors/stage1/obj/alignCast_expects_pointer_or_slice.zig b/test/compile_errors/stage1/obj/alignCast_expects_pointer_or_slice.zig new file mode 100644 index 0000000000000000000000000000000000000000..91b269cef42fcf5a8ebb754e927989cf71cc8828 --- /dev/null +++ b/test/compile_errors/stage1/obj/alignCast_expects_pointer_or_slice.zig @@ -0,0 +1,7 @@ +export fn entry() void { + @alignCast(4, @as(u32, 3)); +} + +// @alignCast expects pointer or slice +// +// tmp.zig:2:19: error: expected pointer or slice, found 'u32' diff --git a/test/compile_errors/stage1/obj/aligned_variable_of_zero-bit_type.zig b/test/compile_errors/stage1/obj/aligned_variable_of_zero-bit_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..90e690056d6ad5f855107a4dc3db5e1d9e5fe9e4 --- /dev/null +++ b/test/compile_errors/stage1/obj/aligned_variable_of_zero-bit_type.zig @@ -0,0 +1,8 @@ +export fn f() void { + var s: struct {} align(4) = undefined; + _ = s; +} + +// aligned variable of zero-bit type +// +// tmp.zig:2:5: error: variable 's' of zero-bit type 'struct:2:12' has no in-memory representation, it cannot be aligned diff --git a/test/compile_errors/stage1/obj/alignment_of_enum_field_specified.zig b/test/compile_errors/stage1/obj/alignment_of_enum_field_specified.zig new file mode 100644 index 0000000000000000000000000000000000000000..cf5cdfd2134ea31230024a2c557de5410d4f51b9 --- /dev/null +++ b/test/compile_errors/stage1/obj/alignment_of_enum_field_specified.zig @@ -0,0 +1,12 @@ +const Number = enum { + a, + b align(i32), +}; +export fn entry1() void { + var x: Number = undefined; + _ = x; +} + +// alignment of enum field specified +// +// tmp.zig:3:7: error: expected ',' after field diff --git a/test/compile_errors/stage1/obj/ambiguous_decl_reference.zig b/test/compile_errors/stage1/obj/ambiguous_decl_reference.zig new file mode 100644 index 0000000000000000000000000000000000000000..421c41d2c23eb67601c04e716f00b627ac16e772 --- /dev/null +++ b/test/compile_errors/stage1/obj/ambiguous_decl_reference.zig @@ -0,0 +1,19 @@ +fn foo() void {} +fn bar() void { + const S = struct { + fn baz() void { + foo(); + } + fn foo() void {} + }; + S.baz(); +} +export fn entry() void { + bar(); +} + +// ambiguous decl reference +// +// tmp.zig:5:13: error: ambiguous reference +// tmp.zig:7:9: note: declared here +// tmp.zig:1:1: note: also declared here diff --git a/test/compile_errors/stage1/obj/and_on_undefined_value.zig b/test/compile_errors/stage1/obj/and_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..82363848f3f9917f4849a8117e7eb029c318450c --- /dev/null +++ b/test/compile_errors/stage1/obj/and_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: bool = undefined; + _ = a and a; +} + +// and on undefined value +// +// tmp.zig:3:9: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/array_access_of_non_array.zig b/test/compile_errors/stage1/obj/array_access_of_non_array.zig new file mode 100644 index 0000000000000000000000000000000000000000..e4420debcd044ab6792e183977f77742bd94083a --- /dev/null +++ b/test/compile_errors/stage1/obj/array_access_of_non_array.zig @@ -0,0 +1,13 @@ +export fn f() void { + var bad : bool = undefined; + bad[0] = bad[0]; +} +export fn g() void { + var bad : bool = undefined; + _ = bad[0]; +} + +// array access of non array +// +// tmp.zig:3:8: error: array access of non-array type 'bool' +// tmp.zig:7:12: error: array access of non-array type 'bool' diff --git a/test/compile_errors/stage1/obj/array_access_of_type.zig b/test/compile_errors/stage1/obj/array_access_of_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..82708eed6c1c168bd18762162274733b04168a2c --- /dev/null +++ b/test/compile_errors/stage1/obj/array_access_of_type.zig @@ -0,0 +1,8 @@ +export fn foo() void { + var b: u8[40] = undefined; + _ = b; +} + +// array access of type +// +// tmp.zig:2:14: error: array access of non-array type 'type' diff --git a/test/compile_errors/stage1/obj/array_access_of_undeclared_identifier.zig b/test/compile_errors/stage1/obj/array_access_of_undeclared_identifier.zig new file mode 100644 index 0000000000000000000000000000000000000000..193a7bf5de00b9da5aa6abd3899b4a3f606fc660 --- /dev/null +++ b/test/compile_errors/stage1/obj/array_access_of_undeclared_identifier.zig @@ -0,0 +1,7 @@ +export fn f() void { + i[i] = i[i]; +} + +// array access of undeclared identifier +// +// tmp.zig:2:5: error: use of undeclared identifier 'i' diff --git a/test/compile_errors/stage1/obj/array_access_with_non_integer_index.zig b/test/compile_errors/stage1/obj/array_access_with_non_integer_index.zig new file mode 100644 index 0000000000000000000000000000000000000000..1a3e17d8964005e9d3a481fd9d7c4d9d749ce19d --- /dev/null +++ b/test/compile_errors/stage1/obj/array_access_with_non_integer_index.zig @@ -0,0 +1,15 @@ +export fn f() void { + var array = "aoeu"; + var bad = false; + array[bad] = array[bad]; +} +export fn g() void { + var array = "aoeu"; + var bad = false; + _ = array[bad]; +} + +// array access with non integer index +// +// tmp.zig:4:11: error: expected type 'usize', found 'bool' +// tmp.zig:9:15: error: expected type 'usize', found 'bool' diff --git a/test/compile_errors/stage1/obj/array_concatenation_with_wrong_type.zig b/test/compile_errors/stage1/obj/array_concatenation_with_wrong_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..91036e5f254b97cf0a5596f042e582a861ed3d64 --- /dev/null +++ b/test/compile_errors/stage1/obj/array_concatenation_with_wrong_type.zig @@ -0,0 +1,9 @@ +const src = "aoeu"; +const derp: usize = 1234; +const a = derp ++ "foo"; + +export fn entry() usize { return @sizeOf(@TypeOf(a)); } + +// array concatenation with wrong type +// +// tmp.zig:3:11: error: expected array, found 'usize' diff --git a/test/compile_errors/stage1/obj/array_in_c_exported_function.zig b/test/compile_errors/stage1/obj/array_in_c_exported_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..fe03d220b1771bce73a2ac82a9635f9c4835d381 --- /dev/null +++ b/test/compile_errors/stage1/obj/array_in_c_exported_function.zig @@ -0,0 +1,12 @@ +export fn zig_array(x: [10]u8) void { + try std.testing.expect(std.mem.eql(u8, &x, "1234567890")); +} +const std = @import("std"); +export fn zig_return_array() [10]u8 { + return "1234567890".*; +} + +// array in c exported function +// +// tmp.zig:1:24: error: parameter of type '[10]u8' not allowed in function with calling convention 'C' +// tmp.zig:5:30: error: return type '[10]u8' not allowed in function with calling convention 'C' diff --git a/test/compile_errors/stage1/obj/asm_at_compile_time.zig b/test/compile_errors/stage1/obj/asm_at_compile_time.zig new file mode 100644 index 0000000000000000000000000000000000000000..e08b500c6e07515caee4c27d451b02e9bf41f1f2 --- /dev/null +++ b/test/compile_errors/stage1/obj/asm_at_compile_time.zig @@ -0,0 +1,15 @@ +comptime { + doSomeAsm(); +} + +fn doSomeAsm() void { + asm volatile ( + \\.globl aoeu; + \\.type aoeu, @function; + \\.set aoeu, derp; + ); +} + +// asm at compile time +// +// tmp.zig:6:5: error: unable to evaluate constant expression diff --git a/test/compile_errors/stage1/obj/assign_inline_fn_to_non-comptime_var.zig b/test/compile_errors/stage1/obj/assign_inline_fn_to_non-comptime_var.zig new file mode 100644 index 0000000000000000000000000000000000000000..aa7bb91d1b0c42e72c48ee179a8664350dc751b8 --- /dev/null +++ b/test/compile_errors/stage1/obj/assign_inline_fn_to_non-comptime_var.zig @@ -0,0 +1,10 @@ +export fn entry() void { + var a = b; + _ = a; +} +fn b() callconv(.Inline) void { } + +// assign inline fn to non-comptime var +// +// tmp.zig:2:5: error: functions marked inline must be stored in const or comptime var +// tmp.zig:5:1: note: declared here diff --git a/test/compile_errors/stage1/obj/assign_null_to_non-optional_pointer.zig b/test/compile_errors/stage1/obj/assign_null_to_non-optional_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..9c1aaf5031a30ef09476ac3e1c42286ffb615f34 --- /dev/null +++ b/test/compile_errors/stage1/obj/assign_null_to_non-optional_pointer.zig @@ -0,0 +1,7 @@ +const a: *u8 = null; + +export fn entry() usize { return @sizeOf(@TypeOf(a)); } + +// assign null to non-optional pointer +// +// tmp.zig:1:16: error: expected type '*u8', found '@Type(.Null)' diff --git a/test/compile_errors/stage1/obj/assign_through_constant_pointer.zig b/test/compile_errors/stage1/obj/assign_through_constant_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..452e3ea617ea2b753edcbac8896bc385a8923269 --- /dev/null +++ b/test/compile_errors/stage1/obj/assign_through_constant_pointer.zig @@ -0,0 +1,8 @@ +export fn f() void { + var cstr = "Hat"; + cstr[0] = 'W'; +} + +// assign through constant pointer +// +// tmp.zig:3:13: error: cannot assign to constant diff --git a/test/compile_errors/stage1/obj/assign_through_constant_slice.zig b/test/compile_errors/stage1/obj/assign_through_constant_slice.zig new file mode 100644 index 0000000000000000000000000000000000000000..e36991897bce00ddd20c6f6847bc67324044be8b --- /dev/null +++ b/test/compile_errors/stage1/obj/assign_through_constant_slice.zig @@ -0,0 +1,8 @@ +export fn f() void { + var cstr: []const u8 = "Hat"; + cstr[0] = 'W'; +} + +// assign through constant slice +// +// tmp.zig:3:13: error: cannot assign to constant diff --git a/test/compile_errors/stage1/obj/assign_to_constant_field.zig b/test/compile_errors/stage1/obj/assign_to_constant_field.zig new file mode 100644 index 0000000000000000000000000000000000000000..f371655fb5f4eced27e6805bbdd899842a8e8d52 --- /dev/null +++ b/test/compile_errors/stage1/obj/assign_to_constant_field.zig @@ -0,0 +1,11 @@ +const Foo = struct { + field: i32, +}; +export fn derp() void { + const f = Foo {.field = 1234,}; + f.field = 0; +} + +// assign to constant field +// +// tmp.zig:6:15: error: cannot assign to constant diff --git a/test/compile_errors/stage1/obj/assign_to_constant_variable.zig b/test/compile_errors/stage1/obj/assign_to_constant_variable.zig new file mode 100644 index 0000000000000000000000000000000000000000..1e8dd6c06fd48632443a889adbea552c56e1e555 --- /dev/null +++ b/test/compile_errors/stage1/obj/assign_to_constant_variable.zig @@ -0,0 +1,8 @@ +export fn f() void { + const a = 3; + a = 4; +} + +// assign to constant variable +// +// tmp.zig:3:9: error: cannot assign to constant diff --git a/test/compile_errors/stage1/obj/assign_to_invalid_dereference.zig b/test/compile_errors/stage1/obj/assign_to_invalid_dereference.zig new file mode 100644 index 0000000000000000000000000000000000000000..6466f7afc85daabea743b43db9246c9fd8c2d7de --- /dev/null +++ b/test/compile_errors/stage1/obj/assign_to_invalid_dereference.zig @@ -0,0 +1,7 @@ +export fn entry() void { + 'a'.* = 1; +} + +// assign to invalid dereference +// +// tmp.zig:2:8: error: attempt to dereference non-pointer type 'comptime_int' diff --git a/test/compile_errors/stage1/obj/assign_too_big_number_to_u16.zig b/test/compile_errors/stage1/obj/assign_too_big_number_to_u16.zig new file mode 100644 index 0000000000000000000000000000000000000000..13b5280588374fb749c09bfb24e1ee19aa43c791 --- /dev/null +++ b/test/compile_errors/stage1/obj/assign_too_big_number_to_u16.zig @@ -0,0 +1,8 @@ +export fn foo() void { + var vga_mem: u16 = 0xB8000; + _ = vga_mem; +} + +// assign too big number to u16 +// +// tmp.zig:2:24: error: integer value 753664 cannot be coerced to type 'u16' diff --git a/test/compile_errors/stage1/obj/assign_unreachable.zig b/test/compile_errors/stage1/obj/assign_unreachable.zig new file mode 100644 index 0000000000000000000000000000000000000000..78e2305abcc6f6af1f32d898c46392447caf3d57 --- /dev/null +++ b/test/compile_errors/stage1/obj/assign_unreachable.zig @@ -0,0 +1,8 @@ +export fn f() void { + const a = return; +} + +// assign unreachable +// +// tmp.zig:2:5: error: unreachable code +// tmp.zig:2:15: note: control flow is diverted here diff --git a/test/compile_errors/stage1/obj/assigning_to_struct_or_union_fields_that_are_not_optionals_with_a_function_that_returns_an_optional.zig b/test/compile_errors/stage1/obj/assigning_to_struct_or_union_fields_that_are_not_optionals_with_a_function_that_returns_an_optional.zig new file mode 100644 index 0000000000000000000000000000000000000000..f93650821b8ff9563ec0f301512aabaa3022402c --- /dev/null +++ b/test/compile_errors/stage1/obj/assigning_to_struct_or_union_fields_that_are_not_optionals_with_a_function_that_returns_an_optional.zig @@ -0,0 +1,19 @@ +fn maybe(is: bool) ?u8 { + if (is) return @as(u8, 10) else return null; +} +const U = union { + Ye: u8, +}; +const S = struct { + num: u8, +}; +export fn entry() void { + var u = U{ .Ye = maybe(false) }; + var s = S{ .num = maybe(false) }; + _ = u; + _ = s; +} + +// assigning to struct or union fields that are not optionals with a function that returns an optional +// +// tmp.zig:11:27: error: cannot convert optional to payload type. consider using `.?`, `orelse`, or `if`. expected type 'u8', found '?u8' diff --git a/test/compile_errors/stage1/obj/async_function_depends_on_its_own_frame.zig b/test/compile_errors/stage1/obj/async_function_depends_on_its_own_frame.zig new file mode 100644 index 0000000000000000000000000000000000000000..0d1cd7f77ef06d5234777358ba97557e4fd5ba1c --- /dev/null +++ b/test/compile_errors/stage1/obj/async_function_depends_on_its_own_frame.zig @@ -0,0 +1,11 @@ +export fn entry() void { + _ = async amain(); +} +fn amain() callconv(.Async) void { + var x: [@sizeOf(@Frame(amain))]u8 = undefined; + _ = x; +} + +// async function depends on its own frame +// +// tmp.zig:4:1: error: cannot resolve '@Frame(amain)': function not fully analyzed yet diff --git a/test/compile_errors/stage1/obj/async_function_indirectly_depends_on_its_own_frame.zig b/test/compile_errors/stage1/obj/async_function_indirectly_depends_on_its_own_frame.zig new file mode 100644 index 0000000000000000000000000000000000000000..809409f524eee657da7193740ec3253817d7b845 --- /dev/null +++ b/test/compile_errors/stage1/obj/async_function_indirectly_depends_on_its_own_frame.zig @@ -0,0 +1,15 @@ +export fn entry() void { + _ = async amain(); +} +fn amain() callconv(.Async) void { + other(); +} +fn other() void { + var x: [@sizeOf(@Frame(amain))]u8 = undefined; + _ = x; +} + +// async function indirectly depends on its own frame +// +// tmp.zig:4:1: error: unable to determine async function frame of 'amain' +// tmp.zig:5:10: note: analysis of function 'other' depends on the frame diff --git a/test/compile_errors/stage1/obj/atomic_orderings_of_atomicStore_Acquire_or_AcqRel.zig b/test/compile_errors/stage1/obj/atomic_orderings_of_atomicStore_Acquire_or_AcqRel.zig new file mode 100644 index 0000000000000000000000000000000000000000..7d97c2813e5e78e0bb66a641033dcc96bd4340f7 --- /dev/null +++ b/test/compile_errors/stage1/obj/atomic_orderings_of_atomicStore_Acquire_or_AcqRel.zig @@ -0,0 +1,8 @@ +export fn entry() void { + var x: u32 = 0; + @atomicStore(u32, &x, 1, .Acquire); +} + +// atomic orderings of atomicStore Acquire or AcqRel +// +// tmp.zig:3:30: error: @atomicStore atomic ordering must not be Acquire or AcqRel diff --git a/test/compile_errors/stage1/obj/atomic_orderings_of_cmpxchg-failure_stricter_than_success.zig b/test/compile_errors/stage1/obj/atomic_orderings_of_cmpxchg-failure_stricter_than_success.zig new file mode 100644 index 0000000000000000000000000000000000000000..d6d9ab478b72da757866c4c686c0601f8f51b882 --- /dev/null +++ b/test/compile_errors/stage1/obj/atomic_orderings_of_cmpxchg-failure_stricter_than_success.zig @@ -0,0 +1,9 @@ +const AtomicOrder = @import("std").builtin.AtomicOrder; +export fn f() void { + var x: i32 = 1234; + while (!@cmpxchgWeak(i32, &x, 1234, 5678, AtomicOrder.Monotonic, AtomicOrder.SeqCst)) {} +} + +// atomic orderings of cmpxchg - failure stricter than success +// +// tmp.zig:4:81: error: failure atomic ordering must be no stricter than success diff --git a/test/compile_errors/stage1/obj/atomic_orderings_of_cmpxchg-success_Monotonic_or_stricter.zig b/test/compile_errors/stage1/obj/atomic_orderings_of_cmpxchg-success_Monotonic_or_stricter.zig new file mode 100644 index 0000000000000000000000000000000000000000..770c08f3fe0089245469ff284207c477ca7ff528 --- /dev/null +++ b/test/compile_errors/stage1/obj/atomic_orderings_of_cmpxchg-success_Monotonic_or_stricter.zig @@ -0,0 +1,9 @@ +const AtomicOrder = @import("std").builtin.AtomicOrder; +export fn f() void { + var x: i32 = 1234; + while (!@cmpxchgWeak(i32, &x, 1234, 5678, AtomicOrder.Unordered, AtomicOrder.Unordered)) {} +} + +// atomic orderings of cmpxchg - success Monotonic or stricter +// +// tmp.zig:4:58: error: success atomic ordering must be Monotonic or stricter diff --git a/test/compile_errors/stage1/obj/atomic_orderings_of_fence_Acquire_or_stricter.zig b/test/compile_errors/stage1/obj/atomic_orderings_of_fence_Acquire_or_stricter.zig new file mode 100644 index 0000000000000000000000000000000000000000..34ee200eeb2aeb1dcffa4da556c8d7028387300d --- /dev/null +++ b/test/compile_errors/stage1/obj/atomic_orderings_of_fence_Acquire_or_stricter.zig @@ -0,0 +1,7 @@ +export fn entry() void { + @fence(.Monotonic); +} + +// atomic orderings of fence Acquire or stricter +// +// tmp.zig:2:12: error: atomic ordering must be Acquire or stricter diff --git a/test/compile_errors/stage1/obj/atomicrmw_with_bool_op_not_.Xchg.zig b/test/compile_errors/stage1/obj/atomicrmw_with_bool_op_not_.Xchg.zig new file mode 100644 index 0000000000000000000000000000000000000000..03309737cff565887bc869d64d80a01b44b15389 --- /dev/null +++ b/test/compile_errors/stage1/obj/atomicrmw_with_bool_op_not_.Xchg.zig @@ -0,0 +1,8 @@ +export fn entry() void { + var x = false; + _ = @atomicRmw(bool, &x, .Add, true, .SeqCst); +} + +// atomicrmw with bool op not .Xchg +// +// tmp.zig:3:30: error: @atomicRmw with bool only allowed with .Xchg diff --git a/test/compile_errors/stage1/obj/atomicrmw_with_enum_op_not_.Xchg.zig b/test/compile_errors/stage1/obj/atomicrmw_with_enum_op_not_.Xchg.zig new file mode 100644 index 0000000000000000000000000000000000000000..95e6a7d95d7f16f7787d745ce00197f6d122ac39 --- /dev/null +++ b/test/compile_errors/stage1/obj/atomicrmw_with_enum_op_not_.Xchg.zig @@ -0,0 +1,14 @@ +export fn entry() void { + const E = enum(u8) { + a, + b, + c, + d, + }; + var x: E = .a; + _ = @atomicRmw(E, &x, .Add, .b, .SeqCst); +} + +// atomicrmw with enum op not .Xchg +// +// tmp.zig:9:27: error: @atomicRmw with enum only allowed with .Xchg diff --git a/test/compile_errors/stage1/obj/atomicrmw_with_float_op_not_.Xchg_.Add_or_.Sub.zig b/test/compile_errors/stage1/obj/atomicrmw_with_float_op_not_.Xchg_.Add_or_.Sub.zig new file mode 100644 index 0000000000000000000000000000000000000000..a7359dbf32494be1574276704e67b74190073c2d --- /dev/null +++ b/test/compile_errors/stage1/obj/atomicrmw_with_float_op_not_.Xchg_.Add_or_.Sub.zig @@ -0,0 +1,8 @@ +export fn entry() void { + var x: f32 = 0; + _ = @atomicRmw(f32, &x, .And, 2, .SeqCst); +} + +// atomicrmw with float op not .Xchg, .Add or .Sub +// +// tmp.zig:3:29: error: @atomicRmw with float only allowed with .Xchg, .Add and .Sub diff --git a/test/compile_errors/stage1/obj/attempt_to_cast_enum_literal_to_error.zig b/test/compile_errors/stage1/obj/attempt_to_cast_enum_literal_to_error.zig new file mode 100644 index 0000000000000000000000000000000000000000..fd120af3eb74b6841515715d899acac57d699dee --- /dev/null +++ b/test/compile_errors/stage1/obj/attempt_to_cast_enum_literal_to_error.zig @@ -0,0 +1,9 @@ +export fn entry() void { + switch (error.Hi) { + .Hi => {}, + } +} + +// attempt to cast enum literal to error +// +// tmp.zig:3:9: error: expected type 'error{Hi}', found '@Type(.EnumLiteral)' diff --git a/test/compile_errors/stage1/obj/attempt_to_close_over_comptime_variable_from_outer_scope.zig b/test/compile_errors/stage1/obj/attempt_to_close_over_comptime_variable_from_outer_scope.zig new file mode 100644 index 0000000000000000000000000000000000000000..5eb5db3dc8826a503c61cc2c158beed6d89e06ad --- /dev/null +++ b/test/compile_errors/stage1/obj/attempt_to_close_over_comptime_variable_from_outer_scope.zig @@ -0,0 +1,12 @@ +fn SimpleList(comptime L: usize) type { + var T = u8; + return struct { + array: [L]T, + }; +} + +// attempt to close over comptime variable from outer scope +// +// tmp.zig:4:19: error: mutable 'T' not accessible from here +// tmp.zig:2:9: note: declared mutable here +// tmp.zig:3:12: note: crosses namespace boundary here diff --git a/test/compile_errors/stage1/obj/attempt_to_create_17_bit_float_type.zig b/test/compile_errors/stage1/obj/attempt_to_create_17_bit_float_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..bdea578696fd794481727c764631278770ed4678 --- /dev/null +++ b/test/compile_errors/stage1/obj/attempt_to_create_17_bit_float_type.zig @@ -0,0 +1,8 @@ +const builtin = @import("std").builtin; +comptime { + _ = @Type(.{ .Float = .{ .bits = 17 } }); +} + +// attempt to create 17 bit float type +// +// tmp.zig:3:16: error: 17-bit float unsupported diff --git a/test/compile_errors/stage1/obj/attempt_to_negate_a_non-integer_non-float_or_non-vector_type.zig b/test/compile_errors/stage1/obj/attempt_to_negate_a_non-integer_non-float_or_non-vector_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..00ee26033d9058ac3181483086f6a5c72a09dfa6 --- /dev/null +++ b/test/compile_errors/stage1/obj/attempt_to_negate_a_non-integer_non-float_or_non-vector_type.zig @@ -0,0 +1,12 @@ +fn foo() anyerror!u32 { + return 1; +} + +export fn entry() void { + const x = -foo(); + _ = x; +} + +// attempt to negate a non-integer, non-float or non-vector type +// +// tmp.zig:6:15: error: negation of type 'anyerror!u32' diff --git a/test/compile_errors/stage1/obj/attempt_to_use_0_bit_type_in_extern_fn.zig b/test/compile_errors/stage1/obj/attempt_to_use_0_bit_type_in_extern_fn.zig new file mode 100644 index 0000000000000000000000000000000000000000..d7767e25e973b82e866bf7598d591aa888ca7e4e --- /dev/null +++ b/test/compile_errors/stage1/obj/attempt_to_use_0_bit_type_in_extern_fn.zig @@ -0,0 +1,15 @@ +extern fn foo(ptr: fn(*void) callconv(.C) void) void; + +export fn entry() void { + foo(bar); +} + +fn bar(x: *void) callconv(.C) void { _ = x; } +export fn entry2() void { + bar(&{}); +} + +// attempt to use 0 bit type in extern fn +// +// tmp.zig:1:23: error: parameter of type '*void' has 0 bits; not allowed in function with calling convention 'C' +// tmp.zig:7:11: error: parameter of type '*void' has 0 bits; not allowed in function with calling convention 'C' diff --git a/test/compile_errors/stage1/obj/attempted_double_ampersand.zig b/test/compile_errors/stage1/obj/attempted_double_ampersand.zig new file mode 100644 index 0000000000000000000000000000000000000000..cc92bc2fae4b27dbcd3efabfec0e301e30130c32 --- /dev/null +++ b/test/compile_errors/stage1/obj/attempted_double_ampersand.zig @@ -0,0 +1,10 @@ +export fn entry(a: bool, b: bool) i32 { + if (a && b) { + return 1234; + } + return 5678; +} + +// attempted `&&` +// +// tmp.zig:2:11: error: ambiguous use of '&&'; use 'and' for logical AND, or change whitespace to ' & &' for bitwise AND diff --git a/test/compile_errors/stage1/obj/attempted_double_pipe_on_boolean_values.zig b/test/compile_errors/stage1/obj/attempted_double_pipe_on_boolean_values.zig new file mode 100644 index 0000000000000000000000000000000000000000..8e67b4950dd1a924d4ded33f6e24caa763f4e26d --- /dev/null +++ b/test/compile_errors/stage1/obj/attempted_double_pipe_on_boolean_values.zig @@ -0,0 +1,11 @@ +export fn entry(a: bool, b: bool) i32 { + if (a || b) { + return 1234; + } + return 5678; +} + +// attempted `||` on boolean values +// +// tmp.zig:2:9: error: expected error set type, found 'bool' +// tmp.zig:2:11: note: `||` merges error sets; `or` performs boolean OR diff --git a/test/compile_errors/stage1/obj/attempted_implicit_cast_from_T_to_slice_const_T.zig b/test/compile_errors/stage1/obj/attempted_implicit_cast_from_T_to_slice_const_T.zig new file mode 100644 index 0000000000000000000000000000000000000000..4776104928b648d18c12a780e64cb11e08170b6a --- /dev/null +++ b/test/compile_errors/stage1/obj/attempted_implicit_cast_from_T_to_slice_const_T.zig @@ -0,0 +1,8 @@ +export fn entry() void { + const x: [*]const bool = true; + _ = x; +} + +// attempted implicit cast from T to [*]const T +// +// tmp.zig:2:30: error: expected type '[*]const bool', found 'bool' diff --git a/test/compile_errors/stage1/obj/attempted_implicit_cast_from_const_T_to_array_len_1_T.zig b/test/compile_errors/stage1/obj/attempted_implicit_cast_from_const_T_to_array_len_1_T.zig new file mode 100644 index 0000000000000000000000000000000000000000..d389c572ca100700d6d2569c3bd8155fe8948ec4 --- /dev/null +++ b/test/compile_errors/stage1/obj/attempted_implicit_cast_from_const_T_to_array_len_1_T.zig @@ -0,0 +1,12 @@ +export fn entry(byte: u8) void { + const w: i32 = 1234; + var x: *const i32 = &w; + var y: *[1]i32 = x; + y[0] += 1; + _ = byte; +} + +// attempted implicit cast from *const T to *[1]T +// +// tmp.zig:4:22: error: expected type '*[1]i32', found '*const i32' +// tmp.zig:4:22: note: cast discards const qualifier diff --git a/test/compile_errors/stage1/obj/attempted_implicit_cast_from_const_T_to_sliceT.zig b/test/compile_errors/stage1/obj/attempted_implicit_cast_from_const_T_to_sliceT.zig new file mode 100644 index 0000000000000000000000000000000000000000..70d1cbece21b376d0a67f4a811b5ed49b1b8c331 --- /dev/null +++ b/test/compile_errors/stage1/obj/attempted_implicit_cast_from_const_T_to_sliceT.zig @@ -0,0 +1,9 @@ +export fn entry() void { + const u: u32 = 42; + const x: []u32 = &u; + _ = x; +} + +// attempted implicit cast from *const T to []T +// +// tmp.zig:3:23: error: expected type '[]u32', found '*const u32' diff --git a/test/compile_errors/stage1/obj/bad_alignCast_at_comptime.zig b/test/compile_errors/stage1/obj/bad_alignCast_at_comptime.zig new file mode 100644 index 0000000000000000000000000000000000000000..7396dfc4dd4658c351df5384bdf96e7b15817545 --- /dev/null +++ b/test/compile_errors/stage1/obj/bad_alignCast_at_comptime.zig @@ -0,0 +1,9 @@ +comptime { + const ptr = @intToPtr(*align(1) i32, 0x1); + const aligned = @alignCast(4, ptr); + _ = aligned; +} + +// bad @alignCast at comptime +// +// tmp.zig:3:35: error: pointer address 0x1 is not aligned to 4 bytes diff --git a/test/compile_errors/stage1/obj/bad_alignment_in_implicit_cast_from_array_pointer_to_slice.zig b/test/compile_errors/stage1/obj/bad_alignment_in_implicit_cast_from_array_pointer_to_slice.zig new file mode 100644 index 0000000000000000000000000000000000000000..ecfc5523d0431a58c5a2119c72e01cefa33ec8c5 --- /dev/null +++ b/test/compile_errors/stage1/obj/bad_alignment_in_implicit_cast_from_array_pointer_to_slice.zig @@ -0,0 +1,9 @@ +export fn a() void { + var x: [10]u8 = undefined; + var y: []align(16) u8 = &x; + _ = y; +} + +// bad alignment in implicit cast from array pointer to slice +// +// tmp.zig:3:30: error: expected type '[]align(16) u8', found '*[10]u8' diff --git a/test/compile_errors/stage1/obj/bad_alignment_type.zig b/test/compile_errors/stage1/obj/bad_alignment_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..902ffc79d694620045c571d25be6c25cce4d3010 --- /dev/null +++ b/test/compile_errors/stage1/obj/bad_alignment_type.zig @@ -0,0 +1,13 @@ +export fn entry1() void { + var x: []align(true) i32 = undefined; + _ = x; +} +export fn entry2() void { + var x: *align(@as(f64, 12.34)) i32 = undefined; + _ = x; +} + +// bad alignment type +// +// tmp.zig:2:20: error: expected type 'u29', found 'bool' +// tmp.zig:6:19: error: fractional component prevents float value 12.340000 from being casted to type 'u29' diff --git a/test/compile_errors/stage1/obj/bad_identifier_in_function_with_struct_defined_inside_function_which_references_local_const.zig b/test/compile_errors/stage1/obj/bad_identifier_in_function_with_struct_defined_inside_function_which_references_local_const.zig new file mode 100644 index 0000000000000000000000000000000000000000..f32301f9ff4e18a48a15a43ed49974e66ce927e9 --- /dev/null +++ b/test/compile_errors/stage1/obj/bad_identifier_in_function_with_struct_defined_inside_function_which_references_local_const.zig @@ -0,0 +1,15 @@ +export fn entry() void { + const BlockKind = u32; + + const Block = struct { + kind: BlockKind, + }; + + bogus; + + _ = Block; +} + +// bad identifier in function with struct defined inside function which references local const +// +// tmp.zig:8:5: error: use of undeclared identifier 'bogus' diff --git a/test/compile_errors/stage1/obj/bad_import.zig b/test/compile_errors/stage1/obj/bad_import.zig new file mode 100644 index 0000000000000000000000000000000000000000..f6e93559b2446ffe3de8a82fc746c42a20fddb58 --- /dev/null +++ b/test/compile_errors/stage1/obj/bad_import.zig @@ -0,0 +1,5 @@ +const bogus = @import("bogus-does-not-exist.zig",); + +// bad import +// +// tmp.zig:1:23: error: unable to load '${DIR}bogus-does-not-exist.zig': FileNotFound diff --git a/test/compile_errors/stage1/obj/bad_usage_of_call.zig b/test/compile_errors/stage1/obj/bad_usage_of_call.zig new file mode 100644 index 0000000000000000000000000000000000000000..928c39b5a80d6d811f081713ee4f1dd5bbb7e042 --- /dev/null +++ b/test/compile_errors/stage1/obj/bad_usage_of_call.zig @@ -0,0 +1,28 @@ +export fn entry1() void { + @call(.{}, foo, {}); +} +export fn entry2() void { + comptime @call(.{ .modifier = .never_inline }, foo, .{}); +} +export fn entry3() void { + comptime @call(.{ .modifier = .never_tail }, foo, .{}); +} +export fn entry4() void { + @call(.{ .modifier = .never_inline }, bar, .{}); +} +export fn entry5(c: bool) void { + var baz = if (c) baz1 else baz2; + @call(.{ .modifier = .compile_time }, baz, .{}); +} +fn foo() void {} +fn bar() callconv(.Inline) void {} +fn baz1() void {} +fn baz2() void {} + +// bad usage of @call +// +// tmp.zig:2:21: error: expected tuple or struct, found 'void' +// tmp.zig:5:14: error: unable to perform 'never_inline' call at compile-time +// tmp.zig:8:14: error: unable to perform 'never_tail' call at compile-time +// tmp.zig:11:5: error: no-inline call of inline function +// tmp.zig:15:5: error: the specified modifier requires a comptime-known function diff --git a/test/compile_errors/stage1/obj/bin_and_assign_on_undefined_value.zig b/test/compile_errors/stage1/obj/bin_and_assign_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..d9dbdea7412b4f52eceb889e53c49d43cfcf9f76 --- /dev/null +++ b/test/compile_errors/stage1/obj/bin_and_assign_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + a &= a; +} + +// bin and assign on undefined value +// +// tmp.zig:3:5: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/bin_and_on_undefined_value.zig b/test/compile_errors/stage1/obj/bin_and_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..6775cd56eaef2766dcb80b7e9d45d8854bb0c168 --- /dev/null +++ b/test/compile_errors/stage1/obj/bin_and_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + _ = a & a; +} + +// bin and on undefined value +// +// tmp.zig:3:9: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/bin_not_on_undefined_value.zig b/test/compile_errors/stage1/obj/bin_not_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..0e543c4f0007aeb92883aa4979d353ea23cecacc --- /dev/null +++ b/test/compile_errors/stage1/obj/bin_not_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + _ = ~a; +} + +// bin not on undefined value +// +// tmp.zig:3:10: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/bin_or_assign_on_undefined_value.zig b/test/compile_errors/stage1/obj/bin_or_assign_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..bfbeb7ce3e3ce11b46d360f7184a18436ea060d5 --- /dev/null +++ b/test/compile_errors/stage1/obj/bin_or_assign_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + a |= a; +} + +// bin or assign on undefined value +// +// tmp.zig:3:5: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/bin_or_on_undefined_value.zig b/test/compile_errors/stage1/obj/bin_or_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..7a62ace9dddb184ccb6b82fb923e0d3a99b03f80 --- /dev/null +++ b/test/compile_errors/stage1/obj/bin_or_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + _ = a | a; +} + +// bin or on undefined value +// +// tmp.zig:3:9: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/bin_xor_assign_on_undefined_value.zig b/test/compile_errors/stage1/obj/bin_xor_assign_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..bea5e1e08936bf08dea5312341d392b27bee73af --- /dev/null +++ b/test/compile_errors/stage1/obj/bin_xor_assign_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + a ^= a; +} + +// bin xor assign on undefined value +// +// tmp.zig:3:5: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/bin_xor_on_undefined_value.zig b/test/compile_errors/stage1/obj/bin_xor_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..f6ddb2452123a087333f108e614c0eb9df9ccec6 --- /dev/null +++ b/test/compile_errors/stage1/obj/bin_xor_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + _ = a ^ a; +} + +// bin xor on undefined value +// +// tmp.zig:3:9: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/binary_not_on_number_literal.zig b/test/compile_errors/stage1/obj/binary_not_on_number_literal.zig new file mode 100644 index 0000000000000000000000000000000000000000..12f5953f16d9521fbcaa948ff433d90d0bc9dc42 --- /dev/null +++ b/test/compile_errors/stage1/obj/binary_not_on_number_literal.zig @@ -0,0 +1,9 @@ +const TINY_QUANTUM_SHIFT = 4; +const TINY_QUANTUM_SIZE = 1 << TINY_QUANTUM_SHIFT; +var block_aligned_stuff: usize = (4 + TINY_QUANTUM_SIZE) & ~(TINY_QUANTUM_SIZE - 1); + +export fn entry() usize { return @sizeOf(@TypeOf(block_aligned_stuff)); } + +// binary not on number literal +// +// tmp.zig:3:60: error: unable to perform binary not operation on type 'comptime_int' diff --git a/test/compile_errors/stage1/obj/bitCast_same_size_but_bit_count_mismatch.zig b/test/compile_errors/stage1/obj/bitCast_same_size_but_bit_count_mismatch.zig new file mode 100644 index 0000000000000000000000000000000000000000..e4945a1194c44e630b9af0a5b2d22af9a9980df3 --- /dev/null +++ b/test/compile_errors/stage1/obj/bitCast_same_size_but_bit_count_mismatch.zig @@ -0,0 +1,8 @@ +export fn entry(byte: u8) void { + var oops = @bitCast(u7, byte); + _ = oops; +} + +// @bitCast same size but bit count mismatch +// +// tmp.zig:2:25: error: destination type 'u7' has 7 bits but source type 'u8' has 8 bits diff --git a/test/compile_errors/stage1/obj/bitCast_to_enum_type.zig b/test/compile_errors/stage1/obj/bitCast_to_enum_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..dbb73eba187bf8842aa1d771f0afb6479b28e89c --- /dev/null +++ b/test/compile_errors/stage1/obj/bitCast_to_enum_type.zig @@ -0,0 +1,8 @@ +export fn entry() void { + const y = @bitCast(enum(u32) { a, b }, @as(u32, 3)); + _ = y; +} + +// bitCast to enum type +// +// tmp.zig:2:24: error: cannot cast a value of type 'y' diff --git a/test/compile_errors/stage1/obj/bitCast_with_different_sizes_inside_an_expression.zig b/test/compile_errors/stage1/obj/bitCast_with_different_sizes_inside_an_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..bb5c0c593658a6c7c35ba6ac7e232ea6b97153d5 --- /dev/null +++ b/test/compile_errors/stage1/obj/bitCast_with_different_sizes_inside_an_expression.zig @@ -0,0 +1,8 @@ +export fn entry() void { + var foo = (@bitCast(u8, @as(f32, 1.0)) == 0xf); + _ = foo; +} + +// @bitCast with different sizes inside an expression +// +// tmp.zig:2:25: error: destination type 'u8' has size 1 but source type 'f32' has size 4 diff --git a/test/compile_errors/stage1/obj/bit_shifting_only_works_on_integer_types.zig b/test/compile_errors/stage1/obj/bit_shifting_only_works_on_integer_types.zig new file mode 100644 index 0000000000000000000000000000000000000000..98fa3128aa1649a0c0fc5cd9e62c31a1dfa79efa --- /dev/null +++ b/test/compile_errors/stage1/obj/bit_shifting_only_works_on_integer_types.zig @@ -0,0 +1,8 @@ +export fn entry() void { + const x = &@as(u8, 1) << 10; + _ = x; +} + +// bit shifting only works on integer types +// +// tmp.zig:2:16: error: bit shifting operation expected integer type, found '*const u8' diff --git a/test/compile_errors/stage1/obj/bogus_compile_var.zig b/test/compile_errors/stage1/obj/bogus_compile_var.zig new file mode 100644 index 0000000000000000000000000000000000000000..05777b9ecd291190e8a3296fce7018831c3fe1ef --- /dev/null +++ b/test/compile_errors/stage1/obj/bogus_compile_var.zig @@ -0,0 +1,6 @@ +const x = @import("builtin").bogus; +export fn entry() usize { return @sizeOf(@TypeOf(x)); } + +// bogus compile var +// +// tmp.zig:1:29: error: container 'builtin' has no member called 'bogus' diff --git a/test/compile_errors/stage1/obj/bogus_method_call_on_slice.zig b/test/compile_errors/stage1/obj/bogus_method_call_on_slice.zig new file mode 100644 index 0000000000000000000000000000000000000000..8d34a098171a0c5890cb9ae8f9f81a11f3674fc3 --- /dev/null +++ b/test/compile_errors/stage1/obj/bogus_method_call_on_slice.zig @@ -0,0 +1,9 @@ +var self = "aoeu"; +fn f(m: []const u8) void { + m.copy(u8, self[0..], m); +} +export fn entry() usize { return @sizeOf(@TypeOf(f)); } + +// bogus method call on slice +// +// tmp.zig:3:6: error: no member named 'copy' in '[]const u8' diff --git a/test/compile_errors/stage1/obj/bool_not_on_undefined_value.zig b/test/compile_errors/stage1/obj/bool_not_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..71ea7d5e9664d408bff3ab460b3d110b96115c16 --- /dev/null +++ b/test/compile_errors/stage1/obj/bool_not_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: bool = undefined; + _ = !a; +} + +// bool not on undefined value +// +// tmp.zig:3:10: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/branch_on_undefined_value.zig b/test/compile_errors/stage1/obj/branch_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..d02ac22a2a62b1af7d21c47587c62557f656c98b --- /dev/null +++ b/test/compile_errors/stage1/obj/branch_on_undefined_value.zig @@ -0,0 +1,7 @@ +const x = if (undefined) true else false; + +export fn entry() usize { return @sizeOf(@TypeOf(x)); } + +// branch on undefined value +// +// tmp.zig:1:15: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/cImport_with_bogus_include.zig b/test/compile_errors/stage1/obj/cImport_with_bogus_include.zig new file mode 100644 index 0000000000000000000000000000000000000000..89627b354fa780e53bc8f3f99d28ff3cf1b38ceb --- /dev/null +++ b/test/compile_errors/stage1/obj/cImport_with_bogus_include.zig @@ -0,0 +1,7 @@ +const c = @cImport(@cInclude("bogus.h")); +export fn entry() usize { return @sizeOf(@TypeOf(c.bogo)); } + +// @cImport with bogus include +// +// tmp.zig:1:11: error: C import failed +// .h:1:10: note: 'bogus.h' file not found diff --git a/test/compile_errors/stage1/obj/call_assigned_to_constant.zig b/test/compile_errors/stage1/obj/call_assigned_to_constant.zig new file mode 100644 index 0000000000000000000000000000000000000000..fb2febadb294cb8a08b5f9442db00126b682198f --- /dev/null +++ b/test/compile_errors/stage1/obj/call_assigned_to_constant.zig @@ -0,0 +1,22 @@ +const Foo = struct { + x: i32, +}; +fn foo() Foo { + return .{ .x = 42 }; +} +fn bar(val: anytype) Foo { + return .{ .x = val }; +} +export fn entry() void { + const baz: Foo = undefined; + baz = foo(); +} +export fn entry1() void { + const baz: Foo = undefined; + baz = bar(42); +} + +// call assigned to constant +// +// tmp.zig:12:14: error: cannot assign to constant +// tmp.zig:16:14: error: cannot assign to constant diff --git a/test/compile_errors/stage1/obj/calling_a_generic_function_only_known_at_runtime.zig b/test/compile_errors/stage1/obj/calling_a_generic_function_only_known_at_runtime.zig new file mode 100644 index 0000000000000000000000000000000000000000..c31b18bb6faf5bf33d0528fe872a7370b978ea65 --- /dev/null +++ b/test/compile_errors/stage1/obj/calling_a_generic_function_only_known_at_runtime.zig @@ -0,0 +1,12 @@ +var foos = [_]fn(anytype) void { foo1, foo2 }; + +fn foo1(arg: anytype) void {_ = arg;} +fn foo2(arg: anytype) void {_ = arg;} + +pub fn main() !void { + foos[0](true); +} + +// calling a generic function only known at runtime +// +// tmp.zig:7:9: error: calling a generic function requires compile-time known function value diff --git a/test/compile_errors/stage1/obj/calling_function_with_naked_calling_convention.zig b/test/compile_errors/stage1/obj/calling_function_with_naked_calling_convention.zig new file mode 100644 index 0000000000000000000000000000000000000000..c99e5b783182ba4a015b2c98c69823c1964ca62d --- /dev/null +++ b/test/compile_errors/stage1/obj/calling_function_with_naked_calling_convention.zig @@ -0,0 +1,9 @@ +export fn entry() void { + foo(); +} +fn foo() callconv(.Naked) void { } + +// calling function with naked calling convention +// +// tmp.zig:2:5: error: unable to call function with naked calling convention +// tmp.zig:4:1: note: declared here diff --git a/test/compile_errors/stage1/obj/calling_var_args_extern_function_passing_array_instead_of_pointer.zig b/test/compile_errors/stage1/obj/calling_var_args_extern_function_passing_array_instead_of_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..e3cc4425db750395046da0424e11e229ffb76fda --- /dev/null +++ b/test/compile_errors/stage1/obj/calling_var_args_extern_function_passing_array_instead_of_pointer.zig @@ -0,0 +1,8 @@ +export fn entry() void { + foo("hello".*,); +} +pub extern fn foo(format: *const u8, ...) void; + +// calling var args extern function, passing array instead of pointer +// +// tmp.zig:2:16: error: expected type '*const u8', found '[5:0]u8' diff --git a/test/compile_errors/stage1/obj/cannot_break_out_of_defer_expression.zig b/test/compile_errors/stage1/obj/cannot_break_out_of_defer_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..002a7717d3fb1b72445379233f3ebf0ca3c27643 --- /dev/null +++ b/test/compile_errors/stage1/obj/cannot_break_out_of_defer_expression.zig @@ -0,0 +1,11 @@ +export fn foo() void { + while (true) { + defer { + break; + } + } +} + +// cannot break out of defer expression +// +// tmp.zig:4:13: error: cannot break out of defer expression diff --git a/test/compile_errors/stage1/obj/cannot_continue_out_of_defer_expression.zig b/test/compile_errors/stage1/obj/cannot_continue_out_of_defer_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..8adb7eafd6bead2344220a6dd188bf7dda1e4fed --- /dev/null +++ b/test/compile_errors/stage1/obj/cannot_continue_out_of_defer_expression.zig @@ -0,0 +1,11 @@ +export fn foo() void { + while (true) { + defer { + continue; + } + } +} + +// cannot continue out of defer expression +// +// tmp.zig:4:13: error: cannot continue out of defer expression diff --git a/test/compile_errors/stage1/obj/capture_group_on_switch_prong_with_incompatible_payload_types.zig b/test/compile_errors/stage1/obj/capture_group_on_switch_prong_with_incompatible_payload_types.zig new file mode 100644 index 0000000000000000000000000000000000000000..8a4c94f50376e92132afaf08133935717f6dff51 --- /dev/null +++ b/test/compile_errors/stage1/obj/capture_group_on_switch_prong_with_incompatible_payload_types.zig @@ -0,0 +1,19 @@ +const Union = union(enum) { + A: usize, + B: isize, +}; +comptime { + var u = Union{ .A = 8 }; + switch (u) { + .A, .B => |e| { + _ = e; + unreachable; + }, + } +} + +// capture group on switch prong with incompatible payload types +// +// tmp.zig:8:20: error: capture group with incompatible types +// tmp.zig:8:9: note: type 'usize' here +// tmp.zig:8:13: note: type 'isize' here diff --git a/test/compile_errors/stage1/obj/cast_enum_literal_to_enum_but_it_doesnt_match.zig b/test/compile_errors/stage1/obj/cast_enum_literal_to_enum_but_it_doesnt_match.zig new file mode 100644 index 0000000000000000000000000000000000000000..10717ff392ae0698e03e765cf8cd048d73b00195 --- /dev/null +++ b/test/compile_errors/stage1/obj/cast_enum_literal_to_enum_but_it_doesnt_match.zig @@ -0,0 +1,13 @@ +const Foo = enum { + a, + b, +}; +export fn entry() void { + const x: Foo = .c; + _ = x; +} + +// cast enum literal to enum but it doesn't match +// +// tmp.zig:6:20: error: enum 'Foo' has no field named 'c' +// tmp.zig:1:13: note: 'Foo' declared here diff --git a/test/compile_errors/stage1/obj/cast_error_union_of_global_error_set_to_error_union_of_smaller_error_set.zig b/test/compile_errors/stage1/obj/cast_error_union_of_global_error_set_to_error_union_of_smaller_error_set.zig new file mode 100644 index 0000000000000000000000000000000000000000..fbb68c30c8e82ccca38e34fab5414d645a1ac5d0 --- /dev/null +++ b/test/compile_errors/stage1/obj/cast_error_union_of_global_error_set_to_error_union_of_smaller_error_set.zig @@ -0,0 +1,14 @@ +const SmallErrorSet = error{A}; +export fn entry() void { + var x: SmallErrorSet!i32 = foo(); + _ = x; +} +fn foo() anyerror!i32 { + return error.B; +} + +// cast error union of global error set to error union of smaller error set +// +// tmp.zig:3:35: error: expected type 'SmallErrorSet!i32', found 'anyerror!i32' +// tmp.zig:3:35: note: error set 'anyerror' cannot cast into error set 'SmallErrorSet' +// tmp.zig:3:35: note: cannot cast global error set into smaller set diff --git a/test/compile_errors/stage1/obj/cast_global_error_set_to_error_set.zig b/test/compile_errors/stage1/obj/cast_global_error_set_to_error_set.zig new file mode 100644 index 0000000000000000000000000000000000000000..f37ffce22996f90f08ec2ab686d89fbc7bd37aa3 --- /dev/null +++ b/test/compile_errors/stage1/obj/cast_global_error_set_to_error_set.zig @@ -0,0 +1,13 @@ +const SmallErrorSet = error{A}; +export fn entry() void { + var x: SmallErrorSet = foo(); + _ = x; +} +fn foo() anyerror { + return error.B; +} + +// cast global error set to error set +// +// tmp.zig:3:31: error: expected type 'SmallErrorSet', found 'anyerror' +// tmp.zig:3:31: note: cannot cast global error set into smaller set diff --git a/test/compile_errors/stage1/obj/cast_negative_integer_literal_to_usize.zig b/test/compile_errors/stage1/obj/cast_negative_integer_literal_to_usize.zig new file mode 100644 index 0000000000000000000000000000000000000000..37e42c062c2b85b9d096a610bb952a9ea1a54d85 --- /dev/null +++ b/test/compile_errors/stage1/obj/cast_negative_integer_literal_to_usize.zig @@ -0,0 +1,8 @@ +export fn entry() void { + const x = @as(usize, -10); + _ = x; +} + +// cast negative integer literal to usize +// +// tmp.zig:2:26: error: cannot cast negative value -10 to unsigned integer type 'usize' diff --git a/test/compile_errors/stage1/obj/cast_negative_value_to_unsigned_integer.zig b/test/compile_errors/stage1/obj/cast_negative_value_to_unsigned_integer.zig new file mode 100644 index 0000000000000000000000000000000000000000..e740d406f6e54a4dac0de4e98816cb81c0e6360e --- /dev/null +++ b/test/compile_errors/stage1/obj/cast_negative_value_to_unsigned_integer.zig @@ -0,0 +1,15 @@ +comptime { + const value: i32 = -1; + const unsigned = @intCast(u32, value); + _ = unsigned; +} +export fn entry1() void { + const value: i32 = -1; + const unsigned: u32 = value; + _ = unsigned; +} + +// cast negative value to unsigned integer +// +// tmp.zig:3:22: error: attempt to cast negative value to unsigned integer +// tmp.zig:8:27: error: cannot cast negative value -1 to unsigned integer type 'u32' diff --git a/test/compile_errors/stage1/obj/cast_unreachable.zig b/test/compile_errors/stage1/obj/cast_unreachable.zig new file mode 100644 index 0000000000000000000000000000000000000000..94fa1217702207b27b2e8db17bb83b14dfb8c84b --- /dev/null +++ b/test/compile_errors/stage1/obj/cast_unreachable.zig @@ -0,0 +1,9 @@ +fn f() i32 { + return @as(i32, return 1); +} +export fn entry() void { _ = f(); } + +// cast unreachable +// +// tmp.zig:2:12: error: unreachable code +// tmp.zig:2:21: note: control flow is diverted here diff --git a/test/compile_errors/stage1/obj/casting_bit_offset_pointer_to_regular_pointer.zig b/test/compile_errors/stage1/obj/casting_bit_offset_pointer_to_regular_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..9b6c5ea0e658de209d710553fca13e5415548ddd --- /dev/null +++ b/test/compile_errors/stage1/obj/casting_bit_offset_pointer_to_regular_pointer.zig @@ -0,0 +1,19 @@ +const BitField = packed struct { + a: u3, + b: u3, + c: u2, +}; + +fn foo(bit_field: *const BitField) u3 { + return bar(&bit_field.b); +} + +fn bar(x: *const u3) u3 { + return x.*; +} + +export fn entry() usize { return @sizeOf(@TypeOf(foo)); } + +// casting bit offset pointer to regular pointer +// +// tmp.zig:8:26: error: expected type '*const u3', found '*align(:3:1) const u3' diff --git a/test/compile_errors/stage1/obj/catch_on_undefined_value.zig b/test/compile_errors/stage1/obj/catch_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..9d22d07219593dfcba7f74c279330617819bbeb6 --- /dev/null +++ b/test/compile_errors/stage1/obj/catch_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: anyerror!bool = undefined; + _ = a catch false; +} + +// catch on undefined value +// +// tmp.zig:3:11: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/chained_comparison_operators.zig b/test/compile_errors/stage1/obj/chained_comparison_operators.zig new file mode 100644 index 0000000000000000000000000000000000000000..89e1ea1e75819318fd6e3db298f4ec217cef48da --- /dev/null +++ b/test/compile_errors/stage1/obj/chained_comparison_operators.zig @@ -0,0 +1,7 @@ +export fn a(value: u32) bool { + return 1 < value < 1000; +} + +// chained comparison operators +// +// tmp.zig:2:22: error: comparison operators cannot be chained diff --git a/test/compile_errors/stage1/obj/cmpxchg_with_float.zig b/test/compile_errors/stage1/obj/cmpxchg_with_float.zig new file mode 100644 index 0000000000000000000000000000000000000000..8926ffc36b5dc9e9d41e9bac774c921e2a40f744 --- /dev/null +++ b/test/compile_errors/stage1/obj/cmpxchg_with_float.zig @@ -0,0 +1,8 @@ +export fn entry() void { + var x: f32 = 0; + _ = @cmpxchgWeak(f32, &x, 1, 2, .SeqCst, .SeqCst); +} + +// cmpxchg with float +// +// tmp.zig:3:22: error: expected bool, integer, enum or pointer type, found 'f32' diff --git a/test/compile_errors/stage1/obj/colliding_invalid_top_level_functions.zig b/test/compile_errors/stage1/obj/colliding_invalid_top_level_functions.zig new file mode 100644 index 0000000000000000000000000000000000000000..f4e5d24c467f3b336ce7ce46ea0673291ace4ba7 --- /dev/null +++ b/test/compile_errors/stage1/obj/colliding_invalid_top_level_functions.zig @@ -0,0 +1,8 @@ +fn func() bogus {} +fn func() bogus {} +export fn entry() usize { return @sizeOf(@TypeOf(func)); } + +// colliding invalid top level functions +// +// tmp.zig:2:1: error: redeclaration of 'func' +// tmp.zig:1:1: note: other declaration here diff --git a/test/compile_errors/stage1/obj/compare_optional_to_non-optional_with_invalid_types.zig b/test/compile_errors/stage1/obj/compare_optional_to_non-optional_with_invalid_types.zig new file mode 100644 index 0000000000000000000000000000000000000000..8713cf4501cc081f7048876aca564e94c193ad54 --- /dev/null +++ b/test/compile_errors/stage1/obj/compare_optional_to_non-optional_with_invalid_types.zig @@ -0,0 +1,33 @@ +export fn inconsistentChildType() void { + var x: ?i32 = undefined; + const y: comptime_int = 10; + _ = (x == y); +} + +export fn optionalToOptional() void { + var x: ?i32 = undefined; + var y: ?i32 = undefined; + _ = (x == y); +} + +export fn optionalVector() void { + var x: ?@Vector(10, i32) = undefined; + var y: @Vector(10, i32) = undefined; + _ = (x == y); +} + +export fn invalidChildType() void { + var x: ?[3]i32 = undefined; + var y: [3]i32 = undefined; + _ = (x == y); +} + +// compare optional to non-optional with invalid types +// +// :4:12: error: cannot compare types '?i32' and 'comptime_int' +// :4:12: note: optional child type 'i32' must be the same as non-optional type 'comptime_int' +// :10:12: error: cannot compare types '?i32' and '?i32' +// :10:12: note: optional to optional comparison is only supported for optional pointer types +// :16:12: error: TODO add comparison of optional vector +// :22:12: error: cannot compare types '?[3]i32' and '[3]i32' +// :22:12: note: operator not supported for type '[3]i32' diff --git a/test/compile_errors/stage1/obj/comparing_a_non-optional_pointer_against_null.zig b/test/compile_errors/stage1/obj/comparing_a_non-optional_pointer_against_null.zig new file mode 100644 index 0000000000000000000000000000000000000000..69a512013514fbbd0a48a0c887f20fb8c6af0a8a --- /dev/null +++ b/test/compile_errors/stage1/obj/comparing_a_non-optional_pointer_against_null.zig @@ -0,0 +1,8 @@ +export fn entry() void { + var x: i32 = 1; + _ = &x == null; +} + +// comparing a non-optional pointer against null +// +// tmp.zig:3:12: error: comparison of '*i32' with null diff --git a/test/compile_errors/stage1/obj/comparing_against_undefined_produces_undefined_value.zig b/test/compile_errors/stage1/obj/comparing_against_undefined_produces_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..c329f51ef776366d3d3cc4726659368790ef36b2 --- /dev/null +++ b/test/compile_errors/stage1/obj/comparing_against_undefined_produces_undefined_value.zig @@ -0,0 +1,7 @@ +export fn entry() void { + if (2 == undefined) {} +} + +// comparing against undefined produces undefined value +// +// tmp.zig:2:11: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/comparison_operators_with_undefined_value.zig b/test/compile_errors/stage1/obj/comparison_operators_with_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..6021382fd4bb3dbb3ff7b4abe7ffe550d045376a --- /dev/null +++ b/test/compile_errors/stage1/obj/comparison_operators_with_undefined_value.zig @@ -0,0 +1,45 @@ +// operator == +comptime { + var a: i64 = undefined; + var x: i32 = 0; + if (a == a) x += 1; +} +// operator != +comptime { + var a: i64 = undefined; + var x: i32 = 0; + if (a != a) x += 1; +} +// operator > +comptime { + var a: i64 = undefined; + var x: i32 = 0; + if (a > a) x += 1; +} +// operator < +comptime { + var a: i64 = undefined; + var x: i32 = 0; + if (a < a) x += 1; +} +// operator >= +comptime { + var a: i64 = undefined; + var x: i32 = 0; + if (a >= a) x += 1; +} +// operator <= +comptime { + var a: i64 = undefined; + var x: i32 = 0; + if (a <= a) x += 1; +} + +// comparison operators with undefined value +// +// tmp.zig:5:11: error: use of undefined value here causes undefined behavior +// tmp.zig:11:11: error: use of undefined value here causes undefined behavior +// tmp.zig:17:11: error: use of undefined value here causes undefined behavior +// tmp.zig:23:11: error: use of undefined value here causes undefined behavior +// tmp.zig:29:11: error: use of undefined value here causes undefined behavior +// tmp.zig:35:11: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/comparison_with_error_union_and_error_value.zig b/test/compile_errors/stage1/obj/comparison_with_error_union_and_error_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..260ccc6f017645b07cae015362de106ce4032245 --- /dev/null +++ b/test/compile_errors/stage1/obj/comparison_with_error_union_and_error_value.zig @@ -0,0 +1,8 @@ +export fn entry() void { + var number_or_error: anyerror!i32 = error.SomethingAwful; + _ = number_or_error == error.SomethingAwful; +} + +// comparison with error union and error value +// +// tmp.zig:3:25: error: operator not allowed for type 'anyerror!i32' diff --git a/test/compile_errors/stage1/obj/compile-time_division_by_zero.zig b/test/compile_errors/stage1/obj/compile-time_division_by_zero.zig new file mode 100644 index 0000000000000000000000000000000000000000..578dbc7b4a793a925624500deb741dfed49c2260 --- /dev/null +++ b/test/compile_errors/stage1/obj/compile-time_division_by_zero.zig @@ -0,0 +1,10 @@ +comptime { + const a: i32 = 1; + const b: i32 = 0; + const c = a / b; + _ = c; +} + +// compile-time division by zero +// +// tmp.zig:4:17: error: division by zero diff --git a/test/compile_errors/stage1/obj/compile-time_remainder_division_by_zero.zig b/test/compile_errors/stage1/obj/compile-time_remainder_division_by_zero.zig new file mode 100644 index 0000000000000000000000000000000000000000..015d22911063ec6dfcd1714d431e4e83d26d2bfc --- /dev/null +++ b/test/compile_errors/stage1/obj/compile-time_remainder_division_by_zero.zig @@ -0,0 +1,10 @@ +comptime { + const a: i32 = 1; + const b: i32 = 0; + const c = a % b; + _ = c; +} + +// compile-time remainder division by zero +// +// tmp.zig:4:17: error: division by zero diff --git a/test/compile_errors/stage1/obj/compileError_shows_traceback_of_references_that_caused_it.zig b/test/compile_errors/stage1/obj/compileError_shows_traceback_of_references_that_caused_it.zig new file mode 100644 index 0000000000000000000000000000000000000000..4273741ad2b7f623c0a484eeff548430573de33d --- /dev/null +++ b/test/compile_errors/stage1/obj/compileError_shows_traceback_of_references_that_caused_it.zig @@ -0,0 +1,12 @@ +const foo = @compileError("aoeu",); + +const bar = baz + foo; +const baz = 1; + +export fn entry() i32 { + return bar; +} + +// @compileError shows traceback of references that caused it +// +// tmp.zig:1:13: error: aoeu diff --git a/test/compile_errors/stage1/obj/compileLog_of_tagged_enum_doesnt_crash_the_compiler.zig b/test/compile_errors/stage1/obj/compileLog_of_tagged_enum_doesnt_crash_the_compiler.zig new file mode 100644 index 0000000000000000000000000000000000000000..0770b3b6a4aa9366daec4bd07aab0d801c228522 --- /dev/null +++ b/test/compile_errors/stage1/obj/compileLog_of_tagged_enum_doesnt_crash_the_compiler.zig @@ -0,0 +1,15 @@ +const Bar = union(enum(u32)) { + X: i32 = 1 +}; + +fn testCompileLog(x: Bar) void { + @compileLog(x); +} + +pub fn main () void { + comptime testCompileLog(Bar{.X = 123}); +} + +// compileLog of tagged enum doesn't crash the compiler +// +// tmp.zig:6:5: error: found compile log statement diff --git a/test/compile_errors/stage1/obj/compile_error_in_struct_init_expression.zig b/test/compile_errors/stage1/obj/compile_error_in_struct_init_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..6215c9ad76d7f444b6edf4bddef20a7087b02bfc --- /dev/null +++ b/test/compile_errors/stage1/obj/compile_error_in_struct_init_expression.zig @@ -0,0 +1,14 @@ +const Foo = struct { + a: i32 = crap, + b: i32, +}; +export fn entry() void { + var x = Foo{ + .b = 5, + }; + _ = x; +} + +// compile error in struct init expression +// +// tmp.zig:2:14: error: use of undeclared identifier 'crap' diff --git a/test/compile_errors/stage1/obj/compile_error_when_evaluating_return_type_of_inferred_error_set.zig b/test/compile_errors/stage1/obj/compile_error_when_evaluating_return_type_of_inferred_error_set.zig new file mode 100644 index 0000000000000000000000000000000000000000..44d5b6a389878d0e6d6d751b0404756cf31c7cf1 --- /dev/null +++ b/test/compile_errors/stage1/obj/compile_error_when_evaluating_return_type_of_inferred_error_set.zig @@ -0,0 +1,12 @@ +const Car = struct { + foo: *SymbolThatDoesNotExist, + pub fn init() !Car {} +}; +export fn entry() void { + const car = Car.init(); + _ = car; +} + +// compile error when evaluating return type of inferred error set +// +// tmp.zig:2:11: error: use of undeclared identifier 'SymbolThatDoesNotExist' diff --git a/test/compile_errors/stage1/obj/compile_log.zig b/test/compile_errors/stage1/obj/compile_log.zig new file mode 100644 index 0000000000000000000000000000000000000000..ef1cba4502d9639296bd37c8b806be85ea7283ca --- /dev/null +++ b/test/compile_errors/stage1/obj/compile_log.zig @@ -0,0 +1,14 @@ +export fn foo() void { + comptime bar(12, "hi",); +} +fn bar(a: i32, b: []const u8) void { + @compileLog("begin",); + @compileLog("a", a, "b", b); + @compileLog("end",); +} + +// compile log +// +// tmp.zig:5:5: error: found compile log statement +// tmp.zig:6:5: error: found compile log statement +// tmp.zig:7:5: error: found compile log statement diff --git a/test/compile_errors/stage1/obj/compile_log_a_pointer_to_an_opaque_value.zig b/test/compile_errors/stage1/obj/compile_log_a_pointer_to_an_opaque_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..15b7825a9164a7a48f3291ad50c8f299826c96bd --- /dev/null +++ b/test/compile_errors/stage1/obj/compile_log_a_pointer_to_an_opaque_value.zig @@ -0,0 +1,7 @@ +export fn entry() void { + @compileLog(@ptrCast(*const anyopaque, &entry)); +} + +// compile log a pointer to an opaque value +// +// tmp.zig:2:5: error: found compile log statement diff --git a/test/compile_errors/stage1/obj/compile_log_statement_inside_function_which_must_be_comptime_evaluated.zig b/test/compile_errors/stage1/obj/compile_log_statement_inside_function_which_must_be_comptime_evaluated.zig new file mode 100644 index 0000000000000000000000000000000000000000..f848ed7c7cdd0404e77c69d97605c046612d3ef7 --- /dev/null +++ b/test/compile_errors/stage1/obj/compile_log_statement_inside_function_which_must_be_comptime_evaluated.zig @@ -0,0 +1,12 @@ +fn Foo(comptime T: type) type { + @compileLog(@typeName(T)); + return T; +} +export fn entry() void { + _ = Foo(i32); + _ = @typeName(Foo(i32)); +} + +// compile log statement inside function which must be comptime evaluated +// +// tmp.zig:2:5: error: found compile log statement diff --git a/test/compile_errors/stage1/obj/compile_log_statement_warning_deduplication_in_generic_fn.zig b/test/compile_errors/stage1/obj/compile_log_statement_warning_deduplication_in_generic_fn.zig new file mode 100644 index 0000000000000000000000000000000000000000..05ac76724cdeef94f7d1cea3510df7d51d532e01 --- /dev/null +++ b/test/compile_errors/stage1/obj/compile_log_statement_warning_deduplication_in_generic_fn.zig @@ -0,0 +1,12 @@ +export fn entry() void { + inner(1); + inner(2); +} +fn inner(comptime n: usize) void { + comptime var i = 0; + inline while (i < n) : (i += 1) { @compileLog("!@#$"); } +} + +// compile log statement warning deduplication in generic fn +// +// tmp.zig:7:39: error: found compile log statement diff --git a/test/compile_errors/stage1/obj/compile_time_division_by_zero.zig b/test/compile_errors/stage1/obj/compile_time_division_by_zero.zig new file mode 100644 index 0000000000000000000000000000000000000000..17187c47bf7419c0fc3cb77a63fda519a4b0fd65 --- /dev/null +++ b/test/compile_errors/stage1/obj/compile_time_division_by_zero.zig @@ -0,0 +1,10 @@ +const y = foo(0); +fn foo(x: u32) u32 { + return 1 / x; +} + +export fn entry() usize { return @sizeOf(@TypeOf(y)); } + +// compile time division by zero +// +// tmp.zig:3:14: error: division by zero diff --git a/test/compile_errors/stage1/obj/comptime_cast_enum_to_union_but_field_has_payload.zig b/test/compile_errors/stage1/obj/comptime_cast_enum_to_union_but_field_has_payload.zig new file mode 100644 index 0000000000000000000000000000000000000000..36a2079a014da873dd2279da22a1ecb2832bb20d --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_cast_enum_to_union_but_field_has_payload.zig @@ -0,0 +1,15 @@ +const Letter = enum { A, B, C }; +const Value = union(Letter) { + A: i32, + B, + C, +}; +export fn entry() void { + var x: Value = Letter.A; + _ = x; +} + +// comptime cast enum to union but field has payload +// +// tmp.zig:8:26: error: cast to union 'Value' must initialize 'i32' field 'A' +// tmp.zig:3:5: note: field 'A' declared here diff --git a/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_catch.zig b/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_catch.zig new file mode 100644 index 0000000000000000000000000000000000000000..18c78c858cd1f631a015ba3fd195d7987c3a4dc2 --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_catch.zig @@ -0,0 +1,14 @@ +export fn entry() void { + const ints = [_]u8{ 1, 2 }; + inline for (ints) |_| { + bad() catch continue; + } +} +fn bad() !void { + return error.Bad; +} + +// comptime continue inside runtime catch +// +// tmp.zig:4:21: error: comptime control flow inside runtime block +// tmp.zig:4:15: note: runtime block created here diff --git a/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_if_bool.zig b/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_if_bool.zig new file mode 100644 index 0000000000000000000000000000000000000000..f6ec1b98b1d21449365fab337d933a44bf634909 --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_if_bool.zig @@ -0,0 +1,13 @@ +export fn entry() void { + var p: usize = undefined; + comptime var q = true; + inline while (q) { + if (p == 11) continue; + q = false; + } +} + +// comptime continue inside runtime if bool +// +// tmp.zig:5:22: error: comptime control flow inside runtime block +// tmp.zig:5:9: note: runtime block created here diff --git a/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_if_error.zig b/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_if_error.zig new file mode 100644 index 0000000000000000000000000000000000000000..556a8769a5b2c0e6126338f569a704d33c075e24 --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_if_error.zig @@ -0,0 +1,13 @@ +export fn entry() void { + var p: anyerror!i32 = undefined; + comptime var q = true; + inline while (q) { + if (p) |_| continue else |_| {} + q = false; + } +} + +// comptime continue inside runtime if error +// +// tmp.zig:5:20: error: comptime control flow inside runtime block +// tmp.zig:5:9: note: runtime block created here diff --git a/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_if_optional.zig b/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_if_optional.zig new file mode 100644 index 0000000000000000000000000000000000000000..4f35398a2b8a9136207618d90d9e4274246ced84 --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_if_optional.zig @@ -0,0 +1,13 @@ +export fn entry() void { + var p: ?i32 = undefined; + comptime var q = true; + inline while (q) { + if (p) |_| continue; + q = false; + } +} + +// comptime continue inside runtime if optional +// +// tmp.zig:5:20: error: comptime control flow inside runtime block +// tmp.zig:5:9: note: runtime block created here diff --git a/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_switch.zig b/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_switch.zig new file mode 100644 index 0000000000000000000000000000000000000000..259cbd602ef891a63921b40453b68073ea7f5e6d --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_switch.zig @@ -0,0 +1,16 @@ +export fn entry() void { + var p: i32 = undefined; + comptime var q = true; + inline while (q) { + switch (p) { + 11 => continue, + else => {}, + } + q = false; + } +} + +// comptime continue inside runtime switch +// +// tmp.zig:6:19: error: comptime control flow inside runtime block +// tmp.zig:5:9: note: runtime block created here diff --git a/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_while_bool.zig b/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_while_bool.zig new file mode 100644 index 0000000000000000000000000000000000000000..5d86394815582be1413d420735c485d770788091 --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_while_bool.zig @@ -0,0 +1,13 @@ +export fn entry() void { + var p: usize = undefined; + comptime var q = true; + outer: inline while (q) { + while (p == 11) continue :outer; + q = false; + } +} + +// comptime continue inside runtime while bool +// +// tmp.zig:5:25: error: comptime control flow inside runtime block +// tmp.zig:5:9: note: runtime block created here diff --git a/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_while_error.zig b/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_while_error.zig new file mode 100644 index 0000000000000000000000000000000000000000..0ba49cb3ca0fe71481b40de1ab3d1f4176f1eb2f --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_while_error.zig @@ -0,0 +1,15 @@ +export fn entry() void { + var p: anyerror!usize = undefined; + comptime var q = true; + outer: inline while (q) { + while (p) |_| { + continue :outer; + } else |_| {} + q = false; + } +} + +// comptime continue inside runtime while error +// +// tmp.zig:6:13: error: comptime control flow inside runtime block +// tmp.zig:5:9: note: runtime block created here diff --git a/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_while_optional.zig b/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_while_optional.zig new file mode 100644 index 0000000000000000000000000000000000000000..b2cfd2f69d9a3a8f7261ebf885f89d6acebd0517 --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_continue_inside_runtime_while_optional.zig @@ -0,0 +1,13 @@ +export fn entry() void { + var p: ?usize = undefined; + comptime var q = true; + outer: inline while (q) { + while (p) |_| continue :outer; + q = false; + } +} + +// comptime continue inside runtime while optional +// +// tmp.zig:5:23: error: comptime control flow inside runtime block +// tmp.zig:5:9: note: runtime block created here diff --git a/test/compile_errors/stage1/obj/comptime_float_in_asm_input.zig b/test/compile_errors/stage1/obj/comptime_float_in_asm_input.zig new file mode 100644 index 0000000000000000000000000000000000000000..c2333586b43653f9efe252a210e93d05213a92a4 --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_float_in_asm_input.zig @@ -0,0 +1,7 @@ +export fn foo() void { + asm volatile ("" : : [bar]"r"(3.17) : ""); +} + +// comptime_float in asm input +// +// tmp.zig:2:35: error: expected sized integer or sized float, found comptime_float diff --git a/test/compile_errors/stage1/obj/comptime_implicit_cast_f64_to_f32.zig b/test/compile_errors/stage1/obj/comptime_implicit_cast_f64_to_f32.zig new file mode 100644 index 0000000000000000000000000000000000000000..f98c45a3488e058b7f87ed12b770eefdd0c76f97 --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_implicit_cast_f64_to_f32.zig @@ -0,0 +1,9 @@ +export fn entry() void { + const x: f64 = 16777217; + const y: f32 = x; + _ = y; +} + +// comptime implicit cast f64 to f32 +// +// tmp.zig:3:20: error: cast of value 16777217.000000 to type 'f32' loses information diff --git a/test/compile_errors/stage1/obj/comptime_int_in_asm_input.zig b/test/compile_errors/stage1/obj/comptime_int_in_asm_input.zig new file mode 100644 index 0000000000000000000000000000000000000000..5a587e5a7706048a98c2a72c8c4548f1f6052214 --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_int_in_asm_input.zig @@ -0,0 +1,7 @@ +export fn foo() void { + asm volatile ("" : : [bar]"r"(3) : ""); +} + +// comptime_int in asm input +// +// tmp.zig:2:35: error: expected sized integer or sized float, found comptime_int diff --git a/test/compile_errors/stage1/obj/comptime_ptrcast_of_zero-sized_type.zig b/test/compile_errors/stage1/obj/comptime_ptrcast_of_zero-sized_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..1d3f91fe91075715b2b23ec461e7eb24ac35d029 --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_ptrcast_of_zero-sized_type.zig @@ -0,0 +1,10 @@ +fn foo() void { + const node: struct {} = undefined; + const vla_ptr = @ptrCast([*]const u8, &node); + _ = vla_ptr; +} +comptime { foo(); } + +// comptime ptrcast of zero-sized type +// +// tmp.zig:3:21: error: '*const struct:2:17' and '[*]const u8' do not have the same in-memory representation diff --git a/test/compile_errors/stage1/obj/comptime_slice-sentinel_does_not_match_memory_at_target_index_terminated.zig b/test/compile_errors/stage1/obj/comptime_slice-sentinel_does_not_match_memory_at_target_index_terminated.zig new file mode 100644 index 0000000000000000000000000000000000000000..622e0cf76bc92698f57db5e8d7b5e8bba514ec1f --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_slice-sentinel_does_not_match_memory_at_target_index_terminated.zig @@ -0,0 +1,65 @@ +export fn foo_array() void { + comptime { + var target = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + const slice = target[0..3 :0]; + _ = slice; + } +} +export fn foo_ptr_array() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target = &buf; + const slice = target[0..3 :0]; + _ = slice; + } +} +export fn foo_vector_ConstPtrSpecialBaseArray() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*]u8 = &buf; + const slice = target[0..3 :0]; + _ = slice; + } +} +export fn foo_vector_ConstPtrSpecialRef() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*]u8 = @ptrCast([*]u8, &buf); + const slice = target[0..3 :0]; + _ = slice; + } +} +export fn foo_cvector_ConstPtrSpecialBaseArray() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*c]u8 = &buf; + const slice = target[0..3 :0]; + _ = slice; + } +} +export fn foo_cvector_ConstPtrSpecialRef() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*c]u8 = @ptrCast([*c]u8, &buf); + const slice = target[0..3 :0]; + _ = slice; + } +} +export fn foo_slice() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: []u8 = &buf; + const slice = target[0..3 :0]; + _ = slice; + } +} + +// comptime slice-sentinel does not match memory at target index (terminated) +// +// :4:29: error: slice-sentinel does not match memory at target index +// :12:29: error: slice-sentinel does not match memory at target index +// :20:29: error: slice-sentinel does not match memory at target index +// :28:29: error: slice-sentinel does not match memory at target index +// :36:29: error: slice-sentinel does not match memory at target index +// :44:29: error: slice-sentinel does not match memory at target index +// :52:29: error: slice-sentinel does not match memory at target index diff --git a/test/compile_errors/stage1/obj/comptime_slice-sentinel_does_not_match_memory_at_target_index_unterminated.zig b/test/compile_errors/stage1/obj/comptime_slice-sentinel_does_not_match_memory_at_target_index_unterminated.zig new file mode 100644 index 0000000000000000000000000000000000000000..e9451cf9aa64ff3aea1ee6d80ac99aa5044e9652 --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_slice-sentinel_does_not_match_memory_at_target_index_unterminated.zig @@ -0,0 +1,65 @@ +export fn foo_array() void { + comptime { + var target = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + const slice = target[0..3 :0]; + _ = slice; + } +} +export fn foo_ptr_array() void { + comptime { + var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target = &buf; + const slice = target[0..3 :0]; + _ = slice; + } +} +export fn foo_vector_ConstPtrSpecialBaseArray() void { + comptime { + var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*]u8 = &buf; + const slice = target[0..3 :0]; + _ = slice; + } +} +export fn foo_vector_ConstPtrSpecialRef() void { + comptime { + var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*]u8 = @ptrCast([*]u8, &buf); + const slice = target[0..3 :0]; + _ = slice; + } +} +export fn foo_cvector_ConstPtrSpecialBaseArray() void { + comptime { + var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*c]u8 = &buf; + const slice = target[0..3 :0]; + _ = slice; + } +} +export fn foo_cvector_ConstPtrSpecialRef() void { + comptime { + var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*c]u8 = @ptrCast([*c]u8, &buf); + const slice = target[0..3 :0]; + _ = slice; + } +} +export fn foo_slice() void { + comptime { + var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: []u8 = &buf; + const slice = target[0..3 :0]; + _ = slice; + } +} + +// comptime slice-sentinel does not match memory at target index (unterminated) +// +// :4:29: error: slice-sentinel does not match memory at target index +// :12:29: error: slice-sentinel does not match memory at target index +// :20:29: error: slice-sentinel does not match memory at target index +// :28:29: error: slice-sentinel does not match memory at target index +// :36:29: error: slice-sentinel does not match memory at target index +// :44:29: error: slice-sentinel does not match memory at target index +// :52:29: error: slice-sentinel does not match memory at target index diff --git a/test/compile_errors/stage1/obj/comptime_slice-sentinel_does_not_match_target-sentinel.zig b/test/compile_errors/stage1/obj/comptime_slice-sentinel_does_not_match_target-sentinel.zig new file mode 100644 index 0000000000000000000000000000000000000000..597a493705bf93750ce5e9414e1534583891bde3 --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_slice-sentinel_does_not_match_target-sentinel.zig @@ -0,0 +1,65 @@ +export fn foo_array() void { + comptime { + var target = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + const slice = target[0..14 :255]; + _ = slice; + } +} +export fn foo_ptr_array() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target = &buf; + const slice = target[0..14 :255]; + _ = slice; + } +} +export fn foo_vector_ConstPtrSpecialBaseArray() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*]u8 = &buf; + const slice = target[0..14 :255]; + _ = slice; + } +} +export fn foo_vector_ConstPtrSpecialRef() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*]u8 = @ptrCast([*]u8, &buf); + const slice = target[0..14 :255]; + _ = slice; + } +} +export fn foo_cvector_ConstPtrSpecialBaseArray() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*c]u8 = &buf; + const slice = target[0..14 :255]; + _ = slice; + } +} +export fn foo_cvector_ConstPtrSpecialRef() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*c]u8 = @ptrCast([*c]u8, &buf); + const slice = target[0..14 :255]; + _ = slice; + } +} +export fn foo_slice() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: []u8 = &buf; + const slice = target[0..14 :255]; + _ = slice; + } +} + +// comptime slice-sentinel does not match target-sentinel +// +// :4:29: error: slice-sentinel does not match target-sentinel +// :12:29: error: slice-sentinel does not match target-sentinel +// :20:29: error: slice-sentinel does not match target-sentinel +// :28:29: error: slice-sentinel does not match target-sentinel +// :36:29: error: slice-sentinel does not match target-sentinel +// :44:29: error: slice-sentinel does not match target-sentinel +// :52:29: error: slice-sentinel does not match target-sentinel diff --git a/test/compile_errors/stage1/obj/comptime_slice-sentinel_is_out_of_bounds_terminated.zig b/test/compile_errors/stage1/obj/comptime_slice-sentinel_is_out_of_bounds_terminated.zig new file mode 100644 index 0000000000000000000000000000000000000000..d5fc64ea847eff6dd390e92265e592a1ccdc262f --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_slice-sentinel_is_out_of_bounds_terminated.zig @@ -0,0 +1,65 @@ +export fn foo_array() void { + comptime { + var target = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + const slice = target[0..15 :1]; + _ = slice; + } +} +export fn foo_ptr_array() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target = &buf; + const slice = target[0..15 :0]; + _ = slice; + } +} +export fn foo_vector_ConstPtrSpecialBaseArray() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*]u8 = &buf; + const slice = target[0..15 :0]; + _ = slice; + } +} +export fn foo_vector_ConstPtrSpecialRef() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*]u8 = @ptrCast([*]u8, &buf); + const slice = target[0..15 :0]; + _ = slice; + } +} +export fn foo_cvector_ConstPtrSpecialBaseArray() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*c]u8 = &buf; + const slice = target[0..15 :0]; + _ = slice; + } +} +export fn foo_cvector_ConstPtrSpecialRef() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*c]u8 = @ptrCast([*c]u8, &buf); + const slice = target[0..15 :0]; + _ = slice; + } +} +export fn foo_slice() void { + comptime { + var buf = [_:0]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: []u8 = &buf; + const slice = target[0..15 :0]; + _ = slice; + } +} + +// comptime slice-sentinel is out of bounds (terminated) +// +// :4:29: error: out of bounds slice +// :12:29: error: out of bounds slice +// :20:29: error: out of bounds slice +// :28:29: error: out of bounds slice +// :36:29: error: out of bounds slice +// :44:29: error: out of bounds slice +// :52:29: error: out of bounds slice diff --git a/test/compile_errors/stage1/obj/comptime_slice-sentinel_is_out_of_bounds_unterminated.zig b/test/compile_errors/stage1/obj/comptime_slice-sentinel_is_out_of_bounds_unterminated.zig new file mode 100644 index 0000000000000000000000000000000000000000..05a499ca8a8697aa388d6f949b7ffe6b9c64e807 --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_slice-sentinel_is_out_of_bounds_unterminated.zig @@ -0,0 +1,65 @@ +export fn foo_array() void { + comptime { + var target = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + const slice = target[0..14 :0]; + _ = slice; + } +} +export fn foo_ptr_array() void { + comptime { + var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target = &buf; + const slice = target[0..14 :0]; + _ = slice; + } +} +export fn foo_vector_ConstPtrSpecialBaseArray() void { + comptime { + var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*]u8 = &buf; + const slice = target[0..14 :0]; + _ = slice; + } +} +export fn foo_vector_ConstPtrSpecialRef() void { + comptime { + var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*]u8 = @ptrCast([*]u8, &buf); + const slice = target[0..14 :0]; + _ = slice; + } +} +export fn foo_cvector_ConstPtrSpecialBaseArray() void { + comptime { + var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*c]u8 = &buf; + const slice = target[0..14 :0]; + _ = slice; + } +} +export fn foo_cvector_ConstPtrSpecialRef() void { + comptime { + var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: [*c]u8 = @ptrCast([*c]u8, &buf); + const slice = target[0..14 :0]; + _ = slice; + } +} +export fn foo_slice() void { + comptime { + var buf = [_]u8{ 'a', 'b', 'c', 'd' } ++ [_]u8{undefined} ** 10; + var target: []u8 = &buf; + const slice = target[0..14 :0]; + _ = slice; + } +} + +// comptime slice-sentinel is out of bounds (unterminated) +// +// :4:29: error: slice-sentinel is out of bounds +// :12:29: error: slice-sentinel is out of bounds +// :20:29: error: slice-sentinel is out of bounds +// :28:29: error: slice-sentinel is out of bounds +// :36:29: error: slice-sentinel is out of bounds +// :44:29: error: slice-sentinel is out of bounds +// :52:29: error: slice-sentinel is out of bounds diff --git a/test/compile_errors/stage1/obj/comptime_slice_of_an_undefined_slice.zig b/test/compile_errors/stage1/obj/comptime_slice_of_an_undefined_slice.zig new file mode 100644 index 0000000000000000000000000000000000000000..b56feddc02144d5d77b89940589e1a503aa07121 --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_slice_of_an_undefined_slice.zig @@ -0,0 +1,9 @@ +comptime { + var a: []u8 = undefined; + var b = a[0..10]; + _ = b; +} + +// comptime slice of an undefined slice +// +// tmp.zig:3:14: error: slice of undefined diff --git a/test/compile_errors/stage1/obj/comptime_slice_of_undefined_pointer_non-zero_len.zig b/test/compile_errors/stage1/obj/comptime_slice_of_undefined_pointer_non-zero_len.zig new file mode 100644 index 0000000000000000000000000000000000000000..bcddd1d8662ef9ed2ad9b36cb2fde499e76754b1 --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_slice_of_undefined_pointer_non-zero_len.zig @@ -0,0 +1,8 @@ +export fn entry() void { + const slice = @as([*]i32, undefined)[0..1]; + _ = slice; +} + +// comptime slice of undefined pointer non-zero len +// +// tmp.zig:2:41: error: non-zero length slice of undefined pointer diff --git a/test/compile_errors/stage1/obj/comptime_struct_field_no_init_value.zig b/test/compile_errors/stage1/obj/comptime_struct_field_no_init_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..c3de76a7948c7e3649cbe572d4207269657accf9 --- /dev/null +++ b/test/compile_errors/stage1/obj/comptime_struct_field_no_init_value.zig @@ -0,0 +1,11 @@ +const Foo = struct { + comptime b: i32, +}; +export fn entry() void { + var f: Foo = undefined; + _ = f; +} + +// comptime struct field, no init value +// +// tmp.zig:2:5: error: comptime field without default initialization value diff --git a/test/compile_errors/stage1/obj/const_frame_cast_to_anyframe.zig b/test/compile_errors/stage1/obj/const_frame_cast_to_anyframe.zig new file mode 100644 index 0000000000000000000000000000000000000000..1e6cdba50727e1660ca75cbf599e5f870a8841de --- /dev/null +++ b/test/compile_errors/stage1/obj/const_frame_cast_to_anyframe.zig @@ -0,0 +1,17 @@ +export fn a() void { + const f = async func(); + resume f; +} +export fn b() void { + const f = async func(); + var x: anyframe = &f; + _ = x; +} +fn func() void { + suspend {} +} + +// const frame cast to anyframe +// +// tmp.zig:3:12: error: expected type 'anyframe', found '*const @Frame(func)' +// tmp.zig:7:24: error: expected type 'anyframe', found '*const @Frame(func)' diff --git a/test/compile_errors/stage1/obj/const_is_a_statement_not_an_expression.zig b/test/compile_errors/stage1/obj/const_is_a_statement_not_an_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..4396407dd174791bf2f92d796095cd50f1d9bd01 --- /dev/null +++ b/test/compile_errors/stage1/obj/const_is_a_statement_not_an_expression.zig @@ -0,0 +1,7 @@ +export fn f() void { + (const a = 0); +} + +// const is a statement, not an expression +// +// tmp.zig:2:6: error: expected expression, found 'const' diff --git a/test/compile_errors/stage1/obj/constant_inside_comptime_function_has_compile_error.zig b/test/compile_errors/stage1/obj/constant_inside_comptime_function_has_compile_error.zig new file mode 100644 index 0000000000000000000000000000000000000000..8eabcfdeaa129c82eebb42d1e4b7ab88af643ccb --- /dev/null +++ b/test/compile_errors/stage1/obj/constant_inside_comptime_function_has_compile_error.zig @@ -0,0 +1,19 @@ +const ContextAllocator = MemoryPool(usize); + +pub fn MemoryPool(comptime T: type) type { + const free_list_t = @compileError("aoeu",); + + return struct { + free_list: free_list_t, + }; +} + +export fn entry() void { + var allocator: ContextAllocator = undefined; +} + +// constant inside comptime function has compile error +// +// tmp.zig:4:5: error: unreachable code +// tmp.zig:4:25: note: control flow is diverted here +// tmp.zig:12:9: error: unused local variable diff --git a/test/compile_errors/stage1/obj/container_init_with_non-type.zig b/test/compile_errors/stage1/obj/container_init_with_non-type.zig new file mode 100644 index 0000000000000000000000000000000000000000..6464555df5f3335b0884f24133ce6fa09b5b518e --- /dev/null +++ b/test/compile_errors/stage1/obj/container_init_with_non-type.zig @@ -0,0 +1,8 @@ +const zero: i32 = 0; +const a = zero{1}; + +export fn entry() usize { return @sizeOf(@TypeOf(a)); } + +// container init with non-type +// +// tmp.zig:2:11: error: expected type 'type', found 'i32' diff --git a/test/compile_errors/stage1/obj/control_flow_uses_comptime_var_at_runtime.zig b/test/compile_errors/stage1/obj/control_flow_uses_comptime_var_at_runtime.zig new file mode 100644 index 0000000000000000000000000000000000000000..ee2c0234c346d12df7c19182ce0fd7b7d550d669 --- /dev/null +++ b/test/compile_errors/stage1/obj/control_flow_uses_comptime_var_at_runtime.zig @@ -0,0 +1,13 @@ +export fn foo() void { + comptime var i = 0; + while (i < 5) : (i += 1) { + bar(); + } +} + +fn bar() void { } + +// control flow uses comptime var at runtime +// +// tmp.zig:3:5: error: control flow attempts to use compile-time variable at runtime +// tmp.zig:3:24: note: compile-time variable assigned here diff --git a/test/compile_errors/stage1/obj/control_reaches_end_of_non-void_function.zig b/test/compile_errors/stage1/obj/control_reaches_end_of_non-void_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..13d2876823ed19d35f49393c2473477cacf237d9 --- /dev/null +++ b/test/compile_errors/stage1/obj/control_reaches_end_of_non-void_function.zig @@ -0,0 +1,6 @@ +fn a() i32 {} +export fn entry() void { _ = a(); } + +// control reaches end of non-void function +// +// tmp.zig:1:12: error: expected type 'i32', found 'void' diff --git a/test/compile_errors/stage1/obj/declaration_between_fields.zig b/test/compile_errors/stage1/obj/declaration_between_fields.zig new file mode 100644 index 0000000000000000000000000000000000000000..6e6b60f2e4746e22e762898106054feb5c3cad11 --- /dev/null +++ b/test/compile_errors/stage1/obj/declaration_between_fields.zig @@ -0,0 +1,22 @@ +const S = struct { + const foo = 2; + const bar = 2; + const baz = 2; + a: struct { + a: u32, + b: u32, + }, + const foo1 = 2; + const bar1 = 2; + const baz1 = 2; + b: usize, +}; +comptime { + _ = S; +} + +// declaration between fields +// +// tmp.zig:9:5: error: declarations are not allowed between container fields +// tmp.zig:5:5: note: field before declarations here +// tmp.zig:12:5: note: field after declarations here diff --git a/test/compile_errors/stage1/obj/declaration_with_same_name_as_primitive_must_use_special_syntax.zig b/test/compile_errors/stage1/obj/declaration_with_same_name_as_primitive_must_use_special_syntax.zig new file mode 100644 index 0000000000000000000000000000000000000000..c10f397da4db8706a3af1a6af70ab7a61c583e28 --- /dev/null +++ b/test/compile_errors/stage1/obj/declaration_with_same_name_as_primitive_must_use_special_syntax.zig @@ -0,0 +1,10 @@ +const u8 = u16; +export fn entry() void { + const a: u8 = 300; + _ = a; +} + +// declaration with same name as primitive must use special syntax +// +// tmp.zig:1:7: error: name shadows primitive 'u8' +// tmp.zig:1:7: note: consider using @"u8" to disambiguate diff --git a/test/compile_errors/stage1/obj/deduplicate_undeclared_identifier.zig b/test/compile_errors/stage1/obj/deduplicate_undeclared_identifier.zig new file mode 100644 index 0000000000000000000000000000000000000000..1c9d6c3d316e27d871dbb3cfe864decddc75dca8 --- /dev/null +++ b/test/compile_errors/stage1/obj/deduplicate_undeclared_identifier.zig @@ -0,0 +1,10 @@ +export fn a() void { + x += 1; +} +export fn b() void { + x += 1; +} + +// deduplicate undeclared identifier +// +// tmp.zig:2:5: error: use of undeclared identifier 'x' diff --git a/test/compile_errors/stage1/obj/deref_on_undefined_value.zig b/test/compile_errors/stage1/obj/deref_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..607f6ea5e0b92c87b4e0ff0c67b117c2476cc436 --- /dev/null +++ b/test/compile_errors/stage1/obj/deref_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: *u8 = undefined; + _ = a.*; +} + +// deref on undefined value +// +// tmp.zig:3:9: error: attempt to dereference undefined value diff --git a/test/compile_errors/stage1/obj/deref_slice_and_get_len_field.zig b/test/compile_errors/stage1/obj/deref_slice_and_get_len_field.zig new file mode 100644 index 0000000000000000000000000000000000000000..2fa5ff6133b2428c48e5cd430585a403d0f82521 --- /dev/null +++ b/test/compile_errors/stage1/obj/deref_slice_and_get_len_field.zig @@ -0,0 +1,8 @@ +export fn entry() void { + var a: []u8 = undefined; + _ = a.*.len; +} + +// deref slice and get len field +// +// tmp.zig:3:10: error: attempt to dereference non-pointer type '[]u8' diff --git a/test/compile_errors/stage1/obj/dereference_an_array.zig b/test/compile_errors/stage1/obj/dereference_an_array.zig new file mode 100644 index 0000000000000000000000000000000000000000..713c65578491047ef03f11d01f28e411ff93ee27 --- /dev/null +++ b/test/compile_errors/stage1/obj/dereference_an_array.zig @@ -0,0 +1,12 @@ +var s_buffer: [10]u8 = undefined; +pub fn pass(in: []u8) []u8 { + var out = &s_buffer; + out.*.* = in[0]; + return out.*[0..1]; +} + +export fn entry() usize { return @sizeOf(@TypeOf(pass)); } + +// dereference an array +// +// tmp.zig:4:10: error: attempt to dereference non-pointer type '[10]u8' diff --git a/test/compile_errors/stage1/obj/dereference_unknown_length_pointer.zig b/test/compile_errors/stage1/obj/dereference_unknown_length_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..22ad181fb221afcfe7fb0fe59f1c7ead214835aa --- /dev/null +++ b/test/compile_errors/stage1/obj/dereference_unknown_length_pointer.zig @@ -0,0 +1,7 @@ +export fn entry(x: [*]i32) i32 { + return x.*; +} + +// dereference unknown length pointer +// +// tmp.zig:2:13: error: index syntax required for unknown-length pointer type '[*]i32' diff --git a/test/compile_errors/stage1/obj/direct_struct_loop.zig b/test/compile_errors/stage1/obj/direct_struct_loop.zig new file mode 100644 index 0000000000000000000000000000000000000000..25b3c724c3bc144bd1f5922dfdbe40407dcffdb7 --- /dev/null +++ b/test/compile_errors/stage1/obj/direct_struct_loop.zig @@ -0,0 +1,6 @@ +const A = struct { a : A, }; +export fn entry() usize { return @sizeOf(A); } + +// direct struct loop +// +// tmp.zig:1:11: error: struct 'A' depends on itself diff --git a/test/compile_errors/stage1/obj/directly_embedding_opaque_type_in_struct_and_union.zig b/test/compile_errors/stage1/obj/directly_embedding_opaque_type_in_struct_and_union.zig new file mode 100644 index 0000000000000000000000000000000000000000..811fc00f50c7b13533d756df7bbd398b9904d88e --- /dev/null +++ b/test/compile_errors/stage1/obj/directly_embedding_opaque_type_in_struct_and_union.zig @@ -0,0 +1,27 @@ +const O = opaque {}; +const Foo = struct { + o: O, +}; +const Bar = union { + One: i32, + Two: O, +}; +export fn a() void { + var foo: Foo = undefined; + _ = foo; +} +export fn b() void { + var bar: Bar = undefined; + _ = bar; +} +export fn c() void { + var baz: *opaque {} = undefined; + const qux = .{baz.*}; + _ = qux; +} + +// directly embedding opaque type in struct and union +// +// tmp.zig:3:5: error: opaque types have unknown size and therefore cannot be directly embedded in structs +// tmp.zig:7:5: error: opaque types have unknown size and therefore cannot be directly embedded in unions +// tmp.zig:19:22: error: opaque types have unknown size and therefore cannot be directly embedded in structs diff --git a/test/compile_errors/stage1/obj/disallow_coercion_from_non-null-terminated_pointer_to_null-terminated_pointer.zig b/test/compile_errors/stage1/obj/disallow_coercion_from_non-null-terminated_pointer_to_null-terminated_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..a8467ddc871f829f4f7f323ac1b7ad5e3a13fa5f --- /dev/null +++ b/test/compile_errors/stage1/obj/disallow_coercion_from_non-null-terminated_pointer_to_null-terminated_pointer.zig @@ -0,0 +1,10 @@ +extern fn puts(s: [*:0]const u8) c_int; +pub fn main() void { + const no_zero_array = [_]u8{'h', 'e', 'l', 'l', 'o'}; + const no_zero_ptr: [*]const u8 = &no_zero_array; + _ = puts(no_zero_ptr); +} + +// disallow coercion from non-null-terminated pointer to null-terminated pointer +// +// tmp.zig:5:14: error: expected type '[*:0]const u8', found '[*]const u8' diff --git a/test/compile_errors/stage1/obj/discarding_error_value.zig b/test/compile_errors/stage1/obj/discarding_error_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..966a43a47c9f7e842d9b29d7e6cff15c762d3111 --- /dev/null +++ b/test/compile_errors/stage1/obj/discarding_error_value.zig @@ -0,0 +1,10 @@ +export fn entry() void { + _ = foo(); +} +fn foo() !void { + return error.OutOfMemory; +} + +// discarding error value +// +// tmp.zig:2:12: error: error is discarded. consider using `try`, `catch`, or `if` diff --git a/test/compile_errors/stage1/obj/div_assign_on_undefined_value.zig b/test/compile_errors/stage1/obj/div_assign_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..40c31649fbdd29c916cd64a1db68804bd0ed4812 --- /dev/null +++ b/test/compile_errors/stage1/obj/div_assign_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + a /= a; +} + +// div assign on undefined value +// +// tmp.zig:3:5: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/div_on_undefined_value.zig b/test/compile_errors/stage1/obj/div_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..17af3fa2217a39e22c85bf662bd3f1d8e04ce740 --- /dev/null +++ b/test/compile_errors/stage1/obj/div_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + _ = a / a; +} + +// div on undefined value +// +// tmp.zig:3:9: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/division_by_zero.zig b/test/compile_errors/stage1/obj/division_by_zero.zig new file mode 100644 index 0000000000000000000000000000000000000000..178d1d935be69ed11795bd21a1dd6f0f2e78a746 --- /dev/null +++ b/test/compile_errors/stage1/obj/division_by_zero.zig @@ -0,0 +1,16 @@ +const lit_int_x = 1 / 0; +const lit_float_x = 1.0 / 0.0; +const int_x = @as(u32, 1) / @as(u32, 0); +const float_x = @as(f32, 1.0) / @as(f32, 0.0); + +export fn entry1() usize { return @sizeOf(@TypeOf(lit_int_x)); } +export fn entry2() usize { return @sizeOf(@TypeOf(lit_float_x)); } +export fn entry3() usize { return @sizeOf(@TypeOf(int_x)); } +export fn entry4() usize { return @sizeOf(@TypeOf(float_x)); } + +// division by zero +// +// tmp.zig:1:21: error: division by zero +// tmp.zig:2:25: error: division by zero +// tmp.zig:3:27: error: division by zero +// tmp.zig:4:31: error: division by zero diff --git a/test/compile_errors/stage1/obj/dont_implicit_cast_double_pointer_to_anyopaque.zig b/test/compile_errors/stage1/obj/dont_implicit_cast_double_pointer_to_anyopaque.zig new file mode 100644 index 0000000000000000000000000000000000000000..5894103f1c2962c67fb1e68158fed1f7425b8745 --- /dev/null +++ b/test/compile_errors/stage1/obj/dont_implicit_cast_double_pointer_to_anyopaque.zig @@ -0,0 +1,11 @@ +export fn entry() void { + var a: u32 = 1; + var ptr: *align(@alignOf(u32)) anyopaque = &a; + var b: *u32 = @ptrCast(*u32, ptr); + var ptr2: *anyopaque = &b; + _ = ptr2; +} + +// don't implicit cast double pointer to *anyopaque +// +// tmp.zig:5:29: error: expected type '*anyopaque', found '**u32' diff --git a/test/compile_errors/stage1/obj/double_optional_on_main_return_value.zig b/test/compile_errors/stage1/obj/double_optional_on_main_return_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..c85706bc8775e8ecaa12b1c13249d812520410c0 --- /dev/null +++ b/test/compile_errors/stage1/obj/double_optional_on_main_return_value.zig @@ -0,0 +1,6 @@ +pub fn main() ??void { +} + +// double ?? on main return value +// +// error: expected return type of main to be 'void', '!void', 'noreturn', 'u8', or '!u8' diff --git a/test/compile_errors/stage1/obj/duplicate_boolean_switch_value.zig b/test/compile_errors/stage1/obj/duplicate_boolean_switch_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..8c496d5e19fcbc6c23fa9cea9b57f81f0ff1a9e7 --- /dev/null +++ b/test/compile_errors/stage1/obj/duplicate_boolean_switch_value.zig @@ -0,0 +1,21 @@ +comptime { + const x = switch (true) { + true => false, + false => true, + true => false, + }; + _ = x; +} +comptime { + const x = switch (true) { + false => true, + true => false, + false => true, + }; + _ = x; +} + +// duplicate boolean switch value +// +// tmp.zig:5:9: error: duplicate switch value +// tmp.zig:13:9: error: duplicate switch value diff --git a/test/compile_errors/stage1/obj/duplicate_enum_field.zig b/test/compile_errors/stage1/obj/duplicate_enum_field.zig new file mode 100644 index 0000000000000000000000000000000000000000..2aee3cc2dca5bca31552712de007f3683482ae2e --- /dev/null +++ b/test/compile_errors/stage1/obj/duplicate_enum_field.zig @@ -0,0 +1,14 @@ +const Foo = enum { + Bar, + Bar, +}; + +export fn entry() void { + const a: Foo = undefined; + _ = a; +} + +// duplicate enum field +// +// tmp.zig:3:5: error: duplicate enum field: 'Bar' +// tmp.zig:2:5: note: other field here diff --git a/test/compile_errors/stage1/obj/duplicate_error_in_switch.zig b/test/compile_errors/stage1/obj/duplicate_error_in_switch.zig new file mode 100644 index 0000000000000000000000000000000000000000..bca59056c383c09b196596bb1e2e6d2da15fa233 --- /dev/null +++ b/test/compile_errors/stage1/obj/duplicate_error_in_switch.zig @@ -0,0 +1,20 @@ +export fn entry() void { + foo(452) catch |err| switch (err) { + error.Foo => {}, + error.Bar => {}, + error.Foo => {}, + else => {}, + }; +} +fn foo(x: i32) !void { + switch (x) { + 0 ... 10 => return error.Foo, + 11 ... 20 => return error.Bar, + else => {}, + } +} + +// duplicate error in switch +// +// tmp.zig:5:14: error: duplicate switch value: '@typeInfo(@typeInfo(@TypeOf(foo)).Fn.return_type.?).ErrorUnion.error_set.Foo' +// tmp.zig:3:14: note: other value here diff --git a/test/compile_errors/stage1/obj/duplicate_error_value_in_error_set.zig b/test/compile_errors/stage1/obj/duplicate_error_value_in_error_set.zig new file mode 100644 index 0000000000000000000000000000000000000000..90457562b2ce5d29a0bff76f039a86d9759d57fb --- /dev/null +++ b/test/compile_errors/stage1/obj/duplicate_error_value_in_error_set.zig @@ -0,0 +1,13 @@ +const Foo = error { + Bar, + Bar, +}; +export fn entry() void { + const a: Foo = undefined; + _ = a; +} + +// duplicate error value in error set +// +// tmp.zig:3:5: error: duplicate error set field 'Bar' +// tmp.zig:2:5: note: previous declaration here diff --git a/test/compile_errors/stage1/obj/duplicate_field_in_struct_value_expression.zig b/test/compile_errors/stage1/obj/duplicate_field_in_struct_value_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..6df71430d9635fa801a9aba8f5d8eaee887b8756 --- /dev/null +++ b/test/compile_errors/stage1/obj/duplicate_field_in_struct_value_expression.zig @@ -0,0 +1,18 @@ +const A = struct { + x : i32, + y : i32, + z : i32, +}; +export fn f() void { + const a = A { + .z = 1, + .y = 2, + .x = 3, + .z = 4, + }; + _ = a; +} + +// duplicate field in struct value expression +// +// tmp.zig:11:9: error: duplicate field diff --git a/test/compile_errors/stage1/obj/duplicate_struct_field.zig b/test/compile_errors/stage1/obj/duplicate_struct_field.zig new file mode 100644 index 0000000000000000000000000000000000000000..d1fd05aacc44f59925459566f0b47f78bfaab819 --- /dev/null +++ b/test/compile_errors/stage1/obj/duplicate_struct_field.zig @@ -0,0 +1,13 @@ +const Foo = struct { + Bar: i32, + Bar: usize, +}; +export fn entry() void { + const a: Foo = undefined; + _ = a; +} + +// duplicate struct field +// +// tmp.zig:3:5: error: duplicate struct field: 'Bar' +// tmp.zig:2:5: note: other field here diff --git a/test/compile_errors/stage1/obj/duplicate_union_field.zig b/test/compile_errors/stage1/obj/duplicate_union_field.zig new file mode 100644 index 0000000000000000000000000000000000000000..a8bff106c689367a42a3677979c977fc732c3f94 --- /dev/null +++ b/test/compile_errors/stage1/obj/duplicate_union_field.zig @@ -0,0 +1,13 @@ +const Foo = union { + Bar: i32, + Bar: usize, +}; +export fn entry() void { + const a: Foo = undefined; + _ = a; +} + +// duplicate union field +// +// tmp.zig:3:5: error: duplicate union field: 'Bar' +// tmp.zig:2:5: note: other field here diff --git a/test/compile_errors/stage1/obj/embedFile_with_bogus_file.zig b/test/compile_errors/stage1/obj/embedFile_with_bogus_file.zig new file mode 100644 index 0000000000000000000000000000000000000000..e50e091909eb2bdd6708d13a4f0d49980223fd27 --- /dev/null +++ b/test/compile_errors/stage1/obj/embedFile_with_bogus_file.zig @@ -0,0 +1,7 @@ +const resource = @embedFile("bogus.txt",); + +export fn entry() usize { return @sizeOf(@TypeOf(resource)); } + +// @embedFile with bogus file +// +// tmp.zig:1:29: error: unable to find ' diff --git a/test/compile_errors/stage1/obj/empty_for_loop_body.zig b/test/compile_errors/stage1/obj/empty_for_loop_body.zig new file mode 100644 index 0000000000000000000000000000000000000000..6e042f71e47e647cead2f88b992148bc67f4e7cd --- /dev/null +++ b/test/compile_errors/stage1/obj/empty_for_loop_body.zig @@ -0,0 +1,7 @@ +export fn a() void { + for(undefined) |x|; +} + +// empty for loop body +// +// tmp.zig:2:23: error: expected block or assignment, found ';' diff --git a/test/compile_errors/stage1/obj/empty_if_body.zig b/test/compile_errors/stage1/obj/empty_if_body.zig new file mode 100644 index 0000000000000000000000000000000000000000..a81973396fb2cfaec6049eb6e2b8cf152204d140 --- /dev/null +++ b/test/compile_errors/stage1/obj/empty_if_body.zig @@ -0,0 +1,7 @@ +export fn a() void { + if(true); +} + +// empty if body +// +// tmp.zig:2:13: error: expected block or assignment, found ';' diff --git a/test/compile_errors/stage1/obj/empty_switch_on_an_integer.zig b/test/compile_errors/stage1/obj/empty_switch_on_an_integer.zig new file mode 100644 index 0000000000000000000000000000000000000000..eb0bdbab19bbfc3a54da9bb8e3c44058127eca42 --- /dev/null +++ b/test/compile_errors/stage1/obj/empty_switch_on_an_integer.zig @@ -0,0 +1,8 @@ +export fn entry() void { + var x: u32 = 0; + switch(x) {} +} + +// empty switch on an integer +// +// tmp.zig:3:5: error: switch must handle all possibilities diff --git a/test/compile_errors/stage1/obj/empty_while_loop_body.zig b/test/compile_errors/stage1/obj/empty_while_loop_body.zig new file mode 100644 index 0000000000000000000000000000000000000000..3a186f1a2be37997652a0948bf99d175acc29339 --- /dev/null +++ b/test/compile_errors/stage1/obj/empty_while_loop_body.zig @@ -0,0 +1,7 @@ +export fn a() void { + while(true); +} + +// empty while loop body +// +// tmp.zig:2:16: error: expected block or assignment, found ';' diff --git a/test/compile_errors/stage1/obj/endless_loop_in_function_evaluation.zig b/test/compile_errors/stage1/obj/endless_loop_in_function_evaluation.zig new file mode 100644 index 0000000000000000000000000000000000000000..fa422ba58844c6aca4abb105493a6530aa2484e3 --- /dev/null +++ b/test/compile_errors/stage1/obj/endless_loop_in_function_evaluation.zig @@ -0,0 +1,10 @@ +const seventh_fib_number = fibonacci(7); +fn fibonacci(x: i32) i32 { + return fibonacci(x - 1) + fibonacci(x - 2); +} + +export fn entry() usize { return @sizeOf(@TypeOf(seventh_fib_number)); } + +// endless loop in function evaluation +// +// tmp.zig:3:21: error: evaluation exceeded 1000 backwards branches diff --git a/test/compile_errors/stage1/obj/enum_field_value_references_enum.zig b/test/compile_errors/stage1/obj/enum_field_value_references_enum.zig new file mode 100644 index 0000000000000000000000000000000000000000..02dcfc1f9d39916831de7f1367cbc2ed00284f9e --- /dev/null +++ b/test/compile_errors/stage1/obj/enum_field_value_references_enum.zig @@ -0,0 +1,13 @@ +pub const Foo = enum(c_int) { + A = Foo.B, + C = D, +}; +export fn entry() void { + var s: Foo = Foo.E; + _ = s; +} +const D = 1; + +// enum field value references enum +// +// tmp.zig:1:17: error: enum 'Foo' depends on itself diff --git a/test/compile_errors/stage1/obj/enum_in_field_count_range_but_not_matching_tag.zig b/test/compile_errors/stage1/obj/enum_in_field_count_range_but_not_matching_tag.zig new file mode 100644 index 0000000000000000000000000000000000000000..dc90c467df23672a5c4d1dc4b4f63ecc69cf7eb2 --- /dev/null +++ b/test/compile_errors/stage1/obj/enum_in_field_count_range_but_not_matching_tag.zig @@ -0,0 +1,13 @@ +const Foo = enum(u32) { + A = 10, + B = 11, +}; +export fn entry() void { + var x = @intToEnum(Foo, 0); + _ = x; +} + +// enum in field count range but not matching tag +// +// tmp.zig:6:13: error: enum 'Foo' has no tag matching integer value 0 +// tmp.zig:1:13: note: 'Foo' declared here diff --git a/test/compile_errors/stage1/obj/enum_value_already_taken.zig b/test/compile_errors/stage1/obj/enum_value_already_taken.zig new file mode 100644 index 0000000000000000000000000000000000000000..9939553c412ae4f42b764cd5afd9e78eb672e9cb --- /dev/null +++ b/test/compile_errors/stage1/obj/enum_value_already_taken.zig @@ -0,0 +1,16 @@ +const MultipleChoice = enum(u32) { + A = 20, + B = 40, + C = 60, + D = 1000, + E = 60, +}; +export fn entry() void { + var x = MultipleChoice.C; + _ = x; +} + +// enum value already taken +// +// tmp.zig:6:5: error: enum tag value 60 already taken +// tmp.zig:4:5: note: other occurrence here diff --git a/test/compile_errors/stage1/obj/enum_with_0_fields.zig b/test/compile_errors/stage1/obj/enum_with_0_fields.zig new file mode 100644 index 0000000000000000000000000000000000000000..10559d15b3c44eb4e0747a2255cdbd34019b94ca --- /dev/null +++ b/test/compile_errors/stage1/obj/enum_with_0_fields.zig @@ -0,0 +1,5 @@ +const Foo = enum {}; + +// enum with 0 fields +// +// tmp.zig:1:13: error: enum declarations must have at least one tag diff --git a/test/compile_errors/stage1/obj/enum_with_declarations_unavailable_for_reify_type.zig b/test/compile_errors/stage1/obj/enum_with_declarations_unavailable_for_reify_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..4a27caab3d474616135cd86466f595c2311c7699 --- /dev/null +++ b/test/compile_errors/stage1/obj/enum_with_declarations_unavailable_for_reify_type.zig @@ -0,0 +1,7 @@ +export fn entry() void { + _ = @Type(@typeInfo(enum { foo, const bar = 1; })); +} + +// enum with declarations unavailable for @Type +// +// tmp.zig:2:15: error: Type.Enum.decls must be empty for @Type diff --git a/test/compile_errors/stage1/obj/error_equality_but_sets_have_no_common_members.zig b/test/compile_errors/stage1/obj/error_equality_but_sets_have_no_common_members.zig new file mode 100644 index 0000000000000000000000000000000000000000..433f6d50e33a12b394da4c3d6cebfb659243fd88 --- /dev/null +++ b/test/compile_errors/stage1/obj/error_equality_but_sets_have_no_common_members.zig @@ -0,0 +1,14 @@ +const Set1 = error{A, C}; +const Set2 = error{B, D}; +export fn entry() void { + foo(Set1.A); +} +fn foo(x: Set1) void { + if (x == Set2.B) { + + } +} + +// error equality but sets have no common members +// +// tmp.zig:7:11: error: error sets 'Set1' and 'Set2' have no common errors diff --git a/test/compile_errors/stage1/obj/error_not_handled_in_switch.zig b/test/compile_errors/stage1/obj/error_not_handled_in_switch.zig new file mode 100644 index 0000000000000000000000000000000000000000..a69c538eacceb278154454f197d96e7ef7ff42a0 --- /dev/null +++ b/test/compile_errors/stage1/obj/error_not_handled_in_switch.zig @@ -0,0 +1,18 @@ +export fn entry() void { + foo(452) catch |err| switch (err) { + error.Foo => {}, + }; +} +fn foo(x: i32) !void { + switch (x) { + 0 ... 10 => return error.Foo, + 11 ... 20 => return error.Bar, + 21 ... 30 => return error.Baz, + else => {}, + } +} + +// error not handled in switch +// +// tmp.zig:2:26: error: error.Baz not handled in switch +// tmp.zig:2:26: error: error.Bar not handled in switch diff --git a/test/compile_errors/stage1/obj/error_note_for_function_parameter_incompatibility.zig b/test/compile_errors/stage1/obj/error_note_for_function_parameter_incompatibility.zig new file mode 100644 index 0000000000000000000000000000000000000000..5014d01a3daf24b0cc7f0c141e148b35cc417936 --- /dev/null +++ b/test/compile_errors/stage1/obj/error_note_for_function_parameter_incompatibility.zig @@ -0,0 +1,10 @@ +fn do_the_thing(func: fn (arg: i32) void) void { _ = func; } +fn bar(arg: bool) void { _ = arg; } +export fn entry() void { + do_the_thing(bar); +} + +// error note for function parameter incompatibility +// +// tmp.zig:4:18: error: expected type 'fn(i32) void', found 'fn(bool) void +// tmp.zig:4:18: note: parameter 0: 'bool' cannot cast into 'i32' diff --git a/test/compile_errors/stage1/obj/error_union_operator_with_non_error_set_LHS.zig b/test/compile_errors/stage1/obj/error_union_operator_with_non_error_set_LHS.zig new file mode 100644 index 0000000000000000000000000000000000000000..40b5872fc81a6cd8b5d27e5eee4f6ada1afe18ae --- /dev/null +++ b/test/compile_errors/stage1/obj/error_union_operator_with_non_error_set_LHS.zig @@ -0,0 +1,9 @@ +comptime { + const z = i32!i32; + var x: z = undefined; + _ = x; +} + +// error union operator with non error set LHS +// +// tmp.zig:2:15: error: expected error set type, found type 'i32' diff --git a/test/compile_errors/stage1/obj/error_when_evaluating_return_type.zig b/test/compile_errors/stage1/obj/error_when_evaluating_return_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..60baa1c5b4878be08150d0dbdc3b160791e09de9 --- /dev/null +++ b/test/compile_errors/stage1/obj/error_when_evaluating_return_type.zig @@ -0,0 +1,15 @@ +const Foo = struct { + map: @as(i32, i32), + + fn init() Foo { + return undefined; + } +}; +export fn entry() void { + var rule_set = try Foo.init(); + _ = rule_set; +} + +// error when evaluating return type +// +// tmp.zig:2:19: error: expected type 'i32', found 'type' diff --git a/test/compile_errors/stage1/obj/exceeded_maximum_bit_width_of_integer.zig b/test/compile_errors/stage1/obj/exceeded_maximum_bit_width_of_integer.zig new file mode 100644 index 0000000000000000000000000000000000000000..e1784de63e6aa220656a42829a5e6e20a6c027a8 --- /dev/null +++ b/test/compile_errors/stage1/obj/exceeded_maximum_bit_width_of_integer.zig @@ -0,0 +1,13 @@ +export fn entry1() void { + const T = u65536; + _ = T; +} +export fn entry2() void { + var x: i65536 = 1; + _ = x; +} + +// exceeded maximum bit width of integer +// +// tmp.zig:2:15: error: primitive integer type 'u65536' exceeds maximum bit width of 65535 +// tmp.zig:6:12: error: primitive integer type 'i65536' exceeds maximum bit width of 65535 diff --git a/test/compile_errors/stage1/obj/explicit_cast_float_literal_to_integer_when_there_is_a_fraction_component.zig b/test/compile_errors/stage1/obj/explicit_cast_float_literal_to_integer_when_there_is_a_fraction_component.zig new file mode 100644 index 0000000000000000000000000000000000000000..eaa2be84c7adb813c5c7a1db38fcfcd765f99067 --- /dev/null +++ b/test/compile_errors/stage1/obj/explicit_cast_float_literal_to_integer_when_there_is_a_fraction_component.zig @@ -0,0 +1,7 @@ +export fn entry() i32 { + return @as(i32, 12.34); +} + +// explicit cast float literal to integer when there is a fraction component +// +// tmp.zig:2:21: error: fractional component prevents float value 12.340000 from being casted to type 'i32' diff --git a/test/compile_errors/stage1/obj/explicit_error_set_cast_known_at_comptime_violates_error_sets.zig b/test/compile_errors/stage1/obj/explicit_error_set_cast_known_at_comptime_violates_error_sets.zig new file mode 100644 index 0000000000000000000000000000000000000000..68d78e0f9228b94e40f52301c3a2638d0c7e3b28 --- /dev/null +++ b/test/compile_errors/stage1/obj/explicit_error_set_cast_known_at_comptime_violates_error_sets.zig @@ -0,0 +1,11 @@ +const Set1 = error {A, B}; +const Set2 = error {A, C}; +comptime { + var x = Set1.B; + var y = @errSetCast(Set2, x); + _ = y; +} + +// explicit error set cast known at comptime violates error sets +// +// tmp.zig:5:13: error: error.B not a member of error set 'Set2' diff --git a/test/compile_errors/stage1/obj/explicitly_casting_non_tag_type_to_enum.zig b/test/compile_errors/stage1/obj/explicitly_casting_non_tag_type_to_enum.zig new file mode 100644 index 0000000000000000000000000000000000000000..e7c4d5f5d948cf6a900fd6122899d69f2357b17e --- /dev/null +++ b/test/compile_errors/stage1/obj/explicitly_casting_non_tag_type_to_enum.zig @@ -0,0 +1,16 @@ +const Small = enum(u2) { + One, + Two, + Three, + Four, +}; + +export fn entry() void { + var y = @as(f32, 3); + var x = @intToEnum(Small, y); + _ = x; +} + +// explicitly casting non tag type to enum +// +// tmp.zig:10:31: error: expected integer type, found 'f32' diff --git a/test/compile_errors/stage1/obj/export_function_with_comptime_parameter.zig b/test/compile_errors/stage1/obj/export_function_with_comptime_parameter.zig new file mode 100644 index 0000000000000000000000000000000000000000..0f300f324bba1a06add37a6ff8ab727c037db983 --- /dev/null +++ b/test/compile_errors/stage1/obj/export_function_with_comptime_parameter.zig @@ -0,0 +1,7 @@ +export fn foo(comptime x: i32, y: i32) i32{ + return x + y; +} + +// export function with comptime parameter +// +// tmp.zig:1:15: error: comptime parameter not allowed in function with calling convention 'C' diff --git a/test/compile_errors/stage1/obj/export_generic_function.zig b/test/compile_errors/stage1/obj/export_generic_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..3fb4375ed46732fc90d947a4154e965860e00ece --- /dev/null +++ b/test/compile_errors/stage1/obj/export_generic_function.zig @@ -0,0 +1,8 @@ +export fn foo(num: anytype) i32 { + _ = num; + return 0; +} + +// export generic function +// +// tmp.zig:1:15: error: parameter of type 'anytype' not allowed in function with calling convention 'C' diff --git a/test/compile_errors/stage1/obj/exported_async_function.zig b/test/compile_errors/stage1/obj/exported_async_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..296a5950e9a72ba477baa959c1787031b81ae36e --- /dev/null +++ b/test/compile_errors/stage1/obj/exported_async_function.zig @@ -0,0 +1,5 @@ +export fn foo() callconv(.Async) void {} + +// exported async function +// +// tmp.zig:1:1: error: exported function cannot be async diff --git a/test/compile_errors/stage1/obj/exported_enum_without_explicit_integer_tag_type.zig b/test/compile_errors/stage1/obj/exported_enum_without_explicit_integer_tag_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..3d6e63db4354f3c46b4ac170032addf3346c335a --- /dev/null +++ b/test/compile_errors/stage1/obj/exported_enum_without_explicit_integer_tag_type.zig @@ -0,0 +1,13 @@ +const E = enum { one, two }; +comptime { + @export(E, .{ .name = "E" }); +} +const e: E = .two; +comptime { + @export(e, .{ .name = "e" }); +} + +// exported enum without explicit integer tag type +// +// tmp.zig:3:13: error: exported enum without explicit integer tag type +// tmp.zig:7:13: error: exported enum value without explicit integer tag type diff --git a/test/compile_errors/stage1/obj/extern_function_pointer_mismatch.zig b/test/compile_errors/stage1/obj/extern_function_pointer_mismatch.zig new file mode 100644 index 0000000000000000000000000000000000000000..f93a24db346b824adacc3d27599f79cc099ecb82 --- /dev/null +++ b/test/compile_errors/stage1/obj/extern_function_pointer_mismatch.zig @@ -0,0 +1,10 @@ +const fns = [_](fn(i32)i32) { a, b, c }; +pub fn a(x: i32) i32 {return x + 0;} +pub fn b(x: i32) i32 {return x + 1;} +export fn c(x: i32) i32 {return x + 2;} + +export fn entry() usize { return @sizeOf(@TypeOf(fns)); } + +// extern function pointer mismatch +// +// tmp.zig:1:37: error: expected type 'fn(i32) i32', found 'fn(i32) callconv(.C) i32' diff --git a/test/compile_errors/stage1/obj/extern_function_with_comptime_parameter.zig b/test/compile_errors/stage1/obj/extern_function_with_comptime_parameter.zig new file mode 100644 index 0000000000000000000000000000000000000000..3dfdfe663e2ef49c64cf52ddf5481794f5a177a6 --- /dev/null +++ b/test/compile_errors/stage1/obj/extern_function_with_comptime_parameter.zig @@ -0,0 +1,9 @@ +extern fn foo(comptime x: i32, y: i32) i32; +fn f() i32 { + return foo(1, 2); +} +export fn entry() usize { return @sizeOf(@TypeOf(f)); } + +// extern function with comptime parameter +// +// tmp.zig:1:15: error: comptime parameter not allowed in function with calling convention 'C' diff --git a/test/compile_errors/stage1/obj/extern_struct_with_extern-compatible_but_inferred_integer_tag_type.zig b/test/compile_errors/stage1/obj/extern_struct_with_extern-compatible_but_inferred_integer_tag_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..e65c438da3c7f69587029bdcfdfb853c3cdb256e --- /dev/null +++ b/test/compile_errors/stage1/obj/extern_struct_with_extern-compatible_but_inferred_integer_tag_type.zig @@ -0,0 +1,41 @@ +pub const E = enum { +@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",@"11",@"12", +@"13",@"14",@"15",@"16",@"17",@"18",@"19",@"20",@"21",@"22",@"23", +@"24",@"25",@"26",@"27",@"28",@"29",@"30",@"31",@"32",@"33",@"34", +@"35",@"36",@"37",@"38",@"39",@"40",@"41",@"42",@"43",@"44",@"45", +@"46",@"47",@"48",@"49",@"50",@"51",@"52",@"53",@"54",@"55",@"56", +@"57",@"58",@"59",@"60",@"61",@"62",@"63",@"64",@"65",@"66",@"67", +@"68",@"69",@"70",@"71",@"72",@"73",@"74",@"75",@"76",@"77",@"78", +@"79",@"80",@"81",@"82",@"83",@"84",@"85",@"86",@"87",@"88",@"89", +@"90",@"91",@"92",@"93",@"94",@"95",@"96",@"97",@"98",@"99",@"100", +@"101",@"102",@"103",@"104",@"105",@"106",@"107",@"108",@"109", +@"110",@"111",@"112",@"113",@"114",@"115",@"116",@"117",@"118", +@"119",@"120",@"121",@"122",@"123",@"124",@"125",@"126",@"127", +@"128",@"129",@"130",@"131",@"132",@"133",@"134",@"135",@"136", +@"137",@"138",@"139",@"140",@"141",@"142",@"143",@"144",@"145", +@"146",@"147",@"148",@"149",@"150",@"151",@"152",@"153",@"154", +@"155",@"156",@"157",@"158",@"159",@"160",@"161",@"162",@"163", +@"164",@"165",@"166",@"167",@"168",@"169",@"170",@"171",@"172", +@"173",@"174",@"175",@"176",@"177",@"178",@"179",@"180",@"181", +@"182",@"183",@"184",@"185",@"186",@"187",@"188",@"189",@"190", +@"191",@"192",@"193",@"194",@"195",@"196",@"197",@"198",@"199", +@"200",@"201",@"202",@"203",@"204",@"205",@"206",@"207",@"208", +@"209",@"210",@"211",@"212",@"213",@"214",@"215",@"216",@"217", +@"218",@"219",@"220",@"221",@"222",@"223",@"224",@"225",@"226", +@"227",@"228",@"229",@"230",@"231",@"232",@"233",@"234",@"235", +@"236",@"237",@"238",@"239",@"240",@"241",@"242",@"243",@"244", +@"245",@"246",@"247",@"248",@"249",@"250",@"251",@"252",@"253", +@"254",@"255" +}; +pub const S = extern struct { + e: E, +}; +export fn entry() void { + if (@typeInfo(E).Enum.tag_type != u8) @compileError("did not infer u8 tag type"); + const s: S = undefined; + _ = s; +} + +// extern struct with extern-compatible but inferred integer tag type +// +// tmp.zig:31:5: error: extern structs cannot contain fields of type 'E' diff --git a/test/compile_errors/stage1/obj/extern_struct_with_non-extern-compatible_integer_tag_type.zig b/test/compile_errors/stage1/obj/extern_struct_with_non-extern-compatible_integer_tag_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..6d698ce8e3ec112ab52597d1256769804d77f6e1 --- /dev/null +++ b/test/compile_errors/stage1/obj/extern_struct_with_non-extern-compatible_integer_tag_type.zig @@ -0,0 +1,12 @@ +pub const E = enum(u31) { A, B, C }; +pub const S = extern struct { + e: E, +}; +export fn entry() void { + const s: S = undefined; + _ = s; +} + +// extern struct with non-extern-compatible integer tag type +// +// tmp.zig:3:5: error: extern structs cannot contain fields of type 'E' diff --git a/test/compile_errors/stage1/obj/extern_union_field_missing_type.zig b/test/compile_errors/stage1/obj/extern_union_field_missing_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..1287ce015952f748c686fc1b7bd125fdd6a29a91 --- /dev/null +++ b/test/compile_errors/stage1/obj/extern_union_field_missing_type.zig @@ -0,0 +1,11 @@ +const Letter = extern union { + A, +}; +export fn entry() void { + var a = Letter { .A = {} }; + _ = a; +} + +// extern union field missing type +// +// tmp.zig:2:5: error: union field missing type diff --git a/test/compile_errors/stage1/obj/extern_union_given_enum_tag_type.zig b/test/compile_errors/stage1/obj/extern_union_given_enum_tag_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..5b38d77eb652249d7f8a4111867464af138a5dd0 --- /dev/null +++ b/test/compile_errors/stage1/obj/extern_union_given_enum_tag_type.zig @@ -0,0 +1,18 @@ +const Letter = enum { + A, + B, + C, +}; +const Payload = extern union(Letter) { + A: i32, + B: f64, + C: bool, +}; +export fn entry() void { + var a = Payload { .A = 1234 }; + _ = a; +} + +// extern union given enum tag type +// +// tmp.zig:6:30: error: extern union does not support enum tag type diff --git a/test/compile_errors/stage1/obj/extern_variable_has_no_type.zig b/test/compile_errors/stage1/obj/extern_variable_has_no_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..f9d395227559cd3dd44688d78ec6476085beed20 --- /dev/null +++ b/test/compile_errors/stage1/obj/extern_variable_has_no_type.zig @@ -0,0 +1,8 @@ +extern var foo; +pub export fn entry() void { + foo; +} + +// extern variable has no type +// +// tmp.zig:1:8: error: unable to infer variable type diff --git a/test/compile_errors/stage1/obj/fieldParentPtr-bad_field_name.zig b/test/compile_errors/stage1/obj/fieldParentPtr-bad_field_name.zig new file mode 100644 index 0000000000000000000000000000000000000000..8c40641113790133915cd784a4b694ccf8c24d7e --- /dev/null +++ b/test/compile_errors/stage1/obj/fieldParentPtr-bad_field_name.zig @@ -0,0 +1,10 @@ +const Foo = extern struct { + derp: i32, +}; +export fn foo(a: *i32) *Foo { + return @fieldParentPtr(Foo, "a", a); +} + +// @fieldParentPtr - bad field name +// +// tmp.zig:5:33: error: struct 'Foo' has no field 'a' diff --git a/test/compile_errors/stage1/obj/fieldParentPtr-comptime_field_ptr_not_based_on_struct.zig b/test/compile_errors/stage1/obj/fieldParentPtr-comptime_field_ptr_not_based_on_struct.zig new file mode 100644 index 0000000000000000000000000000000000000000..a8a54313521ab88b8d4fc76e8b83b4bf31badbf4 --- /dev/null +++ b/test/compile_errors/stage1/obj/fieldParentPtr-comptime_field_ptr_not_based_on_struct.zig @@ -0,0 +1,15 @@ +const Foo = struct { + a: i32, + b: i32, +}; +const foo = Foo { .a = 1, .b = 2, }; + +comptime { + const field_ptr = @intToPtr(*i32, 0x1234); + const another_foo_ptr = @fieldParentPtr(Foo, "b", field_ptr); + _ = another_foo_ptr; +} + +// @fieldParentPtr - comptime field ptr not based on struct +// +// tmp.zig:9:55: error: pointer value not based on parent struct diff --git a/test/compile_errors/stage1/obj/fieldParentPtr-comptime_wrong_field_index.zig b/test/compile_errors/stage1/obj/fieldParentPtr-comptime_wrong_field_index.zig new file mode 100644 index 0000000000000000000000000000000000000000..11bb7282fce3e8092a0dacc989c93a1a74e59db9 --- /dev/null +++ b/test/compile_errors/stage1/obj/fieldParentPtr-comptime_wrong_field_index.zig @@ -0,0 +1,14 @@ +const Foo = struct { + a: i32, + b: i32, +}; +const foo = Foo { .a = 1, .b = 2, }; + +comptime { + const another_foo_ptr = @fieldParentPtr(Foo, "b", &foo.a); + _ = another_foo_ptr; +} + +// @fieldParentPtr - comptime wrong field index +// +// tmp.zig:8:29: error: field 'b' has index 1 but pointer value is index 0 of struct 'Foo' diff --git a/test/compile_errors/stage1/obj/fieldParentPtr-field_pointer_is_not_pointer.zig b/test/compile_errors/stage1/obj/fieldParentPtr-field_pointer_is_not_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..8db9075b7b84d983f861c9bf7992d50e965e8bc7 --- /dev/null +++ b/test/compile_errors/stage1/obj/fieldParentPtr-field_pointer_is_not_pointer.zig @@ -0,0 +1,10 @@ +const Foo = extern struct { + a: i32, +}; +export fn foo(a: i32) *Foo { + return @fieldParentPtr(Foo, "a", a); +} + +// @fieldParentPtr - field pointer is not pointer +// +// tmp.zig:5:38: error: expected pointer, found 'i32' diff --git a/test/compile_errors/stage1/obj/fieldParentPtr-non_struct.zig b/test/compile_errors/stage1/obj/fieldParentPtr-non_struct.zig new file mode 100644 index 0000000000000000000000000000000000000000..325fbe5b3b04eabbf00e50f70850198884f445c7 --- /dev/null +++ b/test/compile_errors/stage1/obj/fieldParentPtr-non_struct.zig @@ -0,0 +1,8 @@ +const Foo = i32; +export fn foo(a: *i32) *Foo { + return @fieldParentPtr(Foo, "a", a); +} + +// @fieldParentPtr - non struct +// +// tmp.zig:3:28: error: expected struct type, found 'i32' diff --git a/test/compile_errors/stage1/obj/field_access_of_opaque_type.zig b/test/compile_errors/stage1/obj/field_access_of_opaque_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..3354c0f471c71f496942da6a7eec2d72d5bd8c2e --- /dev/null +++ b/test/compile_errors/stage1/obj/field_access_of_opaque_type.zig @@ -0,0 +1,14 @@ +const MyType = opaque {}; + +export fn entry() bool { + var x: i32 = 1; + return bar(@ptrCast(*MyType, &x)); +} + +fn bar(x: *MyType) bool { + return x.blah; +} + +// field access of opaque type +// +// tmp.zig:9:13: error: no member named 'blah' in opaque type 'MyType' diff --git a/test/compile_errors/stage1/obj/field_access_of_slices.zig b/test/compile_errors/stage1/obj/field_access_of_slices.zig new file mode 100644 index 0000000000000000000000000000000000000000..3e79e1f0e0c28cd3b1b410bb972e4d7769961f1d --- /dev/null +++ b/test/compile_errors/stage1/obj/field_access_of_slices.zig @@ -0,0 +1,9 @@ +export fn entry() void { + var slice: []i32 = undefined; + const info = @TypeOf(slice).unknown; + _ = info; +} + +// field access of slices +// +// tmp.zig:3:32: error: type 'type' does not support field access diff --git a/test/compile_errors/stage1/obj/field_access_of_unknown_length_pointer.zig b/test/compile_errors/stage1/obj/field_access_of_unknown_length_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..7097c13605b47ee801e420100f17764983e05295 --- /dev/null +++ b/test/compile_errors/stage1/obj/field_access_of_unknown_length_pointer.zig @@ -0,0 +1,11 @@ +const Foo = extern struct { + a: i32, +}; + +export fn entry(foo: [*]Foo) void { + foo.a += 1; +} + +// field access of unknown length pointer +// +// tmp.zig:6:8: error: type '[*]Foo' does not support field access diff --git a/test/compile_errors/stage1/obj/field_type_supplied_in_an_enum.zig b/test/compile_errors/stage1/obj/field_type_supplied_in_an_enum.zig new file mode 100644 index 0000000000000000000000000000000000000000..cb308307bb170f820db68a1181dec52bd1f78443 --- /dev/null +++ b/test/compile_errors/stage1/obj/field_type_supplied_in_an_enum.zig @@ -0,0 +1,10 @@ +const Letter = enum { + A: void, + B, + C, +}; + +// field type supplied in an enum +// +// tmp.zig:2:8: error: enum fields do not have types +// tmp.zig:1:16: note: consider 'union(enum)' here to make it a tagged union diff --git a/test/compile_errors/stage1/obj/floatToInt_comptime_safety.zig b/test/compile_errors/stage1/obj/floatToInt_comptime_safety.zig new file mode 100644 index 0000000000000000000000000000000000000000..e54047fb2ff501c3c58b816d36ada7bfb8421440 --- /dev/null +++ b/test/compile_errors/stage1/obj/floatToInt_comptime_safety.zig @@ -0,0 +1,15 @@ +comptime { + _ = @floatToInt(i8, @as(f32, -129.1)); +} +comptime { + _ = @floatToInt(u8, @as(f32, -1.1)); +} +comptime { + _ = @floatToInt(u8, @as(f32, 256.1)); +} + +// @floatToInt comptime safety +// +// tmp.zig:2:9: error: integer value '-129' cannot be stored in type 'i8' +// tmp.zig:5:9: error: integer value '-1' cannot be stored in type 'u8' +// tmp.zig:8:9: error: integer value '256' cannot be stored in type 'u8' diff --git a/test/compile_errors/stage1/obj/float_literal_too_large_error.zig b/test/compile_errors/stage1/obj/float_literal_too_large_error.zig new file mode 100644 index 0000000000000000000000000000000000000000..d7be9874ac299c189a11ba2c415544ae43c55986 --- /dev/null +++ b/test/compile_errors/stage1/obj/float_literal_too_large_error.zig @@ -0,0 +1,8 @@ +comptime { + const a = 0x1.0p18495; + _ = a; +} + +// float literal too large error +// +// tmp.zig:2:15: error: float literal out of range of any type diff --git a/test/compile_errors/stage1/obj/float_literal_too_small_error_denormal.zig b/test/compile_errors/stage1/obj/float_literal_too_small_error_denormal.zig new file mode 100644 index 0000000000000000000000000000000000000000..2657775be0e126c8ede10663010a47d885481ca3 --- /dev/null +++ b/test/compile_errors/stage1/obj/float_literal_too_small_error_denormal.zig @@ -0,0 +1,8 @@ +comptime { + const a = 0x1.0p-19000; + _ = a; +} + +// float literal too small error (denormal) +// +// tmp.zig:2:15: error: float literal out of range of any type diff --git a/test/compile_errors/stage1/obj/for_loop_body_expression_ignored.zig b/test/compile_errors/stage1/obj/for_loop_body_expression_ignored.zig new file mode 100644 index 0000000000000000000000000000000000000000..fffbb13604dfd05b70ff37c8ccf1a9a797cd0766 --- /dev/null +++ b/test/compile_errors/stage1/obj/for_loop_body_expression_ignored.zig @@ -0,0 +1,16 @@ +fn returns() usize { + return 2; +} +export fn f1() void { + for ("hello") |_| returns(); +} +export fn f2() void { + var x: anyerror!i32 = error.Bad; + for ("hello") |_| returns() else unreachable; + _ = x; +} + +// for loop body expression ignored +// +// tmp.zig:5:30: error: expression value is ignored +// tmp.zig:9:30: error: expression value is ignored diff --git a/test/compile_errors/stage1/obj/frame_called_outside_of_function_definition.zig b/test/compile_errors/stage1/obj/frame_called_outside_of_function_definition.zig new file mode 100644 index 0000000000000000000000000000000000000000..a76fff93a8a6dc31c05a5135fcfa122818f97450 --- /dev/null +++ b/test/compile_errors/stage1/obj/frame_called_outside_of_function_definition.zig @@ -0,0 +1,9 @@ +var handle_undef: anyframe = undefined; +var handle_dummy: anyframe = @frame(); +export fn entry() bool { + return handle_undef == handle_dummy; +} + +// @frame() called outside of function definition +// +// tmp.zig:2:30: error: @frame() called outside of function definition diff --git a/test/compile_errors/stage1/obj/frame_causes_function_to_be_async.zig b/test/compile_errors/stage1/obj/frame_causes_function_to_be_async.zig new file mode 100644 index 0000000000000000000000000000000000000000..b45ff6965ea48cc137b1053a3b5fe4c09904087e --- /dev/null +++ b/test/compile_errors/stage1/obj/frame_causes_function_to_be_async.zig @@ -0,0 +1,11 @@ +export fn entry() void { + func(); +} +fn func() void { + _ = @frame(); +} + +// @frame() causes function to be async +// +// tmp.zig:1:1: error: function with calling convention 'C' cannot be async +// tmp.zig:5:9: note: @frame() causes function to be async diff --git a/test/compile_errors/stage1/obj/function_alignment_non_power_of_2.zig b/test/compile_errors/stage1/obj/function_alignment_non_power_of_2.zig new file mode 100644 index 0000000000000000000000000000000000000000..949e11c115f6a5c31c9c90c97151c7e73c5ebd0c --- /dev/null +++ b/test/compile_errors/stage1/obj/function_alignment_non_power_of_2.zig @@ -0,0 +1,6 @@ +extern fn foo() align(3) void; +export fn entry() void { return foo(); } + +// function alignment non power of 2 +// +// tmp.zig:1:23: error: alignment value 3 is not a power of 2 diff --git a/test/compile_errors/stage1/obj/function_call_assigned_to_incorrect_type.zig b/test/compile_errors/stage1/obj/function_call_assigned_to_incorrect_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..4257b802c14d0d79825c836c871bcb876ce8f5ae --- /dev/null +++ b/test/compile_errors/stage1/obj/function_call_assigned_to_incorrect_type.zig @@ -0,0 +1,11 @@ +export fn entry() void { + var arr: [4]f32 = undefined; + arr = concat(); +} +fn concat() [16]f32 { + return [1]f32{0}**16; +} + +// function call assigned to incorrect type +// +// tmp.zig:3:17: error: expected type '[4]f32', found '[16]f32' diff --git a/test/compile_errors/stage1/obj/function_parameter_is_opaque.zig b/test/compile_errors/stage1/obj/function_parameter_is_opaque.zig new file mode 100644 index 0000000000000000000000000000000000000000..12e50ca59bd12ac6b45df7e9b319ce9ba5b90300 --- /dev/null +++ b/test/compile_errors/stage1/obj/function_parameter_is_opaque.zig @@ -0,0 +1,27 @@ +const FooType = opaque {}; +export fn entry1() void { + const someFuncPtr: fn (FooType) void = undefined; + _ = someFuncPtr; +} + +export fn entry2() void { + const someFuncPtr: fn (@TypeOf(null)) void = undefined; + _ = someFuncPtr; +} + +fn foo(p: FooType) void {_ = p;} +export fn entry3() void { + _ = foo; +} + +fn bar(p: @TypeOf(null)) void {_ = p;} +export fn entry4() void { + _ = bar; +} + +// function parameter is opaque +// +// tmp.zig:3:28: error: parameter of opaque type 'FooType' not allowed +// tmp.zig:8:28: error: parameter of type '@Type(.Null)' not allowed +// tmp.zig:12:11: error: parameter of opaque type 'FooType' not allowed +// tmp.zig:17:11: error: parameter of type '@Type(.Null)' not allowed diff --git a/test/compile_errors/stage1/obj/function_prototype_with_no_body.zig b/test/compile_errors/stage1/obj/function_prototype_with_no_body.zig new file mode 100644 index 0000000000000000000000000000000000000000..07597af015434f2f6e59f4e32c831c3507dda3d4 --- /dev/null +++ b/test/compile_errors/stage1/obj/function_prototype_with_no_body.zig @@ -0,0 +1,8 @@ +fn foo() void; +export fn entry() void { + foo(); +} + +// function prototype with no body +// +// tmp.zig:1:1: error: non-extern function has no body diff --git a/test/compile_errors/stage1/obj/function_returning_opaque_type.zig b/test/compile_errors/stage1/obj/function_returning_opaque_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..956a4ed224101a22cc047f93e6455f1f2035fb59 --- /dev/null +++ b/test/compile_errors/stage1/obj/function_returning_opaque_type.zig @@ -0,0 +1,17 @@ +const FooType = opaque {}; +export fn bar() !FooType { + return error.InvalidValue; +} +export fn bav() !@TypeOf(null) { + return error.InvalidValue; +} +export fn baz() !@TypeOf(undefined) { + return error.InvalidValue; +} + +// function returning opaque type +// +// tmp.zig:2:18: error: Opaque return type 'FooType' not allowed +// tmp.zig:1:1: note: type declared here +// tmp.zig:5:18: error: Null return type '@Type(.Null)' not allowed +// tmp.zig:8:18: error: Undefined return type '@Type(.Undefined)' not allowed diff --git a/test/compile_errors/stage1/obj/function_with_ccc_indirectly_calling_async_function.zig b/test/compile_errors/stage1/obj/function_with_ccc_indirectly_calling_async_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..1ccf486be693b0e5878daa6b7472f6722e23937b --- /dev/null +++ b/test/compile_errors/stage1/obj/function_with_ccc_indirectly_calling_async_function.zig @@ -0,0 +1,16 @@ +export fn entry() void { + foo(); +} +fn foo() void { + bar(); +} +fn bar() void { + suspend {} +} + +// function with ccc indirectly calling async function +// +// tmp.zig:1:1: error: function with calling convention 'C' cannot be async +// tmp.zig:2:8: note: async function call here +// tmp.zig:5:8: note: async function call here +// tmp.zig:8:5: note: suspends here diff --git a/test/compile_errors/stage1/obj/function_with_invalid_return_type.zig b/test/compile_errors/stage1/obj/function_with_invalid_return_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..acedbac7d11effbac8d61f142c7955e44d665a90 --- /dev/null +++ b/test/compile_errors/stage1/obj/function_with_invalid_return_type.zig @@ -0,0 +1,5 @@ +export fn foo() boid {} + +// function with invalid return type +// +// tmp.zig:1:17: error: use of undeclared identifier 'boid' diff --git a/test/compile_errors/stage1/obj/function_with_non-extern_non-packed_enum_parameter.zig b/test/compile_errors/stage1/obj/function_with_non-extern_non-packed_enum_parameter.zig new file mode 100644 index 0000000000000000000000000000000000000000..9c1913305d715a84ce51ea7ef837e7a0b703acbb --- /dev/null +++ b/test/compile_errors/stage1/obj/function_with_non-extern_non-packed_enum_parameter.zig @@ -0,0 +1,6 @@ +const Foo = enum { A, B, C }; +export fn entry(foo: Foo) void { _ = foo; } + +// function with non-extern non-packed enum parameter +// +// tmp.zig:2:22: error: parameter of type 'Foo' not allowed in function with calling convention 'C' diff --git a/test/compile_errors/stage1/obj/function_with_non-extern_non-packed_struct_parameter.zig b/test/compile_errors/stage1/obj/function_with_non-extern_non-packed_struct_parameter.zig new file mode 100644 index 0000000000000000000000000000000000000000..eb2617f279205d5c1d68ad520d30999415838926 --- /dev/null +++ b/test/compile_errors/stage1/obj/function_with_non-extern_non-packed_struct_parameter.zig @@ -0,0 +1,10 @@ +const Foo = struct { + A: i32, + B: f32, + C: bool, +}; +export fn entry(foo: Foo) void { _ = foo; } + +// function with non-extern non-packed struct parameter +// +// tmp.zig:6:22: error: parameter of type 'Foo' not allowed in function with calling convention 'C' diff --git a/test/compile_errors/stage1/obj/function_with_non-extern_non-packed_union_parameter.zig b/test/compile_errors/stage1/obj/function_with_non-extern_non-packed_union_parameter.zig new file mode 100644 index 0000000000000000000000000000000000000000..662ffd349b37ca8a0be3ffc9591868895eab0660 --- /dev/null +++ b/test/compile_errors/stage1/obj/function_with_non-extern_non-packed_union_parameter.zig @@ -0,0 +1,10 @@ +const Foo = union { + A: i32, + B: f32, + C: bool, +}; +export fn entry(foo: Foo) void { _ = foo; } + +// function with non-extern non-packed union parameter +// +// tmp.zig:6:22: error: parameter of type 'Foo' not allowed in function with calling convention 'C' diff --git a/test/compile_errors/stage1/obj/generic_fn_as_parameter_without_comptime_keyword.zig b/test/compile_errors/stage1/obj/generic_fn_as_parameter_without_comptime_keyword.zig new file mode 100644 index 0000000000000000000000000000000000000000..fceea0961b35af36c85626ca9a92db0fa7d5fc33 --- /dev/null +++ b/test/compile_errors/stage1/obj/generic_fn_as_parameter_without_comptime_keyword.zig @@ -0,0 +1,9 @@ +fn f(_: fn (anytype) void) void {} +fn g(_: anytype) void {} +export fn entry() void { + f(g); +} + +// generic fn as parameter without comptime keyword +// +// tmp.zig:1:9: error: parameter of type 'fn(anytype) anytype' must be declared comptime diff --git a/test/compile_errors/stage1/obj/generic_function_call_assigned_to_incorrect_type.zig b/test/compile_errors/stage1/obj/generic_function_call_assigned_to_incorrect_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..b48d5def57d41233c1fd2620fa29006ac654954f --- /dev/null +++ b/test/compile_errors/stage1/obj/generic_function_call_assigned_to_incorrect_type.zig @@ -0,0 +1,11 @@ +pub export fn entry() void { + var res: []i32 = undefined; + res = myAlloc(i32); +} +fn myAlloc(comptime arg: type) anyerror!arg{ + unreachable; +} + +// generic function call assigned to incorrect type +// +// tmp.zig:3:18: error: expected type '[]i32', found 'anyerror!i32 diff --git a/test/compile_errors/stage1/obj/generic_function_instance_with_non-constant_expression.zig b/test/compile_errors/stage1/obj/generic_function_instance_with_non-constant_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..3698370b5755deb2aca66454d0b638c4137ce823 --- /dev/null +++ b/test/compile_errors/stage1/obj/generic_function_instance_with_non-constant_expression.zig @@ -0,0 +1,10 @@ +fn foo(comptime x: i32, y: i32) i32 { return x + y; } +fn test1(a: i32, b: i32) i32 { + return foo(a, b); +} + +export fn entry() usize { return @sizeOf(@TypeOf(test1)); } + +// generic function instance with non-constant expression +// +// tmp.zig:3:16: error: runtime value cannot be passed to comptime arg diff --git a/test/compile_errors/stage1/obj/generic_function_returning_opaque_type.zig b/test/compile_errors/stage1/obj/generic_function_returning_opaque_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..c109a5ce7cbe33c8c2281cda148d95f9d5b454cb --- /dev/null +++ b/test/compile_errors/stage1/obj/generic_function_returning_opaque_type.zig @@ -0,0 +1,23 @@ +const FooType = opaque {}; +fn generic(comptime T: type) !T { + return undefined; +} +export fn bar() void { + _ = generic(FooType); +} +export fn bav() void { + _ = generic(@TypeOf(null)); +} +export fn baz() void { + _ = generic(@TypeOf(undefined)); +} + +// generic function returning opaque type +// +// tmp.zig:6:16: error: call to generic function with Opaque return type 'FooType' not allowed +// tmp.zig:2:1: note: function declared here +// tmp.zig:1:1: note: type declared here +// tmp.zig:9:16: error: call to generic function with Null return type '@Type(.Null)' not allowed +// tmp.zig:2:1: note: function declared here +// tmp.zig:12:16: error: call to generic function with Undefined return type '@Type(.Undefined)' not allowed +// tmp.zig:2:1: note: function declared here diff --git a/test/compile_errors/stage1/obj/generic_function_where_return_type_is_self-referenced.zig b/test/compile_errors/stage1/obj/generic_function_where_return_type_is_self-referenced.zig new file mode 100644 index 0000000000000000000000000000000000000000..18237a50235955b610e99ba2d4bc5311ca54ee32 --- /dev/null +++ b/test/compile_errors/stage1/obj/generic_function_where_return_type_is_self-referenced.zig @@ -0,0 +1,13 @@ +fn Foo(comptime T: type) Foo(T) { + return struct{ x: T }; +} +export fn entry() void { + const t = Foo(u32) { + .x = 1 + }; + _ = t; +} + +// generic function where return type is self-referenced +// +// tmp.zig:1:29: error: evaluation exceeded 1000 backwards branches diff --git a/test/compile_errors/stage1/obj/global_variable_alignment_non_power_of_2.zig b/test/compile_errors/stage1/obj/global_variable_alignment_non_power_of_2.zig new file mode 100644 index 0000000000000000000000000000000000000000..a6c4ccaa98678465ba4c8c1e04f7260acc6782c7 --- /dev/null +++ b/test/compile_errors/stage1/obj/global_variable_alignment_non_power_of_2.zig @@ -0,0 +1,6 @@ +const some_data: [100]u8 align(3) = undefined; +export fn entry() usize { return @sizeOf(@TypeOf(some_data)); } + +// global variable alignment non power of 2 +// +// tmp.zig:1:32: error: alignment value 3 is not a power of 2 diff --git a/test/compile_errors/stage1/obj/global_variable_initializer_must_be_constant_expression.zig b/test/compile_errors/stage1/obj/global_variable_initializer_must_be_constant_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..1d6c20f3aff50baa252e09e458d230af44b7e2e9 --- /dev/null +++ b/test/compile_errors/stage1/obj/global_variable_initializer_must_be_constant_expression.zig @@ -0,0 +1,7 @@ +extern fn foo() i32; +const x = foo(); +export fn entry() i32 { return x; } + +// global variable initializer must be constant expression +// +// tmp.zig:2:11: error: unable to evaluate constant expression diff --git a/test/compile_errors/stage1/obj/hasDecl_with_non-container.zig b/test/compile_errors/stage1/obj/hasDecl_with_non-container.zig new file mode 100644 index 0000000000000000000000000000000000000000..50f1231997036a1c951ff4334ef05aac618c7d85 --- /dev/null +++ b/test/compile_errors/stage1/obj/hasDecl_with_non-container.zig @@ -0,0 +1,7 @@ +export fn entry() void { + _ = @hasDecl(i32, "hi"); +} + +// @hasDecl with non-container +// +// tmp.zig:2:18: error: expected struct, enum, or union; found 'i32' diff --git a/test/compile_errors/stage1/obj/if_condition_is_bool_not_int.zig b/test/compile_errors/stage1/obj/if_condition_is_bool_not_int.zig new file mode 100644 index 0000000000000000000000000000000000000000..e8b7c61417e6719137355ba5038fd8b52344d5a6 --- /dev/null +++ b/test/compile_errors/stage1/obj/if_condition_is_bool_not_int.zig @@ -0,0 +1,7 @@ +export fn f() void { + if (0) {} +} + +// if condition is bool, not int +// +// tmp.zig:2:9: error: expected type 'bool', found 'comptime_int' diff --git a/test/compile_errors/stage1/obj/ignored_assert-err-ok_return_value.zig b/test/compile_errors/stage1/obj/ignored_assert-err-ok_return_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..53fbcaa8b5b72c8ff78c546b4c1bc5babc82aeb0 --- /dev/null +++ b/test/compile_errors/stage1/obj/ignored_assert-err-ok_return_value.zig @@ -0,0 +1,8 @@ +export fn foo() void { + bar() catch unreachable; +} +fn bar() anyerror!i32 { return 0; } + +// ignored assert-err-ok return value +// +// tmp.zig:2:11: error: expression value is ignored diff --git a/test/compile_errors/stage1/obj/ignored_comptime_statement_value.zig b/test/compile_errors/stage1/obj/ignored_comptime_statement_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..80925d6c84b301c12804eb46fee6dfa3564b2f43 --- /dev/null +++ b/test/compile_errors/stage1/obj/ignored_comptime_statement_value.zig @@ -0,0 +1,7 @@ +export fn foo() void { + comptime {1;} +} + +// ignored comptime statement value +// +// tmp.zig:2:15: error: expression value is ignored diff --git a/test/compile_errors/stage1/obj/ignored_comptime_value.zig b/test/compile_errors/stage1/obj/ignored_comptime_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..375a5d242cbcfad89c65a079df1b121684d49de7 --- /dev/null +++ b/test/compile_errors/stage1/obj/ignored_comptime_value.zig @@ -0,0 +1,7 @@ +export fn foo() void { + comptime 1; +} + +// ignored comptime value +// +// tmp.zig:2:5: error: expression value is ignored diff --git a/test/compile_errors/stage1/obj/ignored_deferred_function_call.zig b/test/compile_errors/stage1/obj/ignored_deferred_function_call.zig new file mode 100644 index 0000000000000000000000000000000000000000..58b85da985ae2770669b161123178bf5329b13f5 --- /dev/null +++ b/test/compile_errors/stage1/obj/ignored_deferred_function_call.zig @@ -0,0 +1,8 @@ +export fn foo() void { + defer bar(); +} +fn bar() anyerror!i32 { return 0; } + +// ignored deferred function call +// +// tmp.zig:2:14: error: error is ignored. consider using `try`, `catch`, or `if` diff --git a/test/compile_errors/stage1/obj/ignored_deferred_statement_value.zig b/test/compile_errors/stage1/obj/ignored_deferred_statement_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..effc79b03937b6ea210dc3a8b4a941edbc6eef05 --- /dev/null +++ b/test/compile_errors/stage1/obj/ignored_deferred_statement_value.zig @@ -0,0 +1,7 @@ +export fn foo() void { + defer {1;} +} + +// ignored deferred statement value +// +// tmp.zig:2:12: error: expression value is ignored diff --git a/test/compile_errors/stage1/obj/ignored_expression_in_while_continuation.zig b/test/compile_errors/stage1/obj/ignored_expression_in_while_continuation.zig new file mode 100644 index 0000000000000000000000000000000000000000..fb205924e3b682d3b98aa53b7b8613a3c0a5724d --- /dev/null +++ b/test/compile_errors/stage1/obj/ignored_expression_in_while_continuation.zig @@ -0,0 +1,20 @@ +export fn a() void { + while (true) : (bad()) {} +} +export fn b() void { + var x: anyerror!i32 = 1234; + while (x) |_| : (bad()) {} else |_| {} +} +export fn c() void { + var x: ?i32 = 1234; + while (x) |_| : (bad()) {} +} +fn bad() anyerror!void { + return error.Bad; +} + +// ignored expression in while continuation +// +// tmp.zig:2:24: error: error is ignored. consider using `try`, `catch`, or `if` +// tmp.zig:6:25: error: error is ignored. consider using `try`, `catch`, or `if` +// tmp.zig:10:25: error: error is ignored. consider using `try`, `catch`, or `if` diff --git a/test/compile_errors/stage1/obj/ignored_return_value.zig b/test/compile_errors/stage1/obj/ignored_return_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..9c8cfa0aa428cb6b6cb153a093056c9039f20d86 --- /dev/null +++ b/test/compile_errors/stage1/obj/ignored_return_value.zig @@ -0,0 +1,8 @@ +export fn foo() void { + bar(); +} +fn bar() i32 { return 0; } + +// ignored return value +// +// tmp.zig:2:8: error: expression value is ignored diff --git a/test/compile_errors/stage1/obj/ignored_statement_value.zig b/test/compile_errors/stage1/obj/ignored_statement_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..7855cf584b7ab89bb6f36bf3c0eacfd39b231871 --- /dev/null +++ b/test/compile_errors/stage1/obj/ignored_statement_value.zig @@ -0,0 +1,7 @@ +export fn foo() void { + 1; +} + +// ignored statement value +// +// tmp.zig:2:5: error: expression value is ignored diff --git a/test/compile_errors/stage1/obj/illegal_comparison_of_types.zig b/test/compile_errors/stage1/obj/illegal_comparison_of_types.zig new file mode 100644 index 0000000000000000000000000000000000000000..462664a40094cfd0cd6e8ecdf8a1020e1af602b4 --- /dev/null +++ b/test/compile_errors/stage1/obj/illegal_comparison_of_types.zig @@ -0,0 +1,18 @@ +fn bad_eql_1(a: []u8, b: []u8) bool { + return a == b; +} +const EnumWithData = union(enum) { + One: void, + Two: i32, +}; +fn bad_eql_2(a: *const EnumWithData, b: *const EnumWithData) bool { + return a.* == b.*; +} + +export fn entry1() usize { return @sizeOf(@TypeOf(bad_eql_1)); } +export fn entry2() usize { return @sizeOf(@TypeOf(bad_eql_2)); } + +// illegal comparison of types +// +// tmp.zig:2:14: error: operator not allowed for type '[]u8' +// tmp.zig:9:16: error: operator not allowed for type 'EnumWithData' diff --git a/test/compile_errors/stage1/obj/implicit_cast_between_C_pointer_and_Zig_pointer-bad_const-align-child.zig b/test/compile_errors/stage1/obj/implicit_cast_between_C_pointer_and_Zig_pointer-bad_const-align-child.zig new file mode 100644 index 0000000000000000000000000000000000000000..1dd751f989c1e1eb08f8b903bc4205e53facad5d --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_cast_between_C_pointer_and_Zig_pointer-bad_const-align-child.zig @@ -0,0 +1,40 @@ +export fn a() void { + var x: [*c]u8 = undefined; + var y: *align(4) u8 = x; + _ = y; +} +export fn b() void { + var x: [*c]const u8 = undefined; + var y: *u8 = x; + _ = y; +} +export fn c() void { + var x: [*c]u8 = undefined; + var y: *u32 = x; + _ = y; +} +export fn d() void { + var y: *align(1) u32 = undefined; + var x: [*c]u32 = y; + _ = x; +} +export fn e() void { + var y: *const u8 = undefined; + var x: [*c]u8 = y; + _ = x; +} +export fn f() void { + var y: *u8 = undefined; + var x: [*c]u32 = y; + _ = x; +} + +// implicit cast between C pointer and Zig pointer - bad const/align/child +// +// tmp.zig:3:27: error: cast increases pointer alignment +// tmp.zig:8:18: error: cast discards const qualifier +// tmp.zig:13:19: error: expected type '*u32', found '[*c]u8' +// tmp.zig:13:19: note: pointer type child 'u8' cannot cast into pointer type child 'u32' +// tmp.zig:18:22: error: cast increases pointer alignment +// tmp.zig:23:21: error: cast discards const qualifier +// tmp.zig:28:22: error: expected type '[*c]u32', found '*u8' diff --git a/test/compile_errors/stage1/obj/implicit_cast_const_array_to_mutable_slice.zig b/test/compile_errors/stage1/obj/implicit_cast_const_array_to_mutable_slice.zig new file mode 100644 index 0000000000000000000000000000000000000000..f38c2c9fe12bc4cf2e385593d0324d39e66a5fe5 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_cast_const_array_to_mutable_slice.zig @@ -0,0 +1,10 @@ +export fn entry() void { + const buffer: [1]u8 = [_]u8{8}; + const sliceA: []u8 = &buffer; + _ = sliceA; +} + +// implicit cast const array to mutable slice +// +// tmp.zig:3:27: error: cannot cast pointer to array literal to slice type '[]u8' +// tmp.zig:3:27: note: cast discards const qualifier diff --git a/test/compile_errors/stage1/obj/implicit_cast_from_array_to_mutable_slice.zig b/test/compile_errors/stage1/obj/implicit_cast_from_array_to_mutable_slice.zig new file mode 100644 index 0000000000000000000000000000000000000000..60fc5baf1f8f04d95a9a550910c10400fe3c38ae --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_cast_from_array_to_mutable_slice.zig @@ -0,0 +1,9 @@ +var global_array: [10]i32 = undefined; +fn foo(param: []i32) void {_ = param;} +export fn entry() void { + foo(global_array); +} + +// implicit cast from array to mutable slice +// +// tmp.zig:4:9: error: expected type '[]i32', found '[10]i32' diff --git a/test/compile_errors/stage1/obj/implicit_cast_from_f64_to_f32.zig b/test/compile_errors/stage1/obj/implicit_cast_from_f64_to_f32.zig new file mode 100644 index 0000000000000000000000000000000000000000..d1d4417f34cf9c4a7a897b9c3f77567f6acf62b2 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_cast_from_f64_to_f32.zig @@ -0,0 +1,8 @@ +var x: f64 = 1.0; +var y: f32 = x; + +export fn entry() usize { return @sizeOf(@TypeOf(y)); } + +// implicit cast from f64 to f32 +// +// tmp.zig:2:14: error: expected type 'f32', found 'f64' diff --git a/test/compile_errors/stage1/obj/implicit_cast_of_error_set_not_a_subset.zig b/test/compile_errors/stage1/obj/implicit_cast_of_error_set_not_a_subset.zig new file mode 100644 index 0000000000000000000000000000000000000000..9cfce6524f68ef815ca3fe77a52047c9228f61be --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_cast_of_error_set_not_a_subset.zig @@ -0,0 +1,14 @@ +const Set1 = error{A, B}; +const Set2 = error{A, C}; +export fn entry() void { + foo(Set1.B); +} +fn foo(set1: Set1) void { + var x: Set2 = set1; + _ = x; +} + +// implicit cast of error set not a subset +// +// tmp.zig:7:19: error: expected type 'Set2', found 'Set1' +// tmp.zig:1:23: note: 'error.B' not a member of destination error set diff --git a/test/compile_errors/stage1/obj/implicit_casting_C_pointers_which_would_mess_up_null_semantics.zig b/test/compile_errors/stage1/obj/implicit_casting_C_pointers_which_would_mess_up_null_semantics.zig new file mode 100644 index 0000000000000000000000000000000000000000..cdc35e39637e6db3a2034e2540f011efd7525c81 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_casting_C_pointers_which_would_mess_up_null_semantics.zig @@ -0,0 +1,24 @@ +export fn entry() void { + var slice: []const u8 = "aoeu"; + const opt_many_ptr: [*]const u8 = slice.ptr; + var ptr_opt_many_ptr = &opt_many_ptr; + var c_ptr: [*c]const [*c]const u8 = ptr_opt_many_ptr; + ptr_opt_many_ptr = c_ptr; +} +export fn entry2() void { + var buf: [4]u8 = "aoeu".*; + var slice: []u8 = &buf; + var opt_many_ptr: [*]u8 = slice.ptr; + var ptr_opt_many_ptr = &opt_many_ptr; + var c_ptr: [*c][*c]const u8 = ptr_opt_many_ptr; + _ = c_ptr; +} + +// implicit casting C pointers which would mess up null semantics +// +// tmp.zig:6:24: error: expected type '*const [*]const u8', found '[*c]const [*c]const u8' +// tmp.zig:6:24: note: pointer type child '[*c]const u8' cannot cast into pointer type child '[*]const u8' +// tmp.zig:6:24: note: '[*c]const u8' could have null values which are illegal in type '[*]const u8' +// tmp.zig:13:35: error: expected type '[*c][*c]const u8', found '*[*]u8' +// tmp.zig:13:35: note: pointer type child '[*]u8' cannot cast into pointer type child '[*c]const u8' +// tmp.zig:13:35: note: mutable '[*c]const u8' allows illegal null values stored to type '[*]u8' diff --git a/test/compile_errors/stage1/obj/implicit_casting_null_c_pointer_to_zig_pointer.zig b/test/compile_errors/stage1/obj/implicit_casting_null_c_pointer_to_zig_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..29dd6d06f9a1f1aa4e6051da3c9cdbc655bd5f1b --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_casting_null_c_pointer_to_zig_pointer.zig @@ -0,0 +1,9 @@ +comptime { + var c_ptr: [*c]u8 = 0; + var zig_ptr: *u8 = c_ptr; + _ = zig_ptr; +} + +// implicit casting null c pointer to zig pointer +// +// tmp.zig:3:24: error: null pointer casted to type '*u8' diff --git a/test/compile_errors/stage1/obj/implicit_casting_too_big_integers_to_C_pointers.zig b/test/compile_errors/stage1/obj/implicit_casting_too_big_integers_to_C_pointers.zig new file mode 100644 index 0000000000000000000000000000000000000000..3deb817b7669cca605f45ca8fb0f43fc5051218e --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_casting_too_big_integers_to_C_pointers.zig @@ -0,0 +1,14 @@ +export fn a() void { + var ptr: [*c]u8 = (1 << 64) + 1; + _ = ptr; +} +export fn b() void { + var x: u65 = 0x1234; + var ptr: [*c]u8 = x; + _ = ptr; +} + +// implicit casting too big integers to C pointers +// +// tmp.zig:2:33: error: integer value 18446744073709551617 cannot be coerced to type 'usize' +// tmp.zig:7:23: error: integer type 'u65' too big for implicit @intToPtr to type '[*c]u8' diff --git a/test/compile_errors/stage1/obj/implicit_casting_undefined_c_pointer_to_zig_pointer.zig b/test/compile_errors/stage1/obj/implicit_casting_undefined_c_pointer_to_zig_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..4c19f57442482cda74e40fd58161c0dbf2f3d189 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_casting_undefined_c_pointer_to_zig_pointer.zig @@ -0,0 +1,9 @@ +comptime { + var c_ptr: [*c]u8 = undefined; + var zig_ptr: *u8 = c_ptr; + _ = zig_ptr; +} + +// implicit casting undefined c pointer to zig pointer +// +// tmp.zig:3:24: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-block_expr.zig b/test/compile_errors/stage1/obj/implicit_semicolon-block_expr.zig new file mode 100644 index 0000000000000000000000000000000000000000..bacd484c0c3c7ff514beafc6c36775df3dd5410d --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-block_expr.zig @@ -0,0 +1,10 @@ +export fn entry() void { + _ = {}; + var good = {}; + _ = {} + var bad = {}; +} + +// implicit semicolon - block expr +// +// tmp.zig:4:11: error: expected ';' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-block_statement.zig b/test/compile_errors/stage1/obj/implicit_semicolon-block_statement.zig new file mode 100644 index 0000000000000000000000000000000000000000..dca8998ee6d557e2847fd2095f2fd6990163e60e --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-block_statement.zig @@ -0,0 +1,10 @@ +export fn entry() void { + {} + var good = {}; + ({}) + var bad = {}; +} + +// implicit semicolon - block statement +// +// tmp.zig:4:9: error: expected ';' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-comptime_expression.zig b/test/compile_errors/stage1/obj/implicit_semicolon-comptime_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..a3f679a59acd9e46c6602276a8db95b07f1cafb3 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-comptime_expression.zig @@ -0,0 +1,10 @@ +export fn entry() void { + _ = comptime {}; + var good = {}; + _ = comptime {} + var bad = {}; +} + +// implicit semicolon - comptime expression +// +// tmp.zig:4:20: error: expected ';' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-comptime_statement.zig b/test/compile_errors/stage1/obj/implicit_semicolon-comptime_statement.zig new file mode 100644 index 0000000000000000000000000000000000000000..299b081e4bce24ad7c9ebf0921321ec9e599ce22 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-comptime_statement.zig @@ -0,0 +1,10 @@ +export fn entry() void { + comptime {} + var good = {}; + comptime ({}) + var bad = {}; +} + +// implicit semicolon - comptime statement +// +// tmp.zig:4:18: error: expected ';' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-defer.zig b/test/compile_errors/stage1/obj/implicit_semicolon-defer.zig new file mode 100644 index 0000000000000000000000000000000000000000..7e58d930d626cdab1d6f2b496236a40bffe95323 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-defer.zig @@ -0,0 +1,10 @@ +export fn entry() void { + defer {} + var good = {}; + defer ({}) + var bad = {}; +} + +// implicit semicolon - defer +// +// tmp.zig:4:15: error: expected ';' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-for_expression.zig b/test/compile_errors/stage1/obj/implicit_semicolon-for_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..3e332ef189566683e1d09a1469c668bc4e7eaecc --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-for_expression.zig @@ -0,0 +1,10 @@ +export fn entry() void { + _ = for(foo()) |_| {}; + var good = {}; + _ = for(foo()) |_| {} + var bad = {}; +} + +// implicit semicolon - for expression +// +// tmp.zig:4:26: error: expected ';' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-for_statement.zig b/test/compile_errors/stage1/obj/implicit_semicolon-for_statement.zig new file mode 100644 index 0000000000000000000000000000000000000000..092c28889fa1ab396e1a8c713257bc10b48d2a62 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-for_statement.zig @@ -0,0 +1,10 @@ +export fn entry() void { + for(foo()) |_| {} + var good = {}; + for(foo()) |_| ({}) + var bad = {}; +} + +// implicit semicolon - for statement +// +// tmp.zig:4:24: error: expected ';' or 'else' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-if-else-if-else_expression.zig b/test/compile_errors/stage1/obj/implicit_semicolon-if-else-if-else_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..fd55529a8f41ea201101a4633278eb28ff03e6fe --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-if-else-if-else_expression.zig @@ -0,0 +1,10 @@ +export fn entry() void { + _ = if(true) {} else if(true) {} else {}; + var good = {}; + _ = if(true) {} else if(true) {} else {} + var bad = {}; +} + +// implicit semicolon - if-else-if-else expression +// +// tmp.zig:4:45: error: expected ';' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-if-else-if-else_statement.zig b/test/compile_errors/stage1/obj/implicit_semicolon-if-else-if-else_statement.zig new file mode 100644 index 0000000000000000000000000000000000000000..3d59e38aa92549a66b70b0cd38a75b32f318c720 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-if-else-if-else_statement.zig @@ -0,0 +1,10 @@ +export fn entry() void { + if(true) {} else if(true) {} else {} + var good = {}; + if(true) ({}) else if(true) ({}) else ({}) + var bad = {}; +} + +// implicit semicolon - if-else-if-else statement +// +// tmp.zig:4:47: error: expected ';' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-if-else-if_expression.zig b/test/compile_errors/stage1/obj/implicit_semicolon-if-else-if_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..2caaad52b86e44205a57a02122f3657807ca5a04 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-if-else-if_expression.zig @@ -0,0 +1,10 @@ +export fn entry() void { + _ = if(true) {} else if(true) {}; + var good = {}; + _ = if(true) {} else if(true) {} + var bad = {}; +} + +// implicit semicolon - if-else-if expression +// +// tmp.zig:4:37: error: expected ';' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-if-else-if_statement.zig b/test/compile_errors/stage1/obj/implicit_semicolon-if-else-if_statement.zig new file mode 100644 index 0000000000000000000000000000000000000000..263aa36da30217d904eb834c84903e429abf5d2a --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-if-else-if_statement.zig @@ -0,0 +1,10 @@ +export fn entry() void { + if(true) {} else if(true) {} + var good = {}; + if(true) ({}) else if(true) ({}) + var bad = {}; +} + +// implicit semicolon - if-else-if statement +// +// tmp.zig:4:37: error: expected ';' or 'else' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-if-else_expression.zig b/test/compile_errors/stage1/obj/implicit_semicolon-if-else_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..12d993f6a724cdde93941662f0df7b83d01be650 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-if-else_expression.zig @@ -0,0 +1,10 @@ +export fn entry() void { + _ = if(true) {} else {}; + var good = {}; + _ = if(true) {} else {} + var bad = {}; +} + +// implicit semicolon - if-else expression +// +// tmp.zig:4:28: error: expected ';' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-if-else_statement.zig b/test/compile_errors/stage1/obj/implicit_semicolon-if-else_statement.zig new file mode 100644 index 0000000000000000000000000000000000000000..401fc46a51911d8ca89022bbc32193168af39f35 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-if-else_statement.zig @@ -0,0 +1,10 @@ +export fn entry() void { + if(true) {} else {} + var good = {}; + if(true) ({}) else ({}) + var bad = {}; +} + +// implicit semicolon - if-else statement +// +// tmp.zig:4:28: error: expected ';' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-if_expression.zig b/test/compile_errors/stage1/obj/implicit_semicolon-if_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..b3a81e9d3679a46348ef3a9596b766406d9b2180 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-if_expression.zig @@ -0,0 +1,10 @@ +export fn entry() void { + _ = if(true) {}; + var good = {}; + _ = if(true) {} + var bad = {}; +} + +// implicit semicolon - if expression +// +// tmp.zig:4:20: error: expected ';' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-if_statement.zig b/test/compile_errors/stage1/obj/implicit_semicolon-if_statement.zig new file mode 100644 index 0000000000000000000000000000000000000000..e543925d781cf6192291d13c6f9bba32fc8a9956 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-if_statement.zig @@ -0,0 +1,10 @@ +export fn entry() void { + if(true) {} + var good = {}; + if(true) ({}) + var bad = {}; +} + +// implicit semicolon - if statement +// +// tmp.zig:4:18: error: expected ';' or 'else' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-test_expression.zig b/test/compile_errors/stage1/obj/implicit_semicolon-test_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..1702bec0488bfaa015e9b2d091147b0a18214f96 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-test_expression.zig @@ -0,0 +1,10 @@ +export fn entry() void { + _ = if (foo()) |_| {}; + var good = {}; + _ = if (foo()) |_| {} + var bad = {}; +} + +// implicit semicolon - test expression +// +// tmp.zig:4:26: error: expected ';' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-test_statement.zig b/test/compile_errors/stage1/obj/implicit_semicolon-test_statement.zig new file mode 100644 index 0000000000000000000000000000000000000000..8715ca9ac05a2337b6beead221bff062c5457aae --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-test_statement.zig @@ -0,0 +1,10 @@ +export fn entry() void { + if (foo()) |_| {} + var good = {}; + if (foo()) |_| ({}) + var bad = {}; +} + +// implicit semicolon - test statement +// +// tmp.zig:4:24: error: expected ';' or 'else' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-while-continue_expression.zig b/test/compile_errors/stage1/obj/implicit_semicolon-while-continue_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..b1a7bdbab82bc0daaa813141cf059484075d9a59 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-while-continue_expression.zig @@ -0,0 +1,10 @@ +export fn entry() void { + _ = while(true):({}) {}; + var good = {}; + _ = while(true):({}) {} + var bad = {}; +} + +// implicit semicolon - while-continue expression +// +// tmp.zig:4:28: error: expected ';' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-while-continue_statement.zig b/test/compile_errors/stage1/obj/implicit_semicolon-while-continue_statement.zig new file mode 100644 index 0000000000000000000000000000000000000000..601f1f03184d48e29f0f51b7d2324403f723f0c6 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-while-continue_statement.zig @@ -0,0 +1,10 @@ +export fn entry() void { + while(true):({}) {} + var good = {}; + while(true):({}) ({}) + var bad = {}; +} + +// implicit semicolon - while-continue statement +// +// tmp.zig:4:26: error: expected ';' or 'else' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-while_expression.zig b/test/compile_errors/stage1/obj/implicit_semicolon-while_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..9580889bd772056cb3904f95913e9f66646b159c --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-while_expression.zig @@ -0,0 +1,10 @@ +export fn entry() void { + _ = while(true) {}; + var good = {}; + _ = while(true) {} + var bad = {}; +} + +// implicit semicolon - while expression +// +// tmp.zig:4:23: error: expected ';' after statement diff --git a/test/compile_errors/stage1/obj/implicit_semicolon-while_statement.zig b/test/compile_errors/stage1/obj/implicit_semicolon-while_statement.zig new file mode 100644 index 0000000000000000000000000000000000000000..ab64dd991dcec7704df698c6a90858facc66b648 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicit_semicolon-while_statement.zig @@ -0,0 +1,10 @@ +export fn entry() void { + while(true) {} + var good = {}; + while(true) 1 + var bad = {}; +} + +// implicit semicolon - while statement +// +// tmp.zig:4:18: error: expected ';' or 'else' after statement diff --git a/test/compile_errors/stage1/obj/implicitly_casting_enum_to_tag_type.zig b/test/compile_errors/stage1/obj/implicitly_casting_enum_to_tag_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..26806a39142606a8b4e63846c44a86dccfae5c37 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicitly_casting_enum_to_tag_type.zig @@ -0,0 +1,15 @@ +const Small = enum(u2) { + One, + Two, + Three, + Four, +}; + +export fn entry() void { + var x: u2 = Small.Two; + _ = x; +} + +// implicitly casting enum to tag type +// +// tmp.zig:9:22: error: expected type 'u2', found 'Small' diff --git a/test/compile_errors/stage1/obj/implicitly_increasing_pointer_alignment.zig b/test/compile_errors/stage1/obj/implicitly_increasing_pointer_alignment.zig new file mode 100644 index 0000000000000000000000000000000000000000..8f743a3b59901ee738e49db2702a2622417d7b32 --- /dev/null +++ b/test/compile_errors/stage1/obj/implicitly_increasing_pointer_alignment.zig @@ -0,0 +1,17 @@ +const Foo = packed struct { + a: u8, + b: u32, +}; + +export fn entry() void { + var foo = Foo { .a = 1, .b = 10 }; + bar(&foo.b); +} + +fn bar(x: *u32) void { + x.* += 1; +} + +// implicitly increasing pointer alignment +// +// tmp.zig:8:13: error: expected type '*u32', found '*align(1) u32' diff --git a/test/compile_errors/stage1/obj/implicitly_increasing_slice_alignment.zig b/test/compile_errors/stage1/obj/implicitly_increasing_slice_alignment.zig new file mode 100644 index 0000000000000000000000000000000000000000..c1d4ec2a0fdbaa9ffe04ad0900d94bdf681dad1e --- /dev/null +++ b/test/compile_errors/stage1/obj/implicitly_increasing_slice_alignment.zig @@ -0,0 +1,20 @@ +const Foo = packed struct { + a: u8, + b: u32, +}; + +export fn entry() void { + var foo = Foo { .a = 1, .b = 10 }; + foo.b += 1; + bar(@as(*[1]u32, &foo.b)[0..]); +} + +fn bar(x: []u32) void { + x[0] += 1; +} + +// implicitly increasing slice alignment +// +// tmp.zig:9:26: error: cast increases pointer alignment +// tmp.zig:9:26: note: '*align(1) u32' has alignment 1 +// tmp.zig:9:26: note: '*[1]u32' has alignment 4 diff --git a/test/compile_errors/stage1/obj/import_outside_package_path.zig b/test/compile_errors/stage1/obj/import_outside_package_path.zig new file mode 100644 index 0000000000000000000000000000000000000000..843de67b63ac33687f5905d397dfaec7e29b325e --- /dev/null +++ b/test/compile_errors/stage1/obj/import_outside_package_path.zig @@ -0,0 +1,7 @@ +comptime{ + _ = @import("../a.zig"); +} + +// import outside package path +// +// tmp.zig:2:9: error: import of file outside package path: '../a.zig' diff --git a/test/compile_errors/stage1/obj/incorrect_return_type.zig b/test/compile_errors/stage1/obj/incorrect_return_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..86c5f23dc35eb296018a300294b87ec27f26fe0e --- /dev/null +++ b/test/compile_errors/stage1/obj/incorrect_return_type.zig @@ -0,0 +1,19 @@ + pub export fn entry() void{ + _ = foo(); + } + const A = struct { + a: u32, + }; + fn foo() A { + return bar(); + } + const B = struct { + a: u32, + }; + fn bar() B { + unreachable; + } + +// incorrect return type +// +// tmp.zig:8:16: error: expected type 'A', found 'B' diff --git a/test/compile_errors/stage1/obj/increase_pointer_alignment_in_ptrCast.zig b/test/compile_errors/stage1/obj/increase_pointer_alignment_in_ptrCast.zig new file mode 100644 index 0000000000000000000000000000000000000000..01d8ac821ef9cf8985bf19602bd4a2d12fba8e39 --- /dev/null +++ b/test/compile_errors/stage1/obj/increase_pointer_alignment_in_ptrCast.zig @@ -0,0 +1,11 @@ +export fn entry() u32 { + var bytes: [4]u8 = [_]u8{0x01, 0x02, 0x03, 0x04}; + const ptr = @ptrCast(*u32, &bytes[0]); + return ptr.*; +} + +// increase pointer alignment in @ptrCast +// +// tmp.zig:3:17: error: cast increases pointer alignment +// tmp.zig:3:38: note: '*u8' has alignment 1 +// tmp.zig:3:26: note: '*u32' has alignment 4 diff --git a/test/compile_errors/stage1/obj/indexing_a_undefined_slice_at_comptime.zig b/test/compile_errors/stage1/obj/indexing_a_undefined_slice_at_comptime.zig new file mode 100644 index 0000000000000000000000000000000000000000..4653d8668ebbaa068c9689af438a37f0e06a0b83 --- /dev/null +++ b/test/compile_errors/stage1/obj/indexing_a_undefined_slice_at_comptime.zig @@ -0,0 +1,8 @@ +comptime { + var slice: []u8 = undefined; + slice[0] = 2; +} + +// indexing a undefined slice at comptime +// +// tmp.zig:3:10: error: index 0 outside slice of size 0 diff --git a/test/compile_errors/stage1/obj/indexing_an_array_of_size_zero.zig b/test/compile_errors/stage1/obj/indexing_an_array_of_size_zero.zig new file mode 100644 index 0000000000000000000000000000000000000000..9066985de54beaa4957abaf2a2673ecbb124fb6a --- /dev/null +++ b/test/compile_errors/stage1/obj/indexing_an_array_of_size_zero.zig @@ -0,0 +1,9 @@ +const array = [_]u8{}; +export fn foo() void { + const pointer = &array[0]; + _ = pointer; +} + +// indexing an array of size zero +// +// tmp.zig:3:27: error: accessing a zero length array is not allowed diff --git a/test/compile_errors/stage1/obj/indexing_an_array_of_size_zero_with_runtime_index.zig b/test/compile_errors/stage1/obj/indexing_an_array_of_size_zero_with_runtime_index.zig new file mode 100644 index 0000000000000000000000000000000000000000..c5f3acb3cc8ce81843ca622cd7a66318fa7690c4 --- /dev/null +++ b/test/compile_errors/stage1/obj/indexing_an_array_of_size_zero_with_runtime_index.zig @@ -0,0 +1,10 @@ +const array = [_]u8{}; +export fn foo() void { + var index: usize = 0; + const pointer = &array[index]; + _ = pointer; +} + +// indexing an array of size zero with runtime index +// +// tmp.zig:4:27: error: accessing a zero length array is not allowed diff --git a/test/compile_errors/stage1/obj/indexing_single-item_pointer.zig b/test/compile_errors/stage1/obj/indexing_single-item_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..e228083964ea0db2596ce3977932048ac975274c --- /dev/null +++ b/test/compile_errors/stage1/obj/indexing_single-item_pointer.zig @@ -0,0 +1,7 @@ +export fn entry(ptr: *i32) i32 { + return ptr[1]; +} + +// indexing single-item pointer +// +// tmp.zig:2:15: error: index of single-item pointer diff --git a/test/compile_errors/stage1/obj/indirect_recursion_of_async_functions_detected.zig b/test/compile_errors/stage1/obj/indirect_recursion_of_async_functions_detected.zig new file mode 100644 index 0000000000000000000000000000000000000000..5765f7aae194e6e19d387419553df677d2b98dbc --- /dev/null +++ b/test/compile_errors/stage1/obj/indirect_recursion_of_async_functions_detected.zig @@ -0,0 +1,34 @@ +var frame: ?anyframe = null; + +export fn a() void { + _ = async rangeSum(10); + while (frame) |f| resume f; +} + +fn rangeSum(x: i32) i32 { + suspend { + frame = @frame(); + } + frame = null; + + if (x == 0) return 0; + var child = rangeSumIndirect(x - 1); + return child + 1; +} + +fn rangeSumIndirect(x: i32) i32 { + suspend { + frame = @frame(); + } + frame = null; + + if (x == 0) return 0; + var child = rangeSum(x - 1); + return child + 1; +} + +// indirect recursion of async functions detected +// +// tmp.zig:8:1: error: '@Frame(rangeSum)' depends on itself +// tmp.zig:15:33: note: when analyzing type '@Frame(rangeSum)' here +// tmp.zig:26:25: note: when analyzing type '@Frame(rangeSumIndirect)' here diff --git a/test/compile_errors/stage1/obj/indirect_struct_loop.zig b/test/compile_errors/stage1/obj/indirect_struct_loop.zig new file mode 100644 index 0000000000000000000000000000000000000000..903a1bda39a1a4b220eaca6b1a5ab75feaf96b22 --- /dev/null +++ b/test/compile_errors/stage1/obj/indirect_struct_loop.zig @@ -0,0 +1,8 @@ +const A = struct { b : B, }; +const B = struct { c : C, }; +const C = struct { a : A, }; +export fn entry() usize { return @sizeOf(A); } + +// indirect struct loop +// +// tmp.zig:1:11: error: struct 'A' depends on itself diff --git a/test/compile_errors/stage1/obj/inferred_array_size_invalid_here.zig b/test/compile_errors/stage1/obj/inferred_array_size_invalid_here.zig new file mode 100644 index 0000000000000000000000000000000000000000..a45b6aa027e77018887ec884a623a44e6850b98e --- /dev/null +++ b/test/compile_errors/stage1/obj/inferred_array_size_invalid_here.zig @@ -0,0 +1,14 @@ +export fn entry() void { + const x = [_]u8; + _ = x; +} +export fn entry2() void { + const S = struct { a: *const [_]u8 }; + var a = .{ S{} }; + _ = a; +} + +// inferred array size invalid here +// +// tmp.zig:2:16: error: unable to infer array size +// tmp.zig:6:35: error: unable to infer array size diff --git a/test/compile_errors/stage1/obj/inferring_error_set_of_function_pointer.zig b/test/compile_errors/stage1/obj/inferring_error_set_of_function_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..ead5afd248fee072556e965e4d4640ec21f28e9d --- /dev/null +++ b/test/compile_errors/stage1/obj/inferring_error_set_of_function_pointer.zig @@ -0,0 +1,7 @@ +comptime { + const z: ?fn()!void = null; +} + +// inferring error set of function pointer +// +// tmp.zig:2:19: error: function prototype may not have inferred error set diff --git a/test/compile_errors/stage1/obj/initializing_array_with_struct_syntax.zig b/test/compile_errors/stage1/obj/initializing_array_with_struct_syntax.zig new file mode 100644 index 0000000000000000000000000000000000000000..15412ac5ab5deb5fa0a7391555b46cfec72fbc38 --- /dev/null +++ b/test/compile_errors/stage1/obj/initializing_array_with_struct_syntax.zig @@ -0,0 +1,8 @@ +export fn entry() void { + const x = [_]u8{ .y = 2 }; + _ = x; +} + +// initializing array with struct syntax +// +// tmp.zig:2:15: error: initializing array with struct syntax diff --git a/test/compile_errors/stage1/obj/instantiating_an_undefined_value_for_an_invalid_struct_that_contains_itself.zig b/test/compile_errors/stage1/obj/instantiating_an_undefined_value_for_an_invalid_struct_that_contains_itself.zig new file mode 100644 index 0000000000000000000000000000000000000000..c39908c9b58aa265b7ea8da0b12436f6a5045842 --- /dev/null +++ b/test/compile_errors/stage1/obj/instantiating_an_undefined_value_for_an_invalid_struct_that_contains_itself.zig @@ -0,0 +1,13 @@ +const Foo = struct { + x: Foo, +}; + +var foo: Foo = undefined; + +export fn entry() usize { + return @sizeOf(@TypeOf(foo.x)); +} + +// instantiating an undefined value for an invalid struct that contains itself +// +// tmp.zig:1:13: error: struct 'Foo' depends on itself diff --git a/test/compile_errors/stage1/obj/intToPtr_with_misaligned_address.zig b/test/compile_errors/stage1/obj/intToPtr_with_misaligned_address.zig new file mode 100644 index 0000000000000000000000000000000000000000..a04f318f0c62459fff074f5e96a9c2f3a71d185d --- /dev/null +++ b/test/compile_errors/stage1/obj/intToPtr_with_misaligned_address.zig @@ -0,0 +1,8 @@ +pub fn main() void { + var y = @intToPtr([*]align(4) u8, 5); + _ = y; +} + +// intToPtr with misaligned address +// +// tmp.zig:2:13: error: pointer type '[*]align(4) u8' requires aligned address diff --git a/test/compile_errors/stage1/obj/int_to_err_global_invalid_number.zig b/test/compile_errors/stage1/obj/int_to_err_global_invalid_number.zig new file mode 100644 index 0000000000000000000000000000000000000000..180da60ab2f1091bb71e1e8fd77db20fe48fcc2f --- /dev/null +++ b/test/compile_errors/stage1/obj/int_to_err_global_invalid_number.zig @@ -0,0 +1,13 @@ +const Set1 = error{ + A, + B, +}; +comptime { + var x: u16 = 3; + var y = @intToError(x); + _ = y; +} + +// int to err global invalid number +// +// tmp.zig:7:13: error: integer value 3 represents no error diff --git a/test/compile_errors/stage1/obj/int_to_err_non_global_invalid_number.zig b/test/compile_errors/stage1/obj/int_to_err_non_global_invalid_number.zig new file mode 100644 index 0000000000000000000000000000000000000000..a6627891d08729ec943a0717047abfd9310d2ef5 --- /dev/null +++ b/test/compile_errors/stage1/obj/int_to_err_non_global_invalid_number.zig @@ -0,0 +1,17 @@ +const Set1 = error{ + A, + B, +}; +const Set2 = error{ + A, + C, +}; +comptime { + var x = @errorToInt(Set1.B); + var y = @errSetCast(Set2, @intToError(x)); + _ = y; +} + +// int to err non global invalid number +// +// tmp.zig:11:13: error: error.B not a member of error set 'Set2' diff --git a/test/compile_errors/stage1/obj/int_to_ptr_of_0_bits.zig b/test/compile_errors/stage1/obj/int_to_ptr_of_0_bits.zig new file mode 100644 index 0000000000000000000000000000000000000000..7047600c1b3707fdf2f50634b9770cae0595b9fc --- /dev/null +++ b/test/compile_errors/stage1/obj/int_to_ptr_of_0_bits.zig @@ -0,0 +1,9 @@ +export fn foo() void { + var x: usize = 0x1000; + var y: *void = @intToPtr(*void, x); + _ = y; +} + +// int to ptr of 0 bits +// +// tmp.zig:3:30: error: type '*void' has 0 bits and cannot store information diff --git a/test/compile_errors/stage1/obj/integer_cast_truncates_bits.zig b/test/compile_errors/stage1/obj/integer_cast_truncates_bits.zig new file mode 100644 index 0000000000000000000000000000000000000000..a5c803615224f2aab15d42993e45677212a57df1 --- /dev/null +++ b/test/compile_errors/stage1/obj/integer_cast_truncates_bits.zig @@ -0,0 +1,29 @@ +export fn entry1() void { + const spartan_count: u16 = 300; + const byte = @intCast(u8, spartan_count); + _ = byte; +} +export fn entry2() void { + const spartan_count: u16 = 300; + const byte: u8 = spartan_count; + _ = byte; +} +export fn entry3() void { + var spartan_count: u16 = 300; + var byte: u8 = spartan_count; + _ = byte; +} +export fn entry4() void { + var signed: i8 = -1; + var unsigned: u64 = signed; + _ = unsigned; +} + +// integer cast truncates bits +// +// tmp.zig:3:18: error: cast from 'u16' to 'u8' truncates bits +// tmp.zig:8:22: error: integer value 300 cannot be coerced to type 'u8' +// tmp.zig:13:20: error: expected type 'u8', found 'u16' +// tmp.zig:13:20: note: unsigned 8-bit int cannot represent all possible unsigned 16-bit values +// tmp.zig:18:25: error: expected type 'u64', found 'i8' +// tmp.zig:18:25: note: unsigned 64-bit int cannot represent all possible signed 8-bit values diff --git a/test/compile_errors/stage1/obj/integer_overflow_error.zig b/test/compile_errors/stage1/obj/integer_overflow_error.zig new file mode 100644 index 0000000000000000000000000000000000000000..568cc5034be89b86c36ab82f66c5e5b70a609d43 --- /dev/null +++ b/test/compile_errors/stage1/obj/integer_overflow_error.zig @@ -0,0 +1,6 @@ +const x : u8 = 300; +export fn entry() usize { return @sizeOf(@TypeOf(x)); } + +// integer overflow error +// +// tmp.zig:1:16: error: integer value 300 cannot be coerced to type 'u8' diff --git a/test/compile_errors/stage1/obj/integer_underflow_error.zig b/test/compile_errors/stage1/obj/integer_underflow_error.zig new file mode 100644 index 0000000000000000000000000000000000000000..01171589d9e0dc0dc89e835952757b98f0bc8df3 --- /dev/null +++ b/test/compile_errors/stage1/obj/integer_underflow_error.zig @@ -0,0 +1,7 @@ +export fn entry() void { + _ = @intToPtr(*anyopaque, ~@as(usize, @import("std").math.maxInt(usize)) - 1); +} + +// integer underflow error +// +// :2:78: error: operation caused overflow diff --git a/test/compile_errors/stage1/obj/invalid_break_expression.zig b/test/compile_errors/stage1/obj/invalid_break_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..b6d27d6ea59156b746b2de628902609e2ba630fb --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_break_expression.zig @@ -0,0 +1,7 @@ +export fn f() void { + break; +} + +// invalid break expression +// +// tmp.zig:2:5: error: break expression outside loop diff --git a/test/compile_errors/stage1/obj/invalid_builtin_fn.zig b/test/compile_errors/stage1/obj/invalid_builtin_fn.zig new file mode 100644 index 0000000000000000000000000000000000000000..e10baf5965de149b18dafa3af9ad62288cac0a2a --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_builtin_fn.zig @@ -0,0 +1,7 @@ +fn f() @bogus(foo) { +} +export fn entry() void { _ = f(); } + +// invalid builtin fn +// +// tmp.zig:1:8: error: invalid builtin function: '@bogus' diff --git a/test/compile_errors/stage1/obj/invalid_cast_from_integral_type_to_enum.zig b/test/compile_errors/stage1/obj/invalid_cast_from_integral_type_to_enum.zig new file mode 100644 index 0000000000000000000000000000000000000000..476a4929ef296b7b6fc38e483d53b6d6654aa6d6 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_cast_from_integral_type_to_enum.zig @@ -0,0 +1,15 @@ +const E = enum(usize) { One, Two }; + +export fn entry() void { + foo(1); +} + +fn foo(x: usize) void { + switch (x) { + E.One => {}, + } +} + +// invalid cast from integral type to enum +// +// tmp.zig:9:10: error: expected type 'usize', found 'E' diff --git a/test/compile_errors/stage1/obj/invalid_comparison_for_function_pointers.zig b/test/compile_errors/stage1/obj/invalid_comparison_for_function_pointers.zig new file mode 100644 index 0000000000000000000000000000000000000000..f7827ed0e9461ff16ef8b4409cce10acc0877077 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_comparison_for_function_pointers.zig @@ -0,0 +1,8 @@ +fn foo() void {} +const invalid = foo > foo; + +export fn entry() usize { return @sizeOf(@TypeOf(invalid)); } + +// invalid comparison for function pointers +// +// tmp.zig:2:21: error: operator not allowed for type 'fn() void' diff --git a/test/compile_errors/stage1/obj/invalid_continue_expression.zig b/test/compile_errors/stage1/obj/invalid_continue_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..9bd40c516a7c1f7ef9187a0fa58992d8573b5d55 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_continue_expression.zig @@ -0,0 +1,7 @@ +export fn f() void { + continue; +} + +// invalid continue expression +// +// tmp.zig:2:5: error: continue expression outside loop diff --git a/test/compile_errors/stage1/obj/invalid_deref_on_switch_target.zig b/test/compile_errors/stage1/obj/invalid_deref_on_switch_target.zig new file mode 100644 index 0000000000000000000000000000000000000000..47dc0a52c1e39969e6192cba5778ff838d7a4e22 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_deref_on_switch_target.zig @@ -0,0 +1,15 @@ +comptime { + var tile = Tile.Empty; + switch (tile.*) { + Tile.Empty => {}, + Tile.Filled => {}, + } +} +const Tile = enum { + Empty, + Filled, +}; + +// invalid deref on switch target +// +// tmp.zig:3:17: error: attempt to dereference non-pointer type 'Tile' diff --git a/test/compile_errors/stage1/obj/invalid_empty_unicode_escape.zig b/test/compile_errors/stage1/obj/invalid_empty_unicode_escape.zig new file mode 100644 index 0000000000000000000000000000000000000000..d8853110a45a2101995809e5b904b4592fe7ed63 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_empty_unicode_escape.zig @@ -0,0 +1,7 @@ +export fn entry() void { + const a = '\u{}'; +} + +// invalid empty unicode escape +// +// tmp.zig:2:19: error: empty unicode escape sequence diff --git a/test/compile_errors/stage1/obj/invalid_exponent_in_float_literal-1.zig b/test/compile_errors/stage1/obj/invalid_exponent_in_float_literal-1.zig new file mode 100644 index 0000000000000000000000000000000000000000..4f13de2a6287d5e8fe8ade3f6a8ec3010a292500 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_exponent_in_float_literal-1.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: f128 = 0x1.0p1ab1; + _ = bad; +} + +// invalid exponent in float literal - 1 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:28: note: invalid byte: 'a' diff --git a/test/compile_errors/stage1/obj/invalid_exponent_in_float_literal-2.zig b/test/compile_errors/stage1/obj/invalid_exponent_in_float_literal-2.zig new file mode 100644 index 0000000000000000000000000000000000000000..f612d8c510a7f5a9ebd9d490f8687e9ca6960441 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_exponent_in_float_literal-2.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: f128 = 0x1.0p50F; + _ = bad; +} + +// invalid exponent in float literal - 2 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:29: note: invalid byte: 'F' diff --git a/test/compile_errors/stage1/obj/invalid_field_access_in_comptime.zig b/test/compile_errors/stage1/obj/invalid_field_access_in_comptime.zig new file mode 100644 index 0000000000000000000000000000000000000000..e8395b5e7a03fceee8cf5c352aeebf9d038ebb5c --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_field_access_in_comptime.zig @@ -0,0 +1,5 @@ +comptime { var x = doesnt_exist.whatever; _ = x; } + +// invalid field access in comptime +// +// tmp.zig:1:20: error: use of undeclared identifier 'doesnt_exist' diff --git a/test/compile_errors/stage1/obj/invalid_field_in_struct_value_expression.zig b/test/compile_errors/stage1/obj/invalid_field_in_struct_value_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..41511f0d0a7aaa30beb391ee1c5df73a0d4906d9 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_field_in_struct_value_expression.zig @@ -0,0 +1,17 @@ +const A = struct { + x : i32, + y : i32, + z : i32, +}; +export fn f() void { + const a = A { + .z = 4, + .y = 2, + .foo = 42, + }; + _ = a; +} + +// invalid field in struct value expression +// +// tmp.zig:10:9: error: no member named 'foo' in struct 'A' diff --git a/test/compile_errors/stage1/obj/invalid_float_literal.zig b/test/compile_errors/stage1/obj/invalid_float_literal.zig new file mode 100644 index 0000000000000000000000000000000000000000..5d9a26032f41119780b70aa46bd59a41467a0375 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_float_literal.zig @@ -0,0 +1,11 @@ +const std = @import("std"); + +pub fn main() void { + var bad_float :f32 = 0.0; + bad_float = bad_float + .20; + std.debug.assert(bad_float < 1.0); +} + +// invalid float literal +// +// tmp.zig:5:29: error: expected expression, found '.' diff --git a/test/compile_errors/stage1/obj/invalid_legacy_unicode_escape.zig b/test/compile_errors/stage1/obj/invalid_legacy_unicode_escape.zig new file mode 100644 index 0000000000000000000000000000000000000000..58e1390345e580d19360874981ddefef5ef28719 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_legacy_unicode_escape.zig @@ -0,0 +1,8 @@ +export fn entry() void { + const a = '\U1234'; +} + +// invalid legacy unicode escape +// +// tmp.zig:2:15: error: expected expression, found 'invalid bytes' +// tmp.zig:2:18: note: invalid byte: '1' diff --git a/test/compile_errors/stage1/obj/invalid_maybe_type.zig b/test/compile_errors/stage1/obj/invalid_maybe_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..9edc313526a258d3c3c391cfe4822bc6299c57d0 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_maybe_type.zig @@ -0,0 +1,7 @@ +export fn f() void { + if (true) |x| { _ = x; } +} + +// invalid maybe type +// +// tmp.zig:2:9: error: expected optional type, found 'bool' diff --git a/test/compile_errors/stage1/obj/invalid_member_of_builtin_enum.zig b/test/compile_errors/stage1/obj/invalid_member_of_builtin_enum.zig new file mode 100644 index 0000000000000000000000000000000000000000..32888ff84ba33296877d2d7fd697c42580e7aa84 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_member_of_builtin_enum.zig @@ -0,0 +1,9 @@ +const builtin = @import("std").builtin; +export fn entry() void { + const foo = builtin.Mode.x86; + _ = foo; +} + +// invalid member of builtin enum +// +// tmp.zig:3:29: error: container 'std.builtin.Mode' has no member called 'x86' diff --git a/test/compile_errors/stage1/obj/invalid_multiple_dereferences.zig b/test/compile_errors/stage1/obj/invalid_multiple_dereferences.zig new file mode 100644 index 0000000000000000000000000000000000000000..bdf5ccb228f6620a6d998d3763f40660e7df15ad --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_multiple_dereferences.zig @@ -0,0 +1,17 @@ +export fn a() void { + var box = Box{ .field = 0 }; + box.*.field = 1; +} +export fn b() void { + var box = Box{ .field = 0 }; + var boxPtr = &box; + boxPtr.*.*.field = 1; +} +pub const Box = struct { + field: i32, +}; + +// invalid multiple dereferences +// +// tmp.zig:3:8: error: attempt to dereference non-pointer type 'Box' +// tmp.zig:8:13: error: attempt to dereference non-pointer type 'Box' diff --git a/test/compile_errors/stage1/obj/invalid_optional_type_in_extern_struct.zig b/test/compile_errors/stage1/obj/invalid_optional_type_in_extern_struct.zig new file mode 100644 index 0000000000000000000000000000000000000000..17d9477abf29212be175db0f253d5f970e8ad53e --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_optional_type_in_extern_struct.zig @@ -0,0 +1,8 @@ +const stroo = extern struct { + moo: ?[*c]u8, +}; +export fn testf(fluff: *stroo) void { _ = fluff; } + +// invalid optional type in extern struct +// +// tmp.zig:2:5: error: extern structs cannot contain fields of type '?[*c]u8' diff --git a/test/compile_errors/stage1/obj/invalid_pointer_for_var_type.zig b/test/compile_errors/stage1/obj/invalid_pointer_for_var_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..599aef54f2b3083005c06a3303dd287bfec7d009 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_pointer_for_var_type.zig @@ -0,0 +1,11 @@ +extern fn ext() usize; +var bytes: [ext()]u8 = undefined; +export fn f() void { + for (bytes) |*b, i| { + b.* = @as(u8, i); + } +} + +// invalid pointer for var type +// +// tmp.zig:2:13: error: unable to evaluate constant expression diff --git a/test/compile_errors/stage1/obj/invalid_pointer_syntax.zig b/test/compile_errors/stage1/obj/invalid_pointer_syntax.zig new file mode 100644 index 0000000000000000000000000000000000000000..d4b68200b65c91d5e04f83aededd3e742dfc9902 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_pointer_syntax.zig @@ -0,0 +1,7 @@ +export fn foo() void { + var guid: *:0 const u8 = undefined; +} + +// invalid pointer syntax +// +// tmp.zig:2:16: error: expected type expression, found ':' diff --git a/test/compile_errors/stage1/obj/invalid_shift_amount_error.zig b/test/compile_errors/stage1/obj/invalid_shift_amount_error.zig new file mode 100644 index 0000000000000000000000000000000000000000..f4fe1cb2ff8e61d93c5e75384d32dfdceaed287f --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_shift_amount_error.zig @@ -0,0 +1,9 @@ +const x : u8 = 2; +fn f() u16 { + return x << 8; +} +export fn entry() u16 { return f(); } + +// invalid shift amount error +// +// tmp.zig:3:17: error: integer value 8 cannot be coerced to type 'u3' diff --git a/test/compile_errors/stage1/obj/invalid_struct_field.zig b/test/compile_errors/stage1/obj/invalid_struct_field.zig new file mode 100644 index 0000000000000000000000000000000000000000..2d85914907206ee07d1c9a26bfb8a70f1f07c088 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_struct_field.zig @@ -0,0 +1,17 @@ +const A = struct { x : i32, }; +export fn f() void { + var a : A = undefined; + a.foo = 1; + const y = a.bar; + _ = y; +} +export fn g() void { + var a : A = undefined; + const y = a.bar; + _ = y; +} + +// invalid struct field +// +// tmp.zig:4:6: error: no member named 'foo' in struct 'A' +// tmp.zig:10:16: error: no member named 'bar' in struct 'A' diff --git a/test/compile_errors/stage1/obj/invalid_suspend_in_exported_function.zig b/test/compile_errors/stage1/obj/invalid_suspend_in_exported_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..da808563a55e7e614d0c3cb72e839633fe01b1ed --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_suspend_in_exported_function.zig @@ -0,0 +1,13 @@ +export fn entry() void { + var frame = async func(); + var result = await frame; + _ = result; +} +fn func() void { + suspend {} +} + +// invalid suspend in exported function +// +// tmp.zig:1:1: error: function with calling convention 'C' cannot be async +// tmp.zig:3:18: note: await here is a suspend point diff --git a/test/compile_errors/stage1/obj/invalid_type.zig b/test/compile_errors/stage1/obj/invalid_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..030730051739aceeb21b5a02ccd3a06971570177 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_type.zig @@ -0,0 +1,6 @@ +fn a() bogus {} +export fn entry() void { _ = a(); } + +// invalid type +// +// tmp.zig:1:8: error: use of undeclared identifier 'bogus' diff --git a/test/compile_errors/stage1/obj/invalid_type_used_in_array_type.zig b/test/compile_errors/stage1/obj/invalid_type_used_in_array_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..26f0e6a7db8d2ebf33d0891d1c9c32450ac25338 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_type_used_in_array_type.zig @@ -0,0 +1,12 @@ +const Item = struct { + field: SomeNonexistentType, +}; +var items: [100]Item = undefined; +export fn entry() void { + const a = items[0]; + _ = a; +} + +// invalid type used in array type +// +// tmp.zig:2:12: error: use of undeclared identifier 'SomeNonexistentType' diff --git a/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-1.zig b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-1.zig new file mode 100644 index 0000000000000000000000000000000000000000..5cea5401043e278f004ca8ca36a1e708da117123 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-1.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: f128 = 0._0; + _ = bad; +} + +// invalid underscore placement in float literal - 1 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:23: note: invalid byte: '_' diff --git a/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-10.zig b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-10.zig new file mode 100644 index 0000000000000000000000000000000000000000..d789579a2b7b0154ab249b3f8d6f54bf733e9db4 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-10.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: f128 = 1.0__0e-1; + _ = bad; +} + +// invalid underscore placement in float literal - 10 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:25: note: invalid byte: '_' diff --git a/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-11.zig b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-11.zig new file mode 100644 index 0000000000000000000000000000000000000000..197b1140905b33647e5de0e753221e0f5a82c9db --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-11.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: f128 = 1.0e-1__0; + _ = bad; +} + +// invalid underscore placement in float literal - 11 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:28: note: invalid byte: '_' diff --git a/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-12.zig b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-12.zig new file mode 100644 index 0000000000000000000000000000000000000000..1d25c9f4b4952562f415382483548c9639054a69 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-12.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: f128 = 0_x0.0; + _ = bad; +} + +// invalid underscore placement in float literal - 12 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:23: note: invalid byte: 'x' diff --git a/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-13.zig b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-13.zig new file mode 100644 index 0000000000000000000000000000000000000000..c3de75ed32c2c4fbb44e249826e02e7c10f0e8ea --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-13.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: f128 = 0x_0.0; + _ = bad; +} + +// invalid underscore placement in float literal - 13 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:23: note: invalid byte: '_' diff --git a/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-14.zig b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-14.zig new file mode 100644 index 0000000000000000000000000000000000000000..cbb967e926704ef3cfb26bb6a9c92ce00893a953 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-14.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: f128 = 0x0.0_p1; + _ = bad; +} + +// invalid underscore placement in float literal - 14 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:27: note: invalid byte: 'p' diff --git a/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-2.zig b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-2.zig new file mode 100644 index 0000000000000000000000000000000000000000..e83c1b420b25fa16d35ca4cf4096dd7424f513f9 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-2.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: f128 = 0_.0; + _ = bad; +} + +// invalid underscore placement in float literal - 2 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:23: note: invalid byte: '.' diff --git a/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-3.zig b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-3.zig new file mode 100644 index 0000000000000000000000000000000000000000..f9ca8e0d7c4d624c86b69094611f0bc3ea432665 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-3.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: f128 = 0.0_; + _ = bad; +} + +// invalid underscore placement in float literal - 3 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:25: note: invalid byte: ';' diff --git a/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-4.zig b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-4.zig new file mode 100644 index 0000000000000000000000000000000000000000..20e8d3692e83fb8aa3572ac00e89e0568a8882f4 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-4.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: f128 = 1.0e_1; + _ = bad; +} + +// invalid underscore placement in float literal - 4 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:25: note: invalid byte: '_' diff --git a/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-5.zig b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-5.zig new file mode 100644 index 0000000000000000000000000000000000000000..3719f54e06beaa69dd04dad7ca91d18d59b72f35 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-5.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: f128 = 1.0e+_1; + _ = bad; +} + +// invalid underscore placement in float literal - 5 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:26: note: invalid byte: '_' diff --git a/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-6.zig b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-6.zig new file mode 100644 index 0000000000000000000000000000000000000000..64a439538a30e0640c1be1a0640630b350507fcf --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-6.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: f128 = 1.0e-_1; + _ = bad; +} + +// invalid underscore placement in float literal - 6 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:26: note: invalid byte: '_' diff --git a/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-7.zig b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-7.zig new file mode 100644 index 0000000000000000000000000000000000000000..311b27339a56940669cc9ae8d4246aa8ae02481e --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-7.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: f128 = 1.0e-1_; + _ = bad; +} + +// invalid underscore placement in float literal - 7 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:28: note: invalid byte: ';' diff --git a/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-9.zig b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-9.zig new file mode 100644 index 0000000000000000000000000000000000000000..ecd1149f2261a0d397ec87f4443980c79e09d3d7 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_float_literal-9.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: f128 = 1__0.0e-1; + _ = bad; +} + +// invalid underscore placement in float literal - 9 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:23: note: invalid byte: '_' diff --git a/test/compile_errors/stage1/obj/invalid_underscore_placement_in_int_literal-1.zig b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_int_literal-1.zig new file mode 100644 index 0000000000000000000000000000000000000000..47da090745d02d65357ae47716f67385bb2e4e3b --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_int_literal-1.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: u128 = 0010_; + _ = bad; +} + +// invalid underscore placement in int literal - 1 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:26: note: invalid byte: ';' diff --git a/test/compile_errors/stage1/obj/invalid_underscore_placement_in_int_literal-2.zig b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_int_literal-2.zig new file mode 100644 index 0000000000000000000000000000000000000000..bb230daa9e3d76e3dbb8276c5a8576a3de9bf262 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_int_literal-2.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: u128 = 0b0010_; + _ = bad; +} + +// invalid underscore placement in int literal - 2 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:28: note: invalid byte: ';' diff --git a/test/compile_errors/stage1/obj/invalid_underscore_placement_in_int_literal-3.zig b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_int_literal-3.zig new file mode 100644 index 0000000000000000000000000000000000000000..7808b6ee4dca31a6356d350a8bb5ee71cf6e7436 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_int_literal-3.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: u128 = 0o0010_; + _ = bad; +} + +// invalid underscore placement in int literal - 3 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:28: note: invalid byte: ';' diff --git a/test/compile_errors/stage1/obj/invalid_underscore_placement_in_int_literal-4.zig b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_int_literal-4.zig new file mode 100644 index 0000000000000000000000000000000000000000..51ddb3d0614578a1d30fe26568b632ec4f0415e7 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_underscore_placement_in_int_literal-4.zig @@ -0,0 +1,9 @@ +fn main() void { + var bad: u128 = 0x0010_; + _ = bad; +} + +// invalid underscore placement in int literal - 4 +// +// tmp.zig:2:21: error: expected expression, found 'invalid bytes' +// tmp.zig:2:28: note: invalid byte: ';' diff --git a/test/compile_errors/stage1/obj/invalid_union_field_access_in_comptime.zig b/test/compile_errors/stage1/obj/invalid_union_field_access_in_comptime.zig new file mode 100644 index 0000000000000000000000000000000000000000..d570dca0b99e37a8f7f09f62e62d90a18f6e50d9 --- /dev/null +++ b/test/compile_errors/stage1/obj/invalid_union_field_access_in_comptime.zig @@ -0,0 +1,13 @@ +const Foo = union { + Bar: u8, + Baz: void, +}; +comptime { + var foo = Foo {.Baz = {}}; + const bar_val = foo.Bar; + _ = bar_val; +} + +// invalid union field access in comptime +// +// tmp.zig:7:24: error: accessing union field 'Bar' while field 'Baz' is set diff --git a/test/compile_errors/stage1/obj/issue_2032_compile_diagnostic_string_for_top_level_decl_type.zig b/test/compile_errors/stage1/obj/issue_2032_compile_diagnostic_string_for_top_level_decl_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..9e353a4d386ed60f51aa7c2220cd29ea16f7d610 --- /dev/null +++ b/test/compile_errors/stage1/obj/issue_2032_compile_diagnostic_string_for_top_level_decl_type.zig @@ -0,0 +1,8 @@ +export fn entry() void { + var foo: u32 = @This(){}; + _ = foo; +} + +// compile diagnostic string for top level decl type (issue 2032) +// +// tmp.zig:2:27: error: type 'u32' does not support array initialization diff --git a/test/compile_errors/stage1/obj/issue_2687_coerce_from_undefined_array_pointer_to_slice.zig b/test/compile_errors/stage1/obj/issue_2687_coerce_from_undefined_array_pointer_to_slice.zig new file mode 100644 index 0000000000000000000000000000000000000000..7c125b85cef8391cfb7d9f58af7bc4468cf1c870 --- /dev/null +++ b/test/compile_errors/stage1/obj/issue_2687_coerce_from_undefined_array_pointer_to_slice.zig @@ -0,0 +1,25 @@ +export fn foo1() void { + const a: *[1]u8 = undefined; + var b: []u8 = a; + _ = b; +} +export fn foo2() void { + comptime { + var a: *[1]u8 = undefined; + var b: []u8 = a; + _ = b; + } +} +export fn foo3() void { + comptime { + const a: *[1]u8 = undefined; + var b: []u8 = a; + _ = b; + } +} + +// issue #2687: coerce from undefined array pointer to slice +// +// tmp.zig:3:19: error: use of undefined value here causes undefined behavior +// tmp.zig:9:23: error: use of undefined value here causes undefined behavior +// tmp.zig:16:23: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/issue_3818_bitcast_from_parray-slice_to_u16.zig b/test/compile_errors/stage1/obj/issue_3818_bitcast_from_parray-slice_to_u16.zig new file mode 100644 index 0000000000000000000000000000000000000000..1c9d9cd1b1b5c9fff2410be106bf4b146faa2137 --- /dev/null +++ b/test/compile_errors/stage1/obj/issue_3818_bitcast_from_parray-slice_to_u16.zig @@ -0,0 +1,15 @@ +export fn foo1() void { + var bytes = [_]u8{1, 2}; + const word: u16 = @bitCast(u16, bytes[0..]); + _ = word; +} +export fn foo2() void { + var bytes: []const u8 = &[_]u8{1, 2}; + const word: u16 = @bitCast(u16, bytes); + _ = word; +} + +// issue #3818: bitcast from parray/slice to u16 +// +// tmp.zig:3:42: error: unable to @bitCast from pointer type '*[2]u8' +// tmp.zig:8:32: error: destination type 'u16' has size 2 but source type '[]const u8' has size 16 diff --git a/test/compile_errors/stage1/obj/issue_4207_coerce_from_non-terminated-slice_to_terminated-pointer.zig b/test/compile_errors/stage1/obj/issue_4207_coerce_from_non-terminated-slice_to_terminated-pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..bfb0595cce186c82af9e8d18c4dd0cdd13263b58 --- /dev/null +++ b/test/compile_errors/stage1/obj/issue_4207_coerce_from_non-terminated-slice_to_terminated-pointer.zig @@ -0,0 +1,9 @@ +export fn foo() [*:0]const u8 { + var buffer: [64]u8 = undefined; + return buffer[0..]; +} + +// issue #4207: coerce from non-terminated-slice to terminated-pointer +// +// :3:18: error: expected type '[*:0]const u8', found '*[64]u8' +// :3:18: note: destination pointer requires a terminating '0' sentinel diff --git a/test/compile_errors/stage1/obj/issue_5221_invalid_struct_init_type_referenced_by_typeInfo_and_passed_into_function.zig b/test/compile_errors/stage1/obj/issue_5221_invalid_struct_init_type_referenced_by_typeInfo_and_passed_into_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..aa839bc72ccdf02f111387f6011bf4cd8ec901b9 --- /dev/null +++ b/test/compile_errors/stage1/obj/issue_5221_invalid_struct_init_type_referenced_by_typeInfo_and_passed_into_function.zig @@ -0,0 +1,14 @@ +fn ignore(comptime param: anytype) void {_ = param;} + +export fn foo() void { + const MyStruct = struct { + wrong_type: []u8 = "foo", + }; + + comptime ignore(@typeInfo(MyStruct).Struct.fields[0]); +} + +// issue #5221: invalid struct init type referenced by @typeInfo and passed into function +// +// :5:28: error: cannot cast pointer to array literal to slice type '[]u8' +// :5:28: note: cast discards const qualifier diff --git a/test/compile_errors/stage1/obj/issue_5618_coercion_of_optional_anyopaque_to_anyopaque_must_fail.zig b/test/compile_errors/stage1/obj/issue_5618_coercion_of_optional_anyopaque_to_anyopaque_must_fail.zig new file mode 100644 index 0000000000000000000000000000000000000000..daa8a91f4036e44908d5105a1a86d956e356eb5b --- /dev/null +++ b/test/compile_errors/stage1/obj/issue_5618_coercion_of_optional_anyopaque_to_anyopaque_must_fail.zig @@ -0,0 +1,9 @@ +export fn foo() void { + var u: ?*anyopaque = null; + var v: *anyopaque = undefined; + v = u; +} + +// Issue #5618: coercion of ?*anyopaque to *anyopaque must fail. +// +// tmp.zig:4:9: error: cannot convert optional to payload type. consider using `.?`, `orelse`, or `if`. expected type '*anyopaque', found '?*anyopaque' diff --git a/test/compile_errors/stage1/obj/issue_7810-comptime_slice-len_increment_beyond_bounds.zig b/test/compile_errors/stage1/obj/issue_7810-comptime_slice-len_increment_beyond_bounds.zig new file mode 100644 index 0000000000000000000000000000000000000000..533ac928b462fd50467af59cd2a7f7ffe542c686 --- /dev/null +++ b/test/compile_errors/stage1/obj/issue_7810-comptime_slice-len_increment_beyond_bounds.zig @@ -0,0 +1,12 @@ +export fn foo_slice_len_increment_beyond_bounds() void { + comptime { + var buf_storage: [8]u8 = undefined; + var buf: []const u8 = buf_storage[0..]; + buf.len += 1; + buf[8] = 42; + } +} + +// comptime slice-len increment beyond bounds +// +// :6:12: error: out of bounds slice diff --git a/test/compile_errors/stage1/obj/issue_9346_return_outside_of_function_scope.zig b/test/compile_errors/stage1/obj/issue_9346_return_outside_of_function_scope.zig new file mode 100644 index 0000000000000000000000000000000000000000..6be92e2ee8f579845b85137380ba210517dd0d80 --- /dev/null +++ b/test/compile_errors/stage1/obj/issue_9346_return_outside_of_function_scope.zig @@ -0,0 +1,5 @@ +pub const empty = return 1; + +// issue #9346: return outside of function scope +// +// tmp.zig:1:19: error: 'return' outside function scope diff --git a/test/compile_errors/stage1/obj/labeled_break_not_found.zig b/test/compile_errors/stage1/obj/labeled_break_not_found.zig new file mode 100644 index 0000000000000000000000000000000000000000..0f4632d74d1f4bd85dcd4f8e5b5c4045903dc5a3 --- /dev/null +++ b/test/compile_errors/stage1/obj/labeled_break_not_found.zig @@ -0,0 +1,11 @@ +export fn entry() void { + blah: while (true) { + while (true) { + break :outer; + } + } +} + +// labeled break not found +// +// tmp.zig:4:20: error: label not found: 'outer' diff --git a/test/compile_errors/stage1/obj/labeled_continue_not_found.zig b/test/compile_errors/stage1/obj/labeled_continue_not_found.zig new file mode 100644 index 0000000000000000000000000000000000000000..8f95a0fce1741941ce3964f87d7afee5e24b53d8 --- /dev/null +++ b/test/compile_errors/stage1/obj/labeled_continue_not_found.zig @@ -0,0 +1,12 @@ +export fn entry() void { + var i: usize = 0; + blah: while (i < 10) : (i += 1) { + while (true) { + continue :outer; + } + } +} + +// labeled continue not found +// +// tmp.zig:5:23: error: label not found: 'outer' diff --git a/test/compile_errors/stage1/obj/lazy_pointer_with_undefined_element_type.zig b/test/compile_errors/stage1/obj/lazy_pointer_with_undefined_element_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..47b271a05e12067a8ac95a196c1d9cf1f8fba93e --- /dev/null +++ b/test/compile_errors/stage1/obj/lazy_pointer_with_undefined_element_type.zig @@ -0,0 +1,10 @@ +export fn foo() void { + comptime var T: type = undefined; + const S = struct { x: *T }; + const I = @typeInfo(S); + _ = I; +} + +// lazy pointer with undefined element type +// +// :3:28: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/load_too_many_bytes_from_comptime_reinterpreted_pointer.zig b/test/compile_errors/stage1/obj/load_too_many_bytes_from_comptime_reinterpreted_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..2c5e1c7327d61cdc0dadd239d0429cd9aed8108e --- /dev/null +++ b/test/compile_errors/stage1/obj/load_too_many_bytes_from_comptime_reinterpreted_pointer.zig @@ -0,0 +1,11 @@ +export fn entry() void { + const float: f32 = 5.99999999999994648725e-01; + const float_ptr = &float; + const int_ptr = @ptrCast(*const i64, float_ptr); + const int_val = int_ptr.*; + _ = int_val; +} + +// load too many bytes from comptime reinterpreted pointer +// +// tmp.zig:5:28: error: attempt to read 8 bytes from pointer to f32 which is 4 bytes diff --git a/test/compile_errors/stage1/obj/load_vector_pointer_with_unknown_runtime_index.zig b/test/compile_errors/stage1/obj/load_vector_pointer_with_unknown_runtime_index.zig new file mode 100644 index 0000000000000000000000000000000000000000..fe28fa91022e35166eb8d8a6130f14b3da1b0972 --- /dev/null +++ b/test/compile_errors/stage1/obj/load_vector_pointer_with_unknown_runtime_index.zig @@ -0,0 +1,15 @@ +export fn entry() void { + var v: @import("std").meta.Vector(4, i32) = [_]i32{ 1, 5, 3, undefined }; + + var i: u32 = 0; + var x = loadv(&v[i]); + _ = x; +} + +fn loadv(ptr: anytype) i32 { + return ptr.*; +} + +// load vector pointer with unknown runtime index +// +// tmp.zig:10:12: error: unable to determine vector element index of type '*align(16:0:4:?) i32 diff --git a/test/compile_errors/stage1/obj/local_shadows_global_that_occurs_later.zig b/test/compile_errors/stage1/obj/local_shadows_global_that_occurs_later.zig new file mode 100644 index 0000000000000000000000000000000000000000..2265a34f18cf8c26998f7b34def44f1fcbc7588a --- /dev/null +++ b/test/compile_errors/stage1/obj/local_shadows_global_that_occurs_later.zig @@ -0,0 +1,10 @@ +pub fn main() void { + var foo = true; + _ = foo; +} +fn foo() void {} + +// local shadows global that occurs later +// +// tmp.zig:2:9: error: local shadows declaration of 'foo' +// tmp.zig:5:1: note: declared here diff --git a/test/compile_errors/stage1/obj/local_variable_redeclaration.zig b/test/compile_errors/stage1/obj/local_variable_redeclaration.zig new file mode 100644 index 0000000000000000000000000000000000000000..2367963edb006aa4414b864643654513338901e7 --- /dev/null +++ b/test/compile_errors/stage1/obj/local_variable_redeclaration.zig @@ -0,0 +1,9 @@ +export fn f() void { + const a : i32 = 0; + var a = 0; +} + +// local variable redeclaration +// +// tmp.zig:3:9: error: redeclaration of local constant 'a' +// tmp.zig:2:11: note: previous declaration here diff --git a/test/compile_errors/stage1/obj/local_variable_redeclares_parameter.zig b/test/compile_errors/stage1/obj/local_variable_redeclares_parameter.zig new file mode 100644 index 0000000000000000000000000000000000000000..e624e14e31dc0d1828193ebbae75f4ba33c62e35 --- /dev/null +++ b/test/compile_errors/stage1/obj/local_variable_redeclares_parameter.zig @@ -0,0 +1,9 @@ +fn f(a : i32) void { + const a = 0; +} +export fn entry() void { f(1); } + +// local variable redeclares parameter +// +// tmp.zig:2:11: error: redeclaration of function parameter 'a' +// tmp.zig:1:6: note: previous declaration here diff --git a/test/compile_errors/stage1/obj/local_variable_shadowing_global.zig b/test/compile_errors/stage1/obj/local_variable_shadowing_global.zig new file mode 100644 index 0000000000000000000000000000000000000000..c824cb3df7be50cfadb8644d06ee34405604639d --- /dev/null +++ b/test/compile_errors/stage1/obj/local_variable_shadowing_global.zig @@ -0,0 +1,12 @@ +const Foo = struct {}; +const Bar = struct {}; + +export fn entry() void { + var Bar : i32 = undefined; + _ = Bar; +} + +// local variable shadowing global +// +// tmp.zig:5:9: error: local shadows declaration of 'Bar' +// tmp.zig:2:1: note: declared here diff --git a/test/compile_errors/stage1/obj/locally_shadowing_a_primitive_type.zig b/test/compile_errors/stage1/obj/locally_shadowing_a_primitive_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..457cea418c5e17290c3885d2f2cd2f834e1c9b82 --- /dev/null +++ b/test/compile_errors/stage1/obj/locally_shadowing_a_primitive_type.zig @@ -0,0 +1,10 @@ +export fn foo() void { + const u8 = u16; + const a: u8 = 300; + _ = a; +} + +// locally shadowing a primitive type +// +// tmp.zig:2:11: error: name shadows primitive 'u8' +// tmp.zig:2:11: note: consider using @"u8" to disambiguate diff --git a/test/compile_errors/stage1/obj/main_function_with_bogus_args_type.zig b/test/compile_errors/stage1/obj/main_function_with_bogus_args_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..3954c4b846df605d0daa357b7c2938a59dee9160 --- /dev/null +++ b/test/compile_errors/stage1/obj/main_function_with_bogus_args_type.zig @@ -0,0 +1,5 @@ +pub fn main(args: [][]bogus) !void {_ = args;} + +// main function with bogus args type +// +// tmp.zig:1:23: error: use of undeclared identifier 'bogus' diff --git a/test/compile_errors/stage1/obj/method_call_with_first_arg_type_primitive.zig b/test/compile_errors/stage1/obj/method_call_with_first_arg_type_primitive.zig new file mode 100644 index 0000000000000000000000000000000000000000..9763e84fbaf60d1c0f025985210a7f6b6dbd51fd --- /dev/null +++ b/test/compile_errors/stage1/obj/method_call_with_first_arg_type_primitive.zig @@ -0,0 +1,19 @@ +const Foo = struct { + x: i32, + + fn init(x: i32) Foo { + return Foo { + .x = x, + }; + } +}; + +export fn f() void { + const derp = Foo.init(3); + + derp.init(); +} + +// method call with first arg type primitive +// +// tmp.zig:14:5: error: expected type 'i32', found 'Foo' diff --git a/test/compile_errors/stage1/obj/method_call_with_first_arg_type_wrong_container.zig b/test/compile_errors/stage1/obj/method_call_with_first_arg_type_wrong_container.zig new file mode 100644 index 0000000000000000000000000000000000000000..ccbc7e32e3cc7e9d64d5d9fac9246c5014c4af40 --- /dev/null +++ b/test/compile_errors/stage1/obj/method_call_with_first_arg_type_wrong_container.zig @@ -0,0 +1,28 @@ +pub const List = struct { + len: usize, + allocator: *Allocator, + + pub fn init(allocator: *Allocator) List { + return List { + .len = 0, + .allocator = allocator, + }; + } +}; + +pub var global_allocator = Allocator { + .field = 1234, +}; + +pub const Allocator = struct { + field: i32, +}; + +export fn foo() void { + var x = List.init(&global_allocator); + x.init(); +} + +// method call with first arg type wrong container +// +// tmp.zig:23:5: error: expected type '*Allocator', found '*List' diff --git a/test/compile_errors/stage1/obj/missing_boolean_switch_value.zig b/test/compile_errors/stage1/obj/missing_boolean_switch_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..63a12c4e6f98fdf6371014fec388a80e39956cb3 --- /dev/null +++ b/test/compile_errors/stage1/obj/missing_boolean_switch_value.zig @@ -0,0 +1,17 @@ +comptime { + const x = switch (true) { + true => false, + }; + _ = x; +} +comptime { + const x = switch (true) { + false => true, + }; + _ = x; +} + +// missing boolean switch value +// +// tmp.zig:2:15: error: switch must handle all possibilities +// tmp.zig:8:15: error: switch must handle all possibilities diff --git a/test/compile_errors/stage1/obj/missing_const_in_slice_with_nested_array_type.zig b/test/compile_errors/stage1/obj/missing_const_in_slice_with_nested_array_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..4f552284d79a8f4237753efcc7587f8e10922d13 --- /dev/null +++ b/test/compile_errors/stage1/obj/missing_const_in_slice_with_nested_array_type.zig @@ -0,0 +1,16 @@ +const Geo3DTex2D = struct { vertices: [][2]f32 }; +pub fn getGeo3DTex2D() Geo3DTex2D { + return Geo3DTex2D{ + .vertices = [_][2]f32{ + [_]f32{ -0.5, -0.5}, + }, + }; +} +export fn entry() void { + var geo_data = getGeo3DTex2D(); + _ = geo_data; +} + +// missing const in slice with nested array type +// +// tmp.zig:4:30: error: array literal requires address-of operator (&) to coerce to slice type '[][2]f32' diff --git a/test/compile_errors/stage1/obj/missing_else_clause.zig b/test/compile_errors/stage1/obj/missing_else_clause.zig new file mode 100644 index 0000000000000000000000000000000000000000..28adfd21e849f222a0ea32c33f466f4946f9615c --- /dev/null +++ b/test/compile_errors/stage1/obj/missing_else_clause.zig @@ -0,0 +1,14 @@ +fn f(b: bool) void { + const x : i32 = if (b) h: { break :h 1; }; + _ = x; +} +fn g(b: bool) void { + const y = if (b) h: { break :h @as(i32, 1); }; + _ = y; +} +export fn entry() void { f(true); g(true); } + +// missing else clause +// +// tmp.zig:2:21: error: expected type 'i32', found 'void' +// tmp.zig:6:15: error: incompatible types: 'i32' and 'void' diff --git a/test/compile_errors/stage1/obj/missing_field_in_struct_value_expression.zig b/test/compile_errors/stage1/obj/missing_field_in_struct_value_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..bea4021a5a65995bf5fd5f38dafeaf728d674f06 --- /dev/null +++ b/test/compile_errors/stage1/obj/missing_field_in_struct_value_expression.zig @@ -0,0 +1,18 @@ +const A = struct { + x : i32, + y : i32, + z : i32, +}; +export fn f() void { + // we want the error on the '{' not the 'A' because + // the A could be a complicated expression + const a = A { + .z = 4, + .y = 2, + }; + _ = a; +} + +// missing field in struct value expression +// +// tmp.zig:9:17: error: missing field: 'x' diff --git a/test/compile_errors/stage1/obj/missing_function_call_param.zig b/test/compile_errors/stage1/obj/missing_function_call_param.zig new file mode 100644 index 0000000000000000000000000000000000000000..45a72598141f2c36cb5cbbfa39c7244af4c1f5bd --- /dev/null +++ b/test/compile_errors/stage1/obj/missing_function_call_param.zig @@ -0,0 +1,29 @@ +const Foo = struct { + a: i32, + b: i32, + + fn member_a(foo: *const Foo) i32 { + return foo.a; + } + fn member_b(foo: *const Foo) i32 { + return foo.b; + } +}; + +const member_fn_type = @TypeOf(Foo.member_a); +const members = [_]member_fn_type { + Foo.member_a, + Foo.member_b, +}; + +fn f(foo: *const Foo, index: usize) void { + const result = members[index](); + _ = foo; + _ = result; +} + +export fn entry() usize { return @sizeOf(@TypeOf(f)); } + +// missing function call param +// +// tmp.zig:20:34: error: expected 1 argument(s), found 0 diff --git a/test/compile_errors/stage1/obj/missing_function_name.zig b/test/compile_errors/stage1/obj/missing_function_name.zig new file mode 100644 index 0000000000000000000000000000000000000000..194f5eb6a845d31f17aaf97c9468f6ac72ce36b5 --- /dev/null +++ b/test/compile_errors/stage1/obj/missing_function_name.zig @@ -0,0 +1,6 @@ +fn () void {} +export fn entry() usize { return @sizeOf(@TypeOf(f)); } + +// missing function name +// +// tmp.zig:1:1: error: missing function name diff --git a/test/compile_errors/stage1/obj/missing_param_name.zig b/test/compile_errors/stage1/obj/missing_param_name.zig new file mode 100644 index 0000000000000000000000000000000000000000..1c379dd245f2534ddf7eca7699e17030a500eb52 --- /dev/null +++ b/test/compile_errors/stage1/obj/missing_param_name.zig @@ -0,0 +1,6 @@ +fn f(i32) void {} +export fn entry() usize { return @sizeOf(@TypeOf(f)); } + +// missing param name +// +// tmp.zig:1:6: error: missing parameter name diff --git a/test/compile_errors/stage1/obj/missing_parameter_name_of_generic_function.zig b/test/compile_errors/stage1/obj/missing_parameter_name_of_generic_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..3a3ccd28a82c517db62dcd23e2fa0e4488999518 --- /dev/null +++ b/test/compile_errors/stage1/obj/missing_parameter_name_of_generic_function.zig @@ -0,0 +1,9 @@ +fn dump(anytype) void {} +export fn entry() void { + var a: u8 = 9; + dump(a); +} + +// missing parameter name of generic function +// +// tmp.zig:1:9: error: missing parameter name diff --git a/test/compile_errors/stage1/obj/missing_result_type_for_phi_node.zig b/test/compile_errors/stage1/obj/missing_result_type_for_phi_node.zig new file mode 100644 index 0000000000000000000000000000000000000000..3ef99e08597663fc3cad4059abe46f34e51325a1 --- /dev/null +++ b/test/compile_errors/stage1/obj/missing_result_type_for_phi_node.zig @@ -0,0 +1,10 @@ +fn foo() !void { + return anyerror.Foo; +} +export fn entry() void { + foo() catch 0; +} + +// missing result type for phi node +// +// tmp.zig:5:17: error: integer value 0 cannot be coerced to type 'void' diff --git a/test/compile_errors/stage1/obj/misspelled_type_with_pointer_only_reference.zig b/test/compile_errors/stage1/obj/misspelled_type_with_pointer_only_reference.zig new file mode 100644 index 0000000000000000000000000000000000000000..6b3f647c0231c7bb749d104bfc38f3797f363365 --- /dev/null +++ b/test/compile_errors/stage1/obj/misspelled_type_with_pointer_only_reference.zig @@ -0,0 +1,35 @@ +const JasonHM = u8; +const JasonList = *JsonNode; + +const JsonOA = union(enum) { + JSONArray: JsonList, + JSONObject: JasonHM, +}; + +const JsonType = union(enum) { + JSONNull: void, + JSONInteger: isize, + JSONDouble: f64, + JSONBool: bool, + JSONString: []u8, + JSONArray: void, + JSONObject: void, +}; + +pub const JsonNode = struct { + kind: JsonType, + jobject: ?JsonOA, +}; + +fn foo() void { + var jll: JasonList = undefined; + jll.init(1234); + var jd = JsonNode {.kind = JsonType.JSONArray , .jobject = JsonOA.JSONArray {jll} }; + _ = jd; +} + +export fn entry() usize { return @sizeOf(@TypeOf(foo)); } + +// misspelled type with pointer only reference +// +// tmp.zig:5:16: error: use of undeclared identifier 'JsonList' diff --git a/test/compile_errors/stage1/obj/mod_assign_on_undefined_value.zig b/test/compile_errors/stage1/obj/mod_assign_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..3165970d44248efc17a2b19eea4647b54d2d32e9 --- /dev/null +++ b/test/compile_errors/stage1/obj/mod_assign_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + a %= a; +} + +// mod assign on undefined value +// +// tmp.zig:3:5: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/mod_on_undefined_value.zig b/test/compile_errors/stage1/obj/mod_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..3b33f6ed828890932e3c9a57d4ca624676ea78ff --- /dev/null +++ b/test/compile_errors/stage1/obj/mod_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + _ = a % a; +} + +// mod on undefined value +// +// tmp.zig:3:9: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/mul_overflow_in_function_evaluation.zig b/test/compile_errors/stage1/obj/mul_overflow_in_function_evaluation.zig new file mode 100644 index 0000000000000000000000000000000000000000..ea8eea5ab57b11dfdea23ae39dabc389194cb3cc --- /dev/null +++ b/test/compile_errors/stage1/obj/mul_overflow_in_function_evaluation.zig @@ -0,0 +1,10 @@ +const y = mul(300, 6000); +fn mul(a: u16, b: u16) u16 { + return a * b; +} + +export fn entry() usize { return @sizeOf(@TypeOf(y)); } + +// mul overflow in function evaluation +// +// tmp.zig:3:14: error: operation caused overflow diff --git a/test/compile_errors/stage1/obj/mult_assign_on_undefined_value.zig b/test/compile_errors/stage1/obj/mult_assign_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..4617c5f62b45f50da801b799c154667c20ff27b7 --- /dev/null +++ b/test/compile_errors/stage1/obj/mult_assign_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + a *= a; +} + +// mult assign on undefined value +// +// tmp.zig:3:5: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/mult_on_undefined_value.zig b/test/compile_errors/stage1/obj/mult_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..836b59e19db98a8aeebd35b07ab08ebdbf84037c --- /dev/null +++ b/test/compile_errors/stage1/obj/mult_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + _ = a * a; +} + +// mult on undefined value +// +// tmp.zig:3:9: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/mult_wrap_assign_on_undefined_value.zig b/test/compile_errors/stage1/obj/mult_wrap_assign_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..38bd38bf79ab1dfc061d809b59db5105ce09fca5 --- /dev/null +++ b/test/compile_errors/stage1/obj/mult_wrap_assign_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + a *%= a; +} + +// mult wrap assign on undefined value +// +// tmp.zig:3:5: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/mult_wrap_on_undefined_value.zig b/test/compile_errors/stage1/obj/mult_wrap_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..0c0ca4654066e860542cf28b3d313e81fa33d96b --- /dev/null +++ b/test/compile_errors/stage1/obj/mult_wrap_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + _ = a *% a; +} + +// mult wrap on undefined value +// +// tmp.zig:3:9: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/multiple_function_definitions.zig b/test/compile_errors/stage1/obj/multiple_function_definitions.zig new file mode 100644 index 0000000000000000000000000000000000000000..c4efefce8df4b1accacc1364b8bab1c24e2976d1 --- /dev/null +++ b/test/compile_errors/stage1/obj/multiple_function_definitions.zig @@ -0,0 +1,8 @@ +fn a() void {} +fn a() void {} +export fn entry() void { a(); } + +// multiple function definitions +// +// tmp.zig:2:1: error: redeclaration of 'a' +// tmp.zig:1:1: note: other declaration here diff --git a/test/compile_errors/stage1/obj/negate_on_undefined_value.zig b/test/compile_errors/stage1/obj/negate_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..7e7e3921042af326162a01c855bbe7742489f572 --- /dev/null +++ b/test/compile_errors/stage1/obj/negate_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + _ = -a; +} + +// negate on undefined value +// +// tmp.zig:3:10: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/negate_wrap_on_undefined_value.zig b/test/compile_errors/stage1/obj/negate_wrap_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..f49c6eac344cd349d550ac31c9ec7baa315f0a2c --- /dev/null +++ b/test/compile_errors/stage1/obj/negate_wrap_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + _ = -%a; +} + +// negate wrap on undefined value +// +// tmp.zig:3:11: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/negation_overflow_in_function_evaluation.zig b/test/compile_errors/stage1/obj/negation_overflow_in_function_evaluation.zig new file mode 100644 index 0000000000000000000000000000000000000000..ca69b6fb5d86edf3d8c15686bb97454dfe96cead --- /dev/null +++ b/test/compile_errors/stage1/obj/negation_overflow_in_function_evaluation.zig @@ -0,0 +1,10 @@ +const y = neg(-128); +fn neg(x: i8) i8 { + return -x; +} + +export fn entry() usize { return @sizeOf(@TypeOf(y)); } + +// negation overflow in function evaluation +// +// tmp.zig:3:12: error: negation caused overflow diff --git a/test/compile_errors/stage1/obj/nested_error_set_mismatch.zig b/test/compile_errors/stage1/obj/nested_error_set_mismatch.zig new file mode 100644 index 0000000000000000000000000000000000000000..6c677049dfc5c45e71762fa35f0d528229180443 --- /dev/null +++ b/test/compile_errors/stage1/obj/nested_error_set_mismatch.zig @@ -0,0 +1,18 @@ +const NextError = error{NextError}; +const OtherError = error{OutOfMemory}; + +export fn entry() void { + const a: ?NextError!i32 = foo(); + _ = a; +} + +fn foo() ?OtherError!i32 { + return null; +} + +// nested error set mismatch +// +// tmp.zig:5:34: error: expected type '?NextError!i32', found '?OtherError!i32' +// tmp.zig:5:34: note: optional type child 'OtherError!i32' cannot cast into optional type child 'NextError!i32' +// tmp.zig:5:34: note: error set 'OtherError' cannot cast into error set 'NextError' +// tmp.zig:2:26: note: 'error.OutOfMemory' not a member of destination error set diff --git a/test/compile_errors/stage1/obj/no_else_prong_on_switch_on_global_error_set.zig b/test/compile_errors/stage1/obj/no_else_prong_on_switch_on_global_error_set.zig new file mode 100644 index 0000000000000000000000000000000000000000..7de3f189f08b08af8ac467cc070647baa805c987 --- /dev/null +++ b/test/compile_errors/stage1/obj/no_else_prong_on_switch_on_global_error_set.zig @@ -0,0 +1,12 @@ +export fn entry() void { + foo(error.A); +} +fn foo(a: anyerror) void { + switch (a) { + error.A => {}, + } +} + +// no else prong on switch on global error set +// +// tmp.zig:5:5: error: else prong required when switching on type 'anyerror' diff --git a/test/compile_errors/stage1/obj/noalias_on_non_pointer_param.zig b/test/compile_errors/stage1/obj/noalias_on_non_pointer_param.zig new file mode 100644 index 0000000000000000000000000000000000000000..3419dc8c99590c8a97ba528dc6a4de7129a5c4d6 --- /dev/null +++ b/test/compile_errors/stage1/obj/noalias_on_non_pointer_param.zig @@ -0,0 +1,6 @@ +fn f(noalias x: i32) void { _ = x; } +export fn entry() void { f(1234); } + +// noalias on non pointer param +// +// tmp.zig:1:6: error: noalias on non-pointer parameter diff --git a/test/compile_errors/stage1/obj/non-async_function_pointer_eventually_is_inferred_to_become_async.zig b/test/compile_errors/stage1/obj/non-async_function_pointer_eventually_is_inferred_to_become_async.zig new file mode 100644 index 0000000000000000000000000000000000000000..93391daaefc0dc9f959912ce15e44f0f27fb714b --- /dev/null +++ b/test/compile_errors/stage1/obj/non-async_function_pointer_eventually_is_inferred_to_become_async.zig @@ -0,0 +1,13 @@ +export fn a() void { + var non_async_fn: fn () void = undefined; + non_async_fn = func; +} +fn func() void { + suspend {} +} + +// non-async function pointer eventually is inferred to become async +// +// tmp.zig:5:1: error: 'func' cannot be async +// tmp.zig:3:20: note: required to be non-async here +// tmp.zig:6:5: note: suspends here diff --git a/test/compile_errors/stage1/obj/non-const_expression_function_call_with_struct_return_value_outside_function.zig b/test/compile_errors/stage1/obj/non-const_expression_function_call_with_struct_return_value_outside_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..d6a463e71fc9e84bbbdaf32dd5d802b1218dab7c --- /dev/null +++ b/test/compile_errors/stage1/obj/non-const_expression_function_call_with_struct_return_value_outside_function.zig @@ -0,0 +1,15 @@ +const Foo = struct { + x: i32, +}; +const a = get_it(); +fn get_it() Foo { + global_side_effect = true; + return Foo {.x = 13}; +} +var global_side_effect = false; + +export fn entry() usize { return @sizeOf(@TypeOf(a)); } + +// non-const expression function call with struct return value outside function +// +// tmp.zig:6:26: error: unable to evaluate constant expression diff --git a/test/compile_errors/stage1/obj/non-const_expression_in_struct_literal_outside_function.zig b/test/compile_errors/stage1/obj/non-const_expression_in_struct_literal_outside_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..ef7b1309c3a0d337e56ae52a7bd977ab86449403 --- /dev/null +++ b/test/compile_errors/stage1/obj/non-const_expression_in_struct_literal_outside_function.zig @@ -0,0 +1,11 @@ +const Foo = struct { + x: i32, +}; +const a = Foo {.x = get_it()}; +extern fn get_it() i32; + +export fn entry() usize { return @sizeOf(@TypeOf(a)); } + +// non-const expression in struct literal outside function +// +// tmp.zig:4:21: error: unable to evaluate constant expression diff --git a/test/compile_errors/stage1/obj/non-const_switch_number_literal.zig b/test/compile_errors/stage1/obj/non-const_switch_number_literal.zig new file mode 100644 index 0000000000000000000000000000000000000000..aecaa7dcb69bce8ffe66f6f2d402da44c0c00e51 --- /dev/null +++ b/test/compile_errors/stage1/obj/non-const_switch_number_literal.zig @@ -0,0 +1,15 @@ +export fn foo() void { + const x = switch (bar()) { + 1, 2 => 1, + 3, 4 => 2, + else => 3, + }; + _ = x; +} +fn bar() i32 { + return 2; +} + +// non-const switch number literal +// +// tmp.zig:5:17: error: cannot store runtime value in type 'comptime_int' diff --git a/test/compile_errors/stage1/obj/non-const_variables_of_things_that_require_const_variables.zig b/test/compile_errors/stage1/obj/non-const_variables_of_things_that_require_const_variables.zig new file mode 100644 index 0000000000000000000000000000000000000000..0598e04e4bcd07310a3992e6ebcbb3234799cfae --- /dev/null +++ b/test/compile_errors/stage1/obj/non-const_variables_of_things_that_require_const_variables.zig @@ -0,0 +1,49 @@ +export fn entry1() void { + var m2 = &2; + _ = m2; +} +export fn entry2() void { + var a = undefined; + _ = a; +} +export fn entry3() void { + var b = 1; + _ = b; +} +export fn entry4() void { + var c = 1.0; + _ = c; +} +export fn entry5() void { + var d = null; + _ = d; +} +export fn entry6(opaque_: *Opaque) void { + var e = opaque_.*; + _ = e; +} +export fn entry7() void { + var f = i32; + _ = f; +} +export fn entry8() void { + var h = (Foo {}).bar; + _ = h; +} +const Opaque = opaque {}; +const Foo = struct { + fn bar(self: *const Foo) void {_ = self;} +}; + +// non-const variables of things that require const variables +// +// tmp.zig:2:4: error: variable of type '*const comptime_int' must be const or comptime +// tmp.zig:6:4: error: variable of type '@Type(.Undefined)' must be const or comptime +// tmp.zig:10:4: error: variable of type 'comptime_int' must be const or comptime +// tmp.zig:10:4: note: to modify this variable at runtime, it must be given an explicit fixed-size number type +// tmp.zig:14:4: error: variable of type 'comptime_float' must be const or comptime +// tmp.zig:14:4: note: to modify this variable at runtime, it must be given an explicit fixed-size number type +// tmp.zig:18:4: error: variable of type '@Type(.Null)' must be const or comptime +// tmp.zig:22:4: error: variable of type 'Opaque' not allowed +// tmp.zig:26:4: error: variable of type 'type' must be const or comptime +// tmp.zig:30:4: error: variable of type '(bound fn(*const Foo) void)' must be const or comptime diff --git a/test/compile_errors/stage1/obj/non-enum_tag_type_passed_to_union.zig b/test/compile_errors/stage1/obj/non-enum_tag_type_passed_to_union.zig new file mode 100644 index 0000000000000000000000000000000000000000..3161f16b28ea7e8a8d6e531534ce706bee2c8ff9 --- /dev/null +++ b/test/compile_errors/stage1/obj/non-enum_tag_type_passed_to_union.zig @@ -0,0 +1,11 @@ +const Foo = union(u32) { + A: i32, +}; +export fn entry() void { + const x = @typeInfo(Foo).Union.tag_type.?; + _ = x; +} + +// non-enum tag type passed to union +// +// tmp.zig:1:19: error: expected enum tag type, found 'u32' diff --git a/test/compile_errors/stage1/obj/non-extern_function_with_var_args.zig b/test/compile_errors/stage1/obj/non-extern_function_with_var_args.zig new file mode 100644 index 0000000000000000000000000000000000000000..02b99383c11b7d4ccc7b8ee664803c7607b83514 --- /dev/null +++ b/test/compile_errors/stage1/obj/non-extern_function_with_var_args.zig @@ -0,0 +1,8 @@ +fn foo(args: ...) void {} +export fn entry() void { + foo(); +} + +// non-extern function with var args +// +// tmp.zig:1:14: error: expected type expression, found '...' diff --git a/test/compile_errors/stage1/obj/non-inline_for_loop_on_a_type_that_requires_comptime.zig b/test/compile_errors/stage1/obj/non-inline_for_loop_on_a_type_that_requires_comptime.zig new file mode 100644 index 0000000000000000000000000000000000000000..9190e7cea8910d8e64bd19a40450944b9b5962cf --- /dev/null +++ b/test/compile_errors/stage1/obj/non-inline_for_loop_on_a_type_that_requires_comptime.zig @@ -0,0 +1,12 @@ +const Foo = struct { + name: []const u8, + T: type, +}; +export fn entry() void { + const xx: [2]Foo = undefined; + for (xx) |f| { _ = f;} +} + +// non-inline for loop on a type that requires comptime +// +// tmp.zig:7:5: error: values of type 'Foo' must be comptime known, but index value is runtime known diff --git a/test/compile_errors/stage1/obj/non-integer_tag_type_to_automatic_union_enum.zig b/test/compile_errors/stage1/obj/non-integer_tag_type_to_automatic_union_enum.zig new file mode 100644 index 0000000000000000000000000000000000000000..a84ca36f6cf15f95471cdc15d9615502f8c50ebb --- /dev/null +++ b/test/compile_errors/stage1/obj/non-integer_tag_type_to_automatic_union_enum.zig @@ -0,0 +1,11 @@ +const Foo = union(enum(f32)) { + A: i32, +}; +export fn entry() void { + const x = @typeInfo(Foo).Union.tag_type.?; + _ = x; +} + +// non-integer tag type to automatic union enum +// +// tmp.zig:1:24: error: expected integer tag type, found 'f32' diff --git a/test/compile_errors/stage1/obj/non-pure_function_returns_type.zig b/test/compile_errors/stage1/obj/non-pure_function_returns_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..0925207b9f8dc118731ba5b2ed9415e62577a9fa --- /dev/null +++ b/test/compile_errors/stage1/obj/non-pure_function_returns_type.zig @@ -0,0 +1,22 @@ +var a: u32 = 0; +pub fn List(comptime T: type) type { + a += 1; + return SmallList(T, 8); +} + +pub fn SmallList(comptime T: type, comptime STATIC_SIZE: usize) type { + return struct { + items: []T, + length: usize, + prealloc_items: [STATIC_SIZE]T, + }; +} + +export fn function_with_return_type_type() void { + var list: List(i32) = undefined; + list.length = 10; +} + +// non-pure function returns type +// +// tmp.zig:3:7: error: unable to evaluate constant expression diff --git a/test/compile_errors/stage1/obj/non_async_function_pointer_passed_to_asyncCall.zig b/test/compile_errors/stage1/obj/non_async_function_pointer_passed_to_asyncCall.zig new file mode 100644 index 0000000000000000000000000000000000000000..73c4fd96ca1f21f9f328b56d7bb90bbaf0c87ce1 --- /dev/null +++ b/test/compile_errors/stage1/obj/non_async_function_pointer_passed_to_asyncCall.zig @@ -0,0 +1,10 @@ +export fn entry() void { + var ptr = afunc; + var bytes: [100]u8 align(16) = undefined; + _ = @asyncCall(&bytes, {}, ptr, .{}); +} +fn afunc() void { } + +// non async function pointer passed to @asyncCall +// +// tmp.zig:4:32: error: expected async function, found 'fn() void' diff --git a/test/compile_errors/stage1/obj/non_compile_time_array_concatenation.zig b/test/compile_errors/stage1/obj/non_compile_time_array_concatenation.zig new file mode 100644 index 0000000000000000000000000000000000000000..c119cc03f7b0a803706841e8d3083e73b6314e67 --- /dev/null +++ b/test/compile_errors/stage1/obj/non_compile_time_array_concatenation.zig @@ -0,0 +1,9 @@ +fn f() []u8 { + return s ++ "foo"; +} +var s: [10]u8 = undefined; +export fn entry() usize { return @sizeOf(@TypeOf(f)); } + +// non compile time array concatenation +// +// tmp.zig:2:12: error: unable to evaluate constant expression diff --git a/test/compile_errors/stage1/obj/non_constant_expression_in_array_size.zig b/test/compile_errors/stage1/obj/non_constant_expression_in_array_size.zig new file mode 100644 index 0000000000000000000000000000000000000000..fe289212653063052e539f896d3a91107230342f --- /dev/null +++ b/test/compile_errors/stage1/obj/non_constant_expression_in_array_size.zig @@ -0,0 +1,12 @@ +const Foo = struct { + y: [get()]u8, +}; +var global_var: usize = 1; +fn get() usize { return global_var; } + +export fn entry() usize { return @sizeOf(@TypeOf(Foo)); } + +// non constant expression in array size +// +// tmp.zig:5:25: error: cannot store runtime value in compile time variable +// tmp.zig:2:12: note: called from here diff --git a/test/compile_errors/stage1/obj/non_error_sets_used_in_merge_error_sets_operator.zig b/test/compile_errors/stage1/obj/non_error_sets_used_in_merge_error_sets_operator.zig new file mode 100644 index 0000000000000000000000000000000000000000..c600bea8b0cbceec4588e7618de2eefc985e99b9 --- /dev/null +++ b/test/compile_errors/stage1/obj/non_error_sets_used_in_merge_error_sets_operator.zig @@ -0,0 +1,15 @@ +export fn foo() void { + const Errors = u8 || u16; + _ = Errors; +} +export fn bar() void { + const Errors = error{} || u16; + _ = Errors; +} + +// non error sets used in merge error sets operator +// +// tmp.zig:2:20: error: expected error set type, found type 'u8' +// tmp.zig:2:23: note: `||` merges error sets; `or` performs boolean OR +// tmp.zig:6:31: error: expected error set type, found type 'u16' +// tmp.zig:6:28: note: `||` merges error sets; `or` performs boolean OR diff --git a/test/compile_errors/stage1/obj/non_float_passed_to_floatToInt.zig b/test/compile_errors/stage1/obj/non_float_passed_to_floatToInt.zig new file mode 100644 index 0000000000000000000000000000000000000000..cad658ba5a7e564007631f6231f673e08f7f57f0 --- /dev/null +++ b/test/compile_errors/stage1/obj/non_float_passed_to_floatToInt.zig @@ -0,0 +1,8 @@ +export fn entry() void { + const x = @floatToInt(i32, @as(i32, 54)); + _ = x; +} + +// non float passed to @floatToInt +// +// tmp.zig:2:32: error: expected float type, found 'i32' diff --git a/test/compile_errors/stage1/obj/non_int_passed_to_intToFloat.zig b/test/compile_errors/stage1/obj/non_int_passed_to_intToFloat.zig new file mode 100644 index 0000000000000000000000000000000000000000..8b985c2b0beb305f1b439e86ca356b5cc668b027 --- /dev/null +++ b/test/compile_errors/stage1/obj/non_int_passed_to_intToFloat.zig @@ -0,0 +1,8 @@ +export fn entry() void { + const x = @intToFloat(f32, 1.1); + _ = x; +} + +// non int passed to @intToFloat +// +// tmp.zig:2:32: error: expected int type, found 'comptime_float' diff --git a/test/compile_errors/stage1/obj/non_pointer_given_to_ptrToInt.zig b/test/compile_errors/stage1/obj/non_pointer_given_to_ptrToInt.zig new file mode 100644 index 0000000000000000000000000000000000000000..1d4d3087da758dff83df11380b693fbdbc2c7885 --- /dev/null +++ b/test/compile_errors/stage1/obj/non_pointer_given_to_ptrToInt.zig @@ -0,0 +1,7 @@ +export fn entry(x: i32) usize { + return @ptrToInt(x); +} + +// non pointer given to @ptrToInt +// +// tmp.zig:2:22: error: expected pointer, found 'i32' diff --git a/test/compile_errors/stage1/obj/normal_string_with_newline.zig b/test/compile_errors/stage1/obj/normal_string_with_newline.zig new file mode 100644 index 0000000000000000000000000000000000000000..dafc041744fdf87cfdd8179bee1373643b641d9b --- /dev/null +++ b/test/compile_errors/stage1/obj/normal_string_with_newline.zig @@ -0,0 +1,7 @@ +const foo = "a +b"; + +// normal string with newline +// +// tmp.zig:1:13: error: expected expression, found 'invalid bytes' +// tmp.zig:1:15: note: invalid byte: '\n' diff --git a/test/compile_errors/stage1/obj/offsetOf-bad_field_name.zig b/test/compile_errors/stage1/obj/offsetOf-bad_field_name.zig new file mode 100644 index 0000000000000000000000000000000000000000..3b301e2677306ddba01b2eedbd08a307d7c7d675 --- /dev/null +++ b/test/compile_errors/stage1/obj/offsetOf-bad_field_name.zig @@ -0,0 +1,10 @@ +const Foo = struct { + derp: i32, +}; +export fn foo() usize { + return @offsetOf(Foo, "a",); +} + +// @offsetOf - bad field name +// +// tmp.zig:5:27: error: struct 'Foo' has no field 'a' diff --git a/test/compile_errors/stage1/obj/offsetOf-non_struct.zig b/test/compile_errors/stage1/obj/offsetOf-non_struct.zig new file mode 100644 index 0000000000000000000000000000000000000000..173119407ab0e9b1c0b0bb28e60cd4ab73580069 --- /dev/null +++ b/test/compile_errors/stage1/obj/offsetOf-non_struct.zig @@ -0,0 +1,8 @@ +const Foo = i32; +export fn foo() usize { + return @offsetOf(Foo, "a",); +} + +// @offsetOf - non struct +// +// tmp.zig:3:22: error: expected struct type, found 'i32' diff --git a/test/compile_errors/stage1/obj/only_equality_binary_operator_allowed_for_error_sets.zig b/test/compile_errors/stage1/obj/only_equality_binary_operator_allowed_for_error_sets.zig new file mode 100644 index 0000000000000000000000000000000000000000..58512ef2a6e8e7c86e489b7f969fe08e69ebac84 --- /dev/null +++ b/test/compile_errors/stage1/obj/only_equality_binary_operator_allowed_for_error_sets.zig @@ -0,0 +1,8 @@ +comptime { + const z = error.A > error.B; + _ = z; +} + +// only equality binary operator allowed for error sets +// +// tmp.zig:2:23: error: operator not allowed for errors diff --git a/test/compile_errors/stage1/obj/opaque_type_with_field.zig b/test/compile_errors/stage1/obj/opaque_type_with_field.zig new file mode 100644 index 0000000000000000000000000000000000000000..748d5c0736b473f36977afe7485c606a0e50516a --- /dev/null +++ b/test/compile_errors/stage1/obj/opaque_type_with_field.zig @@ -0,0 +1,9 @@ +const Opaque = opaque { foo: i32 }; +export fn entry() void { + const foo: ?*Opaque = null; + _ = foo; +} + +// opaque type with field +// +// tmp.zig:1:25: error: opaque types cannot have fields diff --git a/test/compile_errors/stage1/obj/optional_pointer_to_void_in_extern_struct.zig b/test/compile_errors/stage1/obj/optional_pointer_to_void_in_extern_struct.zig new file mode 100644 index 0000000000000000000000000000000000000000..f4ebb577d9ebf0b70d5d861276756c6b6ea96509 --- /dev/null +++ b/test/compile_errors/stage1/obj/optional_pointer_to_void_in_extern_struct.zig @@ -0,0 +1,12 @@ +const Foo = extern struct { + x: ?*const void, +}; +const Bar = extern struct { + foo: Foo, + y: i32, +}; +export fn entry(bar: *Bar) void {_ = bar;} + +// optional pointer to void in extern struct +// +// tmp.zig:2:5: error: extern structs cannot contain fields of type '?*const void' diff --git a/test/compile_errors/stage1/obj/or_on_undefined_value.zig b/test/compile_errors/stage1/obj/or_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..ac636bff9ed338bcedb5891b8dc3071c7201fe48 --- /dev/null +++ b/test/compile_errors/stage1/obj/or_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: bool = undefined; + _ = a or a; +} + +// or on undefined value +// +// tmp.zig:3:9: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/orelse_on_undefined_value.zig b/test/compile_errors/stage1/obj/orelse_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..28e7c4b425fa1d60cfb6ea138fad350f15c556ae --- /dev/null +++ b/test/compile_errors/stage1/obj/orelse_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: ?bool = undefined; + _ = a orelse false; +} + +// orelse on undefined value +// +// tmp.zig:3:11: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/out_of_range_comptime_int_passed_to_floatToInt.zig b/test/compile_errors/stage1/obj/out_of_range_comptime_int_passed_to_floatToInt.zig new file mode 100644 index 0000000000000000000000000000000000000000..581bb58ffd86f7b7fe42ffcb28a020cfdd17fc93 --- /dev/null +++ b/test/compile_errors/stage1/obj/out_of_range_comptime_int_passed_to_floatToInt.zig @@ -0,0 +1,8 @@ +export fn entry() void { + const x = @floatToInt(i8, 200); + _ = x; +} + +// out of range comptime_int passed to @floatToInt +// +// tmp.zig:2:31: error: integer value 200 cannot be coerced to type 'i8' diff --git a/test/compile_errors/stage1/obj/overflow_in_enum_value_allocation.zig b/test/compile_errors/stage1/obj/overflow_in_enum_value_allocation.zig new file mode 100644 index 0000000000000000000000000000000000000000..5c737e06a2b8be21ad670bda7e08c68efa3a6def --- /dev/null +++ b/test/compile_errors/stage1/obj/overflow_in_enum_value_allocation.zig @@ -0,0 +1,12 @@ +const Moo = enum(u8) { + Last = 255, + Over, +}; +pub fn main() void { + var y = Moo.Last; + _ = y; +} + +// overflow in enum value allocation +// +// tmp.zig:3:5: error: enumeration value 256 too large for type 'u8' diff --git a/test/compile_errors/stage1/obj/packed_union_given_enum_tag_type.zig b/test/compile_errors/stage1/obj/packed_union_given_enum_tag_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..f0bc445295d3be72b74d5874aa59502a8d26debf --- /dev/null +++ b/test/compile_errors/stage1/obj/packed_union_given_enum_tag_type.zig @@ -0,0 +1,18 @@ +const Letter = enum { + A, + B, + C, +}; +const Payload = packed union(Letter) { + A: i32, + B: f64, + C: bool, +}; +export fn entry() void { + var a = Payload { .A = 1234 }; + _ = a; +} + +// packed union given enum tag type +// +// tmp.zig:6:30: error: packed union does not support enum tag type diff --git a/test/compile_errors/stage1/obj/packed_union_with_automatic_layout_field.zig b/test/compile_errors/stage1/obj/packed_union_with_automatic_layout_field.zig new file mode 100644 index 0000000000000000000000000000000000000000..4450531a5ba91e9386dc23b1b87af29c37a9a096 --- /dev/null +++ b/test/compile_errors/stage1/obj/packed_union_with_automatic_layout_field.zig @@ -0,0 +1,16 @@ +const Foo = struct { + a: u32, + b: f32, +}; +const Payload = packed union { + A: Foo, + B: bool, +}; +export fn entry() void { + var a = Payload { .B = true }; + _ = a; +} + +// packed union with automatic layout field +// +// tmp.zig:6:5: error: non-packed, non-extern struct 'Foo' not allowed in packed union; no guaranteed in-memory representation diff --git a/test/compile_errors/stage1/obj/panic_called_at_compile_time.zig b/test/compile_errors/stage1/obj/panic_called_at_compile_time.zig new file mode 100644 index 0000000000000000000000000000000000000000..6dd32cdf5914e08ea055b0d8c31312a0f411dbfb --- /dev/null +++ b/test/compile_errors/stage1/obj/panic_called_at_compile_time.zig @@ -0,0 +1,9 @@ +export fn entry() void { + comptime { + @panic("aoeu",); + } +} + +// @panic called at compile time +// +// tmp.zig:3:9: error: encountered @panic at compile-time diff --git a/test/compile_errors/stage1/obj/parameter_redeclaration.zig b/test/compile_errors/stage1/obj/parameter_redeclaration.zig new file mode 100644 index 0000000000000000000000000000000000000000..01fc507afc8ed71f895017cef91cfbe80478ed7d --- /dev/null +++ b/test/compile_errors/stage1/obj/parameter_redeclaration.zig @@ -0,0 +1,8 @@ +fn f(a : i32, a : i32) void { +} +export fn entry() void { f(1, 2); } + +// parameter redeclaration +// +// tmp.zig:1:15: error: redeclaration of function parameter 'a' +// tmp.zig:1:6: note: previous declaration here diff --git a/test/compile_errors/stage1/obj/parameter_shadowing_global.zig b/test/compile_errors/stage1/obj/parameter_shadowing_global.zig new file mode 100644 index 0000000000000000000000000000000000000000..a58a0b93cedfa7d0679d10d823cc7fa6aac202c2 --- /dev/null +++ b/test/compile_errors/stage1/obj/parameter_shadowing_global.zig @@ -0,0 +1,10 @@ +const Foo = struct {}; +fn f(Foo: i32) void {} +export fn entry() void { + f(1234); +} + +// parameter shadowing global +// +// tmp.zig:2:6: error: local shadows declaration of 'Foo' +// tmp.zig:1:1: note: declared here diff --git a/test/compile_errors/stage1/obj/pass_const_ptr_to_mutable_ptr_fn.zig b/test/compile_errors/stage1/obj/pass_const_ptr_to_mutable_ptr_fn.zig new file mode 100644 index 0000000000000000000000000000000000000000..ff0057bb4876e35b5967476ec98a06b4ec442d00 --- /dev/null +++ b/test/compile_errors/stage1/obj/pass_const_ptr_to_mutable_ptr_fn.zig @@ -0,0 +1,15 @@ +fn foo() bool { + const a = @as([]const u8, "a",); + const b = &a; + return ptrEql(b, b); +} +fn ptrEql(a: *[]const u8, b: *[]const u8) bool { + _ = a; _ = b; + return true; +} + +export fn entry() usize { return @sizeOf(@TypeOf(foo)); } + +// pass const ptr to mutable ptr fn +// +// tmp.zig:4:19: error: expected type '*[]const u8', found '*const []const u8' diff --git a/test/compile_errors/stage1/obj/passing_a_not-aligned-enough_pointer_to_cmpxchg.zig b/test/compile_errors/stage1/obj/passing_a_not-aligned-enough_pointer_to_cmpxchg.zig new file mode 100644 index 0000000000000000000000000000000000000000..40564998b7ec41cc94c67b7acc05354e085d335b --- /dev/null +++ b/test/compile_errors/stage1/obj/passing_a_not-aligned-enough_pointer_to_cmpxchg.zig @@ -0,0 +1,10 @@ +const AtomicOrder = @import("std").builtin.AtomicOrder; +export fn entry() bool { + var x: i32 align(1) = 1234; + while (!@cmpxchgWeak(i32, &x, 1234, 5678, AtomicOrder.SeqCst, AtomicOrder.SeqCst)) {} + return x == 5678; +} + +// passing a not-aligned-enough pointer to cmpxchg +// +// tmp.zig:4:32: error: expected type '*i32', found '*align(1) i32' diff --git a/test/compile_errors/stage1/obj/passing_an_under-aligned_function_pointer.zig b/test/compile_errors/stage1/obj/passing_an_under-aligned_function_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..f6c0e52cc01bcc9cd2740ef2e4fd8b5fe3226216 --- /dev/null +++ b/test/compile_errors/stage1/obj/passing_an_under-aligned_function_pointer.zig @@ -0,0 +1,11 @@ +export fn entry() void { + testImplicitlyDecreaseFnAlign(alignedSmall, 1234); +} +fn testImplicitlyDecreaseFnAlign(ptr: fn () align(8) i32, answer: i32) void { + if (ptr() != answer) unreachable; +} +fn alignedSmall() align(4) i32 { return 1234; } + +// passing an under-aligned function pointer +// +// tmp.zig:2:35: error: expected type 'fn() align(8) i32', found 'fn() align(4) i32' diff --git a/test/compile_errors/stage1/obj/peer_cast_then_implicit_cast_const_pointer_to_mutable_C_pointer.zig b/test/compile_errors/stage1/obj/peer_cast_then_implicit_cast_const_pointer_to_mutable_C_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..78f072c0d077032df6b85b6eeb8c78a6b635d273 --- /dev/null +++ b/test/compile_errors/stage1/obj/peer_cast_then_implicit_cast_const_pointer_to_mutable_C_pointer.zig @@ -0,0 +1,9 @@ +export fn func() void { + var strValue: [*c]u8 = undefined; + strValue = strValue orelse ""; +} + +// peer cast then implicit cast const pointer to mutable C pointer +// +// tmp.zig:3:32: error: expected type '[*c]u8', found '*const [0:0]u8' +// tmp.zig:3:32: note: cast discards const qualifier diff --git a/test/compile_errors/stage1/obj/pointer_arithmetic_on_pointer-to-array.zig b/test/compile_errors/stage1/obj/pointer_arithmetic_on_pointer-to-array.zig new file mode 100644 index 0000000000000000000000000000000000000000..b293ae2b321b9cd71a92646789aae16f2e1c4511 --- /dev/null +++ b/test/compile_errors/stage1/obj/pointer_arithmetic_on_pointer-to-array.zig @@ -0,0 +1,10 @@ +export fn foo() void { + var x: [10]u8 = undefined; + var y = &x; + var z = y + 1; + _ = z; +} + +// pointer arithmetic on pointer-to-array +// +// tmp.zig:4:17: error: integer value 1 cannot be coerced to type '*[10]u8' diff --git a/test/compile_errors/stage1/obj/pointer_attributes_checked_when_coercing_pointer_to_anon_literal.zig b/test/compile_errors/stage1/obj/pointer_attributes_checked_when_coercing_pointer_to_anon_literal.zig new file mode 100644 index 0000000000000000000000000000000000000000..079844ac7ffa06b5808391b6868475616b3dfeec --- /dev/null +++ b/test/compile_errors/stage1/obj/pointer_attributes_checked_when_coercing_pointer_to_anon_literal.zig @@ -0,0 +1,22 @@ +comptime { + const c: [][]const u8 = &.{"hello", "world" }; + _ = c; +} +comptime { + const c: *[2][]const u8 = &.{"hello", "world" }; + _ = c; +} +const S = struct {a: u8 = 1, b: u32 = 2}; +comptime { + const c: *S = &.{}; + _ = c; +} + +// pointer attributes checked when coercing pointer to anon literal +// +// tmp.zig:2:31: error: cannot cast pointer to array literal to slice type '[][]const u8' +// tmp.zig:2:31: note: cast discards const qualifier +// tmp.zig:6:33: error: cannot cast pointer to array literal to '*[2][]const u8' +// tmp.zig:6:33: note: cast discards const qualifier +// tmp.zig:11:21: error: expected type '*S', found '*const struct:11:21' +// tmp.zig:11:21: note: cast discards const qualifier diff --git a/test/compile_errors/stage1/obj/pointer_to_noreturn.zig b/test/compile_errors/stage1/obj/pointer_to_noreturn.zig new file mode 100644 index 0000000000000000000000000000000000000000..3b945919fcfe85515e59fff0d820009f5f915eb0 --- /dev/null +++ b/test/compile_errors/stage1/obj/pointer_to_noreturn.zig @@ -0,0 +1,6 @@ +fn a() *noreturn {} +export fn entry() void { _ = a(); } + +// pointer to noreturn +// +// tmp.zig:1:9: error: pointer to noreturn not allowed diff --git a/test/compile_errors/stage1/obj/popCount-non-integer.zig b/test/compile_errors/stage1/obj/popCount-non-integer.zig new file mode 100644 index 0000000000000000000000000000000000000000..694b7949270db70a11f2c5586cb0a3dc72e50f08 --- /dev/null +++ b/test/compile_errors/stage1/obj/popCount-non-integer.zig @@ -0,0 +1,7 @@ +export fn entry(x: f32) u32 { + return @popCount(f32, x); +} + +// @popCount - non-integer +// +// tmp.zig:2:22: error: expected integer type, found 'f32' diff --git a/test/compile_errors/stage1/obj/prevent_bad_implicit_casting_of_anyframe_types.zig b/test/compile_errors/stage1/obj/prevent_bad_implicit_casting_of_anyframe_types.zig new file mode 100644 index 0000000000000000000000000000000000000000..14bdb9cb1148a12a88bc8de7708ef01149f7a18c --- /dev/null +++ b/test/compile_errors/stage1/obj/prevent_bad_implicit_casting_of_anyframe_types.zig @@ -0,0 +1,22 @@ +export fn a() void { + var x: anyframe = undefined; + var y: anyframe->i32 = x; + _ = y; +} +export fn b() void { + var x: i32 = undefined; + var y: anyframe->i32 = x; + _ = y; +} +export fn c() void { + var x: @Frame(func) = undefined; + var y: anyframe->i32 = &x; + _ = y; +} +fn func() void {} + +// prevent bad implicit casting of anyframe types +// +// tmp.zig:3:28: error: expected type 'anyframe->i32', found 'anyframe' +// tmp.zig:8:28: error: expected type 'anyframe->i32', found 'i32' +// tmp.zig:13:29: error: expected type 'anyframe->i32', found '*@Frame(func)' diff --git a/test/compile_errors/stage1/obj/primitives_take_precedence_over_declarations.zig b/test/compile_errors/stage1/obj/primitives_take_precedence_over_declarations.zig new file mode 100644 index 0000000000000000000000000000000000000000..3517c07917e9ee012afaeb30e461aafcb8050b12 --- /dev/null +++ b/test/compile_errors/stage1/obj/primitives_take_precedence_over_declarations.zig @@ -0,0 +1,9 @@ +const @"u8" = u16; +export fn entry() void { + const a: u8 = 300; + _ = a; +} + +// primitives take precedence over declarations +// +// tmp.zig:3:19: error: integer value 300 cannot be coerced to type 'u8' diff --git a/test/compile_errors/stage1/obj/ptrCast_a_0_bit_type_to_a_non-_0_bit_type.zig b/test/compile_errors/stage1/obj/ptrCast_a_0_bit_type_to_a_non-_0_bit_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..63d0656f21a2a5dbe725cb507119dec68398b037 --- /dev/null +++ b/test/compile_errors/stage1/obj/ptrCast_a_0_bit_type_to_a_non-_0_bit_type.zig @@ -0,0 +1,11 @@ +export fn entry() bool { + var x: u0 = 0; + const p = @ptrCast(?*u0, &x); + return p == null; +} + +// @ptrCast a 0 bit type to a non- 0 bit type +// +// tmp.zig:3:15: error: '*u0' and '?*u0' do not have the same in-memory representation +// tmp.zig:3:31: note: '*u0' has no in-memory bits +// tmp.zig:3:24: note: '?*u0' has in-memory bits diff --git a/test/compile_errors/stage1/obj/ptrCast_discards_const_qualifier.zig b/test/compile_errors/stage1/obj/ptrCast_discards_const_qualifier.zig new file mode 100644 index 0000000000000000000000000000000000000000..1517fd4bd8d4a0b13baeeb1b185745a18a72b7af --- /dev/null +++ b/test/compile_errors/stage1/obj/ptrCast_discards_const_qualifier.zig @@ -0,0 +1,9 @@ +export fn entry() void { + const x: i32 = 1234; + const y = @ptrCast(*i32, &x); + _ = y; +} + +// @ptrCast discards const qualifier +// +// tmp.zig:3:15: error: cast discards const qualifier diff --git a/test/compile_errors/stage1/obj/ptrToInt_0_to_non_optional_pointer.zig b/test/compile_errors/stage1/obj/ptrToInt_0_to_non_optional_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..fde1e53c1a4e982eeaaeda4030192f97d48e5515 --- /dev/null +++ b/test/compile_errors/stage1/obj/ptrToInt_0_to_non_optional_pointer.zig @@ -0,0 +1,8 @@ +export fn entry() void { + var b = @intToPtr(*i32, 0); + _ = b; +} + +// @ptrToInt 0 to non optional pointer +// +// tmp.zig:2:13: error: pointer type '*i32' does not allow address zero diff --git a/test/compile_errors/stage1/obj/ptrToInt_on_void.zig b/test/compile_errors/stage1/obj/ptrToInt_on_void.zig new file mode 100644 index 0000000000000000000000000000000000000000..fd43053103e10b37ad2aff5bf0567b62f9427e07 --- /dev/null +++ b/test/compile_errors/stage1/obj/ptrToInt_on_void.zig @@ -0,0 +1,7 @@ +export fn entry() bool { + return @ptrToInt(&{}) == @ptrToInt(&{}); +} + +// @ptrToInt on *void +// +// tmp.zig:2:23: error: pointer to size 0 type has no address diff --git a/test/compile_errors/stage1/obj/ptrcast_to_non-pointer.zig b/test/compile_errors/stage1/obj/ptrcast_to_non-pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..74894d5e8a47722bd3effc6029bf6763ad5a5d36 --- /dev/null +++ b/test/compile_errors/stage1/obj/ptrcast_to_non-pointer.zig @@ -0,0 +1,7 @@ +export fn entry(a: *i32) usize { + return @ptrCast(usize, a); +} + +// ptrcast to non-pointer +// +// tmp.zig:2:21: error: expected pointer, found 'usize' diff --git a/test/compile_errors/stage1/obj/range_operator_in_switch_used_on_error_set.zig b/test/compile_errors/stage1/obj/range_operator_in_switch_used_on_error_set.zig new file mode 100644 index 0000000000000000000000000000000000000000..4f2949c50c478446e9eba29a198ac727c2f71ef0 --- /dev/null +++ b/test/compile_errors/stage1/obj/range_operator_in_switch_used_on_error_set.zig @@ -0,0 +1,17 @@ +export fn entry() void { + try foo(452) catch |err| switch (err) { + error.A ... error.B => {}, + else => {}, + }; +} +fn foo(x: i32) !void { + switch (x) { + 0 ... 10 => return error.Foo, + 11 ... 20 => return error.Bar, + else => {}, + } +} + +// range operator in switch used on error set +// +// tmp.zig:3:17: error: operator not allowed for errors diff --git a/test/compile_errors/stage1/obj/reading_past_end_of_pointer_casted_array.zig b/test/compile_errors/stage1/obj/reading_past_end_of_pointer_casted_array.zig new file mode 100644 index 0000000000000000000000000000000000000000..558797d69bbcf598427a9f174c8e9100da14f947 --- /dev/null +++ b/test/compile_errors/stage1/obj/reading_past_end_of_pointer_casted_array.zig @@ -0,0 +1,11 @@ +comptime { + const array: [4]u8 = "aoeu".*; + const sub_array = array[1..]; + const int_ptr = @ptrCast(*const u24, sub_array); + const deref = int_ptr.*; + _ = deref; +} + +// reading past end of pointer casted array +// +// tmp.zig:5:26: error: attempt to read 4 bytes from [4]u8 at index 1 which is 3 bytes diff --git a/test/compile_errors/stage1/obj/recursive_inferred_error_set.zig b/test/compile_errors/stage1/obj/recursive_inferred_error_set.zig new file mode 100644 index 0000000000000000000000000000000000000000..80598339233e5e8bc4200aa826b03962939a6f15 --- /dev/null +++ b/test/compile_errors/stage1/obj/recursive_inferred_error_set.zig @@ -0,0 +1,10 @@ +export fn entry() void { + foo() catch unreachable; +} +fn foo() !void { + try foo(); +} + +// recursive inferred error set +// +// tmp.zig:5:5: error: cannot resolve inferred error set '@typeInfo(@typeInfo(@TypeOf(foo)).Fn.return_type.?).ErrorUnion.error_set': function 'foo' not fully analyzed yet diff --git a/test/compile_errors/stage1/obj/redefinition_of_enums.zig b/test/compile_errors/stage1/obj/redefinition_of_enums.zig new file mode 100644 index 0000000000000000000000000000000000000000..b4033536c3d7ab3a408c863924f90011647dd72c --- /dev/null +++ b/test/compile_errors/stage1/obj/redefinition_of_enums.zig @@ -0,0 +1,7 @@ +const A = enum {x}; +const A = enum {x}; + +// redefinition of enums +// +// tmp.zig:2:1: error: redeclaration of 'A' +// tmp.zig:1:1: note: other declaration here diff --git a/test/compile_errors/stage1/obj/redefinition_of_global_variables.zig b/test/compile_errors/stage1/obj/redefinition_of_global_variables.zig new file mode 100644 index 0000000000000000000000000000000000000000..b2267423b0819193b22e9a594bcf327cdd2a5686 --- /dev/null +++ b/test/compile_errors/stage1/obj/redefinition_of_global_variables.zig @@ -0,0 +1,7 @@ +var a : i32 = 1; +var a : i32 = 2; + +// redefinition of global variables +// +// tmp.zig:2:1: error: redeclaration of 'a' +// tmp.zig:1:1: note: other declaration here diff --git a/test/compile_errors/stage1/obj/redefinition_of_struct.zig b/test/compile_errors/stage1/obj/redefinition_of_struct.zig new file mode 100644 index 0000000000000000000000000000000000000000..8c169356c90c43d779fb1b402eae4a7f50ff969b --- /dev/null +++ b/test/compile_errors/stage1/obj/redefinition_of_struct.zig @@ -0,0 +1,7 @@ +const A = struct { x : i32, }; +const A = struct { y : i32, }; + +// redefinition of struct +// +// tmp.zig:2:1: error: redeclaration of 'A' +// tmp.zig:1:1: note: other declaration here diff --git a/test/compile_errors/stage1/obj/refer_to_the_type_of_a_generic_function.zig b/test/compile_errors/stage1/obj/refer_to_the_type_of_a_generic_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..6e23854cd6ff1627b606b033083a7e001a8d35ad --- /dev/null +++ b/test/compile_errors/stage1/obj/refer_to_the_type_of_a_generic_function.zig @@ -0,0 +1,9 @@ +export fn entry() void { + const Func = fn (type) void; + const f: Func = undefined; + f(i32); +} + +// refer to the type of a generic function +// +// tmp.zig:4:5: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/referring_to_a_struct_that_is_invalid.zig b/test/compile_errors/stage1/obj/referring_to_a_struct_that_is_invalid.zig new file mode 100644 index 0000000000000000000000000000000000000000..5f646461d8cc241f05acb26116495e6ee371cfc5 --- /dev/null +++ b/test/compile_errors/stage1/obj/referring_to_a_struct_that_is_invalid.zig @@ -0,0 +1,15 @@ +const UsbDeviceRequest = struct { + Type: u8, +}; + +export fn foo() void { + comptime assert(@sizeOf(UsbDeviceRequest) == 0x8); +} + +fn assert(ok: bool) void { + if (!ok) unreachable; +} + +// referring to a struct that is invalid +// +// tmp.zig:10:14: error: reached unreachable code diff --git a/test/compile_errors/stage1/obj/regression_test_2980_base_type_u32_is_not_type_checked_properly_when_assigning_a_value_within_a_struct.zig b/test/compile_errors/stage1/obj/regression_test_2980_base_type_u32_is_not_type_checked_properly_when_assigning_a_value_within_a_struct.zig new file mode 100644 index 0000000000000000000000000000000000000000..a714b10ef63e31aec73a9582b39fede30d6118ba --- /dev/null +++ b/test/compile_errors/stage1/obj/regression_test_2980_base_type_u32_is_not_type_checked_properly_when_assigning_a_value_within_a_struct.zig @@ -0,0 +1,19 @@ +const Foo = struct { + ptr: ?*usize, + uval: u32, +}; +fn get_uval(x: u32) !u32 { + _ = x; + return error.NotFound; +} +export fn entry() void { + const afoo = Foo{ + .ptr = null, + .uval = get_uval(42), + }; + _ = afoo; +} + +// regression test #2980: base type u32 is not type checked properly when assigning a value within a struct +// +// tmp.zig:12:25: error: cannot convert error union to payload type. consider using `try`, `catch`, or `if`. expected type 'u32', found '@typeInfo(@typeInfo(@TypeOf(get_uval)).Fn.return_type.?).ErrorUnion.error_set!u32' diff --git a/test/compile_errors/stage1/obj/reify_type.Fn_with_is_generic_true.zig b/test/compile_errors/stage1/obj/reify_type.Fn_with_is_generic_true.zig new file mode 100644 index 0000000000000000000000000000000000000000..ed331586491ec1de17066455aeba8ee6aa858151 --- /dev/null +++ b/test/compile_errors/stage1/obj/reify_type.Fn_with_is_generic_true.zig @@ -0,0 +1,15 @@ +const Foo = @Type(.{ + .Fn = .{ + .calling_convention = .Unspecified, + .alignment = 0, + .is_generic = true, + .is_var_args = false, + .return_type = u0, + .args = &.{}, + }, +}); +comptime { _ = Foo; } + +// @Type(.Fn) with is_generic = true +// +// tmp.zig:1:20: error: Type.Fn.is_generic must be false for @Type diff --git a/test/compile_errors/stage1/obj/reify_type.Fn_with_is_var_args_true_and_non-C_callconv.zig b/test/compile_errors/stage1/obj/reify_type.Fn_with_is_var_args_true_and_non-C_callconv.zig new file mode 100644 index 0000000000000000000000000000000000000000..a57484075ffb623d5cd614b40ba004603d932c3a --- /dev/null +++ b/test/compile_errors/stage1/obj/reify_type.Fn_with_is_var_args_true_and_non-C_callconv.zig @@ -0,0 +1,15 @@ +const Foo = @Type(.{ + .Fn = .{ + .calling_convention = .Unspecified, + .alignment = 0, + .is_generic = false, + .is_var_args = true, + .return_type = u0, + .args = &.{}, + }, +}); +comptime { _ = Foo; } + +// @Type(.Fn) with is_var_args = true and non-C callconv +// +// tmp.zig:1:20: error: varargs functions must have C calling convention diff --git a/test/compile_errors/stage1/obj/reify_type.Fn_with_return_type_null.zig b/test/compile_errors/stage1/obj/reify_type.Fn_with_return_type_null.zig new file mode 100644 index 0000000000000000000000000000000000000000..f8ddea52cf27242aa7db5e7c28b7849e0ae29d9e --- /dev/null +++ b/test/compile_errors/stage1/obj/reify_type.Fn_with_return_type_null.zig @@ -0,0 +1,15 @@ +const Foo = @Type(.{ + .Fn = .{ + .calling_convention = .Unspecified, + .alignment = 0, + .is_generic = false, + .is_var_args = false, + .return_type = null, + .args = &.{}, + }, +}); +comptime { _ = Foo; } + +// @Type(.Fn) with return_type = null +// +// tmp.zig:1:20: error: Type.Fn.return_type must be non-null for @Type diff --git a/test/compile_errors/stage1/obj/reify_type.Pointer_with_invalid_address_space.zig b/test/compile_errors/stage1/obj/reify_type.Pointer_with_invalid_address_space.zig new file mode 100644 index 0000000000000000000000000000000000000000..78160fae58499725d53c6adc321cc1bda23e0e05 --- /dev/null +++ b/test/compile_errors/stage1/obj/reify_type.Pointer_with_invalid_address_space.zig @@ -0,0 +1,16 @@ +export fn entry() void { + _ = @Type(.{ .Pointer = .{ + .size = .One, + .is_const = false, + .is_volatile = false, + .alignment = 1, + .address_space = .gs, + .child = u8, + .is_allowzero = false, + .sentinel = null, + }}); +} + +// @Type(.Pointer) with invalid address space +// +// tmp.zig:2:16: error: address space 'gs' not available in stage 1 compiler, must be .generic diff --git a/test/compile_errors/stage1/obj/reify_type_for_exhaustive_enum_with_non-integer_tag_type.zig b/test/compile_errors/stage1/obj/reify_type_for_exhaustive_enum_with_non-integer_tag_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..e77c2eb6270bac6230a324a83b2b96ff14a99c4b --- /dev/null +++ b/test/compile_errors/stage1/obj/reify_type_for_exhaustive_enum_with_non-integer_tag_type.zig @@ -0,0 +1,16 @@ +const Tag = @Type(.{ + .Enum = .{ + .layout = .Auto, + .tag_type = bool, + .fields = &.{}, + .decls = &.{}, + .is_exhaustive = false, + }, +}); +export fn entry() void { + _ = @intToEnum(Tag, 0); +} + +// @Type for exhaustive enum with non-integer tag type +// +// tmp.zig:1:20: error: Type.Enum.tag_type must be an integer type, not 'bool' diff --git a/test/compile_errors/stage1/obj/reify_type_for_exhaustive_enum_with_undefined_tag_type.zig b/test/compile_errors/stage1/obj/reify_type_for_exhaustive_enum_with_undefined_tag_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..6a005163876f7b78e03b0725ee7dd6dff05cdfb4 --- /dev/null +++ b/test/compile_errors/stage1/obj/reify_type_for_exhaustive_enum_with_undefined_tag_type.zig @@ -0,0 +1,16 @@ +const Tag = @Type(.{ + .Enum = .{ + .layout = .Auto, + .tag_type = undefined, + .fields = &.{}, + .decls = &.{}, + .is_exhaustive = false, + }, +}); +export fn entry() void { + _ = @intToEnum(Tag, 0); +} + +// @Type for exhaustive enum with undefined tag type +// +// tmp.zig:1:20: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/reify_type_for_exhaustive_enum_with_zero_fields.zig b/test/compile_errors/stage1/obj/reify_type_for_exhaustive_enum_with_zero_fields.zig new file mode 100644 index 0000000000000000000000000000000000000000..87689247aa7dbfd7389ea01736e9d839fc78ec58 --- /dev/null +++ b/test/compile_errors/stage1/obj/reify_type_for_exhaustive_enum_with_zero_fields.zig @@ -0,0 +1,16 @@ +const Tag = @Type(.{ + .Enum = .{ + .layout = .Auto, + .tag_type = u1, + .fields = &.{}, + .decls = &.{}, + .is_exhaustive = true, + }, +}); +export fn entry() void { + _ = @intToEnum(Tag, 0); +} + +// @Type for exhaustive enum with zero fields +// +// tmp.zig:1:20: error: enums must have 1 or more fields diff --git a/test/compile_errors/stage1/obj/reify_type_for_tagged_union_with_extra_enum_field.zig b/test/compile_errors/stage1/obj/reify_type_for_tagged_union_with_extra_enum_field.zig new file mode 100644 index 0000000000000000000000000000000000000000..f9155d7161ec200c3ea1fdc30f29fce3fffdd4dc --- /dev/null +++ b/test/compile_errors/stage1/obj/reify_type_for_tagged_union_with_extra_enum_field.zig @@ -0,0 +1,32 @@ +const Tag = @Type(.{ + .Enum = .{ + .layout = .Auto, + .tag_type = u2, + .fields = &.{ + .{ .name = "signed", .value = 0 }, + .{ .name = "unsigned", .value = 1 }, + .{ .name = "arst", .value = 2 }, + }, + .decls = &.{}, + .is_exhaustive = true, + }, +}); +const Tagged = @Type(.{ + .Union = .{ + .layout = .Auto, + .tag_type = Tag, + .fields = &.{ + .{ .name = "signed", .field_type = i32, .alignment = @alignOf(i32) }, + .{ .name = "unsigned", .field_type = u32, .alignment = @alignOf(u32) }, + }, + .decls = &.{}, + }, +}); +export fn entry() void { + var tagged = Tagged{ .signed = -1 }; + tagged = .{ .unsigned = 1 }; +} + +// @Type for tagged union with extra enum field +// +// tmp.zig:14:23: error: enum field missing: 'arst' diff --git a/test/compile_errors/stage1/obj/reify_type_for_tagged_union_with_extra_union_field.zig b/test/compile_errors/stage1/obj/reify_type_for_tagged_union_with_extra_union_field.zig new file mode 100644 index 0000000000000000000000000000000000000000..9cd82213df9a91b8f4546cb98fcf39332c29189e --- /dev/null +++ b/test/compile_errors/stage1/obj/reify_type_for_tagged_union_with_extra_union_field.zig @@ -0,0 +1,33 @@ +const Tag = @Type(.{ + .Enum = .{ + .layout = .Auto, + .tag_type = u1, + .fields = &.{ + .{ .name = "signed", .value = 0 }, + .{ .name = "unsigned", .value = 1 }, + }, + .decls = &.{}, + .is_exhaustive = true, + }, +}); +const Tagged = @Type(.{ + .Union = .{ + .layout = .Auto, + .tag_type = Tag, + .fields = &.{ + .{ .name = "signed", .field_type = i32, .alignment = @alignOf(i32) }, + .{ .name = "unsigned", .field_type = u32, .alignment = @alignOf(u32) }, + .{ .name = "arst", .field_type = f32, .alignment = @alignOf(f32) }, + }, + .decls = &.{}, + }, +}); +export fn entry() void { + var tagged = Tagged{ .signed = -1 }; + tagged = .{ .unsigned = 1 }; +} + +// @Type for tagged union with extra union field +// +// tmp.zig:13:23: error: enum field not found: 'arst' +// tmp.zig:1:20: note: enum declared here diff --git a/test/compile_errors/stage1/obj/reify_type_for_union_with_opaque_field.zig b/test/compile_errors/stage1/obj/reify_type_for_union_with_opaque_field.zig new file mode 100644 index 0000000000000000000000000000000000000000..374ccb544b5c1ea19491e8b6920d3b8f4e8c7d06 --- /dev/null +++ b/test/compile_errors/stage1/obj/reify_type_for_union_with_opaque_field.zig @@ -0,0 +1,17 @@ +const Untagged = @Type(.{ + .Union = .{ + .layout = .Auto, + .tag_type = null, + .fields = &.{ + .{ .name = "foo", .field_type = opaque {}, .alignment = 1 }, + }, + .decls = &.{}, + }, +}); +export fn entry() void { + _ = Untagged{}; +} + +// @Type for union with opaque field +// +// tmp.zig:1:25: error: opaque types have unknown size and therefore cannot be directly embedded in unions diff --git a/test/compile_errors/stage1/obj/reify_type_for_union_with_zero_fields.zig b/test/compile_errors/stage1/obj/reify_type_for_union_with_zero_fields.zig new file mode 100644 index 0000000000000000000000000000000000000000..8243ff3292652caa96028879cec90fa7f1fec4b2 --- /dev/null +++ b/test/compile_errors/stage1/obj/reify_type_for_union_with_zero_fields.zig @@ -0,0 +1,15 @@ +const Untagged = @Type(.{ + .Union = .{ + .layout = .Auto, + .tag_type = null, + .fields = &.{}, + .decls = &.{}, + }, +}); +export fn entry() void { + _ = Untagged{}; +} + +// @Type for union with zero fields +// +// tmp.zig:1:25: error: unions must have 1 or more fields diff --git a/test/compile_errors/stage1/obj/reify_type_union_payload_is_undefined.zig b/test/compile_errors/stage1/obj/reify_type_union_payload_is_undefined.zig new file mode 100644 index 0000000000000000000000000000000000000000..43261dc32fc4c477ba3a57d61595aa2bc2d266b4 --- /dev/null +++ b/test/compile_errors/stage1/obj/reify_type_union_payload_is_undefined.zig @@ -0,0 +1,8 @@ +const Foo = @Type(.{ + .Struct = undefined, +}); +comptime { _ = Foo; } + +// @Type() union payload is undefined +// +// tmp.zig:1:20: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/reify_type_with_Type.Int.zig b/test/compile_errors/stage1/obj/reify_type_with_Type.Int.zig new file mode 100644 index 0000000000000000000000000000000000000000..cea09d3f190d6efa3e839b838d3bd8269805ee1b --- /dev/null +++ b/test/compile_errors/stage1/obj/reify_type_with_Type.Int.zig @@ -0,0 +1,11 @@ +const builtin = @import("std").builtin; +export fn entry() void { + _ = @Type(builtin.Type.Int{ + .signedness = .signed, + .bits = 8, + }); +} + +// @Type with Type.Int +// +// tmp.zig:3:31: error: expected type 'std.builtin.Type', found 'std.builtin.Type.Int' diff --git a/test/compile_errors/stage1/obj/reify_type_with_non-constant_expression.zig b/test/compile_errors/stage1/obj/reify_type_with_non-constant_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..a58b2a6b334bf5c5672f98d454f43dacb339d4ea --- /dev/null +++ b/test/compile_errors/stage1/obj/reify_type_with_non-constant_expression.zig @@ -0,0 +1,9 @@ +const builtin = @import("std").builtin; +var globalTypeInfo : builtin.Type = undefined; +export fn entry() void { + _ = @Type(globalTypeInfo); +} + +// @Type with non-constant expression +// +// tmp.zig:4:15: error: unable to evaluate constant expression diff --git a/test/compile_errors/stage1/obj/reify_type_with_undefined.zig b/test/compile_errors/stage1/obj/reify_type_with_undefined.zig new file mode 100644 index 0000000000000000000000000000000000000000..984c9ac555192fac13beff06b6e913e0904cf111 --- /dev/null +++ b/test/compile_errors/stage1/obj/reify_type_with_undefined.zig @@ -0,0 +1,18 @@ +comptime { + _ = @Type(.{ .Array = .{ .len = 0, .child = u8, .sentinel = undefined } }); +} +comptime { + _ = @Type(.{ + .Struct = .{ + .fields = undefined, + .decls = undefined, + .is_tuple = false, + .layout = .Auto, + }, + }); +} + +// @Type with undefined +// +// tmp.zig:2:16: error: use of undefined value here causes undefined behavior +// tmp.zig:5:16: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/result_location_incompatibility_mismatching_handle_is_ptr.zig b/test/compile_errors/stage1/obj/result_location_incompatibility_mismatching_handle_is_ptr.zig new file mode 100644 index 0000000000000000000000000000000000000000..a45fd9f41af0c22ce40f77740bf518d8f1cee4f4 --- /dev/null +++ b/test/compile_errors/stage1/obj/result_location_incompatibility_mismatching_handle_is_ptr.zig @@ -0,0 +1,16 @@ +export fn entry() void { + var damn = Container{ + .not_optional = getOptional(), + }; + _ = damn; +} +pub fn getOptional() ?i32 { + return 0; +} +pub const Container = struct { + not_optional: i32, +}; + +// result location incompatibility mismatching handle_is_ptr +// +// tmp.zig:3:36: error: cannot convert optional to payload type. consider using `.?`, `orelse`, or `if`. expected type 'i32', found '?i32' diff --git a/test/compile_errors/stage1/obj/result_location_incompatibility_mismatching_handle_is_ptr_generic_call.zig b/test/compile_errors/stage1/obj/result_location_incompatibility_mismatching_handle_is_ptr_generic_call.zig new file mode 100644 index 0000000000000000000000000000000000000000..8b913bd15cb94fd2071adfa93a06e6dcd1d7c84b --- /dev/null +++ b/test/compile_errors/stage1/obj/result_location_incompatibility_mismatching_handle_is_ptr_generic_call.zig @@ -0,0 +1,16 @@ +export fn entry() void { + var damn = Container{ + .not_optional = getOptional(i32), + }; + _ = damn; +} +pub fn getOptional(comptime T: type) ?T { + return 0; +} +pub const Container = struct { + not_optional: i32, +}; + +// result location incompatibility mismatching handle_is_ptr (generic call) +// +// tmp.zig:3:36: error: cannot convert optional to payload type. consider using `.?`, `orelse`, or `if`. expected type 'i32', found '?i32' diff --git a/test/compile_errors/stage1/obj/return_from_defer_expression.zig b/test/compile_errors/stage1/obj/return_from_defer_expression.zig new file mode 100644 index 0000000000000000000000000000000000000000..0f4ac8e0716d64c656c4fc288afe1281de4b4d4e --- /dev/null +++ b/test/compile_errors/stage1/obj/return_from_defer_expression.zig @@ -0,0 +1,19 @@ +pub fn testTrickyDefer() !void { + defer canFail() catch {}; + + defer try canFail(); + + const a = maybeInt() orelse return; +} + +fn canFail() anyerror!void { } + +pub fn maybeInt() ?i32 { + return 0; +} + +export fn entry() usize { return @sizeOf(@TypeOf(testTrickyDefer)); } + +// return from defer expression +// +// tmp.zig:4:11: error: 'try' not allowed inside defer expression diff --git a/test/compile_errors/stage1/obj/returning_error_from_void_async_function.zig b/test/compile_errors/stage1/obj/returning_error_from_void_async_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..a00422dd126c73b3eaf47d9f594a0490e23b9211 --- /dev/null +++ b/test/compile_errors/stage1/obj/returning_error_from_void_async_function.zig @@ -0,0 +1,10 @@ +export fn entry() void { + _ = async amain(); +} +fn amain() callconv(.Async) void { + return error.ShouldBeCompileError; +} + +// returning error from void async function +// +// tmp.zig:5:17: error: expected type 'void', found 'error{ShouldBeCompileError}' diff --git a/test/compile_errors/stage1/obj/runtime-known_async_function_called.zig b/test/compile_errors/stage1/obj/runtime-known_async_function_called.zig new file mode 100644 index 0000000000000000000000000000000000000000..52afd83a11ebf15f9bc272a140d8cdb5688b6fa9 --- /dev/null +++ b/test/compile_errors/stage1/obj/runtime-known_async_function_called.zig @@ -0,0 +1,12 @@ +export fn entry() void { + _ = async amain(); +} +fn amain() void { + var ptr = afunc; + _ = ptr(); +} +fn afunc() callconv(.Async) void {} + +// runtime-known async function called +// +// tmp.zig:6:12: error: function is not comptime-known; @asyncCall required diff --git a/test/compile_errors/stage1/obj/runtime-known_function_called_with_async_keyword.zig b/test/compile_errors/stage1/obj/runtime-known_function_called_with_async_keyword.zig new file mode 100644 index 0000000000000000000000000000000000000000..79f0420a830739cc9c64c9713201110712c889f3 --- /dev/null +++ b/test/compile_errors/stage1/obj/runtime-known_function_called_with_async_keyword.zig @@ -0,0 +1,10 @@ +export fn entry() void { + var ptr = afunc; + _ = async ptr(); +} + +fn afunc() callconv(.Async) void { } + +// runtime-known function called with async keyword +// +// tmp.zig:3:15: error: function is not comptime-known; @asyncCall required diff --git a/test/compile_errors/stage1/obj/runtime_assignment_to_comptime_struct_type.zig b/test/compile_errors/stage1/obj/runtime_assignment_to_comptime_struct_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..f8a3fd3ba106c40432e77eef16dbd5515bf76fa8 --- /dev/null +++ b/test/compile_errors/stage1/obj/runtime_assignment_to_comptime_struct_type.zig @@ -0,0 +1,13 @@ +const Foo = struct { + Bar: u8, + Baz: type, +}; +export fn f() void { + var x: u8 = 0; + const foo = Foo { .Bar = x, .Baz = u8 }; + _ = foo; +} + +// runtime assignment to comptime struct type +// +// tmp.zig:7:23: error: unable to evaluate constant expression diff --git a/test/compile_errors/stage1/obj/runtime_assignment_to_comptime_union_type.zig b/test/compile_errors/stage1/obj/runtime_assignment_to_comptime_union_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..bc4f093b0de8f94f333653ab6864d2048d453e90 --- /dev/null +++ b/test/compile_errors/stage1/obj/runtime_assignment_to_comptime_union_type.zig @@ -0,0 +1,13 @@ +const Foo = union { + Bar: u8, + Baz: type, +}; +export fn f() void { + var x: u8 = 0; + const foo = Foo { .Bar = x }; + _ = foo; +} + +// runtime assignment to comptime union type +// +// tmp.zig:7:23: error: unable to evaluate constant expression diff --git a/test/compile_errors/stage1/obj/runtime_cast_to_union_which_has_non-void_fields.zig b/test/compile_errors/stage1/obj/runtime_cast_to_union_which_has_non-void_fields.zig new file mode 100644 index 0000000000000000000000000000000000000000..8be361f2fe6fbe16d94e1f10b9a0a8393fe0578d --- /dev/null +++ b/test/compile_errors/stage1/obj/runtime_cast_to_union_which_has_non-void_fields.zig @@ -0,0 +1,18 @@ +const Letter = enum { A, B, C }; +const Value = union(Letter) { + A: i32, + B, + C, +}; +export fn entry() void { + foo(Letter.A); +} +fn foo(l: Letter) void { + var x: Value = l; + _ = x; +} + +// runtime cast to union which has non-void fields +// +// tmp.zig:11:20: error: runtime cast to union 'Value' which has non-void fields +// tmp.zig:3:5: note: field 'A' has type 'i32' diff --git a/test/compile_errors/stage1/obj/runtime_index_into_comptime_type_slice.zig b/test/compile_errors/stage1/obj/runtime_index_into_comptime_type_slice.zig new file mode 100644 index 0000000000000000000000000000000000000000..4b9538c1a1b4625ec12a43473e497fb3790a4f0c --- /dev/null +++ b/test/compile_errors/stage1/obj/runtime_index_into_comptime_type_slice.zig @@ -0,0 +1,15 @@ +const Struct = struct { + a: u32, +}; +fn getIndex() usize { + return 2; +} +export fn entry() void { + const index = getIndex(); + const field = @typeInfo(Struct).Struct.fields[index]; + _ = field; +} + +// runtime index into comptime type slice +// +// tmp.zig:9:51: error: values of type 'std.builtin.Type.StructField' must be comptime known, but index value is runtime known diff --git a/test/compile_errors/stage1/obj/saturating_arithmetic_does_not_allow_floats.zig b/test/compile_errors/stage1/obj/saturating_arithmetic_does_not_allow_floats.zig new file mode 100644 index 0000000000000000000000000000000000000000..57ee724e743138e8d037682d7b81d6a186fb7b6f --- /dev/null +++ b/test/compile_errors/stage1/obj/saturating_arithmetic_does_not_allow_floats.zig @@ -0,0 +1,7 @@ +export fn a() void { + _ = @as(f32, 1.0) +| @as(f32, 1.0); +} + +// saturating arithmetic does not allow floats +// +// error: invalid operands to binary expression: 'f32' and 'f32' diff --git a/test/compile_errors/stage1/obj/saturating_shl_assign_does_not_allow_negative_rhs_at_comptime.zig b/test/compile_errors/stage1/obj/saturating_shl_assign_does_not_allow_negative_rhs_at_comptime.zig new file mode 100644 index 0000000000000000000000000000000000000000..9a46367ae56888d273d79fa811193393f5e3af37 --- /dev/null +++ b/test/compile_errors/stage1/obj/saturating_shl_assign_does_not_allow_negative_rhs_at_comptime.zig @@ -0,0 +1,10 @@ +export fn a() void { + comptime { + var x = @as(i32, 1); + x <<|= @as(i32, -2); + } +} + +// saturating shl assign does not allow negative rhs at comptime +// +// error: shift by negative value -2 diff --git a/test/compile_errors/stage1/obj/saturating_shl_does_not_allow_negative_rhs_at_comptime.zig b/test/compile_errors/stage1/obj/saturating_shl_does_not_allow_negative_rhs_at_comptime.zig new file mode 100644 index 0000000000000000000000000000000000000000..ffe715a8e3eb09cc03323b7e899fca6e498f3582 --- /dev/null +++ b/test/compile_errors/stage1/obj/saturating_shl_does_not_allow_negative_rhs_at_comptime.zig @@ -0,0 +1,7 @@ +export fn a() void { + _ = @as(i32, 1) <<| @as(i32, -2); +} + +// saturating shl does not allow negative rhs at comptime +// +// error: shift by negative value -2 diff --git a/test/compile_errors/stage1/obj/setAlignStack_in_inline_function.zig b/test/compile_errors/stage1/obj/setAlignStack_in_inline_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..9261ecdb186b2037947e5d79aeb15c3877d7f0d7 --- /dev/null +++ b/test/compile_errors/stage1/obj/setAlignStack_in_inline_function.zig @@ -0,0 +1,10 @@ +export fn entry() void { + foo(); +} +fn foo() callconv(.Inline) void { + @setAlignStack(16); +} + +// @setAlignStack in inline function +// +// tmp.zig:5:5: error: @setAlignStack in inline function diff --git a/test/compile_errors/stage1/obj/setAlignStack_in_naked_function.zig b/test/compile_errors/stage1/obj/setAlignStack_in_naked_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..d7146625c5a35c8a2d2d5c523d073486eebe8b37 --- /dev/null +++ b/test/compile_errors/stage1/obj/setAlignStack_in_naked_function.zig @@ -0,0 +1,7 @@ +export fn entry() callconv(.Naked) void { + @setAlignStack(16); +} + +// @setAlignStack in naked function +// +// tmp.zig:2:5: error: @setAlignStack in naked function diff --git a/test/compile_errors/stage1/obj/setAlignStack_outside_function.zig b/test/compile_errors/stage1/obj/setAlignStack_outside_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..c9ac12e6e05ca40c2311dd6850c19ebfae668f52 --- /dev/null +++ b/test/compile_errors/stage1/obj/setAlignStack_outside_function.zig @@ -0,0 +1,7 @@ +comptime { + @setAlignStack(16); +} + +// @setAlignStack outside function +// +// tmp.zig:2:5: error: @setAlignStack outside function diff --git a/test/compile_errors/stage1/obj/setAlignStack_set_twice.zig b/test/compile_errors/stage1/obj/setAlignStack_set_twice.zig new file mode 100644 index 0000000000000000000000000000000000000000..de8cde7c011b6963d246431b93b6a557353a4fb0 --- /dev/null +++ b/test/compile_errors/stage1/obj/setAlignStack_set_twice.zig @@ -0,0 +1,9 @@ +export fn entry() void { + @setAlignStack(16); + @setAlignStack(16); +} + +// @setAlignStack set twice +// +// tmp.zig:3:5: error: alignstack set twice +// tmp.zig:2:5: note: first set here diff --git a/test/compile_errors/stage1/obj/setAlignStack_too_big.zig b/test/compile_errors/stage1/obj/setAlignStack_too_big.zig new file mode 100644 index 0000000000000000000000000000000000000000..669ec452042c2c7bab9f90848fa96ab9787d456e --- /dev/null +++ b/test/compile_errors/stage1/obj/setAlignStack_too_big.zig @@ -0,0 +1,7 @@ +export fn entry() void { + @setAlignStack(511 + 1); +} + +// @setAlignStack too big +// +// tmp.zig:2:5: error: attempt to @setAlignStack(512); maximum is 256 diff --git a/test/compile_errors/stage1/obj/setFloatMode_twice_for_same_scope.zig b/test/compile_errors/stage1/obj/setFloatMode_twice_for_same_scope.zig new file mode 100644 index 0000000000000000000000000000000000000000..3e556040307c21ca19cb3918c85c690b699b94f7 --- /dev/null +++ b/test/compile_errors/stage1/obj/setFloatMode_twice_for_same_scope.zig @@ -0,0 +1,9 @@ +export fn foo() void { + @setFloatMode(@import("std").builtin.FloatMode.Optimized); + @setFloatMode(@import("std").builtin.FloatMode.Optimized); +} + +// @setFloatMode twice for same scope +// +// tmp.zig:3:5: error: float mode set twice for same scope +// tmp.zig:2:5: note: first set here diff --git a/test/compile_errors/stage1/obj/setRuntimeSafety_twice_for_same_scope.zig b/test/compile_errors/stage1/obj/setRuntimeSafety_twice_for_same_scope.zig new file mode 100644 index 0000000000000000000000000000000000000000..741a214cde0fa4e6b07834135fac650e3a48946d --- /dev/null +++ b/test/compile_errors/stage1/obj/setRuntimeSafety_twice_for_same_scope.zig @@ -0,0 +1,9 @@ +export fn foo() void { + @setRuntimeSafety(false); + @setRuntimeSafety(false); +} + +// @setRuntimeSafety twice for same scope +// +// tmp.zig:3:5: error: runtime safety set twice for same scope +// tmp.zig:2:5: note: first set here diff --git a/test/compile_errors/stage1/obj/setting_a_section_on_a_local_variable.zig b/test/compile_errors/stage1/obj/setting_a_section_on_a_local_variable.zig new file mode 100644 index 0000000000000000000000000000000000000000..eb3df0e214b4278c20d2b349cc9d8a9e6deafae2 --- /dev/null +++ b/test/compile_errors/stage1/obj/setting_a_section_on_a_local_variable.zig @@ -0,0 +1,8 @@ +export fn entry() i32 { + var foo: i32 linksection(".text2") = 1234; + return foo; +} + +// setting a section on a local variable +// +// tmp.zig:2:30: error: cannot set section of local variable 'foo' diff --git a/test/compile_errors/stage1/obj/shift_amount_has_to_be_an_integer_type.zig b/test/compile_errors/stage1/obj/shift_amount_has_to_be_an_integer_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..6e54405619c886339882aa42dc21052bff8e7946 --- /dev/null +++ b/test/compile_errors/stage1/obj/shift_amount_has_to_be_an_integer_type.zig @@ -0,0 +1,8 @@ +export fn entry() void { + const x = 1 << &@as(u8, 10); + _ = x; +} + +// shift amount has to be an integer type +// +// tmp.zig:2:21: error: shift amount has to be an integer type, but found '*const u8' diff --git a/test/compile_errors/stage1/obj/shift_by_negative_comptime_integer.zig b/test/compile_errors/stage1/obj/shift_by_negative_comptime_integer.zig new file mode 100644 index 0000000000000000000000000000000000000000..41f0ff80aa859ba3563ffd022fd95127d9abea0c --- /dev/null +++ b/test/compile_errors/stage1/obj/shift_by_negative_comptime_integer.zig @@ -0,0 +1,8 @@ +comptime { + var a = 1 >> -1; + _ = a; +} + +// shift by negative comptime integer +// +// tmp.zig:2:18: error: shift by negative value -1 diff --git a/test/compile_errors/stage1/obj/shift_left_assign_on_undefined_value.zig b/test/compile_errors/stage1/obj/shift_left_assign_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..a23d0e190c3d6ec612ec4f3a58dc689aeb7963ca --- /dev/null +++ b/test/compile_errors/stage1/obj/shift_left_assign_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + a >>= 2; +} + +// shift left assign on undefined value +// +// tmp.zig:3:5: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/shift_left_on_undefined_value.zig b/test/compile_errors/stage1/obj/shift_left_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..aa0891133bcd27b0d3d8cac6995b627272f1d712 --- /dev/null +++ b/test/compile_errors/stage1/obj/shift_left_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + _ = a << 2; +} + +// shift left on undefined value +// +// tmp.zig:3:9: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/shift_right_assign_on_undefined_value.zig b/test/compile_errors/stage1/obj/shift_right_assign_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..65f4fe50b89b878b10f504e19316d9b6370069ee --- /dev/null +++ b/test/compile_errors/stage1/obj/shift_right_assign_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + a >>= 2; +} + +// shift right assign on undefined value +// +// tmp.zig:3:5: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/shift_right_on_undefined_value.zig b/test/compile_errors/stage1/obj/shift_right_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..ccd2563c8422b56d3aacbddcec1e8a951c1d1b15 --- /dev/null +++ b/test/compile_errors/stage1/obj/shift_right_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + _ = a >> 2; +} + +// shift right on undefined value +// +// tmp.zig:3:9: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/shifting_RHS_is_log2_of_LHS_int_bit_width.zig b/test/compile_errors/stage1/obj/shifting_RHS_is_log2_of_LHS_int_bit_width.zig new file mode 100644 index 0000000000000000000000000000000000000000..8a5d6cfee48c58bd7ce7d41338b6d55b92ba0992 --- /dev/null +++ b/test/compile_errors/stage1/obj/shifting_RHS_is_log2_of_LHS_int_bit_width.zig @@ -0,0 +1,7 @@ +export fn entry(x: u8, y: u8) u8 { + return x << y; +} + +// shifting RHS is log2 of LHS int bit width +// +// tmp.zig:2:17: error: expected type 'u3', found 'u8' diff --git a/test/compile_errors/stage1/obj/shifting_without_int_type_or_comptime_known.zig b/test/compile_errors/stage1/obj/shifting_without_int_type_or_comptime_known.zig new file mode 100644 index 0000000000000000000000000000000000000000..380a08a95ce6f3fa914b346d9e34209cc91b5a1a --- /dev/null +++ b/test/compile_errors/stage1/obj/shifting_without_int_type_or_comptime_known.zig @@ -0,0 +1,7 @@ +export fn entry(x: u8) u8 { + return 0x11 << x; +} + +// shifting without int type or comptime known +// +// tmp.zig:2:17: error: LHS of shift must be a fixed-width integer type, or RHS must be compile-time known diff --git a/test/compile_errors/stage1/obj/shlExact_shifts_out_1_bits.zig b/test/compile_errors/stage1/obj/shlExact_shifts_out_1_bits.zig new file mode 100644 index 0000000000000000000000000000000000000000..bd6e48f25ca43be21f55f24c2cbef8576a8b5c48 --- /dev/null +++ b/test/compile_errors/stage1/obj/shlExact_shifts_out_1_bits.zig @@ -0,0 +1,8 @@ +comptime { + const x = @shlExact(@as(u8, 0b01010101), 2); + _ = x; +} + +// @shlExact shifts out 1 bits +// +// tmp.zig:2:15: error: operation caused overflow diff --git a/test/compile_errors/stage1/obj/shrExact_shifts_out_1_bits.zig b/test/compile_errors/stage1/obj/shrExact_shifts_out_1_bits.zig new file mode 100644 index 0000000000000000000000000000000000000000..004bf0c1c32a38a1869f6a38f757d9acf02cad51 --- /dev/null +++ b/test/compile_errors/stage1/obj/shrExact_shifts_out_1_bits.zig @@ -0,0 +1,8 @@ +comptime { + const x = @shrExact(@as(u8, 0b10101010), 2); + _ = x; +} + +// @shrExact shifts out 1 bits +// +// tmp.zig:2:15: error: exact shift shifted out 1 bits diff --git a/test/compile_errors/stage1/obj/signed_integer_division.zig b/test/compile_errors/stage1/obj/signed_integer_division.zig new file mode 100644 index 0000000000000000000000000000000000000000..524f9fe1db2c10e2aa4fa2f7e1eddbb22a68d0f0 --- /dev/null +++ b/test/compile_errors/stage1/obj/signed_integer_division.zig @@ -0,0 +1,7 @@ +export fn foo(a: i32, b: i32) i32 { + return a / b; +} + +// signed integer division +// +// tmp.zig:2:14: error: division with 'i32' and 'i32': signed integers must use @divTrunc, @divFloor, or @divExact diff --git a/test/compile_errors/stage1/obj/signed_integer_remainder_division.zig b/test/compile_errors/stage1/obj/signed_integer_remainder_division.zig new file mode 100644 index 0000000000000000000000000000000000000000..e060b780d0affe5c6d5c7b8f2114220edd71baeb --- /dev/null +++ b/test/compile_errors/stage1/obj/signed_integer_remainder_division.zig @@ -0,0 +1,7 @@ +export fn foo(a: i32, b: i32) i32 { + return a % b; +} + +// signed integer remainder division +// +// tmp.zig:2:14: error: remainder division with 'i32' and 'i32': signed integers and floats must use @rem or @mod diff --git a/test/compile_errors/stage1/obj/sizeOf_bad_type.zig b/test/compile_errors/stage1/obj/sizeOf_bad_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..1b336cf65786987dd0948a162b7100e9fdec9d44 --- /dev/null +++ b/test/compile_errors/stage1/obj/sizeOf_bad_type.zig @@ -0,0 +1,7 @@ +export fn entry() usize { + return @sizeOf(@TypeOf(null)); +} + +// @sizeOf bad type +// +// tmp.zig:2:20: error: no size available for type '@Type(.Null)' diff --git a/test/compile_errors/stage1/obj/slice_cannot_have_its_bytes_reinterpreted.zig b/test/compile_errors/stage1/obj/slice_cannot_have_its_bytes_reinterpreted.zig new file mode 100644 index 0000000000000000000000000000000000000000..4f7670ba741e4b45c0c7a2c3f7c301ec023cf5e0 --- /dev/null +++ b/test/compile_errors/stage1/obj/slice_cannot_have_its_bytes_reinterpreted.zig @@ -0,0 +1,9 @@ +export fn foo() void { + const bytes = [1]u8{ 0xfa } ** 16; + var value = @ptrCast(*const []const u8, &bytes).*; + _ = value; +} + +// slice cannot have its bytes reinterpreted +// +// :3:52: error: slice '[]const u8' cannot have its bytes reinterpreted diff --git a/test/compile_errors/stage1/obj/slice_passed_as_array_init_type.zig b/test/compile_errors/stage1/obj/slice_passed_as_array_init_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..0d29120ca44ddab63c6671690dedc6573d37f785 --- /dev/null +++ b/test/compile_errors/stage1/obj/slice_passed_as_array_init_type.zig @@ -0,0 +1,8 @@ +export fn entry() void { + const x = []u8{}; + _ = x; +} + +// slice passed as array init type +// +// tmp.zig:2:15: error: array literal requires address-of operator (&) to coerce to slice type '[]u8' diff --git a/test/compile_errors/stage1/obj/slice_passed_as_array_init_type_with_elems.zig b/test/compile_errors/stage1/obj/slice_passed_as_array_init_type_with_elems.zig new file mode 100644 index 0000000000000000000000000000000000000000..375ed55a723291fb20170ade15a66a357d95a7b1 --- /dev/null +++ b/test/compile_errors/stage1/obj/slice_passed_as_array_init_type_with_elems.zig @@ -0,0 +1,8 @@ +export fn entry() void { + const x = []u8{1, 2}; + _ = x; +} + +// slice passed as array init type with elems +// +// tmp.zig:2:15: error: array literal requires address-of operator (&) to coerce to slice type '[]u8' diff --git a/test/compile_errors/stage1/obj/slice_sentinel_mismatch-1.zig b/test/compile_errors/stage1/obj/slice_sentinel_mismatch-1.zig new file mode 100644 index 0000000000000000000000000000000000000000..1e3c2450cb19d8c0a1e6a5f1cf92fb92b0ab062c --- /dev/null +++ b/test/compile_errors/stage1/obj/slice_sentinel_mismatch-1.zig @@ -0,0 +1,8 @@ +export fn entry() void { + const y: [:1]const u8 = &[_:2]u8{ 1, 2 }; + _ = y; +} + +// slice sentinel mismatch - 1 +// +// tmp.zig:2:37: error: expected type '[:1]const u8', found '*const [2:2]u8' diff --git a/test/compile_errors/stage1/obj/slice_sentinel_mismatch-2.zig b/test/compile_errors/stage1/obj/slice_sentinel_mismatch-2.zig new file mode 100644 index 0000000000000000000000000000000000000000..f1d73eb9df78bc918ce95e9a33220b8e5657a8d0 --- /dev/null +++ b/test/compile_errors/stage1/obj/slice_sentinel_mismatch-2.zig @@ -0,0 +1,10 @@ +fn foo() [:0]u8 { + var x: []u8 = undefined; + return x; +} +comptime { _ = foo; } + +// slice sentinel mismatch - 2 +// +// tmp.zig:3:12: error: expected type '[:0]u8', found '[]u8' +// tmp.zig:3:12: note: destination pointer requires a terminating '0' sentinel diff --git a/test/compile_errors/stage1/obj/slicing_of_global_undefined_pointer.zig b/test/compile_errors/stage1/obj/slicing_of_global_undefined_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..d52bfdf6a5118dbf574234c5e6fef3fb5b4cc071 --- /dev/null +++ b/test/compile_errors/stage1/obj/slicing_of_global_undefined_pointer.zig @@ -0,0 +1,8 @@ +var buf: *[1]u8 = undefined; +export fn entry() void { + _ = buf[0..1]; +} + +// slicing of global undefined pointer +// +// tmp.zig:3:12: error: non-zero length slice of undefined pointer diff --git a/test/compile_errors/stage1/obj/slicing_single-item_pointer.zig b/test/compile_errors/stage1/obj/slicing_single-item_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..f6bbe752b1bd72db33d58d7a9b2e8baf76e0a3da --- /dev/null +++ b/test/compile_errors/stage1/obj/slicing_single-item_pointer.zig @@ -0,0 +1,8 @@ +export fn entry(ptr: *i32) void { + const slice = ptr[0..2]; + _ = slice; +} + +// slicing single-item pointer +// +// tmp.zig:2:22: error: slice of single-item pointer diff --git a/test/compile_errors/stage1/obj/specify_enum_tag_type_that_is_too_small.zig b/test/compile_errors/stage1/obj/specify_enum_tag_type_that_is_too_small.zig new file mode 100644 index 0000000000000000000000000000000000000000..ca7c305d38d4713ca6327a97162ee7efcd71bc08 --- /dev/null +++ b/test/compile_errors/stage1/obj/specify_enum_tag_type_that_is_too_small.zig @@ -0,0 +1,16 @@ +const Small = enum (u2) { + One, + Two, + Three, + Four, + Five, +}; + +export fn entry() void { + var x = Small.One; + _ = x; +} + +// specify enum tag type that is too small +// +// tmp.zig:6:5: error: enumeration value 4 too large for type 'u2' diff --git a/test/compile_errors/stage1/obj/specify_non-integer_enum_tag_type.zig b/test/compile_errors/stage1/obj/specify_non-integer_enum_tag_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..095a0812c13dae1815ec8b4c762fa051c8183fe0 --- /dev/null +++ b/test/compile_errors/stage1/obj/specify_non-integer_enum_tag_type.zig @@ -0,0 +1,14 @@ +const Small = enum (f32) { + One, + Two, + Three, +}; + +export fn entry() void { + var x = Small.One; + _ = x; +} + +// specify non-integer enum tag type +// +// tmp.zig:1:21: error: expected integer, found 'f32' diff --git a/test/compile_errors/stage1/obj/src_outside_function.zig b/test/compile_errors/stage1/obj/src_outside_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..53591350665ee4f456a86ffa7929eb69d6a4dba8 --- /dev/null +++ b/test/compile_errors/stage1/obj/src_outside_function.zig @@ -0,0 +1,7 @@ +comptime { + @src(); +} + +// @src outside function +// +// tmp.zig:2:5: error: @src outside function diff --git a/test/compile_errors/stage1/obj/store_vector_pointer_with_unknown_runtime_index.zig b/test/compile_errors/stage1/obj/store_vector_pointer_with_unknown_runtime_index.zig new file mode 100644 index 0000000000000000000000000000000000000000..6ef71c863a91ff4172627c3290f637002a32b3d1 --- /dev/null +++ b/test/compile_errors/stage1/obj/store_vector_pointer_with_unknown_runtime_index.zig @@ -0,0 +1,14 @@ +export fn entry() void { + var v: @import("std").meta.Vector(4, i32) = [_]i32{ 1, 5, 3, undefined }; + + var i: u32 = 0; + storev(&v[i], 42); +} + +fn storev(ptr: anytype, val: i32) void { + ptr.* = val; +} + +// store vector pointer with unknown runtime index +// +// tmp.zig:9:8: error: unable to determine vector element index of type '*align(16:0:4:?) i32 diff --git a/test/compile_errors/stage1/obj/storing_runtime_value_in_compile_time_variable_then_using_it.zig b/test/compile_errors/stage1/obj/storing_runtime_value_in_compile_time_variable_then_using_it.zig new file mode 100644 index 0000000000000000000000000000000000000000..318db771d54cbe75e18ab343e64ca366f313479a --- /dev/null +++ b/test/compile_errors/stage1/obj/storing_runtime_value_in_compile_time_variable_then_using_it.zig @@ -0,0 +1,47 @@ +const Mode = @import("std").builtin.Mode; + +fn Free(comptime filename: []const u8) TestCase { + return TestCase { + .filename = filename, + .problem_type = ProblemType.Free, + }; +} + +fn LibC(comptime filename: []const u8) TestCase { + return TestCase { + .filename = filename, + .problem_type = ProblemType.LinkLibC, + }; +} + +const TestCase = struct { + filename: []const u8, + problem_type: ProblemType, +}; + +const ProblemType = enum { + Free, + LinkLibC, +}; + +export fn entry() void { + const tests = [_]TestCase { + Free("001"), + Free("002"), + LibC("078"), + Free("116"), + Free("117"), + }; + + for ([_]Mode { Mode.Debug, Mode.ReleaseSafe, Mode.ReleaseFast }) |mode| { + _ = mode; + inline for (tests) |test_case| { + const foo = test_case.filename ++ ".zig"; + _ = foo; + } + } +} + +// storing runtime value in compile time variable then using it +// +// tmp.zig:38:29: error: cannot store runtime value in compile time variable diff --git a/test/compile_errors/stage1/obj/struct_depends_on_itself_via_optional_field.zig b/test/compile_errors/stage1/obj/struct_depends_on_itself_via_optional_field.zig new file mode 100644 index 0000000000000000000000000000000000000000..13ee95155dce740db3290697d4290fa93f754167 --- /dev/null +++ b/test/compile_errors/stage1/obj/struct_depends_on_itself_via_optional_field.zig @@ -0,0 +1,17 @@ +const LhsExpr = struct { + rhsExpr: ?AstObject, +}; +const AstObject = union { + lhsExpr: LhsExpr, +}; +export fn entry() void { + const lhsExpr = LhsExpr{ .rhsExpr = null }; + const obj = AstObject{ .lhsExpr = lhsExpr }; + _ = obj; +} + +// struct depends on itself via optional field +// +// tmp.zig:1:17: error: struct 'LhsExpr' depends on itself +// tmp.zig:5:5: note: while checking this field +// tmp.zig:2:5: note: while checking this field diff --git a/test/compile_errors/stage1/obj/struct_field_missing_type.zig b/test/compile_errors/stage1/obj/struct_field_missing_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..669718a3d47a71197814e8f4c00757906ae1184e --- /dev/null +++ b/test/compile_errors/stage1/obj/struct_field_missing_type.zig @@ -0,0 +1,11 @@ +const Letter = struct { + A, +}; +export fn entry() void { + var a = Letter { .A = {} }; + _ = a; +} + +// struct field missing type +// +// tmp.zig:2:5: error: struct field missing type diff --git a/test/compile_errors/stage1/obj/struct_init_syntax_for_array.zig b/test/compile_errors/stage1/obj/struct_init_syntax_for_array.zig new file mode 100644 index 0000000000000000000000000000000000000000..4eda9622ab42810e8d396aed6197e154eb85fced --- /dev/null +++ b/test/compile_errors/stage1/obj/struct_init_syntax_for_array.zig @@ -0,0 +1,8 @@ +const foo = [3]u16{ .x = 1024 }; +comptime { + _ = foo; +} + +// struct init syntax for array +// +// tmp.zig:1:13: error: initializing array with struct syntax diff --git a/test/compile_errors/stage1/obj/struct_with_declarations_unavailable_for_reify_type.zig b/test/compile_errors/stage1/obj/struct_with_declarations_unavailable_for_reify_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..656a9b9f62b8aebcaaa079036eef5d803fc341d7 --- /dev/null +++ b/test/compile_errors/stage1/obj/struct_with_declarations_unavailable_for_reify_type.zig @@ -0,0 +1,7 @@ +export fn entry() void { + _ = @Type(@typeInfo(struct { const foo = 1; })); +} + +// struct with declarations unavailable for @Type +// +// tmp.zig:2:15: error: Type.Struct.decls must be empty for @Type diff --git a/test/compile_errors/stage1/obj/struct_with_invalid_field.zig b/test/compile_errors/stage1/obj/struct_with_invalid_field.zig new file mode 100644 index 0000000000000000000000000000000000000000..a2a632fbd942bb36072dac1fd8c314db4c3e3796 --- /dev/null +++ b/test/compile_errors/stage1/obj/struct_with_invalid_field.zig @@ -0,0 +1,28 @@ +const std = @import("std",); +const Allocator = std.mem.Allocator; +const ArrayList = std.ArrayList; + +const HeaderWeight = enum { + H1, H2, H3, H4, H5, H6, +}; + +const MdText = ArrayList(u8); + +const MdNode = union(enum) { + Header: struct { + text: MdText, + weight: HeaderValue, + }, +}; + +export fn entry() void { + const a = MdNode.Header { + .text = MdText.init(std.testing.allocator), + .weight = HeaderWeight.H1, + }; + _ = a; +} + +// struct with invalid field +// +// tmp.zig:14:17: error: use of undeclared identifier 'HeaderValue' diff --git a/test/compile_errors/stage1/obj/sub_assign_on_undefined_value.zig b/test/compile_errors/stage1/obj/sub_assign_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..01ef9313e542f2de63f733e68557b09e38876b54 --- /dev/null +++ b/test/compile_errors/stage1/obj/sub_assign_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + a -= a; +} + +// sub assign on undefined value +// +// tmp.zig:3:5: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/sub_on_undefined_value.zig b/test/compile_errors/stage1/obj/sub_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..80746abf0e7771b80729af60d7b48a3a90d2efc7 --- /dev/null +++ b/test/compile_errors/stage1/obj/sub_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + _ = a - a; +} + +// sub on undefined value +// +// tmp.zig:3:9: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/sub_overflow_in_function_evaluation.zig b/test/compile_errors/stage1/obj/sub_overflow_in_function_evaluation.zig new file mode 100644 index 0000000000000000000000000000000000000000..1084f1a1119d2060e1e82fecdaaabbf67674d206 --- /dev/null +++ b/test/compile_errors/stage1/obj/sub_overflow_in_function_evaluation.zig @@ -0,0 +1,10 @@ +const y = sub(10, 20); +fn sub(a: u16, b: u16) u16 { + return a - b; +} + +export fn entry() usize { return @sizeOf(@TypeOf(y)); } + +// sub overflow in function evaluation +// +// tmp.zig:3:14: error: operation caused overflow diff --git a/test/compile_errors/stage1/obj/sub_wrap_assign_on_undefined_value.zig b/test/compile_errors/stage1/obj/sub_wrap_assign_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..3c7fd4faa5f84d6df43b71e40d1298817f2a6c6c --- /dev/null +++ b/test/compile_errors/stage1/obj/sub_wrap_assign_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + a -%= a; +} + +// sub wrap assign on undefined value +// +// tmp.zig:3:5: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/sub_wrap_on_undefined_value.zig b/test/compile_errors/stage1/obj/sub_wrap_on_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..367b4c9c0e5d94e494ef24fe0aa102c815558444 --- /dev/null +++ b/test/compile_errors/stage1/obj/sub_wrap_on_undefined_value.zig @@ -0,0 +1,8 @@ +comptime { + var a: i64 = undefined; + _ = a -% a; +} + +// sub wrap on undefined value +// +// tmp.zig:3:9: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/suspend_inside_suspend_block.zig b/test/compile_errors/stage1/obj/suspend_inside_suspend_block.zig new file mode 100644 index 0000000000000000000000000000000000000000..2e807268cee028b68dccfd1a4ed8c966787a667c --- /dev/null +++ b/test/compile_errors/stage1/obj/suspend_inside_suspend_block.zig @@ -0,0 +1,14 @@ +export fn entry() void { + _ = async foo(); +} +fn foo() void { + suspend { + suspend { + } + } +} + +// suspend inside suspend block +// +// tmp.zig:6:9: error: cannot suspend inside suspend block +// tmp.zig:5:5: note: other suspend block here diff --git a/test/compile_errors/stage1/obj/switch_expression-duplicate_enumeration_prong.zig b/test/compile_errors/stage1/obj/switch_expression-duplicate_enumeration_prong.zig new file mode 100644 index 0000000000000000000000000000000000000000..c5db39f5b23f055a9df416ba8fac66c1055af11b --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_expression-duplicate_enumeration_prong.zig @@ -0,0 +1,22 @@ +const Number = enum { + One, + Two, + Three, + Four, +}; +fn f(n: Number) i32 { + switch (n) { + Number.One => 1, + Number.Two => 2, + Number.Three => @as(i32, 3), + Number.Four => 4, + Number.Two => 2, + } +} + +export fn entry() usize { return @sizeOf(@TypeOf(f)); } + +// switch expression - duplicate enumeration prong +// +// tmp.zig:13:15: error: duplicate switch value +// tmp.zig:10:15: note: other value here diff --git a/test/compile_errors/stage1/obj/switch_expression-duplicate_enumeration_prong_when_else_present.zig b/test/compile_errors/stage1/obj/switch_expression-duplicate_enumeration_prong_when_else_present.zig new file mode 100644 index 0000000000000000000000000000000000000000..22a0c189c173c70ec9e580a00b2d026604b23dbb --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_expression-duplicate_enumeration_prong_when_else_present.zig @@ -0,0 +1,23 @@ +const Number = enum { + One, + Two, + Three, + Four, +}; +fn f(n: Number) i32 { + switch (n) { + Number.One => 1, + Number.Two => 2, + Number.Three => @as(i32, 3), + Number.Four => 4, + Number.Two => 2, + else => 10, + } +} + +export fn entry() usize { return @sizeOf(@TypeOf(f)); } + +// switch expression - duplicate enumeration prong when else present +// +// tmp.zig:13:15: error: duplicate switch value +// tmp.zig:10:15: note: other value here diff --git a/test/compile_errors/stage1/obj/switch_expression-duplicate_or_overlapping_integer_value.zig b/test/compile_errors/stage1/obj/switch_expression-duplicate_or_overlapping_integer_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..06ef7de62e90e2513049cc57653afad29a65a9e5 --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_expression-duplicate_or_overlapping_integer_value.zig @@ -0,0 +1,14 @@ +fn foo(x: u8) u8 { + return switch (x) { + 0 ... 100 => @as(u8, 0), + 101 ... 200 => 1, + 201, 203 ... 207 => 2, + 206 ... 255 => 3, + }; +} +export fn entry() usize { return @sizeOf(@TypeOf(foo)); } + +// switch expression - duplicate or overlapping integer value +// +// tmp.zig:6:9: error: duplicate switch value +// tmp.zig:5:14: note: previous value here diff --git a/test/compile_errors/stage1/obj/switch_expression-duplicate_type.zig b/test/compile_errors/stage1/obj/switch_expression-duplicate_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..9ac9feaeaf1598149a8892a60c6b7bdbb05e48bf --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_expression-duplicate_type.zig @@ -0,0 +1,15 @@ +fn foo(comptime T: type, x: T) u8 { + _ = x; + return switch (T) { + u32 => 0, + u64 => 1, + u32 => 2, + else => 3, + }; +} +export fn entry() usize { return @sizeOf(@TypeOf(foo(u32, 0))); } + +// switch expression - duplicate type +// +// tmp.zig:6:9: error: duplicate switch value +// tmp.zig:4:9: note: previous value here diff --git a/test/compile_errors/stage1/obj/switch_expression-duplicate_type_struct_alias.zig b/test/compile_errors/stage1/obj/switch_expression-duplicate_type_struct_alias.zig new file mode 100644 index 0000000000000000000000000000000000000000..b92336cac5b54d39c06295ef59364a6840bffb85 --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_expression-duplicate_type_struct_alias.zig @@ -0,0 +1,19 @@ +const Test = struct { + bar: i32, +}; +const Test2 = Test; +fn foo(comptime T: type, x: T) u8 { + _ = x; + return switch (T) { + Test => 0, + u64 => 1, + Test2 => 2, + else => 3, + }; +} +export fn entry() usize { return @sizeOf(@TypeOf(foo(u32, 0))); } + +// switch expression - duplicate type (struct alias) +// +// tmp.zig:10:9: error: duplicate switch value +// tmp.zig:8:9: note: previous value here diff --git a/test/compile_errors/stage1/obj/switch_expression-missing_enumeration_prong.zig b/test/compile_errors/stage1/obj/switch_expression-missing_enumeration_prong.zig new file mode 100644 index 0000000000000000000000000000000000000000..b6cd60c22b0ecbbeaea49fd91b8ec96b49a398e7 --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_expression-missing_enumeration_prong.zig @@ -0,0 +1,19 @@ +const Number = enum { + One, + Two, + Three, + Four, +}; +fn f(n: Number) i32 { + switch (n) { + Number.One => 1, + Number.Two => 2, + Number.Three => @as(i32, 3), + } +} + +export fn entry() usize { return @sizeOf(@TypeOf(f)); } + +// switch expression - missing enumeration prong +// +// tmp.zig:8:5: error: enumeration value 'Number.Four' not handled in switch diff --git a/test/compile_errors/stage1/obj/switch_expression-multiple_else_prongs.zig b/test/compile_errors/stage1/obj/switch_expression-multiple_else_prongs.zig new file mode 100644 index 0000000000000000000000000000000000000000..6a7e274b5687f0f105635277322f8c2829f2a460 --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_expression-multiple_else_prongs.zig @@ -0,0 +1,14 @@ +fn f(x: u32) void { + const value: bool = switch (x) { + 1234 => false, + else => true, + else => true, + }; +} +export fn entry() void { + f(1234); +} + +// switch expression - multiple else prongs +// +// tmp.zig:5:9: error: multiple else prongs in switch expression diff --git a/test/compile_errors/stage1/obj/switch_expression-non_exhaustive_integer_prongs.zig b/test/compile_errors/stage1/obj/switch_expression-non_exhaustive_integer_prongs.zig new file mode 100644 index 0000000000000000000000000000000000000000..88fb8548de80301efbf67d3136f8c4b90e753ae6 --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_expression-non_exhaustive_integer_prongs.zig @@ -0,0 +1,10 @@ +fn foo(x: u8) void { + switch (x) { + 0 => {}, + } +} +export fn entry() usize { return @sizeOf(@TypeOf(foo)); } + +// switch expression - non exhaustive integer prongs +// +// tmp.zig:2:5: error: switch must handle all possibilities diff --git a/test/compile_errors/stage1/obj/switch_expression-switch_on_pointer_type_with_no_else.zig b/test/compile_errors/stage1/obj/switch_expression-switch_on_pointer_type_with_no_else.zig new file mode 100644 index 0000000000000000000000000000000000000000..ec7565b8826a0057d8572a1d9090c9f1998095df --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_expression-switch_on_pointer_type_with_no_else.zig @@ -0,0 +1,11 @@ +fn foo(x: *u8) void { + switch (x) { + &y => {}, + } +} +const y: u8 = 100; +export fn entry() usize { return @sizeOf(@TypeOf(foo)); } + +// switch expression - switch on pointer type with no else +// +// tmp.zig:2:5: error: else prong required when switching on type '*u8' diff --git a/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_bool.zig b/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_bool.zig new file mode 100644 index 0000000000000000000000000000000000000000..8c36a3c2891c42e16343f9647f6cc1c07eb5e8d4 --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_bool.zig @@ -0,0 +1,12 @@ +fn foo(x: bool) void { + switch (x) { + true => {}, + false => {}, + else => {}, + } +} +export fn entry() usize { return @sizeOf(@TypeOf(foo)); } + +// switch expression - unreachable else prong (bool) +// +// tmp.zig:5:9: error: unreachable else prong, all cases already handled diff --git a/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_enum.zig b/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_enum.zig new file mode 100644 index 0000000000000000000000000000000000000000..8207d0523465f77293ac75a2ca43c7f889bfbcf5 --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_enum.zig @@ -0,0 +1,22 @@ +const TestEnum = enum{ T1, T2 }; + +fn err(x: u8) TestEnum { + switch (x) { + 0 => return TestEnum.T1, + else => return TestEnum.T2, + } +} + +fn foo(x: u8) void { + switch (err(x)) { + TestEnum.T1 => {}, + TestEnum.T2 => {}, + else => {}, + } +} + +export fn entry() usize { return @sizeOf(@TypeOf(foo)); } + +// switch expression - unreachable else prong (enum) +// +// tmp.zig:14:9: error: unreachable else prong, all cases already handled diff --git a/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_range_i8.zig b/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_range_i8.zig new file mode 100644 index 0000000000000000000000000000000000000000..8750e57fae21f9d4a01fcf72629cda8b87889706 --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_range_i8.zig @@ -0,0 +1,15 @@ +fn foo(x: i8) void { + switch (x) { + -128...0 => {}, + 1 => {}, + 2 => {}, + 3 => {}, + 4...127 => {}, + else => {}, + } +} +export fn entry() usize { return @sizeOf(@TypeOf(foo)); } + +// switch expression - unreachable else prong (range i8) +// +// tmp.zig:8:9: error: unreachable else prong, all cases already handled diff --git a/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_range_u8.zig b/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_range_u8.zig new file mode 100644 index 0000000000000000000000000000000000000000..280663ae51b0f47f887e317dedb8749e2e249672 --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_range_u8.zig @@ -0,0 +1,15 @@ +fn foo(x: u8) void { + switch (x) { + 0 => {}, + 1 => {}, + 2 => {}, + 3 => {}, + 4...255 => {}, + else => {}, + } +} +export fn entry() usize { return @sizeOf(@TypeOf(foo)); } + +// switch expression - unreachable else prong (range u8) +// +// tmp.zig:8:9: error: unreachable else prong, all cases already handled diff --git a/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_u1.zig b/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_u1.zig new file mode 100644 index 0000000000000000000000000000000000000000..58c4f378bf473c5799d03a21b60e69130d1aa257 --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_u1.zig @@ -0,0 +1,12 @@ +fn foo(x: u1) void { + switch (x) { + 0 => {}, + 1 => {}, + else => {}, + } +} +export fn entry() usize { return @sizeOf(@TypeOf(foo)); } + +// switch expression - unreachable else prong (u1) +// +// tmp.zig:5:9: error: unreachable else prong, all cases already handled diff --git a/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_u2.zig b/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_u2.zig new file mode 100644 index 0000000000000000000000000000000000000000..ec1804316e38d156dc4710695d65f9a647e852d6 --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_u2.zig @@ -0,0 +1,14 @@ +fn foo(x: u2) void { + switch (x) { + 0 => {}, + 1 => {}, + 2 => {}, + 3 => {}, + else => {}, + } +} +export fn entry() usize { return @sizeOf(@TypeOf(foo)); } + +// switch expression - unreachable else prong (u2) +// +// tmp.zig:7:9: error: unreachable else prong, all cases already handled diff --git a/test/compile_errors/stage1/obj/switch_on_enum_with_1_field_with_no_prongs.zig b/test/compile_errors/stage1/obj/switch_on_enum_with_1_field_with_no_prongs.zig new file mode 100644 index 0000000000000000000000000000000000000000..fbfc039f59c248a575ae5d1437931accfab46c1a --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_on_enum_with_1_field_with_no_prongs.zig @@ -0,0 +1,10 @@ +const Foo = enum { M }; + +export fn entry() void { + var f = Foo.M; + switch (f) {} +} + +// switch on enum with 1 field with no prongs +// +// tmp.zig:5:5: error: enumeration value 'Foo.M' not handled in switch diff --git a/test/compile_errors/stage1/obj/switch_on_union_with_no_attached_enum.zig b/test/compile_errors/stage1/obj/switch_on_union_with_no_attached_enum.zig new file mode 100644 index 0000000000000000000000000000000000000000..f1ae750b4b89f9aa846a68e2c32f87c70828667d --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_on_union_with_no_attached_enum.zig @@ -0,0 +1,20 @@ +const Payload = union { + A: i32, + B: f64, + C: bool, +}; +export fn entry() void { + const a = Payload { .A = 1234 }; + foo(a); +} +fn foo(a: *const Payload) void { + switch (a.*) { + Payload.A => {}, + else => unreachable, + } +} + +// switch on union with no attached enum +// +// tmp.zig:11:14: error: switch on union which has no attached enum +// tmp.zig:1:17: note: consider 'union(enum)' here diff --git a/test/compile_errors/stage1/obj/switch_with_invalid_expression_parameter.zig b/test/compile_errors/stage1/obj/switch_with_invalid_expression_parameter.zig new file mode 100644 index 0000000000000000000000000000000000000000..f65879bc7a7cb7cdadd72aac143488c7972e8e92 --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_with_invalid_expression_parameter.zig @@ -0,0 +1,15 @@ +export fn entry() void { + Test(i32); +} +fn Test(comptime T: type) void { + const x = switch (T) { + []u8 => |x| x, + i32 => |x| x, + else => unreachable, + }; + _ = x; +} + +// switch with invalid expression parameter +// +// tmp.zig:7:17: error: switch on type 'type' provides no expression parameter diff --git a/test/compile_errors/stage1/obj/switch_with_overlapping_case_ranges.zig b/test/compile_errors/stage1/obj/switch_with_overlapping_case_ranges.zig new file mode 100644 index 0000000000000000000000000000000000000000..2818d766a717b916821e999b78021b4d5d2b9bfb --- /dev/null +++ b/test/compile_errors/stage1/obj/switch_with_overlapping_case_ranges.zig @@ -0,0 +1,11 @@ +export fn entry() void { + var q: u8 = 0; + switch (q) { + 1...2 => {}, + 0...255 => {}, + } +} + +// switch with overlapping case ranges +// +// tmp.zig:5:9: error: duplicate switch value diff --git a/test/compile_errors/stage1/obj/tagName_used_on_union_with_no_associated_enum_tag.zig b/test/compile_errors/stage1/obj/tagName_used_on_union_with_no_associated_enum_tag.zig new file mode 100644 index 0000000000000000000000000000000000000000..bd03a97cfdd3ec391ab706ab18d579ebd3cc676e --- /dev/null +++ b/test/compile_errors/stage1/obj/tagName_used_on_union_with_no_associated_enum_tag.zig @@ -0,0 +1,14 @@ +const FloatInt = extern union { + Float: f32, + Int: i32, +}; +export fn entry() void { + var fi = FloatInt{.Float = 123.45}; + var tagName = @tagName(fi); + _ = tagName; +} + +// @tagName used on union with no associated enum tag +// +// tmp.zig:7:19: error: union has no associated enum +// tmp.zig:1:18: note: declared here diff --git a/test/compile_errors/stage1/obj/take_slice_of_invalid_dereference.zig b/test/compile_errors/stage1/obj/take_slice_of_invalid_dereference.zig new file mode 100644 index 0000000000000000000000000000000000000000..9beda30e2f0dcafe92161bc994e77d6b343927fb --- /dev/null +++ b/test/compile_errors/stage1/obj/take_slice_of_invalid_dereference.zig @@ -0,0 +1,8 @@ +export fn entry() void { + const x = 'a'.*[0..]; + _ = x; +} + +// take slice of invalid dereference +// +// tmp.zig:2:18: error: attempt to dereference non-pointer type 'comptime_int' diff --git a/test/compile_errors/stage1/obj/taking_bit_offset_of_void_field_in_struct.zig b/test/compile_errors/stage1/obj/taking_bit_offset_of_void_field_in_struct.zig new file mode 100644 index 0000000000000000000000000000000000000000..936a110a6170ea429b34309642938d841b5794a9 --- /dev/null +++ b/test/compile_errors/stage1/obj/taking_bit_offset_of_void_field_in_struct.zig @@ -0,0 +1,11 @@ +const Empty = struct { + val: void, +}; +export fn foo() void { + const fieldOffset = @bitOffsetOf(Empty, "val",); + _ = fieldOffset; +} + +// taking bit offset of void field in struct +// +// tmp.zig:5:45: error: zero-bit field 'val' in struct 'Empty' has no offset diff --git a/test/compile_errors/stage1/obj/taking_byte_offset_of_void_field_in_struct.zig b/test/compile_errors/stage1/obj/taking_byte_offset_of_void_field_in_struct.zig new file mode 100644 index 0000000000000000000000000000000000000000..d71dbc15020ea888f441adda6b9fcc5ccdaf36d7 --- /dev/null +++ b/test/compile_errors/stage1/obj/taking_byte_offset_of_void_field_in_struct.zig @@ -0,0 +1,11 @@ +const Empty = struct { + val: void, +}; +export fn foo() void { + const fieldOffset = @offsetOf(Empty, "val",); + _ = fieldOffset; +} + +// taking byte offset of void field in struct +// +// tmp.zig:5:42: error: zero-bit field 'val' in struct 'Empty' has no offset diff --git a/test/compile_errors/stage1/obj/threadlocal_qualifier_on_const.zig b/test/compile_errors/stage1/obj/threadlocal_qualifier_on_const.zig new file mode 100644 index 0000000000000000000000000000000000000000..fa99e592aea728f021935ed3e68a6cec63e8f864 --- /dev/null +++ b/test/compile_errors/stage1/obj/threadlocal_qualifier_on_const.zig @@ -0,0 +1,8 @@ +threadlocal const x: i32 = 1234; +export fn entry() i32 { + return x; +} + +// threadlocal qualifier on const +// +// tmp.zig:1:1: error: threadlocal variable cannot be constant diff --git a/test/compile_errors/stage1/obj/top_level_decl_dependency_loop.zig b/test/compile_errors/stage1/obj/top_level_decl_dependency_loop.zig new file mode 100644 index 0000000000000000000000000000000000000000..4ecdc6f67dd09c9d00218c7d8cbca6785c963347 --- /dev/null +++ b/test/compile_errors/stage1/obj/top_level_decl_dependency_loop.zig @@ -0,0 +1,10 @@ +const a : @TypeOf(b) = 0; +const b : @TypeOf(a) = 0; +export fn entry() void { + const c = a + b; + _ = c; +} + +// top level decl dependency loop +// +// tmp.zig:2:19: error: dependency loop detected diff --git a/test/compile_errors/stage1/obj/truncate_sign_mismatch.zig b/test/compile_errors/stage1/obj/truncate_sign_mismatch.zig new file mode 100644 index 0000000000000000000000000000000000000000..a60ca4bc7ac02f64efd6edd58f7a4e00400eecbd --- /dev/null +++ b/test/compile_errors/stage1/obj/truncate_sign_mismatch.zig @@ -0,0 +1,23 @@ +export fn entry1() i8 { + var x: u32 = 10; + return @truncate(i8, x); +} +export fn entry2() u8 { + var x: i32 = -10; + return @truncate(u8, x); +} +export fn entry3() i8 { + comptime var x: u32 = 10; + return @truncate(i8, x); +} +export fn entry4() u8 { + comptime var x: i32 = -10; + return @truncate(u8, x); +} + +// truncate sign mismatch +// +// tmp.zig:3:26: error: expected signed integer type, found 'u32' +// tmp.zig:7:26: error: expected unsigned integer type, found 'i32' +// tmp.zig:11:26: error: expected signed integer type, found 'u32' +// tmp.zig:15:26: error: expected unsigned integer type, found 'i32' diff --git a/test/compile_errors/stage1/obj/truncate_undefined_value.zig b/test/compile_errors/stage1/obj/truncate_undefined_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..9d3913f9c3b78619363174f96b6af5fe50559d7a --- /dev/null +++ b/test/compile_errors/stage1/obj/truncate_undefined_value.zig @@ -0,0 +1,8 @@ +export fn entry() void { + var z = @truncate(u8, @as(u16, undefined)); + _ = z; +} + +// @truncate undefined value +// +// tmp.zig:2:27: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/try_in_function_with_non_error_return_type.zig b/test/compile_errors/stage1/obj/try_in_function_with_non_error_return_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..d799f769b6537d2df15baf6064f8b90daa80497b --- /dev/null +++ b/test/compile_errors/stage1/obj/try_in_function_with_non_error_return_type.zig @@ -0,0 +1,8 @@ +export fn f() void { + try something(); +} +fn something() anyerror!void { } + +// try in function with non error return type +// +// tmp.zig:2:5: error: expected type 'void', found 'anyerror' diff --git a/test/compile_errors/stage1/obj/type_checking_function_pointers.zig b/test/compile_errors/stage1/obj/type_checking_function_pointers.zig new file mode 100644 index 0000000000000000000000000000000000000000..d9bcde6babc7ee48370969694ef2e9c283a743a7 --- /dev/null +++ b/test/compile_errors/stage1/obj/type_checking_function_pointers.zig @@ -0,0 +1,11 @@ +fn a(b: fn (*const u8) void) void { + b('a'); +} +fn c(d: u8) void {_ = d;} +export fn entry() void { + a(c); +} + +// type checking function pointers +// +// tmp.zig:6:7: error: expected type 'fn(*const u8) void', found 'fn(u8) void' diff --git a/test/compile_errors/stage1/obj/type_variables_must_be_constant.zig b/test/compile_errors/stage1/obj/type_variables_must_be_constant.zig new file mode 100644 index 0000000000000000000000000000000000000000..33846d6da8861dae584d6361318e86eefe54e80c --- /dev/null +++ b/test/compile_errors/stage1/obj/type_variables_must_be_constant.zig @@ -0,0 +1,8 @@ +var foo = u8; +export fn entry() foo { + return 1; +} + +// type variables must be constant +// +// tmp.zig:1:1: error: variable of type 'type' must be constant diff --git a/test/compile_errors/stage1/obj/undeclared_identifier.zig b/test/compile_errors/stage1/obj/undeclared_identifier.zig new file mode 100644 index 0000000000000000000000000000000000000000..36f46a22f4c82dc2d3f4c2dde3e9cd727ba2164a --- /dev/null +++ b/test/compile_errors/stage1/obj/undeclared_identifier.zig @@ -0,0 +1,9 @@ +export fn a() void { + return + b + + c; +} + +// undeclared identifier +// +// tmp.zig:3:5: error: use of undeclared identifier 'b' diff --git a/test/compile_errors/stage1/obj/undeclared_identifier_error_should_mark_fn_as_impure.zig b/test/compile_errors/stage1/obj/undeclared_identifier_error_should_mark_fn_as_impure.zig new file mode 100644 index 0000000000000000000000000000000000000000..fa629bdcb8771389bb5e66d94430afb3addd84e5 --- /dev/null +++ b/test/compile_errors/stage1/obj/undeclared_identifier_error_should_mark_fn_as_impure.zig @@ -0,0 +1,10 @@ +export fn foo() void { + test_a_thing(); +} +fn test_a_thing() void { + bad_fn_call(); +} + +// undeclared identifier error should mark fn as impure +// +// tmp.zig:5:5: error: use of undeclared identifier 'bad_fn_call' diff --git a/test/compile_errors/stage1/obj/undeclared_identifier_in_unanalyzed_branch.zig b/test/compile_errors/stage1/obj/undeclared_identifier_in_unanalyzed_branch.zig new file mode 100644 index 0000000000000000000000000000000000000000..55d952e0fd8890179342a77d7d4105ed762eccc8 --- /dev/null +++ b/test/compile_errors/stage1/obj/undeclared_identifier_in_unanalyzed_branch.zig @@ -0,0 +1,9 @@ +export fn a() void { + if (false) { + lol_this_doesnt_exist = nonsense; + } +} + +// undeclared identifier in unanalyzed branch +// +// tmp.zig:3:9: error: use of undeclared identifier 'lol_this_doesnt_exist' diff --git a/test/compile_errors/stage1/obj/undefined_as_field_type_is_rejected.zig b/test/compile_errors/stage1/obj/undefined_as_field_type_is_rejected.zig new file mode 100644 index 0000000000000000000000000000000000000000..4035955387bb6bc40f0e1bde8fd71e0fc604ca44 --- /dev/null +++ b/test/compile_errors/stage1/obj/undefined_as_field_type_is_rejected.zig @@ -0,0 +1,11 @@ +const Foo = struct { + a: undefined, +}; +export fn entry1() void { + const foo: Foo = undefined; + _ = foo; +} + +// undefined as field type is rejected +// +// tmp.zig:2:8: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/undefined_function_call.zig b/test/compile_errors/stage1/obj/undefined_function_call.zig new file mode 100644 index 0000000000000000000000000000000000000000..ebf76aafbd5310328015ddb418d757b4bdc48623 --- /dev/null +++ b/test/compile_errors/stage1/obj/undefined_function_call.zig @@ -0,0 +1,7 @@ +export fn a() void { + b(); +} + +// undefined function call +// +// tmp.zig:2:5: error: use of undeclared identifier 'b' diff --git a/test/compile_errors/stage1/obj/underscore_is_not_a_declarable_symbol.zig b/test/compile_errors/stage1/obj/underscore_is_not_a_declarable_symbol.zig new file mode 100644 index 0000000000000000000000000000000000000000..bfcfbc3bcc5bc8f972add81c48de59256db7088f --- /dev/null +++ b/test/compile_errors/stage1/obj/underscore_is_not_a_declarable_symbol.zig @@ -0,0 +1,8 @@ +export fn f1() usize { + var _: usize = 2; + return _; +} + +// `_` is not a declarable symbol +// +// tmp.zig:2:9: error: '_' used as an identifier without @"_" syntax diff --git a/test/compile_errors/stage1/obj/underscore_should_not_be_usable_inside_for.zig b/test/compile_errors/stage1/obj/underscore_should_not_be_usable_inside_for.zig new file mode 100644 index 0000000000000000000000000000000000000000..be2ae559f30bfa89eb150c26bb9285c65a18c65c --- /dev/null +++ b/test/compile_errors/stage1/obj/underscore_should_not_be_usable_inside_for.zig @@ -0,0 +1,11 @@ +export fn returns() void { + for ([_]void{}) |_, i| { + for ([_]void{}) |_, j| { + return _; + } + } +} + +// `_` should not be usable inside for +// +// tmp.zig:4:20: error: '_' used as an identifier without @"_" syntax diff --git a/test/compile_errors/stage1/obj/underscore_should_not_be_usable_inside_while.zig b/test/compile_errors/stage1/obj/underscore_should_not_be_usable_inside_while.zig new file mode 100644 index 0000000000000000000000000000000000000000..d93ed28c9e8e4c2ea349a9d7de1e3000c3e0b537 --- /dev/null +++ b/test/compile_errors/stage1/obj/underscore_should_not_be_usable_inside_while.zig @@ -0,0 +1,14 @@ +export fn returns() void { + while (optionalReturn()) |_| { + while (optionalReturn()) |_| { + return _; + } + } +} +fn optionalReturn() ?u32 { + return 1; +} + +// `_` should not be usable inside while +// +// tmp.zig:4:20: error: '_' used as an identifier without @"_" syntax diff --git a/test/compile_errors/stage1/obj/underscore_should_not_be_usable_inside_while_else.zig b/test/compile_errors/stage1/obj/underscore_should_not_be_usable_inside_while_else.zig new file mode 100644 index 0000000000000000000000000000000000000000..e1e4c7b4c11322d5031727efa191f04fc3dbe7c8 --- /dev/null +++ b/test/compile_errors/stage1/obj/underscore_should_not_be_usable_inside_while_else.zig @@ -0,0 +1,16 @@ +export fn returns() void { + while (optionalReturnError()) |_| { + while (optionalReturnError()) |_| { + return; + } else |_| { + if (_ == error.optionalReturnError) return; + } + } +} +fn optionalReturnError() !?u32 { + return error.optionalReturnError; +} + +// `_` should not be usable inside while else +// +// tmp.zig:6:17: error: '_' used as an identifier without @"_" syntax diff --git a/test/compile_errors/stage1/obj/union_auto-enum_value_already_taken.zig b/test/compile_errors/stage1/obj/union_auto-enum_value_already_taken.zig new file mode 100644 index 0000000000000000000000000000000000000000..377290bd7e3222adb86334c4944dbd57eeab6c87 --- /dev/null +++ b/test/compile_errors/stage1/obj/union_auto-enum_value_already_taken.zig @@ -0,0 +1,16 @@ +const MultipleChoice = union(enum(u32)) { + A = 20, + B = 40, + C = 60, + D = 1000, + E = 60, +}; +export fn entry() void { + var x = MultipleChoice { .C = {} }; + _ = x; +} + +// union auto-enum value already taken +// +// tmp.zig:6:9: error: enum tag value 60 already taken +// tmp.zig:4:9: note: other occurrence here diff --git a/test/compile_errors/stage1/obj/union_enum_field_does_not_match_enum.zig b/test/compile_errors/stage1/obj/union_enum_field_does_not_match_enum.zig new file mode 100644 index 0000000000000000000000000000000000000000..a924932c9f4cb90039c831598ede6cf566db2eb1 --- /dev/null +++ b/test/compile_errors/stage1/obj/union_enum_field_does_not_match_enum.zig @@ -0,0 +1,20 @@ +const Letter = enum { + A, + B, + C, +}; +const Payload = union(Letter) { + A: i32, + B: f64, + C: bool, + D: bool, +}; +export fn entry() void { + var a = Payload {.A = 1234}; + _ = a; +} + +// union enum field does not match enum +// +// tmp.zig:10:5: error: enum field not found: 'D' +// tmp.zig:1:16: note: enum declared here diff --git a/test/compile_errors/stage1/obj/union_fields_with_value_assignments.zig b/test/compile_errors/stage1/obj/union_fields_with_value_assignments.zig new file mode 100644 index 0000000000000000000000000000000000000000..0cf67a0eca14e05aa88526af2648ba9a19d72204 --- /dev/null +++ b/test/compile_errors/stage1/obj/union_fields_with_value_assignments.zig @@ -0,0 +1,12 @@ +const MultipleChoice = union { + A: i32 = 20, +}; +export fn entry() void { + var x: MultipleChoice = undefined; + _ = x; +} + +// union fields with value assignments +// +// tmp.zig:1:24: error: explicitly valued tagged union missing integer tag type +// tmp.zig:2:14: note: tag value specified here diff --git a/test/compile_errors/stage1/obj/union_with_0_fields.zig b/test/compile_errors/stage1/obj/union_with_0_fields.zig new file mode 100644 index 0000000000000000000000000000000000000000..36086e8ccec09a91a2dc6ff6d19445e582602655 --- /dev/null +++ b/test/compile_errors/stage1/obj/union_with_0_fields.zig @@ -0,0 +1,5 @@ +const Foo = union {}; + +// union with 0 fields +// +// tmp.zig:1:13: error: union declarations must have at least one tag diff --git a/test/compile_errors/stage1/obj/union_with_specified_enum_omits_field.zig b/test/compile_errors/stage1/obj/union_with_specified_enum_omits_field.zig new file mode 100644 index 0000000000000000000000000000000000000000..c1c1d38f02e08235d3b42e18972d1edad30646e5 --- /dev/null +++ b/test/compile_errors/stage1/obj/union_with_specified_enum_omits_field.zig @@ -0,0 +1,17 @@ +const Letter = enum { + A, + B, + C, +}; +const Payload = union(Letter) { + A: i32, + B: f64, +}; +export fn entry() usize { + return @sizeOf(Payload); +} + +// union with specified enum omits field +// +// tmp.zig:6:17: error: enum field missing: 'C' +// tmp.zig:4:5: note: declared here diff --git a/test/compile_errors/stage1/obj/union_with_too_small_explicit_signed_tag_type.zig b/test/compile_errors/stage1/obj/union_with_too_small_explicit_signed_tag_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..a3e75c25f65032091ed79ff80f7d944445e6f323 --- /dev/null +++ b/test/compile_errors/stage1/obj/union_with_too_small_explicit_signed_tag_type.zig @@ -0,0 +1,14 @@ +const U = union(enum(i2)) { + A: u8, + B: u8, + C: u8, + D: u8, +}; +export fn entry() void { + _ = U{ .D = 1 }; +} + +// union with too small explicit signed tag type +// +// tmp.zig:1:22: error: specified integer tag type cannot represent every field +// tmp.zig:1:22: note: type i2 cannot fit values in range 0...3 diff --git a/test/compile_errors/stage1/obj/union_with_too_small_explicit_unsigned_tag_type.zig b/test/compile_errors/stage1/obj/union_with_too_small_explicit_unsigned_tag_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..6f13dcda8a78f3c1af900d22f54126fda5905444 --- /dev/null +++ b/test/compile_errors/stage1/obj/union_with_too_small_explicit_unsigned_tag_type.zig @@ -0,0 +1,15 @@ +const U = union(enum(u2)) { + A: u8, + B: u8, + C: u8, + D: u8, + E: u8, +}; +export fn entry() void { + _ = U{ .E = 1 }; +} + +// union with too small explicit unsigned tag type +// +// tmp.zig:1:22: error: specified integer tag type cannot represent every field +// tmp.zig:1:22: note: type u2 cannot fit values in range 0...4 diff --git a/test/compile_errors/stage1/obj/unknown_length_pointer_to_opaque.zig b/test/compile_errors/stage1/obj/unknown_length_pointer_to_opaque.zig new file mode 100644 index 0000000000000000000000000000000000000000..a847bae59971378284c64919bba2c6afa79159e2 --- /dev/null +++ b/test/compile_errors/stage1/obj/unknown_length_pointer_to_opaque.zig @@ -0,0 +1,5 @@ +export const T = [*]opaque {}; + +// unknown length pointer to opaque +// +// tmp.zig:1:21: error: unknown-length pointer to opaque diff --git a/test/compile_errors/stage1/obj/unreachable_code-double_break.zig b/test/compile_errors/stage1/obj/unreachable_code-double_break.zig new file mode 100644 index 0000000000000000000000000000000000000000..b030c1d24dd292359d727feed40cdc102f00924f --- /dev/null +++ b/test/compile_errors/stage1/obj/unreachable_code-double_break.zig @@ -0,0 +1,10 @@ +export fn a() void { + const b = blk: { + break :blk break :blk @as(u32, 1); + }; +} + +// unreachable code - double break +// +// tmp.zig:3:9: error: unreachable code +// tmp.zig:3:20: note: control flow is diverted here diff --git a/test/compile_errors/stage1/obj/unreachable_code-nested_returns.zig b/test/compile_errors/stage1/obj/unreachable_code-nested_returns.zig new file mode 100644 index 0000000000000000000000000000000000000000..7bfa8eef64594f9e78f48c8d70184c5f30e07028 --- /dev/null +++ b/test/compile_errors/stage1/obj/unreachable_code-nested_returns.zig @@ -0,0 +1,8 @@ +export fn a() i32 { + return return 1; +} + +// unreachable code - nested returns +// +// tmp.zig:2:5: error: unreachable code +// tmp.zig:2:12: note: control flow is diverted here diff --git a/test/compile_errors/stage1/obj/unreachable_code.zig b/test/compile_errors/stage1/obj/unreachable_code.zig new file mode 100644 index 0000000000000000000000000000000000000000..779cd903792cc7e8cbde79fea8a23a82a47a0f39 --- /dev/null +++ b/test/compile_errors/stage1/obj/unreachable_code.zig @@ -0,0 +1,11 @@ +export fn a() void { + return; + b(); +} + +fn b() void {} + +// unreachable code +// +// tmp.zig:3:6: error: unreachable code +// tmp.zig:2:5: note: control flow is diverted here diff --git a/test/compile_errors/stage1/obj/unreachable_executed_at_comptime.zig b/test/compile_errors/stage1/obj/unreachable_executed_at_comptime.zig new file mode 100644 index 0000000000000000000000000000000000000000..857ab0417fe4a4f11709073fa0c8db9f6db52336 --- /dev/null +++ b/test/compile_errors/stage1/obj/unreachable_executed_at_comptime.zig @@ -0,0 +1,14 @@ +fn foo(comptime x: i32) i32 { + comptime { + if (x >= 0) return -x; + unreachable; + } +} +export fn entry() void { + _ = foo(-42); +} + +// unreachable executed at comptime +// +// tmp.zig:4:9: error: reached unreachable code +// tmp.zig:8:12: note: called from here diff --git a/test/compile_errors/stage1/obj/unreachable_parameter.zig b/test/compile_errors/stage1/obj/unreachable_parameter.zig new file mode 100644 index 0000000000000000000000000000000000000000..3feed62a1e43b1e32af9f308b377a61c63acafcd --- /dev/null +++ b/test/compile_errors/stage1/obj/unreachable_parameter.zig @@ -0,0 +1,6 @@ +fn f(a: noreturn) void { _ = a; } +export fn entry() void { f(); } + +// unreachable parameter +// +// tmp.zig:1:9: error: parameter of type 'noreturn' not allowed diff --git a/test/compile_errors/stage1/obj/unreachable_variable.zig b/test/compile_errors/stage1/obj/unreachable_variable.zig new file mode 100644 index 0000000000000000000000000000000000000000..8e053acd068860060cfc905e94318f4526c036df --- /dev/null +++ b/test/compile_errors/stage1/obj/unreachable_variable.zig @@ -0,0 +1,8 @@ +export fn f() void { + const a: noreturn = {}; + _ = a; +} + +// unreachable variable +// +// tmp.zig:2:25: error: expected type 'noreturn', found 'void' diff --git a/test/compile_errors/stage1/obj/unreachable_with_return.zig b/test/compile_errors/stage1/obj/unreachable_with_return.zig new file mode 100644 index 0000000000000000000000000000000000000000..ac9ecc93e330f3d751f6a2562d0a359a93dffc41 --- /dev/null +++ b/test/compile_errors/stage1/obj/unreachable_with_return.zig @@ -0,0 +1,6 @@ +fn a() noreturn {return;} +export fn entry() void { a(); } + +// unreachable with return +// +// tmp.zig:1:18: error: expected type 'noreturn', found 'void' diff --git a/test/compile_errors/stage1/obj/unsupported_modifier_at_start_of_asm_output_constraint.zig b/test/compile_errors/stage1/obj/unsupported_modifier_at_start_of_asm_output_constraint.zig new file mode 100644 index 0000000000000000000000000000000000000000..c85850a61bfa99bec798e3ec5399d11c4d26df8f --- /dev/null +++ b/test/compile_errors/stage1/obj/unsupported_modifier_at_start_of_asm_output_constraint.zig @@ -0,0 +1,8 @@ +export fn foo() void { + var bar: u32 = 3; + asm volatile ("" : [baz]"+r"(bar) : : ""); +} + +// unsupported modifier at start of asm output constraint +// +// tmp.zig:3:5: error: invalid modifier starting output constraint for 'baz': '+', only '=' is supported. Compiler TODO: see https://github.com/ziglang/zig/issues/215 diff --git a/test/compile_errors/stage1/obj/use_anyopaque_as_return_type_of_fn_ptr.zig b/test/compile_errors/stage1/obj/use_anyopaque_as_return_type_of_fn_ptr.zig new file mode 100644 index 0000000000000000000000000000000000000000..f54bc149142cb8f5689ea9501ac36b3fd4601962 --- /dev/null +++ b/test/compile_errors/stage1/obj/use_anyopaque_as_return_type_of_fn_ptr.zig @@ -0,0 +1,8 @@ +export fn entry() void { + const a: fn () anyopaque = undefined; + _ = a; +} + +// use anyopaque as return type of fn ptr +// +// tmp.zig:2:20: error: return type cannot be opaque diff --git a/test/compile_errors/stage1/obj/use_implicit_casts_to_assign_null_to_non-nullable_pointer.zig b/test/compile_errors/stage1/obj/use_implicit_casts_to_assign_null_to_non-nullable_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..a8e01dbde0a0925bd21b4a415bcfca03f988f61d --- /dev/null +++ b/test/compile_errors/stage1/obj/use_implicit_casts_to_assign_null_to_non-nullable_pointer.zig @@ -0,0 +1,12 @@ +export fn entry() void { + var x: i32 = 1234; + var p: *i32 = &x; + var pp: *?*i32 = &p; + pp.* = null; + var y = p.*; + _ = y; +} + +// use implicit casts to assign null to non-nullable pointer +// +// tmp.zig:4:23: error: expected type '*?*i32', found '**i32' diff --git a/test/compile_errors/stage1/obj/use_invalid_number_literal_as_array_index.zig b/test/compile_errors/stage1/obj/use_invalid_number_literal_as_array_index.zig new file mode 100644 index 0000000000000000000000000000000000000000..5ec655737e4c0a29c8c2c3930cfa50828f1818de --- /dev/null +++ b/test/compile_errors/stage1/obj/use_invalid_number_literal_as_array_index.zig @@ -0,0 +1,9 @@ +var v = 25; +export fn entry() void { + var arr: [v]u8 = undefined; + _ = arr; +} + +// use invalid number literal as array index +// +// tmp.zig:1:1: error: unable to infer variable type diff --git a/test/compile_errors/stage1/obj/use_of_comptime-known_undefined_function_value.zig b/test/compile_errors/stage1/obj/use_of_comptime-known_undefined_function_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..5facc7e753ca1b11f882024c57cf3e4c9bfbf9d6 --- /dev/null +++ b/test/compile_errors/stage1/obj/use_of_comptime-known_undefined_function_value.zig @@ -0,0 +1,11 @@ +const Cmd = struct { + exec: fn () void, +}; +export fn entry() void { + const command = Cmd{ .exec = undefined }; + command.exec(); +} + +// use of comptime-known undefined function value +// +// tmp.zig:6:12: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/use_of_undeclared_identifier.zig b/test/compile_errors/stage1/obj/use_of_undeclared_identifier.zig new file mode 100644 index 0000000000000000000000000000000000000000..e36453acc7836329be33dee3191089bf96940e47 --- /dev/null +++ b/test/compile_errors/stage1/obj/use_of_undeclared_identifier.zig @@ -0,0 +1,7 @@ +export fn f() void { + b = 3; +} + +// use of undeclared identifier +// +// tmp.zig:2:5: error: use of undeclared identifier 'b' diff --git a/test/compile_errors/stage1/obj/using_an_unknown_len_ptr_type_instead_of_array.zig b/test/compile_errors/stage1/obj/using_an_unknown_len_ptr_type_instead_of_array.zig new file mode 100644 index 0000000000000000000000000000000000000000..983995b0981cd1b09c4603bfef923d3839feb768 --- /dev/null +++ b/test/compile_errors/stage1/obj/using_an_unknown_len_ptr_type_instead_of_array.zig @@ -0,0 +1,11 @@ +const resolutions = [*][*]const u8{ + "[320 240 ]", + null, +}; +comptime { + _ = resolutions; +} + +// using an unknown len ptr type instead of array +// +// tmp.zig:1:21: error: expected array type or [_], found '[*][*]const u8' diff --git a/test/compile_errors/stage1/obj/using_invalid_types_in_function_call_raises_an_error.zig b/test/compile_errors/stage1/obj/using_invalid_types_in_function_call_raises_an_error.zig new file mode 100644 index 0000000000000000000000000000000000000000..182b5c59b05cb85ba8858502798a656d4fa32da1 --- /dev/null +++ b/test/compile_errors/stage1/obj/using_invalid_types_in_function_call_raises_an_error.zig @@ -0,0 +1,9 @@ +const MenuEffect = enum {}; +fn func(effect: MenuEffect) void { _ = effect; } +export fn entry() void { + func(MenuEffect.ThisDoesNotExist); +} + +// using invalid types in function call raises an error +// +// tmp.zig:1:20: error: enum declarations must have at least one tag diff --git a/test/compile_errors/stage1/obj/usingnamespace_with_wrong_type.zig b/test/compile_errors/stage1/obj/usingnamespace_with_wrong_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..a74a8e61243032a68a3747e698bc8a94566818c3 --- /dev/null +++ b/test/compile_errors/stage1/obj/usingnamespace_with_wrong_type.zig @@ -0,0 +1,5 @@ +usingnamespace void; + +// usingnamespace with wrong type +// +// tmp.zig:1:1: error: expected struct, enum, or union; found 'void' diff --git a/test/compile_errors/stage1/obj/variable_has_wrong_type.zig b/test/compile_errors/stage1/obj/variable_has_wrong_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..1e20dde26954a6c7f8a9974bece00baae8f0afc0 --- /dev/null +++ b/test/compile_errors/stage1/obj/variable_has_wrong_type.zig @@ -0,0 +1,8 @@ +export fn f() i32 { + const a = "a"; + return a; +} + +// variable has wrong type +// +// tmp.zig:3:12: error: expected type 'i32', found '*const [1:0]u8' diff --git a/test/compile_errors/stage1/obj/variable_initialization_compile_error_then_referenced.zig b/test/compile_errors/stage1/obj/variable_initialization_compile_error_then_referenced.zig new file mode 100644 index 0000000000000000000000000000000000000000..d96b67bc3f249fba585a8fb4fd2a574b2baec065 --- /dev/null +++ b/test/compile_errors/stage1/obj/variable_initialization_compile_error_then_referenced.zig @@ -0,0 +1,17 @@ +fn Undeclared() type { + return T; +} +fn Gen() type { + const X = Undeclared(); + return struct { + x: X, + }; +} +export fn entry() void { + const S = Gen(); + _ = S; +} + +// variable initialization compile error then referenced +// +// tmp.zig:2:12: error: use of undeclared identifier 'T' diff --git a/test/compile_errors/stage1/obj/variable_with_type_noreturn.zig b/test/compile_errors/stage1/obj/variable_with_type_noreturn.zig new file mode 100644 index 0000000000000000000000000000000000000000..b6cc65593bd3f5ec33076d27bb997b1e066107a6 --- /dev/null +++ b/test/compile_errors/stage1/obj/variable_with_type_noreturn.zig @@ -0,0 +1,8 @@ +export fn entry9() void { + var z: noreturn = return; +} + +// variable with type 'noreturn' +// +// tmp.zig:2:5: error: unreachable code +// tmp.zig:2:23: note: control flow is diverted here diff --git a/test/compile_errors/stage1/obj/vector_index_out_of_bounds.zig b/test/compile_errors/stage1/obj/vector_index_out_of_bounds.zig new file mode 100644 index 0000000000000000000000000000000000000000..efdd8b5fe98e482b0d4226e3fe264e11568b0a9c --- /dev/null +++ b/test/compile_errors/stage1/obj/vector_index_out_of_bounds.zig @@ -0,0 +1,8 @@ +export fn entry() void { + const x = @import("std").meta.Vector(3, f32){ 25, 75, 5, 0 }; + _ = x; +} + +// vector index out of bounds +// +// tmp.zig:2:62: error: index 3 outside vector of size 3 diff --git a/test/compile_errors/stage1/obj/volatile_on_global_assembly.zig b/test/compile_errors/stage1/obj/volatile_on_global_assembly.zig new file mode 100644 index 0000000000000000000000000000000000000000..8fc7ddfcc2d3153130f40b129021481e68d92bf5 --- /dev/null +++ b/test/compile_errors/stage1/obj/volatile_on_global_assembly.zig @@ -0,0 +1,7 @@ +comptime { + asm volatile (""); +} + +// volatile on global assembly +// +// tmp.zig:2:9: error: volatile is meaningless on global assembly diff --git a/test/compile_errors/stage1/obj/wasmMemoryGrow_is_a_compile_error_in_non-Wasm_targets.zig b/test/compile_errors/stage1/obj/wasmMemoryGrow_is_a_compile_error_in_non-Wasm_targets.zig new file mode 100644 index 0000000000000000000000000000000000000000..363b36a0af084145cb79f59d020cdf04ca0a5ca0 --- /dev/null +++ b/test/compile_errors/stage1/obj/wasmMemoryGrow_is_a_compile_error_in_non-Wasm_targets.zig @@ -0,0 +1,8 @@ +export fn foo() void { + _ = @wasmMemoryGrow(0, 1); + return; +} + +// wasmMemoryGrow is a compile error in non-Wasm targets +// +// tmp.zig:2:9: error: @wasmMemoryGrow is a wasm32 feature only diff --git a/test/compile_errors/stage1/obj/wasmMemorySize_is_a_compile_error_in_non-Wasm_targets.zig b/test/compile_errors/stage1/obj/wasmMemorySize_is_a_compile_error_in_non-Wasm_targets.zig new file mode 100644 index 0000000000000000000000000000000000000000..419173bd01195d23ad04fb1a79486400c42a4776 --- /dev/null +++ b/test/compile_errors/stage1/obj/wasmMemorySize_is_a_compile_error_in_non-Wasm_targets.zig @@ -0,0 +1,8 @@ +export fn foo() void { + _ = @wasmMemorySize(0); + return; +} + +// wasmMemorySize is a compile error in non-Wasm targets +// +// tmp.zig:2:9: error: @wasmMemorySize is a wasm32 feature only diff --git a/test/compile_errors/stage1/obj/while_expected_bool_got_error_union.zig b/test/compile_errors/stage1/obj/while_expected_bool_got_error_union.zig new file mode 100644 index 0000000000000000000000000000000000000000..e79296694d3221f11aacfa29e9d775230e4b935b --- /dev/null +++ b/test/compile_errors/stage1/obj/while_expected_bool_got_error_union.zig @@ -0,0 +1,8 @@ +export fn foo() void { + while (bar()) {} +} +fn bar() anyerror!i32 { return 1; } + +// while expected bool, got error union +// +// tmp.zig:2:15: error: expected type 'bool', found 'anyerror!i32' diff --git a/test/compile_errors/stage1/obj/while_expected_bool_got_optional.zig b/test/compile_errors/stage1/obj/while_expected_bool_got_optional.zig new file mode 100644 index 0000000000000000000000000000000000000000..7a3d184a1d771d26ab91ccb8a009debc1cb3a529 --- /dev/null +++ b/test/compile_errors/stage1/obj/while_expected_bool_got_optional.zig @@ -0,0 +1,8 @@ +export fn foo() void { + while (bar()) {} +} +fn bar() ?i32 { return 1; } + +// while expected bool, got optional +// +// tmp.zig:2:15: error: expected type 'bool', found '?i32' diff --git a/test/compile_errors/stage1/obj/while_expected_error_union_got_bool.zig b/test/compile_errors/stage1/obj/while_expected_error_union_got_bool.zig new file mode 100644 index 0000000000000000000000000000000000000000..8f92276af65949080c13889ac3d068db82ef8113 --- /dev/null +++ b/test/compile_errors/stage1/obj/while_expected_error_union_got_bool.zig @@ -0,0 +1,8 @@ +export fn foo() void { + while (bar()) |x| {_ = x;} else |err| {_ = err;} +} +fn bar() bool { return true; } + +// while expected error union, got bool +// +// tmp.zig:2:15: error: expected error union type, found 'bool' diff --git a/test/compile_errors/stage1/obj/while_expected_error_union_got_optional.zig b/test/compile_errors/stage1/obj/while_expected_error_union_got_optional.zig new file mode 100644 index 0000000000000000000000000000000000000000..a67bf1ae1642f1001f11ec88f8feecc012caf222 --- /dev/null +++ b/test/compile_errors/stage1/obj/while_expected_error_union_got_optional.zig @@ -0,0 +1,8 @@ +export fn foo() void { + while (bar()) |x| {_ = x;} else |err| {_ = err;} +} +fn bar() ?i32 { return 1; } + +// while expected error union, got optional +// +// tmp.zig:2:15: error: expected error union type, found '?i32' diff --git a/test/compile_errors/stage1/obj/while_expected_optional_got_bool.zig b/test/compile_errors/stage1/obj/while_expected_optional_got_bool.zig new file mode 100644 index 0000000000000000000000000000000000000000..6fc0d880ce6d67c9d458fb9ff45274fc061ad4dd --- /dev/null +++ b/test/compile_errors/stage1/obj/while_expected_optional_got_bool.zig @@ -0,0 +1,8 @@ +export fn foo() void { + while (bar()) |x| {_ = x;} +} +fn bar() bool { return true; } + +// while expected optional, got bool +// +// tmp.zig:2:15: error: expected optional type, found 'bool' diff --git a/test/compile_errors/stage1/obj/while_expected_optional_got_error_union.zig b/test/compile_errors/stage1/obj/while_expected_optional_got_error_union.zig new file mode 100644 index 0000000000000000000000000000000000000000..472b3b81bc61c0dd685fbb7f2d6993230a74d92a --- /dev/null +++ b/test/compile_errors/stage1/obj/while_expected_optional_got_error_union.zig @@ -0,0 +1,8 @@ +export fn foo() void { + while (bar()) |x| {_ = x;} +} +fn bar() anyerror!i32 { return 1; } + +// while expected optional, got error union +// +// tmp.zig:2:15: error: expected optional type, found 'anyerror!i32' diff --git a/test/compile_errors/stage1/obj/while_loop_body_expression_ignored.zig b/test/compile_errors/stage1/obj/while_loop_body_expression_ignored.zig new file mode 100644 index 0000000000000000000000000000000000000000..621c0d41d7ee32d5edf4c57d9ed728a903eb6f9c --- /dev/null +++ b/test/compile_errors/stage1/obj/while_loop_body_expression_ignored.zig @@ -0,0 +1,20 @@ +fn returns() usize { + return 2; +} +export fn f1() void { + while (true) returns(); +} +export fn f2() void { + var x: ?i32 = null; + while (x) |_| returns(); +} +export fn f3() void { + var x: anyerror!i32 = error.Bad; + while (x) |_| returns() else |_| unreachable; +} + +// while loop body expression ignored +// +// tmp.zig:5:25: error: expression value is ignored +// tmp.zig:9:26: error: expression value is ignored +// tmp.zig:13:26: error: expression value is ignored diff --git a/test/compile_errors/stage1/obj/write_to_const_global_variable.zig b/test/compile_errors/stage1/obj/write_to_const_global_variable.zig new file mode 100644 index 0000000000000000000000000000000000000000..327b3d02d02fc8b7c48766bbba1dbe5e11f70889 --- /dev/null +++ b/test/compile_errors/stage1/obj/write_to_const_global_variable.zig @@ -0,0 +1,9 @@ +const x : i32 = 99; +fn f() void { + x = 1; +} +export fn entry() void { f(); } + +// write to const global variable +// +// tmp.zig:3:9: error: cannot assign to constant diff --git a/test/compile_errors/stage1/obj/wrong_frame_type_used_for_async_call.zig b/test/compile_errors/stage1/obj/wrong_frame_type_used_for_async_call.zig new file mode 100644 index 0000000000000000000000000000000000000000..ba150c45cc4fed8d3792394797bb0ece3bfcebf3 --- /dev/null +++ b/test/compile_errors/stage1/obj/wrong_frame_type_used_for_async_call.zig @@ -0,0 +1,14 @@ +export fn entry() void { + var frame: @Frame(foo) = undefined; + frame = async bar(); +} +fn foo() void { + suspend {} +} +fn bar() void { + suspend {} +} + +// wrong frame type used for async call +// +// tmp.zig:3:13: error: expected type '*@Frame(bar)', found '*@Frame(foo)' diff --git a/test/compile_errors/stage1/obj/wrong_function_type.zig b/test/compile_errors/stage1/obj/wrong_function_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..c2238bb64974f7cc01f354385ecd462384a48e87 --- /dev/null +++ b/test/compile_errors/stage1/obj/wrong_function_type.zig @@ -0,0 +1,9 @@ +const fns = [_]fn() void { a, b, c }; +fn a() i32 {return 0;} +fn b() i32 {return 1;} +fn c() i32 {return 2;} +export fn entry() usize { return @sizeOf(@TypeOf(fns)); } + +// wrong function type +// +// tmp.zig:1:28: error: expected type 'fn() void', found 'fn() i32' diff --git a/test/compile_errors/stage1/obj/wrong_initializer_for_union_payload_of_type_type.zig b/test/compile_errors/stage1/obj/wrong_initializer_for_union_payload_of_type_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..1d56094b6d4e59499a97ac333ed6c50ec0771db4 --- /dev/null +++ b/test/compile_errors/stage1/obj/wrong_initializer_for_union_payload_of_type_type.zig @@ -0,0 +1,14 @@ +const U = union(enum) { + A: type, +}; +const S = struct { + u: U, +}; +export fn entry() void { + comptime var v: S = undefined; + v.u.A = U{ .A = i32 }; +} + +// wrong initializer for union payload of type 'type' +// +// tmp.zig:9:8: error: use of undefined value here causes undefined behavior diff --git a/test/compile_errors/stage1/obj/wrong_number_of_arguments.zig b/test/compile_errors/stage1/obj/wrong_number_of_arguments.zig new file mode 100644 index 0000000000000000000000000000000000000000..4cb13fdd12f2d852d138f9c9078b95c271185a5e --- /dev/null +++ b/test/compile_errors/stage1/obj/wrong_number_of_arguments.zig @@ -0,0 +1,8 @@ +export fn a() void { + c(1); +} +fn c(d: i32, e: i32, f: i32) void { _ = d; _ = e; _ = f; } + +// wrong number of arguments +// +// tmp.zig:2:6: error: expected 3 argument(s), found 1 diff --git a/test/compile_errors/stage1/obj/wrong_number_of_arguments_for_method_fn_call.zig b/test/compile_errors/stage1/obj/wrong_number_of_arguments_for_method_fn_call.zig new file mode 100644 index 0000000000000000000000000000000000000000..25449feb22e668638fff1ae63aa6157c66f35f04 --- /dev/null +++ b/test/compile_errors/stage1/obj/wrong_number_of_arguments_for_method_fn_call.zig @@ -0,0 +1,12 @@ +const Foo = struct { + fn method(self: *const Foo, a: i32) void {_ = self; _ = a;} +}; +fn f(foo: *const Foo) void { + + foo.method(1, 2); +} +export fn entry() usize { return @sizeOf(@TypeOf(f)); } + +// wrong number of arguments for method fn call +// +// tmp.zig:6:15: error: expected 2 argument(s), found 3 diff --git a/test/compile_errors/stage1/obj/wrong_panic_signature_generic_function.zig b/test/compile_errors/stage1/obj/wrong_panic_signature_generic_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..faaa24ba60affc935b5ea4719645435a02aa6272 --- /dev/null +++ b/test/compile_errors/stage1/obj/wrong_panic_signature_generic_function.zig @@ -0,0 +1,10 @@ +pub fn panic(comptime msg: []const u8, error_return_trace: ?*builtin.StackTrace) noreturn { + _ = msg; _ = error_return_trace; + while (true) {} +} +const builtin = @import("std").builtin; + +// wrong panic signature, generic function +// +// error: expected type 'fn([]const u8, ?*std.builtin.StackTrace) noreturn', found 'fn([]const u8,anytype) anytype' +// note: only one of the functions is generic diff --git a/test/compile_errors/stage1/obj/wrong_panic_signature_runtime_function.zig b/test/compile_errors/stage1/obj/wrong_panic_signature_runtime_function.zig new file mode 100644 index 0000000000000000000000000000000000000000..92553c3104430b34ee8ea765c42c86994b1c9bce --- /dev/null +++ b/test/compile_errors/stage1/obj/wrong_panic_signature_runtime_function.zig @@ -0,0 +1,8 @@ +test "" {} + +pub fn panic() void {} + + +// wrong panic signature, runtime function +// +// error: expected type 'fn([]const u8, ?*std.builtin.StackTrace) noreturn', found 'fn() void' diff --git a/test/compile_errors/stage1/obj/wrong_pointer_coerced_to_pointer_to_opaque_{}.zig b/test/compile_errors/stage1/obj/wrong_pointer_coerced_to_pointer_to_opaque_{}.zig new file mode 100644 index 0000000000000000000000000000000000000000..ed88e3be288f591fd0c3c8a78c5ba5227fedc1ea --- /dev/null +++ b/test/compile_errors/stage1/obj/wrong_pointer_coerced_to_pointer_to_opaque_{}.zig @@ -0,0 +1,10 @@ +const Derp = opaque {}; +extern fn bar(d: *Derp) void; +export fn foo() void { + var x = @as(u8, 1); + bar(@ptrCast(*anyopaque, &x)); +} + +// wrong pointer coerced to pointer to opaque {} +// +// tmp.zig:5:9: error: expected type '*Derp', found '*anyopaque' diff --git a/test/compile_errors/stage1/obj/wrong_return_type_for_main.zig b/test/compile_errors/stage1/obj/wrong_return_type_for_main.zig new file mode 100644 index 0000000000000000000000000000000000000000..bf335874db8c8b71a55aaf3a0b53a22b1dfc8004 --- /dev/null +++ b/test/compile_errors/stage1/obj/wrong_return_type_for_main.zig @@ -0,0 +1,5 @@ +pub fn main() f32 { } + +// wrong return type for main +// +// error: expected return type of main to be 'void', '!void', 'noreturn', 'u8', or '!u8' diff --git a/test/compile_errors/stage1/obj/wrong_size_to_an_array_literal.zig b/test/compile_errors/stage1/obj/wrong_size_to_an_array_literal.zig new file mode 100644 index 0000000000000000000000000000000000000000..68cb2632127691c4618809b9a0bcef4b1839385f --- /dev/null +++ b/test/compile_errors/stage1/obj/wrong_size_to_an_array_literal.zig @@ -0,0 +1,8 @@ +comptime { + const array = [2]u8{1, 2, 3}; + _ = array; +} + +// wrong size to an array literal +// +// tmp.zig:2:31: error: index 2 outside array of size 2 diff --git a/test/compile_errors/stage1/obj/wrong_type_for_argument_tuple_to_asyncCall.zig b/test/compile_errors/stage1/obj/wrong_type_for_argument_tuple_to_asyncCall.zig new file mode 100644 index 0000000000000000000000000000000000000000..d9e45a69b7f440dce32cd2e2bf6aaabb9d062f85 --- /dev/null +++ b/test/compile_errors/stage1/obj/wrong_type_for_argument_tuple_to_asyncCall.zig @@ -0,0 +1,12 @@ +export fn entry1() void { + var frame: @Frame(foo) = undefined; + @asyncCall(&frame, {}, foo, {}); +} + +fn foo() i32 { + return 0; +} + +// wrong type for argument tuple to @asyncCall +// +// tmp.zig:3:33: error: expected tuple or struct, found 'void' diff --git a/test/compile_errors/stage1/obj/wrong_type_for_reify_type.zig b/test/compile_errors/stage1/obj/wrong_type_for_reify_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..2d8ea02326640b246762986d3db52fec47e13ced --- /dev/null +++ b/test/compile_errors/stage1/obj/wrong_type_for_reify_type.zig @@ -0,0 +1,7 @@ +export fn entry() void { + _ = @Type(0); +} + +// wrong type for @Type +// +// tmp.zig:2:15: error: expected type 'std.builtin.Type', found 'comptime_int' diff --git a/test/compile_errors/stage1/obj/wrong_type_for_result_ptr_to_asyncCall.zig b/test/compile_errors/stage1/obj/wrong_type_for_result_ptr_to_asyncCall.zig new file mode 100644 index 0000000000000000000000000000000000000000..07c5ae8a0b651f58ee50d0273b263c0f637e73be --- /dev/null +++ b/test/compile_errors/stage1/obj/wrong_type_for_result_ptr_to_asyncCall.zig @@ -0,0 +1,14 @@ +export fn entry() void { + _ = async amain(); +} +fn amain() i32 { + var frame: @Frame(foo) = undefined; + return await @asyncCall(&frame, false, foo, .{}); +} +fn foo() i32 { + return 1234; +} + +// wrong type for result ptr to @asyncCall +// +// tmp.zig:6:37: error: expected type '*i32', found 'bool' diff --git a/test/compile_errors/stage1/obj/wrong_type_passed_to_panic.zig b/test/compile_errors/stage1/obj/wrong_type_passed_to_panic.zig new file mode 100644 index 0000000000000000000000000000000000000000..b16d563571e7ed6fe88ec256ddb4da3f4d1a4ef3 --- /dev/null +++ b/test/compile_errors/stage1/obj/wrong_type_passed_to_panic.zig @@ -0,0 +1,8 @@ +export fn entry() void { + var e = error.Foo; + @panic(e); +} + +// wrong type passed to @panic +// +// tmp.zig:3:12: error: expected type '[]const u8', found 'error{Foo}' diff --git a/test/compile_errors/stage1/obj/wrong_type_to_hasField.zig b/test/compile_errors/stage1/obj/wrong_type_to_hasField.zig new file mode 100644 index 0000000000000000000000000000000000000000..a79fec2a218df2ac24a58c2b023362e73b3976ed --- /dev/null +++ b/test/compile_errors/stage1/obj/wrong_type_to_hasField.zig @@ -0,0 +1,7 @@ +export fn entry() bool { + return @hasField(i32, "hi"); +} + +// wrong type to @hasField +// +// tmp.zig:2:22: error: type 'i32' does not support @hasField diff --git a/test/compile_errors/stage1/obj/wrong_types_given_to_atomic_order_args_in_cmpxchg.zig b/test/compile_errors/stage1/obj/wrong_types_given_to_atomic_order_args_in_cmpxchg.zig new file mode 100644 index 0000000000000000000000000000000000000000..47cdaa372f1c76e307b5bdfebe6c736ab77f445d --- /dev/null +++ b/test/compile_errors/stage1/obj/wrong_types_given_to_atomic_order_args_in_cmpxchg.zig @@ -0,0 +1,8 @@ +export fn entry() void { + var x: i32 = 1234; + while (!@cmpxchgWeak(i32, &x, 1234, 5678, @as(u32, 1234), @as(u32, 1234))) {} +} + +// wrong types given to atomic order args in cmpxchg +// +// tmp.zig:3:47: error: expected type 'std.builtin.AtomicOrder', found 'u32' diff --git a/test/compile_errors/stage1/obj/wrong_types_given_to_export.zig b/test/compile_errors/stage1/obj/wrong_types_given_to_export.zig new file mode 100644 index 0000000000000000000000000000000000000000..cdd7ab46313a54bcc7000d409f25a931976ff750 --- /dev/null +++ b/test/compile_errors/stage1/obj/wrong_types_given_to_export.zig @@ -0,0 +1,8 @@ +fn entry() callconv(.C) void { } +comptime { + @export(entry, .{.name = "entry", .linkage = @as(u32, 1234) }); +} + +// wrong types given to @export +// +// tmp.zig:3:59: error: expected type 'std.builtin.GlobalLinkage', found 'comptime_int' diff --git a/test/compile_errors/stage1/test/access_invalid_typeInfo_decl.zig b/test/compile_errors/stage1/test/access_invalid_typeInfo_decl.zig new file mode 100644 index 0000000000000000000000000000000000000000..2fc5730af02b6d08197133d049a4df1906dd98e6 --- /dev/null +++ b/test/compile_errors/stage1/test/access_invalid_typeInfo_decl.zig @@ -0,0 +1,8 @@ +const A = B; +test "Crash" { + _ = @typeInfo(@This()).Struct.decls[0]; +} + +// access invalid @typeInfo decl +// +// tmp.zig:1:11: error: use of undeclared identifier 'B' diff --git a/test/compile_errors/stage1/test/alignCast_of_zero_sized_types.zig b/test/compile_errors/stage1/test/alignCast_of_zero_sized_types.zig new file mode 100644 index 0000000000000000000000000000000000000000..4c05571202b48c5ee09381bd9d0b1704028d8a97 --- /dev/null +++ b/test/compile_errors/stage1/test/alignCast_of_zero_sized_types.zig @@ -0,0 +1,25 @@ +export fn foo() void { + const a: *void = undefined; + _ = @alignCast(2, a); +} +export fn bar() void { + const a: ?*void = undefined; + _ = @alignCast(2, a); +} +export fn baz() void { + const a: []void = undefined; + _ = @alignCast(2, a); +} +export fn qux() void { + const a = struct { + fn a(comptime b: u32) void { _ = b; } + }.a; + _ = @alignCast(2, a); +} + +// @alignCast of zero sized types +// +// tmp.zig:3:23: error: cannot adjust alignment of zero sized type '*void' +// tmp.zig:7:23: error: cannot adjust alignment of zero sized type '?*void' +// tmp.zig:11:23: error: cannot adjust alignment of zero sized type '[]void' +// tmp.zig:17:23: error: cannot adjust alignment of zero sized type 'fn(u32) anytype' diff --git a/test/compile_errors/stage1/test/bad_splat_type.zig b/test/compile_errors/stage1/test/bad_splat_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..9a16bbc73d88de9b6ce199f4f529e0e0d623bf3d --- /dev/null +++ b/test/compile_errors/stage1/test/bad_splat_type.zig @@ -0,0 +1,9 @@ +export fn entry() void { + const c = 4; + var v = @splat(4, c); + _ = v; +} + +// bad @splat type +// +// tmp.zig:3:23: error: vector element type must be integer, float, bool, or pointer; 'comptime_int' is invalid diff --git a/test/compile_errors/stage1/test/binary_OR_operator_on_error_sets.zig b/test/compile_errors/stage1/test/binary_OR_operator_on_error_sets.zig new file mode 100644 index 0000000000000000000000000000000000000000..d9894a32a040c5b8e23280d0bf4951c40a810881 --- /dev/null +++ b/test/compile_errors/stage1/test/binary_OR_operator_on_error_sets.zig @@ -0,0 +1,10 @@ +pub const A = error.A; +pub const AB = A | error.B; +export fn entry() void { + var x: AB = undefined; + _ = x; +} + +// binary OR operator on error sets +// +// tmp.zig:2:18: error: invalid operands to binary expression: 'error{A}' and 'error{B}' diff --git a/test/compile_errors/stage1/test/call_rejects_non_comptime-known_fn-always_inline.zig b/test/compile_errors/stage1/test/call_rejects_non_comptime-known_fn-always_inline.zig new file mode 100644 index 0000000000000000000000000000000000000000..ea822f8d915ce67a15d433f3fb90c6af8c7917a1 --- /dev/null +++ b/test/compile_errors/stage1/test/call_rejects_non_comptime-known_fn-always_inline.zig @@ -0,0 +1,8 @@ +pub export fn entry() void { + var call_me: fn () void = undefined; + @call(.{ .modifier = .always_inline }, call_me, .{}); +} + +// @call rejects non comptime-known fn - always_inline +// +// tmp.zig:3:5: error: the specified modifier requires a comptime-known function diff --git a/test/compile_errors/stage1/test/call_rejects_non_comptime-known_fn-compile_time.zig b/test/compile_errors/stage1/test/call_rejects_non_comptime-known_fn-compile_time.zig new file mode 100644 index 0000000000000000000000000000000000000000..3c50830787ab442a95ae556b3f39550c6a394137 --- /dev/null +++ b/test/compile_errors/stage1/test/call_rejects_non_comptime-known_fn-compile_time.zig @@ -0,0 +1,8 @@ +pub export fn entry() void { + var call_me: fn () void = undefined; + @call(.{ .modifier = .compile_time }, call_me, .{}); +} + +// @call rejects non comptime-known fn - compile_time +// +// tmp.zig:3:5: error: the specified modifier requires a comptime-known function diff --git a/test/compile_errors/stage1/test/cast_between_optional_T_where_T_is_not_a_pointer.zig b/test/compile_errors/stage1/test/cast_between_optional_T_where_T_is_not_a_pointer.zig new file mode 100644 index 0000000000000000000000000000000000000000..8f5ca1c25dea130aaed32ec80e48a1557414e599 --- /dev/null +++ b/test/compile_errors/stage1/test/cast_between_optional_T_where_T_is_not_a_pointer.zig @@ -0,0 +1,12 @@ +pub const fnty1 = ?fn (i8) void; +pub const fnty2 = ?fn (u64) void; +export fn entry() void { + var a: fnty1 = undefined; + var b: fnty2 = undefined; + a = b; +} + +// cast between ?T where T is not a pointer +// +// tmp.zig:6:9: error: expected type '?fn(i8) void', found '?fn(u64) void' +// tmp.zig:6:9: note: optional type child 'fn(u64) void' cannot cast into optional type child 'fn(i8) void' diff --git a/test/compile_errors/stage1/test/combination_of_nosuspend_and_async.zig b/test/compile_errors/stage1/test/combination_of_nosuspend_and_async.zig new file mode 100644 index 0000000000000000000000000000000000000000..a164fb621b234dbd66a6226b1ed0b9f462448110 --- /dev/null +++ b/test/compile_errors/stage1/test/combination_of_nosuspend_and_async.zig @@ -0,0 +1,13 @@ +export fn entry() void { + nosuspend { + const bar = async foo(); + suspend {} + resume bar; + } +} +fn foo() void {} + +// combination of nosuspend and async +// +// tmp.zig:4:9: error: suspend inside nosuspend block +// tmp.zig:2:5: note: nosuspend block here diff --git a/test/compile_errors/stage1/test/comparison_of_non-tagged_union_and_enum_literal.zig b/test/compile_errors/stage1/test/comparison_of_non-tagged_union_and_enum_literal.zig new file mode 100644 index 0000000000000000000000000000000000000000..b3c15067057942f8249fa22e9d1995aed8def1ab --- /dev/null +++ b/test/compile_errors/stage1/test/comparison_of_non-tagged_union_and_enum_literal.zig @@ -0,0 +1,11 @@ +export fn entry() void { + const U = union { A: u32, B: u64 }; + var u = U{ .A = 42 }; + var ok = u == .A; + _ = ok; +} + +// comparison of non-tagged union and enum literal +// +// tmp.zig:4:16: error: comparison of union and enum literal is only valid for tagged union types +// tmp.zig:2:15: note: type U is not a tagged union diff --git a/test/compile_errors/stage1/test/comptime_vector_overflow_shows_the_index.zig b/test/compile_errors/stage1/test/comptime_vector_overflow_shows_the_index.zig new file mode 100644 index 0000000000000000000000000000000000000000..a638c05b3bf37878006157d50a38ee86b003617d --- /dev/null +++ b/test/compile_errors/stage1/test/comptime_vector_overflow_shows_the_index.zig @@ -0,0 +1,11 @@ +comptime { + var a: @import("std").meta.Vector(4, u8) = [_]u8{ 1, 2, 255, 4 }; + var b: @import("std").meta.Vector(4, u8) = [_]u8{ 5, 6, 1, 8 }; + var x = a + b; + _ = x; +} + +// comptime vector overflow shows the index +// +// tmp.zig:4:15: error: operation caused overflow +// tmp.zig:4:15: note: when computing vector element at index 2 diff --git a/test/compile_errors/stage1/test/duplicate-unused_labels.zig b/test/compile_errors/stage1/test/duplicate-unused_labels.zig new file mode 100644 index 0000000000000000000000000000000000000000..285741afc4f4c7fb532db58105df50f484d09a85 --- /dev/null +++ b/test/compile_errors/stage1/test/duplicate-unused_labels.zig @@ -0,0 +1,30 @@ +comptime { + blk: { blk: while (false) {} } +} +comptime { + blk: while (false) { blk: for (@as([0]void, undefined)) |_| {} } +} +comptime { + blk: for (@as([0]void, undefined)) |_| { blk: {} } +} +comptime { + blk: {} +} +comptime { + blk: while(false) {} +} +comptime { + blk: for(@as([0]void, undefined)) |_| {} +} + +// duplicate/unused labels +// +// tmp.zig:2:12: error: redefinition of label 'blk' +// tmp.zig:2:5: note: previous definition here +// tmp.zig:5:26: error: redefinition of label 'blk' +// tmp.zig:5:5: note: previous definition here +// tmp.zig:8:46: error: redefinition of label 'blk' +// tmp.zig:8:5: note: previous definition here +// tmp.zig:11:5: error: unused block label +// tmp.zig:14:5: error: unused while loop label +// tmp.zig:17:5: error: unused for loop label diff --git a/test/compile_errors/stage1/test/duplicate_field_in_anonymous_struct_literal.zig b/test/compile_errors/stage1/test/duplicate_field_in_anonymous_struct_literal.zig new file mode 100644 index 0000000000000000000000000000000000000000..1b671d2ad3213a2f138102e31050b0f87f238ce4 --- /dev/null +++ b/test/compile_errors/stage1/test/duplicate_field_in_anonymous_struct_literal.zig @@ -0,0 +1,16 @@ +export fn entry() void { + const anon = .{ + .inner = .{ + .a = .{ + .something = "text", + }, + .a = .{}, + }, + }; + _ = anon; +} + +// duplicate field in anonymous struct literal +// +// tmp.zig:7:13: error: duplicate field +// tmp.zig:4:13: note: other field here diff --git a/test/compile_errors/stage1/test/error_in_struct_initializer_doesnt_crash_the_compiler.zig b/test/compile_errors/stage1/test/error_in_struct_initializer_doesnt_crash_the_compiler.zig new file mode 100644 index 0000000000000000000000000000000000000000..e37b887121fe0af5fa3d98de89bcfd385b0f3c48 --- /dev/null +++ b/test/compile_errors/stage1/test/error_in_struct_initializer_doesnt_crash_the_compiler.zig @@ -0,0 +1,12 @@ +pub export fn entry() void { + const bitfield = struct { + e: u8, + e: u8, + }; + var a = .{@sizeOf(bitfield)}; + _ = a; +} + +// error in struct initializer doesn't crash the compiler +// +// tmp.zig:4:9: error: duplicate struct field: 'e' diff --git a/test/compile_errors/stage1/test/errors_in_for_loop_bodies_are_propagated.zig b/test/compile_errors/stage1/test/errors_in_for_loop_bodies_are_propagated.zig new file mode 100644 index 0000000000000000000000000000000000000000..32e99cf4106df948fc536c769ae8463dab12e5ca --- /dev/null +++ b/test/compile_errors/stage1/test/errors_in_for_loop_bodies_are_propagated.zig @@ -0,0 +1,8 @@ +pub export fn entry() void { + var arr: [100]u8 = undefined; + for (arr) |bits| _ = @popCount(bits); +} + +// errors in for loop bodies are propagated +// +// tmp.zig:3:26: error: expected 2 arguments, found 1 diff --git a/test/compile_errors/stage1/test/export_with_empty_name_string.zig b/test/compile_errors/stage1/test/export_with_empty_name_string.zig new file mode 100644 index 0000000000000000000000000000000000000000..424ee6e4b5effd5b44ae7ba09d04787fb9e71fc1 --- /dev/null +++ b/test/compile_errors/stage1/test/export_with_empty_name_string.zig @@ -0,0 +1,8 @@ +pub export fn entry() void { } +comptime { + @export(entry, .{ .name = "" }); +} + +// @export with empty name string +// +// tmp.zig:3:5: error: exported symbol name cannot be empty diff --git a/test/compile_errors/stage1/test/helpful_return_type_error_message.zig b/test/compile_errors/stage1/test/helpful_return_type_error_message.zig new file mode 100644 index 0000000000000000000000000000000000000000..6f1f9639da60e0af9eddcc254b6eb0835667105c --- /dev/null +++ b/test/compile_errors/stage1/test/helpful_return_type_error_message.zig @@ -0,0 +1,27 @@ +export fn foo() u32 { + return error.Ohno; +} +fn bar() !u32 { + return error.Ohno; +} +export fn baz() void { + try bar(); +} +export fn qux() u32 { + return bar(); +} +export fn quux() u32 { + var buf: u32 = 0; + buf = bar(); +} + +// helpful return type error message +// +// tmp.zig:2:17: error: expected type 'u32', found 'error{Ohno}' +// tmp.zig:1:17: note: function cannot return an error +// tmp.zig:8:5: error: expected type 'void', found '@typeInfo(@typeInfo(@TypeOf(bar)).Fn.return_type.?).ErrorUnion.error_set' +// tmp.zig:7:17: note: function cannot return an error +// tmp.zig:11:15: error: cannot convert error union to payload type. consider using `try`, `catch`, or `if`. expected type 'u32', found '@typeInfo(@typeInfo(@TypeOf(bar)).Fn.return_type.?).ErrorUnion.error_set!u32' +// tmp.zig:10:17: note: function cannot return an error +// tmp.zig:15:14: error: cannot convert error union to payload type. consider using `try`, `catch`, or `if`. expected type 'u32', found '@typeInfo(@typeInfo(@TypeOf(bar)).Fn.return_type.?).ErrorUnion.error_set!u32' +// tmp.zig:14:5: note: cannot store an error in type 'u32' diff --git a/test/compile_errors/stage1/test/int-float_conversion_to_comptime_int-float.zig b/test/compile_errors/stage1/test/int-float_conversion_to_comptime_int-float.zig new file mode 100644 index 0000000000000000000000000000000000000000..eeb2e4798efd58e72fff750534ae56fefade8f4e --- /dev/null +++ b/test/compile_errors/stage1/test/int-float_conversion_to_comptime_int-float.zig @@ -0,0 +1,13 @@ +export fn foo() void { + var a: f32 = 2; + _ = @floatToInt(comptime_int, a); +} +export fn bar() void { + var a: u32 = 2; + _ = @intToFloat(comptime_float, a); +} + +// int/float conversion to comptime_int/float +// +// tmp.zig:3:35: error: unable to evaluate constant expression +// tmp.zig:7:37: error: unable to evaluate constant expression diff --git a/test/compile_errors/stage1/test/invalid_assignments.zig b/test/compile_errors/stage1/test/invalid_assignments.zig new file mode 100644 index 0000000000000000000000000000000000000000..203784c554ac4c8762f3336178bcb45e7d231e92 --- /dev/null +++ b/test/compile_errors/stage1/test/invalid_assignments.zig @@ -0,0 +1,17 @@ +export fn entry1() void { + var a: []const u8 = "foo"; + a[0..2] = "bar"; +} +export fn entry2() void { + var a: u8 = 2; + a + 2 = 3; +} +export fn entry4() void { + 2 + 2 = 3; +} + +// invalid assignments +// +// tmp.zig:3:6: error: invalid left-hand side to assignment +// tmp.zig:7:7: error: invalid left-hand side to assignment +// tmp.zig:10:7: error: invalid left-hand side to assignment diff --git a/test/compile_errors/stage1/test/invalid_float_casts.zig b/test/compile_errors/stage1/test/invalid_float_casts.zig new file mode 100644 index 0000000000000000000000000000000000000000..0e2509dcaf4b190cd690abd5bd3b0858bebd8c15 --- /dev/null +++ b/test/compile_errors/stage1/test/invalid_float_casts.zig @@ -0,0 +1,23 @@ +export fn foo() void { + var a: f32 = 2; + _ = @floatCast(comptime_float, a); +} +export fn bar() void { + var a: f32 = 2; + _ = @floatToInt(f32, a); +} +export fn baz() void { + var a: f32 = 2; + _ = @intToFloat(f32, a); +} +export fn qux() void { + var a: u32 = 2; + _ = @floatCast(f32, a); +} + +// invalid float casts +// +// tmp.zig:3:36: error: unable to evaluate constant expression +// tmp.zig:7:21: error: expected integer type, found 'f32' +// tmp.zig:11:26: error: expected int type, found 'f32' +// tmp.zig:15:25: error: expected float type, found 'u32' diff --git a/test/compile_errors/stage1/test/invalid_int_casts.zig b/test/compile_errors/stage1/test/invalid_int_casts.zig new file mode 100644 index 0000000000000000000000000000000000000000..6870ecc723e2c1aee3a9dc85d167854855f1be72 --- /dev/null +++ b/test/compile_errors/stage1/test/invalid_int_casts.zig @@ -0,0 +1,23 @@ +export fn foo() void { + var a: u32 = 2; + _ = @intCast(comptime_int, a); +} +export fn bar() void { + var a: u32 = 2; + _ = @intToFloat(u32, a); +} +export fn baz() void { + var a: u32 = 2; + _ = @floatToInt(u32, a); +} +export fn qux() void { + var a: f32 = 2; + _ = @intCast(u32, a); +} + +// invalid int casts +// +// tmp.zig:3:32: error: unable to evaluate constant expression +// tmp.zig:7:21: error: expected float type, found 'u32' +// tmp.zig:11:26: error: expected float type, found 'u32' +// tmp.zig:15:23: error: expected integer type, found 'f32' diff --git a/test/compile_errors/stage1/test/invalid_non-exhaustive_enum_to_union.zig b/test/compile_errors/stage1/test/invalid_non-exhaustive_enum_to_union.zig new file mode 100644 index 0000000000000000000000000000000000000000..f78a9e62ffbe5e3b671e1cb79892d231617e687e --- /dev/null +++ b/test/compile_errors/stage1/test/invalid_non-exhaustive_enum_to_union.zig @@ -0,0 +1,24 @@ +const E = enum(u8) { + a, + b, + _, +}; +const U = union(E) { + a, + b, +}; +export fn foo() void { + var e = @intToEnum(E, 15); + var u: U = e; + _ = u; +} +export fn bar() void { + const e = @intToEnum(E, 15); + var u: U = e; + _ = u; +} + +// invalid non-exhaustive enum to union +// +// tmp.zig:12:16: error: runtime cast to union 'U' from non-exhaustive enum +// tmp.zig:17:16: error: no tag by value 15 diff --git a/test/compile_errors/stage1/test/invalid_pointer_with_reify_type.zig b/test/compile_errors/stage1/test/invalid_pointer_with_reify_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..febf9685fd744f68f1f73de87452f75428fdf436 --- /dev/null +++ b/test/compile_errors/stage1/test/invalid_pointer_with_reify_type.zig @@ -0,0 +1,16 @@ +export fn entry() void { + _ = @Type(.{ .Pointer = .{ + .size = .One, + .is_const = false, + .is_volatile = false, + .alignment = 1, + .address_space = .generic, + .child = u8, + .is_allowzero = false, + .sentinel = &@as(u8, 0), + }}); +} + +// invalid pointer with @Type +// +// tmp.zig:2:16: error: sentinels are only allowed on slices and unknown-length pointers diff --git a/test/compile_errors/stage1/test/nested_vectors.zig b/test/compile_errors/stage1/test/nested_vectors.zig new file mode 100644 index 0000000000000000000000000000000000000000..a05e9b0c5b121de03dd47b93961c20decaa24d4c --- /dev/null +++ b/test/compile_errors/stage1/test/nested_vectors.zig @@ -0,0 +1,10 @@ +export fn entry() void { + const V1 = @import("std").meta.Vector(4, u8); + const V2 = @Type(.{ .Vector = .{ .len = 4, .child = V1 } }); + var v: V2 = undefined; + _ = v; +} + +// nested vectors +// +// tmp.zig:3:23: error: vector element type must be integer, float, bool, or pointer; '@Vector(4, u8)' is invalid diff --git a/test/compile_errors/stage1/test/non-exhaustive_enum_marker_assigned_a_value.zig b/test/compile_errors/stage1/test/non-exhaustive_enum_marker_assigned_a_value.zig new file mode 100644 index 0000000000000000000000000000000000000000..53037ff18111bc64cc302cadc6faee0bc9d80984 --- /dev/null +++ b/test/compile_errors/stage1/test/non-exhaustive_enum_marker_assigned_a_value.zig @@ -0,0 +1,17 @@ +const A = enum { + a, + b, + _ = 1, +}; +const B = enum { + a, + b, + _, +}; +comptime { _ = A; _ = B; } + +// non-exhaustive enum marker assigned a value +// +// tmp.zig:4:9: error: '_' is used to mark an enum as non-exhaustive and cannot be assigned a value +// tmp.zig:6:11: error: non-exhaustive enum missing integer tag type +// tmp.zig:9:5: note: marked non-exhaustive here diff --git a/test/compile_errors/stage1/test/non-exhaustive_enums.zig b/test/compile_errors/stage1/test/non-exhaustive_enums.zig new file mode 100644 index 0000000000000000000000000000000000000000..49ceff3178d56b046c0f835c1044abe195e0d066 --- /dev/null +++ b/test/compile_errors/stage1/test/non-exhaustive_enums.zig @@ -0,0 +1,19 @@ +const B = enum(u1) { + a, + _, + b, +}; +const C = enum(u1) { + a, + b, + _, +}; +pub export fn entry() void { + _ = B; + _ = C; +} + +// non-exhaustive enums +// +// tmp.zig:3:5: error: '_' field of non-exhaustive enum must be last +// tmp.zig:6:11: error: non-exhaustive enum specifies every value diff --git a/test/compile_errors/stage1/test/not_an_enum_type.zig b/test/compile_errors/stage1/test/not_an_enum_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..f92c3d44e1c9a07b4ddb55209f6b21ff71075626 --- /dev/null +++ b/test/compile_errors/stage1/test/not_an_enum_type.zig @@ -0,0 +1,17 @@ +export fn entry() void { + var self: Error = undefined; + switch (self) { + InvalidToken => |x| return x.token, + ExpectedVarDeclOrFn => |x| return x.token, + } +} +const Error = union(enum) { + A: InvalidToken, + B: ExpectedVarDeclOrFn, +}; +const InvalidToken = struct {}; +const ExpectedVarDeclOrFn = struct {}; + +// not an enum type +// +// tmp.zig:4:9: error: expected type '@typeInfo(Error).Union.tag_type.?', found 'type' diff --git a/test/compile_errors/stage1/test/packed_struct_with_fields_of_not_allowed_types.zig b/test/compile_errors/stage1/test/packed_struct_with_fields_of_not_allowed_types.zig new file mode 100644 index 0000000000000000000000000000000000000000..dc156342f4a4ad4e0d980d7f4a86a43df9ad4ca5 --- /dev/null +++ b/test/compile_errors/stage1/test/packed_struct_with_fields_of_not_allowed_types.zig @@ -0,0 +1,71 @@ +const A = packed struct { + x: anyerror, +}; +const B = packed struct { + x: [2]u24, +}; +const C = packed struct { + x: [1]anyerror, +}; +const D = packed struct { + x: [1]S, +}; +const E = packed struct { + x: [1]U, +}; +const F = packed struct { + x: ?anyerror, +}; +const G = packed struct { + x: Enum, +}; +export fn entry1() void { + var a: A = undefined; + _ = a; +} +export fn entry2() void { + var b: B = undefined; + _ = b; +} +export fn entry3() void { + var r: C = undefined; + _ = r; +} +export fn entry4() void { + var d: D = undefined; + _ = d; +} +export fn entry5() void { + var e: E = undefined; + _ = e; +} +export fn entry6() void { + var f: F = undefined; + _ = f; +} +export fn entry7() void { + var g: G = undefined; + _ = g; +} +const S = struct { + x: i32, +}; +const U = struct { + A: i32, + B: u32, +}; +const Enum = enum { + A, + B, +}; + +// packed struct with fields of not allowed types +// +// tmp.zig:2:5: error: type 'anyerror' not allowed in packed struct; no guaranteed in-memory representation +// tmp.zig:5:5: error: array of 'u24' not allowed in packed struct due to padding bits (must be padded from 48 to 64 bits) +// tmp.zig:8:5: error: type 'anyerror' not allowed in packed struct; no guaranteed in-memory representation +// tmp.zig:11:5: error: non-packed, non-extern struct 'S' not allowed in packed struct; no guaranteed in-memory representation +// tmp.zig:14:5: error: non-packed, non-extern struct 'U' not allowed in packed struct; no guaranteed in-memory representation +// tmp.zig:17:5: error: type '?anyerror' not allowed in packed struct; no guaranteed in-memory representation +// tmp.zig:20:5: error: type 'Enum' not allowed in packed struct; no guaranteed in-memory representation +// tmp.zig:57:14: note: enum declaration does not specify an integer tag type diff --git a/test/compile_errors/stage1/test/ptrToInt_with_pointer_to_zero-sized_type.zig b/test/compile_errors/stage1/test/ptrToInt_with_pointer_to_zero-sized_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..63ba217247d57365c6a39b26c31f45713e849d73 --- /dev/null +++ b/test/compile_errors/stage1/test/ptrToInt_with_pointer_to_zero-sized_type.zig @@ -0,0 +1,9 @@ +export fn entry() void { + var pointer: ?*u0 = null; + var x = @ptrToInt(pointer); + _ = x; +} + +// @ptrToInt with pointer to zero-sized type +// +// tmp.zig:3:23: error: pointer to size 0 type has no address diff --git a/test/compile_errors/stage1/test/reassign_to_array_parameter.zig b/test/compile_errors/stage1/test/reassign_to_array_parameter.zig new file mode 100644 index 0000000000000000000000000000000000000000..a222150a2c5db2631dfc78d2a2e273fdbb5c7136 --- /dev/null +++ b/test/compile_errors/stage1/test/reassign_to_array_parameter.zig @@ -0,0 +1,10 @@ +fn reassign(a: [3]f32) void { + a = [3]f32{4, 5, 6}; +} +export fn entry() void { + reassign(.{1, 2, 3}); +} + +// reassign to array parameter +// +// tmp.zig:2:15: error: cannot assign to constant diff --git a/test/compile_errors/stage1/test/reassign_to_slice_parameter.zig b/test/compile_errors/stage1/test/reassign_to_slice_parameter.zig new file mode 100644 index 0000000000000000000000000000000000000000..a8e555182a0746882813450872dfe1eb1d8f750b --- /dev/null +++ b/test/compile_errors/stage1/test/reassign_to_slice_parameter.zig @@ -0,0 +1,10 @@ +pub fn reassign(s: []const u8) void { + s = s[0..]; +} +export fn entry() void { + reassign("foo"); +} + +// reassign to slice parameter +// +// tmp.zig:2:10: error: cannot assign to constant diff --git a/test/compile_errors/stage1/test/reassign_to_struct_parameter.zig b/test/compile_errors/stage1/test/reassign_to_struct_parameter.zig new file mode 100644 index 0000000000000000000000000000000000000000..018548ab32d00dcb61f9d552f18753d347a9b4f8 --- /dev/null +++ b/test/compile_errors/stage1/test/reassign_to_struct_parameter.zig @@ -0,0 +1,13 @@ +const S = struct { + x: u32, +}; +fn reassign(s: S) void { + s = S{.x = 2}; +} +export fn entry() void { + reassign(S{.x = 3}); +} + +// reassign to struct parameter +// +// tmp.zig:5:10: error: cannot assign to constant diff --git a/test/compile_errors/stage1/test/reference_to_const_data.zig b/test/compile_errors/stage1/test/reference_to_const_data.zig new file mode 100644 index 0000000000000000000000000000000000000000..d785eb648ed5f35a03812d25b7a970a44a4fe195 --- /dev/null +++ b/test/compile_errors/stage1/test/reference_to_const_data.zig @@ -0,0 +1,27 @@ +export fn foo() void { + var ptr = &[_]u8{0,0,0,0}; + ptr[1] = 2; +} +export fn bar() void { + var ptr = &@as(u32, 2); + ptr.* = 2; +} +export fn baz() void { + var ptr = &true; + ptr.* = false; +} +export fn qux() void { + const S = struct{ + x: usize, + y: usize, + }; + var ptr = &S{.x=1,.y=2}; + ptr.x = 2; +} + +// reference to const data +// +// tmp.zig:3:14: error: cannot assign to constant +// tmp.zig:7:13: error: cannot assign to constant +// tmp.zig:11:13: error: cannot assign to constant +// tmp.zig:19:13: error: cannot assign to constant diff --git a/test/compile_errors/stage1/test/reify_typeOf_with_incompatible_arguments.zig b/test/compile_errors/stage1/test/reify_typeOf_with_incompatible_arguments.zig new file mode 100644 index 0000000000000000000000000000000000000000..97ee7aaf1b023737aeafe5787632605d5943ce01 --- /dev/null +++ b/test/compile_errors/stage1/test/reify_typeOf_with_incompatible_arguments.zig @@ -0,0 +1,9 @@ +export fn entry() void { + var var_1: f32 = undefined; + var var_2: u32 = undefined; + _ = @TypeOf(var_1, var_2); +} + +// @TypeOf with incompatible arguments +// +// tmp.zig:4:9: error: incompatible types: 'f32' and 'u32' diff --git a/test/compile_errors/stage1/test/reify_typeOf_with_no_arguments.zig b/test/compile_errors/stage1/test/reify_typeOf_with_no_arguments.zig new file mode 100644 index 0000000000000000000000000000000000000000..e18b9e66b7c3db5f2452f658f51440bc40226115 --- /dev/null +++ b/test/compile_errors/stage1/test/reify_typeOf_with_no_arguments.zig @@ -0,0 +1,7 @@ +export fn entry() void { + _ = @TypeOf(); +} + +// @TypeOf with no arguments +// +// tmp.zig:2:9: error: expected at least 1 argument, found 0 diff --git a/test/compile_errors/stage1/test/reject_extern_function_definitions_with_body.zig b/test/compile_errors/stage1/test/reject_extern_function_definitions_with_body.zig new file mode 100644 index 0000000000000000000000000000000000000000..024080a6bcd2469ff08208349a29cc5acf181797 --- /dev/null +++ b/test/compile_errors/stage1/test/reject_extern_function_definitions_with_body.zig @@ -0,0 +1,7 @@ +extern "c" fn definitelyNotInLibC(a: i32, b: i32) i32 { + return a + b; +} + +// reject extern function definitions with body +// +// tmp.zig:1:1: error: extern functions have no body diff --git a/test/compile_errors/stage1/test/reject_extern_variables_with_initializers.zig b/test/compile_errors/stage1/test/reject_extern_variables_with_initializers.zig new file mode 100644 index 0000000000000000000000000000000000000000..d3f65ff0cb762fdf275f4b6f048b726599d84542 --- /dev/null +++ b/test/compile_errors/stage1/test/reject_extern_variables_with_initializers.zig @@ -0,0 +1,5 @@ +extern var foo: int = 2; + +// reject extern variables with initializers +// +// tmp.zig:1:23: error: extern variables have no initializers diff --git a/test/compile_errors/stage1/test/repeated_invalid_field_access_to_generic_function_returning_type_crashes_compiler_2655.zig b/test/compile_errors/stage1/test/repeated_invalid_field_access_to_generic_function_returning_type_crashes_compiler_2655.zig new file mode 100644 index 0000000000000000000000000000000000000000..c419a6ae836861f12f9e17a407763c47dfa9a759 --- /dev/null +++ b/test/compile_errors/stage1/test/repeated_invalid_field_access_to_generic_function_returning_type_crashes_compiler_2655.zig @@ -0,0 +1,11 @@ +pub fn A() type { + return Q; +} +test "1" { + _ = A().a; + _ = A().a; +} + +// repeated invalid field access to generic function returning type crashes compiler. #2655 +// +// tmp.zig:2:12: error: use of undeclared identifier 'Q' diff --git a/test/compile_errors/stage1/test/return_invalid_type_from_test.zig b/test/compile_errors/stage1/test/return_invalid_type_from_test.zig new file mode 100644 index 0000000000000000000000000000000000000000..e7aeab3be7f0e47eec8c1386a41c39ec1b6d1d10 --- /dev/null +++ b/test/compile_errors/stage1/test/return_invalid_type_from_test.zig @@ -0,0 +1,5 @@ +test "example" { return 1; } + +// return invalid type from test +// +// tmp.zig:1:25: error: expected type 'void', found 'comptime_int' diff --git a/test/compile_errors/stage1/test/shift_on_type_with_non-power-of-two_size.zig b/test/compile_errors/stage1/test/shift_on_type_with_non-power-of-two_size.zig new file mode 100644 index 0000000000000000000000000000000000000000..d76406223df030d738edec63be43b24e020af60f --- /dev/null +++ b/test/compile_errors/stage1/test/shift_on_type_with_non-power-of-two_size.zig @@ -0,0 +1,31 @@ +export fn entry() void { + const S = struct { + fn a() void { + var x: u24 = 42; + _ = x >> 24; + } + fn b() void { + var x: u24 = 42; + _ = x << 24; + } + fn c() void { + var x: u24 = 42; + _ = @shlExact(x, 24); + } + fn d() void { + var x: u24 = 42; + _ = @shrExact(x, 24); + } + }; + S.a(); + S.b(); + S.c(); + S.d(); +} + +// shift on type with non-power-of-two size +// +// tmp.zig:5:19: error: RHS of shift is too large for LHS type +// tmp.zig:9:19: error: RHS of shift is too large for LHS type +// tmp.zig:13:17: error: RHS of shift is too large for LHS type +// tmp.zig:17:17: error: RHS of shift is too large for LHS type diff --git a/test/compile_errors/stage1/test/shuffle_with_selected_index_past_first_vector_length.zig b/test/compile_errors/stage1/test/shuffle_with_selected_index_past_first_vector_length.zig new file mode 100644 index 0000000000000000000000000000000000000000..c45eb4a0e21f5145fba2bbae81a07dd3189bbc0b --- /dev/null +++ b/test/compile_errors/stage1/test/shuffle_with_selected_index_past_first_vector_length.zig @@ -0,0 +1,12 @@ +export fn entry() void { + const v: @import("std").meta.Vector(4, u32) = [4]u32{ 10, 11, 12, 13 }; + const x: @import("std").meta.Vector(4, u32) = [4]u32{ 14, 15, 16, 17 }; + var z = @shuffle(u32, v, x, [8]i32{ 0, 1, 2, 3, 7, 6, 5, 4 }); + _ = z; +} + +// @shuffle with selected index past first vector length +// +// tmp.zig:4:39: error: mask index '4' has out-of-bounds selection +// tmp.zig:4:27: note: selected index '7' out of bounds of @Vector(4, u32) +// tmp.zig:4:30: note: selections from the second vector are specified with negative numbers diff --git a/test/compile_errors/stage1/test/switch_ranges_endpoints_are_validated.zig b/test/compile_errors/stage1/test/switch_ranges_endpoints_are_validated.zig new file mode 100644 index 0000000000000000000000000000000000000000..4c0545ea923e47ff56d3aae7af7092bd37a0e1ed --- /dev/null +++ b/test/compile_errors/stage1/test/switch_ranges_endpoints_are_validated.zig @@ -0,0 +1,13 @@ +pub export fn entry() void { + var x: i32 = 0; + switch (x) { + 6...1 => {}, + -1...-5 => {}, + else => unreachable, + } +} + +// switch ranges endpoints are validated +// +// tmp.zig:4:9: error: range start value is greater than the end value +// tmp.zig:5:9: error: range start value is greater than the end value diff --git a/test/compile_errors/stage1/test/switching_with_exhaustive_enum_has___prong_.zig b/test/compile_errors/stage1/test/switching_with_exhaustive_enum_has___prong_.zig new file mode 100644 index 0000000000000000000000000000000000000000..b132b7834efc86ad7d3fbc1345eef7c667e33049 --- /dev/null +++ b/test/compile_errors/stage1/test/switching_with_exhaustive_enum_has___prong_.zig @@ -0,0 +1,16 @@ +const E = enum{ + a, + b, +}; +pub export fn entry() void { + var e: E = .b; + switch (e) { + .a => {}, + .b => {}, + _ => {}, + } +} + +// switching with exhaustive enum has '_' prong +// +// tmp.zig:7:5: error: switch on exhaustive enum has `_` prong diff --git a/test/compile_errors/stage1/test/switching_with_non-exhaustive_enums.zig b/test/compile_errors/stage1/test/switching_with_non-exhaustive_enums.zig new file mode 100644 index 0000000000000000000000000000000000000000..53cd88e68c7734cc6e193d08179d07ec12921070 --- /dev/null +++ b/test/compile_errors/stage1/test/switching_with_non-exhaustive_enums.zig @@ -0,0 +1,32 @@ +const E = enum(u8) { + a, + b, + _, +}; +const U = union(E) { + a: i32, + b: u32, +}; +pub export fn entry() void { + var e: E = .b; + switch (e) { // error: switch not handling the tag `b` + .a => {}, + _ => {}, + } + switch (e) { // error: switch on non-exhaustive enum must include `else` or `_` prong + .a => {}, + .b => {}, + } + var u = U{.a = 2}; + switch (u) { // error: `_` prong not allowed when switching on tagged union + .a => {}, + .b => {}, + _ => {}, + } +} + +// switching with non-exhaustive enums +// +// tmp.zig:12:5: error: enumeration value 'E.b' not handled in switch +// tmp.zig:16:5: error: switch on non-exhaustive enum must include `else` or `_` prong +// tmp.zig:21:5: error: `_` prong not allowed when switching on tagged union diff --git a/test/compile_errors/stage1/test/tagName_on_invalid_value_of_non-exhaustive_enum.zig b/test/compile_errors/stage1/test/tagName_on_invalid_value_of_non-exhaustive_enum.zig new file mode 100644 index 0000000000000000000000000000000000000000..139c7c7a23396fed7ba7289f62f3679ce0c65e38 --- /dev/null +++ b/test/compile_errors/stage1/test/tagName_on_invalid_value_of_non-exhaustive_enum.zig @@ -0,0 +1,8 @@ +test "enum" { + const E = enum(u8) {A, B, _}; + _ = @tagName(@intToEnum(E, 5)); +} + +// @tagName on invalid value of non-exhaustive enum +// +// tmp.zig:3:18: error: no tag by value 5 diff --git a/test/compile_errors/stage1/test/type_mismatch_in_C_prototype_with_varargs.zig b/test/compile_errors/stage1/test/type_mismatch_in_C_prototype_with_varargs.zig new file mode 100644 index 0000000000000000000000000000000000000000..437cca8772f372d9a3d99b82df264685dfac332d --- /dev/null +++ b/test/compile_errors/stage1/test/type_mismatch_in_C_prototype_with_varargs.zig @@ -0,0 +1,11 @@ +const fn_ty = ?fn ([*c]u8, ...) callconv(.C) void; +extern fn fn_decl(fmt: [*:0]u8, ...) void; + +export fn main() void { + const x: fn_ty = fn_decl; + _ = x; +} + +// type mismatch in C prototype with varargs +// +// tmp.zig:5:22: error: expected type 'fn([*c]u8, ...) callconv(.C) void', found 'fn([*:0]u8, ...) callconv(.C) void' diff --git a/test/compile_errors/stage1/test/type_mismatch_with_tuple_concatenation.zig b/test/compile_errors/stage1/test/type_mismatch_with_tuple_concatenation.zig new file mode 100644 index 0000000000000000000000000000000000000000..ce5e4d4629dc85b13a92b8f9d253cb283e5863ff --- /dev/null +++ b/test/compile_errors/stage1/test/type_mismatch_with_tuple_concatenation.zig @@ -0,0 +1,8 @@ +export fn entry() void { + var x = .{}; + x = x ++ .{ 1, 2, 3 }; +} + +// type mismatch with tuple concatenation +// +// tmp.zig:3:11: error: expected type 'struct:2:14', found 'struct:3:11' diff --git a/test/compile_errors/stage1/test/unused_variable_error_on_errdefer.zig b/test/compile_errors/stage1/test/unused_variable_error_on_errdefer.zig new file mode 100644 index 0000000000000000000000000000000000000000..eb92776938819e7692342cead53c7fdc2cfbecab --- /dev/null +++ b/test/compile_errors/stage1/test/unused_variable_error_on_errdefer.zig @@ -0,0 +1,11 @@ +fn foo() !void { + errdefer |a| unreachable; + return error.A; +} +export fn entry() void { + foo() catch unreachable; +} + +// unused variable error on errdefer +// +// tmp.zig:2:15: error: unused variable: 'a' diff --git a/test/compile_errors/stage2/embed_outside_package.zig b/test/compile_errors/stage2/embed_outside_package.zig new file mode 100644 index 0000000000000000000000000000000000000000..8df6b3d9af2acefaa07e5f97fea93b8722556725 --- /dev/null +++ b/test/compile_errors/stage2/embed_outside_package.zig @@ -0,0 +1,7 @@ +export fn a() usize { + return @embedFile("/root/foo").len; +} + +// embed outside package +// +//:2:23: error: embed of file outside package path: '/root/foo' diff --git a/test/compile_errors/stage2/import_outside_package.zig b/test/compile_errors/stage2/import_outside_package.zig new file mode 100644 index 0000000000000000000000000000000000000000..f9de9202de3e271c3c305e7784ac1c6a0c6f8efd --- /dev/null +++ b/test/compile_errors/stage2/import_outside_package.zig @@ -0,0 +1,7 @@ +export fn a() usize { + return @import("../../above.zig").len; +} + +// import outside package +// +// :2:20: error: import of file outside package path: '../../above.zig' diff --git a/test/compile_errors/stage2/out_of_bounds_index.zig b/test/compile_errors/stage2/out_of_bounds_index.zig new file mode 100644 index 0000000000000000000000000000000000000000..3c34bb5d0fa49c87b4e2727ef63b38765d10ee34 --- /dev/null +++ b/test/compile_errors/stage2/out_of_bounds_index.zig @@ -0,0 +1,28 @@ +comptime { + var array = [_:0]u8{ 1, 2, 3, 4 }; + var src_slice: [:0]u8 = &array; + var slice = src_slice[2..6]; + _ = slice; +} +comptime { + var array = [_:0]u8{ 1, 2, 3, 4 }; + var slice = array[2..6]; + _ = slice; +} +comptime { + var array = [_]u8{ 1, 2, 3, 4 }; + var slice = array[2..5]; + _ = slice; +} +comptime { + var array = [_:0]u8{ 1, 2, 3, 4 }; + var slice = array[3..2]; + _ = slice; +} + +// out of bounds indexing +// +// :4:26: error: end index 6 out of bounds for slice of length 4 +1 (sentinel) +// :9:22: error: end index 6 out of bounds for array of length 4 +1 (sentinel) +// :14:22: error: end index 5 out of bounds for array of length 4 +// :19:22: error: start index 3 is larger than end index 2