authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-03 17:55:55-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-03-03 17:55:55-05:00
log6c045f9e83434e98fbfbd7c511e673274cb22afc
tree35ba6d6b69a3df9f661ba64202f31e0d8b1b6e5f
parent3605dd307ffff74726cc0ce5099599f1a6f9ddb2
parentaa7cbca7d37bb2cd7794ffa401193cdc3f5f9849
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #11047 from Vexu/stage2

Stage2: make `expectEqualSlices` work

5 files changed, 75 insertions(+), 60 deletions(-)

src/Sema.zig+59-49
...@@ -153,6 +153,7 @@ pub const Block = struct {...@@ -153,6 +153,7 @@ pub const Block = struct {
153 pub const Inlining = struct {153 pub const Inlining = struct {
154 comptime_result: Air.Inst.Ref,154 comptime_result: Air.Inst.Ref,
155 merges: Merges,155 merges: Merges,
156 err: ?*Module.ErrorMsg = null,
156 };157 };
157158
158 pub const Merges = struct {159 pub const Merges = struct {
...@@ -1429,10 +1430,10 @@ pub fn fail(...@@ -1429,10 +1430,10 @@ pub fn fail(
1429 args: anytype,1430 args: anytype,
1430) CompileError {1431) CompileError {
1431 const err_msg = try sema.errMsg(block, src, format, args);1432 const err_msg = try sema.errMsg(block, src, format, args);
1432 return sema.failWithOwnedErrorMsg(err_msg);1433 return sema.failWithOwnedErrorMsg(block, err_msg);
1433}1434}
14341435
1435fn failWithOwnedErrorMsg(sema: *Sema, err_msg: *Module.ErrorMsg) CompileError {1436fn failWithOwnedErrorMsg(sema: *Sema, block: *Block, err_msg: *Module.ErrorMsg) CompileError {
1436 @setCold(true);1437 @setCold(true);
14371438
1438 if (crash_report.is_enabled and sema.mod.comp.debug_compile_errors) {1439 if (crash_report.is_enabled and sema.mod.comp.debug_compile_errors) {
...@@ -1445,6 +1446,7 @@ fn failWithOwnedErrorMsg(sema: *Sema, err_msg: *Module.ErrorMsg) CompileError {...@@ -1445,6 +1446,7 @@ fn failWithOwnedErrorMsg(sema: *Sema, err_msg: *Module.ErrorMsg) CompileError {
1445 }1446 }
14461447
1447 const mod = sema.mod;1448 const mod = sema.mod;
1449 if (block.inlining) |some| some.err = err_msg;
14481450
1449 {1451 {
1450 errdefer err_msg.destroy(mod.gpa);1452 errdefer err_msg.destroy(mod.gpa);
...@@ -1969,7 +1971,7 @@ fn zirEnumDecl(...@@ -1969,7 +1971,7 @@ fn zirEnumDecl(
1969 try sema.errNote(block, other_tag_src, msg, "other tag here", .{});1971 try sema.errNote(block, other_tag_src, msg, "other tag here", .{});
1970 break :msg msg;1972 break :msg msg;
1971 };1973 };
1972 return sema.failWithOwnedErrorMsg(msg);1974 return sema.failWithOwnedErrorMsg(block, msg);
1973 }1975 }
19741976
1975 if (has_tag_value) {1977 if (has_tag_value) {
...@@ -2316,7 +2318,7 @@ fn zirIndexablePtrLen(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE...@@ -2316,7 +2318,7 @@ fn zirIndexablePtrLen(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE
2316 );2318 );
2317 break :msg msg;2319 break :msg msg;
2318 };2320 };
2319 return sema.failWithOwnedErrorMsg(msg);2321 return sema.failWithOwnedErrorMsg(block, msg);
2320 }2322 }
23212323
2322 return sema.fieldVal(block, src, object, "len", src);2324 return sema.fieldVal(block, src, object, "len", src);
...@@ -2772,7 +2774,7 @@ fn validateUnionInit(...@@ -2772,7 +2774,7 @@ fn validateUnionInit(
2772 try sema.addDeclaredHereNote(msg, union_ty);2774 try sema.addDeclaredHereNote(msg, union_ty);
2773 break :msg msg;2775 break :msg msg;
2774 };2776 };
2775 return sema.failWithOwnedErrorMsg(msg);2777 return sema.failWithOwnedErrorMsg(block, msg);
2776 }2778 }
27772779
2778 if (is_comptime or block.is_comptime) {2780 if (is_comptime or block.is_comptime) {
...@@ -2889,7 +2891,7 @@ fn validateStructInit(...@@ -2889,7 +2891,7 @@ fn validateStructInit(
2889 try sema.errNote(block, other_field_src, msg, "other field here", .{});2891 try sema.errNote(block, other_field_src, msg, "other field here", .{});
2890 break :msg msg;2892 break :msg msg;
2891 };2893 };
2892 return sema.failWithOwnedErrorMsg(msg);2894 return sema.failWithOwnedErrorMsg(block, msg);
2893 }2895 }
2894 found_fields[field_index] = field_ptr;2896 found_fields[field_index] = field_ptr;
2895 }2897 }
...@@ -2936,7 +2938,7 @@ fn validateStructInit(...@@ -2936,7 +2938,7 @@ fn validateStructInit(
2936 "struct '{s}' declared here",2938 "struct '{s}' declared here",
2937 .{fqn},2939 .{fqn},
2938 );2940 );
2939 return sema.failWithOwnedErrorMsg(msg);2941 return sema.failWithOwnedErrorMsg(block, msg);
2940 }2942 }
29412943
2942 return;2944 return;
...@@ -3043,7 +3045,7 @@ fn validateStructInit(...@@ -3043,7 +3045,7 @@ fn validateStructInit(
3043 "struct '{s}' declared here",3045 "struct '{s}' declared here",
3044 .{fqn},3046 .{fqn},
3045 );3047 );
3046 return sema.failWithOwnedErrorMsg(msg);3048 return sema.failWithOwnedErrorMsg(block, msg);
3047 }3049 }
30483050
3049 if (struct_is_comptime) {3051 if (struct_is_comptime) {
...@@ -3215,7 +3217,7 @@ fn failWithBadMemberAccess(...@@ -3215,7 +3217,7 @@ fn failWithBadMemberAccess(
3215 try sema.addDeclaredHereNote(msg, agg_ty);3217 try sema.addDeclaredHereNote(msg, agg_ty);
3216 break :msg msg;3218 break :msg msg;
3217 };3219 };
3218 return sema.failWithOwnedErrorMsg(msg);3220 return sema.failWithOwnedErrorMsg(block, msg);
3219}3221}
32203222
3221fn failWithBadStructFieldAccess(3223fn failWithBadStructFieldAccess(
...@@ -3241,7 +3243,7 @@ fn failWithBadStructFieldAccess(...@@ -3241,7 +3243,7 @@ fn failWithBadStructFieldAccess(
3241 try sema.mod.errNoteNonLazy(struct_obj.srcLoc(), msg, "struct declared here", .{});3243 try sema.mod.errNoteNonLazy(struct_obj.srcLoc(), msg, "struct declared here", .{});
3242 break :msg msg;3244 break :msg msg;
3243 };3245 };
3244 return sema.failWithOwnedErrorMsg(msg);3246 return sema.failWithOwnedErrorMsg(block, msg);
3245}3247}
32463248
3247fn failWithBadUnionFieldAccess(3249fn failWithBadUnionFieldAccess(
...@@ -3267,7 +3269,7 @@ fn failWithBadUnionFieldAccess(...@@ -3267,7 +3269,7 @@ fn failWithBadUnionFieldAccess(
3267 try sema.mod.errNoteNonLazy(union_obj.srcLoc(), msg, "union declared here", .{});3269 try sema.mod.errNoteNonLazy(union_obj.srcLoc(), msg, "union declared here", .{});
3268 break :msg msg;3270 break :msg msg;
3269 };3271 };
3270 return sema.failWithOwnedErrorMsg(msg);3272 return sema.failWithOwnedErrorMsg(block, msg);
3271}3273}
32723274
3273fn addDeclaredHereNote(sema: *Sema, parent: *Module.ErrorMsg, decl_ty: Type) !void {3275fn addDeclaredHereNote(sema: *Sema, parent: *Module.ErrorMsg, decl_ty: Type) !void {
...@@ -3685,7 +3687,7 @@ fn zirCImport(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileEr...@@ -3685,7 +3687,7 @@ fn zirCImport(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileEr
3685 @import("clang.zig").Stage2ErrorMsg.delete(c_import_res.errors.ptr, c_import_res.errors.len);3687 @import("clang.zig").Stage2ErrorMsg.delete(c_import_res.errors.ptr, c_import_res.errors.len);
3686 break :msg msg;3688 break :msg msg;
3687 };3689 };
3688 return sema.failWithOwnedErrorMsg(msg);3690 return sema.failWithOwnedErrorMsg(parent_block, msg);
3689 }3691 }
3690 const c_import_pkg = Package.create(3692 const c_import_pkg = Package.create(
3691 sema.gpa,3693 sema.gpa,
...@@ -4043,7 +4045,7 @@ fn zirSetAlignStack(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr...@@ -4043,7 +4045,7 @@ fn zirSetAlignStack(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr
4043 try sema.errNote(block, src, msg, "other instance here", .{});4045 try sema.errNote(block, src, msg, "other instance here", .{});
4044 break :msg msg;4046 break :msg msg;
4045 };4047 };
4046 return sema.failWithOwnedErrorMsg(msg);4048 return sema.failWithOwnedErrorMsg(block, msg);
4047 }4049 }
4048 gop.value_ptr.* = .{ .alignment = alignment, .src = src };4050 gop.value_ptr.* = .{ .alignment = alignment, .src = src };
4049}4051}
...@@ -4228,7 +4230,7 @@ fn lookupInNamespace(...@@ -4228,7 +4230,7 @@ fn lookupInNamespace(
4228 }4230 }
4229 break :msg msg;4231 break :msg msg;
4230 };4232 };
4231 return sema.failWithOwnedErrorMsg(msg);4233 return sema.failWithOwnedErrorMsg(block, msg);
4232 },4234 },
4233 }4235 }
4234 } else if (namespace.decls.get(ident_name)) |decl| {4236 } else if (namespace.decls.get(ident_name)) |decl| {
...@@ -4642,6 +4644,12 @@ fn analyzeCall(...@@ -4642,6 +4644,12 @@ fn analyzeCall(
4642 _ = sema.analyzeBody(&child_block, fn_info.body) catch |err| switch (err) {4644 _ = sema.analyzeBody(&child_block, fn_info.body) catch |err| switch (err) {
4643 error.ComptimeReturn => break :result inlining.comptime_result,4645 error.ComptimeReturn => break :result inlining.comptime_result,
4644 error.ComptimeBreak => unreachable, // Can't break through a fn call.4646 error.ComptimeBreak => unreachable, // Can't break through a fn call.
4647 error.AnalysisFail => {
4648 const err_msg = inlining.err orelse return err;
4649 try sema.errNote(block, call_src, err_msg, "called from here", .{});
4650 if (block.inlining) |some| some.err = err_msg;
4651 return err;
4652 },
4645 else => |e| return e,4653 else => |e| return e,
4646 };4654 };
4647 break :result try sema.analyzeBlockBody(block, call_src, &child_block, merges);4655 break :result try sema.analyzeBlockBody(block, call_src, &child_block, merges);
...@@ -5266,7 +5274,7 @@ fn zirMergeErrorSets(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr...@@ -5266,7 +5274,7 @@ fn zirMergeErrorSets(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr
5266 try sema.errNote(block, src, msg, "'||' merges error sets; 'or' performs boolean OR", .{});5274 try sema.errNote(block, src, msg, "'||' merges error sets; 'or' performs boolean OR", .{});
5267 break :msg msg;5275 break :msg msg;
5268 };5276 };
5269 return sema.failWithOwnedErrorMsg(msg);5277 return sema.failWithOwnedErrorMsg(block, msg);
5270 }5278 }
5271 const lhs_ty = try sema.analyzeAsType(block, lhs_src, lhs);5279 const lhs_ty = try sema.analyzeAsType(block, lhs_src, lhs);
5272 const rhs_ty = try sema.analyzeAsType(block, rhs_src, rhs);5280 const rhs_ty = try sema.analyzeAsType(block, rhs_src, rhs);
...@@ -5396,7 +5404,7 @@ fn zirIntToEnum(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A...@@ -5396,7 +5404,7 @@ fn zirIntToEnum(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
5396 );5404 );
5397 break :msg msg;5405 break :msg msg;
5398 };5406 };
5399 return sema.failWithOwnedErrorMsg(msg);5407 return sema.failWithOwnedErrorMsg(block, msg);
5400 }5408 }
5401 return sema.addConstant(dest_ty, int_val);5409 return sema.addConstant(dest_ty, int_val);
5402 }5410 }
...@@ -6606,7 +6614,7 @@ fn zirSwitchCond(...@@ -6606,7 +6614,7 @@ fn zirSwitchCond(
6606 try sema.addDeclaredHereNote(msg, union_ty);6614 try sema.addDeclaredHereNote(msg, union_ty);
6607 break :msg msg;6615 break :msg msg;
6608 };6616 };
6609 return sema.failWithOwnedErrorMsg(msg);6617 return sema.failWithOwnedErrorMsg(block, msg);
6610 };6618 };
6611 return sema.unionToTag(block, enum_ty, operand, src);6619 return sema.unionToTag(block, enum_ty, operand, src);
6612 },6620 },
...@@ -6686,7 +6694,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError...@@ -6686,7 +6694,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
6686 );6694 );
6687 break :msg msg;6695 break :msg msg;
6688 };6696 };
6689 return sema.failWithOwnedErrorMsg(msg);6697 return sema.failWithOwnedErrorMsg(block, msg);
6690 }6698 }
66916699
6692 // Validate for duplicate items, missing else prong, and invalid range.6700 // Validate for duplicate items, missing else prong, and invalid range.
...@@ -6778,7 +6786,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError...@@ -6778,7 +6786,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
6778 );6786 );
6779 break :msg msg;6787 break :msg msg;
6780 };6788 };
6781 return sema.failWithOwnedErrorMsg(msg);6789 return sema.failWithOwnedErrorMsg(block, msg);
6782 }6790 }
6783 },6791 },
6784 .under => {6792 .under => {
...@@ -6892,7 +6900,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError...@@ -6892,7 +6900,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
6892 "error set '{}' declared here",6900 "error set '{}' declared here",
6893 .{operand_ty},6901 .{operand_ty},
6894 );6902 );
6895 return sema.failWithOwnedErrorMsg(msg);6903 return sema.failWithOwnedErrorMsg(block, msg);
6896 }6904 }
68976905
6898 if (special_prong == .@"else") {6906 if (special_prong == .@"else") {
...@@ -7571,7 +7579,7 @@ fn validateSwitchItemEnum(...@@ -7571,7 +7579,7 @@ fn validateSwitchItemEnum(
7571 );7579 );
7572 break :msg msg;7580 break :msg msg;
7573 };7581 };
7574 return sema.failWithOwnedErrorMsg(msg);7582 return sema.failWithOwnedErrorMsg(block, msg);
7575 };7583 };
7576 const maybe_prev_src = seen_fields[field_index];7584 const maybe_prev_src = seen_fields[field_index];
7577 seen_fields[field_index] = switch_prong_src;7585 seen_fields[field_index] = switch_prong_src;
...@@ -7624,7 +7632,7 @@ fn validateSwitchDupe(...@@ -7624,7 +7632,7 @@ fn validateSwitchDupe(
7624 );7632 );
7625 break :msg msg;7633 break :msg msg;
7626 };7634 };
7627 return sema.failWithOwnedErrorMsg(msg);7635 return sema.failWithOwnedErrorMsg(block, msg);
7628}7636}
76297637
7630fn validateSwitchItemBool(7638fn validateSwitchItemBool(
...@@ -7693,7 +7701,7 @@ fn validateSwitchNoRange(...@@ -7693,7 +7701,7 @@ fn validateSwitchNoRange(
7693 );7701 );
7694 break :msg msg;7702 break :msg msg;
7695 };7703 };
7696 return sema.failWithOwnedErrorMsg(msg);7704 return sema.failWithOwnedErrorMsg(block, msg);
7697}7705}
76987706
7699fn zirHasField(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {7707fn zirHasField(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
...@@ -9486,6 +9494,8 @@ fn analyzePtrArithmetic(...@@ -9486,6 +9494,8 @@ fn analyzePtrArithmetic(
9486 }9494 }
94879495
9488 const offset_int = try sema.usizeCast(block, offset_src, offset_val.toUnsignedInt());9496 const offset_int = try sema.usizeCast(block, offset_src, offset_val.toUnsignedInt());
9497 // TODO I tried to put this check earlier but it the LLVM backend generate invalid instructinons
9498 if (offset_int == 0) return ptr;
9489 if (ptr_val.getUnsignedInt()) |addr| {9499 if (ptr_val.getUnsignedInt()) |addr| {
9490 const target = sema.mod.getTarget();9500 const target = sema.mod.getTarget();
9491 const ptr_child_ty = ptr_ty.childType();9501 const ptr_child_ty = ptr_ty.childType();
...@@ -11569,7 +11579,7 @@ fn zirStructInit(...@@ -11569,7 +11579,7 @@ fn zirStructInit(
11569 try sema.errNote(block, other_field_src, msg, "other field here", .{});11579 try sema.errNote(block, other_field_src, msg, "other field here", .{});
11570 break :msg msg;11580 break :msg msg;
11571 };11581 };
11572 return sema.failWithOwnedErrorMsg(msg);11582 return sema.failWithOwnedErrorMsg(block, msg);
11573 }11583 }
11574 found_fields[field_index] = item.data.field_type;11584 found_fields[field_index] = item.data.field_type;
11575 field_inits[field_index] = sema.resolveInst(item.data.init);11585 field_inits[field_index] = sema.resolveInst(item.data.init);
...@@ -11647,7 +11657,7 @@ fn finishStructInit(...@@ -11647,7 +11657,7 @@ fn finishStructInit(
11647 "struct '{s}' declared here",11657 "struct '{s}' declared here",
11648 .{fqn},11658 .{fqn},
11649 );11659 );
11650 return sema.failWithOwnedErrorMsg(msg);11660 return sema.failWithOwnedErrorMsg(block, msg);
11651 }11661 }
1165211662
11653 const is_comptime = for (field_inits) |field_init| {11663 const is_comptime = for (field_inits) |field_init| {
...@@ -12130,7 +12140,7 @@ fn zirTagName(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air...@@ -12130,7 +12140,7 @@ fn zirTagName(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
12130 try sema.mod.errNoteNonLazy(decl.srcLoc(), msg, "declared here", .{});12140 try sema.mod.errNoteNonLazy(decl.srcLoc(), msg, "declared here", .{});
12131 break :msg msg;12141 break :msg msg;
12132 };12142 };
12133 return sema.failWithOwnedErrorMsg(msg);12143 return sema.failWithOwnedErrorMsg(block, msg);
12134 },12144 },
12135 else => return sema.fail(block, operand_src, "expected enum or union; found {}", .{12145 else => return sema.fail(block, operand_src, "expected enum or union; found {}", .{
12136 operand_ty,12146 operand_ty,
...@@ -12148,7 +12158,7 @@ fn zirTagName(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air...@@ -12148,7 +12158,7 @@ fn zirTagName(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
12148 try sema.mod.errNoteNonLazy(enum_decl.srcLoc(), msg, "declared here", .{});12158 try sema.mod.errNoteNonLazy(enum_decl.srcLoc(), msg, "declared here", .{});
12149 break :msg msg;12159 break :msg msg;
12150 };12160 };
12151 return sema.failWithOwnedErrorMsg(msg);12161 return sema.failWithOwnedErrorMsg(block, msg);
12152 };12162 };
12153 const field_name = enum_ty.enumFieldName(field_index);12163 const field_name = enum_ty.enumFieldName(field_index);
12154 return sema.addStrLit(block, field_name);12164 return sema.addStrLit(block, field_name);
...@@ -12624,7 +12634,7 @@ fn zirTruncate(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai...@@ -12624,7 +12634,7 @@ fn zirTruncate(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
12624 });12634 });
12625 break :msg msg;12635 break :msg msg;
12626 };12636 };
12627 return sema.failWithOwnedErrorMsg(msg);12637 return sema.failWithOwnedErrorMsg(block, msg);
12628 }12638 }
12629 }12639 }
1263012640
...@@ -12884,7 +12894,7 @@ fn checkPtrOperand(...@@ -12884,7 +12894,7 @@ fn checkPtrOperand(
1288412894
12885 break :msg msg;12895 break :msg msg;
12886 };12896 };
12887 return sema.failWithOwnedErrorMsg(msg);12897 return sema.failWithOwnedErrorMsg(block, msg);
12888 },12898 },
12889 .Optional => if (ty.isPtrLikeOptional()) return,12899 .Optional => if (ty.isPtrLikeOptional()) return,
12890 else => {},12900 else => {},
...@@ -12914,7 +12924,7 @@ fn checkPtrType(...@@ -12914,7 +12924,7 @@ fn checkPtrType(
1291412924
12915 break :msg msg;12925 break :msg msg;
12916 };12926 };
12917 return sema.failWithOwnedErrorMsg(msg);12927 return sema.failWithOwnedErrorMsg(block, msg);
12918 },12928 },
12919 .Optional => if (ty.isPtrLikeOptional()) return,12929 .Optional => if (ty.isPtrLikeOptional()) return,
12920 else => {},12930 else => {},
...@@ -13037,7 +13047,7 @@ fn checkComptimeVarStore(...@@ -13037,7 +13047,7 @@ fn checkComptimeVarStore(
13037 try sema.errNote(block, cond_src, msg, "runtime condition here", .{});13047 try sema.errNote(block, cond_src, msg, "runtime condition here", .{});
13038 break :msg msg;13048 break :msg msg;
13039 };13049 };
13040 return sema.failWithOwnedErrorMsg(msg);13050 return sema.failWithOwnedErrorMsg(block, msg);
13041 }13051 }
13042 if (block.runtime_loop) |loop_src| {13052 if (block.runtime_loop) |loop_src| {
13043 const msg = msg: {13053 const msg = msg: {
...@@ -13046,7 +13056,7 @@ fn checkComptimeVarStore(...@@ -13046,7 +13056,7 @@ fn checkComptimeVarStore(
13046 try sema.errNote(block, loop_src, msg, "non-inline loop here", .{});13056 try sema.errNote(block, loop_src, msg, "non-inline loop here", .{});
13047 break :msg msg;13057 break :msg msg;
13048 };13058 };
13049 return sema.failWithOwnedErrorMsg(msg);13059 return sema.failWithOwnedErrorMsg(block, msg);
13050 }13060 }
13051 unreachable;13061 unreachable;
13052 }13062 }
...@@ -13114,7 +13124,7 @@ fn checkSimdBinOp(...@@ -13114,7 +13124,7 @@ fn checkSimdBinOp(
13114 try sema.errNote(block, rhs_src, msg, "length {d} here", .{rhs_len});13124 try sema.errNote(block, rhs_src, msg, "length {d} here", .{rhs_len});
13115 break :msg msg;13125 break :msg msg;
13116 };13126 };
13117 return sema.failWithOwnedErrorMsg(msg);13127 return sema.failWithOwnedErrorMsg(block, msg);
13118 }13128 }
13119 vec_len = try sema.usizeCast(block, lhs_src, lhs_len);13129 vec_len = try sema.usizeCast(block, lhs_src, lhs_len);
13120 } else if (lhs_zig_ty_tag == .Vector or rhs_zig_ty_tag == .Vector) {13130 } else if (lhs_zig_ty_tag == .Vector or rhs_zig_ty_tag == .Vector) {
...@@ -13132,7 +13142,7 @@ fn checkSimdBinOp(...@@ -13132,7 +13142,7 @@ fn checkSimdBinOp(
13132 }13142 }
13133 break :msg msg;13143 break :msg msg;
13134 };13144 };
13135 return sema.failWithOwnedErrorMsg(msg);13145 return sema.failWithOwnedErrorMsg(block, msg);
13136 }13146 }
13137 const result_ty = try sema.resolvePeerTypes(block, src, &.{ uncasted_lhs, uncasted_rhs }, .{13147 const result_ty = try sema.resolvePeerTypes(block, src, &.{ uncasted_lhs, uncasted_rhs }, .{
13138 .override = &[_]LazySrcLoc{ lhs_src, rhs_src },13148 .override = &[_]LazySrcLoc{ lhs_src, rhs_src },
...@@ -14263,7 +14273,7 @@ fn validateVarType(...@@ -14263,7 +14273,7 @@ fn validateVarType(
1426314273
14264 break :msg msg;14274 break :msg msg;
14265 };14275 };
14266 return sema.failWithOwnedErrorMsg(msg);14276 return sema.failWithOwnedErrorMsg(block, msg);
14267}14277}
1426814278
14269fn explainWhyTypeIsComptime(14279fn explainWhyTypeIsComptime(
...@@ -15037,7 +15047,7 @@ fn namespaceLookup(...@@ -15037,7 +15047,7 @@ fn namespaceLookup(
15037 try sema.mod.errNoteNonLazy(decl.srcLoc(), msg, "declared here", .{});15047 try sema.mod.errNoteNonLazy(decl.srcLoc(), msg, "declared here", .{});
15038 break :msg msg;15048 break :msg msg;
15039 };15049 };
15040 return sema.failWithOwnedErrorMsg(msg);15050 return sema.failWithOwnedErrorMsg(block, msg);
15041 }15051 }
15042 return decl;15052 return decl;
15043 }15053 }
...@@ -15961,7 +15971,7 @@ fn coerce(...@@ -15961,7 +15971,7 @@ fn coerce(
15961 );15971 );
15962 break :msg msg;15972 break :msg msg;
15963 };15973 };
15964 return sema.failWithOwnedErrorMsg(msg);15974 return sema.failWithOwnedErrorMsg(block, msg);
15965 };15975 };
15966 return sema.addConstant(15976 return sema.addConstant(
15967 dest_ty,15977 dest_ty,
...@@ -16844,7 +16854,7 @@ fn beginComptimePtrLoad(...@@ -16844,7 +16854,7 @@ fn beginComptimePtrLoad(
16844 };16854 };
16845 return ComptimePtrLoadKit{16855 return ComptimePtrLoadKit{
16846 .root_val = parent.root_val,16856 .root_val = parent.root_val,
16847 .root_ty = parent.ty,16857 .root_ty = parent.root_ty,
16848 .val = try parent.val.elemValue(sema.arena, elem_ptr.index),16858 .val = try parent.val.elemValue(sema.arena, elem_ptr.index),
16849 .ty = elem_ty,16859 .ty = elem_ty,
16850 .byte_offset = byte_offset,16860 .byte_offset = byte_offset,
...@@ -16860,7 +16870,7 @@ fn beginComptimePtrLoad(...@@ -16860,7 +16870,7 @@ fn beginComptimePtrLoad(
16860 }16870 }
16861 return ComptimePtrLoadKit{16871 return ComptimePtrLoadKit{
16862 .root_val = parent.root_val,16872 .root_val = parent.root_val,
16863 .root_ty = parent.ty,16873 .root_ty = parent.root_ty,
16864 .val = parent.val,16874 .val = parent.val,
16865 .ty = parent.ty,16875 .ty = parent.ty,
16866 .byte_offset = parent.byte_offset,16876 .byte_offset = parent.byte_offset,
...@@ -16888,7 +16898,7 @@ fn beginComptimePtrLoad(...@@ -16888,7 +16898,7 @@ fn beginComptimePtrLoad(
16888 };16898 };
16889 return ComptimePtrLoadKit{16899 return ComptimePtrLoadKit{
16890 .root_val = parent.root_val,16900 .root_val = parent.root_val,
16891 .root_ty = parent.ty,16901 .root_ty = parent.root_ty,
16892 .val = try parent.val.fieldValue(sema.arena, field_index),16902 .val = try parent.val.fieldValue(sema.arena, field_index),
16893 .ty = parent.ty.structFieldType(field_index),16903 .ty = parent.ty.structFieldType(field_index),
16894 .byte_offset = byte_offset,16904 .byte_offset = byte_offset,
...@@ -17034,7 +17044,7 @@ fn coerceEnumToUnion(...@@ -17034,7 +17044,7 @@ fn coerceEnumToUnion(
17034 try sema.addDeclaredHereNote(msg, union_ty);17044 try sema.addDeclaredHereNote(msg, union_ty);
17035 break :msg msg;17045 break :msg msg;
17036 };17046 };
17037 return sema.failWithOwnedErrorMsg(msg);17047 return sema.failWithOwnedErrorMsg(block, msg);
17038 };17048 };
1703917049
17040 const enum_tag = try sema.coerce(block, tag_ty, inst, inst_src);17050 const enum_tag = try sema.coerce(block, tag_ty, inst, inst_src);
...@@ -17049,7 +17059,7 @@ fn coerceEnumToUnion(...@@ -17049,7 +17059,7 @@ fn coerceEnumToUnion(
17049 try sema.addDeclaredHereNote(msg, union_ty);17059 try sema.addDeclaredHereNote(msg, union_ty);
17050 break :msg msg;17060 break :msg msg;
17051 };17061 };
17052 return sema.failWithOwnedErrorMsg(msg);17062 return sema.failWithOwnedErrorMsg(block, msg);
17053 };17063 };
17054 const field = union_obj.fields.values()[field_index];17064 const field = union_obj.fields.values()[field_index];
17055 const field_ty = try sema.resolveTypeFields(block, inst_src, field.ty);17065 const field_ty = try sema.resolveTypeFields(block, inst_src, field.ty);
...@@ -17064,7 +17074,7 @@ fn coerceEnumToUnion(...@@ -17064,7 +17074,7 @@ fn coerceEnumToUnion(
17064 try sema.addDeclaredHereNote(msg, union_ty);17074 try sema.addDeclaredHereNote(msg, union_ty);
17065 break :msg msg;17075 break :msg msg;
17066 };17076 };
17067 return sema.failWithOwnedErrorMsg(msg);17077 return sema.failWithOwnedErrorMsg(block, msg);
17068 };17078 };
1706917079
17070 return sema.addConstant(union_ty, try Value.Tag.@"union".create(sema.arena, .{17080 return sema.addConstant(union_ty, try Value.Tag.@"union".create(sema.arena, .{
...@@ -17084,7 +17094,7 @@ fn coerceEnumToUnion(...@@ -17084,7 +17094,7 @@ fn coerceEnumToUnion(
17084 try sema.addDeclaredHereNote(msg, tag_ty);17094 try sema.addDeclaredHereNote(msg, tag_ty);
17085 break :msg msg;17095 break :msg msg;
17086 };17096 };
17087 return sema.failWithOwnedErrorMsg(msg);17097 return sema.failWithOwnedErrorMsg(block, msg);
17088 }17098 }
1708917099
17090 // If the union has all fields 0 bits, the union value is just the enum value.17100 // If the union has all fields 0 bits, the union value is just the enum value.
...@@ -17102,7 +17112,7 @@ fn coerceEnumToUnion(...@@ -17102,7 +17112,7 @@ fn coerceEnumToUnion(
17102 try sema.addDeclaredHereNote(msg, union_ty);17112 try sema.addDeclaredHereNote(msg, union_ty);
17103 break :msg msg;17113 break :msg msg;
17104 };17114 };
17105 return sema.failWithOwnedErrorMsg(msg);17115 return sema.failWithOwnedErrorMsg(block, msg);
17106}17116}
1710717117
17108fn coerceAnonStructToUnion(17118fn coerceAnonStructToUnion(
...@@ -17131,7 +17141,7 @@ fn coerceAnonStructToUnion(...@@ -17131,7 +17141,7 @@ fn coerceAnonStructToUnion(
17131 try sema.addDeclaredHereNote(msg, union_ty);17141 try sema.addDeclaredHereNote(msg, union_ty);
17132 break :msg msg;17142 break :msg msg;
17133 };17143 };
17134 return sema.failWithOwnedErrorMsg(msg);17144 return sema.failWithOwnedErrorMsg(block, msg);
17135 }17145 }
1713617146
17137 const field_name = anon_struct.names[0];17147 const field_name = anon_struct.names[0];
...@@ -17176,7 +17186,7 @@ fn coerceArrayLike(...@@ -17176,7 +17186,7 @@ fn coerceArrayLike(
17176 try sema.errNote(block, inst_src, msg, "source has length {d}", .{inst_len});17186 try sema.errNote(block, inst_src, msg, "source has length {d}", .{inst_len});
17177 break :msg msg;17187 break :msg msg;
17178 };17188 };
17179 return sema.failWithOwnedErrorMsg(msg);17189 return sema.failWithOwnedErrorMsg(block, msg);
17180 }17190 }
1718117191
17182 const target = sema.mod.getTarget();17192 const target = sema.mod.getTarget();
...@@ -17248,7 +17258,7 @@ fn coerceTupleToArray(...@@ -17248,7 +17258,7 @@ fn coerceTupleToArray(
17248 try sema.errNote(block, inst_src, msg, "source has length {d}", .{inst_len});17258 try sema.errNote(block, inst_src, msg, "source has length {d}", .{inst_len});
17249 break :msg msg;17259 break :msg msg;
17250 };17260 };
17251 return sema.failWithOwnedErrorMsg(msg);17261 return sema.failWithOwnedErrorMsg(block, msg);
17252 }17262 }
1725317263
17254 const element_vals = try sema.arena.alloc(Value, dest_len);17264 const element_vals = try sema.arena.alloc(Value, dest_len);
...@@ -18446,7 +18456,7 @@ fn resolvePeerTypes(...@@ -18446,7 +18456,7 @@ fn resolvePeerTypes(
1844618456
18447 break :msg msg;18457 break :msg msg;
18448 };18458 };
18449 return sema.failWithOwnedErrorMsg(msg);18459 return sema.failWithOwnedErrorMsg(block, msg);
18450 }18460 }
1845118461
18452 const chosen_ty = sema.typeOf(chosen);18462 const chosen_ty = sema.typeOf(chosen);
src/type.zig+2-8
...@@ -2170,11 +2170,7 @@ pub const Type = extern union {...@@ -2170,11 +2170,7 @@ pub const Type = extern union {
2170 .optional_single_mut_pointer,2170 .optional_single_mut_pointer,
2171 => {2171 => {
2172 const child_type = self.cast(Payload.ElemType).?.data;2172 const child_type = self.cast(Payload.ElemType).?.data;
2173 if (child_type.zigTypeTag() == .Opaque) {2173 return child_type.abiAlignment(target);
2174 return 1;
2175 } else {
2176 return child_type.abiAlignment(target);
2177 }
2178 },2174 },
21792175
2180 .manyptr_u8,2176 .manyptr_u8,
...@@ -2188,8 +2184,6 @@ pub const Type = extern union {...@@ -2188,8 +2184,6 @@ pub const Type = extern union {
2188 const ptr_info = self.castTag(.pointer).?.data;2184 const ptr_info = self.castTag(.pointer).?.data;
2189 if (ptr_info.@"align" != 0) {2185 if (ptr_info.@"align" != 0) {
2190 return ptr_info.@"align";2186 return ptr_info.@"align";
2191 } else if (ptr_info.pointee_type.zigTypeTag() == .Opaque) {
2192 return 1;
2193 } else {2187 } else {
2194 return ptr_info.pointee_type.abiAlignment(target);2188 return ptr_info.pointee_type.abiAlignment(target);
2195 }2189 }
...@@ -2246,6 +2240,7 @@ pub const Type = extern union {...@@ -2246,6 +2240,7 @@ pub const Type = extern union {
2246 .export_options,2240 .export_options,
2247 .extern_options,2241 .extern_options,
2248 .@"opaque",2242 .@"opaque",
2243 .anyopaque,
2249 => return 1,2244 => return 1,
22502245
2251 .fn_noreturn_no_args, // represents machine code; not a pointer2246 .fn_noreturn_no_args, // represents machine code; not a pointer
...@@ -2419,7 +2414,6 @@ pub const Type = extern union {...@@ -2419,7 +2414,6 @@ pub const Type = extern union {
24192414
2420 .empty_struct,2415 .empty_struct,
2421 .void,2416 .void,
2422 .anyopaque,
2423 .empty_struct_literal,2417 .empty_struct_literal,
2424 .type,2418 .type,
2425 .comptime_int,2419 .comptime_int,
test/behavior/basic.zig+5-1
...@@ -747,7 +747,11 @@ fn maybe(x: bool) anyerror!?u32 {...@@ -747,7 +747,11 @@ fn maybe(x: bool) anyerror!?u32 {
747}747}
748748
749test "pointer to thread local array" {749test "pointer to thread local array" {
750 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO750 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
751 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
752 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
753 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
754 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
751755
752 const s = "Hello world";756 const s = "Hello world";
753 std.mem.copy(u8, buffer[0..], s);757 std.mem.copy(u8, buffer[0..], s);
test/behavior/pointers.zig+5-1
...@@ -391,7 +391,11 @@ test "@ptrToInt on null optional at comptime" {...@@ -391,7 +391,11 @@ test "@ptrToInt on null optional at comptime" {
391}391}
392392
393test "indexing array with sentinel returns correct type" {393test "indexing array with sentinel returns correct type" {
394 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO394 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
395 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
396 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
397 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
398 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
395399
396 var s: [:0]const u8 = "abc";400 var s: [:0]const u8 = "abc";
397 try testing.expectEqualSlices(u8, "*const u8", @typeName(@TypeOf(&s[0])));401 try testing.expectEqualSlices(u8, "*const u8", @typeName(@TypeOf(&s[0])));
test/stage2/x86_64.zig+4-1
...@@ -1183,7 +1183,10 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -1183,7 +1183,10 @@ pub fn addCases(ctx: *TestContext) !void {
1183 \\ if (a == 10) @compileError("bad");1183 \\ if (a == 10) @compileError("bad");
1184 \\ return a + b + c;1184 \\ return a + b + c;
1185 \\}1185 \\}
1186 , &[_][]const u8{":8:18: error: bad"});1186 , &[_][]const u8{
1187 ":8:18: error: bad",
1188 ":3:18: note: called from here",
1189 });
11871190
1188 case.addCompareOutput(1191 case.addCompareOutput(
1189 \\pub fn main() void {1192 \\pub fn main() void {