authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-07-01 21:09:07+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-07-07 10:50:06+03:00
log226994cd7e33f2b5812e7bf5e894d9685431af8c
treee3c3bbfd509d5adb919aefa100851ad17a18f528
parentc07c2d68c7c8276f8d215cfd21f0dcd92db9cf79

Sema: misc error message fixes


46 files changed, 321 insertions(+), 297 deletions(-)

src/Sema.zig+27-18
...@@ -1718,9 +1718,17 @@ fn failWithExpectedOptionalType(sema: *Sema, block: *Block, src: LazySrcLoc, opt...@@ -1718,9 +1718,17 @@ fn failWithExpectedOptionalType(sema: *Sema, block: *Block, src: LazySrcLoc, opt
1718}1718}
17191719
1720fn failWithArrayInitNotSupported(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type) CompileError {1720fn failWithArrayInitNotSupported(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type) CompileError {
1721 return sema.fail(block, src, "type '{}' does not support array initialization syntax", .{1721 const msg = msg: {
1722 ty.fmt(sema.mod),1722 const msg = try sema.errMsg(block, src, "type '{}' does not support array initialization syntax", .{
1723 });1723 ty.fmt(sema.mod),
1724 });
1725 errdefer msg.destroy(sema.gpa);
1726 if (ty.isSlice()) {
1727 try sema.errNote(block, src, msg, "inferred array length is specified with an underscore: '[_]{}'", .{ty.elemType2().fmt(sema.mod)});
1728 }
1729 break :msg msg;
1730 };
1731 return sema.failWithOwnedErrorMsg(block, msg);
1724}1732}
17251733
1726fn failWithStructInitNotSupported(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type) CompileError {1734fn failWithStructInitNotSupported(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type) CompileError {
...@@ -4817,14 +4825,16 @@ fn zirSetAlignStack(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst...@@ -4817,14 +4825,16 @@ fn zirSetAlignStack(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst
4817 alignment,4825 alignment,
4818 });4826 });
4819 }4827 }
4820 const func = sema.owner_func orelse4828 const func = sema.func orelse
4821 return sema.fail(block, src, "@setAlignStack outside function body", .{});4829 return sema.fail(block, src, "@setAlignStack outside function body", .{});
48224830
4823 const fn_owner_decl = sema.mod.declPtr(func.owner_decl);4831 const fn_owner_decl = sema.mod.declPtr(func.owner_decl);
4824 switch (fn_owner_decl.ty.fnCallingConvention()) {4832 switch (fn_owner_decl.ty.fnCallingConvention()) {
4825 .Naked => return sema.fail(block, src, "@setAlignStack in naked function", .{}),4833 .Naked => return sema.fail(block, src, "@setAlignStack in naked function", .{}),
4826 .Inline => return sema.fail(block, src, "@setAlignStack in inline function", .{}),4834 .Inline => return sema.fail(block, src, "@setAlignStack in inline function", .{}),
4827 else => {},4835 else => if (block.inlining != null) {
4836 return sema.fail(block, src, "@setAlignStack in inline call", .{});
4837 },
4828 }4838 }
48294839
4830 const gop = try sema.mod.align_stack_fns.getOrPut(sema.mod.gpa, func);4840 const gop = try sema.mod.align_stack_fns.getOrPut(sema.mod.gpa, func);
...@@ -7451,11 +7461,11 @@ fn analyzeAs(...@@ -7451,11 +7461,11 @@ fn analyzeAs(
7451 zir_operand: Zir.Inst.Ref,7461 zir_operand: Zir.Inst.Ref,
7452) CompileError!Air.Inst.Ref {7462) CompileError!Air.Inst.Ref {
7453 const dest_ty = try sema.resolveType(block, src, zir_dest_type);7463 const dest_ty = try sema.resolveType(block, src, zir_dest_type);
7464 const operand = try sema.resolveInst(zir_operand);
7465 if (dest_ty.tag() == .var_args_param) return operand;
7454 if (dest_ty.zigTypeTag() == .NoReturn) {7466 if (dest_ty.zigTypeTag() == .NoReturn) {
7455 return sema.fail(block, src, "cannot cast to noreturn", .{});7467 return sema.fail(block, src, "cannot cast to noreturn", .{});
7456 }7468 }
7457 const operand = try sema.resolveInst(zir_operand);
7458 if (dest_ty.tag() == .var_args_param) return operand;
7459 return sema.coerce(block, dest_ty, operand, src);7469 return sema.coerce(block, dest_ty, operand, src);
7460}7470}
74617471
...@@ -8123,9 +8133,11 @@ fn zirSwitchCond(...@@ -8123,9 +8133,11 @@ fn zirSwitchCond(
8123 const union_ty = try sema.resolveTypeFields(block, operand_src, operand_ty);8133 const union_ty = try sema.resolveTypeFields(block, operand_src, operand_ty);
8124 const enum_ty = union_ty.unionTagType() orelse {8134 const enum_ty = union_ty.unionTagType() orelse {
8125 const msg = msg: {8135 const msg = msg: {
8126 const msg = try sema.errMsg(block, src, "switch on untagged union", .{});8136 const msg = try sema.errMsg(block, src, "switch on union with no attached enum", .{});
8127 errdefer msg.destroy(sema.gpa);8137 errdefer msg.destroy(sema.gpa);
8128 try sema.addDeclaredHereNote(msg, union_ty);8138 if (union_ty.declSrcLocOrNull(sema.mod)) |union_src| {
8139 try sema.mod.errNoteNonLazy(union_src, msg, "consider 'union(enum)' here", .{});
8140 }
8129 break :msg msg;8141 break :msg msg;
8130 };8142 };
8131 return sema.failWithOwnedErrorMsg(block, msg);8143 return sema.failWithOwnedErrorMsg(block, msg);
...@@ -8616,7 +8628,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError...@@ -8616,7 +8628,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
8616 if (true_count + false_count == 2) {8628 if (true_count + false_count == 2) {
8617 return sema.fail(8629 return sema.fail(
8618 block,8630 block,
8619 src,8631 special_prong_src,
8620 "unreachable else prong; all cases already handled",8632 "unreachable else prong; all cases already handled",
8621 .{},8633 .{},
8622 );8634 );
...@@ -11965,7 +11977,6 @@ fn runtimeBoolCmp(...@@ -11965,7 +11977,6 @@ fn runtimeBoolCmp(
1196511977
11966fn zirSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {11978fn zirSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
11967 const inst_data = sema.code.instructions.items(.data)[inst].un_node;11979 const inst_data = sema.code.instructions.items(.data)[inst].un_node;
11968 const src = inst_data.src();
11969 const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node };11980 const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node };
11970 const ty = try sema.resolveType(block, operand_src, inst_data.operand);11981 const ty = try sema.resolveType(block, operand_src, inst_data.operand);
11971 switch (ty.zigTypeTag()) {11982 switch (ty.zigTypeTag()) {
...@@ -11975,7 +11986,7 @@ fn zirSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air....@@ -11975,7 +11986,7 @@ fn zirSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.
11975 .Null,11986 .Null,
11976 .BoundFn,11987 .BoundFn,
11977 .Opaque,11988 .Opaque,
11978 => return sema.fail(block, src, "no size available for type '{}'", .{ty.fmt(sema.mod)}),11989 => return sema.fail(block, operand_src, "no size available for type '{}'", .{ty.fmt(sema.mod)}),
1197911990
11980 .Type,11991 .Type,
11981 .EnumLiteral,11992 .EnumLiteral,
...@@ -12101,7 +12112,7 @@ fn zirBuiltinSrc(...@@ -12101,7 +12112,7 @@ fn zirBuiltinSrc(
12101 const tracy = trace(@src());12112 const tracy = trace(@src());
12102 defer tracy.end();12113 defer tracy.end();
1210312114
12104 const src = LazySrcLoc.nodeOffset(@bitCast(i32, extended.operand));12115 const src = sema.src; // TODO better source location
12105 const extra = sema.code.extraData(Zir.Inst.LineColumn, extended.operand).data;12116 const extra = sema.code.extraData(Zir.Inst.LineColumn, extended.operand).data;
12106 const func = sema.func orelse return sema.fail(block, src, "@src outside function", .{});12117 const func = sema.func orelse return sema.fail(block, src, "@src outside function", .{});
12107 const fn_owner_decl = sema.mod.declPtr(func.owner_decl);12118 const fn_owner_decl = sema.mod.declPtr(func.owner_decl);
...@@ -14606,14 +14617,12 @@ fn zirTagName(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air...@@ -14606,14 +14617,12 @@ fn zirTagName(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
14606 },14617 },
14607 .Enum => operand_ty,14618 .Enum => operand_ty,
14608 .Union => operand_ty.unionTagType() orelse {14619 .Union => operand_ty.unionTagType() orelse {
14609 const decl_index = operand_ty.getOwnerDecl();
14610 const decl = mod.declPtr(decl_index);
14611 const msg = msg: {14620 const msg = msg: {
14612 const msg = try sema.errMsg(block, src, "union '{s}' is untagged", .{14621 const msg = try sema.errMsg(block, src, "union '{}' is untagged", .{
14613 decl.name,14622 operand_ty.fmt(sema.mod),
14614 });14623 });
14615 errdefer msg.destroy(sema.gpa);14624 errdefer msg.destroy(sema.gpa);
14616 try mod.errNoteNonLazy(decl.srcLoc(), msg, "declared here", .{});14625 try sema.addDeclaredHereNote(msg, operand_ty);
14617 break :msg msg;14626 break :msg msg;
14618 };14627 };
14619 return sema.failWithOwnedErrorMsg(block, msg);14628 return sema.failWithOwnedErrorMsg(block, msg);
test/cases/compile_errors/array_access_of_type.zig created+10
...@@ -0,0 +1,10 @@
1export fn foo() void {
2 var b: u8[40] = undefined;
3 _ = b;
4}
5
6// error
7// backend=stage2
8// target=native
9//
10// :2:14: error: element access of non-indexable type 'type'
test/cases/compile_errors/non_constant_expression_in_array_size.zig created+14
...@@ -0,0 +1,14 @@
1const Foo = struct {
2 y: [get()]u8,
3};
4var global_var: usize = 1;
5fn get() usize { return global_var; }
6
7export fn entry() usize { return @offsetOf(Foo, "y"); }
8
9// error
10// backend=stage2
11// target=native
12//
13// :5:25: error: unable to resolve comptime value
14// :2:15: note: called from here
test/cases/compile_errors/runtime_index_into_comptime_type_slice.zig+2-3
...@@ -15,6 +15,5 @@ export fn entry() void {...@@ -15,6 +15,5 @@ export fn entry() void {
15// target=native15// target=native
16//16//
17// :9:51: error: values of type '[]const builtin.Type.StructField' must be comptime known, but index value is runtime known17// :9:51: error: values of type '[]const builtin.Type.StructField' must be comptime known, but index value is runtime known
18// :287:21: note: struct requires comptime because of this field18// :?:21: note: struct requires comptime because of this field
19// :287:21: note: types are not available at runtime19// :?:21: note: types are not available at runtime
20// :290:20: note: struct requires comptime because of this field
test/cases/compile_errors/setAlignStack_in_inline_function.zig created+23
...@@ -0,0 +1,23 @@
1export fn entry() void {
2 foo();
3}
4fn foo() callconv(.Inline) void {
5 @setAlignStack(16);
6}
7
8export fn entry1() void {
9 comptime bar();
10}
11fn bar() void {
12 @setAlignStack(16);
13}
14
15
16// error
17// backend=stage2
18// target=native
19//
20// :5:5: error: @setAlignStack in inline function
21// :2:8: note: called from here
22// :12:5: error: @setAlignStack in inline call
23// :9:17: note: called from here
test/cases/compile_errors/signed_integer_remainder_division.zig created+9
...@@ -0,0 +1,9 @@
1export fn foo(a: i32, b: i32) i32 {
2 return a % b;
3}
4
5// error
6// backend=stage2
7// target=native
8//
9// :2:12: error: remainder division with 'i32' and 'i32': signed integers and floats must use @rem or @mod
test/cases/compile_errors/sizeOf_bad_type.zig created+9
...@@ -0,0 +1,9 @@
1export fn entry() usize {
2 return @sizeOf(@TypeOf(null));
3}
4
5// error
6// backend=stage2
7// target=native
8//
9// :2:20: error: no size available for type '@TypeOf(null)'
test/cases/compile_errors/slice_cannot_have_its_bytes_reinterpreted.zig created+11
...@@ -0,0 +1,11 @@
1export fn foo() void {
2 const bytes = [1]u8{ 0xfa } ** 16;
3 var value = @ptrCast(*const []const u8, &bytes).*;
4 _ = value;
5}
6
7// error
8// backend=stage2
9// target=native
10//
11// :3:52: error: comptime dereference requires '[]const u8' to have a well-defined layout, but it does not.
test/cases/compile_errors/slice_passed_as_array_init_type.zig created+11
...@@ -0,0 +1,11 @@
1export fn entry() void {
2 const x = []u8{};
3 _ = x;
4}
5
6// error
7// backend=stage2
8// target=native
9//
10// :2:19: error: type '[]u8' does not support array initialization syntax
11// :2:19: note: inferred array length is specified with an underscore: '[_]u8'
test/cases/compile_errors/slice_passed_as_array_init_type_with_elems.zig created+11
...@@ -0,0 +1,11 @@
1export fn entry() void {
2 const x = []u8{1, 2};
3 _ = x;
4}
5
6// error
7// backend=stage2
8// target=native
9//
10// :2:19: error: type '[]u8' does not support array initialization syntax
11// :2:19: note: inferred array length is specified with an underscore: '[_]u8'
test/cases/compile_errors/stage1/obj/array_access_of_type.zig deleted-10
...@@ -1,10 +0,0 @@
1export fn foo() void {
2 var b: u8[40] = undefined;
3 _ = b;
4}
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:2:14: error: array access of non-array type 'type'
test/cases/compile_errors/stage1/obj/non_constant_expression_in_array_size.zig deleted-14
...@@ -1,14 +0,0 @@
1const Foo = struct {
2 y: [get()]u8,
3};
4var global_var: usize = 1;
5fn get() usize { return global_var; }
6
7export fn entry() usize { return @sizeOf(@TypeOf(Foo)); }
8
9// error
10// backend=stage1
11// target=native
12//
13// tmp.zig:5:25: error: cannot store runtime value in compile time variable
14// tmp.zig:2:12: note: called from here
test/cases/compile_errors/stage1/obj/setAlignStack_in_inline_function.zig deleted-12
...@@ -1,12 +0,0 @@
1export fn entry() void {
2 foo();
3}
4fn foo() callconv(.Inline) void {
5 @setAlignStack(16);
6}
7
8// error
9// backend=stage1
10// target=native
11//
12// tmp.zig:5:5: error: @setAlignStack in inline function
test/cases/compile_errors/stage1/obj/signed_integer_remainder_division.zig deleted-9
...@@ -1,9 +0,0 @@
1export fn foo(a: i32, b: i32) i32 {
2 return a % b;
3}
4
5// error
6// backend=stage1
7// target=native
8//
9// tmp.zig:2:14: error: remainder division with 'i32' and 'i32': signed integers and floats must use @rem or @mod
test/cases/compile_errors/stage1/obj/sizeOf_bad_type.zig deleted-9
...@@ -1,9 +0,0 @@
1export fn entry() usize {
2 return @sizeOf(@TypeOf(null));
3}
4
5// error
6// backend=stage1
7// target=native
8//
9// tmp.zig:2:20: error: no size available for type '@Type(.Null)'
test/cases/compile_errors/stage1/obj/slice_cannot_have_its_bytes_reinterpreted.zig deleted-11
...@@ -1,11 +0,0 @@
1export fn foo() void {
2 const bytes = [1]u8{ 0xfa } ** 16;
3 var value = @ptrCast(*const []const u8, &bytes).*;
4 _ = value;
5}
6
7// error
8// backend=stage1
9// target=native
10//
11// :3:52: error: slice '[]const u8' cannot have its bytes reinterpreted
test/cases/compile_errors/stage1/obj/slice_passed_as_array_init_type.zig deleted-10
...@@ -1,10 +0,0 @@
1export fn entry() void {
2 const x = []u8{};
3 _ = x;
4}
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:2:15: error: array literal requires address-of operator (&) to coerce to slice type '[]u8'
test/cases/compile_errors/stage1/obj/slice_passed_as_array_init_type_with_elems.zig deleted-10
...@@ -1,10 +0,0 @@
1export fn entry() void {
2 const x = []u8{1, 2};
3 _ = x;
4}
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:2:15: error: array literal requires address-of operator (&) to coerce to slice type '[]u8'
test/cases/compile_errors/stage1/obj/sub_overflow_in_function_evaluation.zig deleted-12
...@@ -1,12 +0,0 @@
1const y = sub(10, 20);
2fn sub(a: u16, b: u16) u16 {
3 return a - b;
4}
5
6export fn entry() usize { return @sizeOf(@TypeOf(y)); }
7
8// error
9// backend=stage1
10// target=native
11//
12// tmp.zig:3:14: error: operation caused overflow
test/cases/compile_errors/stage1/obj/switch_expression-duplicate_or_overlapping_integer_value.zig deleted-16
...@@ -1,16 +0,0 @@
1fn foo(x: u8) u8 {
2 return switch (x) {
3 0 ... 100 => @as(u8, 0),
4 101 ... 200 => 1,
5 201, 203 ... 207 => 2,
6 206 ... 255 => 3,
7 };
8}
9export fn entry() usize { return @sizeOf(@TypeOf(foo)); }
10
11// error
12// backend=stage1
13// target=native
14//
15// tmp.zig:6:9: error: duplicate switch value
16// tmp.zig:5:14: note: previous value here
test/cases/compile_errors/stage1/obj/switch_expression-switch_on_pointer_type_with_no_else.zig deleted-13
...@@ -1,13 +0,0 @@
1fn foo(x: *u8) void {
2 switch (x) {
3 &y => {},
4 }
5}
6const y: u8 = 100;
7export fn entry() usize { return @sizeOf(@TypeOf(foo)); }
8
9// error
10// backend=stage1
11// target=native
12//
13// tmp.zig:2:5: error: else prong required when switching on type '*u8'
test/cases/compile_errors/stage1/obj/switch_expression-unreachable_else_prong_bool.zig deleted-14
...@@ -1,14 +0,0 @@
1fn foo(x: bool) void {
2 switch (x) {
3 true => {},
4 false => {},
5 else => {},
6 }
7}
8export fn entry() usize { return @sizeOf(@TypeOf(foo)); }
9
10// error
11// backend=stage1
12// target=native
13//
14// tmp.zig:5:9: error: unreachable else prong, all cases already handled
test/cases/compile_errors/stage1/obj/switch_on_union_with_no_attached_enum.zig deleted-22
...@@ -1,22 +0,0 @@
1const Payload = union {
2 A: i32,
3 B: f64,
4 C: bool,
5};
6export fn entry() void {
7 const a = Payload { .A = 1234 };
8 foo(a);
9}
10fn foo(a: *const Payload) void {
11 switch (a.*) {
12 Payload.A => {},
13 else => unreachable,
14 }
15}
16
17// error
18// backend=stage1
19// target=native
20//
21// tmp.zig:11:14: error: switch on union which has no attached enum
22// tmp.zig:1:17: note: consider 'union(enum)' here
test/cases/compile_errors/stage1/obj/switch_with_invalid_expression_parameter.zig deleted-17
...@@ -1,17 +0,0 @@
1export fn entry() void {
2 Test(i32);
3}
4fn Test(comptime T: type) void {
5 const x = switch (T) {
6 []u8 => |x| x,
7 i32 => |x| x,
8 else => unreachable,
9 };
10 _ = x;
11}
12
13// error
14// backend=stage1
15// target=native
16//
17// tmp.zig:7:17: error: switch on type 'type' provides no expression parameter
test/cases/compile_errors/stage1/obj/switch_with_overlapping_case_ranges.zig deleted-13
...@@ -1,13 +0,0 @@
1export fn entry() void {
2 var q: u8 = 0;
3 switch (q) {
4 1...2 => {},
5 0...255 => {},
6 }
7}
8
9// error
10// backend=stage1
11// target=native
12//
13// tmp.zig:5:9: error: duplicate switch value
test/cases/compile_errors/stage1/obj/tagName_used_on_union_with_no_associated_enum_tag.zig deleted-16
...@@ -1,16 +0,0 @@
1const FloatInt = extern union {
2 Float: f32,
3 Int: i32,
4};
5export fn entry() void {
6 var fi = FloatInt{.Float = 123.45};
7 var tagName = @tagName(fi);
8 _ = tagName;
9}
10
11// error
12// backend=stage1
13// target=native
14//
15// tmp.zig:7:19: error: union has no associated enum
16// tmp.zig:1:18: note: declared here
test/cases/compile_errors/stage1/obj/type_variables_must_be_constant.zig deleted-10
...@@ -1,10 +0,0 @@
1var foo = u8;
2export fn entry() foo {
3 return 1;
4}
5
6// error
7// backend=stage1
8// target=native
9//
10// :1:1: error: variable of type 'type' must be constant
test/cases/compile_errors/stage1/obj/unreachable_executed_at_comptime.zig deleted-16
...@@ -1,16 +0,0 @@
1fn foo(comptime x: i32) i32 {
2 comptime {
3 if (x >= 0) return -x;
4 unreachable;
5 }
6}
7export fn entry() void {
8 _ = foo(-42);
9}
10
11// error
12// backend=stage1
13// target=native
14//
15// tmp.zig:4:9: error: reached unreachable code
16// tmp.zig:8:12: note: called from here
test/cases/compile_errors/stage1/obj/use_of_comptime-known_undefined_function_value.zig deleted-13
...@@ -1,13 +0,0 @@
1const Cmd = struct {
2 exec: fn () void,
3};
4export fn entry() void {
5 const command = Cmd{ .exec = undefined };
6 command.exec();
7}
8
9// error
10// backend=stage1
11// target=native
12//
13// tmp.zig:6:12: error: use of undefined value here causes undefined behavior
test/cases/compile_errors/stage1/obj/wasmMemoryGrow_is_a_compile_error_in_non-Wasm_targets.zig deleted-10
...@@ -1,10 +0,0 @@
1export fn foo() void {
2 _ = @wasmMemoryGrow(0, 1);
3 return;
4}
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:2:9: error: @wasmMemoryGrow is a wasm32 feature only
test/cases/compile_errors/stage1/obj/wasmMemorySize_is_a_compile_error_in_non-Wasm_targets.zig deleted-10
...@@ -1,10 +0,0 @@
1export fn foo() void {
2 _ = @wasmMemorySize(0);
3 return;
4}
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:2:9: error: @wasmMemorySize is a wasm32 feature only
test/cases/compile_errors/stage1/obj/wrong_type_for_reify_type.zig deleted-9
...@@ -1,9 +0,0 @@
1export fn entry() void {
2 _ = @Type(0);
3}
4
5// error
6// backend=stage1
7// target=native
8//
9// tmp.zig:2:15: error: expected type 'std.builtin.Type', found 'comptime_int'
test/cases/compile_errors/stage1/switch_with_invalid_expression_parameter.zig created+17
...@@ -0,0 +1,17 @@
1export fn entry() void {
2 Test(i32);
3}
4fn Test(comptime T: type) void {
5 const x = switch (T) {
6 []u8 => |x| x,
7 i32 => |x| x,
8 else => unreachable,
9 };
10 _ = x;
11}
12
13// error
14// backend=stage1
15// target=native
16//
17// tmp.zig:7:17: error: switch on type 'type' provides no expression parameter
test/cases/compile_errors/stage1/use_of_comptime-known_undefined_function_value.zig created+13
...@@ -0,0 +1,13 @@
1const Cmd = struct {
2 exec: fn () void,
3};
4export fn entry() void {
5 const command = Cmd{ .exec = undefined };
6 command.exec();
7}
8
9// error
10// backend=stage1
11// target=native
12//
13// tmp.zig:6:12: error: use of undefined value here causes undefined behavior
test/cases/compile_errors/sub_overflow_in_function_evaluation.zig created+13
...@@ -0,0 +1,13 @@
1const y = sub(10, 20);
2fn sub(a: u16, b: u16) u16 {
3 return a - b;
4}
5
6export fn entry() usize { return @sizeOf(@TypeOf(&y)); }
7
8// error
9// backend=stage2
10// target=native
11//
12// :3:14: error: overflow of integer type 'u16' with value '-10'
13// :1:14: note: called from here
test/cases/compile_errors/switch_expression-duplicate_or_overlapping_integer_value.zig created+16
...@@ -0,0 +1,16 @@
1fn foo(x: u8) u8 {
2 return switch (x) {
3 0 ... 100 => @as(u8, 0),
4 101 ... 200 => 1,
5 201, 203 ... 207 => 2,
6 206 ... 255 => 3,
7 };
8}
9export fn entry() usize { return @sizeOf(@TypeOf(&foo)); }
10
11// error
12// backend=stage2
13// target=native
14//
15// :6:13: error: duplicate switch value
16// :5:18: note: previous value here
test/cases/compile_errors/switch_expression-switch_on_pointer_type_with_no_else.zig created+13
...@@ -0,0 +1,13 @@
1fn foo(x: *u8) void {
2 switch (x) {
3 &y => {},
4 }
5}
6var y: u8 = 100;
7export fn entry() usize { return @sizeOf(@TypeOf(&foo)); }
8
9// error
10// backend=stage2
11// target=native
12//
13// :2:5: error: else prong required when switching on type '*u8'
test/cases/compile_errors/switch_expression-unreachable_else_prong_bool.zig created+14
...@@ -0,0 +1,14 @@
1fn foo(x: bool) void {
2 switch (x) {
3 true => {},
4 false => {},
5 else => {},
6 }
7}
8export fn entry() usize { return @sizeOf(@TypeOf(&foo)); }
9
10// error
11// backend=stage2
12// target=native
13//
14// :5:14: error: unreachable else prong; all cases already handled
test/cases/compile_errors/switch_on_union_with_no_attached_enum.zig created+22
...@@ -0,0 +1,22 @@
1const Payload = union {
2 A: i32,
3 B: f64,
4 C: bool,
5};
6export fn entry() void {
7 const a = Payload { .A = 1234 };
8 foo(&a);
9}
10fn foo(a: *const Payload) void {
11 switch (a.*) {
12 Payload.A => {},
13 else => unreachable,
14 }
15}
16
17// error
18// backend=stage2
19// target=native
20//
21// :11:14: error: switch on union with no attached enum
22// :1:17: note: consider 'union(enum)' here
test/cases/compile_errors/switch_with_overlapping_case_ranges.zig created+14
...@@ -0,0 +1,14 @@
1export fn entry() void {
2 var q: u8 = 0;
3 switch (q) {
4 1...2 => {},
5 0...255 => {},
6 }
7}
8
9// error
10// backend=stage2
11// target=native
12//
13// :5:10: error: duplicate switch value
14// :4:10: note: previous value here
test/cases/compile_errors/tagName_used_on_union_with_no_associated_enum_tag.zig created+16
...@@ -0,0 +1,16 @@
1const FloatInt = extern union {
2 Float: f32,
3 Int: i32,
4};
5export fn entry() void {
6 var fi = FloatInt{.Float = 123.45};
7 var tagName = @tagName(fi);
8 _ = tagName;
9}
10
11// error
12// backend=stage2
13// target=native
14//
15// :7:19: error: union 'tmp.FloatInt' is untagged
16// :1:25: note: union declared here
test/cases/compile_errors/type_variables_must_be_constant.zig created+11
...@@ -0,0 +1,11 @@
1var foo = u8;
2export fn entry() foo {
3 return 1;
4}
5
6// error
7// backend=stage2
8// target=native
9//
10// :1:1: error: variable of type 'type' must be const or comptime
11// :1:1: note: types are not available at runtime
test/cases/compile_errors/unreachable_executed_at_comptime.zig created+16
...@@ -0,0 +1,16 @@
1fn foo(comptime x: i32) i32 {
2 comptime {
3 if (x >= 0) return -x;
4 unreachable;
5 }
6}
7export fn entry() void {
8 _ = comptime foo(-42);
9}
10
11// error
12// backend=stage2
13// target=native
14//
15// :4:9: error: reached unreachable code
16// :8:21: note: called from here
test/cases/compile_errors/wasmMemoryGrow_is_a_compile_error_in_non-Wasm_targets.zig created+10
...@@ -0,0 +1,10 @@
1export fn foo() void {
2 _ = @wasmMemoryGrow(0, 1);
3 return;
4}
5
6// error
7// backend=stage2
8// target=x86_64-native
9//
10// :2:9: error: builtin @wasmMemoryGrow is available when targeting WebAssembly; targeted CPU architecture is x86_64
test/cases/compile_errors/wasmMemorySize_is_a_compile_error_in_non-Wasm_targets.zig created+10
...@@ -0,0 +1,10 @@
1export fn foo() void {
2 _ = @wasmMemorySize(0);
3 return;
4}
5
6// error
7// backend=stage2
8// target=x86_64-native
9//
10// :2:9: error: builtin @wasmMemorySize is available when targeting WebAssembly; targeted CPU architecture is x86_64
test/cases/compile_errors/wrong_type_for_reify_type.zig created+9
...@@ -0,0 +1,9 @@
1export fn entry() void {
2 _ = @Type(0);
3}
4
5// error
6// backend=stage2
7// target=native
8//
9// :2:15: error: expected type 'builtin.Type', found 'comptime_int'