| author | |
| committer | |
| log | 299836dbd94dd9af25b8485f58ba611b62909d54 |
| tree | 662b42d9b5aa0e83c3e4bb611945e273c4e240b2 |
| parent | 252388eb28fde40f085e14cd341efdc701093fe1 |
25 files changed, 243 insertions(+), 204 deletions(-)
src/AstGen.zig+2-1| ... | @@ -2464,6 +2464,7 @@ fn unusedResultExpr(gz: *GenZir, scope: *Scope, statement: Ast.Node.Index) Inner | ... | @@ -2464,6 +2464,7 @@ fn unusedResultExpr(gz: *GenZir, scope: *Scope, statement: Ast.Node.Index) Inner |
| 2464 | .repeat, | 2464 | .repeat, |
| 2465 | .repeat_inline, | 2465 | .repeat_inline, |
| 2466 | .panic, | 2466 | .panic, |
| 2467 | .panic_comptime, | ||
| 2467 | => { | 2468 | => { |
| 2468 | noreturn_src_node = statement; | 2469 | noreturn_src_node = statement; |
| 2469 | break :b true; | 2470 | break :b true; |
| ... | @@ -7358,7 +7359,7 @@ fn builtinCall( | ... | @@ -7358,7 +7359,7 @@ fn builtinCall( |
| 7358 | .bool_to_int => return simpleUnOp(gz, scope, rl, node, bool_rl, params[0], .bool_to_int), | 7359 | .bool_to_int => return simpleUnOp(gz, scope, rl, node, bool_rl, params[0], .bool_to_int), |
| 7359 | .embed_file => return simpleUnOp(gz, scope, rl, node, .{ .ty = .const_slice_u8_type }, params[0], .embed_file), | 7360 | .embed_file => return simpleUnOp(gz, scope, rl, node, .{ .ty = .const_slice_u8_type }, params[0], .embed_file), |
| 7360 | .error_name => return simpleUnOp(gz, scope, rl, node, .{ .ty = .anyerror_type }, params[0], .error_name), | 7361 | .error_name => return simpleUnOp(gz, scope, rl, node, .{ .ty = .anyerror_type }, params[0], .error_name), |
| 7361 | .panic => return simpleUnOp(gz, scope, rl, node, .{ .ty = .const_slice_u8_type }, params[0], .panic), | 7362 | .panic => return simpleUnOp(gz, scope, rl, node, .{ .ty = .const_slice_u8_type }, params[0], if (gz.force_comptime) .panic_comptime else .panic), |
| 7362 | .set_cold => return simpleUnOp(gz, scope, rl, node, bool_rl, params[0], .set_cold), | 7363 | .set_cold => return simpleUnOp(gz, scope, rl, node, bool_rl, params[0], .set_cold), |
| 7363 | .set_runtime_safety => return simpleUnOp(gz, scope, rl, node, bool_rl, params[0], .set_runtime_safety), | 7364 | .set_runtime_safety => return simpleUnOp(gz, scope, rl, node, bool_rl, params[0], .set_runtime_safety), |
| 7364 | .sqrt => return simpleUnOp(gz, scope, rl, node, .none, params[0], .sqrt), | 7365 | .sqrt => return simpleUnOp(gz, scope, rl, node, .none, params[0], .sqrt), |
src/Sema.zig+43-6| ... | @@ -903,7 +903,8 @@ fn analyzeBodyInner( | ... | @@ -903,7 +903,8 @@ fn analyzeBodyInner( |
| 903 | .ret_load => break sema.zirRetLoad(block, inst), | 903 | .ret_load => break sema.zirRetLoad(block, inst), |
| 904 | .ret_err_value => break sema.zirRetErrValue(block, inst), | 904 | .ret_err_value => break sema.zirRetErrValue(block, inst), |
| 905 | .@"unreachable" => break sema.zirUnreachable(block, inst), | 905 | .@"unreachable" => break sema.zirUnreachable(block, inst), |
| 906 | .panic => break sema.zirPanic(block, inst), | 906 | .panic => break sema.zirPanic(block, inst, false), |
| 907 | .panic_comptime => break sema.zirPanic(block, inst, true), | ||
| 907 | // zig fmt: on | 908 | // zig fmt: on |
| 908 | 909 | ||
| 909 | .extended => ext: { | 910 | .extended => ext: { |
| ... | @@ -3870,10 +3871,26 @@ fn zirValidateDeref(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr | ... | @@ -3870,10 +3871,26 @@ fn zirValidateDeref(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr |
| 3870 | .Slice => return sema.fail(block, src, "index syntax required for slice type '{}'", .{operand_ty.fmt(sema.mod)}), | 3871 | .Slice => return sema.fail(block, src, "index syntax required for slice type '{}'", .{operand_ty.fmt(sema.mod)}), |
| 3871 | } | 3872 | } |
| 3872 | 3873 | ||
| 3874 | const elem_ty = operand_ty.elemType2(); | ||
| 3873 | if (try sema.resolveMaybeUndefVal(block, operand_src, operand)) |val| { | 3875 | if (try sema.resolveMaybeUndefVal(block, operand_src, operand)) |val| { |
| 3874 | if (val.isUndef()) { | 3876 | if (val.isUndef()) { |
| 3875 | return sema.fail(block, src, "cannot dereference undefined value", .{}); | 3877 | return sema.fail(block, src, "cannot dereference undefined value", .{}); |
| 3876 | } | 3878 | } |
| 3879 | } else if (!(try sema.validateRunTimeType(block, src, elem_ty, false))) { | ||
| 3880 | const msg = msg: { | ||
| 3881 | const msg = try sema.errMsg( | ||
| 3882 | block, | ||
| 3883 | src, | ||
| 3884 | "values of type '{}' must be comptime known, but operand value is runtime known", | ||
| 3885 | .{elem_ty.fmt(sema.mod)}, | ||
| 3886 | ); | ||
| 3887 | errdefer msg.destroy(sema.gpa); | ||
| 3888 | |||
| 3889 | const src_decl = sema.mod.declPtr(block.src_decl); | ||
| 3890 | try sema.explainWhyTypeIsComptime(block, src, msg, src.toSrcLoc(src_decl), elem_ty); | ||
| 3891 | break :msg msg; | ||
| 3892 | }; | ||
| 3893 | return sema.failWithOwnedErrorMsg(block, msg); | ||
| 3877 | } | 3894 | } |
| 3878 | } | 3895 | } |
| 3879 | 3896 | ||
| ... | @@ -4308,11 +4325,15 @@ fn zirCompileLog( | ... | @@ -4308,11 +4325,15 @@ fn zirCompileLog( |
| 4308 | return Air.Inst.Ref.void_value; | 4325 | return Air.Inst.Ref.void_value; |
| 4309 | } | 4326 | } |
| 4310 | 4327 | ||
| 4311 | fn zirPanic(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Zir.Inst.Index { | 4328 | fn zirPanic(sema: *Sema, block: *Block, inst: Zir.Inst.Index, force_comptime: bool) CompileError!Zir.Inst.Index { |
| 4312 | const inst_data = sema.code.instructions.items(.data)[inst].un_node; | 4329 | const inst_data = sema.code.instructions.items(.data)[inst].un_node; |
| 4313 | const src: LazySrcLoc = inst_data.src(); | 4330 | const src = inst_data.src(); |
| 4314 | const msg_inst = try sema.resolveInst(inst_data.operand); | 4331 | const msg_inst = try sema.resolveInst(inst_data.operand); |
| 4315 | 4332 | ||
| 4333 | if (block.is_comptime or force_comptime) { | ||
| 4334 | return sema.fail(block, src, "encountered @panic at comptime", .{}); | ||
| 4335 | } | ||
| 4336 | try sema.requireRuntimeBlock(block, src); | ||
| 4316 | return sema.panicWithMsg(block, src, msg_inst); | 4337 | return sema.panicWithMsg(block, src, msg_inst); |
| 4317 | } | 4338 | } |
| 4318 | 4339 | ||
| ... | @@ -8357,7 +8378,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError | ... | @@ -8357,7 +8378,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError |
| 8357 | return sema.fail( | 8378 | return sema.fail( |
| 8358 | block, | 8379 | block, |
| 8359 | src, | 8380 | src, |
| 8360 | "switch must handle all possibilities", | 8381 | "else prong required when switching on type 'anyerror'", |
| 8361 | .{}, | 8382 | .{}, |
| 8362 | ); | 8383 | ); |
| 8363 | } | 8384 | } |
| ... | @@ -17416,7 +17437,7 @@ fn zirVarExtended( | ... | @@ -17416,7 +17437,7 @@ fn zirVarExtended( |
| 17416 | const extra = sema.code.extraData(Zir.Inst.ExtendedVar, extended.operand); | 17437 | const extra = sema.code.extraData(Zir.Inst.ExtendedVar, extended.operand); |
| 17417 | const src = sema.src; | 17438 | const src = sema.src; |
| 17418 | const ty_src: LazySrcLoc = src; // TODO add a LazySrcLoc that points at type | 17439 | const ty_src: LazySrcLoc = src; // TODO add a LazySrcLoc that points at type |
| 17419 | const mut_src: LazySrcLoc = src; // TODO add a LazySrcLoc that points at mut token | 17440 | const name_src: LazySrcLoc = src; // TODO add a LazySrcLoc that points at the name token |
| 17420 | const init_src: LazySrcLoc = src; // TODO add a LazySrcLoc that points at init expr | 17441 | const init_src: LazySrcLoc = src; // TODO add a LazySrcLoc that points at init expr |
| 17421 | const small = @bitCast(Zir.Inst.ExtendedVar.Small, extended.small); | 17442 | const small = @bitCast(Zir.Inst.ExtendedVar.Small, extended.small); |
| 17422 | 17443 | ||
| ... | @@ -17460,7 +17481,7 @@ fn zirVarExtended( | ... | @@ -17460,7 +17481,7 @@ fn zirVarExtended( |
| 17460 | return sema.failWithNeededComptime(block, init_src); | 17481 | return sema.failWithNeededComptime(block, init_src); |
| 17461 | } else Value.initTag(.unreachable_value); | 17482 | } else Value.initTag(.unreachable_value); |
| 17462 | 17483 | ||
| 17463 | try sema.validateVarType(block, mut_src, var_ty, small.is_extern); | 17484 | try sema.validateVarType(block, name_src, var_ty, small.is_extern); |
| 17464 | 17485 | ||
| 17465 | const new_var = try sema.gpa.create(Module.Var); | 17486 | const new_var = try sema.gpa.create(Module.Var); |
| 17466 | errdefer sema.gpa.destroy(new_var); | 17487 | errdefer sema.gpa.destroy(new_var); |
| ... | @@ -17957,6 +17978,9 @@ fn validateVarType( | ... | @@ -17957,6 +17978,9 @@ fn validateVarType( |
| 17957 | 17978 | ||
| 17958 | const src_decl = mod.declPtr(block.src_decl); | 17979 | const src_decl = mod.declPtr(block.src_decl); |
| 17959 | try sema.explainWhyTypeIsComptime(block, src, msg, src.toSrcLoc(src_decl), var_ty); | 17980 | try sema.explainWhyTypeIsComptime(block, src, msg, src.toSrcLoc(src_decl), var_ty); |
| 17981 | if (var_ty.zigTypeTag() == .ComptimeInt or var_ty.zigTypeTag() == .ComptimeFloat) { | ||
| 17982 | try sema.errNote(block, src, msg, "to modify this variable at runtime, it must be given an explicit fixed-size number type", .{}); | ||
| 17983 | } | ||
| 17960 | 17984 | ||
| 17961 | break :msg msg; | 17985 | break :msg msg; |
| 17962 | }; | 17986 | }; |
| ... | @@ -20041,6 +20065,15 @@ fn coerce( | ... | @@ -20041,6 +20065,15 @@ fn coerce( |
| 20041 | }); | 20065 | }); |
| 20042 | return sema.addConstant(dest_ty, slice_val); | 20066 | return sema.addConstant(dest_ty, slice_val); |
| 20043 | } | 20067 | } |
| 20068 | |||
| 20069 | if (inst_ty.zigTypeTag() == .Array) { | ||
| 20070 | return sema.fail( | ||
| 20071 | block, | ||
| 20072 | inst_src, | ||
| 20073 | "array literal requires address-of operator (&) to coerce to slice type '{}'", | ||
| 20074 | .{dest_ty.fmt(sema.mod)}, | ||
| 20075 | ); | ||
| 20076 | } | ||
| 20044 | }, | 20077 | }, |
| 20045 | .Many => p: { | 20078 | .Many => p: { |
| 20046 | if (!inst_ty.isSlice()) break :p; | 20079 | if (!inst_ty.isSlice()) break :p; |
| ... | @@ -24433,6 +24466,10 @@ fn semaUnionFields(block: *Block, mod: *Module, union_obj: *Module.Union) Compil | ... | @@ -24433,6 +24466,10 @@ fn semaUnionFields(block: *Block, mod: *Module, union_obj: *Module.Union) Compil |
| 24433 | } else { | 24466 | } else { |
| 24434 | // The provided type is the enum tag type. | 24467 | // The provided type is the enum tag type. |
| 24435 | union_obj.tag_ty = try provided_ty.copy(decl_arena_allocator); | 24468 | union_obj.tag_ty = try provided_ty.copy(decl_arena_allocator); |
| 24469 | if (union_obj.tag_ty.zigTypeTag() != .Enum) { | ||
| 24470 | const tag_ty_src = src; // TODO better source location | ||
| 24471 | return sema.fail(block, tag_ty_src, "expected enum tag type, found '{}'", .{union_obj.tag_ty.fmt(sema.mod)}); | ||
| 24472 | } | ||
| 24436 | // The fields of the union must match the enum exactly. | 24473 | // The fields of the union must match the enum exactly. |
| 24437 | // Store a copy of the enum field names so we can check for | 24474 | // Store a copy of the enum field names so we can check for |
| 24438 | // missing or extraneous fields later. | 24475 | // missing or extraneous fields later. |
src/Zir.zig+5| ... | @@ -798,6 +798,8 @@ pub const Inst = struct { | ... | @@ -798,6 +798,8 @@ pub const Inst = struct { |
| 798 | error_name, | 798 | error_name, |
| 799 | /// Implement builtin `@panic`. Uses `un_node`. | 799 | /// Implement builtin `@panic`. Uses `un_node`. |
| 800 | panic, | 800 | panic, |
| 801 | /// Same as `panic` but forces comptime. | ||
| 802 | panic_comptime, | ||
| 801 | /// Implement builtin `@setCold`. Uses `un_node`. | 803 | /// Implement builtin `@setCold`. Uses `un_node`. |
| 802 | set_cold, | 804 | set_cold, |
| 803 | /// Implement builtin `@setRuntimeSafety`. Uses `un_node`. | 805 | /// Implement builtin `@setRuntimeSafety`. Uses `un_node`. |
| ... | @@ -1260,6 +1262,7 @@ pub const Inst = struct { | ... | @@ -1260,6 +1262,7 @@ pub const Inst = struct { |
| 1260 | .repeat, | 1262 | .repeat, |
| 1261 | .repeat_inline, | 1263 | .repeat_inline, |
| 1262 | .panic, | 1264 | .panic, |
| 1265 | .panic_comptime, | ||
| 1263 | => true, | 1266 | => true, |
| 1264 | }; | 1267 | }; |
| 1265 | } | 1268 | } |
| ... | @@ -1533,6 +1536,7 @@ pub const Inst = struct { | ... | @@ -1533,6 +1536,7 @@ pub const Inst = struct { |
| 1533 | .repeat, | 1536 | .repeat, |
| 1534 | .repeat_inline, | 1537 | .repeat_inline, |
| 1535 | .panic, | 1538 | .panic, |
| 1539 | .panic_comptime, | ||
| 1536 | .@"try", | 1540 | .@"try", |
| 1537 | .try_ptr, | 1541 | .try_ptr, |
| 1538 | //.try_inline, | 1542 | //.try_inline, |
| ... | @@ -1726,6 +1730,7 @@ pub const Inst = struct { | ... | @@ -1726,6 +1730,7 @@ pub const Inst = struct { |
| 1726 | .embed_file = .un_node, | 1730 | .embed_file = .un_node, |
| 1727 | .error_name = .un_node, | 1731 | .error_name = .un_node, |
| 1728 | .panic = .un_node, | 1732 | .panic = .un_node, |
| 1733 | .panic_comptime = .un_node, | ||
| 1729 | .set_cold = .un_node, | 1734 | .set_cold = .un_node, |
| 1730 | .set_runtime_safety = .un_node, | 1735 | .set_runtime_safety = .un_node, |
| 1731 | .sqrt = .un_node, | 1736 | .sqrt = .un_node, |
src/print_zir.zig+1| ... | @@ -197,6 +197,7 @@ const Writer = struct { | ... | @@ -197,6 +197,7 @@ const Writer = struct { |
| 197 | .embed_file, | 197 | .embed_file, |
| 198 | .error_name, | 198 | .error_name, |
| 199 | .panic, | 199 | .panic, |
| 200 | .panic_comptime, | ||
| 200 | .set_cold, | 201 | .set_cold, |
| 201 | .set_runtime_safety, | 202 | .set_runtime_safety, |
| 202 | .sqrt, | 203 | .sqrt, |
test/cases/compile_errors/method_call_with_first_arg_type_primitive.zig created+21| ... | @@ -0,0 +1,21 @@ | ||
| 1 | const Foo = struct { | ||
| 2 | x: i32, | ||
| 3 | |||
| 4 | fn init(x: i32) Foo { | ||
| 5 | return Foo { | ||
| 6 | .x = x, | ||
| 7 | }; | ||
| 8 | } | ||
| 9 | }; | ||
| 10 | |||
| 11 | export fn f() void { | ||
| 12 | const derp = Foo.init(3); | ||
| 13 | |||
| 14 | derp.init(); | ||
| 15 | } | ||
| 16 | |||
| 17 | // error | ||
| 18 | // backend=stage2 | ||
| 19 | // target=native | ||
| 20 | // | ||
| 21 | // :14:9: error: type 'tmp.Foo' has no field or member function named 'init' | ||
test/cases/compile_errors/method_call_with_first_arg_type_wrong_container.zig created+30| ... | @@ -0,0 +1,30 @@ | ||
| 1 | pub const List = struct { | ||
| 2 | len: usize, | ||
| 3 | allocator: *Allocator, | ||
| 4 | |||
| 5 | pub fn init(allocator: *Allocator) List { | ||
| 6 | return List { | ||
| 7 | .len = 0, | ||
| 8 | .allocator = allocator, | ||
| 9 | }; | ||
| 10 | } | ||
| 11 | }; | ||
| 12 | |||
| 13 | pub var global_allocator = Allocator { | ||
| 14 | .field = 1234, | ||
| 15 | }; | ||
| 16 | |||
| 17 | pub const Allocator = struct { | ||
| 18 | field: i32, | ||
| 19 | }; | ||
| 20 | |||
| 21 | export fn foo() void { | ||
| 22 | var x = List.init(&global_allocator); | ||
| 23 | x.init(); | ||
| 24 | } | ||
| 25 | |||
| 26 | // error | ||
| 27 | // backend=llvm | ||
| 28 | // target=native | ||
| 29 | // | ||
| 30 | // :23:6: error: type 'tmp.List' has no field or member function named 'init' | ||
test/cases/compile_errors/missing_const_in_slice_with_nested_array_type.zig created+18| ... | @@ -0,0 +1,18 @@ | ||
| 1 | const Geo3DTex2D = struct { vertices: [][2]f32 }; | ||
| 2 | pub fn getGeo3DTex2D() Geo3DTex2D { | ||
| 3 | return Geo3DTex2D{ | ||
| 4 | .vertices = [_][2]f32{ | ||
| 5 | [_]f32{ -0.5, -0.5}, | ||
| 6 | }, | ||
| 7 | }; | ||
| 8 | } | ||
| 9 | export fn entry() void { | ||
| 10 | var geo_data = getGeo3DTex2D(); | ||
| 11 | _ = geo_data; | ||
| 12 | } | ||
| 13 | |||
| 14 | // error | ||
| 15 | // backend=llvm | ||
| 16 | // target=native | ||
| 17 | // | ||
| 18 | // :4:30: error: array literal requires address-of operator (&) to coerce to slice type '[][2]f32' | ||
test/cases/compile_errors/mul_overflow_in_function_evaluation.zig created+14| ... | @@ -0,0 +1,14 @@ | ||
| 1 | const y = mul(300, 6000); | ||
| 2 | fn mul(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 '1800000' | ||
| 13 | // :1:14: note: called from here | ||
| 14 | |||
test/cases/compile_errors/negation_overflow_in_function_evaluation.zig created+13| ... | @@ -0,0 +1,13 @@ | ||
| 1 | const y = neg(-128); | ||
| 2 | fn neg(x: i8) i8 { | ||
| 3 | return -x; | ||
| 4 | } | ||
| 5 | |||
| 6 | export fn entry() usize { return @sizeOf(@TypeOf(&y)); } | ||
| 7 | |||
| 8 | // error | ||
| 9 | // backend=stage2 | ||
| 10 | // target=native | ||
| 11 | // | ||
| 12 | // :3:12: error: overflow of integer type 'i8' with value '128' | ||
| 13 | // :1:14: note: called from here | ||
test/cases/compile_errors/no_else_prong_on_switch_on_global_error_set.zig created+14| ... | @@ -0,0 +1,14 @@ | ||
| 1 | export fn entry() void { | ||
| 2 | foo(error.A); | ||
| 3 | } | ||
| 4 | fn foo(a: anyerror) void { | ||
| 5 | switch (a) { | ||
| 6 | error.A => {}, | ||
| 7 | } | ||
| 8 | } | ||
| 9 | |||
| 10 | // error | ||
| 11 | // backend=stage2 | ||
| 12 | // target=native | ||
| 13 | // | ||
| 14 | // :5:5: error: else prong required when switching on type 'anyerror' | ||
test/cases/compile_errors/non-const_variables_of_things_that_require_const_variables.zig created+44| ... | @@ -0,0 +1,44 @@ | ||
| 1 | export fn entry1() void { | ||
| 2 | var m2 = &2; | ||
| 3 | _ = m2; | ||
| 4 | } | ||
| 5 | export fn entry2() void { | ||
| 6 | var a = undefined; | ||
| 7 | _ = a; | ||
| 8 | } | ||
| 9 | export fn entry3() void { | ||
| 10 | var b = 1; | ||
| 11 | _ = b; | ||
| 12 | } | ||
| 13 | export fn entry4() void { | ||
| 14 | var c = 1.0; | ||
| 15 | _ = c; | ||
| 16 | } | ||
| 17 | export fn entry5() void { | ||
| 18 | var d = null; | ||
| 19 | _ = d; | ||
| 20 | } | ||
| 21 | export fn entry6(opaque_: *Opaque) void { | ||
| 22 | var e = opaque_.*; | ||
| 23 | _ = e; | ||
| 24 | } | ||
| 25 | export fn entry7() void { | ||
| 26 | var f = i32; | ||
| 27 | _ = f; | ||
| 28 | } | ||
| 29 | const Opaque = opaque {}; | ||
| 30 | |||
| 31 | // error | ||
| 32 | // backend=stage2 | ||
| 33 | // target=native | ||
| 34 | // | ||
| 35 | // :2:8: error: variable of type '*const comptime_int' must be const or comptime | ||
| 36 | // :6:8: error: variable of type '@TypeOf(undefined)' must be const or comptime | ||
| 37 | // :10:8: error: variable of type 'comptime_int' must be const or comptime | ||
| 38 | // :10:8: note: to modify this variable at runtime, it must be given an explicit fixed-size number type | ||
| 39 | // :14:8: error: variable of type 'comptime_float' must be const or comptime | ||
| 40 | // :14:8: note: to modify this variable at runtime, it must be given an explicit fixed-size number type | ||
| 41 | // :18:8: error: variable of type '@TypeOf(null)' must be const or comptime | ||
| 42 | // :22:19: error: values of type 'tmp.Opaque' must be comptime known, but operand value is runtime known | ||
| 43 | // :26:8: error: variable of type 'type' must be const or comptime | ||
| 44 | // :26:8: note: types are not available at runtime | ||
test/cases/compile_errors/non_error_sets_used_in_merge_error_sets_operator.zig created+15| ... | @@ -0,0 +1,15 @@ | ||
| 1 | export fn foo() void { | ||
| 2 | const Errors = u8 || u16; | ||
| 3 | _ = Errors; | ||
| 4 | } | ||
| 5 | export fn bar() void { | ||
| 6 | const Errors = error{} || u16; | ||
| 7 | _ = Errors; | ||
| 8 | } | ||
| 9 | |||
| 10 | // error | ||
| 11 | // backend=stage2 | ||
| 12 | // target=native | ||
| 13 | // | ||
| 14 | // :2:20: error: expected error set type, found 'u8' | ||
| 15 | // :6:31: error: expected error set type, found 'u16' | ||
test/cases/compile_errors/panic_called_at_compile_time.zig created+11| ... | @@ -0,0 +1,11 @@ | ||
| 1 | export fn entry() void { | ||
| 2 | comptime { | ||
| 3 | @panic("aoeu",); | ||
| 4 | } | ||
| 5 | } | ||
| 6 | |||
| 7 | // error | ||
| 8 | // backend=stage2 | ||
| 9 | // target=native | ||
| 10 | // | ||
| 11 | // :3:9: error: encountered @panic at comptime | ||
test/cases/compile_errors/stage1/non_compile_time_array_concatenation.zig created+11| ... | @@ -0,0 +1,11 @@ | ||
| 1 | fn f() []u8 { | ||
| 2 | return s ++ "foo"; | ||
| 3 | } | ||
| 4 | var s: [10]u8 = undefined; | ||
| 5 | export fn entry() usize { return @sizeOf(@TypeOf(f)); } | ||
| 6 | |||
| 7 | // error | ||
| 8 | // backend=stage1 | ||
| 9 | // target=native | ||
| 10 | // | ||
| 11 | // tmp.zig:2:12: error: unable to evaluate constant expression | ||
test/cases/compile_errors/stage1/obj/method_call_with_first_arg_type_primitive.zig deleted-21| ... | @@ -1,21 +0,0 @@ | ||
| 1 | const Foo = struct { | ||
| 2 | x: i32, | ||
| 3 | |||
| 4 | fn init(x: i32) Foo { | ||
| 5 | return Foo { | ||
| 6 | .x = x, | ||
| 7 | }; | ||
| 8 | } | ||
| 9 | }; | ||
| 10 | |||
| 11 | export fn f() void { | ||
| 12 | const derp = Foo.init(3); | ||
| 13 | |||
| 14 | derp.init(); | ||
| 15 | } | ||
| 16 | |||
| 17 | // error | ||
| 18 | // backend=stage1 | ||
| 19 | // target=native | ||
| 20 | // | ||
| 21 | // tmp.zig:14:5: error: expected type 'i32', found 'Foo' | ||
test/cases/compile_errors/stage1/obj/method_call_with_first_arg_type_wrong_container.zig deleted-30| ... | @@ -1,30 +0,0 @@ | ||
| 1 | pub const List = struct { | ||
| 2 | len: usize, | ||
| 3 | allocator: *Allocator, | ||
| 4 | |||
| 5 | pub fn init(allocator: *Allocator) List { | ||
| 6 | return List { | ||
| 7 | .len = 0, | ||
| 8 | .allocator = allocator, | ||
| 9 | }; | ||
| 10 | } | ||
| 11 | }; | ||
| 12 | |||
| 13 | pub var global_allocator = Allocator { | ||
| 14 | .field = 1234, | ||
| 15 | }; | ||
| 16 | |||
| 17 | pub const Allocator = struct { | ||
| 18 | field: i32, | ||
| 19 | }; | ||
| 20 | |||
| 21 | export fn foo() void { | ||
| 22 | var x = List.init(&global_allocator); | ||
| 23 | x.init(); | ||
| 24 | } | ||
| 25 | |||
| 26 | // error | ||
| 27 | // backend=stage1 | ||
| 28 | // target=native | ||
| 29 | // | ||
| 30 | // tmp.zig:23:5: error: expected type '*Allocator', found '*List' | ||
test/cases/compile_errors/stage1/obj/missing_const_in_slice_with_nested_array_type.zig deleted-18| ... | @@ -1,18 +0,0 @@ | ||
| 1 | const Geo3DTex2D = struct { vertices: [][2]f32 }; | ||
| 2 | pub fn getGeo3DTex2D() Geo3DTex2D { | ||
| 3 | return Geo3DTex2D{ | ||
| 4 | .vertices = [_][2]f32{ | ||
| 5 | [_]f32{ -0.5, -0.5}, | ||
| 6 | }, | ||
| 7 | }; | ||
| 8 | } | ||
| 9 | export fn entry() void { | ||
| 10 | var geo_data = getGeo3DTex2D(); | ||
| 11 | _ = geo_data; | ||
| 12 | } | ||
| 13 | |||
| 14 | // error | ||
| 15 | // backend=stage1 | ||
| 16 | // target=native | ||
| 17 | // | ||
| 18 | // tmp.zig:4:30: error: array literal requires address-of operator (&) to coerce to slice type '[][2]f32' | ||
test/cases/compile_errors/stage1/obj/mul_overflow_in_function_evaluation.zig deleted-12| ... | @@ -1,12 +0,0 @@ | ||
| 1 | const y = mul(300, 6000); | ||
| 2 | fn mul(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/negation_overflow_in_function_evaluation.zig deleted-12| ... | @@ -1,12 +0,0 @@ | ||
| 1 | const y = neg(-128); | ||
| 2 | fn neg(x: i8) i8 { | ||
| 3 | return -x; | ||
| 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:12: error: negation caused overflow | ||
test/cases/compile_errors/stage1/obj/no_else_prong_on_switch_on_global_error_set.zig deleted-14| ... | @@ -1,14 +0,0 @@ | ||
| 1 | export fn entry() void { | ||
| 2 | foo(error.A); | ||
| 3 | } | ||
| 4 | fn foo(a: anyerror) void { | ||
| 5 | switch (a) { | ||
| 6 | error.A => {}, | ||
| 7 | } | ||
| 8 | } | ||
| 9 | |||
| 10 | // error | ||
| 11 | // backend=stage1 | ||
| 12 | // target=native | ||
| 13 | // | ||
| 14 | // tmp.zig:5:5: error: else prong required when switching on type 'anyerror' | ||
test/cases/compile_errors/stage1/obj/non-const_variables_of_things_that_require_const_variables.zig deleted-51| ... | @@ -1,51 +0,0 @@ | ||
| 1 | export fn entry1() void { | ||
| 2 | var m2 = &2; | ||
| 3 | _ = m2; | ||
| 4 | } | ||
| 5 | export fn entry2() void { | ||
| 6 | var a = undefined; | ||
| 7 | _ = a; | ||
| 8 | } | ||
| 9 | export fn entry3() void { | ||
| 10 | var b = 1; | ||
| 11 | _ = b; | ||
| 12 | } | ||
| 13 | export fn entry4() void { | ||
| 14 | var c = 1.0; | ||
| 15 | _ = c; | ||
| 16 | } | ||
| 17 | export fn entry5() void { | ||
| 18 | var d = null; | ||
| 19 | _ = d; | ||
| 20 | } | ||
| 21 | export fn entry6(opaque_: *Opaque) void { | ||
| 22 | var e = opaque_.*; | ||
| 23 | _ = e; | ||
| 24 | } | ||
| 25 | export fn entry7() void { | ||
| 26 | var f = i32; | ||
| 27 | _ = f; | ||
| 28 | } | ||
| 29 | export fn entry8() void { | ||
| 30 | var h = (Foo {}).bar; | ||
| 31 | _ = h; | ||
| 32 | } | ||
| 33 | const Opaque = opaque {}; | ||
| 34 | const Foo = struct { | ||
| 35 | fn bar(self: *const Foo) void {_ = self;} | ||
| 36 | }; | ||
| 37 | |||
| 38 | // error | ||
| 39 | // backend=stage1 | ||
| 40 | // target=native | ||
| 41 | // | ||
| 42 | // tmp.zig:2:4: error: variable of type '*const comptime_int' must be const or comptime | ||
| 43 | // tmp.zig:6:4: error: variable of type '@Type(.Undefined)' must be const or comptime | ||
| 44 | // tmp.zig:10:4: error: variable of type 'comptime_int' must be const or comptime | ||
| 45 | // tmp.zig:10:4: note: to modify this variable at runtime, it must be given an explicit fixed-size number type | ||
| 46 | // tmp.zig:14:4: error: variable of type 'comptime_float' must be const or comptime | ||
| 47 | // tmp.zig:14:4: note: to modify this variable at runtime, it must be given an explicit fixed-size number type | ||
| 48 | // tmp.zig:18:4: error: variable of type '@Type(.Null)' must be const or comptime | ||
| 49 | // tmp.zig:22:4: error: variable of type 'Opaque' not allowed | ||
| 50 | // tmp.zig:26:4: error: variable of type 'type' must be const or comptime | ||
| 51 | // tmp.zig:30:4: error: variable of type '(bound fn(*const Foo) void)' must be const or comptime | ||
test/cases/compile_errors/stage1/obj/non_compile_time_array_concatenation.zig deleted-11| ... | @@ -1,11 +0,0 @@ | ||
| 1 | fn f() []u8 { | ||
| 2 | return s ++ "foo"; | ||
| 3 | } | ||
| 4 | var s: [10]u8 = undefined; | ||
| 5 | export fn entry() usize { return @sizeOf(@TypeOf(f)); } | ||
| 6 | |||
| 7 | // error | ||
| 8 | // backend=stage1 | ||
| 9 | // target=native | ||
| 10 | // | ||
| 11 | // tmp.zig:2:12: error: unable to evaluate constant expression | ||
test/cases/compile_errors/stage1/obj/non_error_sets_used_in_merge_error_sets_operator.zig deleted-17| ... | @@ -1,17 +0,0 @@ | ||
| 1 | export fn foo() void { | ||
| 2 | const Errors = u8 || u16; | ||
| 3 | _ = Errors; | ||
| 4 | } | ||
| 5 | export fn bar() void { | ||
| 6 | const Errors = error{} || u16; | ||
| 7 | _ = Errors; | ||
| 8 | } | ||
| 9 | |||
| 10 | // error | ||
| 11 | // backend=stage1 | ||
| 12 | // target=native | ||
| 13 | // | ||
| 14 | // tmp.zig:2:20: error: expected error set type, found type 'u8' | ||
| 15 | // tmp.zig:2:23: note: `||` merges error sets; `or` performs boolean OR | ||
| 16 | // tmp.zig:6:31: error: expected error set type, found type 'u16' | ||
| 17 | // tmp.zig:6:28: note: `||` merges error sets; `or` performs boolean OR | ||
test/cases/compile_errors/stage1/obj/panic_called_at_compile_time.zig deleted-11| ... | @@ -1,11 +0,0 @@ | ||
| 1 | export fn entry() void { | ||
| 2 | comptime { | ||
| 3 | @panic("aoeu",); | ||
| 4 | } | ||
| 5 | } | ||
| 6 | |||
| 7 | // error | ||
| 8 | // backend=stage1 | ||
| 9 | // target=native | ||
| 10 | // | ||
| 11 | // tmp.zig:3:9: error: encountered @panic at compile-time | ||
test/cases/compile_errors/use_invalid_number_literal_as_array_index.zig+1| ... | @@ -9,3 +9,4 @@ export fn entry() void { | ... | @@ -9,3 +9,4 @@ export fn entry() void { |
| 9 | // target=native | 9 | // target=native |
| 10 | // | 10 | // |
| 11 | // :1:1: error: variable of type 'comptime_int' must be const or comptime | 11 | // :1:1: error: variable of type 'comptime_int' must be const or comptime |
| 12 | // :1:1: note: to modify this variable at runtime, it must be given an explicit fixed-size number type |