authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-12-14 12:08:08-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-12-14 12:08:08-05:00
log4af305b30acdefb9da380b21b446d2b31b5a6295
tree442c7d3722c22bedbca48cafa8038fa34499818a
parent3bf97bfd460f0704542699578a1d52a078aa7a21
parent014009a730315adf865777282c0f7aa4209afc38
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #13891 from Vexu/compile-errors

Organize and implement remaining stage1 compile errors

166 files changed, 1450 insertions(+), 1405 deletions(-)

lib/std/zig/parse.zig+1-1
......@@ -286,7 +286,7 @@ const Parser = struct {
286286 .keyword_comptime => switch (p.token_tags[p.tok_i + 1]) {
287287 .l_brace => {
288288 if (doc_comment) |some| {
289 try p.warnMsg(.{ .tag = .test_doc_comment, .token = some });
289 try p.warnMsg(.{ .tag = .comptime_doc_comment, .token = some });
290290 }
291291 const comptime_token = p.nextToken();
292292 const block = p.parseBlock() catch |err| switch (err) {
lib/std/zig/parser_test.zig+12
......@@ -4210,6 +4210,18 @@ test "zig fmt: remove newlines surrounding doc comment within container decl" {
42104210 );
42114211}
42124212
4213test "zig fmt: invalid else branch statement" {
4214 try testError(
4215 \\/// This is a doc comment for a comptime block.
4216 \\comptime {}
4217 \\/// This is a doc comment for a test
4218 \\test "This is my test" {}
4219 , &[_]Error{
4220 .comptime_doc_comment,
4221 .test_doc_comment,
4222 });
4223}
4224
42134225test "zig fmt: invalid else branch statement" {
42144226 try testError(
42154227 \\comptime {
src/Compilation.zig+24-3
......@@ -31,6 +31,7 @@ const clangMain = @import("main.zig").clangMain;
3131const Module = @import("Module.zig");
3232const Cache = @import("Cache.zig");
3333const translate_c = @import("translate_c.zig");
34const clang = @import("clang.zig");
3435const c_codegen = @import("codegen/c.zig");
3536const ThreadPool = @import("ThreadPool.zig");
3637const WaitGroup = @import("WaitGroup.zig");
......@@ -2749,6 +2750,9 @@ pub fn totalErrorCount(self: *Compilation) usize {
27492750 const decl = module.declPtr(key);
27502751 if (decl.getFileScope().okToReportErrors()) {
27512752 total += 1;
2753 if (module.cimport_errors.get(key)) |errors| {
2754 total += errors.len;
2755 }
27522756 }
27532757 }
27542758 if (module.emit_h) |emit_h| {
......@@ -2858,6 +2862,23 @@ pub fn getAllErrorsAlloc(self: *Compilation) !AllErrors {
28582862 // We'll try again once parsing succeeds.
28592863 if (decl.getFileScope().okToReportErrors()) {
28602864 try AllErrors.add(module, &arena, &errors, entry.value_ptr.*.*);
2865 if (module.cimport_errors.get(entry.key_ptr.*)) |cimport_errors| for (cimport_errors) |c_error| {
2866 if (c_error.path) |some|
2867 try errors.append(.{
2868 .src = .{
2869 .src_path = try arena_allocator.dupe(u8, std.mem.span(some)),
2870 .span = .{ .start = c_error.offset, .end = c_error.offset + 1, .main = c_error.offset },
2871 .msg = try arena_allocator.dupe(u8, std.mem.span(c_error.msg)),
2872 .line = c_error.line,
2873 .column = c_error.column,
2874 .source_line = if (c_error.source_line) |line| try arena_allocator.dupe(u8, std.mem.span(line)) else null,
2875 },
2876 })
2877 else
2878 try errors.append(.{
2879 .plain = .{ .msg = try arena_allocator.dupe(u8, std.mem.span(c_error.msg)) },
2880 });
2881 };
28612882 }
28622883 }
28632884 }
......@@ -3524,7 +3545,7 @@ test "cImport" {
35243545
35253546const CImportResult = struct {
35263547 out_zig_path: []u8,
3527 errors: []translate_c.ClangErrMsg,
3548 errors: []clang.ErrorMsg,
35283549};
35293550
35303551/// Caller owns returned memory.
......@@ -3599,7 +3620,7 @@ pub fn cImport(comp: *Compilation, c_src: []const u8) !CImportResult {
35993620
36003621 const c_headers_dir_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{"include"});
36013622 const c_headers_dir_path_z = try arena.dupeZ(u8, c_headers_dir_path);
3602 var clang_errors: []translate_c.ClangErrMsg = &[0]translate_c.ClangErrMsg{};
3623 var clang_errors: []clang.ErrorMsg = &[0]clang.ErrorMsg{};
36033624 var tree = translate_c.translate(
36043625 comp.gpa,
36053626 new_argv.ptr,
......@@ -3665,7 +3686,7 @@ pub fn cImport(comp: *Compilation, c_src: []const u8) !CImportResult {
36653686 }
36663687 return CImportResult{
36673688 .out_zig_path = out_zig_path,
3668 .errors = &[0]translate_c.ClangErrMsg{},
3689 .errors = &[0]clang.ErrorMsg{},
36693690 };
36703691}
36713692
src/Module.zig+30
......@@ -31,6 +31,7 @@ const target_util = @import("target.zig");
3131const build_options = @import("build_options");
3232const Liveness = @import("Liveness.zig");
3333const isUpDir = @import("introspect.zig").isUpDir;
34const clang = @import("clang.zig");
3435
3536/// General-purpose allocator. Used for both temporary and long-term storage.
3637gpa: Allocator,
......@@ -111,6 +112,9 @@ failed_embed_files: std.AutoArrayHashMapUnmanaged(*EmbedFile, *ErrorMsg) = .{},
111112/// Using a map here for consistency with the other fields here.
112113/// The ErrorMsg memory is owned by the `Export`, using Module's general purpose allocator.
113114failed_exports: std.AutoArrayHashMapUnmanaged(*Export, *ErrorMsg) = .{},
115/// If a decl failed due to a cimport error, the corresponding Clang errors
116/// are stored here.
117cimport_errors: std.AutoArrayHashMapUnmanaged(Decl.Index, []CImportError) = .{},
114118
115119/// Candidates for deletion. After a semantic analysis update completes, this list
116120/// contains Decls that need to be deleted if they end up having no references to them.
......@@ -172,6 +176,21 @@ reference_table: std.AutoHashMapUnmanaged(Decl.Index, struct {
172176 src: LazySrcLoc,
173177}) = .{},
174178
179pub const CImportError = struct {
180 offset: u32,
181 line: u32,
182 column: u32,
183 path: ?[*:0]u8,
184 source_line: ?[*:0]u8,
185 msg: [*:0]u8,
186
187 pub fn deinit(err: CImportError, gpa: Allocator) void {
188 if (err.path) |some| gpa.free(std.mem.span(some));
189 if (err.source_line) |some| gpa.free(std.mem.span(some));
190 gpa.free(std.mem.span(err.msg));
191 }
192};
193
175194pub const StringLiteralContext = struct {
176195 bytes: *ArrayListUnmanaged(u8),
177196
......@@ -3449,6 +3468,11 @@ pub fn deinit(mod: *Module) void {
34493468 }
34503469 mod.failed_exports.deinit(gpa);
34513470
3471 for (mod.cimport_errors.values()) |errs| {
3472 for (errs) |err| err.deinit(gpa);
3473 }
3474 mod.cimport_errors.deinit(gpa);
3475
34523476 mod.compile_log_decls.deinit(gpa);
34533477
34543478 for (mod.decl_exports.values()) |*export_list| {
......@@ -5381,6 +5405,9 @@ pub fn clearDecl(
53815405 if (mod.failed_decls.fetchSwapRemove(decl_index)) |kv| {
53825406 kv.value.destroy(gpa);
53835407 }
5408 if (mod.cimport_errors.fetchSwapRemove(decl_index)) |kv| {
5409 for (kv.value) |err| err.deinit(gpa);
5410 }
53845411 if (mod.emit_h) |emit_h| {
53855412 if (emit_h.failed_decls.fetchSwapRemove(decl_index)) |kv| {
53865413 kv.value.destroy(gpa);
......@@ -5768,6 +5795,9 @@ fn markOutdatedDecl(mod: *Module, decl_index: Decl.Index) !void {
57685795 if (mod.failed_decls.fetchSwapRemove(decl_index)) |kv| {
57695796 kv.value.destroy(mod.gpa);
57705797 }
5798 if (mod.cimport_errors.fetchSwapRemove(decl_index)) |kv| {
5799 for (kv.value) |err| err.deinit(mod.gpa);
5800 }
57715801 if (decl.has_tv and decl.owns_tv) {
57725802 if (decl.val.castTag(.function)) |payload| {
57735803 const func = payload.data;
src/Sema.zig+285-59
......@@ -2257,6 +2257,9 @@ fn failWithOwnedErrorMsg(sema: *Sema, err_msg: *Module.ErrorMsg) CompileError {
22572257 sema.owner_decl.analysis = .sema_failure;
22582258 sema.owner_decl.generation = mod.generation;
22592259 }
2260 if (sema.func) |func| {
2261 func.state = .sema_failure;
2262 }
22602263 const gop = mod.failed_decls.getOrPutAssumeCapacity(sema.owner_decl_index);
22612264 if (gop.found_existing) {
22622265 // If there are multiple errors for the same Decl, prefer the first one added.
......@@ -4109,6 +4112,8 @@ fn validateUnionInit(
41094112 const union_init = try sema.addConstant(union_ty, union_val);
41104113 try sema.storePtr2(block, init_src, union_ptr, init_src, union_init, init_src, .store);
41114114 return;
4115 } else if (try sema.typeRequiresComptime(union_ty)) {
4116 return sema.failWithNeededComptime(block, field_ptr_data.src(), "initializer of comptime only union must be comptime-known");
41124117 }
41134118
41144119 const new_tag = try sema.addConstant(tag_ty, tag_val);
......@@ -4226,6 +4231,7 @@ fn validateStructInit(
42264231 var first_block_index = block.instructions.items.len;
42274232 var make_runtime = false;
42284233
4234 const require_comptime = try sema.typeRequiresComptime(struct_ty);
42294235 const air_tags = sema.air_instructions.items(.tag);
42304236 const air_datas = sema.air_instructions.items(.data);
42314237
......@@ -4301,6 +4307,9 @@ fn validateStructInit(
43014307 }
43024308 if (try sema.resolveMaybeUndefValAllowVariablesMaybeRuntime(bin_op.rhs, &make_runtime)) |val| {
43034309 field_values[i] = val;
4310 } else if (require_comptime) {
4311 const field_ptr_data = sema.code.instructions.items(.data)[field_ptr].pl_node;
4312 return sema.failWithNeededComptime(block, field_ptr_data.src(), "initializer of comptime only struct must be comptime-known");
43044313 } else {
43054314 struct_is_comptime = false;
43064315 }
......@@ -5121,20 +5130,58 @@ fn zirCImport(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileEr
51215130
51225131 if (c_import_res.errors.len != 0) {
51235132 const msg = msg: {
5133 defer @import("clang.zig").ErrorMsg.delete(c_import_res.errors.ptr, c_import_res.errors.len);
5134
51245135 const msg = try sema.errMsg(&child_block, src, "C import failed", .{});
51255136 errdefer msg.destroy(sema.gpa);
51265137
51275138 if (!mod.comp.bin_file.options.link_libc)
51285139 try sema.errNote(&child_block, src, msg, "libc headers not available; compilation does not link against libc", .{});
51295140
5130 for (c_import_res.errors) |_| {
5131 // TODO integrate with LazySrcLoc
5132 // try mod.errNoteNonLazy(.{}, msg, "{s}", .{clang_err.msg_ptr[0..clang_err.msg_len]});
5133 // if (clang_err.filename_ptr) |p| p[0..clang_err.filename_len] else "(no file)",
5134 // clang_err.line + 1,
5135 // clang_err.column + 1,
5141 const gop = try sema.mod.cimport_errors.getOrPut(sema.gpa, sema.owner_decl_index);
5142 if (!gop.found_existing) {
5143 var errs = try std.ArrayListUnmanaged(Module.CImportError).initCapacity(sema.gpa, c_import_res.errors.len);
5144 errdefer {
5145 for (errs.items) |err| err.deinit(sema.gpa);
5146 errs.deinit(sema.gpa);
5147 }
5148
5149 for (c_import_res.errors) |c_error| {
5150 const path = if (c_error.filename_ptr) |some|
5151 try sema.gpa.dupeZ(u8, some[0..c_error.filename_len])
5152 else
5153 null;
5154 errdefer if (path) |some| sema.gpa.free(some);
5155
5156 const c_msg = try sema.gpa.dupeZ(u8, c_error.msg_ptr[0..c_error.msg_len]);
5157 errdefer sema.gpa.free(c_msg);
5158
5159 const line = line: {
5160 const source = c_error.source orelse break :line null;
5161 var start = c_error.offset;
5162 while (start > 0) : (start -= 1) {
5163 if (source[start - 1] == '\n') break;
5164 }
5165 var end = c_error.offset;
5166 while (true) : (end += 1) {
5167 if (source[end] == 0) break;
5168 if (source[end] == '\n') break;
5169 }
5170 break :line try sema.gpa.dupeZ(u8, source[start..end]);
5171 };
5172 errdefer if (line) |some| sema.gpa.free(some);
5173
5174 errs.appendAssumeCapacity(.{
5175 .path = path orelse null,
5176 .source_line = line orelse null,
5177 .line = c_error.line,
5178 .column = c_error.column,
5179 .offset = c_error.offset,
5180 .msg = c_msg,
5181 });
5182 }
5183 gop.value_ptr.* = errs.items;
51365184 }
5137 @import("clang.zig").Stage2ErrorMsg.delete(c_import_res.errors.ptr, c_import_res.errors.len);
51385185 break :msg msg;
51395186 };
51405187 return sema.failWithOwnedErrorMsg(msg);
......@@ -5402,7 +5449,7 @@ fn zirExport(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void
54025449 const options = sema.resolveExportOptions(block, .unneeded, extra.options) catch |err| switch (err) {
54035450 error.NeededSourceLocation => {
54045451 _ = try sema.resolveExportOptions(block, options_src, extra.options);
5405 return error.AnalysisFail;
5452 unreachable;
54065453 },
54075454 else => |e| return e,
54085455 };
......@@ -5429,7 +5476,7 @@ fn zirExportValue(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
54295476 const options = sema.resolveExportOptions(block, .unneeded, extra.options) catch |err| switch (err) {
54305477 error.NeededSourceLocation => {
54315478 _ = try sema.resolveExportOptions(block, options_src, extra.options);
5432 return error.AnalysisFail;
5479 unreachable;
54335480 },
54345481 else => |e| return e,
54355482 };
......@@ -6379,6 +6426,7 @@ fn analyzeCall(
63796426 }),
63806427 else => unreachable,
63816428 };
6429 if (!is_comptime_call and module_fn.state == .sema_failure) return error.AnalysisFail;
63826430
63836431 // Analyze the ZIR. The same ZIR gets analyzed into a runtime function
63846432 // or an inlined call depending on what union tag the `label` field is
......@@ -6512,7 +6560,7 @@ fn analyzeCall(
65126560 func_ty_info.param_types,
65136561 func,
65146562 );
6515 return error.AnalysisFail;
6563 unreachable;
65166564 },
65176565 else => |e| return e,
65186566 };
......@@ -6674,7 +6722,7 @@ fn analyzeCall(
66746722 uncasted_arg,
66756723 opts,
66766724 );
6677 return error.AnalysisFail;
6725 unreachable;
66786726 },
66796727 else => |e| return e,
66806728 };
......@@ -6687,7 +6735,7 @@ fn analyzeCall(
66876735 uncasted_arg,
66886736 Module.argSrc(call_src.node_offset.x, sema.gpa, decl, i, bound_arg_src),
66896737 );
6690 return error.AnalysisFail;
6738 unreachable;
66916739 },
66926740 else => |e| return e,
66936741 };
......@@ -6991,7 +7039,7 @@ fn instantiateGenericCall(
69917039 const decl = sema.mod.declPtr(block.src_decl);
69927040 const arg_src = Module.argSrc(call_src.node_offset.x, sema.gpa, decl, i, bound_arg_src);
69937041 _ = try sema.analyzeGenericCallArgVal(block, arg_src, uncasted_args[i]);
6994 return error.AnalysisFail;
7042 unreachable;
69957043 },
69967044 else => |e| return e,
69977045 };
......@@ -7174,7 +7222,7 @@ fn instantiateGenericCall(
71747222 const decl = sema.mod.declPtr(block.src_decl);
71757223 const arg_src = Module.argSrc(call_src.node_offset.x, sema.gpa, decl, arg_i, bound_arg_src);
71767224 _ = try sema.resolveConstValue(block, arg_src, arg, "argument to parameter with comptime-only type must be comptime-known");
7177 return error.AnalysisFail;
7225 unreachable;
71787226 },
71797227 else => |e| return e,
71807228 };
......@@ -7330,7 +7378,7 @@ fn instantiateGenericCall(
73307378 new_fn_info,
73317379 &runtime_i,
73327380 );
7333 return error.AnalysisFail;
7381 unreachable;
73347382 },
73357383 else => |e| return e,
73367384 };
......@@ -8417,6 +8465,10 @@ fn funcCommon(
84178465 const param_types = try sema.arena.alloc(Type, block.params.items.len);
84188466 const comptime_params = try sema.arena.alloc(bool, block.params.items.len);
84198467 for (block.params.items) |param, i| {
8468 const is_noalias = blk: {
8469 const index = std.math.cast(u5, i) orelse break :blk false;
8470 break :blk @truncate(u1, noalias_bits >> index) != 0;
8471 };
84208472 param_types[i] = param.ty;
84218473 sema.analyzeParameter(
84228474 block,
......@@ -8427,6 +8479,7 @@ fn funcCommon(
84278479 &is_generic,
84288480 cc_resolved,
84298481 has_body,
8482 is_noalias,
84308483 ) catch |err| switch (err) {
84318484 error.NeededSourceLocation => {
84328485 const decl = sema.mod.declPtr(block.src_decl);
......@@ -8439,8 +8492,9 @@ fn funcCommon(
84398492 &is_generic,
84408493 cc_resolved,
84418494 has_body,
8495 is_noalias,
84428496 );
8443 return error.AnalysisFail;
8497 unreachable;
84448498 },
84458499 else => |e| return e,
84468500 };
......@@ -8689,6 +8743,7 @@ fn analyzeParameter(
86898743 is_generic: *bool,
86908744 cc: std.builtin.CallingConvention,
86918745 has_body: bool,
8746 is_noalias: bool,
86928747) !void {
86938748 const requires_comptime = try sema.typeRequiresComptime(param.ty);
86948749 comptime_params[i] = param.is_comptime or requires_comptime;
......@@ -8743,6 +8798,9 @@ fn analyzeParameter(
87438798 };
87448799 return sema.failWithOwnedErrorMsg(msg);
87458800 }
8801 if (!this_generic and is_noalias and !param.ty.isPtrAtRuntime()) {
8802 return sema.fail(block, param_src, "non-pointer parameter declared noalias", .{});
8803 }
87468804}
87478805
87488806fn zirParam(
......@@ -10633,7 +10691,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
1063310691 const case_src = Module.SwitchProngSrc{ .range = .{ .prong = multi_i, .item = range_i } };
1063410692 const decl = sema.mod.declPtr(case_block.src_decl);
1063510693 try sema.emitBackwardBranch(block, case_src.resolve(sema.gpa, decl, src_node_offset, .none));
10636 return error.AnalysisFail;
10694 unreachable;
1063710695 },
1063810696 else => return err,
1063910697 };
......@@ -10669,7 +10727,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
1066910727 const case_src = Module.SwitchProngSrc{ .multi = .{ .prong = multi_i, .item = @intCast(u32, item_i) } };
1067010728 const decl = sema.mod.declPtr(case_block.src_decl);
1067110729 try sema.emitBackwardBranch(block, case_src.resolve(sema.gpa, decl, src_node_offset, .none));
10672 return error.AnalysisFail;
10730 unreachable;
1067310731 },
1067410732 else => return err,
1067510733 };
......@@ -11101,10 +11159,8 @@ fn resolveSwitchItemVal(
1110111159 } else |err| switch (err) {
1110211160 error.NeededSourceLocation => {
1110311161 const src = switch_prong_src.resolve(sema.gpa, sema.mod.declPtr(block.src_decl), switch_node_offset, range_expand);
11104 return TypedValue{
11105 .ty = item_ty,
11106 .val = try sema.resolveConstValue(block, src, item, "switch prong values must be comptime-known"),
11107 };
11162 _ = try sema.resolveConstValue(block, src, item, "switch prong values must be comptime-known");
11163 unreachable;
1110811164 },
1110911165 else => |e| return e,
1111011166 }
......@@ -11618,6 +11674,21 @@ fn zirShl(
1161811674 });
1161911675 }
1162011676 }
11677 if (rhs_ty.zigTypeTag() == .Vector) {
11678 var i: usize = 0;
11679 while (i < rhs_ty.vectorLen()) : (i += 1) {
11680 if (rhs_val.indexVectorlike(i).compareHetero(.lt, Value.zero, target)) {
11681 return sema.fail(block, rhs_src, "shift by negative amount '{}' at index '{d}'", .{
11682 rhs_val.indexVectorlike(i).fmtValue(scalar_ty, sema.mod),
11683 i,
11684 });
11685 }
11686 }
11687 } else if (rhs_val.compareHetero(.lt, Value.zero, target)) {
11688 return sema.fail(block, rhs_src, "shift by negative amount '{}'", .{
11689 rhs_val.fmtValue(scalar_ty, sema.mod),
11690 });
11691 }
1162111692 }
1162211693
1162311694 const runtime_src = if (maybe_lhs_val) |lhs_val| rs: {
......@@ -11787,6 +11858,21 @@ fn zirShr(
1178711858 });
1178811859 }
1178911860 }
11861 if (rhs_ty.zigTypeTag() == .Vector) {
11862 var i: usize = 0;
11863 while (i < rhs_ty.vectorLen()) : (i += 1) {
11864 if (rhs_val.indexVectorlike(i).compareHetero(.lt, Value.zero, target)) {
11865 return sema.fail(block, rhs_src, "shift by negative amount '{}' at index '{d}'", .{
11866 rhs_val.indexVectorlike(i).fmtValue(scalar_ty, sema.mod),
11867 i,
11868 });
11869 }
11870 }
11871 } else if (rhs_val.compareHetero(.lt, Value.zero, target)) {
11872 return sema.fail(block, rhs_src, "shift by negative amount '{}'", .{
11873 rhs_val.fmtValue(scalar_ty, sema.mod),
11874 });
11875 }
1179011876 if (maybe_lhs_val) |lhs_val| {
1179111877 if (lhs_val.isUndef()) {
1179211878 return sema.addConstUndef(lhs_ty);
......@@ -14721,7 +14807,9 @@ fn analyzeCmp(
1472114807) CompileError!Air.Inst.Ref {
1472214808 const lhs_ty = sema.typeOf(lhs);
1472314809 const rhs_ty = sema.typeOf(rhs);
14724 try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src);
14810 if (lhs_ty.zigTypeTag() != .Optional and rhs_ty.zigTypeTag() != .Optional) {
14811 try sema.checkVectorizableBinaryOperands(block, src, lhs_ty, rhs_ty, lhs_src, rhs_src);
14812 }
1472514813
1472614814 if (lhs_ty.zigTypeTag() == .Vector and rhs_ty.zigTypeTag() == .Vector) {
1472714815 return sema.cmpVector(block, src, lhs, rhs, op, lhs_src, rhs_src);
......@@ -15217,12 +15305,17 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1521715305 try Value.Tag.ty.create(params_anon_decl.arena(), try param_ty.copy(params_anon_decl.arena())),
1521815306 );
1521915307
15308 const is_noalias = blk: {
15309 const index = std.math.cast(u5, i) orelse break :blk false;
15310 break :blk @truncate(u1, info.noalias_bits >> index) != 0;
15311 };
15312
1522015313 const param_fields = try params_anon_decl.arena().create([3]Value);
1522115314 param_fields.* = .{
1522215315 // is_generic: bool,
1522315316 Value.makeBool(is_generic),
1522415317 // is_noalias: bool,
15225 Value.false, // TODO
15318 Value.makeBool(is_noalias),
1522615319 // arg_type: ?type,
1522715320 param_ty_val,
1522815321 };
......@@ -17409,7 +17502,7 @@ fn zirStructInitAnon(
1740917502 const decl = sema.mod.declPtr(block.src_decl);
1741017503 const field_src = Module.initSrc(src.node_offset.x, sema.gpa, decl, runtime_index);
1741117504 try sema.requireRuntimeBlock(block, src, field_src);
17412 return error.AnalysisFail;
17505 unreachable;
1741317506 },
1741417507 else => |e| return e,
1741517508 };
......@@ -17474,25 +17567,31 @@ fn zirArrayInit(
1747417567 defer gpa.free(resolved_args);
1747517568 for (args[1..]) |arg, i| {
1747617569 const resolved_arg = try sema.resolveInst(arg);
17477 const arg_src = src; // TODO better source location
1747817570 const elem_ty = if (array_ty.zigTypeTag() == .Struct)
1747917571 array_ty.structFieldType(i)
1748017572 else
1748117573 array_ty.elemType2();
17482 resolved_args[i] = try sema.coerce(block, elem_ty, resolved_arg, arg_src);
17574 resolved_args[i] = sema.coerce(block, elem_ty, resolved_arg, .unneeded) catch |err| switch (err) {
17575 error.NeededSourceLocation => {
17576 const decl = sema.mod.declPtr(block.src_decl);
17577 const elem_src = Module.initSrc(src.node_offset.x, sema.gpa, decl, i);
17578 _ = try sema.coerce(block, elem_ty, resolved_arg, elem_src);
17579 unreachable;
17580 },
17581 else => return err,
17582 };
1748317583 }
1748417584
1748517585 if (sentinel_val) |some| {
1748617586 resolved_args[resolved_args.len - 1] = try sema.addConstant(array_ty.elemType2(), some);
1748717587 }
1748817588
17489 const opt_runtime_src: ?LazySrcLoc = for (resolved_args) |arg| {
17490 const arg_src = src; // TODO better source location
17589 const opt_runtime_index: ?u32 = for (resolved_args) |arg, i| {
1749117590 const comptime_known = try sema.isComptimeKnown(arg);
17492 if (!comptime_known) break arg_src;
17591 if (!comptime_known) break @intCast(u32, i);
1749317592 } else null;
1749417593
17495 const runtime_src = opt_runtime_src orelse {
17594 const runtime_index = opt_runtime_index orelse {
1749617595 const elem_vals = try sema.arena.alloc(Value, resolved_args.len);
1749717596
1749817597 for (resolved_args) |arg, i| {
......@@ -17504,7 +17603,15 @@ fn zirArrayInit(
1750417603 return sema.addConstantMaybeRef(block, array_ty, array_val, is_ref);
1750517604 };
1750617605
17507 try sema.requireRuntimeBlock(block, src, runtime_src);
17606 sema.requireRuntimeBlock(block, src, .unneeded) catch |err| switch (err) {
17607 error.NeededSourceLocation => {
17608 const decl = sema.mod.declPtr(block.src_decl);
17609 const elem_src = Module.initSrc(src.node_offset.x, sema.gpa, decl, runtime_index);
17610 try sema.requireRuntimeBlock(block, src, elem_src);
17611 unreachable;
17612 },
17613 else => return err,
17614 };
1750817615 try sema.queueFullTypeResolution(array_ty);
1750917616
1751017617 if (is_ref) {
......@@ -18502,10 +18609,47 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in
1850218609 }
1850318610
1850418611 var buffer: Value.ToTypeBuffer = undefined;
18612 const field_ty = try field_type_val.toType(&buffer).copy(new_decl_arena_allocator);
1850518613 gop.value_ptr.* = .{
18506 .ty = try field_type_val.toType(&buffer).copy(new_decl_arena_allocator),
18614 .ty = field_ty,
1850718615 .abi_align = @intCast(u32, (try alignment_val.getUnsignedIntAdvanced(target, sema)).?),
1850818616 };
18617
18618 if (field_ty.zigTypeTag() == .Opaque) {
18619 const msg = msg: {
18620 const msg = try sema.errMsg(block, src, "opaque types have unknown size and therefore cannot be directly embedded in unions", .{});
18621 errdefer msg.destroy(sema.gpa);
18622
18623 try sema.addDeclaredHereNote(msg, field_ty);
18624 break :msg msg;
18625 };
18626 return sema.failWithOwnedErrorMsg(msg);
18627 }
18628 if (union_obj.layout == .Extern and !try sema.validateExternType(field_ty, .union_field)) {
18629 const msg = msg: {
18630 const msg = try sema.errMsg(block, src, "extern unions cannot contain fields of type '{}'", .{field_ty.fmt(sema.mod)});
18631 errdefer msg.destroy(sema.gpa);
18632
18633 const src_decl = sema.mod.declPtr(block.src_decl);
18634 try sema.explainWhyTypeIsNotExtern(msg, src.toSrcLoc(src_decl), field_ty, .union_field);
18635
18636 try sema.addDeclaredHereNote(msg, field_ty);
18637 break :msg msg;
18638 };
18639 return sema.failWithOwnedErrorMsg(msg);
18640 } else if (union_obj.layout == .Packed and !(validatePackedType(field_ty))) {
18641 const msg = msg: {
18642 const msg = try sema.errMsg(block, src, "packed unions cannot contain fields of type '{}'", .{field_ty.fmt(sema.mod)});
18643 errdefer msg.destroy(sema.gpa);
18644
18645 const src_decl = sema.mod.declPtr(block.src_decl);
18646 try sema.explainWhyTypeIsNotPacked(msg, src.toSrcLoc(src_decl), field_ty);
18647
18648 try sema.addDeclaredHereNote(msg, field_ty);
18649 break :msg msg;
18650 };
18651 return sema.failWithOwnedErrorMsg(msg);
18652 }
1850918653 }
1851018654
1851118655 if (tag_ty_field_names) |names| {
......@@ -18587,21 +18731,25 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in
1858718731 // is_noalias: bool,
1858818732 const arg_is_noalias = arg_val[1].toBool();
1858918733 // arg_type: ?type,
18590 const param_type_val = arg_val[2];
18734 const param_type_opt_val = arg_val[2];
1859118735
1859218736 if (arg_is_generic) {
1859318737 return sema.fail(block, src, "Type.Fn.Param.is_generic must be false for @Type", .{});
1859418738 }
1859518739
18740 const param_type_val = param_type_opt_val.optionalValue() orelse
18741 return sema.fail(block, src, "Type.Fn.Param.arg_type must be non-null for @Type", .{});
18742 const param_type = try param_type_val.toType(&buf).copy(sema.arena);
18743
1859618744 if (arg_is_noalias) {
18597 noalias_bits = @as(u32, 1) << (std.math.cast(u5, i) orelse
18745 if (!param_type.isPtrAtRuntime()) {
18746 return sema.fail(block, src, "non-pointer parameter declared noalias", .{});
18747 }
18748 noalias_bits |= @as(u32, 1) << (std.math.cast(u5, i) orelse
1859818749 return sema.fail(block, src, "this compiler implementation only supports 'noalias' on the first 32 parameters", .{}));
1859918750 }
1860018751
18601 const param_type = param_type_val.optionalValue() orelse
18602 return sema.fail(block, src, "Type.Fn.Param.arg_type must be non-null for @Type", .{});
18603
18604 param_types[i] = try param_type.toType(&buf).copy(sema.arena);
18752 param_types[i] = param_type;
1860518753 comptime_params[i] = false;
1860618754 }
1860718755
......@@ -18745,13 +18893,60 @@ fn reifyStruct(
1874518893 }
1874618894
1874718895 var buffer: Value.ToTypeBuffer = undefined;
18896 const field_ty = try field_type_val.toType(&buffer).copy(new_decl_arena_allocator);
1874818897 gop.value_ptr.* = .{
18749 .ty = try field_type_val.toType(&buffer).copy(new_decl_arena_allocator),
18898 .ty = field_ty,
1875018899 .abi_align = abi_align,
1875118900 .default_val = default_val,
1875218901 .is_comptime = is_comptime_val.toBool(),
1875318902 .offset = undefined,
1875418903 };
18904
18905 if (field_ty.zigTypeTag() == .Opaque) {
18906 const msg = msg: {
18907 const msg = try sema.errMsg(block, src, "opaque types have unknown size and therefore cannot be directly embedded in structs", .{});
18908 errdefer msg.destroy(sema.gpa);
18909
18910 try sema.addDeclaredHereNote(msg, field_ty);
18911 break :msg msg;
18912 };
18913 return sema.failWithOwnedErrorMsg(msg);
18914 }
18915 if (field_ty.zigTypeTag() == .NoReturn) {
18916 const msg = msg: {
18917 const msg = try sema.errMsg(block, src, "struct fields cannot be 'noreturn'", .{});
18918 errdefer msg.destroy(sema.gpa);
18919
18920 try sema.addDeclaredHereNote(msg, field_ty);
18921 break :msg msg;
18922 };
18923 return sema.failWithOwnedErrorMsg(msg);
18924 }
18925 if (struct_obj.layout == .Extern and !try sema.validateExternType(field_ty, .struct_field)) {
18926 const msg = msg: {
18927 const msg = try sema.errMsg(block, src, "extern structs cannot contain fields of type '{}'", .{field_ty.fmt(sema.mod)});
18928 errdefer msg.destroy(sema.gpa);
18929
18930 const src_decl = sema.mod.declPtr(block.src_decl);
18931 try sema.explainWhyTypeIsNotExtern(msg, src.toSrcLoc(src_decl), field_ty, .struct_field);
18932
18933 try sema.addDeclaredHereNote(msg, field_ty);
18934 break :msg msg;
18935 };
18936 return sema.failWithOwnedErrorMsg(msg);
18937 } else if (struct_obj.layout == .Packed and !(validatePackedType(field_ty))) {
18938 const msg = msg: {
18939 const msg = try sema.errMsg(block, src, "packed structs cannot contain fields of type '{}'", .{field_ty.fmt(sema.mod)});
18940 errdefer msg.destroy(sema.gpa);
18941
18942 const src_decl = sema.mod.declPtr(block.src_decl);
18943 try sema.explainWhyTypeIsNotPacked(msg, src.toSrcLoc(src_decl), field_ty);
18944
18945 try sema.addDeclaredHereNote(msg, field_ty);
18946 break :msg msg;
18947 };
18948 return sema.failWithOwnedErrorMsg(msg);
18949 }
1875518950 }
1875618951
1875718952 if (layout == .Packed) {
......@@ -21544,7 +21739,7 @@ fn zirPrefetch(
2154421739 const options = sema.resolvePrefetchOptions(block, .unneeded, extra.rhs) catch |err| switch (err) {
2154521740 error.NeededSourceLocation => {
2154621741 _ = try sema.resolvePrefetchOptions(block, opts_src, extra.rhs);
21547 return error.AnalysisFail;
21742 unreachable;
2154821743 },
2154921744 else => |e| return e,
2155021745 };
......@@ -21637,7 +21832,7 @@ fn zirBuiltinExtern(
2163721832 const options = sema.resolveExternOptions(block, .unneeded, extra.rhs) catch |err| switch (err) {
2163821833 error.NeededSourceLocation => {
2163921834 _ = try sema.resolveExternOptions(block, options_src, extra.rhs);
21640 return error.AnalysisFail;
21835 unreachable;
2164121836 },
2164221837 else => |e| return e,
2164321838 };
......@@ -24493,7 +24688,7 @@ fn coerceExtra(
2449324688 }
2449424689 if (try sema.resolveMaybeUndefVal(inst)) |val| {
2449524690 const result_val = try val.floatCast(sema.arena, dest_ty, target);
24496 if (!val.eql(result_val, dest_ty, sema.mod)) {
24691 if (!val.eql(result_val, inst_ty, sema.mod)) {
2449724692 return sema.fail(
2449824693 block,
2449924694 inst_src,
......@@ -24987,7 +25182,7 @@ const InMemoryCoercionResult = union(enum) {
2498725182 cur = param.child;
2498825183 },
2498925184 .fn_cc => |cc| {
24990 try sema.errNote(block, src, msg, "calling convention {s} cannot cast into calling convention {s}", .{ @tagName(cc.actual), @tagName(cc.wanted) });
25185 try sema.errNote(block, src, msg, "calling convention '{s}' cannot cast into calling convention '{s}'", .{ @tagName(cc.actual), @tagName(cc.wanted) });
2499125186 break;
2499225187 },
2499325188 .fn_return_type => |pair| {
......@@ -26842,6 +27037,9 @@ fn coerceCompatiblePtrs(
2684227037) !Air.Inst.Ref {
2684327038 const inst_ty = sema.typeOf(inst);
2684427039 if (try sema.resolveMaybeUndefVal(inst)) |val| {
27040 if (!val.isUndef() and val.isNull() and !dest_ty.isAllowzeroPtr()) {
27041 return sema.fail(block, inst_src, "null pointer casted to type '{}'", .{dest_ty.fmt(sema.mod)});
27042 }
2684527043 // The comptime Value representation is compatible with both types.
2684627044 return sema.addConstant(dest_ty, val);
2684727045 }
......@@ -30177,7 +30375,7 @@ fn semaStructFields(mod: *Module, struct_obj: *Module.Struct) CompileError!void
3017730375 const tree = try sema.getAstTree(&block_scope);
3017830376 const init_src = containerFieldInitSrcLoc(decl, tree.*, 0, i);
3017930377 _ = try sema.coerce(&block_scope, field.ty, init, init_src);
30180 return error.AnalysisFail;
30378 unreachable;
3018130379 },
3018230380 else => |e| return e,
3018330381 };
......@@ -30304,6 +30502,25 @@ fn semaUnionFields(mod: *Module, union_obj: *Module.Union) CompileError!void {
3030430502 if (int_tag_ty.zigTypeTag() != .Int and int_tag_ty.zigTypeTag() != .ComptimeInt) {
3030530503 return sema.fail(&block_scope, tag_ty_src, "expected integer tag type, found '{}'", .{int_tag_ty.fmt(sema.mod)});
3030630504 }
30505
30506 if (fields_len > 0) {
30507 var field_count_val: Value.Payload.U64 = .{
30508 .base = .{ .tag = .int_u64 },
30509 .data = fields_len - 1,
30510 };
30511 if (!(try sema.intFitsInType(Value.initPayload(&field_count_val.base), int_tag_ty, null))) {
30512 const msg = msg: {
30513 const msg = try sema.errMsg(&block_scope, tag_ty_src, "specified integer tag type cannot represent every field", .{});
30514 errdefer msg.destroy(sema.gpa);
30515 try sema.errNote(&block_scope, tag_ty_src, msg, "type '{}' cannot fit values in range 0...{d}", .{
30516 int_tag_ty.fmt(sema.mod),
30517 fields_len - 1,
30518 });
30519 break :msg msg;
30520 };
30521 return sema.failWithOwnedErrorMsg(msg);
30522 }
30523 }
3030730524 union_obj.tag_ty = try sema.generateUnionTagTypeNumbered(&block_scope, fields_len, provided_ty, union_obj);
3030830525 const enum_obj = union_obj.tag_ty.castTag(.enum_numbered).?.data;
3030930526 enum_field_names = &enum_obj.fields;
......@@ -30379,7 +30596,7 @@ fn semaUnionFields(mod: *Module, union_obj: *Module.Union) CompileError!void {
3037930596 } else .none;
3038030597
3038130598 if (enum_value_map) |map| {
30382 if (tag_ref != .none) {
30599 const copied_val = if (tag_ref != .none) blk: {
3038330600 const tag_src = src; // TODO better source location
3038430601 const coerced = try sema.coerce(&block_scope, int_tag_ty, tag_ref, tag_src);
3038530602 const val = try sema.resolveConstValue(&block_scope, tag_src, coerced, "enum tag value must be comptime-known");
......@@ -30387,23 +30604,31 @@ fn semaUnionFields(mod: *Module, union_obj: *Module.Union) CompileError!void {
3038730604
3038830605 // This puts the memory into the union arena, not the enum arena, but
3038930606 // it is OK since they share the same lifetime.
30390 const copied_val = try val.copy(decl_arena_allocator);
30391 map.putAssumeCapacityContext(copied_val, {}, .{
30392 .ty = int_tag_ty,
30393 .mod = mod,
30394 });
30395 } else {
30607 break :blk try val.copy(decl_arena_allocator);
30608 } else blk: {
3039630609 const val = if (last_tag_val) |val|
3039730610 try sema.intAdd(val, Value.one, int_tag_ty)
3039830611 else
3039930612 Value.zero;
3040030613 last_tag_val = val;
3040130614
30402 const copied_val = try val.copy(decl_arena_allocator);
30403 map.putAssumeCapacityContext(copied_val, {}, .{
30404 .ty = int_tag_ty,
30405 .mod = mod,
30406 });
30615 break :blk try val.copy(decl_arena_allocator);
30616 };
30617 const gop = map.getOrPutAssumeCapacityContext(copied_val, .{
30618 .ty = int_tag_ty,
30619 .mod = mod,
30620 });
30621 if (gop.found_existing) {
30622 const tree = try sema.getAstTree(&block_scope);
30623 const field_src = enumFieldSrcLoc(sema.mod.declPtr(block_scope.src_decl), tree.*, src.node_offset.x, field_i);
30624 const other_field_src = enumFieldSrcLoc(sema.mod.declPtr(block_scope.src_decl), tree.*, src.node_offset.x, gop.index);
30625 const msg = msg: {
30626 const msg = try sema.errMsg(&block_scope, field_src, "enum tag value {} already taken", .{copied_val.fmtValue(int_tag_ty, sema.mod)});
30627 errdefer msg.destroy(gpa);
30628 try sema.errNote(&block_scope, other_field_src, msg, "other occurrence here", .{});
30629 break :msg msg;
30630 };
30631 return sema.failWithOwnedErrorMsg(msg);
3040730632 }
3040830633 }
3040930634
......@@ -30574,16 +30799,17 @@ fn generateUnionTagTypeNumbered(
3057430799 new_decl.name_fully_qualified = true;
3057530800 errdefer mod.abortAnonDecl(new_decl_index);
3057630801
30802 const copied_int_ty = try int_ty.copy(new_decl_arena_allocator);
3057730803 enum_obj.* = .{
3057830804 .owner_decl = new_decl_index,
30579 .tag_ty = int_ty,
30805 .tag_ty = copied_int_ty,
3058030806 .fields = .{},
3058130807 .values = .{},
3058230808 };
3058330809 // Here we pre-allocate the maps using the decl arena.
3058430810 try enum_obj.fields.ensureTotalCapacity(new_decl_arena_allocator, fields_len);
3058530811 try enum_obj.values.ensureTotalCapacityContext(new_decl_arena_allocator, fields_len, .{
30586 .ty = int_ty,
30812 .ty = copied_int_ty,
3058730813 .mod = mod,
3058830814 });
3058930815 try new_decl.finalizeNewArena(&new_decl_arena);
src/clang.zig+4-4
......@@ -1897,13 +1897,13 @@ pub const OffsetOfNode_Kind = enum(c_int) {
18971897 Base,
18981898};
18991899
1900pub const Stage2ErrorMsg = extern struct {
1900pub const ErrorMsg = extern struct {
19011901 filename_ptr: ?[*]const u8,
19021902 filename_len: usize,
19031903 msg_ptr: [*]const u8,
19041904 msg_len: usize,
19051905 // valid until the ASTUnit is freed
1906 source: ?[*]const u8,
1906 source: ?[*:0]const u8,
19071907 // 0 based
19081908 line: c_uint,
19091909 // 0 based
......@@ -1912,14 +1912,14 @@ pub const Stage2ErrorMsg = extern struct {
19121912 offset: c_uint,
19131913
19141914 pub const delete = ZigClangErrorMsg_delete;
1915 extern fn ZigClangErrorMsg_delete(ptr: [*]Stage2ErrorMsg, len: usize) void;
1915 extern fn ZigClangErrorMsg_delete(ptr: [*]ErrorMsg, len: usize) void;
19161916};
19171917
19181918pub const LoadFromCommandLine = ZigClangLoadFromCommandLine;
19191919extern fn ZigClangLoadFromCommandLine(
19201920 args_begin: [*]?[*]const u8,
19211921 args_end: [*]?[*]const u8,
1922 errors_ptr: *[*]Stage2ErrorMsg,
1922 errors_ptr: *[*]ErrorMsg,
19231923 errors_len: *usize,
19241924 resources_path: [*:0]const u8,
19251925) ?*ASTUnit;
src/main.zig+2-1
......@@ -19,6 +19,7 @@ const introspect = @import("introspect.zig");
1919const LibCInstallation = @import("libc_installation.zig").LibCInstallation;
2020const wasi_libc = @import("wasi_libc.zig");
2121const translate_c = @import("translate_c.zig");
22const clang = @import("clang.zig");
2223const Cache = @import("Cache.zig");
2324const target_util = @import("target.zig");
2425const ThreadPool = @import("ThreadPool.zig");
......@@ -3552,7 +3553,7 @@ fn cmdTranslateC(comp: *Compilation, arena: Allocator, enable_cache: bool) !void
35523553
35533554 const c_headers_dir_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{"include"});
35543555 const c_headers_dir_path_z = try arena.dupeZ(u8, c_headers_dir_path);
3555 var clang_errors: []translate_c.ClangErrMsg = &[0]translate_c.ClangErrMsg{};
3556 var clang_errors: []clang.ErrorMsg = &[0]clang.ErrorMsg{};
35563557 var tree = translate_c.translate(
35573558 comp.gpa,
35583559 new_argv.ptr,
src/translate_c.zig+1-7
......@@ -13,8 +13,6 @@ const Tag = Node.Tag;
1313
1414const CallingConvention = std.builtin.CallingConvention;
1515
16pub const ClangErrMsg = clang.Stage2ErrorMsg;
17
1816pub const Error = std.mem.Allocator.Error;
1917const MacroProcessingError = Error || error{UnexpectedMacroToken};
2018const TypeError = Error || error{UnsupportedType};
......@@ -350,7 +348,7 @@ pub fn translate(
350348 gpa: mem.Allocator,
351349 args_begin: [*]?[*]const u8,
352350 args_end: [*]?[*]const u8,
353 errors: *[]ClangErrMsg,
351 errors: *[]clang.ErrorMsg,
354352 resources_path: [*:0]const u8,
355353) !std.zig.Ast {
356354 // TODO stage2 bug
......@@ -5115,10 +5113,6 @@ pub fn failDecl(c: *Context, loc: clang.SourceLocation, name: []const u8, compti
51155113 try c.global_scope.nodes.append(try Tag.warning.create(c.arena, location_comment));
51165114}
51175115
5118pub fn freeErrors(errors: []ClangErrMsg) void {
5119 errors.ptr.delete(errors.len);
5120}
5121
51225116const PatternList = struct {
51235117 patterns: []Pattern,
51245118
src/type.zig+2-1
......@@ -177,9 +177,10 @@ pub const Type = extern union {
177177 .Float,
178178 .ComptimeFloat,
179179 .ComptimeInt,
180 .Vector, // TODO some vectors require is_equality_cmp==true
181180 => true,
182181
182 .Vector => ty.elemType2().isSelfComparable(is_equality_cmp),
183
183184 .Bool,
184185 .Type,
185186 .Void,
test/behavior/union.zig+9
......@@ -1465,3 +1465,12 @@ test "Namespace-like union" {
14651465 var a: DepType.Version.Git = .tag;
14661466 try expect(a.frozen());
14671467}
1468
1469test "union int tag type is properly managed" {
1470 const Bar = union(enum(u2)) {
1471 x: bool,
1472 y: u8,
1473 z: u8,
1474 };
1475 try expect(@sizeOf(Bar) + 1 == 3);
1476}
test/cases/compile_errors/async/Frame_of_generic_function.zig created+14
......@@ -0,0 +1,14 @@
1export fn entry() void {
2 var frame: @Frame(func) = undefined;
3 _ = frame;
4}
5fn func(comptime T: type) void {
6 var x: T = undefined;
7 _ = x;
8}
9
10// error
11// backend=stage1
12// target=native
13//
14// tmp.zig:2:16: error: @Frame() of generic function
test/cases/compile_errors/async/async_function_depends_on_its_own_frame.zig created+13
......@@ -0,0 +1,13 @@
1export fn entry() void {
2 _ = async amain();
3}
4fn amain() callconv(.Async) void {
5 var x: [@sizeOf(@Frame(amain))]u8 = undefined;
6 _ = x;
7}
8
9// error
10// backend=stage1
11// target=native
12//
13// tmp.zig:4:1: error: cannot resolve '@Frame(amain)': function not fully analyzed yet
test/cases/compile_errors/async/async_function_indirectly_depends_on_its_own_frame.zig created+17
......@@ -0,0 +1,17 @@
1export fn entry() void {
2 _ = async amain();
3}
4fn amain() callconv(.Async) void {
5 other();
6}
7fn other() void {
8 var x: [@sizeOf(@Frame(amain))]u8 = undefined;
9 _ = x;
10}
11
12// error
13// backend=stage1
14// target=native
15//
16// tmp.zig:4:1: error: unable to determine async function frame of 'amain'
17// tmp.zig:5:10: note: analysis of function 'other' depends on the frame
test/cases/compile_errors/async/bad_alignment_in_asynccall.zig created+12
......@@ -0,0 +1,12 @@
1export fn entry() void {
2 var ptr: fn () callconv(.Async) void = func;
3 var bytes: [64]u8 = undefined;
4 _ = @asyncCall(&bytes, {}, ptr, .{});
5}
6fn func() callconv(.Async) void {}
7
8// error
9// backend=stage1
10// target=aarch64-linux-none
11//
12// tmp.zig:4:21: error: expected type '[]align(8) u8', found '*[64]u8'
test/cases/compile_errors/async/const_frame_cast_to_anyframe.zig created+19
......@@ -0,0 +1,19 @@
1export fn a() void {
2 const f = async func();
3 resume f;
4}
5export fn b() void {
6 const f = async func();
7 var x: anyframe = &f;
8 _ = x;
9}
10fn func() void {
11 suspend {}
12}
13
14// error
15// backend=stage1
16// target=native
17//
18// tmp.zig:3:12: error: expected type 'anyframe', found '*const @Frame(func)'
19// tmp.zig:7:24: error: expected type 'anyframe', found '*const @Frame(func)'
test/cases/compile_errors/async/exported_async_function.zig created+7
......@@ -0,0 +1,7 @@
1export fn foo() callconv(.Async) void {}
2
3// error
4// backend=stage1
5// target=native
6//
7// tmp.zig:1:1: error: exported function cannot be async
test/cases/compile_errors/async/frame_called_outside_of_function_definition.zig created+11
......@@ -0,0 +1,11 @@
1var handle_undef: anyframe = undefined;
2var handle_dummy: anyframe = @frame();
3export fn entry() bool {
4 return handle_undef == handle_dummy;
5}
6
7// error
8// backend=stage1
9// target=native
10//
11// tmp.zig:2:30: error: @frame() called outside of function definition
test/cases/compile_errors/async/frame_causes_function_to_be_async.zig created+13
......@@ -0,0 +1,13 @@
1export fn entry() void {
2 func();
3}
4fn func() void {
5 _ = @frame();
6}
7
8// error
9// backend=stage1
10// target=native
11//
12// tmp.zig:1:1: error: function with calling convention 'C' cannot be async
13// tmp.zig:5:9: note: @frame() causes function to be async
test/cases/compile_errors/async/function_with_ccc_indirectly_calling_async_function.zig created+18
......@@ -0,0 +1,18 @@
1export fn entry() void {
2 foo();
3}
4fn foo() void {
5 bar();
6}
7fn bar() void {
8 suspend {}
9}
10
11// error
12// backend=stage1
13// target=native
14//
15// tmp.zig:1:1: error: function with calling convention 'C' cannot be async
16// tmp.zig:2:8: note: async function call here
17// tmp.zig:5:8: note: async function call here
18// tmp.zig:8:5: note: suspends here
test/cases/compile_errors/async/indirect_recursion_of_async_functions_detected.zig created+36
......@@ -0,0 +1,36 @@
1var frame: ?anyframe = null;
2
3export fn a() void {
4 _ = async rangeSum(10);
5 while (frame) |f| resume f;
6}
7
8fn rangeSum(x: i32) i32 {
9 suspend {
10 frame = @frame();
11 }
12 frame = null;
13
14 if (x == 0) return 0;
15 var child = rangeSumIndirect(x - 1);
16 return child + 1;
17}
18
19fn rangeSumIndirect(x: i32) i32 {
20 suspend {
21 frame = @frame();
22 }
23 frame = null;
24
25 if (x == 0) return 0;
26 var child = rangeSum(x - 1);
27 return child + 1;
28}
29
30// error
31// backend=stage1
32// target=native
33//
34// tmp.zig:8:1: error: '@Frame(rangeSum)' depends on itself
35// tmp.zig:15:33: note: when analyzing type '@Frame(rangeSum)' here
36// tmp.zig:26:25: note: when analyzing type '@Frame(rangeSumIndirect)' here
test/cases/compile_errors/async/invalid_suspend_in_exported_function.zig created+15
......@@ -0,0 +1,15 @@
1export fn entry() void {
2 var frame = async func();
3 var result = await frame;
4 _ = result;
5}
6fn func() void {
7 suspend {}
8}
9
10// error
11// backend=stage1
12// target=native
13//
14// tmp.zig:1:1: error: function with calling convention 'C' cannot be async
15// tmp.zig:3:18: note: await here is a suspend point
test/cases/compile_errors/async/non-async_function_pointer_eventually_is_inferred_to_become_async.zig created+15
......@@ -0,0 +1,15 @@
1export fn a() void {
2 var non_async_fn: fn () void = undefined;
3 non_async_fn = func;
4}
5fn func() void {
6 suspend {}
7}
8
9// error
10// backend=stage1
11// target=native
12//
13// tmp.zig:5:1: error: 'func' cannot be async
14// tmp.zig:3:20: note: required to be non-async here
15// tmp.zig:6:5: note: suspends here
test/cases/compile_errors/async/non_async_function_pointer_passed_to_asyncCall.zig created+12
......@@ -0,0 +1,12 @@
1export fn entry() void {
2 var ptr = afunc;
3 var bytes: [100]u8 align(16) = undefined;
4 _ = @asyncCall(&bytes, {}, ptr, .{});
5}
6fn afunc() void { }
7
8// error
9// backend=stage1
10// target=native
11//
12// tmp.zig:4:32: error: expected async function, found 'fn() void'
test/cases/compile_errors/async/prevent_bad_implicit_casting_of_anyframe_types.zig created+24
......@@ -0,0 +1,24 @@
1export fn a() void {
2 var x: anyframe = undefined;
3 var y: anyframe->i32 = x;
4 _ = y;
5}
6export fn b() void {
7 var x: i32 = undefined;
8 var y: anyframe->i32 = x;
9 _ = y;
10}
11export fn c() void {
12 var x: @Frame(func) = undefined;
13 var y: anyframe->i32 = &x;
14 _ = y;
15}
16fn func() void {}
17
18// error
19// backend=stage1
20// target=native
21//
22// :3:28: error: expected type 'anyframe->i32', found 'anyframe'
23// :8:28: error: expected type 'anyframe->i32', found 'i32'
24// tmp.zig:13:29: error: expected type 'anyframe->i32', found '*@Frame(func)'
\ No newline at end of file
test/cases/compile_errors/async/returning_error_from_void_async_function.zig created+12
......@@ -0,0 +1,12 @@
1export fn entry() void {
2 _ = async amain();
3}
4fn amain() callconv(.Async) void {
5 return error.ShouldBeCompileError;
6}
7
8// error
9// backend=stage1
10// target=native
11//
12// tmp.zig:5:17: error: expected type 'void', found 'error{ShouldBeCompileError}'
test/cases/compile_errors/async/runtime-known_async_function_called.zig created+14
......@@ -0,0 +1,14 @@
1export fn entry() void {
2 _ = async amain();
3}
4fn amain() void {
5 var ptr = afunc;
6 _ = ptr();
7}
8fn afunc() callconv(.Async) void {}
9
10// error
11// backend=stage1
12// target=native
13//
14// tmp.zig:6:12: error: function is not comptime-known; @asyncCall required
test/cases/compile_errors/async/runtime-known_function_called_with_async_keyword.zig created+12
......@@ -0,0 +1,12 @@
1export fn entry() void {
2 var ptr = afunc;
3 _ = async ptr();
4}
5
6fn afunc() callconv(.Async) void { }
7
8// error
9// backend=stage1
10// target=native
11//
12// tmp.zig:3:15: error: function is not comptime-known; @asyncCall required
test/cases/compile_errors/async/wrong_frame_type_used_for_async_call.zig created+16
......@@ -0,0 +1,16 @@
1export fn entry() void {
2 var frame: @Frame(foo) = undefined;
3 frame = async bar();
4}
5fn foo() void {
6 suspend {}
7}
8fn bar() void {
9 suspend {}
10}
11
12// error
13// backend=stage1
14// target=native
15//
16// tmp.zig:3:13: error: expected type '*@Frame(bar)', found '*@Frame(foo)'
test/cases/compile_errors/async/wrong_type_for_argument_tuple_to_asyncCall.zig created+14
......@@ -0,0 +1,14 @@
1export fn entry1() void {
2 var frame: @Frame(foo) = undefined;
3 @asyncCall(&frame, {}, foo, {});
4}
5
6fn foo() i32 {
7 return 0;
8}
9
10// error
11// backend=stage1
12// target=native
13//
14// tmp.zig:3:33: error: expected tuple or struct, found 'void'
test/cases/compile_errors/async/wrong_type_for_result_ptr_to_asyncCall.zig created+16
......@@ -0,0 +1,16 @@
1export fn entry() void {
2 _ = async amain();
3}
4fn amain() i32 {
5 var frame: @Frame(foo) = undefined;
6 return await @asyncCall(&frame, false, foo, .{});
7}
8fn foo() i32 {
9 return 1234;
10}
11
12// error
13// backend=stage1
14// target=native
15//
16// tmp.zig:6:37: error: expected type '*i32', found 'bool'
test/cases/compile_errors/bad_alignment_in_implicit_cast_from_array_pointer_to_slice.zig created+12
......@@ -0,0 +1,12 @@
1export fn a() void {
2 var x: [10]u8 = undefined;
3 var y: []align(16) u8 = &x;
4 _ = y;
5}
6
7// error
8// backend=stage2
9// target=native
10//
11// :3:29: error: expected type '[]align(16) u8', found '*[10]u8'
12// :3:29: note: pointer alignment '1' cannot cast into pointer alignment '16'
test/cases/compile_errors/bad_alignment_type.zig created+15
......@@ -0,0 +1,15 @@
1export fn entry1() void {
2 var x: []align(true) i32 = undefined;
3 _ = x;
4}
5export fn entry2() void {
6 var x: *align(@as(f64, 12.34)) i32 = undefined;
7 _ = x;
8}
9
10// error
11// backend=stage2
12// target=native
13//
14// :2:20: error: expected type 'u32', found 'bool'
15// :6:19: error: fractional component prevents float value '12.34' from coercion to type 'u32'
test/cases/compile_errors/cImport_with_bogus_include.zig created+9
......@@ -0,0 +1,9 @@
1const c = @cImport(@cInclude("bogus.h"));
2export fn entry() usize { return @sizeOf(@TypeOf(c.bogo)); }
3
4// error
5// backend=llvm
6// target=native
7//
8// :1:11: error: C import failed
9// :1:10: error: 'bogus.h' file not found
test/cases/compile_errors/compare_optional_to_non-optional_with_invalid_types.zig created+37
......@@ -0,0 +1,37 @@
1export fn inconsistentChildType() void {
2 var x: ?i32 = undefined;
3 const y: comptime_int = 10;
4 _ = (x == y);
5}
6export fn optionalToOptional() void {
7 var x: ?i32 = undefined;
8 var y: ?i32 = undefined;
9 _ = (x == y);
10}
11export fn optionalVector() void {
12 var x: ?@Vector(10, i32) = undefined;
13 var y: @Vector(10, i32) = undefined;
14 _ = (x == y);
15}
16export fn optionalVector2() void {
17 var x: ?@Vector(10, i32) = undefined;
18 var y: @Vector(11, i32) = undefined;
19 _ = (x == y);
20}
21export fn invalidChildType() void {
22 var x: ?[3]i32 = undefined;
23 var y: [3]i32 = undefined;
24 _ = (x == y);
25}
26
27// error
28// backend=llvm
29// target=native
30//
31// :4:12: error: incompatible types: '?i32' and 'comptime_int'
32// :4:10: note: type '?i32' here
33// :4:15: note: type 'comptime_int' here
34// :19:12: error: incompatible types: '?@Vector(10, i32)' and '@Vector(11, i32)'
35// :19:10: note: type '?@Vector(10, i32)' here
36// :19:15: note: type '@Vector(11, i32)' here
37// :24:12: error: operator == not allowed for type '?[3]i32'
test/cases/compile_errors/comptime_implicit_cast_f64_to_f32.zig created+11
......@@ -0,0 +1,11 @@
1export fn entry() void {
2 const x: f64 = 16777217;
3 const y: f32 = x;
4 _ = y;
5}
6
7// error
8// backend=stage2
9// target=native
10//
11// :3:20: error: type 'f32' cannot represent float value '16777217'
test/cases/compile_errors/comptime_unreachable.zig created+9
......@@ -0,0 +1,9 @@
1pub export fn entry() void {
2 comptime unreachable;
3}
4
5// error
6// target=native
7// backend=stage2
8//
9// :2:14: error: reached unreachable code
test/cases/compile_errors/constant_inside_comptime_function_has_compile_error.zig created+21
......@@ -0,0 +1,21 @@
1const ContextAllocator = MemoryPool(usize);
2
3pub fn MemoryPool(comptime T: type) type {
4 const free_list_t = @compileError("aoeu",);
5 _ = T;
6
7 return struct {
8 free_list: free_list_t,
9 };
10}
11
12export fn entry() void {
13 var allocator: ContextAllocator = undefined;
14 _ = allocator;
15}
16
17// error
18// target=native
19//
20// :4:5: error: unreachable code
21// :4:25: note: control flow is diverted here
test/cases/compile_errors/duplicate-unused_labels.zig created+31
......@@ -0,0 +1,31 @@
1comptime {
2 blk: { blk: while (false) {} }
3}
4comptime {
5 blk: while (false) { blk: for (@as([0]void, undefined)) |_| {} }
6}
7comptime {
8 blk: for (@as([0]void, undefined)) |_| { blk: {} }
9}
10comptime {
11 blk: {}
12}
13comptime {
14 blk: while(false) {}
15}
16comptime {
17 blk: for(@as([0]void, undefined)) |_| {}
18}
19
20// error
21// target=native
22//
23// :2:12: error: redefinition of label 'blk'
24// :2:5: note: previous definition here
25// :5:26: error: redefinition of label 'blk'
26// :5:5: note: previous definition here
27// :8:46: error: redefinition of label 'blk'
28// :8:5: note: previous definition here
29// :11:5: error: unused block label
30// :14:5: error: unused while loop label
31// :17:5: error: unused for loop label
test/cases/compile_errors/embed_outside_package.zig created+8
......@@ -0,0 +1,8 @@
1export fn a() usize {
2 return @embedFile("/root/foo").len;
3}
4
5// error
6// target=native
7//
8//:2:23: error: embed of file outside package path: '/root/foo'
test/cases/compile_errors/error_when_evaluating_return_type.zig created+17
......@@ -0,0 +1,17 @@
1const Foo = struct {
2 map: @as(i32, i32),
3
4 fn init() Foo {
5 return undefined;
6 }
7};
8export fn entry() void {
9 var rule_set = try Foo.init();
10 _ = rule_set;
11}
12
13// error
14// backend=stage2
15// target=native
16//
17// :2:19: error: expected type 'i32', found 'type'
test/cases/compile_errors/extern_function_pointer_mismatch.zig created+13
......@@ -0,0 +1,13 @@
1const fns = [_](fn(i32)i32) { a, b, c };
2pub fn a(x: i32) i32 {return x + 0;}
3pub fn b(x: i32) i32 {return x + 1;}
4export fn c(x: i32) i32 {return x + 2;}
5
6export fn entry() usize { return @sizeOf(@TypeOf(fns)); }
7
8// error
9// backend=stage2
10// target=native
11//
12// :1:37: error: expected type 'fn(i32) i32', found 'fn(i32) callconv(.C) i32'
13// :1:37: note: calling convention 'C' cannot cast into calling convention 'Unspecified'
test/cases/compile_errors/floatToInt_comptime_safety.zig created+17
......@@ -0,0 +1,17 @@
1comptime {
2 _ = @floatToInt(i8, @as(f32, -129.1));
3}
4comptime {
5 _ = @floatToInt(u8, @as(f32, -1.1));
6}
7comptime {
8 _ = @floatToInt(u8, @as(f32, 256.1));
9}
10
11// error
12// backend=stage2
13// target=native
14//
15// :2:25: error: float value '-129.10000610351562' cannot be stored in integer type 'i8'
16// :5:25: error: float value '-1.100000023841858' cannot be stored in integer type 'u8'
17// :8:25: error: float value '256.1000061035156' cannot be stored in integer type 'u8'
test/cases/compile_errors/implicit_casting_null_c_pointer_to_zig_pointer.zig created+11
......@@ -0,0 +1,11 @@
1comptime {
2 var c_ptr: [*c]u8 = 0;
3 var zig_ptr: *u8 = c_ptr;
4 _ = zig_ptr;
5}
6
7// error
8// backend=stage2
9// target=native
10//
11// :3:24: error: null pointer casted to type '*u8'
test/cases/compile_errors/implicit_dependency_on_libc.zig created+10
......@@ -0,0 +1,10 @@
1extern "c" fn exit(u8) void;
2export fn entry() void {
3 exit(0);
4}
5
6// error
7// backend=stage2
8// target=native-linux
9//
10// :1:8: error: dependency on libc must be explicitly specified in the build command
test/cases/compile_errors/import_outside_package.zig created+8
......@@ -0,0 +1,8 @@
1export fn a() usize {
2 return @import("../../above.zig").len;
3}
4
5// error
6// target=native
7//
8// :2:20: error: import of file outside package path: '../../above.zig'
test/cases/compile_errors/indexing_a_undefined_slice_at_comptime.zig created+10
......@@ -0,0 +1,10 @@
1comptime {
2 var slice: []u8 = undefined;
3 slice[0] = 2;
4}
5
6// error
7// backend=stage2
8// target=native
9//
10// :3:10: error: use of undefined value here causes undefined behavior
test/cases/compile_errors/integer_cast_truncates_bits.zig created+31
......@@ -0,0 +1,31 @@
1export fn entry1() void {
2 const spartan_count: u16 = 300;
3 const byte = @intCast(u8, spartan_count);
4 _ = byte;
5}
6export fn entry2() void {
7 const spartan_count: u16 = 300;
8 const byte: u8 = spartan_count;
9 _ = byte;
10}
11export fn entry3() void {
12 var spartan_count: u16 = 300;
13 var byte: u8 = spartan_count;
14 _ = byte;
15}
16export fn entry4() void {
17 var signed: i8 = -1;
18 var unsigned: u64 = signed;
19 _ = unsigned;
20}
21
22// error
23// backend=stage2
24// target=native
25//
26// :3:31: error: type 'u8' cannot represent integer value '300'
27// :8:22: error: type 'u8' cannot represent integer value '300'
28// :13:20: error: expected type 'u8', found 'u16'
29// :13:20: note: unsigned 8-bit int cannot represent all possible unsigned 16-bit values
30// :18:25: error: expected type 'u64', found 'i8'
31// :18:25: note: unsigned 64-bit int cannot represent all possible signed 8-bit values
test/cases/compile_errors/issue_4207_coerce_from_non-terminated-slice_to_terminated-pointer.zig created+12
......@@ -0,0 +1,12 @@
1export fn foo() [*:0]const u8 {
2 var buffer: [64]u8 = undefined;
3 return buffer[0..];
4}
5
6// error
7// backend=stage2
8// target=native
9//
10// :3:18: error: expected type '[*:0]const u8', found '*[64]u8'
11// :3:18: note: destination pointer requires '0' sentinel
12// :1:18: note: function return type declared here
test/cases/compile_errors/issue_7810-comptime_slice-len_increment_beyond_bounds.zig created+14
......@@ -0,0 +1,14 @@
1export fn foo_slice_len_increment_beyond_bounds() void {
2 comptime {
3 var buf_storage: [8]u8 = undefined;
4 var buf: []u8 = buf_storage[0..];
5 buf.len += 1;
6 buf[8] = 42;
7 }
8}
9
10// error
11// backend=stage2
12// target=native
13//
14// :6:16: error: comptime store of index 8 out of bounds of array length 8
test/cases/compile_errors/lazy_pointer_with_undefined_element_type.zig created+12
......@@ -0,0 +1,12 @@
1export fn foo() void {
2 comptime var T: type = undefined;
3 const S = struct { x: *T };
4 const I = @typeInfo(S);
5 _ = I;
6}
7
8// error
9// backend=stage2
10// target=native
11//
12// :3:28: error: use of undefined value here causes undefined behavior
test/cases/compile_errors/missing_main_fn_in_executable.zig created+9
......@@ -0,0 +1,9 @@
1
2
3// error
4// backend=llvm
5// target=x86_64-linux
6// output_mode=Exe
7//
8// :?:?: error: root struct of file 'tmp' has no member named 'main'
9// :?:?: note: called from here
test/cases/compile_errors/missing_result_type_for_phi_node.zig created+12
......@@ -0,0 +1,12 @@
1fn foo() !void {
2 return anyerror.Foo;
3}
4export fn entry() void {
5 foo() catch 0;
6}
7
8// error
9// backend=stage2
10// target=native
11//
12// :5:11: error: incompatible types: 'void' and 'comptime_int'
test/cases/compile_errors/noalias_on_non_pointer_param.zig created+8
......@@ -0,0 +1,8 @@
1fn f(noalias x: i32) void { _ = x; }
2export fn entry() void { f(1234); }
3
4// error
5// backend=stage2
6// target=native
7//
8// :1:6: error: non-pointer parameter declared noalias
test/cases/compile_errors/out_of_bounds_index.zig created+29
......@@ -0,0 +1,29 @@
1comptime {
2 var array = [_:0]u8{ 1, 2, 3, 4 };
3 var src_slice: [:0]u8 = &array;
4 var slice = src_slice[2..6];
5 _ = slice;
6}
7comptime {
8 var array = [_:0]u8{ 1, 2, 3, 4 };
9 var slice = array[2..6];
10 _ = slice;
11}
12comptime {
13 var array = [_]u8{ 1, 2, 3, 4 };
14 var slice = array[2..5];
15 _ = slice;
16}
17comptime {
18 var array = [_:0]u8{ 1, 2, 3, 4 };
19 var slice = array[3..2];
20 _ = slice;
21}
22
23// error
24// target=native
25//
26// :4:30: error: end index 6 out of bounds for slice of length 4 +1 (sentinel)
27// :9:26: error: end index 6 out of bounds for array of length 4 +1 (sentinel)
28// :14:26: error: end index 5 out of bounds for array of length 4
29// :19:23: error: start index 3 is larger than end index 2
test/cases/compile_errors/passing_an_under-aligned_function_pointer.zig created+14
......@@ -0,0 +1,14 @@
1export fn entry() void {
2 testImplicitlyDecreaseFnAlign(alignedSmall, 1234);
3}
4fn testImplicitlyDecreaseFnAlign(ptr: *const fn () align(8) i32, answer: i32) void {
5 if (ptr() != answer) unreachable;
6}
7fn alignedSmall() align(4) i32 { return 1234; }
8
9// error
10// backend=stage2
11// target=x86_64-linux
12//
13// :2:35: error: expected type '*const fn() align(8) i32', found '*const fn() align(4) i32'
14// :2:35: note: pointer alignment '4' cannot cast into pointer alignment '8'
test/cases/compile_errors/private_main_fn.zig created+10
......@@ -0,0 +1,10 @@
1fn main() void {}
2
3// error
4// backend=llvm
5// target=x86_64-linux
6// output_mode=Exe
7//
8// :?:?: error: 'main' is not marked 'pub'
9// :1:1: note: declared here
10// :?:?: note: called from here
test/cases/compile_errors/reified_enum_field_value_overflow.zig created+20
......@@ -0,0 +1,20 @@
1comptime {
2 const E = @Type(.{ .Enum = .{
3 .layout = .Auto,
4 .tag_type = u1,
5 .fields = &.{
6 .{ .name = "f0", .value = 0 },
7 .{ .name = "f1", .value = 1 },
8 .{ .name = "f2", .value = 2 },
9 },
10 .decls = &.{},
11 .is_exhaustive = true,
12 } });
13 _ = E;
14}
15
16// error
17// target=native
18// backend=stage2
19//
20// :2:15: error: field 'f2' with enumeration value '2' is too large for backing int type 'u1'
test/cases/compile_errors/reify_type_for_union_with_opaque_field.zig created+20
......@@ -0,0 +1,20 @@
1const Untagged = @Type(.{
2 .Union = .{
3 .layout = .Auto,
4 .tag_type = null,
5 .fields = &.{
6 .{ .name = "foo", .field_type = opaque {}, .alignment = 1 },
7 },
8 .decls = &.{},
9 },
10});
11export fn entry() usize {
12 return @sizeOf(Untagged);
13}
14
15// error
16// backend=stage2
17// target=native
18//
19// :1:18: error: opaque types have unknown size and therefore cannot be directly embedded in unions
20// :6:45: note: opaque declared here
test/cases/compile_errors/runtime_assignment_to_comptime_struct_type.zig created+16
......@@ -0,0 +1,16 @@
1const Foo = struct {
2 Bar: u8,
3 Baz: type,
4};
5export fn f() void {
6 var x: u8 = 0;
7 const foo = Foo { .Bar = x, .Baz = u8 };
8 _ = foo;
9}
10
11// error
12// backend=stage2
13// target=native
14//
15// :7:30: error: unable to resolve comptime value
16// :7:30: note: initializer of comptime only struct must be comptime-known
test/cases/compile_errors/runtime_assignment_to_comptime_union_type.zig created+16
......@@ -0,0 +1,16 @@
1const Foo = union {
2 Bar: u8,
3 Baz: type,
4};
5export fn f() void {
6 var x: u8 = 0;
7 const foo = Foo { .Bar = x };
8 _ = foo;
9}
10
11// error
12// backend=stage2
13// target=native
14//
15// :7:30: error: unable to resolve comptime value
16// :7:30: note: initializer of comptime only union must be comptime-known
test/cases/compile_errors/saturating_shl_assign_does_not_allow_negative_rhs_at_comptime.zig created+12
......@@ -0,0 +1,12 @@
1export fn a() void {
2 comptime {
3 var x = @as(i32, 1);
4 x <<|= @as(i32, -2);
5 }
6}
7
8// error
9// backend=stage2
10// target=native
11//
12// :4:14: error: shift by negative amount '-2'
test/cases/compile_errors/saturating_shl_does_not_allow_negative_rhs_at_comptime.zig created+9
......@@ -0,0 +1,9 @@
1export fn a() void {
2 _ = @as(i32, 1) <<| @as(i32, -2);
3}
4
5// error
6// backend=stage2
7// target=native
8//
9// :2:25: error: shift by negative amount '-2'
test/cases/compile_errors/shift_amount_has_to_be_an_integer_type.zig created+10
......@@ -0,0 +1,10 @@
1export fn entry() void {
2 const x = 1 << &@as(u8, 10);
3 _ = x;
4}
5
6// error
7// backend=stage2
8// target=native
9//
10// :2:20: error: expected type 'comptime_int', found '*const u8'
test/cases/compile_errors/shift_by_negative_comptime_integer.zig created+10
......@@ -0,0 +1,10 @@
1comptime {
2 var a = 1 >> -1;
3 _ = a;
4}
5
6// error
7// backend=stage2
8// target=native
9//
10// :2:18: error: shift by negative amount '-1'
test/cases/compile_errors/slice_of_null_pointer.zig created+11
......@@ -0,0 +1,11 @@
1comptime {
2 var x: [*c]u8 = null;
3 var runtime_len: usize = 0;
4 var y = x[0..runtime_len];
5 _ = y;
6}
7
8// error
9// target=native
10//
11// :4:14: error: slice of null pointer
test/cases/compile_errors/slice_sentinel_mismatch-1.zig created+11
......@@ -0,0 +1,11 @@
1export fn entry() void {
2 const y: [:1]const u8 = &[_:2]u8{ 1, 2 };
3 _ = y;
4}
5
6// error
7// backend=stage2
8// target=native
9//
10// :2:29: error: expected type '[:1]const u8', found '*const [2:2]u8'
11// :2:29: note: pointer sentinel '2' cannot cast into pointer sentinel '1'
test/cases/compile_errors/stage1/exe/missing_main_fn_in_executable.zig deleted-8
......@@ -1,8 +0,0 @@
1
2
3// error
4// backend=stage1
5// target=native
6// output_mode=Exe
7//
8// error: root source file has no member called 'main'
test/cases/compile_errors/stage1/exe/private_main_fn.zig deleted-9
......@@ -1,9 +0,0 @@
1fn main() void {}
2
3// error
4// backend=stage1
5// target=native
6// output_mode=Exe
7//
8// error: 'main' is private
9// tmp.zig:1:1: note: declared here
test/cases/compile_errors/stage1/obj/Frame_of_generic_function.zig deleted-14
......@@ -1,14 +0,0 @@
1export fn entry() void {
2 var frame: @Frame(func) = undefined;
3 _ = frame;
4}
5fn func(comptime T: type) void {
6 var x: T = undefined;
7 _ = x;
8}
9
10// error
11// backend=stage1
12// target=native
13//
14// tmp.zig:2:16: error: @Frame() of generic function
test/cases/compile_errors/stage1/obj/Issue_9165_windows_tcp_server_compilation_error.zig deleted-16
......@@ -1,16 +0,0 @@
1const std = @import("std");
2const builtin = @import("builtin");
3pub const io_mode = .evented;
4pub fn main() !void {
5 if (builtin.os.tag == .windows) {
6 _ = try (std.net.StreamServer.init(.{})).accept();
7 } else {
8 @compileError("Unsupported OS");
9 }
10}
11
12// error
13// backend=stage1
14// target=native
15//
16// error: Unsupported OS
test/cases/compile_errors/stage1/obj/async_function_depends_on_its_own_frame.zig deleted-13
......@@ -1,13 +0,0 @@
1export fn entry() void {
2 _ = async amain();
3}
4fn amain() callconv(.Async) void {
5 var x: [@sizeOf(@Frame(amain))]u8 = undefined;
6 _ = x;
7}
8
9// error
10// backend=stage1
11// target=native
12//
13// tmp.zig:4:1: error: cannot resolve '@Frame(amain)': function not fully analyzed yet
test/cases/compile_errors/stage1/obj/async_function_indirectly_depends_on_its_own_frame.zig deleted-17
......@@ -1,17 +0,0 @@
1export fn entry() void {
2 _ = async amain();
3}
4fn amain() callconv(.Async) void {
5 other();
6}
7fn other() void {
8 var x: [@sizeOf(@Frame(amain))]u8 = undefined;
9 _ = x;
10}
11
12// error
13// backend=stage1
14// target=native
15//
16// tmp.zig:4:1: error: unable to determine async function frame of 'amain'
17// tmp.zig:5:10: note: analysis of function 'other' depends on the frame
test/cases/compile_errors/stage1/obj/bad_alignment_in_asynccall.zig deleted-12
......@@ -1,12 +0,0 @@
1export fn entry() void {
2 var ptr: fn () callconv(.Async) void = func;
3 var bytes: [64]u8 = undefined;
4 _ = @asyncCall(&bytes, {}, ptr, .{});
5}
6fn func() callconv(.Async) void {}
7
8// error
9// backend=stage1
10// target=aarch64-linux-none
11//
12// tmp.zig:4:21: error: expected type '[]align(8) u8', found '*[64]u8'
test/cases/compile_errors/stage1/obj/bad_alignment_in_implicit_cast_from_array_pointer_to_slice.zig deleted-11
......@@ -1,11 +0,0 @@
1export fn a() void {
2 var x: [10]u8 = undefined;
3 var y: []align(16) u8 = &x;
4 _ = y;
5}
6
7// error
8// backend=stage1
9// target=native
10//
11// tmp.zig:3:30: error: expected type '[]align(16) u8', found '*[10]u8'
test/cases/compile_errors/stage1/obj/bad_alignment_type.zig deleted-15
......@@ -1,15 +0,0 @@
1export fn entry1() void {
2 var x: []align(true) i32 = undefined;
3 _ = x;
4}
5export fn entry2() void {
6 var x: *align(@as(f64, 12.34)) i32 = undefined;
7 _ = x;
8}
9
10// error
11// backend=stage1
12// target=native
13//
14// tmp.zig:2:20: error: expected type 'u29', found 'bool'
15// tmp.zig:6:19: error: fractional component prevents float value 12.340000 from being casted to type 'u29'
test/cases/compile_errors/stage1/obj/cImport_with_bogus_include.zig deleted-9
......@@ -1,9 +0,0 @@
1const c = @cImport(@cInclude("bogus.h"));
2export fn entry() usize { return @sizeOf(@TypeOf(c.bogo)); }
3
4// error
5// backend=stage1
6// target=native
7//
8// tmp.zig:1:11: error: C import failed
9// .h:1:10: note: 'bogus.h' file not found
test/cases/compile_errors/stage1/obj/calling_a_generic_function_only_known_at_runtime.zig deleted-14
......@@ -1,14 +0,0 @@
1var foos = [_]fn(anytype) void { foo1, foo2 };
2
3fn foo1(arg: anytype) void {_ = arg;}
4fn foo2(arg: anytype) void {_ = arg;}
5
6pub fn main() !void {
7 foos[0](true);
8}
9
10// error
11// backend=stage1
12// target=native
13//
14// tmp.zig:7:9: error: calling a generic function requires compile-time known function value
test/cases/compile_errors/stage1/obj/compare_optional_to_non-optional_with_invalid_types.zig deleted-35
......@@ -1,35 +0,0 @@
1export fn inconsistentChildType() void {
2 var x: ?i32 = undefined;
3 const y: comptime_int = 10;
4 _ = (x == y);
5}
6
7export fn optionalToOptional() void {
8 var x: ?i32 = undefined;
9 var y: ?i32 = undefined;
10 _ = (x == y);
11}
12
13export fn optionalVector() void {
14 var x: ?@Vector(10, i32) = undefined;
15 var y: @Vector(10, i32) = undefined;
16 _ = (x == y);
17}
18
19export fn invalidChildType() void {
20 var x: ?[3]i32 = undefined;
21 var y: [3]i32 = undefined;
22 _ = (x == y);
23}
24
25// error
26// backend=stage1
27// target=native
28//
29// :4:12: error: cannot compare types '?i32' and 'comptime_int'
30// :4:12: note: optional child type 'i32' must be the same as non-optional type 'comptime_int'
31// :10:12: error: cannot compare types '?i32' and '?i32'
32// :10:12: note: optional to optional comparison is only supported for optional pointer types
33// :16:12: error: TODO add comparison of optional vector
34// :22:12: error: cannot compare types '?[3]i32' and '[3]i32'
35// :22:12: note: operator not supported for type '[3]i32'
test/cases/compile_errors/stage1/obj/comptime_float_in_asm_input.zig deleted-9
......@@ -1,9 +0,0 @@
1export fn foo() void {
2 asm volatile ("" : : [bar]"r"(3.17) : "");
3}
4
5// error
6// backend=stage1
7// target=native
8//
9// tmp.zig:2:35: error: expected sized integer or sized float, found comptime_float
test/cases/compile_errors/stage1/obj/comptime_implicit_cast_f64_to_f32.zig deleted-11
......@@ -1,11 +0,0 @@
1export fn entry() void {
2 const x: f64 = 16777217;
3 const y: f32 = x;
4 _ = y;
5}
6
7// error
8// backend=stage1
9// target=native
10//
11// tmp.zig:3:20: error: cast of value 16777217.000000 to type 'f32' loses information
test/cases/compile_errors/stage1/obj/comptime_int_in_asm_input.zig deleted-9
......@@ -1,9 +0,0 @@
1export fn foo() void {
2 asm volatile ("" : : [bar]"r"(3) : "");
3}
4
5// error
6// backend=stage1
7// target=native
8//
9// tmp.zig:2:35: error: expected sized integer or sized float, found comptime_int
test/cases/compile_errors/stage1/obj/const_frame_cast_to_anyframe.zig deleted-19
......@@ -1,19 +0,0 @@
1export fn a() void {
2 const f = async func();
3 resume f;
4}
5export fn b() void {
6 const f = async func();
7 var x: anyframe = &f;
8 _ = x;
9}
10fn func() void {
11 suspend {}
12}
13
14// error
15// backend=stage1
16// target=native
17//
18// tmp.zig:3:12: error: expected type 'anyframe', found '*const @Frame(func)'
19// tmp.zig:7:24: error: expected type 'anyframe', found '*const @Frame(func)'
test/cases/compile_errors/stage1/obj/double_optional_on_main_return_value.zig deleted-8
......@@ -1,8 +0,0 @@
1pub fn main() ??void {
2}
3
4// error
5// backend=stage1
6// target=native
7//
8// error: expected return type of main to be 'void', '!void', 'noreturn', 'u8', or '!u8'
test/cases/compile_errors/stage1/obj/error_when_evaluating_return_type.zig deleted-17
......@@ -1,17 +0,0 @@
1const Foo = struct {
2 map: @as(i32, i32),
3
4 fn init() Foo {
5 return undefined;
6 }
7};
8export fn entry() void {
9 var rule_set = try Foo.init();
10 _ = rule_set;
11}
12
13// error
14// backend=stage1
15// target=native
16//
17// tmp.zig:2:19: error: expected type 'i32', found 'type'
test/cases/compile_errors/stage1/obj/exported_async_function.zig deleted-7
......@@ -1,7 +0,0 @@
1export fn foo() callconv(.Async) void {}
2
3// error
4// backend=stage1
5// target=native
6//
7// tmp.zig:1:1: error: exported function cannot be async
test/cases/compile_errors/stage1/obj/extern_function_pointer_mismatch.zig deleted-12
......@@ -1,12 +0,0 @@
1const fns = [_](fn(i32)i32) { a, b, c };
2pub fn a(x: i32) i32 {return x + 0;}
3pub fn b(x: i32) i32 {return x + 1;}
4export fn c(x: i32) i32 {return x + 2;}
5
6export fn entry() usize { return @sizeOf(@TypeOf(fns)); }
7
8// error
9// backend=stage1
10// target=native
11//
12// tmp.zig:1:37: error: expected type 'fn(i32) i32', found 'fn(i32) callconv(.C) i32'
test/cases/compile_errors/stage1/obj/floatToInt_comptime_safety.zig deleted-17
......@@ -1,17 +0,0 @@
1comptime {
2 _ = @floatToInt(i8, @as(f32, -129.1));
3}
4comptime {
5 _ = @floatToInt(u8, @as(f32, -1.1));
6}
7comptime {
8 _ = @floatToInt(u8, @as(f32, 256.1));
9}
10
11// error
12// backend=stage1
13// target=native
14//
15// tmp.zig:2:9: error: integer value '-129' cannot be stored in type 'i8'
16// tmp.zig:5:9: error: integer value '-1' cannot be stored in type 'u8'
17// tmp.zig:8:9: error: integer value '256' cannot be stored in type 'u8'
test/cases/compile_errors/stage1/obj/float_literal_too_large_error.zig deleted-10
......@@ -1,10 +0,0 @@
1comptime {
2 const a = 0x1.0p18495;
3 _ = a;
4}
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:2:15: error: float literal out of range of any type
test/cases/compile_errors/stage1/obj/float_literal_too_small_error_denormal.zig deleted-10
......@@ -1,10 +0,0 @@
1comptime {
2 const a = 0x1.0p-19000;
3 _ = a;
4}
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:2:15: error: float literal out of range of any type
test/cases/compile_errors/stage1/obj/frame_called_outside_of_function_definition.zig deleted-11
......@@ -1,11 +0,0 @@
1var handle_undef: anyframe = undefined;
2var handle_dummy: anyframe = @frame();
3export fn entry() bool {
4 return handle_undef == handle_dummy;
5}
6
7// error
8// backend=stage1
9// target=native
10//
11// tmp.zig:2:30: error: @frame() called outside of function definition
test/cases/compile_errors/stage1/obj/frame_causes_function_to_be_async.zig deleted-13
......@@ -1,13 +0,0 @@
1export fn entry() void {
2 func();
3}
4fn func() void {
5 _ = @frame();
6}
7
8// error
9// backend=stage1
10// target=native
11//
12// tmp.zig:1:1: error: function with calling convention 'C' cannot be async
13// tmp.zig:5:9: note: @frame() causes function to be async
test/cases/compile_errors/stage1/obj/function_with_ccc_indirectly_calling_async_function.zig deleted-18
......@@ -1,18 +0,0 @@
1export fn entry() void {
2 foo();
3}
4fn foo() void {
5 bar();
6}
7fn bar() void {
8 suspend {}
9}
10
11// error
12// backend=stage1
13// target=native
14//
15// tmp.zig:1:1: error: function with calling convention 'C' cannot be async
16// tmp.zig:2:8: note: async function call here
17// tmp.zig:5:8: note: async function call here
18// tmp.zig:8:5: note: suspends here
test/cases/compile_errors/stage1/obj/implicit_casting_null_c_pointer_to_zig_pointer.zig deleted-11
......@@ -1,11 +0,0 @@
1comptime {
2 var c_ptr: [*c]u8 = 0;
3 var zig_ptr: *u8 = c_ptr;
4 _ = zig_ptr;
5}
6
7// error
8// backend=stage1
9// target=native
10//
11// tmp.zig:3:24: error: null pointer casted to type '*u8'
test/cases/compile_errors/stage1/obj/implicit_casting_too_big_integers_to_C_pointers.zig deleted-16
......@@ -1,16 +0,0 @@
1export fn a() void {
2 var ptr: [*c]u8 = (1 << 64) + 1;
3 _ = ptr;
4}
5export fn b() void {
6 var x: u65 = 0x1234;
7 var ptr: [*c]u8 = x;
8 _ = ptr;
9}
10
11// error
12// backend=stage1
13// target=native
14//
15// tmp.zig:2:33: error: integer value 18446744073709551617 cannot be coerced to type 'usize'
16// tmp.zig:7:23: error: integer type 'u65' too big for implicit @intToPtr to type '[*c]u8'
test/cases/compile_errors/stage1/obj/implicit_dependency_on_libc.zig deleted-11
......@@ -1,11 +0,0 @@
1extern "c" fn exit(u8) void;
2export fn entry() void {
3 exit(0);
4}
5
6// error
7// backend=stage1
8// target=native-linux
9// is_test=1
10//
11// tmp.zig:3:5: error: dependency on libc must be explicitly specified in the build command
test/cases/compile_errors/stage1/obj/indexing_a_undefined_slice_at_comptime.zig deleted-10
......@@ -1,10 +0,0 @@
1comptime {
2 var slice: []u8 = undefined;
3 slice[0] = 2;
4}
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:3:10: error: index 0 outside slice of size 0
test/cases/compile_errors/stage1/obj/indirect_recursion_of_async_functions_detected.zig deleted-36
......@@ -1,36 +0,0 @@
1var frame: ?anyframe = null;
2
3export fn a() void {
4 _ = async rangeSum(10);
5 while (frame) |f| resume f;
6}
7
8fn rangeSum(x: i32) i32 {
9 suspend {
10 frame = @frame();
11 }
12 frame = null;
13
14 if (x == 0) return 0;
15 var child = rangeSumIndirect(x - 1);
16 return child + 1;
17}
18
19fn rangeSumIndirect(x: i32) i32 {
20 suspend {
21 frame = @frame();
22 }
23 frame = null;
24
25 if (x == 0) return 0;
26 var child = rangeSum(x - 1);
27 return child + 1;
28}
29
30// error
31// backend=stage1
32// target=native
33//
34// tmp.zig:8:1: error: '@Frame(rangeSum)' depends on itself
35// tmp.zig:15:33: note: when analyzing type '@Frame(rangeSum)' here
36// tmp.zig:26:25: note: when analyzing type '@Frame(rangeSumIndirect)' here
test/cases/compile_errors/stage1/obj/integer_cast_truncates_bits.zig deleted-31
......@@ -1,31 +0,0 @@
1export fn entry1() void {
2 const spartan_count: u16 = 300;
3 const byte = @intCast(u8, spartan_count);
4 _ = byte;
5}
6export fn entry2() void {
7 const spartan_count: u16 = 300;
8 const byte: u8 = spartan_count;
9 _ = byte;
10}
11export fn entry3() void {
12 var spartan_count: u16 = 300;
13 var byte: u8 = spartan_count;
14 _ = byte;
15}
16export fn entry4() void {
17 var signed: i8 = -1;
18 var unsigned: u64 = signed;
19 _ = unsigned;
20}
21
22// error
23// backend=stage1
24// target=native
25//
26// tmp.zig:3:18: error: cast from 'u16' to 'u8' truncates bits
27// tmp.zig:8:22: error: integer value 300 cannot be coerced to type 'u8'
28// tmp.zig:13:20: error: expected type 'u8', found 'u16'
29// tmp.zig:13:20: note: unsigned 8-bit int cannot represent all possible unsigned 16-bit values
30// tmp.zig:18:25: error: expected type 'u64', found 'i8'
31// tmp.zig:18:25: note: unsigned 64-bit int cannot represent all possible signed 8-bit values
test/cases/compile_errors/stage1/obj/invalid_suspend_in_exported_function.zig deleted-15
......@@ -1,15 +0,0 @@
1export fn entry() void {
2 var frame = async func();
3 var result = await frame;
4 _ = result;
5}
6fn func() void {
7 suspend {}
8}
9
10// error
11// backend=stage1
12// target=native
13//
14// tmp.zig:1:1: error: function with calling convention 'C' cannot be async
15// tmp.zig:3:18: note: await here is a suspend point
test/cases/compile_errors/stage1/obj/issue_4207_coerce_from_non-terminated-slice_to_terminated-pointer.zig deleted-11
......@@ -1,11 +0,0 @@
1export fn foo() [*:0]const u8 {
2 var buffer: [64]u8 = undefined;
3 return buffer[0..];
4}
5
6// error
7// backend=stage1
8// target=native
9//
10// :3:18: error: expected type '[*:0]const u8', found '*[64]u8'
11// :3:18: note: destination pointer requires a terminating '0' sentinel
test/cases/compile_errors/stage1/obj/issue_7810-comptime_slice-len_increment_beyond_bounds.zig deleted-14
......@@ -1,14 +0,0 @@
1export fn foo_slice_len_increment_beyond_bounds() void {
2 comptime {
3 var buf_storage: [8]u8 = undefined;
4 var buf: []const u8 = buf_storage[0..];
5 buf.len += 1;
6 buf[8] = 42;
7 }
8}
9
10// error
11// backend=stage1
12// target=native
13//
14// :6:12: error: out of bounds slice
test/cases/compile_errors/stage1/obj/lazy_pointer_with_undefined_element_type.zig deleted-12
......@@ -1,12 +0,0 @@
1export fn foo() void {
2 comptime var T: type = undefined;
3 const S = struct { x: *T };
4 const I = @typeInfo(S);
5 _ = I;
6}
7
8// error
9// backend=stage1
10// target=native
11//
12// :3:28: error: use of undefined value here causes undefined behavior
test/cases/compile_errors/stage1/obj/libc_headers_note.zig deleted-12
......@@ -1,12 +0,0 @@
1const c = @cImport(@cInclude("stdio.h"));
2export fn entry() void {
3 _ = c.printf("hello, world!\n");
4}
5
6// error
7// backend=stage1
8// is_test=1
9// target=native-linux
10//
11// tmp.zig:1:11: error: C import failed
12// tmp.zig:1:11: note: libc headers not available; compilation does not link against libc
test/cases/compile_errors/stage1/obj/missing_function_call_param.zig deleted-31
......@@ -1,31 +0,0 @@
1const Foo = struct {
2 a: i32,
3 b: i32,
4
5 fn member_a(foo: *const Foo) i32 {
6 return foo.a;
7 }
8 fn member_b(foo: *const Foo) i32 {
9 return foo.b;
10 }
11};
12
13const member_fn_type = @TypeOf(Foo.member_a);
14const members = [_]member_fn_type {
15 Foo.member_a,
16 Foo.member_b,
17};
18
19fn f(foo: *const Foo, index: usize) void {
20 const result = members[index]();
21 _ = foo;
22 _ = result;
23}
24
25export fn entry() usize { return @sizeOf(@TypeOf(f)); }
26
27// error
28// backend=stage1
29// target=native
30//
31// tmp.zig:20:34: error: expected 1 argument(s), found 0
test/cases/compile_errors/stage1/obj/missing_result_type_for_phi_node.zig deleted-12
......@@ -1,12 +0,0 @@
1fn foo() !void {
2 return anyerror.Foo;
3}
4export fn entry() void {
5 foo() catch 0;
6}
7
8// error
9// backend=stage1
10// target=native
11//
12// tmp.zig:5:17: error: integer value 0 cannot be coerced to type 'void'
test/cases/compile_errors/stage1/obj/noalias_on_non_pointer_param.zig deleted-8
......@@ -1,8 +0,0 @@
1fn f(noalias x: i32) void { _ = x; }
2export fn entry() void { f(1234); }
3
4// error
5// backend=stage1
6// target=native
7//
8// tmp.zig:1:6: error: noalias on non-pointer parameter
test/cases/compile_errors/stage1/obj/non-async_function_pointer_eventually_is_inferred_to_become_async.zig deleted-15
......@@ -1,15 +0,0 @@
1export fn a() void {
2 var non_async_fn: fn () void = undefined;
3 non_async_fn = func;
4}
5fn func() void {
6 suspend {}
7}
8
9// error
10// backend=stage1
11// target=native
12//
13// tmp.zig:5:1: error: 'func' cannot be async
14// tmp.zig:3:20: note: required to be non-async here
15// tmp.zig:6:5: note: suspends here
test/cases/compile_errors/stage1/obj/non_async_function_pointer_passed_to_asyncCall.zig deleted-12
......@@ -1,12 +0,0 @@
1export fn entry() void {
2 var ptr = afunc;
3 var bytes: [100]u8 align(16) = undefined;
4 _ = @asyncCall(&bytes, {}, ptr, .{});
5}
6fn afunc() void { }
7
8// error
9// backend=stage1
10// target=native
11//
12// tmp.zig:4:32: error: expected async function, found 'fn() void'
test/cases/compile_errors/stage1/obj/passing_an_under-aligned_function_pointer.zig deleted-13
......@@ -1,13 +0,0 @@
1export fn entry() void {
2 testImplicitlyDecreaseFnAlign(alignedSmall, 1234);
3}
4fn testImplicitlyDecreaseFnAlign(ptr: fn () align(8) i32, answer: i32) void {
5 if (ptr() != answer) unreachable;
6}
7fn alignedSmall() align(4) i32 { return 1234; }
8
9// error
10// backend=stage1
11// target=native
12//
13// tmp.zig:2:35: error: expected type 'fn() align(8) i32', found 'fn() align(4) i32'
test/cases/compile_errors/stage1/obj/prevent_bad_implicit_casting_of_anyframe_types.zig deleted-24
......@@ -1,24 +0,0 @@
1export fn a() void {
2 var x: anyframe = undefined;
3 var y: anyframe->i32 = x;
4 _ = y;
5}
6export fn b() void {
7 var x: i32 = undefined;
8 var y: anyframe->i32 = x;
9 _ = y;
10}
11export fn c() void {
12 var x: @Frame(func) = undefined;
13 var y: anyframe->i32 = &x;
14 _ = y;
15}
16fn func() void {}
17
18// error
19// backend=stage1
20// target=native
21//
22// :3:28: error: expected type 'anyframe->i32', found 'anyframe'
23// :8:28: error: expected type 'anyframe->i32', found 'i32'
24// tmp.zig:13:29: error: expected type 'anyframe->i32', found '*@Frame(func)'
\ No newline at end of file
test/cases/compile_errors/stage1/obj/reify_type_for_union_with_opaque_field.zig deleted-19
......@@ -1,19 +0,0 @@
1const Untagged = @Type(.{
2 .Union = .{
3 .layout = .Auto,
4 .tag_type = null,
5 .fields = &.{
6 .{ .name = "foo", .field_type = opaque {}, .alignment = 1 },
7 },
8 .decls = &.{},
9 },
10});
11export fn entry() usize {
12 return @sizeOf(Untagged);
13}
14
15// error
16// backend=stage1
17// target=native
18//
19// tmp.zig:1:25: error: opaque types have unknown size and therefore cannot be directly embedded in unions
test/cases/compile_errors/stage1/obj/returning_error_from_void_async_function.zig deleted-12
......@@ -1,12 +0,0 @@
1export fn entry() void {
2 _ = async amain();
3}
4fn amain() callconv(.Async) void {
5 return error.ShouldBeCompileError;
6}
7
8// error
9// backend=stage1
10// target=native
11//
12// tmp.zig:5:17: error: expected type 'void', found 'error{ShouldBeCompileError}'
test/cases/compile_errors/stage1/obj/runtime-known_async_function_called.zig deleted-14
......@@ -1,14 +0,0 @@
1export fn entry() void {
2 _ = async amain();
3}
4fn amain() void {
5 var ptr = afunc;
6 _ = ptr();
7}
8fn afunc() callconv(.Async) void {}
9
10// error
11// backend=stage1
12// target=native
13//
14// tmp.zig:6:12: error: function is not comptime-known; @asyncCall required
test/cases/compile_errors/stage1/obj/runtime-known_function_called_with_async_keyword.zig deleted-12
......@@ -1,12 +0,0 @@
1export fn entry() void {
2 var ptr = afunc;
3 _ = async ptr();
4}
5
6fn afunc() callconv(.Async) void { }
7
8// error
9// backend=stage1
10// target=native
11//
12// tmp.zig:3:15: error: function is not comptime-known; @asyncCall required
test/cases/compile_errors/stage1/obj/runtime_assignment_to_comptime_struct_type.zig deleted-15
......@@ -1,15 +0,0 @@
1const Foo = struct {
2 Bar: u8,
3 Baz: type,
4};
5export fn f() void {
6 var x: u8 = 0;
7 const foo = Foo { .Bar = x, .Baz = u8 };
8 _ = foo;
9}
10
11// error
12// backend=stage1
13// target=native
14//
15// tmp.zig:7:23: error: unable to evaluate constant expression
test/cases/compile_errors/stage1/obj/runtime_assignment_to_comptime_union_type.zig deleted-15
......@@ -1,15 +0,0 @@
1const Foo = union {
2 Bar: u8,
3 Baz: type,
4};
5export fn f() void {
6 var x: u8 = 0;
7 const foo = Foo { .Bar = x };
8 _ = foo;
9}
10
11// error
12// backend=stage1
13// target=native
14//
15// tmp.zig:7:23: error: unable to evaluate constant expression
test/cases/compile_errors/stage1/obj/saturating_shl_assign_does_not_allow_negative_rhs_at_comptime.zig deleted-12
......@@ -1,12 +0,0 @@
1export fn a() void {
2 comptime {
3 var x = @as(i32, 1);
4 x <<|= @as(i32, -2);
5 }
6}
7
8// error
9// backend=stage1
10// target=native
11//
12// error: shift by negative value -2
test/cases/compile_errors/stage1/obj/saturating_shl_does_not_allow_negative_rhs_at_comptime.zig deleted-9
......@@ -1,9 +0,0 @@
1export fn a() void {
2 _ = @as(i32, 1) <<| @as(i32, -2);
3}
4
5// error
6// backend=stage1
7// target=native
8//
9// error: shift by negative value -2
test/cases/compile_errors/stage1/obj/setFloatMode_twice_for_same_scope.zig deleted-11
......@@ -1,11 +0,0 @@
1export fn foo() void {
2 @setFloatMode(@import("std").builtin.FloatMode.Optimized);
3 @setFloatMode(@import("std").builtin.FloatMode.Optimized);
4}
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:3:5: error: float mode set twice for same scope
11// tmp.zig:2:5: note: first set here
test/cases/compile_errors/stage1/obj/setRuntimeSafety_twice_for_same_scope.zig deleted-11
......@@ -1,11 +0,0 @@
1export fn foo() void {
2 @setRuntimeSafety(false);
3 @setRuntimeSafety(false);
4}
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:3:5: error: runtime safety set twice for same scope
11// tmp.zig:2:5: note: first set here
test/cases/compile_errors/stage1/obj/shift_amount_has_to_be_an_integer_type.zig deleted-10
......@@ -1,10 +0,0 @@
1export fn entry() void {
2 const x = 1 << &@as(u8, 10);
3 _ = x;
4}
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:2:21: error: shift amount has to be an integer type, but found '*const u8'
test/cases/compile_errors/stage1/obj/shift_by_negative_comptime_integer.zig deleted-10
......@@ -1,10 +0,0 @@
1comptime {
2 var a = 1 >> -1;
3 _ = a;
4}
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:2:18: error: shift by negative value -1
test/cases/compile_errors/stage1/obj/slice_sentinel_mismatch-1.zig deleted-10
......@@ -1,10 +0,0 @@
1export fn entry() void {
2 const y: [:1]const u8 = &[_:2]u8{ 1, 2 };
3 _ = y;
4}
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:2:37: error: expected type '[:1]const u8', found '*const [2:2]u8'
test/cases/compile_errors/stage1/obj/storing_runtime_value_in_compile_time_variable_then_using_it.zig deleted-49
......@@ -1,49 +0,0 @@
1const Mode = @import("std").builtin.Mode;
2
3fn Free(comptime filename: []const u8) TestCase {
4 return TestCase {
5 .filename = filename,
6 .problem_type = ProblemType.Free,
7 };
8}
9
10fn LibC(comptime filename: []const u8) TestCase {
11 return TestCase {
12 .filename = filename,
13 .problem_type = ProblemType.LinkLibC,
14 };
15}
16
17const TestCase = struct {
18 filename: []const u8,
19 problem_type: ProblemType,
20};
21
22const ProblemType = enum {
23 Free,
24 LinkLibC,
25};
26
27export fn entry() void {
28 const tests = [_]TestCase {
29 Free("001"),
30 Free("002"),
31 LibC("078"),
32 Free("116"),
33 Free("117"),
34 };
35
36 for ([_]Mode { Mode.Debug, Mode.ReleaseSafe, Mode.ReleaseFast }) |mode| {
37 _ = mode;
38 inline for (tests) |test_case| {
39 const foo = test_case.filename ++ ".zig";
40 _ = foo;
41 }
42 }
43}
44
45// error
46// backend=stage1
47// target=native
48//
49// tmp.zig:38:29: error: cannot store runtime value in compile time variable
test/cases/compile_errors/stage1/obj/taking_bit_offset_of_void_field_in_struct.zig deleted-13
......@@ -1,13 +0,0 @@
1const Empty = struct {
2 val: void,
3};
4export fn foo() void {
5 const fieldOffset = @bitOffsetOf(Empty, "val",);
6 _ = fieldOffset;
7}
8
9// error
10// backend=stage1
11// target=native
12//
13// tmp.zig:5:45: error: zero-bit field 'val' in struct 'Empty' has no offset
test/cases/compile_errors/stage1/obj/taking_byte_offset_of_void_field_in_struct.zig deleted-13
......@@ -1,13 +0,0 @@
1const Empty = struct {
2 val: void,
3};
4export fn foo() void {
5 const fieldOffset = @offsetOf(Empty, "val",);
6 _ = fieldOffset;
7}
8
9// error
10// backend=stage1
11// target=native
12//
13// tmp.zig:5:42: error: zero-bit field 'val' in struct 'Empty' has no offset
test/cases/compile_errors/stage1/obj/union_auto-enum_value_already_taken.zig deleted-18
......@@ -1,18 +0,0 @@
1const MultipleChoice = union(enum(u32)) {
2 A = 20,
3 B = 40,
4 C = 60,
5 D = 1000,
6 E = 60,
7};
8export fn entry() void {
9 var x = MultipleChoice { .C = {} };
10 _ = x;
11}
12
13// error
14// backend=stage1
15// target=native
16//
17// tmp.zig:6:9: error: enum tag value 60 already taken
18// tmp.zig:4:9: note: other occurrence here
test/cases/compile_errors/stage1/obj/union_enum_field_does_not_match_enum.zig deleted-22
......@@ -1,22 +0,0 @@
1const Letter = enum {
2 A,
3 B,
4 C,
5};
6const Payload = union(Letter) {
7 A: i32,
8 B: f64,
9 C: bool,
10 D: bool,
11};
12export fn entry() void {
13 var a = Payload {.A = 1234};
14 _ = a;
15}
16
17// error
18// backend=stage1
19// target=native
20//
21// tmp.zig:10:5: error: enum field not found: 'D'
22// tmp.zig:1:16: note: enum declared here
test/cases/compile_errors/stage1/obj/union_with_too_small_explicit_signed_tag_type.zig deleted-16
......@@ -1,16 +0,0 @@
1const U = union(enum(i2)) {
2 A: u8,
3 B: u8,
4 C: u8,
5 D: u8,
6};
7export fn entry() void {
8 _ = U{ .D = 1 };
9}
10
11// error
12// backend=stage1
13// target=native
14//
15// tmp.zig:1:22: error: specified integer tag type cannot represent every field
16// tmp.zig:1:22: note: type i2 cannot fit values in range 0...3
test/cases/compile_errors/stage1/obj/union_with_too_small_explicit_unsigned_tag_type.zig deleted-17
......@@ -1,17 +0,0 @@
1const U = union(enum(u2)) {
2 A: u8,
3 B: u8,
4 C: u8,
5 D: u8,
6 E: u8,
7};
8export fn entry() void {
9 _ = U{ .E = 1 };
10}
11
12// error
13// backend=stage1
14// target=native
15//
16// tmp.zig:1:22: error: specified integer tag type cannot represent every field
17// tmp.zig:1:22: note: type u2 cannot fit values in range 0...4
test/cases/compile_errors/stage1/obj/wrong_frame_type_used_for_async_call.zig deleted-16
......@@ -1,16 +0,0 @@
1export fn entry() void {
2 var frame: @Frame(foo) = undefined;
3 frame = async bar();
4}
5fn foo() void {
6 suspend {}
7}
8fn bar() void {
9 suspend {}
10}
11
12// error
13// backend=stage1
14// target=native
15//
16// tmp.zig:3:13: error: expected type '*@Frame(bar)', found '*@Frame(foo)'
test/cases/compile_errors/stage1/obj/wrong_function_type.zig deleted-11
......@@ -1,11 +0,0 @@
1const fns = [_]fn() void { a, b, c };
2fn a() i32 {return 0;}
3fn b() i32 {return 1;}
4fn c() i32 {return 2;}
5export fn entry() usize { return @sizeOf(@TypeOf(fns)); }
6
7// error
8// backend=stage1
9// target=native
10//
11// tmp.zig:1:28: error: expected type 'fn() void', found 'fn() i32'
test/cases/compile_errors/stage1/obj/wrong_panic_signature_generic_function.zig deleted-12
......@@ -1,12 +0,0 @@
1pub fn panic(comptime msg: []const u8, error_return_trace: ?*builtin.StackTrace, _: ?usize) noreturn {
2 _ = msg; _ = error_return_trace;
3 while (true) {}
4}
5const builtin = @import("std").builtin;
6
7// error
8// backend=stage1
9// target=native
10//
11// error: expected type 'fn([]const u8, ?*std.builtin.StackTrace, ?usize) noreturn', found 'fn([]const u8,anytype,anytype) anytype'
12// note: only one of the functions is generic
test/cases/compile_errors/stage1/obj/wrong_panic_signature_runtime_function.zig deleted-10
......@@ -1,10 +0,0 @@
1test {}
2
3pub fn panic() void {}
4
5
6// error
7// backend=stage1
8// target=native
9//
10// error: expected type 'fn([]const u8, ?*std.builtin.StackTrace, ?usize) noreturn', found 'fn() void'
test/cases/compile_errors/stage1/obj/wrong_return_type_for_main.zig deleted-7
......@@ -1,7 +0,0 @@
1pub fn main() f32 { }
2
3// error
4// backend=stage1
5// target=native
6//
7// error: expected return type of main to be 'void', '!void', 'noreturn', 'u8', or '!u8'
test/cases/compile_errors/stage1/obj/wrong_type_for_argument_tuple_to_asyncCall.zig deleted-14
......@@ -1,14 +0,0 @@
1export fn entry1() void {
2 var frame: @Frame(foo) = undefined;
3 @asyncCall(&frame, {}, foo, {});
4}
5
6fn foo() i32 {
7 return 0;
8}
9
10// error
11// backend=stage1
12// target=native
13//
14// tmp.zig:3:33: error: expected tuple or struct, found 'void'
test/cases/compile_errors/stage1/obj/wrong_type_for_result_ptr_to_asyncCall.zig deleted-16
......@@ -1,16 +0,0 @@
1export fn entry() void {
2 _ = async amain();
3}
4fn amain() i32 {
5 var frame: @Frame(foo) = undefined;
6 return await @asyncCall(&frame, false, foo, .{});
7}
8fn foo() i32 {
9 return 1234;
10}
11
12// error
13// backend=stage1
14// target=native
15//
16// tmp.zig:6:37: error: expected type '*i32', found 'bool'
test/cases/compile_errors/stage2/comptime_unreachable.zig deleted-9
......@@ -1,9 +0,0 @@
1pub export fn entry() void {
2 comptime unreachable;
3}
4
5// error
6// target=native
7// backend=stage2
8//
9// :2:14: error: reached unreachable code
test/cases/compile_errors/stage2/constant_inside_comptime_function_has_compile_error.zig deleted-21
......@@ -1,21 +0,0 @@
1const ContextAllocator = MemoryPool(usize);
2
3pub fn MemoryPool(comptime T: type) type {
4 const free_list_t = @compileError("aoeu",);
5 _ = T;
6
7 return struct {
8 free_list: free_list_t,
9 };
10}
11
12export fn entry() void {
13 var allocator: ContextAllocator = undefined;
14 _ = allocator;
15}
16
17// error
18// target=native
19//
20// :4:5: error: unreachable code
21// :4:25: note: control flow is diverted here
test/cases/compile_errors/stage2/duplicate-unused_labels.zig deleted-31
......@@ -1,31 +0,0 @@
1comptime {
2 blk: { blk: while (false) {} }
3}
4comptime {
5 blk: while (false) { blk: for (@as([0]void, undefined)) |_| {} }
6}
7comptime {
8 blk: for (@as([0]void, undefined)) |_| { blk: {} }
9}
10comptime {
11 blk: {}
12}
13comptime {
14 blk: while(false) {}
15}
16comptime {
17 blk: for(@as([0]void, undefined)) |_| {}
18}
19
20// error
21// target=native
22//
23// :2:12: error: redefinition of label 'blk'
24// :2:5: note: previous definition here
25// :5:26: error: redefinition of label 'blk'
26// :5:5: note: previous definition here
27// :8:46: error: redefinition of label 'blk'
28// :8:5: note: previous definition here
29// :11:5: error: unused block label
30// :14:5: error: unused while loop label
31// :17:5: error: unused for loop label
test/cases/compile_errors/stage2/embed_outside_package.zig deleted-8
......@@ -1,8 +0,0 @@
1export fn a() usize {
2 return @embedFile("/root/foo").len;
3}
4
5// error
6// target=native
7//
8//:2:23: error: embed of file outside package path: '/root/foo'
test/cases/compile_errors/stage2/import_outside_package.zig deleted-8
......@@ -1,8 +0,0 @@
1export fn a() usize {
2 return @import("../../above.zig").len;
3}
4
5// error
6// target=native
7//
8// :2:20: error: import of file outside package path: '../../above.zig'
test/cases/compile_errors/stage2/out_of_bounds_index.zig deleted-29
......@@ -1,29 +0,0 @@
1comptime {
2 var array = [_:0]u8{ 1, 2, 3, 4 };
3 var src_slice: [:0]u8 = &array;
4 var slice = src_slice[2..6];
5 _ = slice;
6}
7comptime {
8 var array = [_:0]u8{ 1, 2, 3, 4 };
9 var slice = array[2..6];
10 _ = slice;
11}
12comptime {
13 var array = [_]u8{ 1, 2, 3, 4 };
14 var slice = array[2..5];
15 _ = slice;
16}
17comptime {
18 var array = [_:0]u8{ 1, 2, 3, 4 };
19 var slice = array[3..2];
20 _ = slice;
21}
22
23// error
24// target=native
25//
26// :4:30: error: end index 6 out of bounds for slice of length 4 +1 (sentinel)
27// :9:26: error: end index 6 out of bounds for array of length 4 +1 (sentinel)
28// :14:26: error: end index 5 out of bounds for array of length 4
29// :19:23: error: start index 3 is larger than end index 2
test/cases/compile_errors/stage2/reified_enum_field_value_overflow.zig deleted-20
......@@ -1,20 +0,0 @@
1comptime {
2 const E = @Type(.{ .Enum = .{
3 .layout = .Auto,
4 .tag_type = u1,
5 .fields = &.{
6 .{ .name = "f0", .value = 0 },
7 .{ .name = "f1", .value = 1 },
8 .{ .name = "f2", .value = 2 },
9 },
10 .decls = &.{},
11 .is_exhaustive = true,
12 } });
13 _ = E;
14}
15
16// error
17// target=native
18// backend=stage2
19//
20// :2:15: error: field 'f2' with enumeration value '2' is too large for backing int type 'u1'
test/cases/compile_errors/stage2/slice_of_null_pointer.zig deleted-11
......@@ -1,11 +0,0 @@
1comptime {
2 var x: [*c]u8 = null;
3 var runtime_len: usize = 0;
4 var y = x[0..runtime_len];
5 _ = y;
6}
7
8// error
9// target=native
10//
11// :4:14: error: slice of null pointer
test/cases/compile_errors/stage2/struct_duplicate_field_name.zig deleted-16
......@@ -1,16 +0,0 @@
1const S = struct {
2 foo: u32,
3 foo: u32,
4};
5
6export fn entry() void {
7 const s: S = .{ .foo = 100 };
8 _ = s;
9}
10
11// error
12// target=native
13//
14// :3:5: error: duplicate struct field: 'foo'
15// :2:5: note: other field here
16// :1:11: note: struct declared here
test/cases/compile_errors/stage2/tuple_ptr_to_mut_slice.zig deleted-32
......@@ -1,32 +0,0 @@
1export fn entry1() void {
2 var a = .{ 1, 2, 3 };
3 _ = @as([]u8, &a);
4}
5export fn entry2() void {
6 var a = .{ @as(u8, 1), @as(u8, 2), @as(u8, 3) };
7 _ = @as([]u8, &a);
8}
9
10// runtime values
11var vals = [_]u7{ 4, 5, 6 };
12export fn entry3() void {
13 var a = .{ vals[0], vals[1], vals[2] };
14 _ = @as([]u8, &a);
15}
16export fn entry4() void {
17 var a = .{ @as(u8, vals[0]), @as(u8, vals[1]), @as(u8, vals[2]) };
18 _ = @as([]u8, &a);
19}
20
21// error
22// backend=stage2
23// target=native
24//
25// :3:19: error: cannot cast pointer to tuple to '[]u8'
26// :3:19: note: pointers to tuples can only coerce to constant pointers
27// :7:19: error: cannot cast pointer to tuple to '[]u8'
28// :7:19: note: pointers to tuples can only coerce to constant pointers
29// :14:19: error: cannot cast pointer to tuple to '[]u8'
30// :14:19: note: pointers to tuples can only coerce to constant pointers
31// :18:19: error: cannot cast pointer to tuple to '[]u8'
32// :18:19: note: pointers to tuples can only coerce to constant pointers
test/cases/compile_errors/stage2/union_access_of_inactive_field.zig deleted-15
......@@ -1,15 +0,0 @@
1const U = union {
2 a: void,
3 b: u64,
4};
5comptime {
6 var u: U = .{ .a = {} };
7 const v = u.b;
8 _ = v;
9}
10
11// error
12// target=native
13//
14// :7:16: error: access of union field 'b' while field 'a' is active
15// :1:11: note: union declared here
test/cases/compile_errors/stage2/union_duplicate_enum_field.zig deleted-17
......@@ -1,17 +0,0 @@
1const E = enum { a, b };
2const U = union(E) {
3 a: u32,
4 a: u32,
5};
6
7export fn foo() void {
8 var u: U = .{ .a = 123 };
9 _ = u;
10}
11
12// error
13// target=native
14//
15// :4:5: error: duplicate union field: 'a'
16// :3:5: note: other field here
17// :2:11: note: union declared here
test/cases/compile_errors/stage2/union_duplicate_field_definition.zig deleted-16
......@@ -1,16 +0,0 @@
1const U = union {
2 foo: u32,
3 foo: u32,
4};
5
6export fn entry() void {
7 const u: U = .{ .foo = 100 };
8 _ = u;
9}
10
11// error
12// target=native
13//
14// :3:5: error: duplicate union field: 'foo'
15// :2:5: note: other field here
16// :1:11: note: union declared here
test/cases/compile_errors/stage2/union_enum_field_missing.zig deleted-21
......@@ -1,21 +0,0 @@
1const E = enum {
2 a,
3 b,
4 c,
5};
6
7const U = union(E) {
8 a: i32,
9 b: f64,
10};
11
12export fn entry() usize {
13 return @sizeOf(U);
14}
15
16// error
17// target=native
18//
19// :7:11: error: enum field(s) missing in union
20// :4:5: note: field 'c' missing, declared here
21// :1:11: note: enum declared here
test/cases/compile_errors/stage2/union_extra_field.zig deleted-20
......@@ -1,20 +0,0 @@
1const E = enum {
2 a,
3 b,
4 c,
5};
6const U = union(E) {
7 a: i32,
8 b: f64,
9 c: f64,
10 d: f64,
11};
12export fn entry() usize {
13 return @sizeOf(U);
14}
15
16// error
17// target=native
18//
19// :10:5: error: no field named 'd' in enum 'tmp.E'
20// :1:11: note: enum declared here
test/cases/compile_errors/stage2/union_runtime_coercion_from_enum.zig deleted-23
......@@ -1,23 +0,0 @@
1const E = enum {
2 a,
3 b,
4};
5const U = union(E) {
6 a: u32,
7 b: u64,
8};
9fn foo() E {
10 return E.b;
11}
12export fn doTheTest() u64 {
13 var u: U = foo();
14 return u.b;
15}
16
17// error
18// target=native
19//
20// :13:19: error: runtime coercion from enum 'tmp.E' to union 'tmp.U' which has non-void fields
21// :6:5: note: field 'a' has type 'u32'
22// :7:5: note: field 'b' has type 'u64'
23// :5:11: note: union declared here
test/cases/compile_errors/struct_duplicate_field_name.zig created+16
......@@ -0,0 +1,16 @@
1const S = struct {
2 foo: u32,
3 foo: u32,
4};
5
6export fn entry() void {
7 const s: S = .{ .foo = 100 };
8 _ = s;
9}
10
11// error
12// target=native
13//
14// :3:5: error: duplicate struct field: 'foo'
15// :2:5: note: other field here
16// :1:11: note: struct declared here
test/cases/compile_errors/tuple_ptr_to_mut_slice.zig created+32
......@@ -0,0 +1,32 @@
1export fn entry1() void {
2 var a = .{ 1, 2, 3 };
3 _ = @as([]u8, &a);
4}
5export fn entry2() void {
6 var a = .{ @as(u8, 1), @as(u8, 2), @as(u8, 3) };
7 _ = @as([]u8, &a);
8}
9
10// runtime values
11var vals = [_]u7{ 4, 5, 6 };
12export fn entry3() void {
13 var a = .{ vals[0], vals[1], vals[2] };
14 _ = @as([]u8, &a);
15}
16export fn entry4() void {
17 var a = .{ @as(u8, vals[0]), @as(u8, vals[1]), @as(u8, vals[2]) };
18 _ = @as([]u8, &a);
19}
20
21// error
22// backend=stage2
23// target=native
24//
25// :3:19: error: cannot cast pointer to tuple to '[]u8'
26// :3:19: note: pointers to tuples can only coerce to constant pointers
27// :7:19: error: cannot cast pointer to tuple to '[]u8'
28// :7:19: note: pointers to tuples can only coerce to constant pointers
29// :14:19: error: cannot cast pointer to tuple to '[]u8'
30// :14:19: note: pointers to tuples can only coerce to constant pointers
31// :18:19: error: cannot cast pointer to tuple to '[]u8'
32// :18:19: note: pointers to tuples can only coerce to constant pointers
test/cases/compile_errors/union_access_of_inactive_field.zig created+15
......@@ -0,0 +1,15 @@
1const U = union {
2 a: void,
3 b: u64,
4};
5comptime {
6 var u: U = .{ .a = {} };
7 const v = u.b;
8 _ = v;
9}
10
11// error
12// target=native
13//
14// :7:16: error: access of union field 'b' while field 'a' is active
15// :1:11: note: union declared here
test/cases/compile_errors/union_auto-enum_value_already_taken.zig created+18
......@@ -0,0 +1,18 @@
1const MultipleChoice = union(enum(u32)) {
2 A = 20,
3 B = 40,
4 C = 60,
5 D = 1000,
6 E = 60,
7};
8export fn entry() void {
9 var x = MultipleChoice { .C = {} };
10 _ = x;
11}
12
13// error
14// backend=stage2
15// target=native
16//
17// :6:5: error: enum tag value 60 already taken
18// :4:5: note: other occurrence here
test/cases/compile_errors/union_duplicate_enum_field.zig created+17
......@@ -0,0 +1,17 @@
1const E = enum { a, b };
2const U = union(E) {
3 a: u32,
4 a: u32,
5};
6
7export fn foo() void {
8 var u: U = .{ .a = 123 };
9 _ = u;
10}
11
12// error
13// target=native
14//
15// :4:5: error: duplicate union field: 'a'
16// :3:5: note: other field here
17// :2:11: note: union declared here
test/cases/compile_errors/union_duplicate_field_definition.zig created+16
......@@ -0,0 +1,16 @@
1const U = union {
2 foo: u32,
3 foo: u32,
4};
5
6export fn entry() void {
7 const u: U = .{ .foo = 100 };
8 _ = u;
9}
10
11// error
12// target=native
13//
14// :3:5: error: duplicate union field: 'foo'
15// :2:5: note: other field here
16// :1:11: note: union declared here
test/cases/compile_errors/union_enum_field_does_not_match_enum.zig created+22
......@@ -0,0 +1,22 @@
1const Letter = enum {
2 A,
3 B,
4 C,
5};
6const Payload = union(Letter) {
7 A: i32,
8 B: f64,
9 C: bool,
10 D: bool,
11};
12export fn entry() void {
13 var a = Payload {.A = 1234};
14 _ = a;
15}
16
17// error
18// backend=stage2
19// target=native
20//
21// :10:5: error: no field named 'D' in enum 'tmp.Letter'
22// :1:16: note: enum declared here
test/cases/compile_errors/union_enum_field_missing.zig created+21
......@@ -0,0 +1,21 @@
1const E = enum {
2 a,
3 b,
4 c,
5};
6
7const U = union(E) {
8 a: i32,
9 b: f64,
10};
11
12export fn entry() usize {
13 return @sizeOf(U);
14}
15
16// error
17// target=native
18//
19// :7:11: error: enum field(s) missing in union
20// :4:5: note: field 'c' missing, declared here
21// :1:11: note: enum declared here
test/cases/compile_errors/union_extra_field.zig created+20
......@@ -0,0 +1,20 @@
1const E = enum {
2 a,
3 b,
4 c,
5};
6const U = union(E) {
7 a: i32,
8 b: f64,
9 c: f64,
10 d: f64,
11};
12export fn entry() usize {
13 return @sizeOf(U);
14}
15
16// error
17// target=native
18//
19// :10:5: error: no field named 'd' in enum 'tmp.E'
20// :1:11: note: enum declared here
test/cases/compile_errors/union_runtime_coercion_from_enum.zig created+23
......@@ -0,0 +1,23 @@
1const E = enum {
2 a,
3 b,
4};
5const U = union(E) {
6 a: u32,
7 b: u64,
8};
9fn foo() E {
10 return E.b;
11}
12export fn doTheTest() u64 {
13 var u: U = foo();
14 return u.b;
15}
16
17// error
18// target=native
19//
20// :13:19: error: runtime coercion from enum 'tmp.E' to union 'tmp.U' which has non-void fields
21// :6:5: note: field 'a' has type 'u32'
22// :7:5: note: field 'b' has type 'u64'
23// :5:11: note: union declared here
test/cases/compile_errors/union_with_too_small_explicit_signed_tag_type.zig created+16
......@@ -0,0 +1,16 @@
1const U = union(enum(i2)) {
2 A: u8,
3 B: u8,
4 C: u8,
5 D: u8,
6};
7export fn entry() void {
8 _ = U{ .D = 1 };
9}
10
11// error
12// backend=stage2
13// target=native
14//
15// :1:22: error: specified integer tag type cannot represent every field
16// :1:22: note: type 'i2' cannot fit values in range 0...3
test/cases/compile_errors/union_with_too_small_explicit_unsigned_tag_type.zig created+17
......@@ -0,0 +1,17 @@
1const U = union(enum(u2)) {
2 A: u8,
3 B: u8,
4 C: u8,
5 D: u8,
6 E: u8,
7};
8export fn entry() void {
9 _ = U{ .E = 1 };
10}
11
12// error
13// backend=stage2
14// target=native
15//
16// :1:22: error: specified integer tag type cannot represent every field
17// :1:22: note: type 'u2' cannot fit values in range 0...4
test/cases/compile_errors/wrong_function_type.zig created+12
......@@ -0,0 +1,12 @@
1const fns = [_]fn() void { a, b, c };
2fn a() i32 {return 0;}
3fn b() i32 {return 1;}
4fn c() i32 {return 2;}
5export fn entry() usize { return @sizeOf(@TypeOf(fns)); }
6
7// error
8// backend=stage2
9// target=native
10//
11// :1:28: error: expected type 'fn() void', found 'fn() i32'
12// :1:28: note: return type 'i32' cannot cast into return type 'void'