| author | |
| committer | |
| log | 226994cd7e33f2b5812e7bf5e894d9685431af8c |
| tree | e3c3bbfd509d5adb919aefa100851ad17a18f528 |
| parent | c07c2d68c7c8276f8d215cfd21f0dcd92db9cf79 |
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 | } |
| 1719 | 1719 | ||
| 1720 | fn failWithArrayInitNotSupported(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type) CompileError { | 1720 | fn 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 | } |
| 1725 | 1733 | ||
| 1726 | fn failWithStructInitNotSupported(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type) CompileError { | 1734 | fn 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 orelse | 4828 | 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", .{}); |
| 4822 | 4830 | ||
| 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 | } |
| 4829 | 4839 | ||
| 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 | } |
| 7461 | 7471 | ||
| ... | @@ -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( |
| 11965 | 11977 | ||
| 11966 | fn zirSizeOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { | 11978 | fn 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)}), |
| 11979 | 11990 | ||
| 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(); |
| 12103 | 12114 | ||
| 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | const Foo = struct { | ||
| 2 | y: [get()]u8, | ||
| 3 | }; | ||
| 4 | var global_var: usize = 1; | ||
| 5 | fn get() usize { return global_var; } | ||
| 6 | |||
| 7 | export 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=native | 15 | // target=native |
| 16 | // | 16 | // |
| 17 | // :9:51: error: values of type '[]const builtin.Type.StructField' must be comptime known, but index value is runtime known | 17 | // :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 field | 18 | // :?:21: note: struct requires comptime because of this field |
| 19 | // :287:21: note: types are not available at runtime | 19 | // :?: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 @@ | ||
| 1 | export fn entry() void { | ||
| 2 | foo(); | ||
| 3 | } | ||
| 4 | fn foo() callconv(.Inline) void { | ||
| 5 | @setAlignStack(16); | ||
| 6 | } | ||
| 7 | |||
| 8 | export fn entry1() void { | ||
| 9 | comptime bar(); | ||
| 10 | } | ||
| 11 | fn 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | const Foo = struct { | ||
| 2 | y: [get()]u8, | ||
| 3 | }; | ||
| 4 | var global_var: usize = 1; | ||
| 5 | fn get() usize { return global_var; } | ||
| 6 | |||
| 7 | export 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 @@ | ||
| 1 | export fn entry() void { | ||
| 2 | foo(); | ||
| 3 | } | ||
| 4 | fn 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | const y = sub(10, 20); | ||
| 2 | fn sub(a: u16, b: u16) u16 { | ||
| 3 | return a - b; | ||
| 4 | } | ||
| 5 | |||
| 6 | export 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 @@ | ||
| 1 | fn 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 | } | ||
| 9 | export 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 @@ | ||
| 1 | fn foo(x: *u8) void { | ||
| 2 | switch (x) { | ||
| 3 | &y => {}, | ||
| 4 | } | ||
| 5 | } | ||
| 6 | const y: u8 = 100; | ||
| 7 | export 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 @@ | ||
| 1 | fn foo(x: bool) void { | ||
| 2 | switch (x) { | ||
| 3 | true => {}, | ||
| 4 | false => {}, | ||
| 5 | else => {}, | ||
| 6 | } | ||
| 7 | } | ||
| 8 | export 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 @@ | ||
| 1 | const Payload = union { | ||
| 2 | A: i32, | ||
| 3 | B: f64, | ||
| 4 | C: bool, | ||
| 5 | }; | ||
| 6 | export fn entry() void { | ||
| 7 | const a = Payload { .A = 1234 }; | ||
| 8 | foo(a); | ||
| 9 | } | ||
| 10 | fn 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 @@ | ||
| 1 | export fn entry() void { | ||
| 2 | Test(i32); | ||
| 3 | } | ||
| 4 | fn 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | const FloatInt = extern union { | ||
| 2 | Float: f32, | ||
| 3 | Int: i32, | ||
| 4 | }; | ||
| 5 | export 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 @@ | ||
| 1 | var foo = u8; | ||
| 2 | export 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 @@ | ||
| 1 | fn foo(comptime x: i32) i32 { | ||
| 2 | comptime { | ||
| 3 | if (x >= 0) return -x; | ||
| 4 | unreachable; | ||
| 5 | } | ||
| 6 | } | ||
| 7 | export 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 @@ | ||
| 1 | const Cmd = struct { | ||
| 2 | exec: fn () void, | ||
| 3 | }; | ||
| 4 | export 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | export fn entry() void { | ||
| 2 | Test(i32); | ||
| 3 | } | ||
| 4 | fn 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 @@ | ||
| 1 | const Cmd = struct { | ||
| 2 | exec: fn () void, | ||
| 3 | }; | ||
| 4 | export 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 @@ | ||
| 1 | const y = sub(10, 20); | ||
| 2 | fn sub(a: u16, b: u16) u16 { | ||
| 3 | return a - b; | ||
| 4 | } | ||
| 5 | |||
| 6 | export 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 @@ | ||
| 1 | fn 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 | } | ||
| 9 | export 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 @@ | ||
| 1 | fn foo(x: *u8) void { | ||
| 2 | switch (x) { | ||
| 3 | &y => {}, | ||
| 4 | } | ||
| 5 | } | ||
| 6 | var y: u8 = 100; | ||
| 7 | export 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 @@ | ||
| 1 | fn foo(x: bool) void { | ||
| 2 | switch (x) { | ||
| 3 | true => {}, | ||
| 4 | false => {}, | ||
| 5 | else => {}, | ||
| 6 | } | ||
| 7 | } | ||
| 8 | export 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 @@ | ||
| 1 | const Payload = union { | ||
| 2 | A: i32, | ||
| 3 | B: f64, | ||
| 4 | C: bool, | ||
| 5 | }; | ||
| 6 | export fn entry() void { | ||
| 7 | const a = Payload { .A = 1234 }; | ||
| 8 | foo(&a); | ||
| 9 | } | ||
| 10 | fn 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | const FloatInt = extern union { | ||
| 2 | Float: f32, | ||
| 3 | Int: i32, | ||
| 4 | }; | ||
| 5 | export 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 @@ | ||
| 1 | var foo = u8; | ||
| 2 | export 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 @@ | ||
| 1 | fn foo(comptime x: i32) i32 { | ||
| 2 | comptime { | ||
| 3 | if (x >= 0) return -x; | ||
| 4 | unreachable; | ||
| 5 | } | ||
| 6 | } | ||
| 7 | export 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | export 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 @@ | ||
| 1 | export 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' | ||