authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-02-19 10:10:59-05:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2023-02-19 10:10:59-05:00
log0bb178bbb2451238a326c6e916ecf38fbc34cab1
treeb2499481c929ba1497d6eef8b85cc46205f953ab
parent346ec15c5005e523c2a1d4b967ee7a4e5d1e9775
parent5fc6bbe71eeecb195d2cda2a2522e7fd04749d5b
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #14671 from ziglang/multi-object-for

implement multi-object for loops

253 files changed, 2381 insertions(+), 1277 deletions(-)

doc/docgen.zig+1-1
......@@ -239,7 +239,7 @@ const Tokenizer = struct {
239239 .line_start = 0,
240240 .line_end = 0,
241241 };
242 for (self.buffer) |c, i| {
242 for (self.buffer, 0..) |c, i| {
243243 if (i == token.start) {
244244 loc.line_end = i;
245245 while (loc.line_end < self.buffer.len and self.buffer[loc.line_end] != '\n') : (loc.line_end += 1) {}
doc/langref.html.in+17-17
......@@ -2367,7 +2367,7 @@ test "iterate over an array" {
23672367var some_integers: [100]i32 = undefined;
23682368
23692369test "modify an array" {
2370 for (some_integers) |*item, i| {
2370 for (&some_integers, 0..) |*item, i| {
23712371 item.* = @intCast(i32, i);
23722372 }
23732373 try expect(some_integers[10] == 10);
......@@ -2408,7 +2408,7 @@ comptime {
24082408// use compile-time code to initialize an array
24092409var fancy_array = init: {
24102410 var initial_value: [10]Point = undefined;
2411 for (initial_value) |*pt, i| {
2411 for (&initial_value, 0..) |*pt, i| {
24122412 pt.* = Point{
24132413 .x = @intCast(i32, i),
24142414 .y = @intCast(i32, i) * 2,
......@@ -2461,8 +2461,8 @@ test "multidimensional arrays" {
24612461 try expect(mat4x4[1][1] == 1.0);
24622462
24632463 // Here we iterate with for loops.
2464 for (mat4x4) |row, row_index| {
2465 for (row) |cell, column_index| {
2464 for (mat4x4, 0..) |row, row_index| {
2465 for (row, 0..) |cell, column_index| {
24662466 if (row_index == column_index) {
24672467 try expect(cell == 1.0);
24682468 }
......@@ -3579,7 +3579,7 @@ test "tuple" {
35793579 } ++ .{false} ** 2;
35803580 try expect(values[0] == 1234);
35813581 try expect(values[4] == false);
3582 inline for (values) |v, i| {
3582 inline for (values, 0..) |v, i| {
35833583 if (i != 2) continue;
35843584 try expect(v);
35853585 }
......@@ -4659,10 +4659,10 @@ test "for basics" {
46594659 }
46604660 try expect(sum == 20);
46614661
4662 // To access the index of iteration, specify a second capture value.
4663 // This is zero-indexed.
4662 // To access the index of iteration, specify a second condition as well
4663 // as a second capture value.
46644664 var sum2: i32 = 0;
4665 for (items) |_, i| {
4665 for (items, 0..) |_, i| {
46664666 try expect(@TypeOf(i) == usize);
46674667 sum2 += @intCast(i32, i);
46684668 }
......@@ -4674,7 +4674,7 @@ test "for reference" {
46744674
46754675 // Iterate over the slice by reference by
46764676 // specifying that the capture value is a pointer.
4677 for (items) |*value| {
4677 for (&items) |*value| {
46784678 value.* += 1;
46794679 }
46804680
......@@ -5659,7 +5659,7 @@ fn genFoos(allocator: Allocator, num: usize) ![]Foo {
56595659 var foos = try allocator.alloc(Foo, num);
56605660 errdefer allocator.free(foos);
56615661
5662 for(foos) |*foo, i| {
5662 for (foos, 0..) |*foo, i| {
56635663 foo.data = try allocator.create(u32);
56645664 // This errdefer does not last between iterations
56655665 errdefer allocator.destroy(foo.data);
......@@ -5700,14 +5700,14 @@ fn genFoos(allocator: Allocator, num: usize) ![]Foo {
57005700 // Used to track how many foos have been initialized
57015701 // (including their data being allocated)
57025702 var num_allocated: usize = 0;
5703 errdefer for(foos[0..num_allocated]) |foo| {
5703 errdefer for (foos[0..num_allocated]) |foo| {
57045704 allocator.destroy(foo.data);
57055705 };
5706 for(foos) |*foo, i| {
5706 for (foos, 0..) |*foo, i| {
57075707 foo.data = try allocator.create(u32);
57085708 num_allocated += 1;
57095709
5710 if(i >= 3) return error.TooManyFoos;
5710 if (i >= 3) return error.TooManyFoos;
57115711
57125712 foo.data.* = try getData();
57135713 }
......@@ -7265,7 +7265,7 @@ const Writer = struct {
72657265 comptime var state = State.start;
72667266 comptime var next_arg: usize = 0;
72677267
7268 inline for (format) |c, i| {
7268 inline for (format, 0..) |c, i| {
72697269 switch (state) {
72707270 State.start => switch (c) {
72717271 '{' => {
......@@ -8629,7 +8629,7 @@ test "integer cast panic" {
86298629 This function is a low level intrinsic with no safety mechanisms. Most code
86308630 should not use this function, instead using something like this:
86318631 </p>
8632 <pre>{#syntax#}for (source[0..byte_count]) |b, i| dest[i] = b;{#endsyntax#}</pre>
8632 <pre>{#syntax#}for (dest, source[0..byte_count]) |*d, s| d.* = s;{#endsyntax#}</pre>
86338633 <p>
86348634 The optimizer is intelligent enough to turn the above snippet into a memcpy.
86358635 </p>
......@@ -11116,7 +11116,7 @@ pub fn main() !void {
1111611116 const args = try std.process.argsAlloc(gpa);
1111711117 defer std.process.argsFree(gpa, args);
1111811118
11119 for (args) |arg, i| {
11119 for (args, 0..) |arg, i| {
1112011120 std.debug.print("{}: {s}\n", .{ i, arg });
1112111121 }
1112211122}
......@@ -11142,7 +11142,7 @@ pub fn main() !void {
1114211142
1114311143 const preopens = try fs.wasi.preopensAlloc(arena);
1114411144
11145 for (preopens.names) |preopen, i| {
11145 for (preopens.names, 0..) |preopen, i| {
1114611146 std.debug.print("{}: {s}\n", .{ i, preopen });
1114711147 }
1114811148}
lib/compiler_rt/atomics.zig+1-1
......@@ -151,7 +151,7 @@ fn __atomic_compare_exchange(
151151 _ = failure;
152152 var sl = spinlocks.get(@ptrToInt(ptr));
153153 defer sl.release();
154 for (ptr[0..size]) |b, i| {
154 for (ptr[0..size], 0..) |b, i| {
155155 if (expected[i] != b) break;
156156 } else {
157157 // The two objects, ptr and expected, are equal
lib/compiler_rt/comparedf2_test.zig+2-2
......@@ -94,8 +94,8 @@ fn generateVector(comptime a: f64, comptime b: f64) TestVector {
9494const test_vectors = init: {
9595 @setEvalBranchQuota(10000);
9696 var vectors: [arguments.len * arguments.len]TestVector = undefined;
97 for (arguments[0..]) |arg_i, i| {
98 for (arguments[0..]) |arg_j, j| {
97 for (arguments[0..], 0..) |arg_i, i| {
98 for (arguments[0..], 0..) |arg_j, j| {
9999 vectors[(i * arguments.len) + j] = generateVector(arg_i, arg_j);
100100 }
101101 }
lib/compiler_rt/comparesf2_test.zig+2-2
......@@ -94,8 +94,8 @@ fn generateVector(comptime a: f32, comptime b: f32) TestVector {
9494const test_vectors = init: {
9595 @setEvalBranchQuota(10000);
9696 var vectors: [arguments.len * arguments.len]TestVector = undefined;
97 for (arguments[0..]) |arg_i, i| {
98 for (arguments[0..]) |arg_j, j| {
97 for (arguments[0..], 0..) |arg_i, i| {
98 for (arguments[0..], 0..) |arg_j, j| {
9999 vectors[(i * arguments.len) + j] = generateVector(arg_i, arg_j);
100100 }
101101 }
lib/std/Build.zig+4-4
......@@ -650,7 +650,7 @@ pub fn dupe(self: *Build, bytes: []const u8) []u8 {
650650/// Duplicates an array of strings without the need to handle out of memory.
651651pub fn dupeStrings(self: *Build, strings: []const []const u8) [][]u8 {
652652 const array = self.allocator.alloc([]u8, strings.len) catch @panic("OOM");
653 for (strings) |s, i| {
653 for (strings, 0..) |s, i| {
654654 array[i] = self.dupe(s);
655655 }
656656 return array;
......@@ -1051,7 +1051,7 @@ pub fn standardTargetOptions(self: *Build, args: StandardTargetOptionsArgs) Cros
10511051 const all_features = whitelist_cpu.arch.allFeaturesList();
10521052 var populated_cpu_features = whitelist_cpu.model.features;
10531053 populated_cpu_features.populateDependencies(all_features);
1054 for (all_features) |feature, i_usize| {
1054 for (all_features, 0..) |feature, i_usize| {
10551055 const i = @intCast(std.Target.Cpu.Feature.Set.Index, i_usize);
10561056 const in_cpu_set = populated_cpu_features.isEnabled(i);
10571057 if (in_cpu_set) {
......@@ -1059,7 +1059,7 @@ pub fn standardTargetOptions(self: *Build, args: StandardTargetOptionsArgs) Cros
10591059 }
10601060 }
10611061 log.err(" Remove: ", .{});
1062 for (all_features) |feature, i_usize| {
1062 for (all_features, 0..) |feature, i_usize| {
10631063 const i = @intCast(std.Target.Cpu.Feature.Set.Index, i_usize);
10641064 const in_cpu_set = populated_cpu_features.isEnabled(i);
10651065 const in_actual_set = selected_cpu.features.isEnabled(i);
......@@ -1748,7 +1748,7 @@ pub fn serializeCpu(allocator: Allocator, cpu: std.Target.Cpu) ![]const u8 {
17481748 var mcpu_buffer = ArrayList(u8).init(allocator);
17491749 try mcpu_buffer.appendSlice(cpu.model.name);
17501750
1751 for (all_features) |feature, i_usize| {
1751 for (all_features, 0..) |feature, i_usize| {
17521752 const i = @intCast(std.Target.Cpu.Feature.Set.Index, i_usize);
17531753 const in_cpu_set = populated_cpu_features.isEnabled(i);
17541754 const in_actual_set = cpu.features.isEnabled(i);
lib/std/Build/CompileStep.zig+4-4
......@@ -1016,7 +1016,7 @@ pub fn addVcpkgPaths(self: *CompileStep, linkage: CompileStep.Linkage) !void {
10161016pub fn setExecCmd(self: *CompileStep, args: []const ?[]const u8) void {
10171017 assert(self.kind == .@"test");
10181018 const duped_args = self.builder.allocator.alloc(?[]u8, args.len) catch @panic("OOM");
1019 for (args) |arg, i| {
1019 for (args, 0..) |arg, i| {
10201020 duped_args[i] = if (arg) |a| self.builder.dupe(a) else null;
10211021 }
10221022 self.exec_cmd_args = duped_args;
......@@ -1040,7 +1040,7 @@ fn appendModuleArgs(
10401040
10411041 {
10421042 const keys = module.dependencies.keys();
1043 for (module.dependencies.values()) |sub_module, i| {
1043 for (module.dependencies.values(), 0..) |sub_module, i| {
10441044 const sub_name = keys[i];
10451045 try cs.appendModuleArgs(zig_args, sub_name, sub_module);
10461046 }
......@@ -1575,7 +1575,7 @@ fn make(step: *Step) !void {
15751575
15761576 {
15771577 const keys = self.modules.keys();
1578 for (self.modules.values()) |module, i| {
1578 for (self.modules.values(), 0..) |module, i| {
15791579 const name = keys[i];
15801580 try self.appendModuleArgs(&zig_args, name, module);
15811581 }
......@@ -1750,7 +1750,7 @@ fn make(step: *Step) !void {
17501750 const args_to_escape = zig_args.items[2..];
17511751 var escaped_args = try ArrayList([]const u8).initCapacity(builder.allocator, args_to_escape.len);
17521752 arg_blk: for (args_to_escape) |arg| {
1753 for (arg) |c, arg_idx| {
1753 for (arg, 0..) |c, arg_idx| {
17541754 if (c == '\\' or c == '"') {
17551755 // Slow path for arguments that need to be escaped. We'll need to allocate and copy
17561756 var escaped = try ArrayList(u8).initCapacity(builder.allocator, arg.len + 1);
lib/std/Build/ConfigHeaderStep.zig+2-2
......@@ -350,7 +350,7 @@ fn render_blank(
350350 try output.appendSlice("\n");
351351
352352 const values = defines.values();
353 for (defines.keys()) |name, i| {
353 for (defines.keys(), 0..) |name, i| {
354354 try renderValueC(output, name, values[i]);
355355 }
356356
......@@ -361,7 +361,7 @@ fn render_blank(
361361
362362fn render_nasm(output: *std.ArrayList(u8), defines: std.StringArrayHashMap(Value)) !void {
363363 const values = defines.values();
364 for (defines.keys()) |name, i| {
364 for (defines.keys(), 0..) |name, i| {
365365 try renderValueNasm(output, name, values[i]);
366366 }
367367}
lib/std/Build/FmtStep.zig+1-1
......@@ -19,7 +19,7 @@ pub fn create(builder: *std.Build, paths: []const []const u8) *FmtStep {
1919
2020 self.argv[0] = builder.zig_exe;
2121 self.argv[1] = "fmt";
22 for (paths) |path, i| {
22 for (paths, 0..) |path, i| {
2323 self.argv[2 + i] = builder.pathFromRoot(path);
2424 }
2525 return self;
lib/std/Thread/Condition.zig+6-6
......@@ -341,7 +341,7 @@ test "Condition - wait and signal" {
341341 };
342342
343343 var multi_wait = MultiWait{};
344 for (multi_wait.threads) |*t| {
344 for (&multi_wait.threads) |*t| {
345345 t.* = try std.Thread.spawn(.{}, MultiWait.run, .{&multi_wait});
346346 }
347347
......@@ -389,7 +389,7 @@ test "Condition - signal" {
389389 };
390390
391391 var signal_test = SignalTest{};
392 for (signal_test.threads) |*t| {
392 for (&signal_test.threads) |*t| {
393393 t.* = try std.Thread.spawn(.{}, SignalTest.run, .{&signal_test});
394394 }
395395
......@@ -457,7 +457,7 @@ test "Condition - multi signal" {
457457 var threads = [_]std.Thread{undefined} ** num_threads;
458458
459459 // Create a circle of paddles which hit each other
460 for (threads) |*t, i| {
460 for (&threads, 0..) |*t, i| {
461461 const paddle = &paddles[i];
462462 const hit_to = &paddles[(i + 1) % paddles.len];
463463 t.* = try std.Thread.spawn(.{}, Paddle.run, .{ paddle, hit_to });
......@@ -468,7 +468,7 @@ test "Condition - multi signal" {
468468 for (threads) |t| t.join();
469469
470470 // The first paddle will be hit one last time by the last paddle.
471 for (paddles) |p, i| {
471 for (paddles, 0..) |p, i| {
472472 const expected = @as(u32, num_iterations) + @boolToInt(i == 0);
473473 try testing.expectEqual(p.value, expected);
474474 }
......@@ -513,7 +513,7 @@ test "Condition - broadcasting" {
513513 };
514514
515515 var broadcast_test = BroadcastTest{};
516 for (broadcast_test.threads) |*t| {
516 for (&broadcast_test.threads) |*t| {
517517 t.* = try std.Thread.spawn(.{}, BroadcastTest.run, .{&broadcast_test});
518518 }
519519
......@@ -584,7 +584,7 @@ test "Condition - broadcasting - wake all threads" {
584584
585585 var broadcast_test = BroadcastTest{};
586586 var thread_id: usize = 1;
587 for (broadcast_test.threads) |*t| {
587 for (&broadcast_test.threads) |*t| {
588588 t.* = try std.Thread.spawn(.{}, BroadcastTest.run, .{ &broadcast_test, thread_id });
589589 thread_id += 1;
590590 }
lib/std/Thread/Futex.zig+3-3
......@@ -895,7 +895,7 @@ test "Futex - signaling" {
895895 var threads = [_]std.Thread{undefined} ** num_threads;
896896
897897 // Create a circle of paddles which hit each other
898 for (threads) |*t, i| {
898 for (&threads, 0..) |*t, i| {
899899 const paddle = &paddles[i];
900900 const hit_to = &paddles[(i + 1) % paddles.len];
901901 t.* = try std.Thread.spawn(.{}, Paddle.run, .{ paddle, hit_to });
......@@ -950,14 +950,14 @@ test "Futex - broadcasting" {
950950 threads: [num_threads]std.Thread = undefined,
951951
952952 fn run(self: *@This()) !void {
953 for (self.barriers) |*barrier| {
953 for (&self.barriers) |*barrier| {
954954 try barrier.wait();
955955 }
956956 }
957957 };
958958
959959 var broadcast = Broadcast{};
960 for (broadcast.threads) |*t| t.* = try std.Thread.spawn(.{}, Broadcast.run, .{&broadcast});
960 for (&broadcast.threads) |*t| t.* = try std.Thread.spawn(.{}, Broadcast.run, .{&broadcast});
961961 for (broadcast.threads) |t| t.join();
962962}
963963
lib/std/Thread/Mutex.zig+3-3
......@@ -245,7 +245,7 @@ const NonAtomicCounter = struct {
245245 }
246246
247247 fn inc(self: *NonAtomicCounter) void {
248 for (@bitCast([2]u64, self.get() + 1)) |v, i| {
248 for (@bitCast([2]u64, self.get() + 1), 0..) |v, i| {
249249 @ptrCast(*volatile u64, &self.value[i]).* = v;
250250 }
251251 }
......@@ -277,7 +277,7 @@ test "Mutex - many uncontended" {
277277 };
278278
279279 var runners = [_]Runner{.{}} ** num_threads;
280 for (runners) |*r| r.thread = try Thread.spawn(.{}, Runner.run, .{r});
280 for (&runners) |*r| r.thread = try Thread.spawn(.{}, Runner.run, .{r});
281281 for (runners) |r| r.thread.join();
282282 for (runners) |r| try testing.expectEqual(r.counter.get(), num_increments);
283283}
......@@ -312,7 +312,7 @@ test "Mutex - many contended" {
312312 var runner = Runner{};
313313
314314 var threads: [num_threads]Thread = undefined;
315 for (threads) |*t| t.* = try Thread.spawn(.{}, Runner.run, .{&runner});
315 for (&threads) |*t| t.* = try Thread.spawn(.{}, Runner.run, .{&runner});
316316 for (threads) |t| t.join();
317317
318318 try testing.expectEqual(runner.counter.get(), num_increments * num_threads);
lib/std/Thread/ResetEvent.zig+1-1
......@@ -274,7 +274,7 @@ test "ResetEvent - broadcast" {
274274 var ctx = Context{};
275275 var threads: [num_threads - 1]std.Thread = undefined;
276276
277 for (threads) |*t| t.* = try std.Thread.spawn(.{}, Context.run, .{&ctx});
277 for (&threads) |*t| t.* = try std.Thread.spawn(.{}, Context.run, .{&ctx});
278278 defer for (threads) |t| t.join();
279279
280280 ctx.run();
lib/std/Thread/RwLock.zig+1-1
......@@ -364,7 +364,7 @@ test "RwLock - concurrent access" {
364364 var runner = Runner{};
365365 var threads: [num_writers + num_readers]std.Thread = undefined;
366366
367 for (threads[0..num_writers]) |*t, i| t.* = try std.Thread.spawn(.{}, Runner.writer, .{ &runner, i });
367 for (threads[0..num_writers], 0..) |*t, i| t.* = try std.Thread.spawn(.{}, Runner.writer, .{ &runner, i });
368368 for (threads[num_writers..]) |*t| t.* = try std.Thread.spawn(.{}, Runner.reader, .{&runner});
369369
370370 for (threads) |t| t.join();
lib/std/Thread/Semaphore.zig+1-1
......@@ -54,7 +54,7 @@ test "Thread.Semaphore" {
5454 var n: i32 = 0;
5555 var ctx = TestContext{ .sem = &sem, .n = &n };
5656
57 for (threads) |*t| t.* = try std.Thread.spawn(.{}, TestContext.worker, .{&ctx});
57 for (&threads) |*t| t.* = try std.Thread.spawn(.{}, TestContext.worker, .{&ctx});
5858 for (threads) |t| t.join();
5959 sem.wait();
6060 try testing.expect(n == num_threads);
lib/std/array_hash_map.zig+10-10
......@@ -715,7 +715,7 @@ pub fn ArrayHashMapUnmanaged(
715715 const slice = self.entries.slice();
716716 const hashes_array = slice.items(.hash);
717717 const keys_array = slice.items(.key);
718 for (keys_array) |*item_key, i| {
718 for (keys_array, 0..) |*item_key, i| {
719719 if (hashes_array[i] == h and checkedEql(ctx, key, item_key.*, i)) {
720720 return GetOrPutResult{
721721 .key_ptr = item_key,
......@@ -946,7 +946,7 @@ pub fn ArrayHashMapUnmanaged(
946946 const slice = self.entries.slice();
947947 const hashes_array = slice.items(.hash);
948948 const keys_array = slice.items(.key);
949 for (keys_array) |*item_key, i| {
949 for (keys_array, 0..) |*item_key, i| {
950950 if (hashes_array[i] == h and checkedEql(ctx, key, item_key.*, i)) {
951951 return i;
952952 }
......@@ -1285,7 +1285,7 @@ pub fn ArrayHashMapUnmanaged(
12851285 const slice = self.entries.slice();
12861286 const hashes_array = if (store_hash) slice.items(.hash) else {};
12871287 const keys_array = slice.items(.key);
1288 for (keys_array) |*item_key, i| {
1288 for (keys_array, 0..) |*item_key, i| {
12891289 const hash_match = if (store_hash) hashes_array[i] == key_hash else true;
12901290 if (hash_match and key_ctx.eql(key, item_key.*, i)) {
12911291 const removed_entry: KV = .{
......@@ -1326,7 +1326,7 @@ pub fn ArrayHashMapUnmanaged(
13261326 const slice = self.entries.slice();
13271327 const hashes_array = if (store_hash) slice.items(.hash) else {};
13281328 const keys_array = slice.items(.key);
1329 for (keys_array) |*item_key, i| {
1329 for (keys_array, 0..) |*item_key, i| {
13301330 const hash_match = if (store_hash) hashes_array[i] == key_hash else true;
13311331 if (hash_match and key_ctx.eql(key, item_key.*, i)) {
13321332 switch (removal_type) {
......@@ -1634,7 +1634,7 @@ pub fn ArrayHashMapUnmanaged(
16341634 const items = if (store_hash) slice.items(.hash) else slice.items(.key);
16351635 const indexes = header.indexes(I);
16361636
1637 entry_loop: for (items) |key, i| {
1637 entry_loop: for (items, 0..) |key, i| {
16381638 const h = if (store_hash) key else checkedHash(ctx, key);
16391639 const start_index = safeTruncate(usize, h);
16401640 const end_index = start_index +% indexes.len;
......@@ -1730,7 +1730,7 @@ pub fn ArrayHashMapUnmanaged(
17301730 const indexes = header.indexes(I);
17311731 if (indexes.len == 0) return;
17321732 var is_empty = false;
1733 for (indexes) |idx, i| {
1733 for (indexes, 0..) |idx, i| {
17341734 if (idx.isEmpty()) {
17351735 is_empty = true;
17361736 } else {
......@@ -1826,7 +1826,7 @@ const min_bit_index = 5;
18261826const max_capacity = (1 << max_bit_index) - 1;
18271827const index_capacities = blk: {
18281828 var caps: [max_bit_index + 1]u32 = undefined;
1829 for (caps[0..max_bit_index]) |*item, i| {
1829 for (caps[0..max_bit_index], 0..) |*item, i| {
18301830 item.* = (1 << i) * 3 / 5;
18311831 }
18321832 caps[max_bit_index] = max_capacity;
......@@ -2025,7 +2025,7 @@ test "iterator hash map" {
20252025 try testing.expect(count == 3);
20262026 try testing.expect(it.next() == null);
20272027
2028 for (buffer) |_, i| {
2028 for (buffer, 0..) |_, i| {
20292029 try testing.expect(buffer[@intCast(usize, keys[i])] == values[i]);
20302030 }
20312031
......@@ -2037,7 +2037,7 @@ test "iterator hash map" {
20372037 if (count >= 2) break;
20382038 }
20392039
2040 for (buffer[0..2]) |_, i| {
2040 for (buffer[0..2], 0..) |_, i| {
20412041 try testing.expect(buffer[@intCast(usize, keys[i])] == values[i]);
20422042 }
20432043
......@@ -2299,7 +2299,7 @@ test "sort" {
22992299 map.sort(C{ .keys = map.keys() });
23002300
23012301 var x: i32 = 1;
2302 for (map.keys()) |key, i| {
2302 for (map.keys(), 0..) |key, i| {
23032303 try testing.expect(key == x);
23042304 try testing.expect(map.values()[i] == x * 3);
23052305 x += 1;
lib/std/array_list.zig+5-5
......@@ -183,7 +183,7 @@ pub fn ArrayListAligned(comptime T: type, comptime alignment: ?u29) type {
183183 mem.copy(T, range, new_items);
184184 const after_subrange = start + new_items.len;
185185
186 for (self.items[after_range..]) |item, i| {
186 for (self.items[after_range..], 0..) |item, i| {
187187 self.items[after_subrange..][i] = item;
188188 }
189189
......@@ -216,7 +216,7 @@ pub fn ArrayListAligned(comptime T: type, comptime alignment: ?u29) type {
216216 if (newlen == i) return self.pop();
217217
218218 const old_item = self.items[i];
219 for (self.items[i..newlen]) |*b, j| b.* = self.items[i + 1 + j];
219 for (self.items[i..newlen], 0..) |*b, j| b.* = self.items[i + 1 + j];
220220 self.items[newlen] = undefined;
221221 self.items.len = newlen;
222222 return old_item;
......@@ -666,7 +666,7 @@ pub fn ArrayListAlignedUnmanaged(comptime T: type, comptime alignment: ?u29) typ
666666 if (newlen == i) return self.pop();
667667
668668 const old_item = self.items[i];
669 for (self.items[i..newlen]) |*b, j| b.* = self.items[i + 1 + j];
669 for (self.items[i..newlen], 0..) |*b, j| b.* = self.items[i + 1 + j];
670670 self.items[newlen] = undefined;
671671 self.items.len = newlen;
672672 return old_item;
......@@ -1069,7 +1069,7 @@ test "std.ArrayList/ArrayListUnmanaged.basic" {
10691069 }
10701070 }
10711071
1072 for (list.items) |v, i| {
1072 for (list.items, 0..) |v, i| {
10731073 try testing.expect(v == @intCast(i32, i + 1));
10741074 }
10751075
......@@ -1119,7 +1119,7 @@ test "std.ArrayList/ArrayListUnmanaged.basic" {
11191119 }
11201120 }
11211121
1122 for (list.items) |v, i| {
1122 for (list.items, 0..) |v, i| {
11231123 try testing.expect(v == @intCast(i32, i + 1));
11241124 }
11251125
lib/std/ascii.zig+3-3
......@@ -272,7 +272,7 @@ test "ASCII character classes" {
272272/// Asserts `output.len >= ascii_string.len`.
273273pub fn lowerString(output: []u8, ascii_string: []const u8) []u8 {
274274 std.debug.assert(output.len >= ascii_string.len);
275 for (ascii_string) |c, i| {
275 for (ascii_string, 0..) |c, i| {
276276 output[i] = toLower(c);
277277 }
278278 return output[0..ascii_string.len];
......@@ -301,7 +301,7 @@ test "allocLowerString" {
301301/// Asserts `output.len >= ascii_string.len`.
302302pub fn upperString(output: []u8, ascii_string: []const u8) []u8 {
303303 std.debug.assert(output.len >= ascii_string.len);
304 for (ascii_string) |c, i| {
304 for (ascii_string, 0..) |c, i| {
305305 output[i] = toUpper(c);
306306 }
307307 return output[0..ascii_string.len];
......@@ -329,7 +329,7 @@ test "allocUpperString" {
329329/// Compares strings `a` and `b` case-insensitively and returns whether they are equal.
330330pub fn eqlIgnoreCase(a: []const u8, b: []const u8) bool {
331331 if (a.len != b.len) return false;
332 for (a) |a_c, i| {
332 for (a, 0..) |a_c, i| {
333333 if (toLower(a_c) != toLower(b[i])) return false;
334334 }
335335 return true;
lib/std/atomic/Atomic.zig+6-6
......@@ -548,7 +548,7 @@ test "Atomic.bitSet" {
548548 var x = Atomic(Int).init(0);
549549 const bit_array = @as([@bitSizeOf(Int)]void, undefined);
550550
551 for (bit_array) |_, bit_index| {
551 for (bit_array, 0..) |_, bit_index| {
552552 const bit = @intCast(std.math.Log2Int(Int), bit_index);
553553 const mask = @as(Int, 1) << bit;
554554
......@@ -562,7 +562,7 @@ test "Atomic.bitSet" {
562562 try testing.expect(x.load(.SeqCst) & mask != 0);
563563
564564 // all the previous bits should have not changed (still be set)
565 for (bit_array[0..bit_index]) |_, prev_bit_index| {
565 for (bit_array[0..bit_index], 0..) |_, prev_bit_index| {
566566 const prev_bit = @intCast(std.math.Log2Int(Int), prev_bit_index);
567567 const prev_mask = @as(Int, 1) << prev_bit;
568568 try testing.expect(x.load(.SeqCst) & prev_mask != 0);
......@@ -578,7 +578,7 @@ test "Atomic.bitReset" {
578578 var x = Atomic(Int).init(0);
579579 const bit_array = @as([@bitSizeOf(Int)]void, undefined);
580580
581 for (bit_array) |_, bit_index| {
581 for (bit_array, 0..) |_, bit_index| {
582582 const bit = @intCast(std.math.Log2Int(Int), bit_index);
583583 const mask = @as(Int, 1) << bit;
584584 x.storeUnchecked(x.loadUnchecked() | mask);
......@@ -593,7 +593,7 @@ test "Atomic.bitReset" {
593593 try testing.expect(x.load(.SeqCst) & mask == 0);
594594
595595 // all the previous bits should have not changed (still be reset)
596 for (bit_array[0..bit_index]) |_, prev_bit_index| {
596 for (bit_array[0..bit_index], 0..) |_, prev_bit_index| {
597597 const prev_bit = @intCast(std.math.Log2Int(Int), prev_bit_index);
598598 const prev_mask = @as(Int, 1) << prev_bit;
599599 try testing.expect(x.load(.SeqCst) & prev_mask == 0);
......@@ -609,7 +609,7 @@ test "Atomic.bitToggle" {
609609 var x = Atomic(Int).init(0);
610610 const bit_array = @as([@bitSizeOf(Int)]void, undefined);
611611
612 for (bit_array) |_, bit_index| {
612 for (bit_array, 0..) |_, bit_index| {
613613 const bit = @intCast(std.math.Log2Int(Int), bit_index);
614614 const mask = @as(Int, 1) << bit;
615615
......@@ -623,7 +623,7 @@ test "Atomic.bitToggle" {
623623 try testing.expect(x.load(.SeqCst) & mask == 0);
624624
625625 // all the previous bits should have not changed (still be toggled back)
626 for (bit_array[0..bit_index]) |_, prev_bit_index| {
626 for (bit_array[0..bit_index], 0..) |_, prev_bit_index| {
627627 const prev_bit = @intCast(std.math.Log2Int(Int), prev_bit_index);
628628 const prev_mask = @as(Int, 1) << prev_bit;
629629 try testing.expect(x.load(.SeqCst) & prev_mask == 0);
lib/std/atomic/queue.zig+2-2
......@@ -212,11 +212,11 @@ test "std.atomic.Queue" {
212212 try expect(context.queue.isEmpty());
213213
214214 var putters: [put_thread_count]std.Thread = undefined;
215 for (putters) |*t| {
215 for (&putters) |*t| {
216216 t.* = try std.Thread.spawn(.{}, startPuts, .{&context});
217217 }
218218 var getters: [put_thread_count]std.Thread = undefined;
219 for (getters) |*t| {
219 for (&getters) |*t| {
220220 t.* = try std.Thread.spawn(.{}, startGets, .{&context});
221221 }
222222
lib/std/atomic/stack.zig+2-2
......@@ -117,11 +117,11 @@ test "std.atomic.stack" {
117117 }
118118 } else {
119119 var putters: [put_thread_count]std.Thread = undefined;
120 for (putters) |*t| {
120 for (&putters) |*t| {
121121 t.* = try std.Thread.spawn(.{}, startPuts, .{&context});
122122 }
123123 var getters: [put_thread_count]std.Thread = undefined;
124 for (getters) |*t| {
124 for (&getters) |*t| {
125125 t.* = try std.Thread.spawn(.{}, startGets, .{&context});
126126 }
127127
lib/std/base64.zig+3-3
......@@ -140,7 +140,7 @@ pub const Base64Decoder = struct {
140140 };
141141
142142 var char_in_alphabet = [_]bool{false} ** 256;
143 for (alphabet_chars) |c, i| {
143 for (alphabet_chars, 0..) |c, i| {
144144 assert(!char_in_alphabet[c]);
145145 assert(pad_char == null or c != pad_char.?);
146146
......@@ -185,7 +185,7 @@ pub const Base64Decoder = struct {
185185 var acc_len: u4 = 0;
186186 var dest_idx: usize = 0;
187187 var leftover_idx: ?usize = null;
188 for (source) |c, src_idx| {
188 for (source, 0..) |c, src_idx| {
189189 const d = decoder.char_to_index[c];
190190 if (d == invalid_char) {
191191 if (decoder.pad_char == null or c != decoder.pad_char.?) return error.InvalidCharacter;
......@@ -258,7 +258,7 @@ pub const Base64DecoderWithIgnore = struct {
258258 var acc_len: u4 = 0;
259259 var dest_idx: usize = 0;
260260 var leftover_idx: ?usize = null;
261 for (source) |c, src_idx| {
261 for (source, 0..) |c, src_idx| {
262262 if (decoder_with_ignore.char_is_ignored[c]) continue;
263263 const d = decoder.char_to_index[c];
264264 if (d == Base64Decoder.invalid_char) {
lib/std/bit_set.zig+8-8
......@@ -494,14 +494,14 @@ pub fn ArrayBitSet(comptime MaskIntType: type, comptime size: usize) type {
494494 /// Flips all bits in this bit set which are present
495495 /// in the toggles bit set.
496496 pub fn toggleSet(self: *Self, toggles: Self) void {
497 for (self.masks) |*mask, i| {
497 for (&self.masks, 0..) |*mask, i| {
498498 mask.* ^= toggles.masks[i];
499499 }
500500 }
501501
502502 /// Flips every bit in the bit set.
503503 pub fn toggleAll(self: *Self) void {
504 for (self.masks) |*mask| {
504 for (&self.masks) |*mask| {
505505 mask.* = ~mask.*;
506506 }
507507
......@@ -515,7 +515,7 @@ pub fn ArrayBitSet(comptime MaskIntType: type, comptime size: usize) type {
515515 /// result in the first one. Bits in the result are
516516 /// set if the corresponding bits were set in either input.
517517 pub fn setUnion(self: *Self, other: Self) void {
518 for (self.masks) |*mask, i| {
518 for (&self.masks, 0..) |*mask, i| {
519519 mask.* |= other.masks[i];
520520 }
521521 }
......@@ -524,7 +524,7 @@ pub fn ArrayBitSet(comptime MaskIntType: type, comptime size: usize) type {
524524 /// the result in the first one. Bits in the result are
525525 /// set if the corresponding bits were set in both inputs.
526526 pub fn setIntersection(self: *Self, other: Self) void {
527 for (self.masks) |*mask, i| {
527 for (&self.masks, 0..) |*mask, i| {
528528 mask.* &= other.masks[i];
529529 }
530530 }
......@@ -544,7 +544,7 @@ pub fn ArrayBitSet(comptime MaskIntType: type, comptime size: usize) type {
544544 /// If no bits are set, returns null.
545545 pub fn toggleFirstSet(self: *Self) ?usize {
546546 var offset: usize = 0;
547 const mask = for (self.masks) |*mask| {
547 const mask = for (&self.masks) |*mask| {
548548 if (mask.* != 0) break mask;
549549 offset += @bitSizeOf(MaskInt);
550550 } else return null;
......@@ -869,7 +869,7 @@ pub const DynamicBitSetUnmanaged = struct {
869869 pub fn toggleSet(self: *Self, toggles: Self) void {
870870 assert(toggles.bit_length == self.bit_length);
871871 const num_masks = numMasks(self.bit_length);
872 for (self.masks[0..num_masks]) |*mask, i| {
872 for (self.masks[0..num_masks], 0..) |*mask, i| {
873873 mask.* ^= toggles.masks[i];
874874 }
875875 }
......@@ -897,7 +897,7 @@ pub const DynamicBitSetUnmanaged = struct {
897897 pub fn setUnion(self: *Self, other: Self) void {
898898 assert(other.bit_length == self.bit_length);
899899 const num_masks = numMasks(self.bit_length);
900 for (self.masks[0..num_masks]) |*mask, i| {
900 for (self.masks[0..num_masks], 0..) |*mask, i| {
901901 mask.* |= other.masks[i];
902902 }
903903 }
......@@ -909,7 +909,7 @@ pub const DynamicBitSetUnmanaged = struct {
909909 pub fn setIntersection(self: *Self, other: Self) void {
910910 assert(other.bit_length == self.bit_length);
911911 const num_masks = numMasks(self.bit_length);
912 for (self.masks[0..num_masks]) |*mask, i| {
912 for (self.masks[0..num_masks], 0..) |*mask, i| {
913913 mask.* &= other.masks[i];
914914 }
915915 }
lib/std/bounded_array.zig+2-2
......@@ -169,7 +169,7 @@ pub fn BoundedArray(comptime T: type, comptime buffer_capacity: usize) type {
169169 } else {
170170 mem.copy(T, range, new_items);
171171 const after_subrange = start + new_items.len;
172 for (self.constSlice()[after_range..]) |item, i| {
172 for (self.constSlice()[after_range..], 0..) |item, i| {
173173 self.slice()[after_subrange..][i] = item;
174174 }
175175 self.len -= len - new_items.len;
......@@ -197,7 +197,7 @@ pub fn BoundedArray(comptime T: type, comptime buffer_capacity: usize) type {
197197 const newlen = self.len - 1;
198198 if (newlen == i) return self.pop();
199199 const old_item = self.get(i);
200 for (self.slice()[i..newlen]) |*b, j| b.* = self.get(i + 1 + j);
200 for (self.slice()[i..newlen], 0..) |*b, j| b.* = self.get(i + 1 + j);
201201 self.set(newlen, undefined);
202202 self.len = newlen;
203203 return old_item;
lib/std/builtin.zig+1
......@@ -975,6 +975,7 @@ pub const panic_messages = struct {
975975 pub const unwrap_error = "attempt to unwrap error";
976976 pub const index_out_of_bounds = "index out of bounds";
977977 pub const start_index_greater_than_end = "start index is larger than end index";
978 pub const for_len_mismatch = "for loop over objects with non-equal lengths";
978979};
979980
980981pub noinline fn returnError(st: *StackTrace) void {
lib/std/child_process.zig+3-3
......@@ -604,7 +604,7 @@ pub const ChildProcess = struct {
604604 const arena = arena_allocator.allocator();
605605
606606 const argv_buf = try arena.allocSentinel(?[*:0]u8, self.argv.len, null);
607 for (self.argv) |arg, i| argv_buf[i] = (try arena.dupeZ(u8, arg)).ptr;
607 for (self.argv, 0..) |arg, i| argv_buf[i] = (try arena.dupeZ(u8, arg)).ptr;
608608
609609 const envp = if (self.env_map) |env_map| m: {
610610 const envp_buf = try createNullDelimitedEnvMap(arena, env_map);
......@@ -712,7 +712,7 @@ pub const ChildProcess = struct {
712712 // Therefore, we do all the allocation for the execve() before the fork().
713713 // This means we must do the null-termination of argv and env vars here.
714714 const argv_buf = try arena.allocSentinel(?[*:0]u8, self.argv.len, null);
715 for (self.argv) |arg, i| argv_buf[i] = (try arena.dupeZ(u8, arg)).ptr;
715 for (self.argv, 0..) |arg, i| argv_buf[i] = (try arena.dupeZ(u8, arg)).ptr;
716716
717717 const envp = m: {
718718 if (self.env_map) |env_map| {
......@@ -1424,7 +1424,7 @@ fn windowsCreateCommandLine(allocator: mem.Allocator, argv: []const []const u8)
14241424 var buf = std.ArrayList(u8).init(allocator);
14251425 defer buf.deinit();
14261426
1427 for (argv) |arg, arg_i| {
1427 for (argv, 0..) |arg, arg_i| {
14281428 if (arg_i != 0) try buf.append(' ');
14291429 if (mem.indexOfAny(u8, arg, " \t\n\"") == null) {
14301430 try buf.appendSlice(arg);
lib/std/coff.zig+1-1
......@@ -1223,7 +1223,7 @@ pub const Coff = struct {
12231223 pub fn getSectionHeadersAlloc(self: *const Coff, allocator: mem.Allocator) ![]SectionHeader {
12241224 const section_headers = self.getSectionHeaders();
12251225 const out_buff = try allocator.alloc(SectionHeader, section_headers.len);
1226 for (out_buff) |*section_header, i| {
1226 for (out_buff, 0..) |*section_header, i| {
12271227 section_header.* = section_headers[i];
12281228 }
12291229
lib/std/compress/deflate/compressor.zig+5-5
......@@ -159,7 +159,7 @@ fn levels(compression: Compression) CompressionLevel {
159159fn matchLen(a: []u8, b: []u8, max: u32) u32 {
160160 var bounded_a = a[0..max];
161161 var bounded_b = b[0..max];
162 for (bounded_a) |av, i| {
162 for (bounded_a, 0..) |av, i| {
163163 if (bounded_b[i] != av) {
164164 return @intCast(u32, i);
165165 }
......@@ -312,14 +312,14 @@ pub fn Compressor(comptime WriterType: anytype) type {
312312
313313 // Iterate over slices instead of arrays to avoid copying
314314 // the entire table onto the stack (https://golang.org/issue/18625).
315 for (self.hash_prev) |v, i| {
315 for (self.hash_prev, 0..) |v, i| {
316316 if (v > delta) {
317317 self.hash_prev[i] = @intCast(u32, v - delta);
318318 } else {
319319 self.hash_prev[i] = 0;
320320 }
321321 }
322 for (self.hash_head) |v, i| {
322 for (self.hash_head, 0..) |v, i| {
323323 if (v > delta) {
324324 self.hash_head[i] = @intCast(u32, v - delta);
325325 } else {
......@@ -391,7 +391,7 @@ pub fn Compressor(comptime WriterType: anytype) type {
391391 var dst = self.hash_match[0..dst_size];
392392 _ = self.bulk_hasher(to_check, dst);
393393 var new_h: u32 = 0;
394 for (dst) |val, i| {
394 for (dst, 0..) |val, i| {
395395 var di = i + index;
396396 new_h = val;
397397 var hh = &self.hash_head[new_h & hash_mask];
......@@ -1102,7 +1102,7 @@ test "bulkHash4" {
11021102 defer testing.allocator.free(dst);
11031103
11041104 _ = bulkHash4(y, dst);
1105 for (dst) |got, i| {
1105 for (dst, 0..) |got, i| {
11061106 var want = hash4(y[i..]);
11071107 try testing.expectEqual(want, got);
11081108 }
lib/std/compress/deflate/compressor_test.zig+4-4
......@@ -171,7 +171,7 @@ test "deflate/inflate" {
171171 var large_data_chunk = try testing.allocator.alloc(u8, 100_000);
172172 defer testing.allocator.free(large_data_chunk);
173173 // fill with random data
174 for (large_data_chunk) |_, i| {
174 for (large_data_chunk, 0..) |_, i| {
175175 large_data_chunk[i] = @truncate(u8, i) *% @truncate(u8, i);
176176 }
177177 try testToFromWithLimit(large_data_chunk, limits);
......@@ -205,7 +205,7 @@ test "very long sparse chunk" {
205205 n -= cur - s.l;
206206 cur = s.l;
207207 }
208 for (b[0..n]) |_, i| {
208 for (b[0..n], 0..) |_, i| {
209209 if (s.cur + i >= s.l -| (1 << 16)) {
210210 b[i] = 1;
211211 } else {
......@@ -451,7 +451,7 @@ test "inflate reset" {
451451 defer compressed_strings[0].deinit();
452452 defer compressed_strings[1].deinit();
453453
454 for (strings) |s, i| {
454 for (strings, 0..) |s, i| {
455455 var comp = try compressor(
456456 testing.allocator,
457457 compressed_strings[i].writer(),
......@@ -498,7 +498,7 @@ test "inflate reset dictionary" {
498498 defer compressed_strings[0].deinit();
499499 defer compressed_strings[1].deinit();
500500
501 for (strings) |s, i| {
501 for (strings, 0..) |s, i| {
502502 var comp = try compressor(
503503 testing.allocator,
504504 compressed_strings[i].writer(),
lib/std/compress/deflate/decompressor.zig+2-2
......@@ -165,7 +165,7 @@ const HuffmanDecoder = struct {
165165 }
166166 }
167167
168 for (lengths) |n, li| {
168 for (lengths, 0..) |n, li| {
169169 if (n == 0) {
170170 continue;
171171 }
......@@ -213,7 +213,7 @@ const HuffmanDecoder = struct {
213213 // Above we've sanity checked that we never overwrote
214214 // an existing entry. Here we additionally check that
215215 // we filled the tables completely.
216 for (self.chunks) |chunk, i| {
216 for (self.chunks, 0..) |chunk, i| {
217217 // As an exception, in the degenerate
218218 // single-code case, we allow odd
219219 // chunks to be missing.
lib/std/compress/deflate/deflate_fast.zig+5-5
......@@ -264,7 +264,7 @@ pub const DeflateFast = struct {
264264 var a = src[@intCast(usize, s)..@intCast(usize, s1)];
265265 b = b[0..a.len];
266266 // Extend the match to be as long as possible.
267 for (a) |_, i| {
267 for (a, 0..) |_, i| {
268268 if (a[i] != b[i]) {
269269 return @intCast(i32, i);
270270 }
......@@ -285,7 +285,7 @@ pub const DeflateFast = struct {
285285 b = b[0..a.len];
286286 }
287287 a = a[0..b.len];
288 for (b) |_, i| {
288 for (b, 0..) |_, i| {
289289 if (a[i] != b[i]) {
290290 return @intCast(i32, i);
291291 }
......@@ -301,7 +301,7 @@ pub const DeflateFast = struct {
301301 // Continue looking for more matches in the current block.
302302 a = src[@intCast(usize, s + n)..@intCast(usize, s1)];
303303 b = src[0..a.len];
304 for (a) |_, i| {
304 for (a, 0..) |_, i| {
305305 if (a[i] != b[i]) {
306306 return @intCast(i32, i) + n;
307307 }
......@@ -330,7 +330,7 @@ pub const DeflateFast = struct {
330330 fn shiftOffsets(self: *Self) void {
331331 if (self.prev_len == 0) {
332332 // We have no history; just clear the table.
333 for (self.table) |_, i| {
333 for (self.table, 0..) |_, i| {
334334 self.table[i] = TableEntry{ .val = 0, .offset = 0 };
335335 }
336336 self.cur = max_match_offset + 1;
......@@ -338,7 +338,7 @@ pub const DeflateFast = struct {
338338 }
339339
340340 // Shift down everything in the table that isn't already too far away.
341 for (self.table) |_, i| {
341 for (self.table, 0..) |_, i| {
342342 var v = self.table[i].offset - self.cur + max_match_offset + 1;
343343 if (v < 0) {
344344 // We want to reset self.cur to max_match_offset + 1, so we need to shift
lib/std/compress/deflate/deflate_fast_test.zig+1-1
......@@ -18,7 +18,7 @@ test "best speed" {
1818 var abcabc = try testing.allocator.alloc(u8, 131_072);
1919 defer testing.allocator.free(abcabc);
2020
21 for (abcabc) |_, i| {
21 for (abcabc, 0..) |_, i| {
2222 abcabc[i] = @intCast(u8, i % 128);
2323 }
2424
lib/std/compress/deflate/dict_decoder.zig+1-1
......@@ -378,7 +378,7 @@ test "dictionary decoder" {
378378 _ = try want.write(".");
379379
380380 var str = poem;
381 for (poem_refs) |ref, i| {
381 for (poem_refs, 0..) |ref, i| {
382382 _ = i;
383383 if (ref.dist == 0) {
384384 try util.writeString(&dd, got, str[0..ref.length]);
lib/std/compress/deflate/huffman_bit_writer.zig+6-6
......@@ -197,7 +197,7 @@ pub fn HuffmanBitWriter(comptime WriterType: type) type {
197197 lit_enc: *hm_code.HuffmanEncoder,
198198 off_enc: *hm_code.HuffmanEncoder,
199199 ) void {
200 for (self.codegen_freq) |_, i| {
200 for (self.codegen_freq, 0..) |_, i| {
201201 self.codegen_freq[i] = 0;
202202 }
203203
......@@ -208,12 +208,12 @@ pub fn HuffmanBitWriter(comptime WriterType: type) type {
208208 var codegen = self.codegen; // cache
209209 // Copy the concatenated code sizes to codegen. Put a marker at the end.
210210 var cgnl = codegen[0..num_literals];
211 for (cgnl) |_, i| {
211 for (cgnl, 0..) |_, i| {
212212 cgnl[i] = @intCast(u8, lit_enc.codes[i].len);
213213 }
214214
215215 cgnl = codegen[num_literals .. num_literals + num_offsets];
216 for (cgnl) |_, i| {
216 for (cgnl, 0..) |_, i| {
217217 cgnl[i] = @intCast(u8, off_enc.codes[i].len);
218218 }
219219 codegen[num_literals + num_offsets] = bad_code;
......@@ -600,10 +600,10 @@ pub fn HuffmanBitWriter(comptime WriterType: type) type {
600600 var num_literals: u32 = 0;
601601 var num_offsets: u32 = 0;
602602
603 for (self.literal_freq) |_, i| {
603 for (self.literal_freq, 0..) |_, i| {
604604 self.literal_freq[i] = 0;
605605 }
606 for (self.offset_freq) |_, i| {
606 for (self.offset_freq, 0..) |_, i| {
607607 self.offset_freq[i] = 0;
608608 }
609609
......@@ -691,7 +691,7 @@ pub fn HuffmanBitWriter(comptime WriterType: type) type {
691691 }
692692
693693 // Clear histogram
694 for (self.literal_freq) |_, i| {
694 for (self.literal_freq, 0..) |_, i| {
695695 self.literal_freq[i] = 0;
696696 }
697697
lib/std/compress/deflate/huffman_code.zig+5-5
......@@ -71,7 +71,7 @@ pub const HuffmanEncoder = struct {
7171 // Number of non-zero literals
7272 var count: u32 = 0;
7373 // Set list to be the set of all non-zero literals and their frequencies
74 for (freq) |f, i| {
74 for (freq, 0..) |f, i| {
7575 if (f != 0) {
7676 list[count] = LiteralNode{ .literal = @intCast(u16, i), .freq = f };
7777 count += 1;
......@@ -86,7 +86,7 @@ pub const HuffmanEncoder = struct {
8686 if (count <= 2) {
8787 // Handle the small cases here, because they are awkward for the general case code. With
8888 // two or fewer literals, everything has bit length 1.
89 for (list) |node, i| {
89 for (list, 0..) |node, i| {
9090 // "list" is in order of increasing literal value.
9191 self.codes[node.literal].set(@intCast(u16, i), 1);
9292 }
......@@ -103,7 +103,7 @@ pub const HuffmanEncoder = struct {
103103
104104 pub fn bitLength(self: *HuffmanEncoder, freq: []u16) u32 {
105105 var total: u32 = 0;
106 for (freq) |f, i| {
106 for (freq, 0..) |f, i| {
107107 if (f != 0) {
108108 total += @intCast(u32, f) * @intCast(u32, self.codes[i].len);
109109 }
......@@ -258,7 +258,7 @@ pub const HuffmanEncoder = struct {
258258 var code = @as(u16, 0);
259259 var list = list_arg;
260260
261 for (bit_count) |bits, n| {
261 for (bit_count, 0..) |bits, n| {
262262 code <<= 1;
263263 if (n == 0 or bits == 0) {
264264 continue;
......@@ -340,7 +340,7 @@ pub fn generateFixedLiteralEncoding(allocator: Allocator) !HuffmanEncoder {
340340pub fn generateFixedOffsetEncoding(allocator: Allocator) !HuffmanEncoder {
341341 var h = try newHuffmanEncoder(allocator, 30);
342342 var codes = h.codes;
343 for (codes) |_, ch| {
343 for (codes, 0..) |_, ch| {
344344 codes[ch] = HuffCode{ .code = bu.bitReverse(u16, @intCast(u16, ch), 5), .len = 5 };
345345 }
346346 return h;
lib/std/compress/lzma/decode.zig+1-1
......@@ -143,7 +143,7 @@ pub const DecoderState = struct {
143143 }
144144
145145 self.lzma_props = new_props;
146 for (self.pos_slot_decoder) |*t| t.reset();
146 for (&self.pos_slot_decoder) |*t| t.reset();
147147 self.align_decoder.reset();
148148 self.pos_decoders = .{0x400} ** 115;
149149 self.is_match = .{0x400} ** 192;
lib/std/compress/lzma/decode/rangecoder.zig+2-2
......@@ -174,8 +174,8 @@ pub const LenDecoder = struct {
174174 pub fn reset(self: *LenDecoder) void {
175175 self.choice = 0x400;
176176 self.choice2 = 0x400;
177 for (self.low_coder) |*t| t.reset();
178 for (self.mid_coder) |*t| t.reset();
177 for (&self.low_coder) |*t| t.reset();
178 for (&self.mid_coder) |*t| t.reset();
179179 self.high_coder.reset();
180180 }
181181};
lib/std/comptime_string_map.zig+1-1
......@@ -21,7 +21,7 @@ pub fn ComptimeStringMap(comptime V: type, comptime kvs_list: anytype) type {
2121 return a.key.len < b.key.len;
2222 }
2323 }).lenAsc;
24 for (kvs_list) |kv, i| {
24 for (kvs_list, 0..) |kv, i| {
2525 if (V != void) {
2626 sorted_kvs[i] = .{ .key = kv.@"0", .value = kv.@"1" };
2727 } else {
lib/std/crypto/25519/ed25519.zig+5-5
......@@ -344,7 +344,7 @@ pub const Ed25519 = struct {
344344 var a_batch: [count]Curve = undefined;
345345 var expected_r_batch: [count]Curve = undefined;
346346
347 for (signature_batch) |signature, i| {
347 for (signature_batch, 0..) |signature, i| {
348348 const r = signature.sig.r;
349349 const s = signature.sig.s;
350350 try Curve.scalar.rejectNonCanonical(s);
......@@ -360,7 +360,7 @@ pub const Ed25519 = struct {
360360 }
361361
362362 var hram_batch: [count]Curve.scalar.CompressedScalar = undefined;
363 for (signature_batch) |signature, i| {
363 for (signature_batch, 0..) |signature, i| {
364364 var h = Sha512.init(.{});
365365 h.update(&r_batch[i]);
366366 h.update(&signature.public_key.bytes);
......@@ -371,20 +371,20 @@ pub const Ed25519 = struct {
371371 }
372372
373373 var z_batch: [count]Curve.scalar.CompressedScalar = undefined;
374 for (z_batch) |*z| {
374 for (&z_batch) |*z| {
375375 crypto.random.bytes(z[0..16]);
376376 mem.set(u8, z[16..], 0);
377377 }
378378
379379 var zs_sum = Curve.scalar.zero;
380 for (z_batch) |z, i| {
380 for (z_batch, 0..) |z, i| {
381381 const zs = Curve.scalar.mul(z, s_batch[i]);
382382 zs_sum = Curve.scalar.add(zs_sum, zs);
383383 }
384384 zs_sum = Curve.scalar.mul8(zs_sum);
385385
386386 var zhs: [count]Curve.scalar.CompressedScalar = undefined;
387 for (z_batch) |z, i| {
387 for (z_batch, 0..) |z, i| {
388388 zhs[i] = Curve.scalar.mul(z, hram_batch[i]);
389389 }
390390
lib/std/crypto/25519/edwards25519.zig+4-4
......@@ -161,7 +161,7 @@ pub const Edwards25519 = struct {
161161 fn slide(s: [32]u8) [2 * 32]i8 {
162162 const reduced = if ((s[s.len - 1] & 0x80) == 0) s else scalar.reduce(s);
163163 var e: [2 * 32]i8 = undefined;
164 for (reduced) |x, i| {
164 for (reduced, 0..) |x, i| {
165165 e[i * 2 + 0] = @as(i8, @truncate(u4, x));
166166 e[i * 2 + 1] = @as(i8, @truncate(u4, x >> 4));
167167 }
......@@ -308,7 +308,7 @@ pub const Edwards25519 = struct {
308308 var bpc: [9]Edwards25519 = undefined;
309309 mem.copy(Edwards25519, bpc[0..], basePointPc[0..bpc.len]);
310310
311 for (ps) |p, i| {
311 for (ps, 0..) |p, i| {
312312 if (p.is_base) {
313313 pcs[i] = bpc;
314314 } else {
......@@ -317,13 +317,13 @@ pub const Edwards25519 = struct {
317317 }
318318 }
319319 var es: [count][2 * 32]i8 = undefined;
320 for (ss) |s, i| {
320 for (ss, 0..) |s, i| {
321321 es[i] = slide(s);
322322 }
323323 var q = Edwards25519.identityElement;
324324 var pos: usize = 2 * 32 - 1;
325325 while (true) : (pos -= 1) {
326 for (es) |e, i| {
326 for (es, 0..) |e, i| {
327327 const slot = e[pos];
328328 if (slot > 0) {
329329 q = q.add(pcs[i][@intCast(usize, slot)]);
lib/std/crypto/Certificate.zig+1-1
......@@ -1092,7 +1092,7 @@ pub const rsa = struct {
10921092 if (exponent_elem.identifier.tag != .integer) return error.CertificateFieldHasWrongDataType;
10931093 // Skip over meaningless zeroes in the modulus.
10941094 const modulus_raw = pub_key[modulus_elem.slice.start..modulus_elem.slice.end];
1095 const modulus_offset = for (modulus_raw) |byte, i| {
1095 const modulus_offset = for (modulus_raw, 0..) |byte, i| {
10961096 if (byte != 0) break i;
10971097 } else modulus_raw.len;
10981098 return .{
lib/std/crypto/aegis.zig+3-3
......@@ -170,7 +170,7 @@ pub const Aegis128L = struct {
170170 }
171171 const computed_tag = state.mac(ad.len, m.len);
172172 var acc: u8 = 0;
173 for (computed_tag) |_, j| {
173 for (computed_tag, 0..) |_, j| {
174174 acc |= (computed_tag[j] ^ tag[j]);
175175 }
176176 if (acc != 0) {
......@@ -339,7 +339,7 @@ pub const Aegis256 = struct {
339339 }
340340 const computed_tag = state.mac(ad.len, m.len);
341341 var acc: u8 = 0;
342 for (computed_tag) |_, j| {
342 for (computed_tag, 0..) |_, j| {
343343 acc |= (computed_tag[j] ^ tag[j]);
344344 }
345345 if (acc != 0) {
......@@ -562,7 +562,7 @@ test "Aegis256 test vector 3" {
562562test "Aegis MAC" {
563563 const key = [_]u8{0x00} ** Aegis128LMac.key_length;
564564 var msg: [64]u8 = undefined;
565 for (msg) |*m, i| {
565 for (&msg, 0..) |*m, i| {
566566 m.* = @truncate(u8, i);
567567 }
568568 const st_init = Aegis128LMac.init(&key);
lib/std/crypto/aes.zig+4-4
......@@ -115,11 +115,11 @@ test "expand 128-bit key" {
115115 const dec = Aes128.initDec(key);
116116 var exp: [16]u8 = undefined;
117117
118 for (enc.key_schedule.round_keys) |round_key, i| {
118 for (enc.key_schedule.round_keys, 0..) |round_key, i| {
119119 _ = try std.fmt.hexToBytes(&exp, exp_enc[i]);
120120 try testing.expectEqualSlices(u8, &exp, &round_key.toBytes());
121121 }
122 for (dec.key_schedule.round_keys) |round_key, i| {
122 for (dec.key_schedule.round_keys, 0..) |round_key, i| {
123123 _ = try std.fmt.hexToBytes(&exp, exp_dec[i]);
124124 try testing.expectEqualSlices(u8, &exp, &round_key.toBytes());
125125 }
......@@ -154,11 +154,11 @@ test "expand 256-bit key" {
154154 const dec = Aes256.initDec(key);
155155 var exp: [16]u8 = undefined;
156156
157 for (enc.key_schedule.round_keys) |round_key, i| {
157 for (enc.key_schedule.round_keys, 0..) |round_key, i| {
158158 _ = try std.fmt.hexToBytes(&exp, exp_enc[i]);
159159 try testing.expectEqualSlices(u8, &exp, &round_key.toBytes());
160160 }
161 for (dec.key_schedule.round_keys) |round_key, i| {
161 for (dec.key_schedule.round_keys, 0..) |round_key, i| {
162162 _ = try std.fmt.hexToBytes(&exp, exp_dec[i]);
163163 try testing.expectEqualSlices(u8, &exp, &round_key.toBytes());
164164 }
lib/std/crypto/aes/aesni.zig+2-2
......@@ -200,7 +200,7 @@ fn KeySchedule(comptime Aes: type) type {
200200 fn expand128(t1: *Block) Self {
201201 var round_keys: [11]Block = undefined;
202202 const rcs = [_]u8{ 1, 2, 4, 8, 16, 32, 64, 128, 27, 54 };
203 inline for (rcs) |rc, round| {
203 inline for (rcs, 0..) |rc, round| {
204204 round_keys[round] = t1.*;
205205 t1.repr = drc(false, rc, t1.repr, t1.repr);
206206 }
......@@ -212,7 +212,7 @@ fn KeySchedule(comptime Aes: type) type {
212212 var round_keys: [15]Block = undefined;
213213 const rcs = [_]u8{ 1, 2, 4, 8, 16, 32 };
214214 round_keys[0] = t1.*;
215 inline for (rcs) |rc, round| {
215 inline for (rcs, 0..) |rc, round| {
216216 round_keys[round * 2 + 1] = t2.*;
217217 t1.repr = drc(false, rc, t2.repr, t1.repr);
218218 round_keys[round * 2 + 2] = t1.*;
lib/std/crypto/aes/armcrypto.zig+2-2
......@@ -250,7 +250,7 @@ fn KeySchedule(comptime Aes: type) type {
250250 fn expand128(t1: *Block) Self {
251251 var round_keys: [11]Block = undefined;
252252 const rcs = [_]u8{ 1, 2, 4, 8, 16, 32, 64, 128, 27, 54 };
253 inline for (rcs) |rc, round| {
253 inline for (rcs, 0..) |rc, round| {
254254 round_keys[round] = t1.*;
255255 t1.repr = drc128(rc, t1.repr);
256256 }
......@@ -262,7 +262,7 @@ fn KeySchedule(comptime Aes: type) type {
262262 var round_keys: [15]Block = undefined;
263263 const rcs = [_]u8{ 1, 2, 4, 8, 16, 32 };
264264 round_keys[0] = t1.*;
265 inline for (rcs) |rc, round| {
265 inline for (rcs, 0..) |rc, round| {
266266 round_keys[round * 2 + 1] = t2.*;
267267 t1.repr = drc256(false, rc, t2.repr, t1.repr);
268268 round_keys[round * 2 + 2] = t1.*;
lib/std/crypto/aes/soft.zig+2-2
......@@ -420,7 +420,7 @@ const powx = init: {
420420 var array: [16]u8 = undefined;
421421
422422 var value = 1;
423 for (array) |*power| {
423 for (&array) |*power| {
424424 power.* = value;
425425 value = mul(value, 2);
426426 }
......@@ -471,7 +471,7 @@ fn generateSbox(invert: bool) [256]u8 {
471471fn generateTable(invert: bool) [4][256]u32 {
472472 var table: [4][256]u32 = undefined;
473473
474 for (generateSbox(invert)) |value, index| {
474 for (generateSbox(invert), 0..) |value, index| {
475475 table[0][index] = mul(value, if (invert) 0xb else 0x3);
476476 table[0][index] |= math.shl(u32, mul(value, if (invert) 0xd else 0x1), 8);
477477 table[0][index] |= math.shl(u32, mul(value, if (invert) 0x9 else 0x1), 16);
lib/std/crypto/aes_gcm.zig+3-3
......@@ -50,7 +50,7 @@ fn AesGcm(comptime Aes: anytype) type {
5050 mem.writeIntBig(u64, final_block[8..16], m.len * 8);
5151 mac.update(&final_block);
5252 mac.final(tag);
53 for (t) |x, i| {
53 for (t, 0..) |x, i| {
5454 tag[i] ^= x;
5555 }
5656 }
......@@ -82,12 +82,12 @@ fn AesGcm(comptime Aes: anytype) type {
8282 mac.update(&final_block);
8383 var computed_tag: [Ghash.mac_length]u8 = undefined;
8484 mac.final(&computed_tag);
85 for (t) |x, i| {
85 for (t, 0..) |x, i| {
8686 computed_tag[i] ^= x;
8787 }
8888
8989 var acc: u8 = 0;
90 for (computed_tag) |_, p| {
90 for (computed_tag, 0..) |_, p| {
9191 acc |= (computed_tag[p] ^ tag[p]);
9292 }
9393 if (acc != 0) {
lib/std/crypto/aes_ocb.zig+4-4
......@@ -155,7 +155,7 @@ fn AesOcb(comptime Aes: anytype) type {
155155 xorWith(&offset, lx.star);
156156 var pad = offset;
157157 aes_enc_ctx.encrypt(&pad, &pad);
158 for (m[i * 16 ..]) |x, j| {
158 for (m[i * 16 ..], 0..) |x, j| {
159159 c[i * 16 + j] = pad[j] ^ x;
160160 }
161161 var e = [_]u8{0} ** 16;
......@@ -220,7 +220,7 @@ fn AesOcb(comptime Aes: anytype) type {
220220 xorWith(&offset, lx.star);
221221 var pad = offset;
222222 aes_enc_ctx.encrypt(&pad, &pad);
223 for (c[i * 16 ..]) |x, j| {
223 for (c[i * 16 ..], 0..) |x, j| {
224224 m[i * 16 + j] = pad[j] ^ x;
225225 }
226226 var e = [_]u8{0} ** 16;
......@@ -242,14 +242,14 @@ fn AesOcb(comptime Aes: anytype) type {
242242
243243inline fn xorBlocks(x: Block, y: Block) Block {
244244 var z: Block = x;
245 for (z) |*v, i| {
245 for (&z, 0..) |*v, i| {
246246 v.* = x[i] ^ y[i];
247247 }
248248 return z;
249249}
250250
251251inline fn xorWith(x: *Block, y: Block) void {
252 for (x) |*v, i| {
252 for (x, 0..) |*v, i| {
253253 v.* ^= y[i];
254254 }
255255}
lib/std/crypto/argon2.zig+7-7
......@@ -188,13 +188,13 @@ fn initBlocks(
188188
189189 mem.writeIntLittle(u32, h0[Blake2b512.digest_length..][0..4], 0);
190190 blake2bLong(&block0, h0);
191 for (blocks.items[j + 0]) |*v, i| {
191 for (&blocks.items[j + 0], 0..) |*v, i| {
192192 v.* = mem.readIntLittle(u64, block0[i * 8 ..][0..8]);
193193 }
194194
195195 mem.writeIntLittle(u32, h0[Blake2b512.digest_length..][0..4], 1);
196196 blake2bLong(&block0, h0);
197 for (blocks.items[j + 1]) |*v, i| {
197 for (&blocks.items[j + 1], 0..) |*v, i| {
198198 v.* = mem.readIntLittle(u64, block0[i * 8 ..][0..8]);
199199 }
200200 }
......@@ -352,7 +352,7 @@ fn processBlockGeneric(
352352 comptime xor: bool,
353353) void {
354354 var t: [block_length]u64 = undefined;
355 for (t) |*v, i| {
355 for (&t, 0..) |*v, i| {
356356 v.* = in1[i] ^ in2[i];
357357 }
358358 var i: usize = 0;
......@@ -375,11 +375,11 @@ fn processBlockGeneric(
375375 }
376376 }
377377 if (xor) {
378 for (t) |v, j| {
378 for (t, 0..) |v, j| {
379379 out[j] ^= in1[j] ^ in2[j] ^ v;
380380 }
381381 } else {
382 for (t) |v, j| {
382 for (t, 0..) |v, j| {
383383 out[j] = in1[j] ^ in2[j] ^ v;
384384 }
385385 }
......@@ -428,12 +428,12 @@ fn finalize(
428428 const lanes = memory / threads;
429429 var lane: u24 = 0;
430430 while (lane < threads - 1) : (lane += 1) {
431 for (blocks.items[(lane * lanes) + lanes - 1]) |v, i| {
431 for (blocks.items[(lane * lanes) + lanes - 1], 0..) |v, i| {
432432 blocks.items[memory - 1][i] ^= v;
433433 }
434434 }
435435 var block: [1024]u8 = undefined;
436 for (blocks.items[memory - 1]) |v, i| {
436 for (blocks.items[memory - 1], 0..) |v, i| {
437437 mem.writeIntLittle(u64, block[i * 8 ..][0..8], v);
438438 }
439439 blake2bLong(out, &block);
lib/std/crypto/ascon.zig+1-1
......@@ -74,7 +74,7 @@ pub fn State(comptime endian: builtin.Endian) type {
7474
7575 /// Byte-swap the entire state if the architecture doesn't match the required endianness.
7676 pub fn endianSwap(self: *Self) void {
77 for (self.st) |*w| {
77 for (&self.st) |*w| {
7878 w.* = mem.toNative(u64, w.*, endian);
7979 }
8080 }
lib/std/crypto/bcrypt.zig+2-2
......@@ -437,7 +437,7 @@ pub fn bcrypt(
437437 }
438438
439439 var ct: [ct_length]u8 = undefined;
440 for (cdata) |c, i| {
440 for (cdata, 0..) |c, i| {
441441 mem.writeIntBig(u32, ct[i * 4 ..][0..4], c);
442442 }
443443 return ct[0..dk_length].*;
......@@ -505,7 +505,7 @@ const pbkdf_prf = struct {
505505
506506 // copy out
507507 var out: [32]u8 = undefined;
508 for (cdata) |v, i| {
508 for (cdata, 0..) |v, i| {
509509 std.mem.writeIntLittle(u32, out[4 * i ..][0..4], v);
510510 }
511511
lib/std/crypto/blake2.zig+6-6
......@@ -133,7 +133,7 @@ pub fn Blake2s(comptime out_bits: usize) type {
133133 mem.set(u8, d.buf[d.buf_len..], 0);
134134 d.t += d.buf_len;
135135 d.round(d.buf[0..], true);
136 for (d.h) |*x| x.* = mem.nativeToLittle(u32, x.*);
136 for (&d.h) |*x| x.* = mem.nativeToLittle(u32, x.*);
137137 mem.copy(u8, out[0..], @ptrCast(*[digest_length]u8, &d.h));
138138 }
139139
......@@ -141,7 +141,7 @@ pub fn Blake2s(comptime out_bits: usize) type {
141141 var m: [16]u32 = undefined;
142142 var v: [16]u32 = undefined;
143143
144 for (m) |*r, i| {
144 for (&m, 0..) |*r, i| {
145145 r.* = mem.readIntLittle(u32, b[4 * i ..][0..4]);
146146 }
147147
......@@ -180,7 +180,7 @@ pub fn Blake2s(comptime out_bits: usize) type {
180180 }
181181 }
182182
183 for (d.h) |*r, i| {
183 for (&d.h, 0..) |*r, i| {
184184 r.* ^= v[i] ^ v[i + 8];
185185 }
186186 }
......@@ -568,7 +568,7 @@ pub fn Blake2b(comptime out_bits: usize) type {
568568 mem.set(u8, d.buf[d.buf_len..], 0);
569569 d.t += d.buf_len;
570570 d.round(d.buf[0..], true);
571 for (d.h) |*x| x.* = mem.nativeToLittle(u64, x.*);
571 for (&d.h) |*x| x.* = mem.nativeToLittle(u64, x.*);
572572 mem.copy(u8, out[0..], @ptrCast(*[digest_length]u8, &d.h));
573573 }
574574
......@@ -576,7 +576,7 @@ pub fn Blake2b(comptime out_bits: usize) type {
576576 var m: [16]u64 = undefined;
577577 var v: [16]u64 = undefined;
578578
579 for (m) |*r, i| {
579 for (&m, 0..) |*r, i| {
580580 r.* = mem.readIntLittle(u64, b[8 * i ..][0..8]);
581581 }
582582
......@@ -615,7 +615,7 @@ pub fn Blake2b(comptime out_bits: usize) type {
615615 }
616616 }
617617
618 for (d.h) |*r, i| {
618 for (&d.h, 0..) |*r, i| {
619619 r.* ^= v[i] ^ v[i + 8];
620620 }
621621 }
lib/std/crypto/blake3.zig+3-3
......@@ -192,7 +192,7 @@ const CompressGeneric = struct {
192192 for (MSG_SCHEDULE) |schedule| {
193193 round(&state, block_words, schedule);
194194 }
195 for (chaining_value) |_, i| {
195 for (chaining_value, 0..) |_, i| {
196196 state[i] ^= state[i + 8];
197197 state[i + 8] ^= chaining_value[i];
198198 }
......@@ -211,7 +211,7 @@ fn first8Words(words: [16]u32) [8]u32 {
211211
212212fn wordsFromLittleEndianBytes(comptime count: usize, bytes: [count * 4]u8) [count]u32 {
213213 var words: [count]u32 = undefined;
214 for (words) |*word, i| {
214 for (&words, 0..) |*word, i| {
215215 word.* = mem.readIntSliceLittle(u32, bytes[4 * i ..]);
216216 }
217217 return words;
......@@ -658,7 +658,7 @@ fn testBlake3(hasher: *Blake3, input_len: usize, expected_hex: [262]u8) !void {
658658
659659 // Setup input pattern
660660 var input_pattern: [251]u8 = undefined;
661 for (input_pattern) |*e, i| e.* = @truncate(u8, i);
661 for (&input_pattern, 0..) |*e, i| e.* = @truncate(u8, i);
662662
663663 // Write repeating input pattern to hasher
664664 var input_counter = input_len;
lib/std/crypto/chacha20.zig+3-3
......@@ -197,7 +197,7 @@ fn ChaChaVecImpl(comptime rounds_nb: usize) type {
197197
198198 fn hchacha20(input: [16]u8, key: [32]u8) [32]u8 {
199199 var c: [4]u32 = undefined;
200 for (c) |_, i| {
200 for (c, 0..) |_, i| {
201201 c[i] = mem.readIntLittle(u32, input[4 * i ..][0..4]);
202202 }
203203 const ctx = initContext(keyToWords(key), c);
......@@ -338,7 +338,7 @@ fn ChaChaNonVecImpl(comptime rounds_nb: usize) type {
338338
339339 fn hchacha20(input: [16]u8, key: [32]u8) [32]u8 {
340340 var c: [4]u32 = undefined;
341 for (c) |_, i| {
341 for (c, 0..) |_, i| {
342342 c[i] = mem.readIntLittle(u32, input[4 * i ..][0..4]);
343343 }
344344 const ctx = initContext(keyToWords(key), c);
......@@ -543,7 +543,7 @@ fn ChaChaPoly1305(comptime rounds_nb: usize) type {
543543 mac.final(computedTag[0..]);
544544
545545 var acc: u8 = 0;
546 for (computedTag) |_, i| {
546 for (computedTag, 0..) |_, i| {
547547 acc |= computedTag[i] ^ tag[i];
548548 }
549549 if (acc != 0) {
lib/std/crypto/cmac.zig+4-4
......@@ -46,19 +46,19 @@ pub fn Cmac(comptime BlockCipher: type) type {
4646 const left = block_length - self.pos;
4747 var m = msg;
4848 if (m.len > left) {
49 for (self.buf[self.pos..]) |*b, i| b.* ^= m[i];
49 for (self.buf[self.pos..], 0..) |*b, i| b.* ^= m[i];
5050 m = m[left..];
5151 self.cipher_ctx.encrypt(&self.buf, &self.buf);
5252 self.pos = 0;
5353 }
5454 while (m.len > block_length) {
55 for (self.buf[0..block_length]) |*b, i| b.* ^= m[i];
55 for (self.buf[0..block_length], 0..) |*b, i| b.* ^= m[i];
5656 m = m[block_length..];
5757 self.cipher_ctx.encrypt(&self.buf, &self.buf);
5858 self.pos = 0;
5959 }
6060 if (m.len > 0) {
61 for (self.buf[self.pos..][0..m.len]) |*b, i| b.* ^= m[i];
61 for (self.buf[self.pos..][0..m.len], 0..) |*b, i| b.* ^= m[i];
6262 self.pos += m.len;
6363 }
6464 }
......@@ -69,7 +69,7 @@ pub fn Cmac(comptime BlockCipher: type) type {
6969 mac = self.k2;
7070 mac[self.pos] ^= 0x80;
7171 }
72 for (mac) |*b, i| b.* ^= self.buf[i];
72 for (&mac, 0..) |*b, i| b.* ^= self.buf[i];
7373 self.cipher_ctx.encrypt(out, &mac);
7474 }
7575
lib/std/crypto/ghash_polyval.zig+2-2
......@@ -320,7 +320,7 @@ fn Hash(comptime endian: std.builtin.Endian, comptime shift_key: bool) type {
320320 if (st.leftover > 0) {
321321 const want = math.min(block_length - st.leftover, mb.len);
322322 const mc = mb[0..want];
323 for (mc) |x, i| {
323 for (mc, 0..) |x, i| {
324324 st.buf[st.leftover + i] = x;
325325 }
326326 mb = mb[want..];
......@@ -337,7 +337,7 @@ fn Hash(comptime endian: std.builtin.Endian, comptime shift_key: bool) type {
337337 mb = mb[want..];
338338 }
339339 if (mb.len > 0) {
340 for (mb) |x, i| {
340 for (mb, 0..) |x, i| {
341341 st.buf[st.leftover + i] = x;
342342 }
343343 st.leftover += mb.len;
lib/std/crypto/gimli.zig+8-8
......@@ -45,7 +45,7 @@ pub const State = struct {
4545 }
4646
4747 inline fn endianSwap(self: *Self) void {
48 for (self.data) |*w| {
48 for (&self.data) |*w| {
4949 w.* = mem.littleToNative(u32, w.*);
5050 }
5151 }
......@@ -228,7 +228,7 @@ pub const Hash = struct {
228228 while (in.len > 0) {
229229 const left = State.RATE - self.buf_off;
230230 const ps = math.min(in.len, left);
231 for (buf[self.buf_off .. self.buf_off + ps]) |*p, i| {
231 for (buf[self.buf_off .. self.buf_off + ps], 0..) |*p, i| {
232232 p.* ^= in[i];
233233 }
234234 self.buf_off += ps;
......@@ -329,12 +329,12 @@ pub const Aead = struct {
329329 // exactly one final non-full block, in the same way as Gimli-Hash.
330330 var data = ad;
331331 while (data.len >= State.RATE) : (data = data[State.RATE..]) {
332 for (buf[0..State.RATE]) |*p, i| {
332 for (buf[0..State.RATE], 0..) |*p, i| {
333333 p.* ^= data[i];
334334 }
335335 state.permute();
336336 }
337 for (buf[0..data.len]) |*p, i| {
337 for (buf[0..data.len], 0..) |*p, i| {
338338 p.* ^= data[i];
339339 }
340340
......@@ -371,13 +371,13 @@ pub const Aead = struct {
371371 in = in[State.RATE..];
372372 out = out[State.RATE..];
373373 }) {
374 for (in[0..State.RATE]) |v, i| {
374 for (in[0..State.RATE], 0..) |v, i| {
375375 buf[i] ^= v;
376376 }
377377 mem.copy(u8, out[0..State.RATE], buf[0..State.RATE]);
378378 state.permute();
379379 }
380 for (in[0..]) |v, i| {
380 for (in[0..], 0..) |v, i| {
381381 buf[i] ^= v;
382382 out[i] = buf[i];
383383 }
......@@ -414,13 +414,13 @@ pub const Aead = struct {
414414 out = out[State.RATE..];
415415 }) {
416416 const d = in[0..State.RATE].*;
417 for (d) |v, i| {
417 for (d, 0..) |v, i| {
418418 out[i] = buf[i] ^ v;
419419 }
420420 mem.copy(u8, buf[0..State.RATE], d[0..State.RATE]);
421421 state.permute();
422422 }
423 for (buf[0..in.len]) |*p, i| {
423 for (buf[0..in.len], 0..) |*p, i| {
424424 const d = in[i];
425425 out[i] = p.* ^ d;
426426 p.* = d;
lib/std/crypto/hmac.zig+2-2
......@@ -46,11 +46,11 @@ pub fn Hmac(comptime Hash: type) type {
4646 mem.copy(u8, scratch[0..], key);
4747 }
4848
49 for (ctx.o_key_pad) |*b, i| {
49 for (&ctx.o_key_pad, 0..) |*b, i| {
5050 b.* = scratch[i] ^ 0x5c;
5151 }
5252
53 for (i_key_pad) |*b, i| {
53 for (&i_key_pad, 0..) |*b, i| {
5454 b.* = scratch[i] ^ 0x36;
5555 }
5656
lib/std/crypto/md5.zig+1-1
......@@ -110,7 +110,7 @@ pub const Md5 = struct {
110110
111111 d.round(d.buf[0..]);
112112
113 for (d.s) |s, j| {
113 for (d.s, 0..) |s, j| {
114114 mem.writeIntLittle(u32, out[4 * j ..][0..4], s);
115115 }
116116 }
lib/std/crypto/pbkdf2.zig+1-1
......@@ -138,7 +138,7 @@ pub fn pbkdf2(dk: []u8, password: []const u8, salt: []const u8, rounds: u32, com
138138 mem.copy(u8, prev_block[0..], new_block[0..]);
139139
140140 // F (P, S, c, i) = U_1 \xor U_2 \xor ... \xor U_c
141 for (dk_block) |_, j| {
141 for (dk_block, 0..) |_, j| {
142142 dk_block[j] ^= new_block[j];
143143 }
144144 }
lib/std/crypto/pcurves/common.zig+1-1
......@@ -65,7 +65,7 @@ pub fn Field(comptime params: FieldParams) type {
6565 /// Swap the endianness of an encoded element.
6666 pub fn orderSwap(s: [encoded_length]u8) [encoded_length]u8 {
6767 var t = s;
68 for (s) |x, i| t[t.len - 1 - i] = x;
68 for (s, 0..) |x, i| t[t.len - 1 - i] = x;
6969 return t;
7070 }
7171
lib/std/crypto/pcurves/p256.zig+1-1
......@@ -321,7 +321,7 @@ pub const P256 = struct {
321321
322322 fn slide(s: [32]u8) [2 * 32 + 1]i8 {
323323 var e: [2 * 32 + 1]i8 = undefined;
324 for (s) |x, i| {
324 for (s, 0..) |x, i| {
325325 e[i * 2 + 0] = @as(i8, @truncate(u4, x));
326326 e[i * 2 + 1] = @as(i8, @truncate(u4, x >> 4));
327327 }
lib/std/crypto/pcurves/p256/scalar.zig+1-1
......@@ -187,7 +187,7 @@ const ScalarDouble = struct {
187187
188188 var s = s_;
189189 if (endian == .Big) {
190 for (s_) |x, i| s[s.len - 1 - i] = x;
190 for (s_, 0..) |x, i| s[s.len - 1 - i] = x;
191191 }
192192 var t = ScalarDouble{ .x1 = undefined, .x2 = Fe.zero, .x3 = Fe.zero };
193193 {
lib/std/crypto/pcurves/p384.zig+1-1
......@@ -321,7 +321,7 @@ pub const P384 = struct {
321321
322322 fn slide(s: [48]u8) [2 * 48 + 1]i8 {
323323 var e: [2 * 48 + 1]i8 = undefined;
324 for (s) |x, i| {
324 for (s, 0..) |x, i| {
325325 e[i * 2 + 0] = @as(i8, @truncate(u4, x));
326326 e[i * 2 + 1] = @as(i8, @truncate(u4, x >> 4));
327327 }
lib/std/crypto/pcurves/p384/scalar.zig+1-1
......@@ -175,7 +175,7 @@ const ScalarDouble = struct {
175175
176176 var s = s_;
177177 if (endian == .Big) {
178 for (s_) |x, i| s[s.len - 1 - i] = x;
178 for (s_, 0..) |x, i| s[s.len - 1 - i] = x;
179179 }
180180 var t = ScalarDouble{ .x1 = undefined, .x2 = Fe.zero };
181181 {
lib/std/crypto/pcurves/secp256k1.zig+1-1
......@@ -349,7 +349,7 @@ pub const Secp256k1 = struct {
349349
350350 fn slide(s: [32]u8) [2 * 32 + 1]i8 {
351351 var e: [2 * 32 + 1]i8 = undefined;
352 for (s) |x, i| {
352 for (s, 0..) |x, i| {
353353 e[i * 2 + 0] = @as(i8, @truncate(u4, x));
354354 e[i * 2 + 1] = @as(i8, @truncate(u4, x >> 4));
355355 }
lib/std/crypto/pcurves/secp256k1/scalar.zig+1-1
......@@ -187,7 +187,7 @@ const ScalarDouble = struct {
187187
188188 var s = s_;
189189 if (endian == .Big) {
190 for (s_) |x, i| s[s.len - 1 - i] = x;
190 for (s_, 0..) |x, i| s[s.len - 1 - i] = x;
191191 }
192192 var t = ScalarDouble{ .x1 = undefined, .x2 = Fe.zero, .x3 = Fe.zero };
193193 {
lib/std/crypto/poly1305.zig+2-2
......@@ -82,7 +82,7 @@ pub const Poly1305 = struct {
8282 if (st.leftover > 0) {
8383 const want = std.math.min(block_length - st.leftover, mb.len);
8484 const mc = mb[0..want];
85 for (mc) |x, i| {
85 for (mc, 0..) |x, i| {
8686 st.buf[st.leftover + i] = x;
8787 }
8888 mb = mb[want..];
......@@ -103,7 +103,7 @@ pub const Poly1305 = struct {
103103
104104 // store leftover
105105 if (mb.len > 0) {
106 for (mb) |x, i| {
106 for (mb, 0..) |x, i| {
107107 st.buf[st.leftover + i] = x;
108108 }
109109 st.leftover += mb.len;
lib/std/crypto/salsa20.zig+4-4
......@@ -157,7 +157,7 @@ fn SalsaVecImpl(comptime rounds: comptime_int) type {
157157
158158 fn hsalsa(input: [16]u8, key: [32]u8) [32]u8 {
159159 var c: [4]u32 = undefined;
160 for (c) |_, i| {
160 for (c, 0..) |_, i| {
161161 c[i] = mem.readIntLittle(u32, input[4 * i ..][0..4]);
162162 }
163163 const ctx = initContext(keyToWords(key), c);
......@@ -240,7 +240,7 @@ fn SalsaNonVecImpl(comptime rounds: comptime_int) type {
240240 }
241241
242242 fn hashToBytes(out: *[64]u8, x: BlockVec) void {
243 for (x) |w, i| {
243 for (x, 0..) |w, i| {
244244 mem.writeIntLittle(u32, out[i * 4 ..][0..4], w);
245245 }
246246 }
......@@ -282,7 +282,7 @@ fn SalsaNonVecImpl(comptime rounds: comptime_int) type {
282282
283283 fn hsalsa(input: [16]u8, key: [32]u8) [32]u8 {
284284 var c: [4]u32 = undefined;
285 for (c) |_, i| {
285 for (c, 0..) |_, i| {
286286 c[i] = mem.readIntLittle(u32, input[4 * i ..][0..4]);
287287 }
288288 const ctx = initContext(keyToWords(key), c);
......@@ -413,7 +413,7 @@ pub const XSalsa20Poly1305 = struct {
413413 var computedTag: [tag_length]u8 = undefined;
414414 mac.final(&computedTag);
415415 var acc: u8 = 0;
416 for (computedTag) |_, i| {
416 for (computedTag, 0..) |_, i| {
417417 acc |= computedTag[i] ^ tag[i];
418418 }
419419 if (acc != 0) {
lib/std/crypto/scrypt.zig+7-7
......@@ -31,7 +31,7 @@ fn blockCopy(dst: []align(16) u32, src: []align(16) const u32, n: usize) void {
3131}
3232
3333fn blockXor(dst: []align(16) u32, src: []align(16) const u32, n: usize) void {
34 for (src[0 .. n * 16]) |v, i| {
34 for (src[0 .. n * 16], 0..) |v, i| {
3535 dst[i] ^= v;
3636 }
3737}
......@@ -90,7 +90,7 @@ fn smix(b: []align(16) u8, r: u30, n: usize, v: []align(16) u32, xy: []align(16)
9090 var x = @alignCast(16, xy[0 .. 32 * r]);
9191 var y = @alignCast(16, xy[32 * r ..]);
9292
93 for (x) |*v1, j| {
93 for (x, 0..) |*v1, j| {
9494 v1.* = mem.readIntSliceLittle(u32, b[4 * j ..]);
9595 }
9696
......@@ -115,7 +115,7 @@ fn smix(b: []align(16) u8, r: u30, n: usize, v: []align(16) u32, xy: []align(16)
115115 blockMix(&tmp, y, x, r);
116116 }
117117
118 for (x) |v1, j| {
118 for (x, 0..) |v1, j| {
119119 mem.writeIntLittle(u32, b[4 * j ..][0..4], v1);
120120 }
121121}
......@@ -350,7 +350,7 @@ const crypt_format = struct {
350350
351351 fn intDecode(comptime T: type, src: *const [(@bitSizeOf(T) + 5) / 6]u8) !T {
352352 var v: T = 0;
353 for (src) |x, i| {
353 for (src, 0..) |x, i| {
354354 const vi = mem.indexOfScalar(u8, &map64, x) orelse return EncodingError.InvalidEncoding;
355355 v |= @intCast(T, vi) << @intCast(math.Log2Int(T), i * 6);
356356 }
......@@ -365,10 +365,10 @@ const crypt_format = struct {
365365 }
366366 const leftover = src[i * 4 ..];
367367 var v: u24 = 0;
368 for (leftover) |_, j| {
368 for (leftover, 0..) |_, j| {
369369 v |= @as(u24, try intDecode(u6, leftover[j..][0..1])) << @intCast(u5, j * 6);
370370 }
371 for (dst[i * 3 ..]) |*x, j| {
371 for (dst[i * 3 ..], 0..) |*x, j| {
372372 x.* = @truncate(u8, v >> @intCast(u5, j * 8));
373373 }
374374 }
......@@ -381,7 +381,7 @@ const crypt_format = struct {
381381 }
382382 const leftover = src[i * 3 ..];
383383 var v: u24 = 0;
384 for (leftover) |x, j| {
384 for (leftover, 0..) |x, j| {
385385 v |= @as(u24, x) << @intCast(u5, j * 8);
386386 }
387387 intEncode(dst[i * 4 ..], v);
lib/std/crypto/sha1.zig+1-1
......@@ -105,7 +105,7 @@ pub const Sha1 = struct {
105105
106106 d.round(d.buf[0..]);
107107
108 for (d.s) |s, j| {
108 for (d.s, 0..) |s, j| {
109109 mem.writeIntBig(u32, out[4 * j ..][0..4], s);
110110 }
111111 }
lib/std/crypto/sha2.zig+3-3
......@@ -175,7 +175,7 @@ fn Sha2x32(comptime params: Sha2Params32) type {
175175 // May truncate for possible 224 output
176176 const rr = d.s[0 .. params.digest_bits / 32];
177177
178 for (rr) |s, j| {
178 for (rr, 0..) |s, j| {
179179 mem.writeIntBig(u32, out[4 * j ..][0..4], s);
180180 }
181181 }
......@@ -199,7 +199,7 @@ fn Sha2x32(comptime params: Sha2Params32) type {
199199
200200 fn round(d: *Self, b: *const [64]u8) void {
201201 var s: [64]u32 align(16) = undefined;
202 for (@ptrCast(*align(1) const [16]u32, b)) |*elem, i| {
202 for (@ptrCast(*align(1) const [16]u32, b), 0..) |*elem, i| {
203203 s[i] = mem.readIntBig(u32, mem.asBytes(elem));
204204 }
205205
......@@ -665,7 +665,7 @@ fn Sha2x64(comptime params: Sha2Params64) type {
665665 // May truncate for possible 384 output
666666 const rr = d.s[0 .. params.digest_bits / 64];
667667
668 for (rr) |s, j| {
668 for (rr, 0..) |s, j| {
669669 mem.writeIntBig(u64, out[8 * j ..][0..8], s);
670670 }
671671 }
lib/std/crypto/sha3.zig+4-4
......@@ -43,7 +43,7 @@ fn Keccak(comptime bits: usize, comptime delim: u8) type {
4343
4444 // absorb
4545 while (len >= rate) {
46 for (d.s[offset .. offset + rate]) |*r, i|
46 for (d.s[offset .. offset + rate], 0..) |*r, i|
4747 r.* ^= b[ip..][i];
4848
4949 keccakF(1600, &d.s);
......@@ -54,7 +54,7 @@ fn Keccak(comptime bits: usize, comptime delim: u8) type {
5454 offset = 0;
5555 }
5656
57 for (d.s[offset .. offset + len]) |*r, i|
57 for (d.s[offset .. offset + len], 0..) |*r, i|
5858 r.* ^= b[ip..][i];
5959
6060 d.offset = offset + len;
......@@ -126,7 +126,7 @@ fn keccakF(comptime F: usize, d: *[F / 8]u8) void {
126126 var t = [_]u64{0} ** 1;
127127 var c = [_]u64{0} ** 5;
128128
129 for (s) |*r, i| {
129 for (&s, 0..) |*r, i| {
130130 r.* = mem.readIntLittle(u64, d[8 * i ..][0..8]);
131131 }
132132
......@@ -171,7 +171,7 @@ fn keccakF(comptime F: usize, d: *[F / 8]u8) void {
171171 s[0] ^= round;
172172 }
173173
174 for (s) |r, i| {
174 for (s, 0..) |r, i| {
175175 mem.writeIntLittle(u64, d[8 * i ..][0..8], r);
176176 }
177177}
lib/std/crypto/siphash.zig+3-3
......@@ -339,7 +339,7 @@ test "siphash64-2-4 sanity" {
339339 const siphash = SipHash64(2, 4);
340340
341341 var buffer: [64]u8 = undefined;
342 for (vectors) |vector, i| {
342 for (vectors, 0..) |vector, i| {
343343 buffer[i] = @intCast(u8, i);
344344
345345 var out: [siphash.mac_length]u8 = undefined;
......@@ -419,7 +419,7 @@ test "siphash128-2-4 sanity" {
419419 const siphash = SipHash128(2, 4);
420420
421421 var buffer: [64]u8 = undefined;
422 for (vectors) |vector, i| {
422 for (vectors, 0..) |vector, i| {
423423 buffer[i] = @intCast(u8, i);
424424
425425 var out: [siphash.mac_length]u8 = undefined;
......@@ -430,7 +430,7 @@ test "siphash128-2-4 sanity" {
430430
431431test "iterative non-divisible update" {
432432 var buf: [1024]u8 = undefined;
433 for (buf) |*e, i| {
433 for (&buf, 0..) |*e, i| {
434434 e.* = @truncate(u8, i);
435435 }
436436
lib/std/crypto/test.zig+1-1
......@@ -13,7 +13,7 @@ pub fn assertEqualHash(comptime Hasher: anytype, comptime expected_hex: *const [
1313// Assert `expected` == hex(`input`) where `input` is a bytestring
1414pub fn assertEqual(comptime expected_hex: [:0]const u8, input: []const u8) !void {
1515 var expected_bytes: [expected_hex.len / 2]u8 = undefined;
16 for (expected_bytes) |*r, i| {
16 for (&expected_bytes, 0..) |*r, i| {
1717 r.* = fmt.parseInt(u8, expected_hex[2 * i .. 2 * i + 2], 16) catch unreachable;
1818 }
1919
lib/std/crypto/tls.zig+1-1
......@@ -344,7 +344,7 @@ pub inline fn array(comptime elem_size: comptime_int, bytes: anytype) [2 + bytes
344344pub inline fn enum_array(comptime E: type, comptime tags: []const E) [2 + @sizeOf(E) * tags.len]u8 {
345345 assert(@sizeOf(E) == 2);
346346 var result: [tags.len * 2]u8 = undefined;
347 for (tags) |elem, i| {
347 for (tags, 0..) |elem, i| {
348348 result[i * 2] = @truncate(u8, @enumToInt(elem) >> 8);
349349 result[i * 2 + 1] = @truncate(u8, @enumToInt(elem));
350350 }
lib/std/crypto/utils.zig+2-2
......@@ -18,7 +18,7 @@ pub fn timingSafeEql(comptime T: type, a: T, b: T) bool {
1818 @compileError("Elements to be compared must be integers");
1919 }
2020 var acc = @as(C, 0);
21 for (a) |x, i| {
21 for (a, 0..) |x, i| {
2222 acc |= x ^ b[i];
2323 }
2424 const s = @typeInfo(C).Int.bits;
......@@ -64,7 +64,7 @@ pub fn timingSafeCompare(comptime T: type, a: []const T, b: []const T, endian: E
6464 eq &= @truncate(T, (@as(Cext, (x2 ^ x1)) -% 1) >> bits);
6565 }
6666 } else {
67 for (a) |x1, i| {
67 for (a, 0..) |x1, i| {
6868 const x2 = b[i];
6969 gt |= @truncate(T, (@as(Cext, x2) -% @as(Cext, x1)) >> bits) & eq;
7070 eq &= @truncate(T, (@as(Cext, (x2 ^ x1)) -% 1) >> bits);
lib/std/crypto/xoodoo.zig+1-1
......@@ -66,7 +66,7 @@ pub const State = struct {
6666 /// XOR bytes into the beginning of the state.
6767 pub fn addBytes(self: *State, bytes: []const u8) void {
6868 self.endianSwap();
69 for (self.asBytes()[0..bytes.len]) |*byte, i| {
69 for (self.asBytes()[0..bytes.len], 0..) |*byte, i| {
7070 byte.* ^= bytes[i];
7171 }
7272 self.endianSwap();
lib/std/debug.zig+5-5
......@@ -213,7 +213,7 @@ pub fn captureStackTrace(first_address: ?usize, stack_trace: *std.builtin.StackT
213213 var addr_buf_stack: [32]usize = undefined;
214214 const addr_buf = if (addr_buf_stack.len > addrs.len) addr_buf_stack[0..] else addrs;
215215 const n = walkStackWindows(addr_buf[0..]);
216 const first_index = for (addr_buf[0..n]) |addr, i| {
216 const first_index = for (addr_buf[0..n], 0..) |addr, i| {
217217 if (addr == first_addr) {
218218 break i;
219219 }
......@@ -224,13 +224,13 @@ pub fn captureStackTrace(first_address: ?usize, stack_trace: *std.builtin.StackT
224224 const end_index = math.min(first_index + addrs.len, n);
225225 const slice = addr_buf[first_index..end_index];
226226 // We use a for loop here because slice and addrs may alias.
227 for (slice) |addr, i| {
227 for (slice, 0..) |addr, i| {
228228 addrs[i] = addr;
229229 }
230230 stack_trace.index = slice.len;
231231 } else {
232232 var it = StackIterator.init(first_address, null);
233 for (stack_trace.instruction_addresses) |*addr, i| {
233 for (stack_trace.instruction_addresses, 0..) |*addr, i| {
234234 addr.* = it.next() orelse {
235235 stack_trace.index = i;
236236 return;
......@@ -621,7 +621,7 @@ pub fn writeCurrentStackTraceWindows(
621621 const n = walkStackWindows(addr_buf[0..]);
622622 const addrs = addr_buf[0..n];
623623 var start_i: usize = if (start_addr) |saddr| blk: {
624 for (addrs) |addr, i| {
624 for (addrs, 0..) |addr, i| {
625625 if (addr == saddr) break :blk i;
626626 }
627627 return;
......@@ -2138,7 +2138,7 @@ pub fn ConfigurableTrace(comptime size: usize, comptime stack_frame_count: usize
21382138 ) catch return;
21392139 return;
21402140 };
2141 for (t.addrs[0..end]) |frames_array, i| {
2141 for (t.addrs[0..end], 0..) |frames_array, i| {
21422142 stderr.print("{s}:\n", .{t.notes[i]}) catch return;
21432143 var frames_array_mutable = frames_array;
21442144 const frames = mem.sliceTo(frames_array_mutable[0..], 0);
lib/std/dwarf.zig+1-1
......@@ -1064,7 +1064,7 @@ pub const DwarfInfo = struct {
10641064 .has_children = table_entry.has_children,
10651065 };
10661066 try result.attrs.resize(allocator, table_entry.attrs.items.len);
1067 for (table_entry.attrs.items) |attr, i| {
1067 for (table_entry.attrs.items, 0..) |attr, i| {
10681068 result.attrs.items[i] = Die.Attr{
10691069 .id = attr.attr_id,
10701070 .value = try parseFormValue(
lib/std/enums.zig+2-2
......@@ -35,7 +35,7 @@ pub fn EnumFieldStruct(comptime E: type, comptime Data: type, comptime field_def
3535pub fn valuesFromFields(comptime E: type, comptime fields: []const EnumField) []const E {
3636 comptime {
3737 var result: [fields.len]E = undefined;
38 for (fields) |f, i| {
38 for (fields, 0..) |f, i| {
3939 result[i] = @field(E, f.name);
4040 }
4141 return &result;
......@@ -1331,7 +1331,7 @@ pub fn EnumIndexer(comptime E: type) type {
13311331 pub const Key = E;
13321332 pub const count = fields_len;
13331333 pub fn indexOf(e: E) usize {
1334 for (keys) |k, i| {
1334 for (keys, 0..) |k, i| {
13351335 if (k == e) return i;
13361336 }
13371337 unreachable;
lib/std/event/loop.zig+2-2
......@@ -278,7 +278,7 @@ pub const Loop = struct {
278278
279279 const empty_kevs = &[0]os.Kevent{};
280280
281 for (self.eventfd_resume_nodes) |*eventfd_node, i| {
281 for (self.eventfd_resume_nodes, 0..) |*eventfd_node, i| {
282282 eventfd_node.* = std.atomic.Stack(ResumeNode.EventFd).Node{
283283 .data = ResumeNode.EventFd{
284284 .base = ResumeNode{
......@@ -343,7 +343,7 @@ pub const Loop = struct {
343343
344344 const empty_kevs = &[0]os.Kevent{};
345345
346 for (self.eventfd_resume_nodes) |*eventfd_node, i| {
346 for (self.eventfd_resume_nodes, 0..) |*eventfd_node, i| {
347347 eventfd_node.* = std.atomic.Stack(ResumeNode.EventFd).Node{
348348 .data = ResumeNode.EventFd{
349349 .base = ResumeNode{
lib/std/fmt.zig+5-5
......@@ -570,7 +570,7 @@ pub fn formatType(
570570 return writer.writeAll("{ ... }");
571571 }
572572 try writer.writeAll("{");
573 inline for (info.fields) |f, i| {
573 inline for (info.fields, 0..) |f, i| {
574574 if (i == 0) {
575575 try writer.writeAll(" ");
576576 } else {
......@@ -585,7 +585,7 @@ pub fn formatType(
585585 return writer.writeAll("{ ... }");
586586 }
587587 try writer.writeAll("{");
588 inline for (info.fields) |f, i| {
588 inline for (info.fields, 0..) |f, i| {
589589 if (i == 0) {
590590 try writer.writeAll(" .");
591591 } else {
......@@ -612,7 +612,7 @@ pub fn formatType(
612612 }
613613 }
614614 if (comptime std.meta.trait.isZigString(info.child)) {
615 for (value) |item, i| {
615 for (value, 0..) |item, i| {
616616 comptime checkTextFmt(actual_fmt);
617617 if (i != 0) try formatBuf(", ", options, writer);
618618 try formatBuf(item, options, writer);
......@@ -659,7 +659,7 @@ pub fn formatType(
659659 }
660660 }
661661 try writer.writeAll("{ ");
662 for (value) |elem, i| {
662 for (value, 0..) |elem, i| {
663663 try formatType(elem, actual_fmt, options, writer, max_depth - 1);
664664 if (i != value.len - 1) {
665665 try writer.writeAll(", ");
......@@ -684,7 +684,7 @@ pub fn formatType(
684684 }
685685 }
686686 try writer.writeAll("{ ");
687 for (value) |elem, i| {
687 for (value, 0..) |elem, i| {
688688 try formatType(elem, actual_fmt, options, writer, max_depth - 1);
689689 if (i < value.len - 1) {
690690 try writer.writeAll(", ");
lib/std/fmt/parse_float/decimal.zig+1-1
......@@ -475,7 +475,7 @@ pub fn Decimal(comptime T: type) type {
475475 const x = pow2_to_pow5_table[shift];
476476
477477 // Compare leading digits of current to check if lexicographically less than cutoff.
478 for (x.cutoff) |p5, i| {
478 for (x.cutoff, 0..) |p5, i| {
479479 if (i >= self.num_digits) {
480480 return x.delta - 1;
481481 } else if (self.digits[i] == p5 - '0') { // digits are stored as integers
lib/std/fs/path.zig+3-3
......@@ -48,7 +48,7 @@ fn joinSepMaybeZ(allocator: Allocator, separator: u8, comptime sepPredicate: fn
4848
4949 // Find first non-empty path index.
5050 const first_path_index = blk: {
51 for (paths) |path, index| {
51 for (paths, 0..) |path, index| {
5252 if (path.len == 0) continue else break :blk index;
5353 }
5454
......@@ -476,7 +476,7 @@ pub fn resolveWindows(allocator: Allocator, paths: []const []const u8) ![]u8 {
476476 var drive_kind = WindowsPath.Kind.None;
477477 var have_abs_path = false;
478478 var first_index: usize = 0;
479 for (paths) |p, i| {
479 for (paths, 0..) |p, i| {
480480 const parsed = windowsParsePath(p);
481481 if (parsed.is_abs) {
482482 have_abs_path = true;
......@@ -504,7 +504,7 @@ pub fn resolveWindows(allocator: Allocator, paths: []const []const u8) ![]u8 {
504504 first_index = 0;
505505 var correct_disk_designator = false;
506506
507 for (paths) |p, i| {
507 for (paths, 0..) |p, i| {
508508 const parsed = windowsParsePath(p);
509509 if (parsed.kind != WindowsPath.Kind.None) {
510510 if (parsed.kind == drive_kind) {
lib/std/fs/wasi.zig+1-1
......@@ -15,7 +15,7 @@ pub const Preopens = struct {
1515 names: []const []const u8,
1616
1717 pub fn find(p: Preopens, name: []const u8) ?os.fd_t {
18 for (p.names) |elem_name, i| {
18 for (p.names, 0..) |elem_name, i| {
1919 if (mem.eql(u8, elem_name, name)) {
2020 return @intCast(os.fd_t, i);
2121 }
lib/std/hash/crc.zig+3-3
......@@ -35,7 +35,7 @@ pub fn Crc(comptime W: type, comptime algorithm: Algorithm(W)) type {
3535 @as(I, algorithm.polynomial) << (@bitSizeOf(I) - @bitSizeOf(W));
3636
3737 var table: [256]I = undefined;
38 for (table) |*e, i| {
38 for (&table, 0..) |*e, i| {
3939 var crc: I = i;
4040 if (algorithm.reflect_input) {
4141 var j: usize = 0;
......@@ -124,7 +124,7 @@ pub fn Crc32WithPoly(comptime poly: Polynomial) type {
124124 @setEvalBranchQuota(20000);
125125 var tables: [8][256]u32 = undefined;
126126
127 for (tables[0]) |*e, i| {
127 for (&tables[0], 0..) |*e, i| {
128128 var crc = @intCast(u32, i);
129129 var j: usize = 0;
130130 while (j < 8) : (j += 1) {
......@@ -217,7 +217,7 @@ pub fn Crc32SmallWithPoly(comptime poly: Polynomial) type {
217217 const lookup_table = block: {
218218 var table: [16]u32 = undefined;
219219
220 for (table) |*e, i| {
220 for (&table, 0..) |*e, i| {
221221 var crc = @intCast(u32, i * 16);
222222 var j: usize = 0;
223223 while (j < 8) : (j += 1) {
lib/std/hash/wyhash.zig+1-1
......@@ -207,7 +207,7 @@ test "test vectors streaming" {
207207
208208test "iterative non-divisible update" {
209209 var buf: [8192]u8 = undefined;
210 for (buf) |*e, i| {
210 for (&buf, 0..) |*e, i| {
211211 e.* = @truncate(u8, i);
212212 }
213213
lib/std/hash_map.zig+2-2
......@@ -2119,7 +2119,7 @@ test "std.hash_map getOrPutAdapted" {
21192119
21202120 var real_keys: [keys.len]u64 = undefined;
21212121
2122 inline for (keys) |key_str, i| {
2122 inline for (keys, 0..) |key_str, i| {
21232123 const result = try map.getOrPutAdapted(key_str, AdaptedContext{});
21242124 try testing.expect(!result.found_existing);
21252125 real_keys[i] = std.fmt.parseInt(u64, key_str, 10) catch unreachable;
......@@ -2129,7 +2129,7 @@ test "std.hash_map getOrPutAdapted" {
21292129
21302130 try testing.expectEqual(map.count(), keys.len);
21312131
2132 inline for (keys) |key_str, i| {
2132 inline for (keys, 0..) |key_str, i| {
21332133 const result = try map.getOrPutAdapted(key_str, AdaptedContext{});
21342134 try testing.expect(result.found_existing);
21352135 try testing.expectEqual(real_keys[i], result.key_ptr.*);
lib/std/heap.zig+2-2
......@@ -724,7 +724,7 @@ pub fn testAllocator(base_allocator: mem.Allocator) !void {
724724
725725 var slice = try allocator.alloc(*i32, 100);
726726 try testing.expect(slice.len == 100);
727 for (slice) |*item, i| {
727 for (slice, 0..) |*item, i| {
728728 item.* = try allocator.create(i32);
729729 item.*.* = @intCast(i32, i);
730730 }
......@@ -732,7 +732,7 @@ pub fn testAllocator(base_allocator: mem.Allocator) !void {
732732 slice = try allocator.realloc(slice, 20000);
733733 try testing.expect(slice.len == 20000);
734734
735 for (slice[0..100]) |item, i| {
735 for (slice[0..100], 0..) |item, i| {
736736 try testing.expect(item.* == @intCast(i32, i));
737737 allocator.destroy(item);
738738 }
lib/std/heap/WasmPageAllocator.zig+1-1
......@@ -62,7 +62,7 @@ const FreeBlock = struct {
6262
6363 fn useRecycled(self: FreeBlock, num_pages: usize, log2_align: u8) usize {
6464 @setCold(true);
65 for (self.data) |segment, i| {
65 for (self.data, 0..) |segment, i| {
6666 const spills_into_next = @bitCast(i128, segment) < 0;
6767 const has_enough_bits = @popCount(segment) >= num_pages;
6868
lib/std/heap/general_purpose_allocator.zig+1-1
......@@ -349,7 +349,7 @@ pub fn GeneralPurposeAllocator(comptime config: Config) type {
349349 /// Emits log messages for leaks and then returns whether there were any leaks.
350350 pub fn detectLeaks(self: *Self) bool {
351351 var leaks = false;
352 for (self.buckets) |optional_bucket, bucket_i| {
352 for (self.buckets, 0..) |optional_bucket, bucket_i| {
353353 const first_bucket = optional_bucket orelse continue;
354354 const size_class = @as(usize, 1) << @intCast(math.Log2Int(usize), bucket_i);
355355 const used_bits_count = usedBitsCount(size_class);
lib/std/json.zig+6-6
......@@ -1280,7 +1280,7 @@ fn parsedEqual(a: anytype, b: @TypeOf(a)) bool {
12801280 }
12811281 },
12821282 .Array => {
1283 for (a) |e, i|
1283 for (a, 0..) |e, i|
12841284 if (!parsedEqual(e, b[i])) return false;
12851285 return true;
12861286 },
......@@ -1294,7 +1294,7 @@ fn parsedEqual(a: anytype, b: @TypeOf(a)) bool {
12941294 .One => return parsedEqual(a.*, b.*),
12951295 .Slice => {
12961296 if (a.len != b.len) return false;
1297 for (a) |e, i|
1297 for (a, 0..) |e, i|
12981298 if (!parsedEqual(e, b[i])) return false;
12991299 return true;
13001300 },
......@@ -1518,7 +1518,7 @@ fn parseInternal(
15181518 var r: T = undefined;
15191519 var fields_seen = [_]bool{false} ** structInfo.fields.len;
15201520 errdefer {
1521 inline for (structInfo.fields) |field, i| {
1521 inline for (structInfo.fields, 0..) |field, i| {
15221522 if (fields_seen[i] and !field.is_comptime) {
15231523 parseFree(field.type, @field(r, field.name), options);
15241524 }
......@@ -1533,7 +1533,7 @@ fn parseInternal(
15331533 var child_options = options;
15341534 child_options.allow_trailing_data = true;
15351535 var found = false;
1536 inline for (structInfo.fields) |field, i| {
1536 inline for (structInfo.fields, 0..) |field, i| {
15371537 // TODO: using switches here segfault the compiler (#2727?)
15381538 if ((stringToken.escapes == .None and mem.eql(u8, field.name, key_source_slice)) or (stringToken.escapes == .Some and (field.name.len == stringToken.decodedLength() and encodesTo(field.name, key_source_slice)))) {
15391539 // if (switch (stringToken.escapes) {
......@@ -1584,7 +1584,7 @@ fn parseInternal(
15841584 else => return error.UnexpectedToken,
15851585 }
15861586 }
1587 inline for (structInfo.fields) |field, i| {
1587 inline for (structInfo.fields, 0..) |field, i| {
15881588 if (!fields_seen[i]) {
15891589 if (field.default_value) |default_ptr| {
15901590 if (!field.is_comptime) {
......@@ -2367,7 +2367,7 @@ pub fn stringify(
23672367 if (child_options.whitespace) |*whitespace| {
23682368 whitespace.indent_level += 1;
23692369 }
2370 for (value) |x, i| {
2370 for (value, 0..) |x, i| {
23712371 if (i != 0) {
23722372 try out_stream.writeByte(',');
23732373 }
lib/std/json/test.zig+1-1
......@@ -2717,7 +2717,7 @@ test "string copy option" {
27172717 const copy_addr = &obj_copy.get("noescape").?.String[0];
27182718
27192719 var found_nocopy = false;
2720 for (input) |_, index| {
2720 for (input, 0..) |_, index| {
27212721 try testing.expect(copy_addr != &input[index]);
27222722 if (nocopy_addr == &input[index]) {
27232723 found_nocopy = true;
lib/std/math/big/int.zig+7-7
......@@ -1478,11 +1478,11 @@ pub const Mutable = struct {
14781478 // const x_trailing = std.mem.indexOfScalar(Limb, x.limbs[0..x.len], 0).?;
14791479 // const y_trailing = std.mem.indexOfScalar(Limb, y.limbs[0..y.len], 0).?;
14801480
1481 const x_trailing = for (x.limbs[0..x.len]) |xi, i| {
1481 const x_trailing = for (x.limbs[0..x.len], 0..) |xi, i| {
14821482 if (xi != 0) break i;
14831483 } else unreachable;
14841484
1485 const y_trailing = for (y.limbs[0..y.len]) |yi, i| {
1485 const y_trailing = for (y.limbs[0..y.len], 0..) |yi, i| {
14861486 if (yi != 0) break i;
14871487 } else unreachable;
14881488
......@@ -2108,7 +2108,7 @@ pub const Const = struct {
21082108 if (@sizeOf(UT) <= @sizeOf(Limb)) {
21092109 r = @intCast(UT, self.limbs[0]);
21102110 } else {
2111 for (self.limbs[0..self.limbs.len]) |_, ri| {
2111 for (self.limbs[0..self.limbs.len], 0..) |_, ri| {
21122112 const limb = self.limbs[self.limbs.len - ri - 1];
21132113 r <<= limb_bits;
21142114 r |= limb;
......@@ -3594,7 +3594,7 @@ fn lldiv1(quo: []Limb, rem: *Limb, a: []const Limb, b: Limb) void {
35943594 assert(quo.len >= a.len);
35953595
35963596 rem.* = 0;
3597 for (a) |_, ri| {
3597 for (a, 0..) |_, ri| {
35983598 const i = a.len - ri - 1;
35993599 const pdiv = ((@as(DoubleLimb, rem.*) << limb_bits) | a[i]);
36003600
......@@ -3620,7 +3620,7 @@ fn lldiv0p5(quo: []Limb, rem: *Limb, a: []const Limb, b: HalfLimb) void {
36203620 assert(quo.len >= a.len);
36213621
36223622 rem.* = 0;
3623 for (a) |_, ri| {
3623 for (a, 0..) |_, ri| {
36243624 const i = a.len - ri - 1;
36253625 const ai_high = a[i] >> half_limb_bits;
36263626 const ai_low = a[i] & ((1 << half_limb_bits) - 1);
......@@ -4028,7 +4028,7 @@ fn llsquareBasecase(r: []Limb, x: []const Limb) void {
40284028 // - Each mixed-product term appears twice for each column,
40294029 // - Squares are always in the 2k (0 <= k < N) column
40304030
4031 for (x_norm) |v, i| {
4031 for (x_norm, 0..) |v, i| {
40324032 // Accumulate all the x[i]*x[j] (with x!=j) products
40334033 const overflow = llmulLimb(.add, r[2 * i + 1 ..], x_norm[i + 1 ..], v);
40344034 assert(!overflow);
......@@ -4037,7 +4037,7 @@ fn llsquareBasecase(r: []Limb, x: []const Limb) void {
40374037 // Each product appears twice, multiply by 2
40384038 llshl(r, r[0 .. 2 * x_norm.len], 1);
40394039
4040 for (x_norm) |v, i| {
4040 for (x_norm, 0..) |v, i| {
40414041 // Compute and add the squares
40424042 const overflow = llmulLimb(.add, r[2 * i ..], x[i .. i + 1], v);
40434043 assert(!overflow);
lib/std/math/big/rational.zig+1-1
......@@ -70,7 +70,7 @@ pub const Rational = struct {
7070 start += 1;
7171 }
7272
73 for (str) |c, i| {
73 for (str, 0..) |c, i| {
7474 switch (state) {
7575 State.Integer => {
7676 switch (c) {
lib/std/mem.zig+12-12
......@@ -169,7 +169,7 @@ test "Allocator.resize" {
169169 var values = try testing.allocator.alloc(T, 100);
170170 defer testing.allocator.free(values);
171171
172 for (values) |*v, i| v.* = @intCast(T, i);
172 for (values, 0..) |*v, i| v.* = @intCast(T, i);
173173 if (!testing.allocator.resize(values, values.len + 10)) return error.OutOfMemory;
174174 values = values.ptr[0 .. values.len + 10];
175175 try testing.expect(values.len == 110);
......@@ -185,7 +185,7 @@ test "Allocator.resize" {
185185 var values = try testing.allocator.alloc(T, 100);
186186 defer testing.allocator.free(values);
187187
188 for (values) |*v, i| v.* = @intToFloat(T, i);
188 for (values, 0..) |*v, i| v.* = @intToFloat(T, i);
189189 if (!testing.allocator.resize(values, values.len + 10)) return error.OutOfMemory;
190190 values = values.ptr[0 .. values.len + 10];
191191 try testing.expect(values.len == 110);
......@@ -201,7 +201,7 @@ pub fn copy(comptime T: type, dest: []T, source: []const T) void {
201201 // this and automatically omit safety checks for loops
202202 @setRuntimeSafety(false);
203203 assert(dest.len >= source.len);
204 for (source) |s, i|
204 for (source, 0..) |s, i|
205205 dest[i] = s;
206206}
207207
......@@ -445,7 +445,7 @@ pub fn zeroInit(comptime T: type, init: anytype) T {
445445
446446 var value: T = undefined;
447447
448 inline for (struct_info.fields) |field, i| {
448 inline for (struct_info.fields, 0..) |field, i| {
449449 if (field.is_comptime) {
450450 continue;
451451 }
......@@ -611,7 +611,7 @@ test "lessThan" {
611611pub fn eql(comptime T: type, a: []const T, b: []const T) bool {
612612 if (a.len != b.len) return false;
613613 if (a.ptr == b.ptr) return true;
614 for (a) |item, index| {
614 for (a, 0..) |item, index| {
615615 if (b[index] != item) return false;
616616 }
617617 return true;
......@@ -1261,7 +1261,7 @@ pub fn readVarInt(comptime ReturnType: type, bytes: []const u8, endian: Endian)
12611261 },
12621262 .Little => {
12631263 const ShiftType = math.Log2Int(ReturnType);
1264 for (bytes) |b, index| {
1264 for (bytes, 0..) |b, index| {
12651265 result = result | (@as(ReturnType, b) << @intCast(ShiftType, index * 8));
12661266 }
12671267 },
......@@ -1328,7 +1328,7 @@ pub fn readVarPackedInt(
13281328 },
13291329 .Little => {
13301330 int = read_bytes[0] >> bit_shift;
1331 for (read_bytes[1..]) |elem, i| {
1331 for (read_bytes[1..], 0..) |elem, i| {
13321332 int |= (@as(uN, elem) << @intCast(Log2N, (8 * (i + 1) - bit_shift)));
13331333 }
13341334 },
......@@ -2907,7 +2907,7 @@ pub fn indexOfMin(comptime T: type, slice: []const T) usize {
29072907 assert(slice.len > 0);
29082908 var best = slice[0];
29092909 var index: usize = 0;
2910 for (slice[1..]) |item, i| {
2910 for (slice[1..], 0..) |item, i| {
29112911 if (item < best) {
29122912 best = item;
29132913 index = i + 1;
......@@ -2928,7 +2928,7 @@ pub fn indexOfMax(comptime T: type, slice: []const T) usize {
29282928 assert(slice.len > 0);
29292929 var best = slice[0];
29302930 var index: usize = 0;
2931 for (slice[1..]) |item, i| {
2931 for (slice[1..], 0..) |item, i| {
29322932 if (item > best) {
29332933 best = item;
29342934 index = i + 1;
......@@ -2952,7 +2952,7 @@ pub fn indexOfMinMax(comptime T: type, slice: []const T) struct { index_min: usi
29522952 var maxVal = slice[0];
29532953 var minIdx: usize = 0;
29542954 var maxIdx: usize = 0;
2955 for (slice[1..]) |item, i| {
2955 for (slice[1..], 0..) |item, i| {
29562956 if (item < minVal) {
29572957 minVal = item;
29582958 minIdx = i + 1;
......@@ -3117,7 +3117,7 @@ test "replace" {
31173117
31183118/// Replace all occurences of `needle` with `replacement`.
31193119pub fn replaceScalar(comptime T: type, slice: []T, needle: T, replacement: T) void {
3120 for (slice) |e, i| {
3120 for (slice, 0..) |e, i| {
31213121 if (e == needle) {
31223122 slice[i] = replacement;
31233123 }
......@@ -3372,7 +3372,7 @@ test "asBytes" {
33723372 try testing.expect(eql(u8, asBytes(&deadbeef), deadbeef_bytes));
33733373
33743374 var codeface = @as(u32, 0xC0DEFACE);
3375 for (asBytes(&codeface).*) |*b|
3375 for (asBytes(&codeface)) |*b|
33763376 b.* = 0;
33773377 try testing.expect(codeface == 0);
33783378
lib/std/meta.zig+14-14
......@@ -117,7 +117,7 @@ pub fn stringToEnum(comptime T: type, str: []const u8) ?T {
117117 const kvs = comptime build_kvs: {
118118 const EnumKV = struct { []const u8, T };
119119 var kvs_array: [@typeInfo(T).Enum.fields.len]EnumKV = undefined;
120 inline for (@typeInfo(T).Enum.fields) |enumField, i| {
120 inline for (@typeInfo(T).Enum.fields, 0..) |enumField, i| {
121121 kvs_array[i] = .{ enumField.name, @field(T, enumField.name) };
122122 }
123123 break :build_kvs kvs_array[0..];
......@@ -552,7 +552,7 @@ pub fn fieldNames(comptime T: type) *const [fields(T).len][]const u8 {
552552 comptime {
553553 const fieldInfos = fields(T);
554554 var names: [fieldInfos.len][]const u8 = undefined;
555 for (fieldInfos) |field, i| {
555 for (fieldInfos, 0..) |field, i| {
556556 names[i] = field.name;
557557 }
558558 return &names;
......@@ -593,7 +593,7 @@ pub fn tags(comptime T: type) *const [fields(T).len]T {
593593 comptime {
594594 const fieldInfos = fields(T);
595595 var res: [fieldInfos.len]T = undefined;
596 for (fieldInfos) |field, i| {
596 for (fieldInfos, 0..) |field, i| {
597597 res[i] = @field(T, field.name);
598598 }
599599 return &res;
......@@ -631,7 +631,7 @@ pub fn FieldEnum(comptime T: type) type {
631631
632632 if (@typeInfo(T) == .Union) {
633633 if (@typeInfo(T).Union.tag_type) |tag_type| {
634 for (std.enums.values(tag_type)) |v, i| {
634 for (std.enums.values(tag_type), 0..) |v, i| {
635635 if (@enumToInt(v) != i) break; // enum values not consecutive
636636 if (!std.mem.eql(u8, @tagName(v), field_infos[i].name)) break; // fields out of order
637637 } else {
......@@ -642,7 +642,7 @@ pub fn FieldEnum(comptime T: type) type {
642642
643643 var enumFields: [field_infos.len]std.builtin.Type.EnumField = undefined;
644644 var decls = [_]std.builtin.Type.Declaration{};
645 inline for (field_infos) |field, i| {
645 inline for (field_infos, 0..) |field, i| {
646646 enumFields[i] = .{
647647 .name = field.name,
648648 .value = i,
......@@ -672,7 +672,7 @@ fn expectEqualEnum(expected: anytype, actual: @TypeOf(expected)) !void {
672672 const expected_fields = @typeInfo(expected).Enum.fields;
673673 const actual_fields = @typeInfo(actual).Enum.fields;
674674 if (expected_fields.len != actual_fields.len) return error.FailedTest;
675 for (expected_fields) |expected_field, i| {
675 for (expected_fields, 0..) |expected_field, i| {
676676 const actual_field = actual_fields[i];
677677 try testing.expectEqual(expected_field.value, actual_field.value);
678678 try testing.expectEqualStrings(expected_field.name, actual_field.name);
......@@ -682,7 +682,7 @@ fn expectEqualEnum(expected: anytype, actual: @TypeOf(expected)) !void {
682682 const expected_decls = @typeInfo(expected).Enum.decls;
683683 const actual_decls = @typeInfo(actual).Enum.decls;
684684 if (expected_decls.len != actual_decls.len) return error.FailedTest;
685 for (expected_decls) |expected_decl, i| {
685 for (expected_decls, 0..) |expected_decl, i| {
686686 const actual_decl = actual_decls[i];
687687 try testing.expectEqual(expected_decl.is_pub, actual_decl.is_pub);
688688 try testing.expectEqualStrings(expected_decl.name, actual_decl.name);
......@@ -716,7 +716,7 @@ pub fn DeclEnum(comptime T: type) type {
716716 const fieldInfos = std.meta.declarations(T);
717717 var enumDecls: [fieldInfos.len]std.builtin.Type.EnumField = undefined;
718718 var decls = [_]std.builtin.Type.Declaration{};
719 inline for (fieldInfos) |field, i| {
719 inline for (fieldInfos, 0..) |field, i| {
720720 enumDecls[i] = .{ .name = field.name, .value = i };
721721 }
722722 return @Type(.{
......@@ -870,7 +870,7 @@ pub fn eql(a: anytype, b: @TypeOf(a)) bool {
870870 },
871871 .Array => {
872872 if (a.len != b.len) return false;
873 for (a) |e, i|
873 for (a, 0..) |e, i|
874874 if (!eql(e, b[i])) return false;
875875 return true;
876876 },
......@@ -988,7 +988,7 @@ pub fn intToEnum(comptime EnumTag: type, tag_int: anytype) IntToEnumError!EnumTa
988988/// Given a type and a name, return the field index according to source order.
989989/// Returns `null` if the field is not found.
990990pub fn fieldIndex(comptime T: type, comptime name: []const u8) ?comptime_int {
991 inline for (fields(T)) |field, i| {
991 inline for (fields(T), 0..) |field, i| {
992992 if (mem.eql(u8, field.name, name))
993993 return i;
994994 }
......@@ -1008,7 +1008,7 @@ pub fn declList(comptime Namespace: type, comptime Decl: type) []const *const De
10081008 comptime {
10091009 const decls = declarations(Namespace);
10101010 var array: [decls.len]*const Decl = undefined;
1011 for (decls) |decl, i| {
1011 for (decls, 0..) |decl, i| {
10121012 array[i] = &@field(Namespace, decl.name);
10131013 }
10141014 std.sort.sort(*const Decl, &array, {}, S.declNameLessThan);
......@@ -1069,7 +1069,7 @@ pub fn ArgsTuple(comptime Function: type) type {
10691069 @compileError("Cannot create ArgsTuple for variadic function");
10701070
10711071 var argument_field_list: [function_info.params.len]type = undefined;
1072 inline for (function_info.params) |arg, i| {
1072 inline for (function_info.params, 0..) |arg, i| {
10731073 const T = arg.type.?;
10741074 argument_field_list[i] = T;
10751075 }
......@@ -1090,7 +1090,7 @@ pub fn Tuple(comptime types: []const type) type {
10901090
10911091fn CreateUniqueTuple(comptime N: comptime_int, comptime types: [N]type) type {
10921092 var tuple_fields: [types.len]std.builtin.Type.StructField = undefined;
1093 inline for (types) |T, i| {
1093 inline for (types, 0..) |T, i| {
10941094 @setEvalBranchQuota(10_000);
10951095 var num_buf: [128]u8 = undefined;
10961096 tuple_fields[i] = .{
......@@ -1129,7 +1129,7 @@ const TupleTester = struct {
11291129 if (expected.len != fields_list.len)
11301130 @compileError("Argument count mismatch");
11311131
1132 inline for (fields_list) |fld, i| {
1132 inline for (fields_list, 0..) |fld, i| {
11331133 if (expected[i] != fld.type) {
11341134 @compileError("Field " ++ fld.name ++ " expected to be type " ++ @typeName(expected[i]) ++ ", but was type " ++ @typeName(fld.type));
11351135 }
lib/std/meta/trailer_flags.zig+5-5
......@@ -21,7 +21,7 @@ pub fn TrailerFlags(comptime Fields: type) type {
2121 pub const ActiveFields = std.enums.EnumFieldStruct(FieldEnum, bool, false);
2222 pub const FieldValues = blk: {
2323 comptime var fields: [bit_count]Type.StructField = undefined;
24 inline for (@typeInfo(Fields).Struct.fields) |struct_field, i| {
24 inline for (@typeInfo(Fields).Struct.fields, 0..) |struct_field, i| {
2525 fields[i] = Type.StructField{
2626 .name = struct_field.name,
2727 .type = ?struct_field.type,
......@@ -61,7 +61,7 @@ pub fn TrailerFlags(comptime Fields: type) type {
6161 /// `fields` is a boolean struct where each active field is set to `true`
6262 pub fn init(fields: ActiveFields) Self {
6363 var self: Self = .{ .bits = 0 };
64 inline for (@typeInfo(Fields).Struct.fields) |field, i| {
64 inline for (@typeInfo(Fields).Struct.fields, 0..) |field, i| {
6565 if (@field(fields, field.name))
6666 self.bits |= 1 << i;
6767 }
......@@ -70,7 +70,7 @@ pub fn TrailerFlags(comptime Fields: type) type {
7070
7171 /// `fields` is a struct with each field set to an optional value
7272 pub fn setMany(self: Self, p: [*]align(@alignOf(Fields)) u8, fields: FieldValues) void {
73 inline for (@typeInfo(Fields).Struct.fields) |field, i| {
73 inline for (@typeInfo(Fields).Struct.fields, 0..) |field, i| {
7474 if (@field(fields, field.name)) |value|
7575 self.set(p, @intToEnum(FieldEnum, i), value);
7676 }
......@@ -101,7 +101,7 @@ pub fn TrailerFlags(comptime Fields: type) type {
101101
102102 pub fn offset(self: Self, comptime field: FieldEnum) usize {
103103 var off: usize = 0;
104 inline for (@typeInfo(Fields).Struct.fields) |field_info, i| {
104 inline for (@typeInfo(Fields).Struct.fields, 0..) |field_info, i| {
105105 const active = (self.bits & (1 << i)) != 0;
106106 if (i == @enumToInt(field)) {
107107 assert(active);
......@@ -119,7 +119,7 @@ pub fn TrailerFlags(comptime Fields: type) type {
119119
120120 pub fn sizeInBytes(self: Self) usize {
121121 var off: usize = 0;
122 inline for (@typeInfo(Fields).Struct.fields) |field, i| {
122 inline for (@typeInfo(Fields).Struct.fields, 0..) |field, i| {
123123 if (@sizeOf(field.type) == 0)
124124 continue;
125125 if ((self.bits & (1 << i)) != 0) {
lib/std/multi_array_list.zig+13-13
......@@ -82,7 +82,7 @@ pub fn MultiArrayList(comptime S: type) type {
8282 alignment: usize,
8383 };
8484 var data: [fields.len]Data = undefined;
85 for (fields) |field_info, i| {
85 for (fields, 0..) |field_info, i| {
8686 data[i] = .{
8787 .size = @sizeOf(field_info.type),
8888 .size_index = i,
......@@ -98,7 +98,7 @@ pub fn MultiArrayList(comptime S: type) type {
9898 std.sort.sort(Data, &data, {}, Sort.lessThan);
9999 var sizes_bytes: [fields.len]usize = undefined;
100100 var field_indexes: [fields.len]usize = undefined;
101 for (data) |elem, i| {
101 for (data, 0..) |elem, i| {
102102 sizes_bytes[i] = elem.size;
103103 field_indexes[i] = elem.size_index;
104104 }
......@@ -131,7 +131,7 @@ pub fn MultiArrayList(comptime S: type) type {
131131 .capacity = self.capacity,
132132 };
133133 var ptr: [*]u8 = self.bytes;
134 for (sizes.bytes) |field_size, i| {
134 for (sizes.bytes, 0..) |field_size, i| {
135135 result.ptrs[sizes.fields[i]] = ptr;
136136 ptr += field_size * self.capacity;
137137 }
......@@ -148,7 +148,7 @@ pub fn MultiArrayList(comptime S: type) type {
148148 /// Overwrite one array element with new data.
149149 pub fn set(self: *Self, index: usize, elem: S) void {
150150 const slices = self.slice();
151 inline for (fields) |field_info, i| {
151 inline for (fields, 0..) |field_info, i| {
152152 slices.items(@intToEnum(Field, i))[index] = @field(elem, field_info.name);
153153 }
154154 }
......@@ -157,7 +157,7 @@ pub fn MultiArrayList(comptime S: type) type {
157157 pub fn get(self: Self, index: usize) S {
158158 const slices = self.slice();
159159 var result: S = undefined;
160 inline for (fields) |field_info, i| {
160 inline for (fields, 0..) |field_info, i| {
161161 @field(result, field_info.name) = slices.items(@intToEnum(Field, i))[index];
162162 }
163163 return result;
......@@ -230,7 +230,7 @@ pub fn MultiArrayList(comptime S: type) type {
230230 assert(index <= self.len);
231231 self.len += 1;
232232 const slices = self.slice();
233 inline for (fields) |field_info, field_index| {
233 inline for (fields, 0..) |field_info, field_index| {
234234 const field_slice = slices.items(@intToEnum(Field, field_index));
235235 var i: usize = self.len - 1;
236236 while (i > index) : (i -= 1) {
......@@ -245,7 +245,7 @@ pub fn MultiArrayList(comptime S: type) type {
245245 /// retain list ordering.
246246 pub fn swapRemove(self: *Self, index: usize) void {
247247 const slices = self.slice();
248 inline for (fields) |_, i| {
248 inline for (fields, 0..) |_, i| {
249249 const field_slice = slices.items(@intToEnum(Field, i));
250250 field_slice[index] = field_slice[self.len - 1];
251251 field_slice[self.len - 1] = undefined;
......@@ -257,7 +257,7 @@ pub fn MultiArrayList(comptime S: type) type {
257257 /// after it to preserve order.
258258 pub fn orderedRemove(self: *Self, index: usize) void {
259259 const slices = self.slice();
260 inline for (fields) |_, field_index| {
260 inline for (fields, 0..) |_, field_index| {
261261 const field_slice = slices.items(@intToEnum(Field, field_index));
262262 var i = index;
263263 while (i < self.len - 1) : (i += 1) {
......@@ -293,7 +293,7 @@ pub fn MultiArrayList(comptime S: type) type {
293293 capacityInBytes(new_len),
294294 ) catch {
295295 const self_slice = self.slice();
296 inline for (fields) |field_info, i| {
296 inline for (fields, 0..) |field_info, i| {
297297 if (@sizeOf(field_info.type) != 0) {
298298 const field = @intToEnum(Field, i);
299299 const dest_slice = self_slice.items(field)[new_len..];
......@@ -315,7 +315,7 @@ pub fn MultiArrayList(comptime S: type) type {
315315 self.len = new_len;
316316 const self_slice = self.slice();
317317 const other_slice = other.slice();
318 inline for (fields) |field_info, i| {
318 inline for (fields, 0..) |field_info, i| {
319319 if (@sizeOf(field_info.type) != 0) {
320320 const field = @intToEnum(Field, i);
321321 mem.copy(field_info.type, other_slice.items(field), self_slice.items(field));
......@@ -376,7 +376,7 @@ pub fn MultiArrayList(comptime S: type) type {
376376 };
377377 const self_slice = self.slice();
378378 const other_slice = other.slice();
379 inline for (fields) |field_info, i| {
379 inline for (fields, 0..) |field_info, i| {
380380 if (@sizeOf(field_info.type) != 0) {
381381 const field = @intToEnum(Field, i);
382382 mem.copy(field_info.type, other_slice.items(field), self_slice.items(field));
......@@ -395,7 +395,7 @@ pub fn MultiArrayList(comptime S: type) type {
395395 result.len = self.len;
396396 const self_slice = self.slice();
397397 const result_slice = result.slice();
398 inline for (fields) |field_info, i| {
398 inline for (fields, 0..) |field_info, i| {
399399 if (@sizeOf(field_info.type) != 0) {
400400 const field = @intToEnum(Field, i);
401401 mem.copy(field_info.type, result_slice.items(field), self_slice.items(field));
......@@ -412,7 +412,7 @@ pub fn MultiArrayList(comptime S: type) type {
412412 slice: Slice,
413413
414414 pub fn swap(sc: @This(), a_index: usize, b_index: usize) void {
415 inline for (fields) |field_info, i| {
415 inline for (fields, 0..) |field_info, i| {
416416 if (@sizeOf(field_info.type) != 0) {
417417 const field = @intToEnum(Field, i);
418418 const ptr = sc.slice.items(field);
lib/std/net.zig+7-7
......@@ -325,7 +325,7 @@ pub const Ip6Address = extern struct {
325325 var index: u8 = 0;
326326 var scope_id = false;
327327 var abbrv = false;
328 for (buf) |c, i| {
328 for (buf, 0..) |c, i| {
329329 if (scope_id) {
330330 if (c >= '0' and c <= '9') {
331331 const digit = c - '0';
......@@ -444,7 +444,7 @@ pub const Ip6Address = extern struct {
444444 var scope_id_value: [os.IFNAMESIZE - 1]u8 = undefined;
445445 var scope_id_index: usize = 0;
446446
447 for (buf) |c, i| {
447 for (buf, 0..) |c, i| {
448448 if (scope_id) {
449449 // Handling of percent-encoding should be for an URI library.
450450 if ((c >= '0' and c <= '9') or
......@@ -602,7 +602,7 @@ pub const Ip6Address = extern struct {
602602 .Big => big_endian_parts.*,
603603 .Little => blk: {
604604 var buf: [8]u16 = undefined;
605 for (big_endian_parts) |part, i| {
605 for (big_endian_parts, 0..) |part, i| {
606606 buf[i] = mem.bigToNative(u16, part);
607607 }
608608 break :blk buf;
......@@ -909,7 +909,7 @@ pub fn getAddressList(allocator: mem.Allocator, name: []const u8, port: u16) !*A
909909 result.canon_name = try canon.toOwnedSlice();
910910 }
911911
912 for (lookup_addrs.items) |lookup_addr, i| {
912 for (lookup_addrs.items, 0..) |lookup_addr, i| {
913913 result.addrs[i] = lookup_addr.addr;
914914 assert(result.addrs[i].getPort() == port);
915915 }
......@@ -989,7 +989,7 @@ fn linuxLookupName(
989989 // So far the label/precedence table cannot be customized.
990990 // This implementation is ported from musl libc.
991991 // A more idiomatic "ziggy" implementation would be welcome.
992 for (addrs.items) |*addr, i| {
992 for (addrs.items, 0..) |*addr, i| {
993993 var key: i32 = 0;
994994 var sa6: os.sockaddr.in6 = undefined;
995995 @memset(@ptrCast([*]u8, &sa6), 0, @sizeOf(os.sockaddr.in6));
......@@ -1118,7 +1118,7 @@ const defined_policies = [_]Policy{
11181118};
11191119
11201120fn policyOf(a: [16]u8) *const Policy {
1121 for (defined_policies) |*policy| {
1121 for (&defined_policies) |*policy| {
11221122 if (!mem.eql(u8, a[0..policy.len], policy.addr[0..policy.len])) continue;
11231123 if ((a[policy.len] & policy.mask) != policy.addr[policy.len]) continue;
11241124 return policy;
......@@ -1502,7 +1502,7 @@ fn resMSendRc(
15021502 try ns_list.resize(rc.ns.items.len);
15031503 const ns = ns_list.items;
15041504
1505 for (rc.ns.items) |iplit, i| {
1505 for (rc.ns.items, 0..) |iplit, i| {
15061506 ns[i] = iplit.addr;
15071507 assert(ns[i].getPort() == 53);
15081508 if (iplit.addr.any.family != os.AF.INET) {
lib/std/net/test.zig+1-1
......@@ -30,7 +30,7 @@ test "parse and render IPv6 addresses" {
3030 "ff01::fb",
3131 "::ffff:123.5.123.5",
3232 };
33 for (ips) |ip, i| {
33 for (ips, 0..) |ip, i| {
3434 var addr = net.Address.parseIp6(ip, 0) catch unreachable;
3535 var newIp = std.fmt.bufPrint(buffer[0..], "{}", .{addr}) catch unreachable;
3636 try std.testing.expect(std.mem.eql(u8, printed[i], newIp[1 .. newIp.len - 3]));
lib/std/once.zig+1-1
......@@ -53,7 +53,7 @@ test "Once executes its function just once" {
5353 var threads: [10]std.Thread = undefined;
5454 defer for (threads) |handle| handle.join();
5555
56 for (threads) |*handle| {
56 for (&threads) |*handle| {
5757 handle.* = try std.Thread.spawn(.{}, struct {
5858 fn thread_fn(x: u8) void {
5959 _ = x;
lib/std/os/linux.zig+1-1
......@@ -1245,7 +1245,7 @@ pub fn sendmmsg(fd: i32, msgvec: [*]mmsghdr_const, vlen: u32, flags: u32) usize
12451245 // see https://www.openwall.com/lists/musl/2014/06/07/5
12461246 const kvlen = if (vlen > IOV_MAX) IOV_MAX else vlen; // matches kernel
12471247 var next_unsent: usize = 0;
1248 for (msgvec[0..kvlen]) |*msg, i| {
1248 for (msgvec[0..kvlen], 0..) |*msg, i| {
12491249 var size: i32 = 0;
12501250 const msg_iovlen = @intCast(usize, msg.msg_hdr.msg_iovlen); // kernel side this is treated as unsigned
12511251 for (msg.msg_hdr.msg_iov[0..msg_iovlen]) |iov| {
lib/std/os/uefi/protocols/device_path_protocol.zig+1-1
......@@ -61,7 +61,7 @@ pub const DevicePathProtocol = extern struct {
6161 // The same as new.getPath(), but not const as we're filling it in.
6262 var ptr = @ptrCast([*:0]align(1) u16, @ptrCast([*]u8, new) + @sizeOf(MediaDevicePath.FilePathDevicePath));
6363
64 for (path) |s, i|
64 for (path, 0..) |s, i|
6565 ptr[i] = s;
6666
6767 ptr[path.len] = 0;
lib/std/os/windows.zig+1-1
......@@ -2858,7 +2858,7 @@ pub const GUID = extern struct {
28582858 assert(s[18] == '-');
28592859 assert(s[23] == '-');
28602860 var bytes: [16]u8 = undefined;
2861 for (hex_offsets) |hex_offset, i| {
2861 for (hex_offsets, 0..) |hex_offset, i| {
28622862 bytes[i] = (try std.fmt.charToDigit(s[hex_offset], 16)) << 4 |
28632863 try std.fmt.charToDigit(s[hex_offset + 1], 16);
28642864 }
lib/std/packed_int_array.zig+1-1
......@@ -215,7 +215,7 @@ pub fn PackedIntArrayEndian(comptime Int: type, comptime endian: Endian, comptim
215215 /// or, more likely, an array literal.
216216 pub fn init(ints: [int_count]Int) Self {
217217 var self = @as(Self, undefined);
218 for (ints) |int, i| self.set(i, int);
218 for (ints, 0..) |int, i| self.set(i, int);
219219 return self;
220220 }
221221
lib/std/pdb.zig+1-1
......@@ -922,7 +922,7 @@ const Msf = struct {
922922 }
923923
924924 const streams = try allocator.alloc(MsfStream, stream_count);
925 for (streams) |*stream, i| {
925 for (streams, 0..) |*stream, i| {
926926 const size = stream_sizes[i];
927927 if (size == 0) {
928928 stream.* = MsfStream{
lib/std/priority_dequeue.zig+1-1
......@@ -430,7 +430,7 @@ pub fn PriorityDequeue(comptime T: type, comptime Context: type, comptime compar
430430 const print = std.debug.print;
431431 print("{{ ", .{});
432432 print("items: ", .{});
433 for (self.items) |e, i| {
433 for (self.items, 0..) |e, i| {
434434 if (i >= self.len) break;
435435 print("{}, ", .{e});
436436 }
lib/std/priority_queue.zig+1-1
......@@ -263,7 +263,7 @@ pub fn PriorityQueue(comptime T: type, comptime Context: type, comptime compareF
263263 const print = std.debug.print;
264264 print("{{ ", .{});
265265 print("items: ", .{});
266 for (self.items) |e, i| {
266 for (self.items, 0..) |e, i| {
267267 if (i >= self.len) break;
268268 print("{}, ", .{e});
269269 }
lib/std/process.zig+2-2
......@@ -874,7 +874,7 @@ pub fn argsAlloc(allocator: Allocator) ![][:0]u8 {
874874 mem.copy(u8, result_contents, contents_slice);
875875
876876 var contents_index: usize = 0;
877 for (slice_sizes) |len, i| {
877 for (slice_sizes, 0..) |len, i| {
878878 const new_index = contents_index + len;
879879 result_slice_list[i] = result_contents[contents_index..new_index :0];
880880 contents_index = new_index + 1;
......@@ -1148,7 +1148,7 @@ pub fn execve(
11481148 const arena = arena_allocator.allocator();
11491149
11501150 const argv_buf = try arena.allocSentinel(?[*:0]u8, argv.len, null);
1151 for (argv) |arg, i| argv_buf[i] = (try arena.dupeZ(u8, arg)).ptr;
1151 for (argv, 0..) |arg, i| argv_buf[i] = (try arena.dupeZ(u8, arg)).ptr;
11521152
11531153 const envp = m: {
11541154 if (env_map) |m| {
lib/std/rand.zig+1-1
......@@ -414,7 +414,7 @@ pub const Random = struct {
414414 std.debug.assert(point < sum);
415415
416416 var accumulator: T = 0;
417 for (proportions) |p, index| {
417 for (proportions, 0..) |p, index| {
418418 accumulator += p;
419419 if (point < accumulator) return index;
420420 }
lib/std/rand/ziggurat.zig+2-2
......@@ -83,13 +83,13 @@ fn ZigTableGen(
8383 tables.x[0] = v / f(r);
8484 tables.x[1] = r;
8585
86 for (tables.x[2..256]) |*entry, i| {
86 for (tables.x[2..256], 0..) |*entry, i| {
8787 const last = tables.x[2 + i - 1];
8888 entry.* = f_inv(v / last + f(last));
8989 }
9090 tables.x[256] = 0;
9191
92 for (tables.f[0..]) |*entry, i| {
92 for (tables.f[0..], 0..) |*entry, i| {
9393 entry.* = f(tables.x[i]);
9494 }
9595
lib/std/simd.zig+1-1
......@@ -89,7 +89,7 @@ pub fn VectorCount(comptime VectorType: type) type {
8989pub inline fn iota(comptime T: type, comptime len: usize) @Vector(len, T) {
9090 comptime {
9191 var out: [len]T = undefined;
92 for (out) |*element, i| {
92 for (&out, 0..) |*element, i| {
9393 element.* = switch (@typeInfo(T)) {
9494 .Int => @intCast(T, i),
9595 .Float => @intToFloat(T, i),
lib/std/sort.zig+5-5
......@@ -1219,9 +1219,9 @@ fn testStableSort() !void {
12191219 IdAndValue{ .id = 2, .value = 0 },
12201220 },
12211221 };
1222 for (cases) |*case| {
1222 for (&cases) |*case| {
12231223 insertionSort(IdAndValue, (case.*)[0..], {}, cmpByValue);
1224 for (case.*) |item, i| {
1224 for (case.*, 0..) |item, i| {
12251225 try testing.expect(item.id == expected[i].id);
12261226 try testing.expect(item.value == expected[i].value);
12271227 }
......@@ -1373,7 +1373,7 @@ fn fuzzTest(rng: std.rand.Random) !void {
13731373 var array = try testing.allocator.alloc(IdAndValue, array_size);
13741374 defer testing.allocator.free(array);
13751375 // populate with random data
1376 for (array) |*item, index| {
1376 for (array, 0..) |*item, index| {
13771377 item.id = index;
13781378 item.value = rng.intRangeLessThan(i32, 0, 100);
13791379 }
......@@ -1401,7 +1401,7 @@ pub fn argMin(
14011401
14021402 var smallest = items[0];
14031403 var smallest_index: usize = 0;
1404 for (items[1..]) |item, i| {
1404 for (items[1..], 0..) |item, i| {
14051405 if (lessThan(context, item, smallest)) {
14061406 smallest = item;
14071407 smallest_index = i + 1;
......@@ -1453,7 +1453,7 @@ pub fn argMax(
14531453
14541454 var biggest = items[0];
14551455 var biggest_index: usize = 0;
1456 for (items[1..]) |item, i| {
1456 for (items[1..], 0..) |item, i| {
14571457 if (lessThan(context, biggest, item)) {
14581458 biggest = item;
14591459 biggest_index = i + 1;
lib/std/target.zig+4-4
......@@ -720,7 +720,7 @@ pub const Target = struct {
720720 /// Adds the specified feature set but not its dependencies.
721721 pub fn addFeatureSet(set: *Set, other_set: Set) void {
722722 if (builtin.zig_backend == .stage2_c) {
723 for (set.ints) |*int, i| int.* |= other_set.ints[i];
723 for (&set.ints, 0..) |*int, i| int.* |= other_set.ints[i];
724724 } else {
725725 set.ints = @as(@Vector(usize_count, usize), set.ints) | @as(@Vector(usize_count, usize), other_set.ints);
726726 }
......@@ -736,7 +736,7 @@ pub const Target = struct {
736736 /// Removes the specified feature but not its dependents.
737737 pub fn removeFeatureSet(set: *Set, other_set: Set) void {
738738 if (builtin.zig_backend == .stage2_c) {
739 for (set.ints) |*int, i| int.* &= ~other_set.ints[i];
739 for (&set.ints, 0..) |*int, i| int.* &= ~other_set.ints[i];
740740 } else {
741741 set.ints = @as(@Vector(usize_count, usize), set.ints) & ~@as(@Vector(usize_count, usize), other_set.ints);
742742 }
......@@ -747,7 +747,7 @@ pub const Target = struct {
747747
748748 var old = set.ints;
749749 while (true) {
750 for (all_features_list) |feature, index_usize| {
750 for (all_features_list, 0..) |feature, index_usize| {
751751 const index = @intCast(Index, index_usize);
752752 if (set.isEnabled(index)) {
753753 set.addFeatureSet(feature.dependencies);
......@@ -1330,7 +1330,7 @@ pub const Target = struct {
13301330 fn allCpusFromDecls(comptime cpus: type) []const *const Cpu.Model {
13311331 const decls = @typeInfo(cpus).Struct.decls;
13321332 var array: [decls.len]*const Cpu.Model = undefined;
1333 for (decls) |decl, i| {
1333 for (decls, 0..) |decl, i| {
13341334 array[i] = &@field(cpus, decl.name);
13351335 }
13361336 return &array;
lib/std/target/aarch64.zig+1-1
......@@ -1269,7 +1269,7 @@ pub const all_features = blk: {
12691269 .dependencies = featureSet(&[_]Feature{}),
12701270 };
12711271 const ti = @typeInfo(Feature);
1272 for (result) |*elem, i| {
1272 for (&result, 0..) |*elem, i| {
12731273 elem.index = i;
12741274 elem.name = ti.Enum.fields[i].name;
12751275 }
lib/std/target/amdgpu.zig+1-1
......@@ -1033,7 +1033,7 @@ pub const all_features = blk: {
10331033 .dependencies = featureSet(&[_]Feature{}),
10341034 };
10351035 const ti = @typeInfo(Feature);
1036 for (result) |*elem, i| {
1036 for (&result, 0..) |*elem, i| {
10371037 elem.index = i;
10381038 elem.name = ti.Enum.fields[i].name;
10391039 }
lib/std/target/arc.zig+1-1
......@@ -23,7 +23,7 @@ pub const all_features = blk: {
2323 .dependencies = featureSet(&[_]Feature{}),
2424 };
2525 const ti = @typeInfo(Feature);
26 for (result) |*elem, i| {
26 for (&result, 0..) |*elem, i| {
2727 elem.index = i;
2828 elem.name = ti.Enum.fields[i].name;
2929 }
lib/std/target/arm.zig+1-1
......@@ -1631,7 +1631,7 @@ pub const all_features = blk: {
16311631 .dependencies = featureSet(&[_]Feature{}),
16321632 };
16331633 const ti = @typeInfo(Feature);
1634 for (result) |*elem, i| {
1634 for (&result, 0..) |*elem, i| {
16351635 elem.index = i;
16361636 elem.name = ti.Enum.fields[i].name;
16371637 }
lib/std/target/avr.zig+1-1
......@@ -329,7 +329,7 @@ pub const all_features = blk: {
329329 }),
330330 };
331331 const ti = @typeInfo(Feature);
332 for (result) |*elem, i| {
332 for (&result, 0..) |*elem, i| {
333333 elem.index = i;
334334 elem.name = ti.Enum.fields[i].name;
335335 }
lib/std/target/bpf.zig+1-1
......@@ -35,7 +35,7 @@ pub const all_features = blk: {
3535 .dependencies = featureSet(&[_]Feature{}),
3636 };
3737 const ti = @typeInfo(Feature);
38 for (result) |*elem, i| {
38 for (&result, 0..) |*elem, i| {
3939 elem.index = i;
4040 elem.name = ti.Enum.fields[i].name;
4141 }
lib/std/target/csky.zig+1-1
......@@ -416,7 +416,7 @@ pub const all_features = blk: {
416416 .dependencies = featureSet(&[_]Feature{}),
417417 };
418418 const ti = @typeInfo(Feature);
419 for (result) |*elem, i| {
419 for (&result, 0..) |*elem, i| {
420420 elem.index = i;
421421 elem.name = ti.Enum.fields[i].name;
422422 }
lib/std/target/hexagon.zig+1-1
......@@ -268,7 +268,7 @@ pub const all_features = blk: {
268268 .dependencies = featureSet(&[_]Feature{}),
269269 };
270270 const ti = @typeInfo(Feature);
271 for (result) |*elem, i| {
271 for (&result, 0..) |*elem, i| {
272272 elem.index = i;
273273 elem.name = ti.Enum.fields[i].name;
274274 }
lib/std/target/m68k.zig+1-1
......@@ -153,7 +153,7 @@ pub const all_features = blk: {
153153 .dependencies = featureSet(&[_]Feature{}),
154154 };
155155 const ti = @typeInfo(Feature);
156 for (result) |*elem, i| {
156 for (&result, 0..) |*elem, i| {
157157 elem.index = i;
158158 elem.name = ti.Enum.fields[i].name;
159159 }
lib/std/target/mips.zig+1-1
......@@ -387,7 +387,7 @@ pub const all_features = blk: {
387387 .dependencies = featureSet(&[_]Feature{}),
388388 };
389389 const ti = @typeInfo(Feature);
390 for (result) |*elem, i| {
390 for (&result, 0..) |*elem, i| {
391391 elem.index = i;
392392 elem.name = ti.Enum.fields[i].name;
393393 }
lib/std/target/msp430.zig+1-1
......@@ -41,7 +41,7 @@ pub const all_features = blk: {
4141 .dependencies = featureSet(&[_]Feature{}),
4242 };
4343 const ti = @typeInfo(Feature);
44 for (result) |*elem, i| {
44 for (&result, 0..) |*elem, i| {
4545 elem.index = i;
4646 elem.name = ti.Enum.fields[i].name;
4747 }
lib/std/target/nvptx.zig+1-1
......@@ -221,7 +221,7 @@ pub const all_features = blk: {
221221 .dependencies = featureSet(&[_]Feature{}),
222222 };
223223 const ti = @typeInfo(Feature);
224 for (result) |*elem, i| {
224 for (&result, 0..) |*elem, i| {
225225 elem.index = i;
226226 elem.name = ti.Enum.fields[i].name;
227227 }
lib/std/target/powerpc.zig+1-1
......@@ -592,7 +592,7 @@ pub const all_features = blk: {
592592 }),
593593 };
594594 const ti = @typeInfo(Feature);
595 for (result) |*elem, i| {
595 for (&result, 0..) |*elem, i| {
596596 elem.index = i;
597597 elem.name = ti.Enum.fields[i].name;
598598 }
lib/std/target/riscv.zig+1-1
......@@ -660,7 +660,7 @@ pub const all_features = blk: {
660660 }),
661661 };
662662 const ti = @typeInfo(Feature);
663 for (result) |*elem, i| {
663 for (&result, 0..) |*elem, i| {
664664 elem.index = i;
665665 elem.name = ti.Enum.fields[i].name;
666666 }
lib/std/target/s390x.zig+1-1
......@@ -263,7 +263,7 @@ pub const all_features = blk: {
263263 .dependencies = featureSet(&[_]Feature{}),
264264 };
265265 const ti = @typeInfo(Feature);
266 for (result) |*elem, i| {
266 for (&result, 0..) |*elem, i| {
267267 elem.index = i;
268268 elem.name = ti.Enum.fields[i].name;
269269 }
lib/std/target/sparc.zig+1-1
......@@ -131,7 +131,7 @@ pub const all_features = blk: {
131131 .dependencies = featureSet(&[_]Feature{}),
132132 };
133133 const ti = @typeInfo(Feature);
134 for (result) |*elem, i| {
134 for (&result, 0..) |*elem, i| {
135135 elem.index = i;
136136 elem.name = ti.Enum.fields[i].name;
137137 }
lib/std/target/spirv.zig+1-1
......@@ -2075,7 +2075,7 @@ pub const all_features = blk: {
20752075 .dependencies = featureSet(&[_]Feature{}),
20762076 };
20772077 const ti = @typeInfo(Feature);
2078 for (result) |*elem, i| {
2078 for (&result, 0..) |*elem, i| {
20792079 elem.index = i;
20802080 elem.name = ti.Enum.fields[i].name;
20812081 }
lib/std/target/ve.zig+1-1
......@@ -23,7 +23,7 @@ pub const all_features = blk: {
2323 .dependencies = featureSet(&[_]Feature{}),
2424 };
2525 const ti = @typeInfo(Feature);
26 for (result) |*elem, i| {
26 for (&result, 0..) |*elem, i| {
2727 elem.index = i;
2828 elem.name = ti.Enum.fields[i].name;
2929 }
lib/std/target/wasm.zig+1-1
......@@ -89,7 +89,7 @@ pub const all_features = blk: {
8989 .dependencies = featureSet(&[_]Feature{}),
9090 };
9191 const ti = @typeInfo(Feature);
92 for (result) |*elem, i| {
92 for (&result, 0..) |*elem, i| {
9393 elem.index = i;
9494 elem.name = ti.Enum.fields[i].name;
9595 }
lib/std/target/x86.zig+1-1
......@@ -1045,7 +1045,7 @@ pub const all_features = blk: {
10451045 }),
10461046 };
10471047 const ti = @typeInfo(Feature);
1048 for (result) |*elem, i| {
1048 for (&result, 0..) |*elem, i| {
10491049 elem.index = i;
10501050 elem.name = ti.Enum.fields[i].name;
10511051 }
lib/std/testing.zig+4-4
......@@ -384,7 +384,7 @@ fn SliceDiffer(comptime T: type) type {
384384 const Self = @This();
385385
386386 pub fn write(self: Self, writer: anytype) !void {
387 for (self.expected) |value, i| {
387 for (self.expected, 0..) |value, i| {
388388 var full_index = self.start_index + i;
389389 const diff = if (i < self.actual.len) !std.meta.eql(self.actual[i], value) else true;
390390 if (diff) try self.ttyconf.setColor(writer, .Red);
......@@ -405,7 +405,7 @@ const BytesDiffer = struct {
405405 while (expected_iterator.next()) |chunk| {
406406 // to avoid having to calculate diffs twice per chunk
407407 var diffs: std.bit_set.IntegerBitSet(16) = .{ .mask = 0 };
408 for (chunk) |byte, i| {
408 for (chunk, 0..) |byte, i| {
409409 var absolute_byte_index = (expected_iterator.index - chunk.len) + i;
410410 const diff = if (absolute_byte_index < self.actual.len) self.actual[absolute_byte_index] != byte else true;
411411 if (diff) diffs.set(i);
......@@ -418,7 +418,7 @@ const BytesDiffer = struct {
418418 if (chunk.len < 8) missing_columns += 1;
419419 try writer.writeByteNTimes(' ', missing_columns);
420420 }
421 for (chunk) |byte, i| {
421 for (chunk, 0..) |byte, i| {
422422 const byte_to_print = if (std.ascii.isPrint(byte)) byte else '.';
423423 try self.writeByteDiff(writer, "{c}", byte_to_print, diffs.isSet(i));
424424 }
......@@ -1059,7 +1059,7 @@ pub fn checkAllAllocationFailures(backing_allocator: std.mem.Allocator, comptime
10591059 // Setup the tuple that will actually be used with @call (we'll need to insert
10601060 // the failing allocator in field @"0" before each @call)
10611061 var args: ArgsTuple = undefined;
1062 inline for (@typeInfo(@TypeOf(extra_args)).Struct.fields) |field, i| {
1062 inline for (@typeInfo(@TypeOf(extra_args)).Struct.fields, 0..) |field, i| {
10631063 const arg_i_str = comptime str: {
10641064 var str_buf: [100]u8 = undefined;
10651065 const args_i = i + 1;
lib/std/wasm.zig+2-2
......@@ -636,7 +636,7 @@ pub const Type = struct {
636636 if (fmt.len != 0) std.fmt.invalidFmtError(fmt, self);
637637 _ = opt;
638638 try writer.writeByte('(');
639 for (self.params) |param, i| {
639 for (self.params, 0..) |param, i| {
640640 try writer.print("{s}", .{@tagName(param)});
641641 if (i + 1 != self.params.len) {
642642 try writer.writeAll(", ");
......@@ -646,7 +646,7 @@ pub const Type = struct {
646646 if (self.returns.len == 0) {
647647 try writer.writeAll("nil");
648648 } else {
649 for (self.returns) |return_ty, i| {
649 for (self.returns, 0..) |return_ty, i| {
650650 try writer.print("{s}", .{@tagName(return_ty)});
651651 if (i + 1 != self.returns.len) {
652652 try writer.writeAll(", ");
lib/std/zig/Ast.zig+116-19
......@@ -136,7 +136,7 @@ pub fn tokenLocation(self: Ast, start_offset: ByteOffset, token_index: TokenInde
136136 .line_end = self.source.len,
137137 };
138138 const token_start = self.tokens.items(.start)[token_index];
139 for (self.source[start_offset..]) |c, i| {
139 for (self.source[start_offset..], 0..) |c, i| {
140140 if (i + start_offset == token_start) {
141141 loc.line_end = i + start_offset;
142142 while (loc.line_end < self.source.len and self.source[loc.line_end] != '\n') {
......@@ -179,7 +179,7 @@ pub fn tokenSlice(tree: Ast, token_index: TokenIndex) []const u8 {
179179pub fn extraData(tree: Ast, index: usize, comptime T: type) T {
180180 const fields = std.meta.fields(T);
181181 var result: T = undefined;
182 inline for (fields) |field, i| {
182 inline for (fields, 0..) |field, i| {
183183 comptime assert(field.type == Node.Index);
184184 @field(result, field.name) = tree.extra_data[index + i];
185185 }
......@@ -386,6 +386,12 @@ pub fn renderError(tree: Ast, parse_error: Error, stream: anytype) !void {
386386 .expected_comma_after_switch_prong => {
387387 return stream.writeAll("expected ',' after switch prong");
388388 },
389 .expected_comma_after_for_operand => {
390 return stream.writeAll("expected ',' after for operand");
391 },
392 .expected_comma_after_capture => {
393 return stream.writeAll("expected ',' after for capture");
394 },
389395 .expected_initializer => {
390396 return stream.writeAll("expected field initializer");
391397 },
......@@ -420,6 +426,12 @@ pub fn renderError(tree: Ast, parse_error: Error, stream: anytype) !void {
420426 .var_const_decl => {
421427 return stream.writeAll("use 'var' or 'const' to declare variable");
422428 },
429 .extra_for_capture => {
430 return stream.writeAll("excess for captures");
431 },
432 .for_input_not_captured => {
433 return stream.writeAll("for input is not captured");
434 },
423435
424436 .expected_token => {
425437 const found_tag = token_tags[parse_error.token + @boolToInt(parse_error.token_is_prev)];
......@@ -568,6 +580,7 @@ pub fn firstToken(tree: Ast, node: Node.Index) TokenIndex {
568580 .call,
569581 .call_comma,
570582 .switch_range,
583 .for_range,
571584 .error_union,
572585 => n = datas[n].lhs,
573586
......@@ -845,6 +858,12 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
845858 .switch_range,
846859 => n = datas[n].rhs,
847860
861 .for_range => if (datas[n].rhs != 0) {
862 n = datas[n].rhs;
863 } else {
864 return main_tokens[n] + end_offset;
865 },
866
848867 .field_access,
849868 .unwrap_optional,
850869 .grouped_expression,
......@@ -1263,11 +1282,15 @@ pub fn lastToken(tree: Ast, node: Node.Index) TokenIndex {
12631282 assert(extra.else_expr != 0);
12641283 n = extra.else_expr;
12651284 },
1266 .@"if", .@"for" => {
1285 .@"if" => {
12671286 const extra = tree.extraData(datas[n].rhs, Node.If);
12681287 assert(extra.else_expr != 0);
12691288 n = extra.else_expr;
12701289 },
1290 .@"for" => {
1291 const extra = @bitCast(Node.For, datas[n].rhs);
1292 n = tree.extra_data[datas[n].lhs + extra.inputs + @boolToInt(extra.has_else)];
1293 },
12711294 .@"suspend" => {
12721295 if (datas[n].lhs != 0) {
12731296 n = datas[n].lhs;
......@@ -1916,26 +1939,28 @@ pub fn whileFull(tree: Ast, node: Node.Index) full.While {
19161939 });
19171940}
19181941
1919pub fn forSimple(tree: Ast, node: Node.Index) full.While {
1920 const data = tree.nodes.items(.data)[node];
1921 return tree.fullWhileComponents(.{
1922 .while_token = tree.nodes.items(.main_token)[node],
1923 .cond_expr = data.lhs,
1924 .cont_expr = 0,
1942pub fn forSimple(tree: Ast, node: Node.Index) full.For {
1943 const data = &tree.nodes.items(.data)[node];
1944 const inputs: *[1]Node.Index = &data.lhs;
1945 return tree.fullForComponents(.{
1946 .for_token = tree.nodes.items(.main_token)[node],
1947 .inputs = inputs[0..1],
19251948 .then_expr = data.rhs,
19261949 .else_expr = 0,
19271950 });
19281951}
19291952
1930pub fn forFull(tree: Ast, node: Node.Index) full.While {
1953pub fn forFull(tree: Ast, node: Node.Index) full.For {
19311954 const data = tree.nodes.items(.data)[node];
1932 const extra = tree.extraData(data.rhs, Node.If);
1933 return tree.fullWhileComponents(.{
1934 .while_token = tree.nodes.items(.main_token)[node],
1935 .cond_expr = data.lhs,
1936 .cont_expr = 0,
1937 .then_expr = extra.then_expr,
1938 .else_expr = extra.else_expr,
1955 const extra = @bitCast(Node.For, data.rhs);
1956 const inputs = tree.extra_data[data.lhs..][0..extra.inputs];
1957 const then_expr = tree.extra_data[data.lhs + extra.inputs];
1958 const else_expr = if (extra.has_else) tree.extra_data[data.lhs + extra.inputs + 1] else 0;
1959 return tree.fullForComponents(.{
1960 .for_token = tree.nodes.items(.main_token)[node],
1961 .inputs = inputs,
1962 .then_expr = then_expr,
1963 .else_expr = else_expr,
19391964 });
19401965}
19411966
......@@ -2158,7 +2183,7 @@ fn fullAsmComponents(tree: Ast, info: full.Asm.Components) full.Asm {
21582183 if (token_tags[info.asm_token + 1] == .keyword_volatile) {
21592184 result.volatile_token = info.asm_token + 1;
21602185 }
2161 const outputs_end: usize = for (info.items) |item, i| {
2186 const outputs_end: usize = for (info.items, 0..) |item, i| {
21622187 switch (node_tags[item]) {
21632188 .asm_output => continue,
21642189 else => break i,
......@@ -2243,6 +2268,33 @@ fn fullWhileComponents(tree: Ast, info: full.While.Components) full.While {
22432268 return result;
22442269}
22452270
2271fn fullForComponents(tree: Ast, info: full.For.Components) full.For {
2272 const token_tags = tree.tokens.items(.tag);
2273 var result: full.For = .{
2274 .ast = info,
2275 .inline_token = null,
2276 .label_token = null,
2277 .payload_token = undefined,
2278 .else_token = undefined,
2279 };
2280 var tok_i = info.for_token - 1;
2281 if (token_tags[tok_i] == .keyword_inline) {
2282 result.inline_token = tok_i;
2283 tok_i -= 1;
2284 }
2285 if (token_tags[tok_i] == .colon and
2286 token_tags[tok_i - 1] == .identifier)
2287 {
2288 result.label_token = tok_i - 1;
2289 }
2290 const last_cond_token = tree.lastToken(info.inputs[info.inputs.len - 1]);
2291 result.payload_token = last_cond_token + 3 + @boolToInt(token_tags[last_cond_token + 1] == .comma);
2292 if (info.else_expr != 0) {
2293 result.else_token = tree.lastToken(info.then_expr) + 1;
2294 }
2295 return result;
2296}
2297
22462298fn fullCallComponents(tree: Ast, info: full.Call.Components) full.Call {
22472299 const token_tags = tree.tokens.items(.tag);
22482300 var result: full.Call = .{
......@@ -2279,6 +2331,12 @@ pub fn fullWhile(tree: Ast, node: Node.Index) ?full.While {
22792331 .while_simple => tree.whileSimple(node),
22802332 .while_cont => tree.whileCont(node),
22812333 .@"while" => tree.whileFull(node),
2334 else => null,
2335 };
2336}
2337
2338pub fn fullFor(tree: Ast, node: Node.Index) ?full.For {
2339 return switch (tree.nodes.items(.tag)[node]) {
22822340 .for_simple => tree.forSimple(node),
22832341 .@"for" => tree.forFull(node),
22842342 else => null,
......@@ -2453,6 +2511,34 @@ pub const full = struct {
24532511 };
24542512 };
24552513
2514 pub const For = struct {
2515 ast: Components,
2516 inline_token: ?TokenIndex,
2517 label_token: ?TokenIndex,
2518 payload_token: TokenIndex,
2519 /// Populated only if else_expr != 0.
2520 else_token: TokenIndex,
2521
2522 pub const Components = struct {
2523 for_token: TokenIndex,
2524 inputs: []const Node.Index,
2525 then_expr: Node.Index,
2526 else_expr: Node.Index,
2527 };
2528
2529 /// TODO: remove this after zig 0.11.0 is tagged.
2530 pub fn isOldSyntax(f: For, token_tags: []const Token.Tag) bool {
2531 if (f.ast.inputs.len != 1) return false;
2532 if (token_tags[f.payload_token + 1] == .comma) return true;
2533 if (token_tags[f.payload_token] == .asterisk and
2534 token_tags[f.payload_token + 2] == .comma)
2535 {
2536 return true;
2537 }
2538 return false;
2539 }
2540 };
2541
24562542 pub const ContainerField = struct {
24572543 comptime_token: ?TokenIndex,
24582544 ast: Components,
......@@ -2795,6 +2881,8 @@ pub const Error = struct {
27952881 expected_comma_after_param,
27962882 expected_comma_after_initializer,
27972883 expected_comma_after_switch_prong,
2884 expected_comma_after_for_operand,
2885 expected_comma_after_capture,
27982886 expected_initializer,
27992887 mismatched_binary_op_whitespace,
28002888 invalid_ampersand_ampersand,
......@@ -2802,6 +2890,8 @@ pub const Error = struct {
28022890 expected_var_const,
28032891 wrong_equal_var_decl,
28042892 var_const_decl,
2893 extra_for_capture,
2894 for_input_not_captured,
28052895
28062896 zig_style_container,
28072897 previous_field,
......@@ -3112,8 +3202,10 @@ pub const Node = struct {
31123202 @"while",
31133203 /// `for (lhs) rhs`.
31143204 for_simple,
3115 /// `for (lhs) a else b`. `if_list[rhs]`.
3205 /// `for (lhs[0..inputs]) lhs[inputs + 1] else lhs[inputs + 2]`. `For[rhs]`.
31163206 @"for",
3207 /// `lhs..rhs`.
3208 for_range,
31173209 /// `if (lhs) rhs`.
31183210 /// `if (lhs) |a| rhs`.
31193211 if_simple,
......@@ -3369,6 +3461,11 @@ pub const Node = struct {
33693461 then_expr: Index,
33703462 };
33713463
3464 pub const For = packed struct(u32) {
3465 inputs: u31,
3466 has_else: bool,
3467 };
3468
33723469 pub const FnProtoOne = struct {
33733470 /// Populated if there is exactly 1 parameter. Otherwise there are 0 parameters.
33743471 param: Index,
lib/std/zig/CrossTarget.zig+1-1
......@@ -317,7 +317,7 @@ pub fn parse(args: ParseOptions) !CrossTarget {
317317 index += 1;
318318 }
319319 const feature_name = cpu_features[start..index];
320 for (all_features) |feature, feat_index_usize| {
320 for (all_features, 0..) |feature, feat_index_usize| {
321321 const feat_index = @intCast(Target.Cpu.Feature.Set.Index, feat_index_usize);
322322 if (mem.eql(u8, feature_name, feature.name)) {
323323 set.addFeature(feat_index);
lib/std/zig/Parse.zig+139-57
......@@ -104,6 +104,8 @@ fn warnMsg(p: *Parse, msg: Ast.Error) error{OutOfMemory}!void {
104104 .expected_comma_after_param,
105105 .expected_comma_after_initializer,
106106 .expected_comma_after_switch_prong,
107 .expected_comma_after_for_operand,
108 .expected_comma_after_capture,
107109 .expected_semi_or_else,
108110 .expected_semi_or_lbrace,
109111 .expected_token,
......@@ -1149,22 +1151,18 @@ fn parseLoopStatement(p: *Parse) !Node.Index {
11491151 return p.fail(.expected_inlinable);
11501152}
11511153
1152/// ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload
1153///
11541154/// ForStatement
11551155/// <- ForPrefix BlockExpr ( KEYWORD_else Statement )?
11561156/// / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement )
11571157fn parseForStatement(p: *Parse) !Node.Index {
11581158 const for_token = p.eatToken(.keyword_for) orelse return null_node;
1159 _ = try p.expectToken(.l_paren);
1160 const array_expr = try p.expectExpr();
1161 _ = try p.expectToken(.r_paren);
1162 const found_payload = try p.parsePtrIndexPayload();
1163 if (found_payload == 0) try p.warn(.expected_loop_payload);
11641159
1165 // TODO propose to change the syntax so that semicolons are always required
1166 // inside while statements, even if there is an `else`.
1160 const scratch_top = p.scratch.items.len;
1161 defer p.scratch.shrinkRetainingCapacity(scratch_top);
1162 const inputs = try p.forPrefix();
1163
11671164 var else_required = false;
1165 var seen_semicolon = false;
11681166 const then_expr = blk: {
11691167 const block_expr = try p.parseBlockExpr();
11701168 if (block_expr != 0) break :blk block_expr;
......@@ -1173,39 +1171,40 @@ fn parseForStatement(p: *Parse) !Node.Index {
11731171 return p.fail(.expected_block_or_assignment);
11741172 }
11751173 if (p.eatToken(.semicolon)) |_| {
1176 return p.addNode(.{
1177 .tag = .for_simple,
1178 .main_token = for_token,
1179 .data = .{
1180 .lhs = array_expr,
1181 .rhs = assign_expr,
1182 },
1183 });
1174 seen_semicolon = true;
1175 break :blk assign_expr;
11841176 }
11851177 else_required = true;
11861178 break :blk assign_expr;
11871179 };
1188 _ = p.eatToken(.keyword_else) orelse {
1189 if (else_required) {
1190 try p.warn(.expected_semi_or_else);
1191 }
1180 var has_else = false;
1181 if (!seen_semicolon and p.eatToken(.keyword_else) != null) {
1182 try p.scratch.append(p.gpa, then_expr);
1183 const else_stmt = try p.expectStatement(false);
1184 try p.scratch.append(p.gpa, else_stmt);
1185 has_else = true;
1186 } else if (inputs == 1) {
1187 if (else_required) try p.warn(.expected_semi_or_else);
11921188 return p.addNode(.{
11931189 .tag = .for_simple,
11941190 .main_token = for_token,
11951191 .data = .{
1196 .lhs = array_expr,
1192 .lhs = p.scratch.items[scratch_top],
11971193 .rhs = then_expr,
11981194 },
11991195 });
1200 };
1196 } else {
1197 if (else_required) try p.warn(.expected_semi_or_else);
1198 try p.scratch.append(p.gpa, then_expr);
1199 }
12011200 return p.addNode(.{
12021201 .tag = .@"for",
12031202 .main_token = for_token,
12041203 .data = .{
1205 .lhs = array_expr,
1206 .rhs = try p.addExtra(Node.If{
1207 .then_expr = then_expr,
1208 .else_expr = try p.expectStatement(false),
1204 .lhs = (try p.listToSpan(p.scratch.items[scratch_top..])).start,
1205 .rhs = @bitCast(u32, Node.For{
1206 .inputs = @intCast(u31, inputs),
1207 .has_else = has_else,
12091208 }),
12101209 },
12111210 });
......@@ -2056,42 +2055,121 @@ fn parseBlock(p: *Parse) !Node.Index {
20562055 }
20572056}
20582057
2059/// ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload
2060///
20612058/// ForExpr <- ForPrefix Expr (KEYWORD_else Expr)?
20622059fn parseForExpr(p: *Parse) !Node.Index {
20632060 const for_token = p.eatToken(.keyword_for) orelse return null_node;
2064 _ = try p.expectToken(.l_paren);
2065 const array_expr = try p.expectExpr();
2066 _ = try p.expectToken(.r_paren);
2067 const found_payload = try p.parsePtrIndexPayload();
2068 if (found_payload == 0) try p.warn(.expected_loop_payload);
2061
2062 const scratch_top = p.scratch.items.len;
2063 defer p.scratch.shrinkRetainingCapacity(scratch_top);
2064 const inputs = try p.forPrefix();
20692065
20702066 const then_expr = try p.expectExpr();
2071 _ = p.eatToken(.keyword_else) orelse {
2067 var has_else = false;
2068 if (p.eatToken(.keyword_else)) |_| {
2069 try p.scratch.append(p.gpa, then_expr);
2070 const else_expr = try p.expectExpr();
2071 try p.scratch.append(p.gpa, else_expr);
2072 has_else = true;
2073 } else if (inputs == 1) {
20722074 return p.addNode(.{
20732075 .tag = .for_simple,
20742076 .main_token = for_token,
20752077 .data = .{
2076 .lhs = array_expr,
2078 .lhs = p.scratch.items[scratch_top],
20772079 .rhs = then_expr,
20782080 },
20792081 });
2080 };
2081 const else_expr = try p.expectExpr();
2082 } else {
2083 try p.scratch.append(p.gpa, then_expr);
2084 }
20822085 return p.addNode(.{
20832086 .tag = .@"for",
20842087 .main_token = for_token,
20852088 .data = .{
2086 .lhs = array_expr,
2087 .rhs = try p.addExtra(Node.If{
2088 .then_expr = then_expr,
2089 .else_expr = else_expr,
2089 .lhs = (try p.listToSpan(p.scratch.items[scratch_top..])).start,
2090 .rhs = @bitCast(u32, Node.For{
2091 .inputs = @intCast(u31, inputs),
2092 .has_else = has_else,
20902093 }),
20912094 },
20922095 });
20932096}
20942097
2098/// ForPrefix <- KEYWORD_for LPAREN ForInput (COMMA ForInput)* COMMA? RPAREN ForPayload
2099///
2100/// ForInput <- Expr (DOT2 Expr?)?
2101///
2102/// ForPayload <- PIPE ASTERISK? IDENTIFIER (COMMA ASTERISK? IDENTIFIER)* PIPE
2103fn forPrefix(p: *Parse) Error!usize {
2104 const start = p.scratch.items.len;
2105 _ = try p.expectToken(.l_paren);
2106
2107 while (true) {
2108 var input = try p.expectExpr();
2109 if (p.eatToken(.ellipsis2)) |ellipsis| {
2110 input = try p.addNode(.{
2111 .tag = .for_range,
2112 .main_token = ellipsis,
2113 .data = .{
2114 .lhs = input,
2115 .rhs = try p.parseExpr(),
2116 },
2117 });
2118 }
2119
2120 try p.scratch.append(p.gpa, input);
2121 switch (p.token_tags[p.tok_i]) {
2122 .comma => p.tok_i += 1,
2123 .r_paren => {
2124 p.tok_i += 1;
2125 break;
2126 },
2127 .colon, .r_brace, .r_bracket => return p.failExpected(.r_paren),
2128 // Likely just a missing comma; give error but continue parsing.
2129 else => try p.warn(.expected_comma_after_for_operand),
2130 }
2131 if (p.eatToken(.r_paren)) |_| break;
2132 }
2133 const inputs = p.scratch.items.len - start;
2134
2135 _ = p.eatToken(.pipe) orelse {
2136 try p.warn(.expected_loop_payload);
2137 return inputs;
2138 };
2139
2140 var warned_excess = false;
2141 var captures: u32 = 0;
2142 while (true) {
2143 _ = p.eatToken(.asterisk);
2144 const identifier = try p.expectToken(.identifier);
2145 captures += 1;
2146 if (!warned_excess and inputs == 1 and captures == 2) {
2147 // TODO remove the above condition after 0.11.0 release. this silences
2148 // the error so that zig fmt can fix it.
2149 } else if (captures > inputs and !warned_excess) {
2150 try p.warnMsg(.{ .tag = .extra_for_capture, .token = identifier });
2151 warned_excess = true;
2152 }
2153 switch (p.token_tags[p.tok_i]) {
2154 .comma => p.tok_i += 1,
2155 .pipe => {
2156 p.tok_i += 1;
2157 break;
2158 },
2159 // Likely just a missing comma; give error but continue parsing.
2160 else => try p.warn(.expected_comma_after_capture),
2161 }
2162 if (p.eatToken(.pipe)) |_| break;
2163 }
2164
2165 if (captures < inputs) {
2166 const index = p.scratch.items.len - captures;
2167 const input = p.nodes.items(.main_token)[p.scratch.items[index]];
2168 try p.warnMsg(.{ .tag = .for_input_not_captured, .token = input });
2169 }
2170 return inputs;
2171}
2172
20952173/// WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr?
20962174///
20972175/// WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)?
......@@ -2752,37 +2830,41 @@ fn expectPrimaryTypeExpr(p: *Parse) !Node.Index {
27522830 return node;
27532831}
27542832
2755/// ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload
2756///
27572833/// ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)?
27582834fn parseForTypeExpr(p: *Parse) !Node.Index {
27592835 const for_token = p.eatToken(.keyword_for) orelse return null_node;
2760 _ = try p.expectToken(.l_paren);
2761 const array_expr = try p.expectExpr();
2762 _ = try p.expectToken(.r_paren);
2763 const found_payload = try p.parsePtrIndexPayload();
2764 if (found_payload == 0) try p.warn(.expected_loop_payload);
2836
2837 const scratch_top = p.scratch.items.len;
2838 defer p.scratch.shrinkRetainingCapacity(scratch_top);
2839 const inputs = try p.forPrefix();
27652840
27662841 const then_expr = try p.expectTypeExpr();
2767 _ = p.eatToken(.keyword_else) orelse {
2842 var has_else = false;
2843 if (p.eatToken(.keyword_else)) |_| {
2844 try p.scratch.append(p.gpa, then_expr);
2845 const else_expr = try p.expectTypeExpr();
2846 try p.scratch.append(p.gpa, else_expr);
2847 has_else = true;
2848 } else if (inputs == 1) {
27682849 return p.addNode(.{
27692850 .tag = .for_simple,
27702851 .main_token = for_token,
27712852 .data = .{
2772 .lhs = array_expr,
2853 .lhs = p.scratch.items[scratch_top],
27732854 .rhs = then_expr,
27742855 },
27752856 });
2776 };
2777 const else_expr = try p.expectTypeExpr();
2857 } else {
2858 try p.scratch.append(p.gpa, then_expr);
2859 }
27782860 return p.addNode(.{
27792861 .tag = .@"for",
27802862 .main_token = for_token,
27812863 .data = .{
2782 .lhs = array_expr,
2783 .rhs = try p.addExtra(Node.If{
2784 .then_expr = then_expr,
2785 .else_expr = else_expr,
2864 .lhs = (try p.listToSpan(p.scratch.items[scratch_top..])).start,
2865 .rhs = @bitCast(u32, Node.For{
2866 .inputs = @intCast(u31, inputs),
2867 .has_else = has_else,
27862868 }),
27872869 },
27882870 });
lib/std/zig/fmt.zig+1-1
......@@ -25,7 +25,7 @@ pub fn fmtId(bytes: []const u8) std.fmt.Formatter(formatId) {
2525pub fn isValidId(bytes: []const u8) bool {
2626 if (bytes.len == 0) return false;
2727 if (mem.eql(u8, bytes, "_")) return false;
28 for (bytes) |c, i| {
28 for (bytes, 0..) |c, i| {
2929 switch (c) {
3030 '_', 'a'...'z', 'A'...'Z' => {},
3131 '0'...'9' => if (i == 0) return false,
lib/std/zig/parser_test.zig+59-12
......@@ -1,3 +1,23 @@
1// TODO: remove this after zig 0.11.0 is released
2test "zig fmt: transform old for loop syntax to new" {
3 try testTransform(
4 \\fn foo() void {
5 \\ for (a) |b, i| {
6 \\ _ = b; _ = i;
7 \\ }
8 \\}
9 \\
10 ,
11 \\fn foo() void {
12 \\ for (a, 0..) |b, i| {
13 \\ _ = b;
14 \\ _ = i;
15 \\ }
16 \\}
17 \\
18 );
19}
20
121test "zig fmt: tuple struct" {
222 try testCanonical(
323 \\const T = struct {
......@@ -3457,11 +3477,11 @@ test "zig fmt: for" {
34573477 \\ for (a) |*v|
34583478 \\ continue;
34593479 \\
3460 \\ for (a) |v, i| {
3480 \\ for (a, 0..) |v, i| {
34613481 \\ continue;
34623482 \\ }
34633483 \\
3464 \\ for (a) |v, i|
3484 \\ for (a, 0..) |v, i|
34653485 \\ continue;
34663486 \\
34673487 \\ for (a) |b| switch (b) {
......@@ -3469,17 +3489,24 @@ test "zig fmt: for" {
34693489 \\ d => {},
34703490 \\ };
34713491 \\
3472 \\ const res = for (a) |v, i| {
3492 \\ const res = for (a, 0..) |v, i| {
34733493 \\ break v;
34743494 \\ } else {
34753495 \\ unreachable;
34763496 \\ };
34773497 \\
34783498 \\ var num: usize = 0;
3479 \\ inline for (a) |v, i| {
3499 \\ inline for (a, 0..1) |v, i| {
34803500 \\ num += v;
34813501 \\ num += i;
34823502 \\ }
3503 \\
3504 \\ for (a, b) |
3505 \\ long_name,
3506 \\ another_long_name,
3507 \\ | {
3508 \\ continue;
3509 \\ }
34833510 \\}
34843511 \\
34853512 );
......@@ -3499,6 +3526,26 @@ test "zig fmt: for" {
34993526 \\}
35003527 \\
35013528 );
3529
3530 try testTransform(
3531 \\test "fix for" {
3532 \\ for (a, b, c,) |long, another, third,| {}
3533 \\}
3534 \\
3535 ,
3536 \\test "fix for" {
3537 \\ for (
3538 \\ a,
3539 \\ b,
3540 \\ c,
3541 \\ ) |
3542 \\ long,
3543 \\ another,
3544 \\ third,
3545 \\ | {}
3546 \\}
3547 \\
3548 );
35023549}
35033550
35043551test "zig fmt: for if" {
......@@ -4358,7 +4405,7 @@ test "zig fmt: hex literals with underscore separators" {
43584405 try testTransform(
43594406 \\pub fn orMask(a: [ 1_000 ]u64, b: [ 1_000] u64) [1_000]u64 {
43604407 \\ var c: [1_000]u64 = [1]u64{ 0xFFFF_FFFF_FFFF_FFFF}**1_000;
4361 \\ for (c [ 1_0 .. ]) |_, i| {
4408 \\ for (c [ 1_0 .. ], 0..) |_, i| {
43624409 \\ c[i] = (a[i] | b[i]) & 0xCCAA_CCAA_CCAA_CCAA;
43634410 \\ }
43644411 \\ return c;
......@@ -4368,7 +4415,7 @@ test "zig fmt: hex literals with underscore separators" {
43684415 ,
43694416 \\pub fn orMask(a: [1_000]u64, b: [1_000]u64) [1_000]u64 {
43704417 \\ var c: [1_000]u64 = [1]u64{0xFFFF_FFFF_FFFF_FFFF} ** 1_000;
4371 \\ for (c[1_0..]) |_, i| {
4418 \\ for (c[1_0..], 0..) |_, i| {
43724419 \\ c[i] = (a[i] | b[i]) & 0xCCAA_CCAA_CCAA_CCAA;
43734420 \\ }
43744421 \\ return c;
......@@ -4880,10 +4927,10 @@ test "zig fmt: remove trailing whitespace after doc comment" {
48804927test "zig fmt: for loop with ptr payload and index" {
48814928 try testCanonical(
48824929 \\test {
4883 \\ for (self.entries.items) |*item, i| {}
4884 \\ for (self.entries.items) |*item, i|
4930 \\ for (self.entries.items, 0..) |*item, i| {}
4931 \\ for (self.entries.items, 0..) |*item, i|
48854932 \\ a = b;
4886 \\ for (self.entries.items) |*item, i| a = b;
4933 \\ for (self.entries.items, 0..) |*item, i| a = b;
48874934 \\}
48884935 \\
48894936 );
......@@ -5471,7 +5518,7 @@ test "zig fmt: canonicalize symbols (primitive types)" {
54715518 \\ _ = @"void": {
54725519 \\ break :@"void";
54735520 \\ };
5474 \\ for ("hi") |@"u3", @"i4"| {
5521 \\ for ("hi", 0..) |@"u3", @"i4"| {
54755522 \\ _ = @"u3";
54765523 \\ _ = @"i4";
54775524 \\ }
......@@ -5523,7 +5570,7 @@ test "zig fmt: canonicalize symbols (primitive types)" {
55235570 \\ _ = void: {
55245571 \\ break :void;
55255572 \\ };
5526 \\ for ("hi") |@"u3", @"i4"| {
5573 \\ for ("hi", 0..) |@"u3", @"i4"| {
55275574 \\ _ = @"u3";
55285575 \\ _ = @"i4";
55295576 \\ }
......@@ -6131,7 +6178,7 @@ fn testError(source: [:0]const u8, expected_errors: []const Error) !void {
61316178 std.debug.print("errors found: {any}\n", .{tree.errors});
61326179 return err;
61336180 };
6134 for (expected_errors) |expected, i| {
6181 for (expected_errors, 0..) |expected, i| {
61356182 try std.testing.expectEqual(expected, tree.errors[i].tag);
61366183 }
61376184}
lib/std/zig/render.zig+157-32
......@@ -353,6 +353,16 @@ fn renderExpression(gpa: Allocator, ais: *Ais, tree: Ast, node: Ast.Node.Index,
353353 try renderToken(ais, tree, main_tokens[node], .none);
354354 return renderExpression(gpa, ais, tree, infix.rhs, space);
355355 },
356 .for_range => {
357 const infix = datas[node];
358 try renderExpression(gpa, ais, tree, infix.lhs, .none);
359 if (infix.rhs != 0) {
360 try renderToken(ais, tree, main_tokens[node], .none);
361 return renderExpression(gpa, ais, tree, infix.rhs, space);
362 } else {
363 return renderToken(ais, tree, main_tokens[node], space);
364 }
365 },
356366
357367 .add,
358368 .add_wrap,
......@@ -694,9 +704,11 @@ fn renderExpression(gpa: Allocator, ais: *Ais, tree: Ast, node: Ast.Node.Index,
694704 .while_simple,
695705 .while_cont,
696706 .@"while",
707 => return renderWhile(gpa, ais, tree, tree.fullWhile(node).?, space),
708
697709 .for_simple,
698710 .@"for",
699 => return renderWhile(gpa, ais, tree, tree.fullWhile(node).?, space),
711 => return renderFor(gpa, ais, tree, tree.fullFor(node).?, space),
700712
701713 .if_simple,
702714 .@"if",
......@@ -1054,10 +1066,9 @@ fn renderIf(gpa: Allocator, ais: *Ais, tree: Ast, if_node: Ast.full.If, space: S
10541066 }, space);
10551067}
10561068
1057/// Note that this function is additionally used to render if and for expressions, with
1069/// Note that this function is additionally used to render if expressions, with
10581070/// respective values set to null.
10591071fn renderWhile(gpa: Allocator, ais: *Ais, tree: Ast, while_node: Ast.full.While, space: Space) Error!void {
1060 const node_tags = tree.nodes.items(.tag);
10611072 const token_tags = tree.tokens.items(.tag);
10621073
10631074 if (while_node.label_token) |label| {
......@@ -1108,9 +1119,34 @@ fn renderWhile(gpa: Allocator, ais: *Ais, tree: Ast, while_node: Ast.full.While,
11081119 last_prefix_token = tree.lastToken(while_node.ast.cont_expr) + 1; // rparen
11091120 }
11101121
1111 const then_expr_is_block = nodeIsBlock(node_tags[while_node.ast.then_expr]);
1122 try renderThenElse(
1123 gpa,
1124 ais,
1125 tree,
1126 last_prefix_token,
1127 while_node.ast.then_expr,
1128 while_node.else_token,
1129 while_node.error_token,
1130 while_node.ast.else_expr,
1131 space,
1132 );
1133}
1134
1135fn renderThenElse(
1136 gpa: Allocator,
1137 ais: *Ais,
1138 tree: Ast,
1139 last_prefix_token: Ast.TokenIndex,
1140 then_expr: Ast.Node.Index,
1141 else_token: Ast.TokenIndex,
1142 maybe_error_token: ?Ast.TokenIndex,
1143 else_expr: Ast.Node.Index,
1144 space: Space,
1145) Error!void {
1146 const node_tags = tree.nodes.items(.tag);
1147 const then_expr_is_block = nodeIsBlock(node_tags[then_expr]);
11121148 const indent_then_expr = !then_expr_is_block and
1113 !tree.tokensOnSameLine(last_prefix_token, tree.firstToken(while_node.ast.then_expr));
1149 !tree.tokensOnSameLine(last_prefix_token, tree.firstToken(then_expr));
11141150 if (indent_then_expr or (then_expr_is_block and ais.isLineOverIndented())) {
11151151 ais.pushIndentNextLine();
11161152 try renderToken(ais, tree, last_prefix_token, .newline);
......@@ -1119,45 +1155,126 @@ fn renderWhile(gpa: Allocator, ais: *Ais, tree: Ast, while_node: Ast.full.While,
11191155 try renderToken(ais, tree, last_prefix_token, .space);
11201156 }
11211157
1122 if (while_node.ast.else_expr != 0) {
1158 if (else_expr != 0) {
11231159 if (indent_then_expr) {
11241160 ais.pushIndent();
1125 try renderExpression(gpa, ais, tree, while_node.ast.then_expr, .newline);
1161 try renderExpression(gpa, ais, tree, then_expr, .newline);
11261162 ais.popIndent();
11271163 } else {
1128 try renderExpression(gpa, ais, tree, while_node.ast.then_expr, .space);
1164 try renderExpression(gpa, ais, tree, then_expr, .space);
11291165 }
11301166
1131 var last_else_token = while_node.else_token;
1167 var last_else_token = else_token;
11321168
1133 if (while_node.error_token) |error_token| {
1134 try renderToken(ais, tree, while_node.else_token, .space); // else
1169 if (maybe_error_token) |error_token| {
1170 try renderToken(ais, tree, else_token, .space); // else
11351171 try renderToken(ais, tree, error_token - 1, .none); // |
11361172 try renderIdentifier(ais, tree, error_token, .none, .preserve_when_shadowing); // identifier
11371173 last_else_token = error_token + 1; // |
11381174 }
11391175
11401176 const indent_else_expr = indent_then_expr and
1141 !nodeIsBlock(node_tags[while_node.ast.else_expr]) and
1142 !nodeIsIfForWhileSwitch(node_tags[while_node.ast.else_expr]);
1177 !nodeIsBlock(node_tags[else_expr]) and
1178 !nodeIsIfForWhileSwitch(node_tags[else_expr]);
11431179 if (indent_else_expr) {
11441180 ais.pushIndentNextLine();
11451181 try renderToken(ais, tree, last_else_token, .newline);
11461182 ais.popIndent();
1147 try renderExpressionIndented(gpa, ais, tree, while_node.ast.else_expr, space);
1183 try renderExpressionIndented(gpa, ais, tree, else_expr, space);
11481184 } else {
11491185 try renderToken(ais, tree, last_else_token, .space);
1150 try renderExpression(gpa, ais, tree, while_node.ast.else_expr, space);
1186 try renderExpression(gpa, ais, tree, else_expr, space);
11511187 }
11521188 } else {
11531189 if (indent_then_expr) {
1154 try renderExpressionIndented(gpa, ais, tree, while_node.ast.then_expr, space);
1190 try renderExpressionIndented(gpa, ais, tree, then_expr, space);
11551191 } else {
1156 try renderExpression(gpa, ais, tree, while_node.ast.then_expr, space);
1192 try renderExpression(gpa, ais, tree, then_expr, space);
11571193 }
11581194 }
11591195}
11601196
1197fn renderFor(gpa: Allocator, ais: *Ais, tree: Ast, for_node: Ast.full.For, space: Space) Error!void {
1198 const token_tags = tree.tokens.items(.tag);
1199
1200 if (for_node.label_token) |label| {
1201 try renderIdentifier(ais, tree, label, .none, .eagerly_unquote); // label
1202 try renderToken(ais, tree, label + 1, .space); // :
1203 }
1204
1205 if (for_node.inline_token) |inline_token| {
1206 try renderToken(ais, tree, inline_token, .space); // inline
1207 }
1208
1209 try renderToken(ais, tree, for_node.ast.for_token, .space); // if/for/while
1210
1211 const lparen = for_node.ast.for_token + 1;
1212 try renderParamList(gpa, ais, tree, lparen, for_node.ast.inputs, .space);
1213
1214 // TODO remove this after zig 0.11.0
1215 if (for_node.isOldSyntax(token_tags)) {
1216 // old: for (a) |b, c| {}
1217 // new: for (a, 0..) |b, c| {}
1218 const array_list = ais.underlying_writer.context; // abstractions? who needs 'em!
1219 if (mem.endsWith(u8, array_list.items, ") ")) {
1220 array_list.items.len -= 2;
1221 try array_list.appendSlice(", 0..) ");
1222 }
1223 }
1224
1225 var cur = for_node.payload_token;
1226 const pipe = std.mem.indexOfScalarPos(std.zig.Token.Tag, token_tags, cur, .pipe).?;
1227 if (token_tags[pipe - 1] == .comma) {
1228 ais.pushIndentNextLine();
1229 try renderToken(ais, tree, cur - 1, .newline); // |
1230 while (true) {
1231 if (token_tags[cur] == .asterisk) {
1232 try renderToken(ais, tree, cur, .none); // *
1233 cur += 1;
1234 }
1235 try renderIdentifier(ais, tree, cur, .none, .preserve_when_shadowing); // identifier
1236 cur += 1;
1237 if (token_tags[cur] == .comma) {
1238 try renderToken(ais, tree, cur, .newline); // ,
1239 cur += 1;
1240 }
1241 if (token_tags[cur] == .pipe) {
1242 break;
1243 }
1244 }
1245 ais.popIndent();
1246 } else {
1247 try renderToken(ais, tree, cur - 1, .none); // |
1248 while (true) {
1249 if (token_tags[cur] == .asterisk) {
1250 try renderToken(ais, tree, cur, .none); // *
1251 cur += 1;
1252 }
1253 try renderIdentifier(ais, tree, cur, .none, .preserve_when_shadowing); // identifier
1254 cur += 1;
1255 if (token_tags[cur] == .comma) {
1256 try renderToken(ais, tree, cur, .space); // ,
1257 cur += 1;
1258 }
1259 if (token_tags[cur] == .pipe) {
1260 break;
1261 }
1262 }
1263 }
1264
1265 try renderThenElse(
1266 gpa,
1267 ais,
1268 tree,
1269 cur,
1270 for_node.ast.then_expr,
1271 for_node.else_token,
1272 null,
1273 for_node.ast.else_expr,
1274 space,
1275 );
1276}
1277
11611278fn renderContainerField(
11621279 gpa: Allocator,
11631280 ais: *Ais,
......@@ -1290,7 +1407,7 @@ fn renderBuiltinCall(
12901407 // Render all on one line, no trailing comma.
12911408 try renderToken(ais, tree, builtin_token + 1, .none); // (
12921409
1293 for (params) |param_node, i| {
1410 for (params, 0..) |param_node, i| {
12941411 const first_param_token = tree.firstToken(param_node);
12951412 if (token_tags[first_param_token] == .multiline_string_literal_line or
12961413 hasSameLineComment(tree, first_param_token - 1))
......@@ -1622,7 +1739,7 @@ fn renderBlock(
16221739 try renderToken(ais, tree, lbrace, .none);
16231740 } else {
16241741 try renderToken(ais, tree, lbrace, .newline);
1625 for (statements) |stmt, i| {
1742 for (statements, 0..) |stmt, i| {
16261743 if (i != 0) try renderExtraNewline(ais, tree, stmt);
16271744 switch (node_tags[stmt]) {
16281745 .global_var_decl,
......@@ -1785,7 +1902,7 @@ fn renderArrayInit(
17851902 const section_end = sec_end: {
17861903 var this_line_first_expr: usize = 0;
17871904 var this_line_size = rowSize(tree, row_exprs, rbrace);
1788 for (row_exprs) |expr, i| {
1905 for (row_exprs, 0..) |expr, i| {
17891906 // Ignore comment on first line of this section.
17901907 if (i == 0) continue;
17911908 const expr_last_token = tree.lastToken(expr);
......@@ -1824,7 +1941,7 @@ fn renderArrayInit(
18241941 var column_counter: usize = 0;
18251942 var single_line = true;
18261943 var contains_newline = false;
1827 for (section_exprs) |expr, i| {
1944 for (section_exprs, 0..) |expr, i| {
18281945 const start = sub_expr_buffer.items.len;
18291946 sub_expr_buffer_starts[i] = start;
18301947
......@@ -1866,7 +1983,7 @@ fn renderArrayInit(
18661983
18671984 // Render exprs in current section.
18681985 column_counter = 0;
1869 for (section_exprs) |expr, i| {
1986 for (section_exprs, 0..) |expr, i| {
18701987 const start = sub_expr_buffer_starts[i];
18711988 const end = sub_expr_buffer_starts[i + 1];
18721989 const expr_text = sub_expr_buffer.items[start..end];
......@@ -2023,7 +2140,7 @@ fn renderContainerDecl(
20232140 if (token_tags[lbrace + 1] == .container_doc_comment) {
20242141 try renderContainerDocComments(ais, tree, lbrace + 1);
20252142 }
2026 for (container_decl.ast.members) |member, i| {
2143 for (container_decl.ast.members, 0..) |member, i| {
20272144 if (i != 0) try renderExtraNewline(ais, tree, member);
20282145 switch (tree.nodes.items(.tag)[member]) {
20292146 // For container fields, ensure a trailing comma is added if necessary.
......@@ -2109,7 +2226,7 @@ fn renderAsm(
21092226 try renderToken(ais, tree, colon1, .space); // :
21102227
21112228 ais.pushIndent();
2112 for (asm_node.outputs) |asm_output, i| {
2229 for (asm_node.outputs, 0..) |asm_output, i| {
21132230 if (i + 1 < asm_node.outputs.len) {
21142231 const next_asm_output = asm_node.outputs[i + 1];
21152232 try renderAsmOutput(gpa, ais, tree, asm_output, .none);
......@@ -2141,7 +2258,7 @@ fn renderAsm(
21412258 } else colon3: {
21422259 try renderToken(ais, tree, colon2, .space); // :
21432260 ais.pushIndent();
2144 for (asm_node.inputs) |asm_input, i| {
2261 for (asm_node.inputs, 0..) |asm_input, i| {
21452262 if (i + 1 < asm_node.inputs.len) {
21462263 const next_asm_input = asm_node.inputs[i + 1];
21472264 try renderAsmInput(gpa, ais, tree, asm_input, .none);
......@@ -2206,15 +2323,23 @@ fn renderCall(
22062323 call: Ast.full.Call,
22072324 space: Space,
22082325) Error!void {
2209 const token_tags = tree.tokens.items(.tag);
2210
22112326 if (call.async_token) |async_token| {
22122327 try renderToken(ais, tree, async_token, .space);
22132328 }
22142329 try renderExpression(gpa, ais, tree, call.ast.fn_expr, .none);
2330 try renderParamList(gpa, ais, tree, call.ast.lparen, call.ast.params, space);
2331}
2332
2333fn renderParamList(
2334 gpa: Allocator,
2335 ais: *Ais,
2336 tree: Ast,
2337 lparen: Ast.TokenIndex,
2338 params: []const Ast.Node.Index,
2339 space: Space,
2340) Error!void {
2341 const token_tags = tree.tokens.items(.tag);
22152342
2216 const lparen = call.ast.lparen;
2217 const params = call.ast.params;
22182343 if (params.len == 0) {
22192344 ais.pushIndentNextLine();
22202345 try renderToken(ais, tree, lparen, .none);
......@@ -2227,7 +2352,7 @@ fn renderCall(
22272352 if (token_tags[after_last_param_tok] == .comma) {
22282353 ais.pushIndentNextLine();
22292354 try renderToken(ais, tree, lparen, .newline); // (
2230 for (params) |param_node, i| {
2355 for (params, 0..) |param_node, i| {
22312356 if (i + 1 < params.len) {
22322357 try renderExpression(gpa, ais, tree, param_node, .none);
22332358
......@@ -2252,7 +2377,7 @@ fn renderCall(
22522377
22532378 try renderToken(ais, tree, lparen, .none); // (
22542379
2255 for (params) |param_node, i| {
2380 for (params, 0..) |param_node, i| {
22562381 const first_param_token = tree.firstToken(param_node);
22572382 if (token_tags[first_param_token] == .multiline_string_literal_line or
22582383 hasSameLineComment(tree, first_param_token - 1))
......@@ -2890,7 +3015,7 @@ fn rowSize(tree: Ast, exprs: []const Ast.Node.Index, rtoken: Ast.TokenIndex) usi
28903015 }
28913016
28923017 var count: usize = 1;
2893 for (exprs) |expr, i| {
3018 for (exprs, 0..) |expr, i| {
28943019 if (i + 1 < exprs.len) {
28953020 const expr_last_token = tree.lastToken(expr) + 1;
28963021 if (!tree.tokensOnSameLine(expr_last_token, tree.firstToken(exprs[i + 1]))) return count;
lib/std/zig/system/NativeTargetInfo.zig+1-1
......@@ -273,7 +273,7 @@ fn detectAbiAndDynamicLinker(
273273 assert(@enumToInt(Target.Abi.none) == 0);
274274 const fields = std.meta.fields(Target.Abi)[1..];
275275 var array: [fields.len]Target.Abi = undefined;
276 inline for (fields) |field, i| {
276 inline for (fields, 0..) |field, i| {
277277 array[i] = @field(Target.Abi, field.name);
278278 }
279279 break :blk array;
lib/std/zig/system/linux.zig+1-1
......@@ -223,7 +223,7 @@ const ArmCpuinfoImpl = struct {
223223 };
224224
225225 var known_models: [self.cores.len]?*const Target.Cpu.Model = undefined;
226 for (self.cores[0..self.core_no]) |core, i| {
226 for (self.cores[0..self.core_no], 0..) |core, i| {
227227 known_models[i] = cpu_models.isKnown(.{
228228 .architecture = core.architecture,
229229 .implementer = core.implementer,
lib/std/zig/system/windows.zig+3-3
......@@ -34,7 +34,7 @@ pub fn detectRuntimeVersion() WindowsVersion {
3434 // checking the build number against a known set of
3535 // values
3636 var last_idx: usize = 0;
37 for (WindowsVersion.known_win10_build_numbers) |build, i| {
37 for (WindowsVersion.known_win10_build_numbers, 0..) |build, i| {
3838 if (version_info.dwBuildNumber >= build)
3939 last_idx = i;
4040 }
......@@ -92,7 +92,7 @@ fn getCpuInfoFromRegistry(core: usize, args: anytype) !void {
9292
9393 var tmp_bufs: [fields_info.len][max_value_len]u8 align(@alignOf(std.os.windows.UNICODE_STRING)) = undefined;
9494
95 inline for (fields_info) |field, i| {
95 inline for (fields_info, 0..) |field, i| {
9696 const ctx: *anyopaque = blk: {
9797 switch (@field(args, field.name).value_type) {
9898 REG.SZ,
......@@ -153,7 +153,7 @@ fn getCpuInfoFromRegistry(core: usize, args: anytype) !void {
153153 );
154154 switch (res) {
155155 .SUCCESS => {
156 inline for (fields_info) |field, i| switch (@field(args, field.name).value_type) {
156 inline for (fields_info, 0..) |field, i| switch (@field(args, field.name).value_type) {
157157 REG.SZ,
158158 REG.EXPAND_SZ,
159159 REG.MULTI_SZ,
lib/test_runner.zig+1-1
......@@ -33,7 +33,7 @@ pub fn main() void {
3333 async_frame_buffer = &[_]u8{};
3434
3535 var leaks: usize = 0;
36 for (test_fn_list) |test_fn, i| {
36 for (test_fn_list, 0..) |test_fn, i| {
3737 std.testing.allocator_instance = .{};
3838 defer {
3939 if (std.testing.allocator_instance.deinit()) {
src/AstGen.zig+201-78
......@@ -518,6 +518,7 @@ fn lvalExpr(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Ins
518518 .error_union,
519519 .merge_error_sets,
520520 .switch_range,
521 .for_range,
521522 .@"await",
522523 .bit_not,
523524 .negation,
......@@ -646,6 +647,8 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
646647 .asm_output => unreachable, // Handled in `asmExpr`.
647648 .asm_input => unreachable, // Handled in `asmExpr`.
648649
650 .for_range => unreachable, // Handled in `forExpr`.
651
649652 .assign => {
650653 try assign(gz, scope, node);
651654 return rvalue(gz, ri, .void_value, node);
......@@ -834,7 +837,7 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE
834837 .@"while",
835838 => return whileExpr(gz, scope, ri.br(), node, tree.fullWhile(node).?, false),
836839
837 .for_simple, .@"for" => return forExpr(gz, scope, ri.br(), node, tree.fullWhile(node).?, false),
840 .for_simple, .@"for" => return forExpr(gz, scope, ri.br(), node, tree.fullFor(node).?, false),
838841
839842 .slice_open => {
840843 const lhs = try expr(gz, scope, .{ .rl = .ref }, node_datas[node].lhs);
......@@ -1502,7 +1505,7 @@ fn arrayInitExprInner(
15021505 extra_index += 1;
15031506 }
15041507
1505 for (elements) |elem_init, i| {
1508 for (elements, 0..) |elem_init, i| {
15061509 const ri = if (elem_ty != .none)
15071510 ResultInfo{ .rl = .{ .coerced_ty = elem_ty } }
15081511 else if (array_ty_inst != .none and nodeMayNeedMemoryLocation(astgen.tree, elem_init, true)) ri: {
......@@ -1559,7 +1562,7 @@ fn arrayInitExprRlPtrInner(
15591562 });
15601563 var extra_index = try reserveExtra(astgen, elements.len);
15611564
1562 for (elements) |elem_init, i| {
1565 for (elements, 0..) |elem_init, i| {
15631566 const elem_ptr = try gz.addPlNode(.elem_ptr_imm, elem_init, Zir.Inst.ElemPtrImm{
15641567 .ptr = result_ptr,
15651568 .index = @intCast(u32, i),
......@@ -2342,7 +2345,7 @@ fn blockExprStmts(gz: *GenZir, parent_scope: *Scope, statements: []const Ast.Nod
23422345 .@"while", => _ = try whileExpr(gz, scope, .{ .rl = .discard }, inner_node, tree.fullWhile(inner_node).?, true),
23432346
23442347 .for_simple,
2345 .@"for", => _ = try forExpr(gz, scope, .{ .rl = .discard }, inner_node, tree.fullWhile(inner_node).?, true),
2348 .@"for", => _ = try forExpr(gz, scope, .{ .rl = .discard }, inner_node, tree.fullFor(inner_node).?, true),
23462349
23472350 else => noreturn_src_node = try unusedResultExpr(gz, scope, inner_node),
23482351 // zig fmt: on
......@@ -2397,6 +2400,7 @@ fn addEnsureResult(gz: *GenZir, maybe_unused_result: Zir.Inst.Ref, statement: As
23972400 .add,
23982401 .addwrap,
23992402 .add_sat,
2403 .add_unsafe,
24002404 .param,
24012405 .param_comptime,
24022406 .param_anytype,
......@@ -2595,6 +2599,7 @@ fn addEnsureResult(gz: *GenZir, maybe_unused_result: Zir.Inst.Ref, statement: As
25952599 .field_base_ptr,
25962600 .ret_ptr,
25972601 .ret_type,
2602 .for_len,
25982603 .@"try",
25992604 .try_ptr,
26002605 //.try_inline,
......@@ -6282,7 +6287,7 @@ fn forExpr(
62826287 scope: *Scope,
62836288 ri: ResultInfo,
62846289 node: Ast.Node.Index,
6285 for_full: Ast.full.While,
6290 for_full: Ast.full.For,
62866291 is_statement: bool,
62876292) InnerError!Zir.Inst.Ref {
62886293 const astgen = parent_gz.astgen;
......@@ -6291,22 +6296,41 @@ fn forExpr(
62916296 try astgen.checkLabelRedefinition(scope, label_token);
62926297 }
62936298
6294 // Set up variables and constants.
62956299 const is_inline = parent_gz.force_comptime or for_full.inline_token != null;
62966300 const tree = astgen.tree;
62976301 const token_tags = tree.tokens.items(.tag);
6302 const node_tags = tree.nodes.items(.tag);
6303 const node_data = tree.nodes.items(.data);
6304 const gpa = astgen.gpa;
62986305
6299 const payload_is_ref = if (for_full.payload_token) |payload_token|
6300 token_tags[payload_token] == .asterisk
6301 else
6302 false;
6303
6304 try emitDbgNode(parent_gz, for_full.ast.cond_expr);
6306 // TODO this can be deleted after zig 0.11.0 is released because it
6307 // will be caught in the parser.
6308 if (for_full.isOldSyntax(token_tags)) {
6309 return astgen.failTokNotes(
6310 for_full.payload_token + 2,
6311 "extra capture in for loop",
6312 .{},
6313 &[_]u32{
6314 try astgen.errNoteTok(
6315 for_full.payload_token + 2,
6316 "run 'zig fmt' to upgrade your code automatically",
6317 .{},
6318 ),
6319 },
6320 );
6321 }
63056322
6306 const cond_ri: ResultInfo = .{ .rl = if (payload_is_ref) .ref else .none };
6307 const array_ptr = try expr(parent_gz, scope, cond_ri, for_full.ast.cond_expr);
6308 const len = try parent_gz.addUnNode(.indexable_ptr_len, array_ptr, for_full.ast.cond_expr);
6323 // For counters, this is the start value; for indexables, this is the base
6324 // pointer that can be used with elem_ptr and similar instructions.
6325 // Special value `none` means that this is a counter and its start value is
6326 // zero, indicating that the main index counter can be used directly.
6327 const indexables = try gpa.alloc(Zir.Inst.Ref, for_full.ast.inputs.len);
6328 defer gpa.free(indexables);
6329 // elements of this array can be `none`, indicating no length check.
6330 const lens = try gpa.alloc(Zir.Inst.Ref, for_full.ast.inputs.len);
6331 defer gpa.free(lens);
63096332
6333 // We will use a single zero-based counter no matter how many indexables there are.
63106334 const index_ptr = blk: {
63116335 const alloc_tag: Zir.Inst.Tag = if (is_inline) .alloc_comptime_mut else .alloc;
63126336 const index_ptr = try parent_gz.addUnNode(alloc_tag, .usize_type, node);
......@@ -6315,22 +6339,95 @@ fn forExpr(
63156339 break :blk index_ptr;
63166340 };
63176341
6342 var any_len_checks = false;
6343
6344 {
6345 var capture_token = for_full.payload_token;
6346 for (for_full.ast.inputs, 0..) |input, i_usize| {
6347 const i = @intCast(u32, i_usize);
6348 const capture_is_ref = token_tags[capture_token] == .asterisk;
6349 const ident_tok = capture_token + @boolToInt(capture_is_ref);
6350 const is_discard = mem.eql(u8, tree.tokenSlice(ident_tok), "_");
6351
6352 if (is_discard and capture_is_ref) {
6353 return astgen.failTok(capture_token, "pointer modifier invalid on discard", .{});
6354 }
6355 // Skip over the comma, and on to the next capture (or the ending pipe character).
6356 capture_token = ident_tok + 2;
6357
6358 try emitDbgNode(parent_gz, input);
6359 if (node_tags[input] == .for_range) {
6360 if (capture_is_ref) {
6361 return astgen.failTok(ident_tok, "cannot capture reference to range", .{});
6362 }
6363 const start_node = node_data[input].lhs;
6364 const start_val = try expr(parent_gz, scope, .{ .rl = .none }, start_node);
6365
6366 const end_node = node_data[input].rhs;
6367 const end_val = if (end_node != 0)
6368 try expr(parent_gz, scope, .{ .rl = .none }, node_data[input].rhs)
6369 else
6370 .none;
6371
6372 if (end_val == .none and is_discard) {
6373 return astgen.failTok(ident_tok, "discard of unbounded counter", .{});
6374 }
6375
6376 const start_is_zero = nodeIsTriviallyZero(tree, start_node);
6377 const range_len = if (end_val == .none or start_is_zero)
6378 end_val
6379 else
6380 try parent_gz.addPlNode(.sub, input, Zir.Inst.Bin{
6381 .lhs = end_val,
6382 .rhs = start_val,
6383 });
6384
6385 any_len_checks = any_len_checks or range_len != .none;
6386 indexables[i] = if (start_is_zero) .none else start_val;
6387 lens[i] = range_len;
6388 } else {
6389 const indexable = try expr(parent_gz, scope, .{ .rl = .none }, input);
6390
6391 any_len_checks = true;
6392 indexables[i] = indexable;
6393 lens[i] = indexable;
6394 }
6395 }
6396 }
6397
6398 if (!any_len_checks) {
6399 return astgen.failNode(node, "unbounded for loop", .{});
6400 }
6401
6402 // We use a dedicated ZIR instruction to assert the lengths to assist with
6403 // nicer error reporting as well as fewer ZIR bytes emitted.
6404 const len: Zir.Inst.Ref = len: {
6405 const lens_len = @intCast(u32, lens.len);
6406 try astgen.extra.ensureUnusedCapacity(gpa, @typeInfo(Zir.Inst.MultiOp).Struct.fields.len + lens_len);
6407 const len = try parent_gz.addPlNode(.for_len, node, Zir.Inst.MultiOp{
6408 .operands_len = lens_len,
6409 });
6410 appendRefsAssumeCapacity(astgen, lens);
6411 break :len len;
6412 };
6413
63186414 const loop_tag: Zir.Inst.Tag = if (is_inline) .block_inline else .loop;
63196415 const loop_block = try parent_gz.makeBlockInst(loop_tag, node);
6320 try parent_gz.instructions.append(astgen.gpa, loop_block);
6416 try parent_gz.instructions.append(gpa, loop_block);
63216417
63226418 var loop_scope = parent_gz.makeSubBlock(scope);
63236419 loop_scope.is_inline = is_inline;
63246420 loop_scope.setBreakResultInfo(ri);
63256421 defer loop_scope.unstack();
6326 defer loop_scope.labeled_breaks.deinit(astgen.gpa);
6422 defer loop_scope.labeled_breaks.deinit(gpa);
6423
6424 const index = try loop_scope.addUnNode(.load, index_ptr, node);
63276425
63286426 var cond_scope = parent_gz.makeSubBlock(&loop_scope.base);
63296427 defer cond_scope.unstack();
63306428
6331 // check condition i < array_expr.len
6332 const index = try cond_scope.addUnNode(.load, index_ptr, for_full.ast.cond_expr);
6333 const cond = try cond_scope.addPlNode(.cmp_lt, for_full.ast.cond_expr, Zir.Inst.Bin{
6429 // Check the condition.
6430 const cond = try cond_scope.addPlNode(.cmp_lt, node, Zir.Inst.Bin{
63346431 .lhs = index,
63356432 .rhs = len,
63366433 });
......@@ -6341,12 +6438,11 @@ fn forExpr(
63416438 const cond_block = try loop_scope.makeBlockInst(block_tag, node);
63426439 try cond_scope.setBlockBody(cond_block);
63436440 // cond_block unstacked now, can add new instructions to loop_scope
6344 try loop_scope.instructions.append(astgen.gpa, cond_block);
6441 try loop_scope.instructions.append(gpa, cond_block);
63456442
63466443 // Increment the index variable.
6347 const index_2 = try loop_scope.addUnNode(.load, index_ptr, for_full.ast.cond_expr);
6348 const index_plus_one = try loop_scope.addPlNode(.add, node, Zir.Inst.Bin{
6349 .lhs = index_2,
6444 const index_plus_one = try loop_scope.addPlNode(.add_unsafe, node, Zir.Inst.Bin{
6445 .lhs = index,
63506446 .rhs = .one_usize,
63516447 });
63526448 _ = try loop_scope.addBin(.store, index_ptr, index_plus_one);
......@@ -6367,62 +6463,67 @@ fn forExpr(
63676463 defer then_scope.unstack();
63686464
63696465 try then_scope.addDbgBlockBegin();
6370 var payload_val_scope: Scope.LocalVal = undefined;
6371 var index_scope: Scope.LocalPtr = undefined;
6466
6467 const capture_scopes = try gpa.alloc(Scope.LocalVal, for_full.ast.inputs.len);
6468 defer gpa.free(capture_scopes);
6469
63726470 const then_sub_scope = blk: {
6373 const payload_token = for_full.payload_token.?;
6374 const ident = if (token_tags[payload_token] == .asterisk)
6375 payload_token + 1
6376 else
6377 payload_token;
6378 const is_ptr = ident != payload_token;
6379 const value_name = tree.tokenSlice(ident);
6380 var payload_sub_scope: *Scope = undefined;
6381 if (!mem.eql(u8, value_name, "_")) {
6382 const name_str_index = try astgen.identAsString(ident);
6383 const tag: Zir.Inst.Tag = if (is_ptr) .elem_ptr else .elem_val;
6384 const payload_inst = try then_scope.addPlNode(tag, for_full.ast.cond_expr, Zir.Inst.Bin{
6385 .lhs = array_ptr,
6386 .rhs = index,
6387 });
6388 try astgen.detectLocalShadowing(&then_scope.base, name_str_index, ident, value_name, .capture);
6389 payload_val_scope = .{
6390 .parent = &then_scope.base,
6471 var capture_token = for_full.payload_token;
6472 var capture_sub_scope: *Scope = &then_scope.base;
6473 for (for_full.ast.inputs, 0..) |input, i_usize| {
6474 const i = @intCast(u32, i_usize);
6475 const capture_is_ref = token_tags[capture_token] == .asterisk;
6476 const ident_tok = capture_token + @boolToInt(capture_is_ref);
6477 const capture_name = tree.tokenSlice(ident_tok);
6478 // Skip over the comma, and on to the next capture (or the ending pipe character).
6479 capture_token = ident_tok + 2;
6480
6481 if (mem.eql(u8, capture_name, "_")) continue;
6482
6483 const name_str_index = try astgen.identAsString(ident_tok);
6484 try astgen.detectLocalShadowing(capture_sub_scope, name_str_index, ident_tok, capture_name, .capture);
6485
6486 const capture_inst = inst: {
6487 const is_counter = node_tags[input] == .for_range;
6488
6489 if (indexables[i] == .none) {
6490 // Special case: the main index can be used directly.
6491 assert(is_counter);
6492 assert(!capture_is_ref);
6493 break :inst index;
6494 }
6495
6496 // For counters, we add the index variable to the start value; for
6497 // indexables, we use it as an element index. This is so similar
6498 // that they can share the same code paths, branching only on the
6499 // ZIR tag.
6500 const switch_cond = (@as(u2, @boolToInt(capture_is_ref)) << 1) | @boolToInt(is_counter);
6501 const tag: Zir.Inst.Tag = switch (switch_cond) {
6502 0b00 => .elem_val,
6503 0b01 => .add,
6504 0b10 => .elem_ptr,
6505 0b11 => unreachable, // compile error emitted already
6506 };
6507 break :inst try then_scope.addPlNode(tag, input, Zir.Inst.Bin{
6508 .lhs = indexables[i],
6509 .rhs = index,
6510 });
6511 };
6512
6513 capture_scopes[i] = .{
6514 .parent = capture_sub_scope,
63916515 .gen_zir = &then_scope,
63926516 .name = name_str_index,
6393 .inst = payload_inst,
6394 .token_src = ident,
6517 .inst = capture_inst,
6518 .token_src = ident_tok,
63956519 .id_cat = .capture,
63966520 };
6397 try then_scope.addDbgVar(.dbg_var_val, name_str_index, payload_inst);
6398 payload_sub_scope = &payload_val_scope.base;
6399 } else if (is_ptr) {
6400 return astgen.failTok(payload_token, "pointer modifier invalid on discard", .{});
6401 } else {
6402 payload_sub_scope = &then_scope.base;
6521
6522 try then_scope.addDbgVar(.dbg_var_val, name_str_index, capture_inst);
6523 capture_sub_scope = &capture_scopes[i].base;
64036524 }
64046525
6405 const index_token = if (token_tags[ident + 1] == .comma)
6406 ident + 2
6407 else
6408 break :blk payload_sub_scope;
6409 const token_bytes = tree.tokenSlice(index_token);
6410 if (mem.eql(u8, token_bytes, "_")) {
6411 return astgen.failTok(index_token, "discard of index capture; omit it instead", .{});
6412 }
6413 const index_name = try astgen.identAsString(index_token);
6414 try astgen.detectLocalShadowing(payload_sub_scope, index_name, index_token, token_bytes, .@"loop index capture");
6415 index_scope = .{
6416 .parent = payload_sub_scope,
6417 .gen_zir = &then_scope,
6418 .name = index_name,
6419 .ptr = index_ptr,
6420 .token_src = index_token,
6421 .maybe_comptime = is_inline,
6422 .id_cat = .@"loop index capture",
6423 };
6424 try then_scope.addDbgVar(.dbg_var_val, index_name, index_ptr);
6425 break :blk &index_scope.base;
6526 break :blk capture_sub_scope;
64266527 };
64276528
64286529 const then_result = try expr(&then_scope, then_sub_scope, .{ .rl = .none }, for_full.ast.then_expr);
......@@ -6879,7 +6980,7 @@ fn switchExpr(
68796980 zir_datas[switch_block].pl_node.payload_index = payload_index;
68806981
68816982 const strat = ri.rl.strategy(&block_scope);
6882 for (payloads.items[case_table_start..case_table_end]) |start_index, i| {
6983 for (payloads.items[case_table_start..case_table_end], 0..) |start_index, i| {
68836984 var body_len_index = start_index;
68846985 var end_index = start_index;
68856986 const table_index = case_table_start + i;
......@@ -7543,7 +7644,7 @@ fn asmExpr(
75437644
75447645 var output_type_bits: u32 = 0;
75457646
7546 for (full.outputs) |output_node, i| {
7647 for (full.outputs, 0..) |output_node, i| {
75477648 const symbolic_name = main_tokens[output_node];
75487649 const name = try astgen.identAsString(symbolic_name);
75497650 const constraint_token = symbolic_name + 2;
......@@ -7580,7 +7681,7 @@ fn asmExpr(
75807681 var inputs_buffer: [32]Zir.Inst.Asm.Input = undefined;
75817682 const inputs = inputs_buffer[0..full.inputs.len];
75827683
7583 for (full.inputs) |input_node, i| {
7684 for (full.inputs, 0..) |input_node, i| {
75847685 const symbolic_name = main_tokens[input_node];
75857686 const name = try astgen.identAsString(symbolic_name);
75867687 const constraint_token = symbolic_name + 2;
......@@ -7753,7 +7854,7 @@ fn typeOf(
77537854 var typeof_scope = gz.makeSubBlock(scope);
77547855 typeof_scope.force_comptime = false;
77557856
7756 for (args) |arg, i| {
7857 for (args, 0..) |arg, i| {
77577858 const param_ref = try reachableExpr(&typeof_scope, &typeof_scope.base, .{ .rl = .none }, arg, node);
77587859 astgen.extra.items[args_index + i] = @enumToInt(param_ref);
77597860 }
......@@ -8901,6 +9002,25 @@ comptime {
89019002 }
89029003}
89039004
9005fn nodeIsTriviallyZero(tree: *const Ast, node: Ast.Node.Index) bool {
9006 const node_tags = tree.nodes.items(.tag);
9007 const main_tokens = tree.nodes.items(.main_token);
9008
9009 switch (node_tags[node]) {
9010 .number_literal => {
9011 const ident = main_tokens[node];
9012 return switch (std.zig.parseNumberLiteral(tree.tokenSlice(ident))) {
9013 .int => |number| switch (number) {
9014 0 => true,
9015 else => false,
9016 },
9017 else => false,
9018 };
9019 },
9020 else => return false,
9021 }
9022}
9023
89049024fn nodeMayNeedMemoryLocation(tree: *const Ast, start_node: Ast.Node.Index, have_res_ty: bool) bool {
89059025 const node_tags = tree.nodes.items(.tag);
89069026 const node_datas = tree.nodes.items(.data);
......@@ -9021,6 +9141,7 @@ fn nodeMayNeedMemoryLocation(tree: *const Ast, start_node: Ast.Node.Index, have_
90219141 .mul_wrap,
90229142 .mul_sat,
90239143 .switch_range,
9144 .for_range,
90249145 .field_access,
90259146 .sub,
90269147 .sub_wrap,
......@@ -9310,6 +9431,7 @@ fn nodeMayEvalToError(tree: *const Ast, start_node: Ast.Node.Index) BuiltinFn.Ev
93109431 .mul_wrap,
93119432 .mul_sat,
93129433 .switch_range,
9434 .for_range,
93139435 .sub,
93149436 .sub_wrap,
93159437 .sub_sat,
......@@ -9487,6 +9609,7 @@ fn nodeImpliesMoreThanOnePossibleValue(tree: *const Ast, start_node: Ast.Node.In
94879609 .mul_wrap,
94889610 .mul_sat,
94899611 .switch_range,
9612 .for_range,
94909613 .field_access,
94919614 .sub,
94929615 .sub_wrap,
......@@ -9731,6 +9854,7 @@ fn nodeImpliesComptimeOnly(tree: *const Ast, start_node: Ast.Node.Index) bool {
97319854 .mul_wrap,
97329855 .mul_sat,
97339856 .switch_range,
9857 .for_range,
97349858 .field_access,
97359859 .sub,
97369860 .sub_wrap,
......@@ -10579,7 +10703,6 @@ const Scope = struct {
1057910703 @"function parameter",
1058010704 @"local constant",
1058110705 @"local variable",
10582 @"loop index capture",
1058310706 @"switch tag capture",
1058410707 capture,
1058510708 };
src/Autodoc.zig+8-8
......@@ -1647,7 +1647,7 @@ fn walkInstruction(
16471647 std.debug.assert(operands.len > 0);
16481648 var array_type = try self.walkRef(file, parent_scope, parent_src, operands[0], false);
16491649
1650 for (operands[1..]) |op, idx| {
1650 for (operands[1..], 0..) |op, idx| {
16511651 const wr = try self.walkRef(file, parent_scope, parent_src, op, false);
16521652 const expr_index = self.exprs.items.len;
16531653 try self.exprs.append(self.arena, wr.expr);
......@@ -1665,7 +1665,7 @@ fn walkInstruction(
16651665 const operands = file.zir.refSlice(extra.end, extra.data.operands_len);
16661666 const array_data = try self.arena.alloc(usize, operands.len);
16671667
1668 for (operands) |op, idx| {
1668 for (operands, 0..) |op, idx| {
16691669 const wr = try self.walkRef(file, parent_scope, parent_src, op, false);
16701670 const expr_index = self.exprs.items.len;
16711671 try self.exprs.append(self.arena, wr.expr);
......@@ -1686,7 +1686,7 @@ fn walkInstruction(
16861686 std.debug.assert(operands.len > 0);
16871687 var array_type = try self.walkRef(file, parent_scope, parent_src, operands[0], false);
16881688
1689 for (operands[1..]) |op, idx| {
1689 for (operands[1..], 0..) |op, idx| {
16901690 const wr = try self.walkRef(file, parent_scope, parent_src, op, false);
16911691 const expr_index = self.exprs.items.len;
16921692 try self.exprs.append(self.arena, wr.expr);
......@@ -1715,7 +1715,7 @@ fn walkInstruction(
17151715 const operands = file.zir.refSlice(extra.end, extra.data.operands_len);
17161716 const array_data = try self.arena.alloc(usize, operands.len);
17171717
1718 for (operands) |op, idx| {
1718 for (operands, 0..) |op, idx| {
17191719 const wr = try self.walkRef(file, parent_scope, parent_src, op, false);
17201720 const expr_index = self.exprs.items.len;
17211721 try self.exprs.append(self.arena, wr.expr);
......@@ -2386,7 +2386,7 @@ fn walkInstruction(
23862386 const array_data = try self.arena.alloc(usize, args.len);
23872387
23882388 var array_type: ?DocData.Expr = null;
2389 for (args) |arg, idx| {
2389 for (args, 0..) |arg, idx| {
23902390 const wr = try self.walkRef(file, parent_scope, parent_src, arg, idx == 0);
23912391 if (idx == 0) {
23922392 array_type = wr.typeRef;
......@@ -3470,7 +3470,7 @@ fn tryResolveRefPath(
34703470 }
34713471 }
34723472
3473 for (self.ast_nodes.items[t_enum.src].fields.?) |ast_node, idx| {
3473 for (self.ast_nodes.items[t_enum.src].fields.?, 0..) |ast_node, idx| {
34743474 const name = self.ast_nodes.items[ast_node].name.?;
34753475 if (std.mem.eql(u8, name, child_string)) {
34763476 // TODO: should we really create an artificial
......@@ -3517,7 +3517,7 @@ fn tryResolveRefPath(
35173517 }
35183518 }
35193519
3520 for (self.ast_nodes.items[t_union.src].fields.?) |ast_node, idx| {
3520 for (self.ast_nodes.items[t_union.src].fields.?, 0..) |ast_node, idx| {
35213521 const name = self.ast_nodes.items[ast_node].name.?;
35223522 if (std.mem.eql(u8, name, child_string)) {
35233523 // TODO: should we really create an artificial
......@@ -3564,7 +3564,7 @@ fn tryResolveRefPath(
35643564 }
35653565 }
35663566
3567 for (self.ast_nodes.items[t_struct.src].fields.?) |ast_node, idx| {
3567 for (self.ast_nodes.items[t_struct.src].fields.?, 0..) |ast_node, idx| {
35683568 const name = self.ast_nodes.items[ast_node].name.?;
35693569 if (std.mem.eql(u8, name, child_string)) {
35703570 // TODO: should we really create an artificial
src/Compilation.zig+11-11
......@@ -641,7 +641,7 @@ pub const AllErrors = struct {
641641 }
642642
643643 const reference_trace = try allocator.alloc(Message, module_err_msg.reference_trace.len);
644 for (reference_trace) |*reference, i| {
644 for (reference_trace, 0..) |*reference, i| {
645645 const module_reference = module_err_msg.reference_trace[i];
646646 if (module_reference.hidden != 0) {
647647 reference.* = .{ .plain = .{ .msg = undefined, .count = module_reference.hidden } };
......@@ -714,7 +714,7 @@ pub const AllErrors = struct {
714714 const block = file.zir.extraData(Zir.Inst.Block, item.data.notes);
715715 const body = file.zir.extra[block.end..][0..block.data.body_len];
716716 notes = try arena.alloc(Message, body.len);
717 for (notes) |*note, i| {
717 for (notes, 0..) |*note, i| {
718718 const note_item = file.zir.extraData(Zir.Inst.CompileErrors.Item, body[i]);
719719 const msg = file.zir.nullTerminatedString(note_item.data.msg);
720720 const span = blk: {
......@@ -786,7 +786,7 @@ pub const AllErrors = struct {
786786
787787 fn dupeList(list: []const Message, arena: Allocator) Allocator.Error![]Message {
788788 const duped_list = try arena.alloc(Message, list.len);
789 for (list) |item, i| {
789 for (list, 0..) |item, i| {
790790 duped_list[i] = switch (item) {
791791 .src => |src| .{ .src = .{
792792 .msg = try arena.dupe(u8, src.msg),
......@@ -1441,7 +1441,7 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
14411441
14421442 const llvm_cpu_features: ?[*:0]const u8 = if (build_options.have_llvm and use_llvm) blk: {
14431443 var buf = std.ArrayList(u8).init(arena);
1444 for (options.target.cpu.arch.allFeaturesList()) |feature, index_usize| {
1444 for (options.target.cpu.arch.allFeaturesList(), 0..) |feature, index_usize| {
14451445 const index = @intCast(Target.Cpu.Feature.Set.Index, index_usize);
14461446 const is_enabled = options.target.cpu.features.isEnabled(index);
14471447
......@@ -1818,7 +1818,7 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
18181818 var system_libs: std.StringArrayHashMapUnmanaged(SystemLib) = .{};
18191819 errdefer system_libs.deinit(gpa);
18201820 try system_libs.ensureTotalCapacity(gpa, options.system_lib_names.len);
1821 for (options.system_lib_names) |lib_name, i| {
1821 for (options.system_lib_names, 0..) |lib_name, i| {
18221822 system_libs.putAssumeCapacity(lib_name, options.system_lib_infos[i]);
18231823 }
18241824
......@@ -2880,7 +2880,7 @@ pub fn getAllErrorsAlloc(self: *Compilation) !AllErrors {
28802880 }
28812881 for (self.lld_errors.items) |lld_error| {
28822882 const notes = try arena_allocator.alloc(AllErrors.Message, lld_error.context_lines.len);
2883 for (lld_error.context_lines) |context_line, i| {
2883 for (lld_error.context_lines, 0..) |context_line, i| {
28842884 notes[i] = .{ .plain = .{
28852885 .msg = try arena_allocator.dupe(u8, context_line),
28862886 } };
......@@ -3007,7 +3007,7 @@ pub fn getAllErrorsAlloc(self: *Compilation) !AllErrors {
30073007 };
30083008 defer self.gpa.free(err_msg.notes);
30093009
3010 for (keys[1..]) |key, i| {
3010 for (keys[1..], 0..) |key, i| {
30113011 const note_decl = module.declPtr(key);
30123012 err_msg.notes[i] = .{
30133013 .src_loc = note_decl.nodeOffsetSrcLoc(values[i + 1]),
......@@ -3104,7 +3104,7 @@ pub fn performAllTheWork(
31043104 const notes = try mod.gpa.alloc(Module.ErrorMsg, file.references.items.len);
31053105 errdefer mod.gpa.free(notes);
31063106
3107 for (notes) |*note, i| {
3107 for (notes, 0..) |*note, i| {
31083108 errdefer for (notes[0..i]) |*n| n.deinit(mod.gpa);
31093109 note.* = switch (file.references.items[i]) {
31103110 .import => |loc| try Module.ErrorMsg.init(
......@@ -3740,7 +3740,7 @@ pub fn cImport(comp: *Compilation, c_src: []const u8) !CImportResult {
37403740 const new_argv_with_sentinel = try arena.alloc(?[*:0]const u8, argv.items.len + 1);
37413741 new_argv_with_sentinel[argv.items.len] = null;
37423742 const new_argv = new_argv_with_sentinel[0..argv.items.len :null];
3743 for (argv.items) |arg, i| {
3743 for (argv.items, 0..) |arg, i| {
37443744 new_argv[i] = try arena.dupeZ(u8, arg);
37453745 }
37463746
......@@ -4375,7 +4375,7 @@ pub fn addCCArgs(
43754375 // It would be really nice if there was a more compact way to communicate this info to Clang.
43764376 const all_features_list = target.cpu.arch.allFeaturesList();
43774377 try argv.ensureUnusedCapacity(all_features_list.len * 4);
4378 for (all_features_list) |feature, index_usize| {
4378 for (all_features_list, 0..) |feature, index_usize| {
43794379 const index = @intCast(std.Target.Cpu.Feature.Set.Index, index_usize);
43804380 const is_enabled = target.cpu.features.isEnabled(index);
43814381
......@@ -5203,7 +5203,7 @@ pub fn generateBuiltinZigSource(comp: *Compilation, allocator: Allocator) Alloca
52035203 std.zig.fmtId(generic_arch_name),
52045204 });
52055205
5206 for (target.cpu.arch.allFeaturesList()) |feature, index_usize| {
5206 for (target.cpu.arch.allFeaturesList(), 0..) |feature, index_usize| {
52075207 const index = @intCast(std.Target.Cpu.Feature.Set.Index, index_usize);
52085208 const is_enabled = target.cpu.features.isEnabled(index);
52095209 if (is_enabled) {
src/Liveness.zig+4-4
......@@ -384,7 +384,7 @@ pub fn categorizeOperand(
384384 const args = @ptrCast([]const Air.Inst.Ref, air.extra[extra.end..][0..extra.data.args_len]);
385385 if (args.len + 1 <= bpi - 1) {
386386 if (callee == operand_ref) return matchOperandSmallIndex(l, inst, 0, .write);
387 for (args) |arg, i| {
387 for (args, 0..) |arg, i| {
388388 if (arg == operand_ref) return matchOperandSmallIndex(l, inst, @intCast(OperandInt, i + 1), .write);
389389 }
390390 return .write;
......@@ -436,7 +436,7 @@ pub fn categorizeOperand(
436436 const elements = @ptrCast([]const Air.Inst.Ref, air.extra[ty_pl.payload..][0..len]);
437437
438438 if (elements.len <= bpi - 1) {
439 for (elements) |elem, i| {
439 for (elements, 0..) |elem, i| {
440440 if (elem == operand_ref) return matchOperandSmallIndex(l, inst, @intCast(OperandInt, i), .none);
441441 }
442442 return .none;
......@@ -1272,12 +1272,12 @@ fn analyzeInst(
12721272 defer for (case_deaths) |*cd| cd.deinit(gpa);
12731273
12741274 var total_deaths: u32 = 0;
1275 for (case_tables) |*ct, i| {
1275 for (case_tables, 0..) |*ct, i| {
12761276 total_deaths += ct.count();
12771277 var it = ct.keyIterator();
12781278 while (it.next()) |key| {
12791279 const case_death = key.*;
1280 for (case_tables) |*ct_inner, j| {
1280 for (case_tables, 0..) |*ct_inner, j| {
12811281 if (i == j) continue;
12821282 if (!ct_inner.contains(case_death)) {
12831283 // instruction is not referenced in this case
src/Manifest.zig+1-1
......@@ -123,7 +123,7 @@ pub fn hexDigest(digest: [Hash.digest_length]u8) [multihash_len * 2]u8 {
123123 result[2] = hex_charset[Hash.digest_length >> 4];
124124 result[3] = hex_charset[Hash.digest_length & 15];
125125
126 for (digest) |byte, i| {
126 for (digest, 0..) |byte, i| {
127127 result[4 + i * 2] = hex_charset[byte >> 4];
128128 result[5 + i * 2] = hex_charset[byte & 15];
129129 }
src/Module.zig+72-7
......@@ -268,7 +268,7 @@ pub const MemoizedCall = struct {
268268 if (a.func != b.func) return false;
269269
270270 assert(a.args.len == b.args.len);
271 for (a.args) |a_arg, arg_i| {
271 for (a.args, 0..) |a_arg, arg_i| {
272272 const b_arg = b.args[arg_i];
273273 if (!a_arg.eql(b_arg, ctx.module)) {
274274 return false;
......@@ -1082,7 +1082,7 @@ pub const Struct = struct {
10821082 assert(s.layout == .Packed);
10831083 assert(s.haveLayout());
10841084 var bit_sum: u64 = 0;
1085 for (s.fields.values()) |field, i| {
1085 for (s.fields.values(), 0..) |field, i| {
10861086 if (i == index) {
10871087 return @intCast(u16, bit_sum);
10881088 }
......@@ -1341,7 +1341,7 @@ pub const Union = struct {
13411341 assert(u.haveFieldTypes());
13421342 var most_alignment: u32 = 0;
13431343 var most_index: usize = undefined;
1344 for (u.fields.values()) |field, i| {
1344 for (u.fields.values(), 0..) |field, i| {
13451345 if (!field.ty.hasRuntimeBits()) continue;
13461346
13471347 const field_align = field.normalAlignment(target);
......@@ -1405,7 +1405,7 @@ pub const Union = struct {
14051405 var payload_size: u64 = 0;
14061406 var payload_align: u32 = 0;
14071407 const fields = u.fields.values();
1408 for (fields) |field, i| {
1408 for (fields, 0..) |field, i| {
14091409 if (!field.ty.hasRuntimeBitsIgnoreComptime()) continue;
14101410
14111411 const field_align = a: {
......@@ -2462,6 +2462,55 @@ pub const SrcLoc = struct {
24622462 };
24632463 return nodeToSpan(tree, src_node);
24642464 },
2465 .for_input => |for_input| {
2466 const tree = try src_loc.file_scope.getTree(gpa);
2467 const node = src_loc.declRelativeToNodeIndex(for_input.for_node_offset);
2468 const for_full = tree.fullFor(node).?;
2469 const src_node = for_full.ast.inputs[for_input.input_index];
2470 return nodeToSpan(tree, src_node);
2471 },
2472 .for_capture_from_input => |node_off| {
2473 const tree = try src_loc.file_scope.getTree(gpa);
2474 const token_tags = tree.tokens.items(.tag);
2475 const input_node = src_loc.declRelativeToNodeIndex(node_off);
2476 // We have to actually linear scan the whole AST to find the for loop
2477 // that contains this input.
2478 const node_tags = tree.nodes.items(.tag);
2479 for (node_tags, 0..) |node_tag, node_usize| {
2480 const node = @intCast(Ast.Node.Index, node_usize);
2481 switch (node_tag) {
2482 .for_simple, .@"for" => {
2483 const for_full = tree.fullFor(node).?;
2484 for (for_full.ast.inputs, 0..) |input, input_index| {
2485 if (input_node == input) {
2486 var count = input_index;
2487 var tok = for_full.payload_token;
2488 while (true) {
2489 switch (token_tags[tok]) {
2490 .comma => {
2491 count -= 1;
2492 tok += 1;
2493 },
2494 .identifier => {
2495 if (count == 0)
2496 return tokensToSpan(tree, tok, tok + 1, tok);
2497 tok += 1;
2498 },
2499 .asterisk => {
2500 if (count == 0)
2501 return tokensToSpan(tree, tok, tok + 2, tok);
2502 tok += 1;
2503 },
2504 else => unreachable,
2505 }
2506 }
2507 }
2508 }
2509 },
2510 else => continue,
2511 }
2512 } else unreachable;
2513 },
24652514 .node_offset_bin_lhs => |node_off| {
24662515 const tree = try src_loc.file_scope.getTree(gpa);
24672516 const node = src_loc.declRelativeToNodeIndex(node_off);
......@@ -3114,6 +3163,20 @@ pub const LazySrcLoc = union(enum) {
31143163 /// The source location points to the RHS of an assignment.
31153164 /// The Decl is determined contextually.
31163165 node_offset_store_operand: i32,
3166 /// The source location points to a for loop input.
3167 /// The Decl is determined contextually.
3168 for_input: struct {
3169 /// Points to the for loop AST node.
3170 for_node_offset: i32,
3171 /// Picks one of the inputs from the condition.
3172 input_index: u32,
3173 },
3174 /// The source location points to one of the captures of a for loop, found
3175 /// by taking this AST node index offset from the containing
3176 /// Decl AST node, which points to one of the input nodes of a for loop.
3177 /// Next, navigate to the corresponding capture.
3178 /// The Decl is determined contextually.
3179 for_capture_from_input: i32,
31173180
31183181 pub const nodeOffset = if (TracedOffset.want_tracing) nodeOffsetDebug else nodeOffsetRelease;
31193182
......@@ -3200,6 +3263,8 @@ pub const LazySrcLoc = union(enum) {
32003263 .node_offset_init_ty,
32013264 .node_offset_store_ptr,
32023265 .node_offset_store_operand,
3266 .for_input,
3267 .for_capture_from_input,
32033268 => .{
32043269 .file_scope = decl.getFileScope(),
32053270 .parent_decl_node = decl.src_node,
......@@ -3553,7 +3618,7 @@ pub fn astGenFile(mod: *Module, file: *File) !void {
35533618 }
35543619 if (data_has_safety_tag) {
35553620 const tags = zir.instructions.items(.tag);
3556 for (zir.instructions.items(.data)) |*data, i| {
3621 for (zir.instructions.items(.data), 0..) |*data, i| {
35573622 const union_tag = Zir.Inst.Tag.data_tags[@enumToInt(tags[i])];
35583623 const as_struct = @ptrCast(*HackDataLayout, data);
35593624 as_struct.* = .{
......@@ -3740,7 +3805,7 @@ pub fn astGenFile(mod: *Module, file: *File) !void {
37403805 @ptrCast([*]const u8, file.zir.instructions.items(.data).ptr);
37413806 if (data_has_safety_tag) {
37423807 // The `Data` union has a safety tag but in the file format we store it without.
3743 for (file.zir.instructions.items(.data)) |*data, i| {
3808 for (file.zir.instructions.items(.data), 0..) |*data, i| {
37443809 const as_struct = @ptrCast(*const HackDataLayout, data);
37453810 safety_buffer[i] = as_struct.data;
37463811 }
......@@ -6293,7 +6358,7 @@ pub fn populateTestFunctions(
62936358 // Add a dependency on each test name and function pointer.
62946359 try array_decl.dependencies.ensureUnusedCapacity(gpa, test_fn_vals.len * 2);
62956360
6296 for (mod.test_functions.keys()) |test_decl_index, i| {
6361 for (mod.test_functions.keys(), 0..) |test_decl_index, i| {
62976362 const test_decl = mod.declPtr(test_decl_index);
62986363 const test_name_slice = mem.sliceTo(test_decl.name, 0);
62996364 const test_name_decl_index = n: {
src/Package.zig+1-1
......@@ -207,7 +207,7 @@ pub fn fetchAndAddDependencies(
207207
208208 var any_error = false;
209209 const deps_list = manifest.dependencies.values();
210 for (manifest.dependencies.keys()) |name, i| {
210 for (manifest.dependencies.keys(), 0..) |name, i| {
211211 const dep = deps_list[i];
212212
213213 const sub_prefix = try std.fmt.allocPrint(arena, "{s}{s}.", .{ name_prefix, name });
src/RangeSet.zig+1-1
......@@ -79,7 +79,7 @@ pub fn spans(self: *RangeSet, first: Value, last: Value, ty: Type) !bool {
7979 const target = self.module.getTarget();
8080
8181 // look for gaps
82 for (self.ranges.items[1..]) |cur, i| {
82 for (self.ranges.items[1..], 0..) |cur, i| {
8383 // i starts counting from the second item.
8484 const prev = self.ranges.items[i];
8585
src/Sema.zig+334-175
......@@ -1035,6 +1035,7 @@ fn analyzeBodyInner(
10351035 .@"await" => try sema.zirAwait(block, inst),
10361036 .array_base_ptr => try sema.zirArrayBasePtr(block, inst),
10371037 .field_base_ptr => try sema.zirFieldBasePtr(block, inst),
1038 .for_len => try sema.zirForLen(block, inst),
10381039
10391040 .clz => try sema.zirBitCount(block, inst, .clz, Value.clz),
10401041 .ctz => try sema.zirBitCount(block, inst, .ctz, Value.ctz),
......@@ -1059,15 +1060,16 @@ fn analyzeBodyInner(
10591060 .error_set_decl_anon => try sema.zirErrorSetDecl(block, inst, .anon),
10601061 .error_set_decl_func => try sema.zirErrorSetDecl(block, inst, .func),
10611062
1062 .add => try sema.zirArithmetic(block, inst, .add),
1063 .addwrap => try sema.zirArithmetic(block, inst, .addwrap),
1064 .add_sat => try sema.zirArithmetic(block, inst, .add_sat),
1065 .mul => try sema.zirArithmetic(block, inst, .mul),
1066 .mulwrap => try sema.zirArithmetic(block, inst, .mulwrap),
1067 .mul_sat => try sema.zirArithmetic(block, inst, .mul_sat),
1068 .sub => try sema.zirArithmetic(block, inst, .sub),
1069 .subwrap => try sema.zirArithmetic(block, inst, .subwrap),
1070 .sub_sat => try sema.zirArithmetic(block, inst, .sub_sat),
1063 .add => try sema.zirArithmetic(block, inst, .add, true),
1064 .addwrap => try sema.zirArithmetic(block, inst, .addwrap, true),
1065 .add_sat => try sema.zirArithmetic(block, inst, .add_sat, true),
1066 .add_unsafe=> try sema.zirArithmetic(block, inst, .add_unsafe, false),
1067 .mul => try sema.zirArithmetic(block, inst, .mul, true),
1068 .mulwrap => try sema.zirArithmetic(block, inst, .mulwrap, true),
1069 .mul_sat => try sema.zirArithmetic(block, inst, .mul_sat, true),
1070 .sub => try sema.zirArithmetic(block, inst, .sub, true),
1071 .subwrap => try sema.zirArithmetic(block, inst, .subwrap, true),
1072 .sub_sat => try sema.zirArithmetic(block, inst, .sub_sat, true),
10711073
10721074 .div => try sema.zirDiv(block, inst),
10731075 .div_exact => try sema.zirDivExact(block, inst),
......@@ -3377,26 +3379,7 @@ fn zirIndexablePtrLen(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE
33773379 else
33783380 object_ty;
33793381
3380 if (!array_ty.isIndexable()) {
3381 const msg = msg: {
3382 const msg = try sema.errMsg(
3383 block,
3384 src,
3385 "type '{}' does not support indexing",
3386 .{array_ty.fmt(sema.mod)},
3387 );
3388 errdefer msg.destroy(sema.gpa);
3389 try sema.errNote(
3390 block,
3391 src,
3392 msg,
3393 "for loop operand must be an array, slice, tuple, or vector",
3394 .{},
3395 );
3396 break :msg msg;
3397 };
3398 return sema.failWithOwnedErrorMsg(msg);
3399 }
3382 try checkIndexable(sema, block, src, array_ty);
34003383
34013384 return sema.fieldVal(block, src, object, "len", src);
34023385}
......@@ -3819,7 +3802,7 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com
38193802 const dummy_ptr = try trash_block.addTy(.alloc, mut_final_ptr_ty);
38203803 const empty_trash_count = trash_block.instructions.items.len;
38213804
3822 for (placeholders) |bitcast_inst, i| {
3805 for (placeholders, 0..) |bitcast_inst, i| {
38233806 const sub_ptr_ty = sema.typeOf(Air.indexToRef(bitcast_inst));
38243807
38253808 if (mut_final_ptr_ty.eql(sub_ptr_ty, sema.mod)) {
......@@ -3919,6 +3902,121 @@ fn zirFieldBasePtr(
39193902 return sema.failWithStructInitNotSupported(block, src, sema.typeOf(start_ptr).childType());
39203903}
39213904
3905fn zirForLen(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
3906 const gpa = sema.gpa;
3907 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
3908 const extra = sema.code.extraData(Zir.Inst.MultiOp, inst_data.payload_index);
3909 const args = sema.code.refSlice(extra.end, extra.data.operands_len);
3910 const src = inst_data.src();
3911
3912 var len: Air.Inst.Ref = .none;
3913 var len_val: ?Value = null;
3914 var len_idx: u32 = undefined;
3915 var any_runtime = false;
3916
3917 const runtime_arg_lens = try gpa.alloc(Air.Inst.Ref, args.len);
3918 defer gpa.free(runtime_arg_lens);
3919
3920 // First pass to look for comptime values.
3921 for (args, 0..) |zir_arg, i_usize| {
3922 const i = @intCast(u32, i_usize);
3923 runtime_arg_lens[i] = .none;
3924 if (zir_arg == .none) continue;
3925 const object = try sema.resolveInst(zir_arg);
3926 const object_ty = sema.typeOf(object);
3927 // Each arg could be an indexable, or a range, in which case the length
3928 // is passed directly as an integer.
3929 const is_int = switch (object_ty.zigTypeTag()) {
3930 .Int, .ComptimeInt => true,
3931 else => false,
3932 };
3933 const arg_src: LazySrcLoc = .{ .for_input = .{
3934 .for_node_offset = inst_data.src_node,
3935 .input_index = i,
3936 } };
3937 const arg_len_uncoerced = if (is_int) object else l: {
3938 try checkIndexable(sema, block, arg_src, object_ty);
3939 if (!object_ty.indexableHasLen()) continue;
3940
3941 break :l try sema.fieldVal(block, arg_src, object, "len", arg_src);
3942 };
3943 const arg_len = try sema.coerce(block, Type.usize, arg_len_uncoerced, arg_src);
3944 if (len == .none) {
3945 len = arg_len;
3946 len_idx = i;
3947 }
3948 if (try sema.resolveDefinedValue(block, src, arg_len)) |arg_val| {
3949 if (len_val) |v| {
3950 if (!(try sema.valuesEqual(arg_val, v, Type.usize))) {
3951 const msg = msg: {
3952 const msg = try sema.errMsg(block, src, "non-matching for loop lengths", .{});
3953 errdefer msg.destroy(gpa);
3954 const a_src: LazySrcLoc = .{ .for_input = .{
3955 .for_node_offset = inst_data.src_node,
3956 .input_index = len_idx,
3957 } };
3958 try sema.errNote(block, a_src, msg, "length {} here", .{
3959 v.fmtValue(Type.usize, sema.mod),
3960 });
3961 try sema.errNote(block, arg_src, msg, "length {} here", .{
3962 arg_val.fmtValue(Type.usize, sema.mod),
3963 });
3964 break :msg msg;
3965 };
3966 return sema.failWithOwnedErrorMsg(msg);
3967 }
3968 } else {
3969 len = arg_len;
3970 len_val = arg_val;
3971 len_idx = i;
3972 }
3973 continue;
3974 }
3975 runtime_arg_lens[i] = arg_len;
3976 any_runtime = true;
3977 }
3978
3979 if (len == .none) {
3980 const msg = msg: {
3981 const msg = try sema.errMsg(block, src, "unbounded for loop", .{});
3982 errdefer msg.destroy(gpa);
3983 for (args, 0..) |zir_arg, i_usize| {
3984 const i = @intCast(u32, i_usize);
3985 if (zir_arg == .none) continue;
3986 const object = try sema.resolveInst(zir_arg);
3987 const object_ty = sema.typeOf(object);
3988 // Each arg could be an indexable, or a range, in which case the length
3989 // is passed directly as an integer.
3990 switch (object_ty.zigTypeTag()) {
3991 .Int, .ComptimeInt => continue,
3992 else => {},
3993 }
3994 const arg_src: LazySrcLoc = .{ .for_input = .{
3995 .for_node_offset = inst_data.src_node,
3996 .input_index = i,
3997 } };
3998 try sema.errNote(block, arg_src, msg, "type '{}' has no upper bound", .{
3999 object_ty.fmt(sema.mod),
4000 });
4001 }
4002 break :msg msg;
4003 };
4004 return sema.failWithOwnedErrorMsg(msg);
4005 }
4006
4007 // Now for the runtime checks.
4008 if (any_runtime and block.wantSafety()) {
4009 for (runtime_arg_lens, 0..) |arg_len, i| {
4010 if (arg_len == .none) continue;
4011 if (i == len_idx) continue;
4012 const ok = try block.addBinOp(.cmp_eq, len, arg_len);
4013 try sema.addSafetyCheck(block, ok, .for_len_mismatch);
4014 }
4015 }
4016
4017 return len;
4018}
4019
39224020fn validateArrayInitTy(
39234021 sema: *Sema,
39244022 block: *Block,
......@@ -4198,7 +4296,7 @@ fn validateStructInit(
41984296 // In this case the only thing we need to do is evaluate the implicit
41994297 // store instructions for default field values, and report any missing fields.
42004298 // Avoid the cost of the extra machinery for detecting a comptime struct init value.
4201 for (found_fields) |field_ptr, i| {
4299 for (found_fields, 0..) |field_ptr, i| {
42024300 if (field_ptr != 0) continue;
42034301
42044302 const default_val = struct_ty.structFieldDefaultValue(i);
......@@ -4264,7 +4362,7 @@ fn validateStructInit(
42644362 // ends up being comptime-known.
42654363 const field_values = try sema.arena.alloc(Value, struct_ty.structFieldCount());
42664364
4267 field: for (found_fields) |field_ptr, i| {
4365 field: for (found_fields, 0..) |field_ptr, i| {
42684366 if (field_ptr != 0) {
42694367 // Determine whether the value stored to this pointer is comptime-known.
42704368 const field_ty = struct_ty.structFieldType(i);
......@@ -4397,7 +4495,7 @@ fn validateStructInit(
43974495 try sema.resolveStructLayout(struct_ty);
43984496
43994497 // Our task is to insert `store` instructions for all the default field values.
4400 for (found_fields) |field_ptr, i| {
4498 for (found_fields, 0..) |field_ptr, i| {
44014499 if (field_ptr != 0) continue;
44024500
44034501 const field_src = init_src; // TODO better source location
......@@ -4472,7 +4570,7 @@ fn zirValidateArrayInit(
44724570 // any ZIR instructions at comptime; we need to do that here.
44734571 if (array_ty.sentinel()) |sentinel_val| {
44744572 const array_len_ref = try sema.addIntUnsigned(Type.usize, array_len);
4475 const sentinel_ptr = try sema.elemPtrArray(block, init_src, init_src, array_ptr, init_src, array_len_ref, true);
4573 const sentinel_ptr = try sema.elemPtrArray(block, init_src, init_src, array_ptr, init_src, array_len_ref, true, true);
44764574 const sentinel = try sema.addConstant(array_ty.childType(), sentinel_val);
44774575 try sema.storePtr2(block, init_src, sentinel_ptr, init_src, sentinel, init_src, .store);
44784576 }
......@@ -4491,7 +4589,7 @@ fn zirValidateArrayInit(
44914589 const air_tags = sema.air_instructions.items(.tag);
44924590 const air_datas = sema.air_instructions.items(.data);
44934591
4494 outer: for (instrs) |elem_ptr, i| {
4592 outer: for (instrs, 0..) |elem_ptr, i| {
44954593 // Determine whether the value stored to this pointer is comptime-known.
44964594
44974595 if (array_ty.isTuple()) {
......@@ -5010,7 +5108,7 @@ fn zirCompileLog(
50105108 const src_node = extra.data.src_node;
50115109 const args = sema.code.refSlice(extra.end, extended.small);
50125110
5013 for (args) |arg_ref, i| {
5111 for (args, 0..) |arg_ref, i| {
50145112 if (i != 0) try writer.print(", ", .{});
50155113
50165114 const arg = try sema.resolveInst(arg_ref);
......@@ -6228,7 +6326,7 @@ const GenericCallAdapter = struct {
62286326 if (ctx.generic_fn.owner_decl != other_key.generic_owner_decl.unwrap().?) return false;
62296327
62306328 const other_comptime_args = other_key.comptime_args.?;
6231 for (other_comptime_args[0..ctx.func_ty_info.param_types.len]) |other_arg, i| {
6329 for (other_comptime_args[0..ctx.func_ty_info.param_types.len], 0..) |other_arg, i| {
62326330 const this_arg = ctx.args[i];
62336331 const this_is_comptime = this_arg.val.tag() != .generic_poison;
62346332 const other_is_comptime = other_arg.val.tag() != .generic_poison;
......@@ -6744,7 +6842,7 @@ fn analyzeCall(
67446842 assert(!func_ty_info.is_generic);
67456843
67466844 const args = try sema.arena.alloc(Air.Inst.Ref, uncasted_args.len);
6747 for (uncasted_args) |uncasted_arg, i| {
6845 for (uncasted_args, 0..) |uncasted_arg, i| {
67486846 if (i < fn_params_len) {
67496847 const opts: CoerceOpts = .{ .param_src = .{
67506848 .func_inst = func,
......@@ -7519,7 +7617,7 @@ fn resolveGenericInstantiationType(
75197617fn resolveTupleLazyValues(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type) CompileError!void {
75207618 if (!ty.isSimpleTupleOrAnonStruct()) return;
75217619 const tuple = ty.tupleFields();
7522 for (tuple.values) |field_val, i| {
7620 for (tuple.values, 0..) |field_val, i| {
75237621 try sema.resolveTupleLazyValues(block, src, tuple.types[i]);
75247622 if (field_val.tag() == .unreachable_value) continue;
75257623 try sema.resolveLazyValue(field_val);
......@@ -8593,7 +8691,7 @@ fn funcCommon(
85938691 const cc_resolved = cc orelse .Unspecified;
85948692 const param_types = try sema.arena.alloc(Type, block.params.items.len);
85958693 const comptime_params = try sema.arena.alloc(bool, block.params.items.len);
8596 for (block.params.items) |param, i| {
8694 for (block.params.items, 0..) |param, i| {
85978695 const is_noalias = blk: {
85988696 const index = std.math.cast(u5, i) orelse break :blk false;
85998697 break :blk @truncate(u1, noalias_bits >> index) != 0;
......@@ -8702,7 +8800,7 @@ fn funcCommon(
87028800 const tags = sema.code.instructions.items(.tag);
87038801 const data = sema.code.instructions.items(.data);
87048802 const param_body = sema.code.getParamBody(func_inst);
8705 for (block.params.items) |param, i| {
8803 for (block.params.items, 0..) |param, i| {
87068804 if (!param.is_comptime) {
87078805 const param_index = param_body[i];
87088806 const param_src = switch (tags[param_index]) {
......@@ -9619,7 +9717,7 @@ fn zirElemVal(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
96199717 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
96209718 const array = try sema.resolveInst(extra.lhs);
96219719 const elem_index = try sema.resolveInst(extra.rhs);
9622 return sema.elemVal(block, src, array, elem_index, src);
9720 return sema.elemVal(block, src, array, elem_index, src, false);
96239721}
96249722
96259723fn zirElemValNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
......@@ -9632,7 +9730,7 @@ fn zirElemValNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
96329730 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
96339731 const array = try sema.resolveInst(extra.lhs);
96349732 const elem_index = try sema.resolveInst(extra.rhs);
9635 return sema.elemVal(block, src, array, elem_index, elem_index_src);
9733 return sema.elemVal(block, src, array, elem_index, elem_index_src, true);
96369734}
96379735
96389736fn zirElemPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
......@@ -9644,7 +9742,22 @@ fn zirElemPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
96449742 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
96459743 const array_ptr = try sema.resolveInst(extra.lhs);
96469744 const elem_index = try sema.resolveInst(extra.rhs);
9647 return sema.elemPtr(block, src, array_ptr, elem_index, src, false);
9745 const indexable_ty = sema.typeOf(array_ptr);
9746 if (indexable_ty.zigTypeTag() != .Pointer) {
9747 const capture_src: LazySrcLoc = .{ .for_capture_from_input = inst_data.src_node };
9748 const msg = msg: {
9749 const msg = try sema.errMsg(block, capture_src, "pointer capture of non pointer type '{}'", .{
9750 indexable_ty.fmt(sema.mod),
9751 });
9752 errdefer msg.destroy(sema.gpa);
9753 if (indexable_ty.zigTypeTag() == .Array) {
9754 try sema.errNote(block, src, msg, "consider using '&' here", .{});
9755 }
9756 break :msg msg;
9757 };
9758 return sema.failWithOwnedErrorMsg(msg);
9759 }
9760 return sema.elemPtrOneLayerOnly(block, src, array_ptr, elem_index, src, false, false);
96489761}
96499762
96509763fn zirElemPtrNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
......@@ -9657,7 +9770,7 @@ fn zirElemPtrNode(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
96579770 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
96589771 const array_ptr = try sema.resolveInst(extra.lhs);
96599772 const elem_index = try sema.resolveInst(extra.rhs);
9660 return sema.elemPtr(block, src, array_ptr, elem_index, elem_index_src, false);
9773 return sema.elemPtr(block, src, array_ptr, elem_index, elem_index_src, false, true);
96619774}
96629775
96639776fn zirElemPtrImm(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
......@@ -9669,7 +9782,7 @@ fn zirElemPtrImm(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!
96699782 const extra = sema.code.extraData(Zir.Inst.ElemPtrImm, inst_data.payload_index).data;
96709783 const array_ptr = try sema.resolveInst(extra.ptr);
96719784 const elem_index = try sema.addIntUnsigned(Type.usize, extra.index);
9672 return sema.elemPtr(block, src, array_ptr, elem_index, src, true);
9785 return sema.elemPtr(block, src, array_ptr, elem_index, src, true, true);
96739786}
96749787
96759788fn zirSliceStart(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
......@@ -9801,7 +9914,7 @@ fn zirSwitchCapture(
98019914 const first_field_index = @intCast(u32, operand_ty.unionTagFieldIndex(first_item_val, sema.mod).?);
98029915 const first_field = union_obj.fields.values()[first_field_index];
98039916
9804 for (items[1..]) |item, i| {
9917 for (items[1..], 0..) |item, i| {
98059918 const item_ref = try sema.resolveInst(item);
98069919 // Previous switch validation ensured this will succeed
98079920 const item_val = sema.resolveConstValue(block, .unneeded, item_ref, "") catch unreachable;
......@@ -10131,7 +10244,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
1013110244 const items = sema.code.refSlice(extra_index, items_len);
1013210245 extra_index += items_len + body_len;
1013310246
10134 for (items) |item_ref, item_i| {
10247 for (items, 0..) |item_ref, item_i| {
1013510248 try sema.validateSwitchItemEnum(
1013610249 block,
1013710250 seen_enum_fields,
......@@ -10165,7 +10278,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
1016510278 .{},
1016610279 );
1016710280 errdefer msg.destroy(sema.gpa);
10168 for (seen_enum_fields) |seen_src, i| {
10281 for (seen_enum_fields, 0..) |seen_src, i| {
1016910282 if (seen_src != null) continue;
1017010283
1017110284 const field_name = operand_ty.enumFieldName(i);
......@@ -10227,7 +10340,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
1022710340 const items = sema.code.refSlice(extra_index, items_len);
1022810341 extra_index += items_len + body_len;
1022910342
10230 for (items) |item_ref, item_i| {
10343 for (items, 0..) |item_ref, item_i| {
1023110344 try sema.validateSwitchItemError(
1023210345 block,
1023310346 &seen_errors,
......@@ -10369,7 +10482,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
1036910482 const items = sema.code.refSlice(extra_index, items_len);
1037010483 extra_index += items_len;
1037110484
10372 for (items) |item_ref, item_i| {
10485 for (items, 0..) |item_ref, item_i| {
1037310486 try sema.validateSwitchItem(
1037410487 block,
1037510488 &range_set,
......@@ -10464,7 +10577,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
1046410577 const items = sema.code.refSlice(extra_index, items_len);
1046510578 extra_index += items_len + body_len;
1046610579
10467 for (items) |item_ref, item_i| {
10580 for (items, 0..) |item_ref, item_i| {
1046810581 try sema.validateSwitchItemBool(
1046910582 block,
1047010583 &true_count,
......@@ -10548,7 +10661,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
1054810661 const items = sema.code.refSlice(extra_index, items_len);
1054910662 extra_index += items_len + body_len;
1055010663
10551 for (items) |item_ref, item_i| {
10664 for (items, 0..) |item_ref, item_i| {
1055210665 try sema.validateSwitchItemSparse(
1055310666 block,
1055410667 &seen_values,
......@@ -10859,7 +10972,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
1085910972 }
1086010973 }
1086110974
10862 for (items) |item_ref, item_i| {
10975 for (items, 0..) |item_ref, item_i| {
1086310976 cases_len += 1;
1086410977
1086510978 const item = try sema.resolveInst(item_ref);
......@@ -11045,7 +11158,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
1104511158 operand_ty.fmt(sema.mod),
1104611159 });
1104711160 }
11048 for (seen_enum_fields) |f, i| {
11161 for (seen_enum_fields, 0..) |f, i| {
1104911162 if (f != null) continue;
1105011163 cases_len += 1;
1105111164
......@@ -11188,7 +11301,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
1118811301 }
1118911302
1119011303 const analyze_body = if (union_originally and !special.is_inline)
11191 for (seen_enum_fields) |seen_field, index| {
11304 for (seen_enum_fields, 0..) |seen_field, index| {
1119211305 if (seen_field != null) continue;
1119311306 const union_obj = maybe_union_ty.cast(Type.Payload.Union).?.data;
1119411307 const field_ty = union_obj.fields.values()[index].ty;
......@@ -12168,7 +12281,7 @@ fn zirBitNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.
1216812281 const vec_len = try sema.usizeCast(block, operand_src, operand_type.vectorLen());
1216912282 var elem_val_buf: Value.ElemValueBuffer = undefined;
1217012283 const elems = try sema.arena.alloc(Value, vec_len);
12171 for (elems) |*elem, i| {
12284 for (elems, 0..) |*elem, i| {
1217212285 const elem_val = val.elemValueBuffer(sema.mod, i, &elem_val_buf);
1217312286 elem.* = try elem_val.bitwiseNot(scalar_type, sema.arena, sema.mod);
1217412287 }
......@@ -12434,14 +12547,14 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1243412547 while (elem_i < lhs_len) : (elem_i += 1) {
1243512548 const elem_index = try sema.addIntUnsigned(Type.usize, elem_i);
1243612549 const elem_ptr = try block.addPtrElemPtr(alloc, elem_index, elem_ptr_ty);
12437 const init = try sema.elemVal(block, lhs_src, lhs, elem_index, src);
12550 const init = try sema.elemVal(block, lhs_src, lhs, elem_index, src, true);
1243812551 try sema.storePtr2(block, src, elem_ptr, src, init, lhs_src, .store);
1243912552 }
1244012553 while (elem_i < result_len) : (elem_i += 1) {
1244112554 const elem_index = try sema.addIntUnsigned(Type.usize, elem_i);
1244212555 const rhs_index = try sema.addIntUnsigned(Type.usize, elem_i - lhs_len);
1244312556 const elem_ptr = try block.addPtrElemPtr(alloc, elem_index, elem_ptr_ty);
12444 const init = try sema.elemVal(block, rhs_src, rhs, rhs_index, src);
12557 const init = try sema.elemVal(block, rhs_src, rhs, rhs_index, src, true);
1244512558 try sema.storePtr2(block, src, elem_ptr, src, init, rhs_src, .store);
1244612559 }
1244712560 if (res_sent_val) |sent_val| {
......@@ -12459,12 +12572,12 @@ fn zirArrayCat(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1245912572 var elem_i: usize = 0;
1246012573 while (elem_i < lhs_len) : (elem_i += 1) {
1246112574 const index = try sema.addIntUnsigned(Type.usize, elem_i);
12462 const init = try sema.elemVal(block, lhs_src, lhs, index, src);
12575 const init = try sema.elemVal(block, lhs_src, lhs, index, src, true);
1246312576 element_refs[elem_i] = try sema.coerce(block, resolved_elem_ty, init, lhs_src);
1246412577 }
1246512578 while (elem_i < result_len) : (elem_i += 1) {
1246612579 const index = try sema.addIntUnsigned(Type.usize, elem_i - lhs_len);
12467 const init = try sema.elemVal(block, rhs_src, rhs, index, src);
12580 const init = try sema.elemVal(block, rhs_src, rhs, index, src, true);
1246812581 element_refs[elem_i] = try sema.coerce(block, resolved_elem_ty, init, rhs_src);
1246912582 }
1247012583 }
......@@ -12684,7 +12797,7 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1268412797 elem_i += 1;
1268512798 const lhs_index = try sema.addIntUnsigned(Type.usize, lhs_i);
1268612799 const elem_ptr = try block.addPtrElemPtr(alloc, elem_index, elem_ptr_ty);
12687 const init = try sema.elemVal(block, lhs_src, lhs, lhs_index, src);
12800 const init = try sema.elemVal(block, lhs_src, lhs, lhs_index, src, true);
1268812801 try sema.storePtr2(block, src, elem_ptr, src, init, lhs_src, .store);
1268912802 }
1269012803 }
......@@ -12704,7 +12817,7 @@ fn zirArrayMul(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1270412817 var lhs_i: usize = 0;
1270512818 while (lhs_i < lhs_len) : (lhs_i += 1) {
1270612819 const lhs_index = try sema.addIntUnsigned(Type.usize, lhs_i);
12707 const init = try sema.elemVal(block, lhs_src, lhs, lhs_index, src);
12820 const init = try sema.elemVal(block, lhs_src, lhs, lhs_index, src, true);
1270812821 element_refs[elem_i] = init;
1270912822 elem_i += 1;
1271012823 }
......@@ -12776,6 +12889,7 @@ fn zirArithmetic(
1277612889 block: *Block,
1277712890 inst: Zir.Inst.Index,
1277812891 zir_tag: Zir.Inst.Tag,
12892 safety: bool,
1277912893) CompileError!Air.Inst.Ref {
1278012894 const tracy = trace(@src());
1278112895 defer tracy.end();
......@@ -12788,7 +12902,7 @@ fn zirArithmetic(
1278812902 const lhs = try sema.resolveInst(extra.lhs);
1278912903 const rhs = try sema.resolveInst(extra.rhs);
1279012904
12791 return sema.analyzeArithmetic(block, zir_tag, lhs, rhs, sema.src, lhs_src, rhs_src, true);
12905 return sema.analyzeArithmetic(block, zir_tag, lhs, rhs, sema.src, lhs_src, rhs_src, safety);
1279212906}
1279312907
1279412908fn zirDiv(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
......@@ -13612,7 +13726,7 @@ fn intRem(
1361213726) CompileError!Value {
1361313727 if (ty.zigTypeTag() == .Vector) {
1361413728 const result_data = try sema.arena.alloc(Value, ty.vectorLen());
13615 for (result_data) |*scalar, i| {
13729 for (result_data, 0..) |*scalar, i| {
1361613730 var lhs_buf: Value.ElemValueBuffer = undefined;
1361713731 var rhs_buf: Value.ElemValueBuffer = undefined;
1361813732 const lhs_elem = lhs.elemValueBuffer(sema.mod, i, &lhs_buf);
......@@ -14139,7 +14253,7 @@ fn analyzeArithmetic(
1413914253 const maybe_rhs_val = try sema.resolveMaybeUndefValIntable(casted_rhs);
1414014254 const rs: struct { src: LazySrcLoc, air_tag: Air.Inst.Tag } = rs: {
1414114255 switch (zir_tag) {
14142 .add => {
14256 .add, .add_unsafe => {
1414314257 // For integers:intAddSat
1414414258 // If either of the operands are zero, then the other operand is
1414514259 // returned, even if it is undefined.
......@@ -14722,7 +14836,7 @@ fn zirAsm(
1472214836 const outputs = try sema.arena.alloc(ConstraintName, outputs_len);
1472314837 var expr_ty = Air.Inst.Ref.void_type;
1472414838
14725 for (out_args) |*arg, out_i| {
14839 for (out_args, 0..) |*arg, out_i| {
1472614840 const output = sema.code.extraData(Zir.Inst.Asm.Output, extra_i);
1472714841 extra_i = output.end;
1472814842
......@@ -14749,7 +14863,7 @@ fn zirAsm(
1474914863 const args = try sema.arena.alloc(Air.Inst.Ref, inputs_len);
1475014864 const inputs = try sema.arena.alloc(ConstraintName, inputs_len);
1475114865
14752 for (args) |*arg, arg_i| {
14866 for (args, 0..) |*arg, arg_i| {
1475314867 const input = sema.code.extraData(Zir.Inst.Asm.Input, extra_i);
1475414868 extra_i = input.end;
1475514869
......@@ -15473,7 +15587,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1547315587 defer params_anon_decl.deinit();
1547415588
1547515589 const param_vals = try params_anon_decl.arena().alloc(Value, info.param_types.len);
15476 for (param_vals) |*param_val, i| {
15590 for (param_vals, 0..) |*param_val, i| {
1547715591 const param_ty = info.param_types[i];
1547815592 const is_generic = param_ty.tag() == .generic_poison;
1547915593 const param_ty_val = if (is_generic)
......@@ -15717,7 +15831,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1571715831 const error_field_vals: ?[]Value = if (ty.isAnyError()) null else blk: {
1571815832 const names = ty.errorSetNames();
1571915833 const vals = try fields_anon_decl.arena().alloc(Value, names.len);
15720 for (vals) |*field_val, i| {
15834 for (vals, 0..) |*field_val, i| {
1572115835 const name = names[i];
1572215836 const name_val = v: {
1572315837 var anon_decl = try block.startAnonDecl();
......@@ -15819,7 +15933,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1581915933 const enum_fields = ty.enumFields();
1582015934 const enum_field_vals = try fields_anon_decl.arena().alloc(Value, enum_fields.count());
1582115935
15822 for (enum_field_vals) |*field_val, i| {
15936 for (enum_field_vals, 0..) |*field_val, i| {
1582315937 var tag_val_payload: Value.Payload.U32 = .{
1582415938 .base = .{ .tag = .enum_field_index },
1582515939 .data = @intCast(u32, i),
......@@ -15916,7 +16030,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1591616030 const union_fields = union_ty.unionFields();
1591716031 const union_field_vals = try fields_anon_decl.arena().alloc(Value, union_fields.count());
1591816032
15919 for (union_field_vals) |*field_val, i| {
16033 for (union_field_vals, 0..) |*field_val, i| {
1592016034 const field = union_fields.values()[i];
1592116035 const name = union_fields.keys()[i];
1592216036 const name_val = v: {
......@@ -16025,7 +16139,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1602516139 const tuple = struct_ty.tupleFields();
1602616140 const field_types = tuple.types;
1602716141 const struct_field_vals = try fields_anon_decl.arena().alloc(Value, field_types.len);
16028 for (struct_field_vals) |*struct_field_val, i| {
16142 for (struct_field_vals, 0..) |*struct_field_val, i| {
1602916143 const field_ty = field_types[i];
1603016144 const name_val = v: {
1603116145 var anon_decl = try block.startAnonDecl();
......@@ -16069,7 +16183,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1606916183 const struct_fields = struct_ty.structFields();
1607016184 const struct_field_vals = try fields_anon_decl.arena().alloc(Value, struct_fields.count());
1607116185
16072 for (struct_field_vals) |*field_val, i| {
16186 for (struct_field_vals, 0..) |*field_val, i| {
1607316187 const field = struct_fields.values()[i];
1607416188 const name = struct_fields.keys()[i];
1607516189 const name_val = v: {
......@@ -16408,7 +16522,7 @@ fn zirTypeofPeer(
1640816522 const inst_list = try sema.gpa.alloc(Air.Inst.Ref, args.len);
1640916523 defer sema.gpa.free(inst_list);
1641016524
16411 for (args) |arg_ref, i| {
16525 for (args, 0..) |arg_ref, i| {
1641216526 inst_list[i] = try sema.resolveInst(arg_ref);
1641316527 }
1641416528
......@@ -17519,7 +17633,7 @@ fn finishStructInit(
1751917633
1752017634 if (struct_ty.isAnonStruct()) {
1752117635 const struct_obj = struct_ty.castTag(.anon_struct).?.data;
17522 for (struct_obj.values) |default_val, i| {
17636 for (struct_obj.values, 0..) |default_val, i| {
1752317637 if (field_inits[i] != .none) continue;
1752417638
1752517639 if (default_val.tag() == .unreachable_value) {
......@@ -17555,7 +17669,7 @@ fn finishStructInit(
1755517669 }
1755617670 } else {
1755717671 const struct_obj = struct_ty.castTag(.@"struct").?.data;
17558 for (struct_obj.fields.values()) |field, i| {
17672 for (struct_obj.fields.values(), 0..) |field, i| {
1755917673 if (field_inits[i] != .none) continue;
1756017674
1756117675 if (field.default_val.tag() == .unreachable_value) {
......@@ -17596,7 +17710,7 @@ fn finishStructInit(
1759617710
1759717711 if (is_comptime) {
1759817712 const values = try sema.arena.alloc(Value, field_inits.len);
17599 for (field_inits) |field_init, i| {
17713 for (field_inits, 0..) |field_init, i| {
1760017714 values[i] = (sema.resolveMaybeUndefVal(field_init) catch unreachable).?;
1760117715 }
1760217716 const struct_val = try Value.Tag.aggregate.create(sema.arena, values);
......@@ -17611,7 +17725,7 @@ fn finishStructInit(
1761117725 .@"addrspace" = target_util.defaultAddressSpace(target, .local),
1761217726 });
1761317727 const alloc = try block.addTy(.alloc, alloc_ty);
17614 for (field_inits) |field_init, i_usize| {
17728 for (field_inits, 0..) |field_init, i_usize| {
1761517729 const i = @intCast(u32, i_usize);
1761617730 const field_src = dest_src;
1761717731 const field_ptr = try sema.structFieldPtrByIndex(block, dest_src, alloc, i, field_src, struct_ty, true);
......@@ -17644,7 +17758,7 @@ fn zirStructInitAnon(
1764417758 const opt_runtime_index = rs: {
1764517759 var runtime_index: ?usize = null;
1764617760 var extra_index = extra.end;
17647 for (types) |*field_ty, i| {
17761 for (types, 0..) |*field_ty, i| {
1764817762 const item = sema.code.extraData(Zir.Inst.StructInitAnon.Item, extra_index);
1764917763 extra_index = item.end;
1765017764
......@@ -17718,7 +17832,7 @@ fn zirStructInitAnon(
1771817832 });
1771917833 const alloc = try block.addTy(.alloc, alloc_ty);
1772017834 var extra_index = extra.end;
17721 for (types) |field_ty, i_usize| {
17835 for (types, 0..) |field_ty, i_usize| {
1772217836 const i = @intCast(u32, i_usize);
1772317837 const item = sema.code.extraData(Zir.Inst.StructInitAnon.Item, extra_index);
1772417838 extra_index = item.end;
......@@ -17740,7 +17854,7 @@ fn zirStructInitAnon(
1774017854
1774117855 const element_refs = try sema.arena.alloc(Air.Inst.Ref, types.len);
1774217856 var extra_index = extra.end;
17743 for (types) |_, i| {
17857 for (types, 0..) |_, i| {
1774417858 const item = sema.code.extraData(Zir.Inst.StructInitAnon.Item, extra_index);
1774517859 extra_index = item.end;
1774617860 element_refs[i] = try sema.resolveInst(item.data.init);
......@@ -17768,7 +17882,7 @@ fn zirArrayInit(
1776817882
1776917883 const resolved_args = try gpa.alloc(Air.Inst.Ref, args.len - 1 + @boolToInt(sentinel_val != null));
1777017884 defer gpa.free(resolved_args);
17771 for (args[1..]) |arg, i| {
17885 for (args[1..], 0..) |arg, i| {
1777217886 const resolved_arg = try sema.resolveInst(arg);
1777317887 const elem_ty = if (array_ty.zigTypeTag() == .Struct)
1777417888 array_ty.structFieldType(i)
......@@ -17789,7 +17903,7 @@ fn zirArrayInit(
1778917903 resolved_args[resolved_args.len - 1] = try sema.addConstant(array_ty.elemType2(), some);
1779017904 }
1779117905
17792 const opt_runtime_index: ?u32 = for (resolved_args) |arg, i| {
17906 const opt_runtime_index: ?u32 = for (resolved_args, 0..) |arg, i| {
1779317907 const comptime_known = try sema.isComptimeKnown(arg);
1779417908 if (!comptime_known) break @intCast(u32, i);
1779517909 } else null;
......@@ -17797,7 +17911,7 @@ fn zirArrayInit(
1779717911 const runtime_index = opt_runtime_index orelse {
1779817912 const elem_vals = try sema.arena.alloc(Value, resolved_args.len);
1779917913
17800 for (resolved_args) |arg, i| {
17914 for (resolved_args, 0..) |arg, i| {
1780117915 // We checked that all args are comptime above.
1780217916 elem_vals[i] = (sema.resolveMaybeUndefVal(arg) catch unreachable).?;
1780317917 }
......@@ -17826,7 +17940,7 @@ fn zirArrayInit(
1782617940 const alloc = try block.addTy(.alloc, alloc_ty);
1782717941
1782817942 if (array_ty.isTuple()) {
17829 for (resolved_args) |arg, i| {
17943 for (resolved_args, 0..) |arg, i| {
1783017944 const elem_ptr_ty = try Type.ptr(sema.arena, sema.mod, .{
1783117945 .mutable = true,
1783217946 .@"addrspace" = target_util.defaultAddressSpace(target, .local),
......@@ -17848,7 +17962,7 @@ fn zirArrayInit(
1784817962 });
1784917963 const elem_ptr_ty_ref = try sema.addType(elem_ptr_ty);
1785017964
17851 for (resolved_args) |arg, i| {
17965 for (resolved_args, 0..) |arg, i| {
1785217966 const index = try sema.addIntUnsigned(Type.usize, i);
1785317967 const elem_ptr = try block.addPtrElemPtrTypeRef(alloc, index, elem_ptr_ty_ref);
1785417968 _ = try block.addBinOp(.store, elem_ptr, arg);
......@@ -17875,7 +17989,7 @@ fn zirArrayInitAnon(
1787517989
1787617990 const opt_runtime_src = rs: {
1787717991 var runtime_src: ?LazySrcLoc = null;
17878 for (operands) |operand, i| {
17992 for (operands, 0..) |operand, i| {
1787917993 const operand_src = src; // TODO better source location
1788017994 const elem = try sema.resolveInst(operand);
1788117995 types[i] = sema.typeOf(elem);
......@@ -17918,7 +18032,7 @@ fn zirArrayInitAnon(
1791818032 .@"addrspace" = target_util.defaultAddressSpace(target, .local),
1791918033 });
1792018034 const alloc = try block.addTy(.alloc, alloc_ty);
17921 for (operands) |operand, i_usize| {
18035 for (operands, 0..) |operand, i_usize| {
1792218036 const i = @intCast(u32, i_usize);
1792318037 const field_ptr_ty = try Type.ptr(sema.arena, sema.mod, .{
1792418038 .mutable = true,
......@@ -17935,7 +18049,7 @@ fn zirArrayInitAnon(
1793518049 }
1793618050
1793718051 const element_refs = try sema.arena.alloc(Air.Inst.Ref, operands.len);
17938 for (operands) |operand, i| {
18052 for (operands, 0..) |operand, i| {
1793918053 element_refs[i] = try sema.resolveInst(operand);
1794018054 }
1794118055
......@@ -18138,7 +18252,7 @@ fn zirUnaryMath(
1813818252
1813918253 var elem_buf: Value.ElemValueBuffer = undefined;
1814018254 const elems = try sema.arena.alloc(Value, vec_len);
18141 for (elems) |*elem, i| {
18255 for (elems, 0..) |*elem, i| {
1814218256 const elem_val = val.elemValueBuffer(sema.mod, i, &elem_buf);
1814318257 elem.* = try eval(elem_val, scalar_ty, sema.arena, sema.mod);
1814418258 }
......@@ -19142,7 +19256,7 @@ fn reifyStruct(
1914219256 if (layout == .Packed) {
1914319257 struct_obj.status = .layout_wip;
1914419258
19145 for (struct_obj.fields.values()) |field, index| {
19259 for (struct_obj.fields.values(), 0..) |field, index| {
1914619260 sema.resolveTypeLayout(field.ty) catch |err| switch (err) {
1914719261 error.AnalysisFail => {
1914819262 const msg = sema.err orelse return err;
......@@ -19771,7 +19885,7 @@ fn zirTruncate(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1977119885 }
1977219886 var elem_buf: Value.ElemValueBuffer = undefined;
1977319887 const elems = try sema.arena.alloc(Value, operand_ty.vectorLen());
19774 for (elems) |*elem, i| {
19888 for (elems, 0..) |*elem, i| {
1977519889 const elem_val = val.elemValueBuffer(sema.mod, i, &elem_buf);
1977619890 elem.* = try elem_val.intTrunc(operand_scalar_ty, sema.arena, dest_info.signedness, dest_info.bits, sema.mod);
1977719891 }
......@@ -19873,7 +19987,7 @@ fn zirBitCount(
1987319987 var elem_buf: Value.ElemValueBuffer = undefined;
1987419988 const elems = try sema.arena.alloc(Value, vec_len);
1987519989 const scalar_ty = operand_ty.scalarType();
19876 for (elems) |*elem, i| {
19990 for (elems, 0..) |*elem, i| {
1987719991 const elem_val = val.elemValueBuffer(sema.mod, i, &elem_buf);
1987819992 const count = comptimeOp(elem_val, scalar_ty, target);
1987919993 elem.* = try Value.Tag.int_u64.create(sema.arena, count);
......@@ -19942,7 +20056,7 @@ fn zirByteSwap(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1994220056 const vec_len = operand_ty.vectorLen();
1994320057 var elem_buf: Value.ElemValueBuffer = undefined;
1994420058 const elems = try sema.arena.alloc(Value, vec_len);
19945 for (elems) |*elem, i| {
20059 for (elems, 0..) |*elem, i| {
1994620060 const elem_val = val.elemValueBuffer(sema.mod, i, &elem_buf);
1994720061 elem.* = try elem_val.byteSwap(operand_ty, target, sema.arena);
1994820062 }
......@@ -19991,7 +20105,7 @@ fn zirBitReverse(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!
1999120105 const vec_len = operand_ty.vectorLen();
1999220106 var elem_buf: Value.ElemValueBuffer = undefined;
1999320107 const elems = try sema.arena.alloc(Value, vec_len);
19994 for (elems) |*elem, i| {
20108 for (elems, 0..) |*elem, i| {
1999520109 const elem_val = val.elemValueBuffer(sema.mod, i, &elem_buf);
1999620110 elem.* = try elem_val.bitReverse(scalar_ty, target, sema.arena);
1999720111 }
......@@ -20060,7 +20174,7 @@ fn bitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!u6
2006020174 .Packed => {
2006120175 var bit_sum: u64 = 0;
2006220176 const fields = ty.structFields();
20063 for (fields.values()) |field, i| {
20177 for (fields.values(), 0..) |field, i| {
2006420178 if (i == field_index) {
2006520179 return bit_sum;
2006620180 }
......@@ -20997,7 +21111,7 @@ fn zirSelect(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData) C
2099721111
2099821112 var buf: Value.ElemValueBuffer = undefined;
2099921113 const elems = try sema.gpa.alloc(Value, vec_len);
21000 for (elems) |*elem, i| {
21114 for (elems, 0..) |*elem, i| {
2100121115 const pred_elem_val = pred_val.elemValueBuffer(sema.mod, i, &buf);
2100221116 const should_choose_a = pred_elem_val.toBool();
2100321117 if (should_choose_a) {
......@@ -21347,12 +21461,12 @@ fn zirBuiltinCall(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
2134721461 func = bound_data.func_inst;
2134821462 resolved_args = try sema.arena.alloc(Air.Inst.Ref, args_ty.structFieldCount() + 1);
2134921463 resolved_args[0] = bound_data.arg0_inst;
21350 for (resolved_args[1..]) |*resolved, i| {
21464 for (resolved_args[1..], 0..) |*resolved, i| {
2135121465 resolved.* = try sema.tupleFieldValByIndex(block, args_src, args, @intCast(u32, i), args_ty);
2135221466 }
2135321467 } else {
2135421468 resolved_args = try sema.arena.alloc(Air.Inst.Ref, args_ty.structFieldCount());
21355 for (resolved_args) |*resolved, i| {
21469 for (resolved_args, 0..) |*resolved, i| {
2135621470 resolved.* = try sema.tupleFieldValByIndex(block, args_src, args, @intCast(u32, i), args_ty);
2135721471 }
2135821472 }
......@@ -21507,7 +21621,7 @@ fn analyzeMinMax(
2150721621 var lhs_buf: Value.ElemValueBuffer = undefined;
2150821622 var rhs_buf: Value.ElemValueBuffer = undefined;
2150921623 const elems = try sema.arena.alloc(Value, vec_len);
21510 for (elems) |*elem, i| {
21624 for (elems, 0..) |*elem, i| {
2151121625 const lhs_elem_val = lhs_val.elemValueBuffer(sema.mod, i, &lhs_buf);
2151221626 const rhs_elem_val = rhs_val.elemValueBuffer(sema.mod, i, &rhs_buf);
2151321627 elem.* = opFunc(lhs_elem_val, rhs_elem_val, target);
......@@ -22404,7 +22518,7 @@ fn explainWhyTypeIsComptimeInner(
2240422518
2240522519 if (ty.castTag(.@"struct")) |payload| {
2240622520 const struct_obj = payload.data;
22407 for (struct_obj.fields.values()) |field, i| {
22521 for (struct_obj.fields.values(), 0..) |field, i| {
2240822522 const field_src_loc = struct_obj.fieldSrcLoc(sema.mod, .{
2240922523 .index = i,
2241022524 .range = .type,
......@@ -22424,7 +22538,7 @@ fn explainWhyTypeIsComptimeInner(
2242422538
2242522539 if (ty.cast(Type.Payload.Union)) |payload| {
2242622540 const union_obj = payload.data;
22427 for (union_obj.fields.values()) |field, i| {
22541 for (union_obj.fields.values(), 0..) |field, i| {
2242822542 const field_src_loc = union_obj.fieldSrcLoc(sema.mod, .{
2242922543 .index = i,
2243022544 .range = .type,
......@@ -22676,6 +22790,7 @@ pub const PanicId = enum {
2267622790 unwrap_error,
2267722791 index_out_of_bounds,
2267822792 start_index_greater_than_end,
22793 for_len_mismatch,
2267922794};
2268022795
2268122796fn addSafetyCheck(
......@@ -23694,7 +23809,7 @@ fn structFieldPtrByIndex(
2369423809 comptime assert(Type.packed_struct_layout_version == 2);
2369523810
2369623811 var running_bits: u16 = 0;
23697 for (struct_obj.fields.values()) |f, i| {
23812 for (struct_obj.fields.values(), 0..) |f, i| {
2369823813 if (!(try sema.typeHasRuntimeBits(f.ty))) continue;
2369923814
2370023815 if (i == field_index) {
......@@ -24057,6 +24172,7 @@ fn elemPtr(
2405724172 elem_index: Air.Inst.Ref,
2405824173 elem_index_src: LazySrcLoc,
2405924174 init: bool,
24175 oob_safety: bool,
2406024176) CompileError!Air.Inst.Ref {
2406124177 const indexable_ptr_src = src; // TODO better source location
2406224178 const indexable_ptr_ty = sema.typeOf(indexable_ptr);
......@@ -24065,46 +24181,61 @@ fn elemPtr(
2406524181 .Pointer => indexable_ptr_ty.elemType(),
2406624182 else => return sema.fail(block, indexable_ptr_src, "expected pointer, found '{}'", .{indexable_ptr_ty.fmt(sema.mod)}),
2406724183 };
24068 if (!indexable_ty.isIndexable()) {
24069 return sema.fail(block, src, "element access of non-indexable type '{}'", .{indexable_ty.fmt(sema.mod)});
24070 }
24071
2407224184 switch (indexable_ty.zigTypeTag()) {
24073 .Pointer => {
24074 // In all below cases, we have to deref the ptr operand to get the actual indexable pointer.
24075 const indexable = try sema.analyzeLoad(block, indexable_ptr_src, indexable_ptr, indexable_ptr_src);
24076 switch (indexable_ty.ptrSize()) {
24077 .Slice => return sema.elemPtrSlice(block, src, indexable_ptr_src, indexable, elem_index_src, elem_index),
24078 .Many, .C => {
24079 const maybe_ptr_val = try sema.resolveDefinedValue(block, indexable_ptr_src, indexable);
24080 const maybe_index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index);
24081 const runtime_src = rs: {
24082 const ptr_val = maybe_ptr_val orelse break :rs indexable_ptr_src;
24083 const index_val = maybe_index_val orelse break :rs elem_index_src;
24084 const index = @intCast(usize, index_val.toUnsignedInt(target));
24085 const elem_ptr = try ptr_val.elemPtr(indexable_ty, sema.arena, index, sema.mod);
24086 const result_ty = try sema.elemPtrType(indexable_ty, index);
24087 return sema.addConstant(result_ty, elem_ptr);
24088 };
24089 const result_ty = try sema.elemPtrType(indexable_ty, null);
24090
24091 try sema.requireRuntimeBlock(block, src, runtime_src);
24092 return block.addPtrElemPtr(indexable, elem_index, result_ty);
24093 },
24094 .One => {
24095 assert(indexable_ty.childType().zigTypeTag() == .Array); // Guaranteed by isIndexable
24096 return sema.elemPtrArray(block, src, indexable_ptr_src, indexable, elem_index_src, elem_index, init);
24097 },
24098 }
24099 },
24100 .Array, .Vector => return sema.elemPtrArray(block, src, indexable_ptr_src, indexable_ptr, elem_index_src, elem_index, init),
24185 .Array, .Vector => return sema.elemPtrArray(block, src, indexable_ptr_src, indexable_ptr, elem_index_src, elem_index, init, oob_safety),
2410124186 .Struct => {
2410224187 // Tuple field access.
2410324188 const index_val = try sema.resolveConstValue(block, elem_index_src, elem_index, "tuple field access index must be comptime-known");
2410424189 const index = @intCast(u32, index_val.toUnsignedInt(target));
2410524190 return sema.tupleFieldPtr(block, src, indexable_ptr, elem_index_src, index, init);
2410624191 },
24107 else => unreachable,
24192 else => {
24193 const indexable = try sema.analyzeLoad(block, indexable_ptr_src, indexable_ptr, indexable_ptr_src);
24194 return elemPtrOneLayerOnly(sema, block, src, indexable, elem_index, elem_index_src, init, oob_safety);
24195 },
24196 }
24197}
24198
24199/// Asserts that the type of indexable is pointer.
24200fn elemPtrOneLayerOnly(
24201 sema: *Sema,
24202 block: *Block,
24203 src: LazySrcLoc,
24204 indexable: Air.Inst.Ref,
24205 elem_index: Air.Inst.Ref,
24206 elem_index_src: LazySrcLoc,
24207 init: bool,
24208 oob_safety: bool,
24209) CompileError!Air.Inst.Ref {
24210 const indexable_src = src; // TODO better source location
24211 const indexable_ty = sema.typeOf(indexable);
24212 if (!indexable_ty.isIndexable()) {
24213 return sema.fail(block, src, "element access of non-indexable type '{}'", .{indexable_ty.fmt(sema.mod)});
24214 }
24215 const target = sema.mod.getTarget();
24216
24217 switch (indexable_ty.ptrSize()) {
24218 .Slice => return sema.elemPtrSlice(block, src, indexable_src, indexable, elem_index_src, elem_index, oob_safety),
24219 .Many, .C => {
24220 const maybe_ptr_val = try sema.resolveDefinedValue(block, indexable_src, indexable);
24221 const maybe_index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index);
24222 const runtime_src = rs: {
24223 const ptr_val = maybe_ptr_val orelse break :rs indexable_src;
24224 const index_val = maybe_index_val orelse break :rs elem_index_src;
24225 const index = @intCast(usize, index_val.toUnsignedInt(target));
24226 const elem_ptr = try ptr_val.elemPtr(indexable_ty, sema.arena, index, sema.mod);
24227 const result_ty = try sema.elemPtrType(indexable_ty, index);
24228 return sema.addConstant(result_ty, elem_ptr);
24229 };
24230 const result_ty = try sema.elemPtrType(indexable_ty, null);
24231
24232 try sema.requireRuntimeBlock(block, src, runtime_src);
24233 return block.addPtrElemPtr(indexable, elem_index, result_ty);
24234 },
24235 .One => {
24236 assert(indexable_ty.childType().zigTypeTag() == .Array); // Guaranteed by isIndexable
24237 return sema.elemPtrArray(block, src, indexable_src, indexable, elem_index_src, elem_index, init, oob_safety);
24238 },
2410824239 }
2410924240}
2411024241
......@@ -24115,6 +24246,7 @@ fn elemVal(
2411524246 indexable: Air.Inst.Ref,
2411624247 elem_index_uncasted: Air.Inst.Ref,
2411724248 elem_index_src: LazySrcLoc,
24249 oob_safety: bool,
2411824250) CompileError!Air.Inst.Ref {
2411924251 const indexable_src = src; // TODO better source location
2412024252 const indexable_ty = sema.typeOf(indexable);
......@@ -24130,7 +24262,7 @@ fn elemVal(
2413024262
2413124263 switch (indexable_ty.zigTypeTag()) {
2413224264 .Pointer => switch (indexable_ty.ptrSize()) {
24133 .Slice => return sema.elemValSlice(block, src, indexable_src, indexable, elem_index_src, elem_index),
24265 .Slice => return sema.elemValSlice(block, src, indexable_src, indexable, elem_index_src, elem_index, oob_safety),
2413424266 .Many, .C => {
2413524267 const maybe_indexable_val = try sema.resolveDefinedValue(block, indexable_src, indexable);
2413624268 const maybe_index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index);
......@@ -24151,14 +24283,14 @@ fn elemVal(
2415124283 },
2415224284 .One => {
2415324285 assert(indexable_ty.childType().zigTypeTag() == .Array); // Guaranteed by isIndexable
24154 const elem_ptr = try sema.elemPtr(block, indexable_src, indexable, elem_index, elem_index_src, false);
24286 const elem_ptr = try sema.elemPtr(block, indexable_src, indexable, elem_index, elem_index_src, false, oob_safety);
2415524287 return sema.analyzeLoad(block, indexable_src, elem_ptr, elem_index_src);
2415624288 },
2415724289 },
24158 .Array => return sema.elemValArray(block, src, indexable_src, indexable, elem_index_src, elem_index),
24290 .Array => return sema.elemValArray(block, src, indexable_src, indexable, elem_index_src, elem_index, oob_safety),
2415924291 .Vector => {
2416024292 // TODO: If the index is a vector, the result should be a vector.
24161 return sema.elemValArray(block, src, indexable_src, indexable, elem_index_src, elem_index);
24293 return sema.elemValArray(block, src, indexable_src, indexable, elem_index_src, elem_index, oob_safety);
2416224294 },
2416324295 .Struct => {
2416424296 // Tuple field access.
......@@ -24303,6 +24435,7 @@ fn elemValArray(
2430324435 array: Air.Inst.Ref,
2430424436 elem_index_src: LazySrcLoc,
2430524437 elem_index: Air.Inst.Ref,
24438 oob_safety: bool,
2430624439) CompileError!Air.Inst.Ref {
2430724440 const array_ty = sema.typeOf(array);
2430824441 const array_sent = array_ty.sentinel();
......@@ -24346,7 +24479,7 @@ fn elemValArray(
2434624479
2434724480 const runtime_src = if (maybe_undef_array_val != null) elem_index_src else array_src;
2434824481 try sema.requireRuntimeBlock(block, src, runtime_src);
24349 if (block.wantSafety()) {
24482 if (oob_safety and block.wantSafety()) {
2435024483 // Runtime check is only needed if unable to comptime check
2435124484 if (maybe_index_val == null) {
2435224485 const len_inst = try sema.addIntUnsigned(Type.usize, array_len);
......@@ -24366,6 +24499,7 @@ fn elemPtrArray(
2436624499 elem_index_src: LazySrcLoc,
2436724500 elem_index: Air.Inst.Ref,
2436824501 init: bool,
24502 oob_safety: bool,
2436924503) CompileError!Air.Inst.Ref {
2437024504 const target = sema.mod.getTarget();
2437124505 const array_ptr_ty = sema.typeOf(array_ptr);
......@@ -24409,7 +24543,7 @@ fn elemPtrArray(
2440924543 try sema.requireRuntimeBlock(block, src, runtime_src);
2441024544
2441124545 // Runtime check is only needed if unable to comptime check.
24412 if (block.wantSafety() and offset == null) {
24546 if (oob_safety and block.wantSafety() and offset == null) {
2441324547 const len_inst = try sema.addIntUnsigned(Type.usize, array_len);
2441424548 const cmp_op: Air.Inst.Tag = if (array_sent) .cmp_lte else .cmp_lt;
2441524549 try sema.panicIndexOutOfBounds(block, elem_index, len_inst, cmp_op);
......@@ -24426,6 +24560,7 @@ fn elemValSlice(
2442624560 slice: Air.Inst.Ref,
2442724561 elem_index_src: LazySrcLoc,
2442824562 elem_index: Air.Inst.Ref,
24563 oob_safety: bool,
2442924564) CompileError!Air.Inst.Ref {
2443024565 const slice_ty = sema.typeOf(slice);
2443124566 const slice_sent = slice_ty.sentinel() != null;
......@@ -24462,7 +24597,7 @@ fn elemValSlice(
2446224597 try sema.validateRuntimeElemAccess(block, elem_index_src, elem_ty, slice_ty, slice_src);
2446324598
2446424599 try sema.requireRuntimeBlock(block, src, runtime_src);
24465 if (block.wantSafety()) {
24600 if (oob_safety and block.wantSafety()) {
2446624601 const len_inst = if (maybe_slice_val) |slice_val|
2446724602 try sema.addIntUnsigned(Type.usize, slice_val.sliceLen(sema.mod))
2446824603 else
......@@ -24482,6 +24617,7 @@ fn elemPtrSlice(
2448224617 slice: Air.Inst.Ref,
2448324618 elem_index_src: LazySrcLoc,
2448424619 elem_index: Air.Inst.Ref,
24620 oob_safety: bool,
2448524621) CompileError!Air.Inst.Ref {
2448624622 const target = sema.mod.getTarget();
2448724623 const slice_ty = sema.typeOf(slice);
......@@ -24519,7 +24655,7 @@ fn elemPtrSlice(
2451924655
2452024656 const runtime_src = if (maybe_undef_slice_val != null) elem_index_src else slice_src;
2452124657 try sema.requireRuntimeBlock(block, src, runtime_src);
24522 if (block.wantSafety()) {
24658 if (oob_safety and block.wantSafety()) {
2452324659 const len_inst = len: {
2452424660 if (maybe_undef_slice_val) |slice_val|
2452524661 if (!slice_val.isUndef())
......@@ -25980,7 +26116,7 @@ fn coerceInMemoryAllowedFns(
2598026116 } };
2598126117 }
2598226118
25983 for (dest_info.param_types) |dest_param_ty, i| {
26119 for (dest_info.param_types, 0..) |dest_param_ty, i| {
2598426120 const src_param_ty = src_info.param_types[i];
2598526121
2598626122 if (dest_info.comptime_params[i] != src_info.comptime_params[i]) {
......@@ -26224,7 +26360,7 @@ fn storePtr2(
2622426360 const elem_src = operand_src; // TODO better source location
2622526361 const elem = try sema.tupleField(block, operand_src, uncasted_operand, elem_src, i);
2622626362 const elem_index = try sema.addIntUnsigned(Type.usize, i);
26227 const elem_ptr = try sema.elemPtr(block, ptr_src, ptr, elem_index, elem_src, false);
26363 const elem_ptr = try sema.elemPtr(block, ptr_src, ptr, elem_index, elem_src, false, true);
2622826364 try sema.storePtr2(block, src, elem_ptr, elem_src, elem, elem_src, .store);
2622926365 }
2623026366 return;
......@@ -26510,7 +26646,7 @@ fn beginComptimePtrMutation(
2651026646 // assigning `[N:S]T` to `[N]T`. This is allowed; the sentinel is omitted.
2651126647 assert(bytes.len >= dest_len);
2651226648 const elems = try arena.alloc(Value, @intCast(usize, dest_len));
26513 for (elems) |*elem, i| {
26649 for (elems, 0..) |*elem, i| {
2651426650 elem.* = try Value.Tag.int_u64.create(arena, bytes[i]);
2651526651 }
2651626652
......@@ -26539,7 +26675,7 @@ fn beginComptimePtrMutation(
2653926675 const dest_len = parent.ty.arrayLenIncludingSentinel();
2654026676 const bytes = sema.mod.string_literal_bytes.items[str_lit.index..][0..str_lit.len];
2654126677 const elems = try arena.alloc(Value, @intCast(usize, dest_len));
26542 for (bytes) |byte, i| {
26678 for (bytes, 0..) |byte, i| {
2654326679 elems[i] = try Value.Tag.int_u64.create(arena, byte);
2654426680 }
2654526681 if (parent.ty.sentinel()) |sent_val| {
......@@ -27510,7 +27646,7 @@ fn coerceEnumToUnion(
2751027646 var msg: ?*Module.ErrorMsg = null;
2751127647 errdefer if (msg) |some| some.destroy(sema.gpa);
2751227648
27513 for (union_obj.fields.values()) |field, i| {
27649 for (union_obj.fields.values(), 0..) |field, i| {
2751427650 if (field.ty.zigTypeTag() == .NoReturn) {
2751527651 const err_msg = msg orelse try sema.errMsg(
2751627652 block,
......@@ -27669,14 +27805,14 @@ fn coerceArrayLike(
2766927805 const element_refs = try sema.arena.alloc(Air.Inst.Ref, dest_len);
2767027806 var runtime_src: ?LazySrcLoc = null;
2767127807
27672 for (element_vals) |*elem, i| {
27808 for (element_vals, 0..) |*elem, i| {
2767327809 const index_ref = try sema.addConstant(
2767427810 Type.usize,
2767527811 try Value.Tag.int_u64.create(sema.arena, i),
2767627812 );
2767727813 const src = inst_src; // TODO better source location
2767827814 const elem_src = inst_src; // TODO better source location
27679 const elem_ref = try sema.elemValArray(block, src, inst_src, inst, elem_src, index_ref);
27815 const elem_ref = try sema.elemValArray(block, src, inst_src, inst, elem_src, index_ref, true);
2768027816 const coerced = try sema.coerce(block, dest_elem_ty, elem_ref, elem_src);
2768127817 element_refs[i] = coerced;
2768227818 if (runtime_src == null) {
......@@ -27731,7 +27867,7 @@ fn coerceTupleToArray(
2773127867 const dest_elem_ty = dest_ty.childType();
2773227868
2773327869 var runtime_src: ?LazySrcLoc = null;
27734 for (element_vals) |*elem, i_usize| {
27870 for (element_vals, 0..) |*elem, i_usize| {
2773527871 const i = @intCast(u32, i_usize);
2773627872 if (i_usize == inst_len) {
2773727873 elem.* = dest_ty.sentinel().?;
......@@ -27860,7 +27996,7 @@ fn coerceTupleToStruct(
2786027996 var root_msg: ?*Module.ErrorMsg = null;
2786127997 errdefer if (root_msg) |msg| msg.destroy(sema.gpa);
2786227998
27863 for (field_refs) |*field_ref, i| {
27999 for (field_refs, 0..) |*field_ref, i| {
2786428000 if (field_ref.* != .none) continue;
2786528001
2786628002 const field_name = fields.keys()[i];
......@@ -27958,7 +28094,7 @@ fn coerceTupleToTuple(
2795828094 var root_msg: ?*Module.ErrorMsg = null;
2795928095 errdefer if (root_msg) |msg| msg.destroy(sema.gpa);
2796028096
27961 for (field_refs) |*field_ref, i| {
28097 for (field_refs, 0..) |*field_ref, i| {
2796228098 if (field_ref.* != .none) continue;
2796328099
2796428100 const default_val = tuple_ty.structFieldDefaultValue(i);
......@@ -29334,7 +29470,7 @@ fn resolvePeerTypes(
2933429470 var seen_const = false;
2933529471 var convert_to_slice = false;
2933629472 var chosen_i: usize = 0;
29337 for (instructions[1..]) |candidate, candidate_i| {
29473 for (instructions[1..], 0..) |candidate, candidate_i| {
2933829474 const candidate_ty = sema.typeOf(candidate);
2933929475 const chosen_ty = sema.typeOf(chosen);
2934029476
......@@ -29993,7 +30129,7 @@ fn resolveStructLayout(sema: *Sema, ty: Type) CompileError!void {
2999330129 };
2999430130
2999530131 struct_obj.status = .layout_wip;
29996 for (struct_obj.fields.values()) |field, i| {
30132 for (struct_obj.fields.values(), 0..) |field, i| {
2999730133 sema.resolveTypeLayout(field.ty) catch |err| switch (err) {
2999830134 error.AnalysisFail => {
2999930135 const msg = sema.err orelse return err;
......@@ -30031,7 +30167,7 @@ fn resolveStructLayout(sema: *Sema, ty: Type) CompileError!void {
3003130167 break :blk try decl_arena_allocator.alloc(u32, struct_obj.fields.count());
3003230168 };
3003330169
30034 for (struct_obj.fields.values()) |field, i| {
30170 for (struct_obj.fields.values(), 0..) |field, i| {
3003530171 optimized_order[i] = if (field.ty.hasRuntimeBits())
3003630172 @intCast(u32, i)
3003730173 else
......@@ -30191,6 +30327,29 @@ fn checkBackingIntType(sema: *Sema, block: *Block, src: LazySrcLoc, backing_int_
3019130327 }
3019230328}
3019330329
30330fn checkIndexable(sema: *Sema, block: *Block, src: LazySrcLoc, array_ty: Type) !void {
30331 if (!array_ty.isIndexable()) {
30332 const msg = msg: {
30333 const msg = try sema.errMsg(
30334 block,
30335 src,
30336 "type '{}' does not support indexing",
30337 .{array_ty.fmt(sema.mod)},
30338 );
30339 errdefer msg.destroy(sema.gpa);
30340 try sema.errNote(
30341 block,
30342 src,
30343 msg,
30344 "for loop operand must be an array, slice, tuple, or vector",
30345 .{},
30346 );
30347 break :msg msg;
30348 };
30349 return sema.failWithOwnedErrorMsg(msg);
30350 }
30351}
30352
3019430353fn resolveUnionLayout(sema: *Sema, ty: Type) CompileError!void {
3019530354 const resolved_ty = try sema.resolveTypeFields(ty);
3019630355 const union_obj = resolved_ty.cast(Type.Payload.Union).?.data;
......@@ -30213,7 +30372,7 @@ fn resolveUnionLayout(sema: *Sema, ty: Type) CompileError!void {
3021330372 };
3021430373
3021530374 union_obj.status = .layout_wip;
30216 for (union_obj.fields.values()) |field, i| {
30375 for (union_obj.fields.values(), 0..) |field, i| {
3021730376 sema.resolveTypeLayout(field.ty) catch |err| switch (err) {
3021830377 error.AnalysisFail => {
3021930378 const msg = sema.err orelse return err;
......@@ -30361,7 +30520,7 @@ pub fn resolveTypeRequiresComptime(sema: *Sema, ty: Type) CompileError!bool {
3036130520
3036230521 .tuple, .anon_struct => {
3036330522 const tuple = ty.tupleFields();
30364 for (tuple.types) |field_ty, i| {
30523 for (tuple.types, 0..) |field_ty, i| {
3036530524 const have_comptime_val = tuple.values[i].tag() != .unreachable_value;
3036630525 if (!have_comptime_val and try sema.resolveTypeRequiresComptime(field_ty)) {
3036730526 return true;
......@@ -30876,7 +31035,7 @@ fn semaStructFields(mod: *Module, struct_obj: *Module.Struct) CompileError!void
3087631035 // so that init values may depend on type layout.
3087731036 const bodies_index = extra_index;
3087831037
30879 for (fields) |zir_field, field_i| {
31038 for (fields, 0..) |zir_field, field_i| {
3088031039 const field_ty: Type = ty: {
3088131040 if (zir_field.type_ref != .none) {
3088231041 break :ty sema.resolveType(&block_scope, .unneeded, zir_field.type_ref) catch |err| switch (err) {
......@@ -30998,7 +31157,7 @@ fn semaStructFields(mod: *Module, struct_obj: *Module.Struct) CompileError!void
3099831157
3099931158 if (any_inits) {
3100031159 extra_index = bodies_index;
31001 for (fields) |zir_field, field_i| {
31160 for (fields, 0..) |zir_field, field_i| {
3100231161 extra_index += zir_field.type_body_len;
3100331162 extra_index += zir_field.align_body_len;
3100431163 if (zir_field.init_body_len > 0) {
......@@ -31718,7 +31877,7 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value {
3171831877 .@"struct" => {
3171931878 const resolved_ty = try sema.resolveTypeFields(ty);
3172031879 const s = resolved_ty.castTag(.@"struct").?.data;
31721 for (s.fields.values()) |field, i| {
31880 for (s.fields.values(), 0..) |field, i| {
3172231881 if (field.is_comptime) continue;
3172331882 if (field.ty.eql(resolved_ty, sema.mod)) {
3172431883 const msg = try Module.ErrorMsg.create(
......@@ -31739,7 +31898,7 @@ pub fn typeHasOnePossibleValue(sema: *Sema, ty: Type) CompileError!?Value {
3173931898
3174031899 .tuple, .anon_struct => {
3174131900 const tuple = ty.tupleFields();
31742 for (tuple.values) |val, i| {
31901 for (tuple.values, 0..) |val, i| {
3174331902 const is_comptime = val.tag() != .unreachable_value;
3174431903 if (is_comptime) continue;
3174531904 if ((try sema.typeHasOnePossibleValue(tuple.types[i])) != null) continue;
......@@ -32379,7 +32538,7 @@ pub fn typeRequiresComptime(sema: *Sema, ty: Type) CompileError!bool {
3237932538
3238032539 .tuple, .anon_struct => {
3238132540 const tuple = ty.tupleFields();
32382 for (tuple.types) |field_ty, i| {
32541 for (tuple.types, 0..) |field_ty, i| {
3238332542 const have_comptime_val = tuple.values[i].tag() != .unreachable_value;
3238432543 if (!have_comptime_val and try sema.typeRequiresComptime(field_ty)) {
3238532544 return true;
......@@ -32539,7 +32698,7 @@ fn anonStructFieldIndex(
3253932698 field_src: LazySrcLoc,
3254032699) !u32 {
3254132700 const anon_struct = struct_ty.castTag(.anon_struct).?.data;
32542 for (anon_struct.names) |name, i| {
32701 for (anon_struct.names, 0..) |name, i| {
3254332702 if (mem.eql(u8, name, field_name)) {
3254432703 return @intCast(u32, i);
3254532704 }
......@@ -32557,7 +32716,7 @@ fn queueFullTypeResolution(sema: *Sema, ty: Type) !void {
3255732716fn intAdd(sema: *Sema, lhs: Value, rhs: Value, ty: Type) !Value {
3255832717 if (ty.zigTypeTag() == .Vector) {
3255932718 const result_data = try sema.arena.alloc(Value, ty.vectorLen());
32560 for (result_data) |*scalar, i| {
32719 for (result_data, 0..) |*scalar, i| {
3256132720 var lhs_buf: Value.ElemValueBuffer = undefined;
3256232721 var rhs_buf: Value.ElemValueBuffer = undefined;
3256332722 const lhs_elem = lhs.elemValueBuffer(sema.mod, i, &lhs_buf);
......@@ -32615,7 +32774,7 @@ fn intSub(
3261532774) !Value {
3261632775 if (ty.zigTypeTag() == .Vector) {
3261732776 const result_data = try sema.arena.alloc(Value, ty.vectorLen());
32618 for (result_data) |*scalar, i| {
32777 for (result_data, 0..) |*scalar, i| {
3261932778 var lhs_buf: Value.ElemValueBuffer = undefined;
3262032779 var rhs_buf: Value.ElemValueBuffer = undefined;
3262132780 const lhs_elem = lhs.elemValueBuffer(sema.mod, i, &lhs_buf);
......@@ -32673,7 +32832,7 @@ fn floatAdd(
3267332832) !Value {
3267432833 if (float_type.zigTypeTag() == .Vector) {
3267532834 const result_data = try sema.arena.alloc(Value, float_type.vectorLen());
32676 for (result_data) |*scalar, i| {
32835 for (result_data, 0..) |*scalar, i| {
3267732836 var lhs_buf: Value.ElemValueBuffer = undefined;
3267832837 var rhs_buf: Value.ElemValueBuffer = undefined;
3267932838 const lhs_elem = lhs.elemValueBuffer(sema.mod, i, &lhs_buf);
......@@ -32730,7 +32889,7 @@ fn floatSub(
3273032889) !Value {
3273132890 if (float_type.zigTypeTag() == .Vector) {
3273232891 const result_data = try sema.arena.alloc(Value, float_type.vectorLen());
32733 for (result_data) |*scalar, i| {
32892 for (result_data, 0..) |*scalar, i| {
3273432893 var lhs_buf: Value.ElemValueBuffer = undefined;
3273532894 var rhs_buf: Value.ElemValueBuffer = undefined;
3273632895 const lhs_elem = lhs.elemValueBuffer(sema.mod, i, &lhs_buf);
......@@ -32788,7 +32947,7 @@ fn intSubWithOverflow(
3278832947 if (ty.zigTypeTag() == .Vector) {
3278932948 const overflowed_data = try sema.arena.alloc(Value, ty.vectorLen());
3279032949 const result_data = try sema.arena.alloc(Value, ty.vectorLen());
32791 for (result_data) |*scalar, i| {
32950 for (result_data, 0..) |*scalar, i| {
3279232951 var lhs_buf: Value.ElemValueBuffer = undefined;
3279332952 var rhs_buf: Value.ElemValueBuffer = undefined;
3279432953 const lhs_elem = lhs.elemValueBuffer(sema.mod, i, &lhs_buf);
......@@ -32842,7 +33001,7 @@ fn floatToInt(
3284233001 if (float_ty.zigTypeTag() == .Vector) {
3284333002 const elem_ty = float_ty.childType();
3284433003 const result_data = try sema.arena.alloc(Value, float_ty.vectorLen());
32845 for (result_data) |*scalar, i| {
33004 for (result_data, 0..) |*scalar, i| {
3284633005 var buf: Value.ElemValueBuffer = undefined;
3284733006 const elem_val = val.elemValueBuffer(sema.mod, i, &buf);
3284833007 scalar.* = try sema.floatToIntScalar(block, src, elem_val, elem_ty, int_ty.scalarType());
......@@ -33042,7 +33201,7 @@ fn intFitsInType(
3304233201
3304333202 .aggregate => {
3304433203 assert(ty.zigTypeTag() == .Vector);
33045 for (val.castTag(.aggregate).?.data) |elem, i| {
33204 for (val.castTag(.aggregate).?.data, 0..) |elem, i| {
3304633205 if (!(try sema.intFitsInType(elem, ty.scalarType(), null))) {
3304733206 if (vector_index) |some| some.* = i;
3304833207 return false;
......@@ -33139,7 +33298,7 @@ fn intAddWithOverflow(
3313933298 if (ty.zigTypeTag() == .Vector) {
3314033299 const overflowed_data = try sema.arena.alloc(Value, ty.vectorLen());
3314133300 const result_data = try sema.arena.alloc(Value, ty.vectorLen());
33142 for (result_data) |*scalar, i| {
33301 for (result_data, 0..) |*scalar, i| {
3314333302 var lhs_buf: Value.ElemValueBuffer = undefined;
3314433303 var rhs_buf: Value.ElemValueBuffer = undefined;
3314533304 const lhs_elem = lhs.elemValueBuffer(sema.mod, i, &lhs_buf);
......@@ -33243,7 +33402,7 @@ fn compareVector(
3324333402) !Value {
3324433403 assert(ty.zigTypeTag() == .Vector);
3324533404 const result_data = try sema.arena.alloc(Value, ty.vectorLen());
33246 for (result_data) |*scalar, i| {
33405 for (result_data, 0..) |*scalar, i| {
3324733406 var lhs_buf: Value.ElemValueBuffer = undefined;
3324833407 var rhs_buf: Value.ElemValueBuffer = undefined;
3324933408 const lhs_elem = lhs.elemValueBuffer(sema.mod, i, &lhs_buf);
src/Zir.zig+25-2
......@@ -137,6 +137,8 @@ pub const Inst = struct {
137137 /// Saturating addition.
138138 /// Uses the `pl_node` union field. Payload is `Bin`.
139139 add_sat,
140 /// The same as `add` except no safety check.
141 add_unsafe,
140142 /// Arithmetic subtraction. Asserts no integer overflow.
141143 /// Uses the `pl_node` union field. Payload is `Bin`.
142144 sub,
......@@ -382,18 +384,24 @@ pub const Inst = struct {
382384 /// Uses the `pl_node` union field. AST node is a[b] syntax. Payload is `Bin`.
383385 elem_ptr_node,
384386 /// Same as `elem_ptr_node` but used only for for loop.
385 /// Uses the `pl_node` union field. AST node is the condition of a for loop. Payload is `Bin`.
387 /// Uses the `pl_node` union field. AST node is the condition of a for loop.
388 /// Payload is `Bin`.
389 /// No OOB safety check is emitted.
386390 elem_ptr,
387391 /// Same as `elem_ptr_node` except the index is stored immediately rather than
388392 /// as a reference to another ZIR instruction.
389393 /// Uses the `pl_node` union field. AST node is an element inside array initialization
390394 /// syntax. Payload is `ElemPtrImm`.
395 /// This instruction has a way to set the result type to be a
396 /// single-pointer or a many-pointer.
391397 elem_ptr_imm,
392398 /// Given an array, slice, or pointer, returns the element at the provided index.
393399 /// Uses the `pl_node` union field. AST node is a[b] syntax. Payload is `Bin`.
394400 elem_val_node,
395401 /// Same as `elem_val_node` but used only for for loop.
396 /// Uses the `pl_node` union field. AST node is the condition of a for loop. Payload is `Bin`.
402 /// Uses the `pl_node` union field. AST node is the condition of a for loop.
403 /// Payload is `Bin`.
404 /// No OOB safety check is emitted.
397405 elem_val,
398406 /// Emits a compile error if the operand is not `void`.
399407 /// Uses the `un_node` field.
......@@ -497,6 +505,15 @@ pub const Inst = struct {
497505 /// Sends comptime control flow back to the beginning of the current block.
498506 /// Uses the `node` field.
499507 repeat_inline,
508 /// Asserts that all the lengths provided match. Used to build a for loop.
509 /// Return value is the length as a usize.
510 /// Uses the `pl_node` field with payload `MultiOp`.
511 /// There is exactly one item corresponding to each AST node inside the for
512 /// loop condition. Any item may be `none`, indicating an unbounded range.
513 /// Illegal behaviors:
514 /// * If all lengths are unbounded ranges (always a compile error).
515 /// * If any two lengths do not match each other.
516 for_len,
500517 /// Merge two error sets into one, `E1 || E2`.
501518 /// Uses the `pl_node` field with payload `Bin`.
502519 merge_error_sets,
......@@ -1008,6 +1025,7 @@ pub const Inst = struct {
10081025 .add,
10091026 .addwrap,
10101027 .add_sat,
1028 .add_unsafe,
10111029 .alloc,
10121030 .alloc_mut,
10131031 .alloc_comptime_mut,
......@@ -1242,6 +1260,7 @@ pub const Inst = struct {
12421260 .defer_err_code,
12431261 .save_err_ret_index,
12441262 .restore_err_ret_index,
1263 .for_len,
12451264 => false,
12461265
12471266 .@"break",
......@@ -1322,6 +1341,7 @@ pub const Inst = struct {
13221341 .add,
13231342 .addwrap,
13241343 .add_sat,
1344 .add_unsafe,
13251345 .alloc,
13261346 .alloc_mut,
13271347 .alloc_comptime_mut,
......@@ -1533,6 +1553,7 @@ pub const Inst = struct {
15331553 .repeat_inline,
15341554 .panic,
15351555 .panic_comptime,
1556 .for_len,
15361557 .@"try",
15371558 .try_ptr,
15381559 //.try_inline,
......@@ -1553,6 +1574,7 @@ pub const Inst = struct {
15531574 .add = .pl_node,
15541575 .addwrap = .pl_node,
15551576 .add_sat = .pl_node,
1577 .add_unsafe = .pl_node,
15561578 .sub = .pl_node,
15571579 .subwrap = .pl_node,
15581580 .sub_sat = .pl_node,
......@@ -1588,6 +1610,7 @@ pub const Inst = struct {
15881610 .@"break" = .@"break",
15891611 .break_inline = .@"break",
15901612 .check_comptime_control_flow = .un_node,
1613 .for_len = .pl_node,
15911614 .call = .pl_node,
15921615 .cmp_lt = .pl_node,
15931616 .cmp_lte = .pl_node,
src/arch/aarch64/CodeGen.zig+13-13
......@@ -515,7 +515,7 @@ fn gen(self: *Self) !void {
515515 self.ret_mcv = MCValue{ .stack_offset = stack_offset };
516516 }
517517
518 for (self.args) |*arg, arg_index| {
518 for (self.args, 0..) |*arg, arg_index| {
519519 // Copy register arguments to the stack
520520 switch (arg.*) {
521521 .register => |reg| {
......@@ -1633,14 +1633,14 @@ fn allocRegs(
16331633 var reused_read_arg: ?usize = null;
16341634
16351635 // Lock all args which are already allocated to registers
1636 for (read_args) |arg, i| {
1636 for (read_args, 0..) |arg, i| {
16371637 const mcv = try arg.bind.resolveToMcv(self);
16381638 if (mcv == .register) {
16391639 read_locks[i] = self.register_manager.lockReg(mcv.register);
16401640 }
16411641 }
16421642
1643 for (write_args) |arg, i| {
1643 for (write_args, 0..) |arg, i| {
16441644 if (arg.bind == .reg) {
16451645 write_locks[i] = self.register_manager.lockReg(arg.bind.reg);
16461646 }
......@@ -1648,7 +1648,7 @@ fn allocRegs(
16481648
16491649 // Allocate registers for all args which aren't allocated to
16501650 // registers yet
1651 for (read_args) |arg, i| {
1651 for (read_args, 0..) |arg, i| {
16521652 const mcv = try arg.bind.resolveToMcv(self);
16531653 if (mcv == .register) {
16541654 const raw_reg = mcv.register;
......@@ -1672,7 +1672,7 @@ fn allocRegs(
16721672 const raw_reg = arg.bind.reg;
16731673 arg.reg.* = self.registerAlias(raw_reg, arg.ty);
16741674 } else {
1675 reuse_operand: for (read_args) |read_arg, i| {
1675 reuse_operand: for (read_args, 0..) |read_arg, i| {
16761676 if (read_arg.bind == .inst) {
16771677 const operand = read_arg.bind.inst;
16781678 const mcv = try self.resolveInst(operand);
......@@ -1694,7 +1694,7 @@ fn allocRegs(
16941694 }
16951695 }
16961696 } else {
1697 for (write_args) |arg, i| {
1697 for (write_args, 0..) |arg, i| {
16981698 if (arg.bind == .reg) {
16991699 const raw_reg = arg.bind.reg;
17001700 arg.reg.* = self.registerAlias(raw_reg, arg.ty);
......@@ -1708,7 +1708,7 @@ fn allocRegs(
17081708
17091709 // For all read_args which need to be moved from non-register to
17101710 // register, perform the move
1711 for (read_args) |arg, i| {
1711 for (read_args, 0..) |arg, i| {
17121712 if (reused_read_arg) |j| {
17131713 // Check whether this read_arg was reused
17141714 if (i == j) continue;
......@@ -4267,7 +4267,7 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
42674267 // Make space for the arguments passed via the stack
42684268 self.max_end_stack += info.stack_byte_count;
42694269
4270 for (info.args) |mc_arg, arg_i| {
4270 for (info.args, 0..) |mc_arg, arg_i| {
42714271 const arg = args[arg_i];
42724272 const arg_ty = self.air.typeOf(arg);
42734273 const arg_mcv = try self.resolveInst(args[arg_i]);
......@@ -4757,7 +4757,7 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void {
47574757 const else_slice = else_branch.inst_table.entries.slice();
47584758 const else_keys = else_slice.items(.key);
47594759 const else_values = else_slice.items(.value);
4760 for (else_keys) |else_key, else_idx| {
4760 for (else_keys, 0..) |else_key, else_idx| {
47614761 const else_value = else_values[else_idx];
47624762 const canon_mcv = if (saved_then_branch.inst_table.fetchSwapRemove(else_key)) |then_entry| blk: {
47634763 // The instruction's MCValue is overridden in both branches.
......@@ -4790,7 +4790,7 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void {
47904790 const then_slice = saved_then_branch.inst_table.entries.slice();
47914791 const then_keys = then_slice.items(.key);
47924792 const then_values = then_slice.items(.value);
4793 for (then_keys) |then_key, then_idx| {
4793 for (then_keys, 0..) |then_key, then_idx| {
47944794 const then_value = then_values[then_idx];
47954795 // We already deleted the items from this table that matched the else_branch.
47964796 // So these are all instructions that are only overridden in the then branch.
......@@ -5069,7 +5069,7 @@ fn airSwitch(self: *Self, inst: Air.Inst.Index) !void {
50695069 const branch_into_prong_relocs = try self.gpa.alloc(u32, items.len);
50705070 defer self.gpa.free(branch_into_prong_relocs);
50715071
5072 for (items) |item, idx| {
5072 for (items, 0..) |item, idx| {
50735073 const cmp_result = try self.cmp(.{ .inst = pl_op.operand }, .{ .inst = item }, condition_ty, .neq);
50745074 branch_into_prong_relocs[idx] = try self.condBr(cmp_result);
50755075 }
......@@ -6373,7 +6373,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues {
63736373 }
63746374 }
63756375
6376 for (param_types) |ty, i| {
6376 for (param_types, 0..) |ty, i| {
63776377 const param_size = @intCast(u32, ty.abiSize(self.target.*));
63786378 if (param_size == 0) {
63796379 result.args[i] = .{ .none = {} };
......@@ -6438,7 +6438,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues {
64386438
64396439 var stack_offset: u32 = 0;
64406440
6441 for (param_types) |ty, i| {
6441 for (param_types, 0..) |ty, i| {
64426442 if (ty.abiSize(self.target.*) > 0) {
64436443 const param_size = @intCast(u32, ty.abiSize(self.target.*));
64446444 const param_alignment = ty.abiAlignment(self.target.*);
src/arch/aarch64/Emit.zig+3-3
......@@ -80,7 +80,7 @@ pub fn emitMir(
8080 try emit.lowerBranches();
8181
8282 // Emit machine code
83 for (mir_tags) |tag, index| {
83 for (mir_tags, 0..) |tag, index| {
8484 const inst = @intCast(u32, index);
8585 switch (tag) {
8686 .add_immediate => try emit.mirAddSubtractImmediate(inst),
......@@ -323,7 +323,7 @@ fn lowerBranches(emit: *Emit) !void {
323323 //
324324 // TODO optimization opportunity: do this in codegen while
325325 // generating MIR
326 for (mir_tags) |tag, index| {
326 for (mir_tags, 0..) |tag, index| {
327327 const inst = @intCast(u32, index);
328328 if (isBranch(tag)) {
329329 const target_inst = emit.branchTarget(inst);
......@@ -368,7 +368,7 @@ fn lowerBranches(emit: *Emit) !void {
368368 all_branches_lowered = true;
369369 var current_code_offset: usize = 0;
370370
371 for (mir_tags) |tag, index| {
371 for (mir_tags, 0..) |tag, index| {
372372 const inst = @intCast(u32, index);
373373
374374 // If this instruction contained in the code offset
src/arch/arm/CodeGen.zig+13-13
......@@ -513,7 +513,7 @@ fn gen(self: *Self) !void {
513513 self.ret_mcv = MCValue{ .stack_offset = stack_offset };
514514 }
515515
516 for (self.args) |*arg, arg_index| {
516 for (self.args, 0..) |*arg, arg_index| {
517517 // Copy register arguments to the stack
518518 switch (arg.*) {
519519 .register => |reg| {
......@@ -3105,14 +3105,14 @@ fn allocRegs(
31053105 var reused_read_arg: ?usize = null;
31063106
31073107 // Lock all args which are already allocated to registers
3108 for (read_args) |arg, i| {
3108 for (read_args, 0..) |arg, i| {
31093109 const mcv = try arg.bind.resolveToMcv(self);
31103110 if (mcv == .register) {
31113111 read_locks[i] = self.register_manager.lockReg(mcv.register);
31123112 }
31133113 }
31143114
3115 for (write_args) |arg, i| {
3115 for (write_args, 0..) |arg, i| {
31163116 if (arg.bind == .reg) {
31173117 write_locks[i] = self.register_manager.lockReg(arg.bind.reg);
31183118 }
......@@ -3120,7 +3120,7 @@ fn allocRegs(
31203120
31213121 // Allocate registers for all args which aren't allocated to
31223122 // registers yet
3123 for (read_args) |arg, i| {
3123 for (read_args, 0..) |arg, i| {
31243124 const mcv = try arg.bind.resolveToMcv(self);
31253125 if (mcv == .register) {
31263126 arg.reg.* = mcv.register;
......@@ -3141,7 +3141,7 @@ fn allocRegs(
31413141 if (arg.bind == .reg) {
31423142 arg.reg.* = arg.bind.reg;
31433143 } else {
3144 reuse_operand: for (read_args) |read_arg, i| {
3144 reuse_operand: for (read_args, 0..) |read_arg, i| {
31453145 if (read_arg.bind == .inst) {
31463146 const operand = read_arg.bind.inst;
31473147 const mcv = try self.resolveInst(operand);
......@@ -3161,7 +3161,7 @@ fn allocRegs(
31613161 }
31623162 }
31633163 } else {
3164 for (write_args) |arg, i| {
3164 for (write_args, 0..) |arg, i| {
31653165 if (arg.bind == .reg) {
31663166 arg.reg.* = arg.bind.reg;
31673167 } else {
......@@ -3173,7 +3173,7 @@ fn allocRegs(
31733173
31743174 // For all read_args which need to be moved from non-register to
31753175 // register, perform the move
3176 for (read_args) |arg, i| {
3176 for (read_args, 0..) |arg, i| {
31773177 if (reused_read_arg) |j| {
31783178 // Check whether this read_arg was reused
31793179 if (i == j) continue;
......@@ -4217,7 +4217,7 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
42174217 // Make space for the arguments passed via the stack
42184218 self.max_end_stack += info.stack_byte_count;
42194219
4220 for (info.args) |mc_arg, arg_i| {
4220 for (info.args, 0..) |mc_arg, arg_i| {
42214221 const arg = args[arg_i];
42224222 const arg_ty = self.air.typeOf(arg);
42234223 const arg_mcv = try self.resolveInst(args[arg_i]);
......@@ -4669,7 +4669,7 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void {
46694669 const else_slice = else_branch.inst_table.entries.slice();
46704670 const else_keys = else_slice.items(.key);
46714671 const else_values = else_slice.items(.value);
4672 for (else_keys) |else_key, else_idx| {
4672 for (else_keys, 0..) |else_key, else_idx| {
46734673 const else_value = else_values[else_idx];
46744674 const canon_mcv = if (saved_then_branch.inst_table.fetchSwapRemove(else_key)) |then_entry| blk: {
46754675 // The instruction's MCValue is overridden in both branches.
......@@ -4702,7 +4702,7 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void {
47024702 const then_slice = saved_then_branch.inst_table.entries.slice();
47034703 const then_keys = then_slice.items(.key);
47044704 const then_values = then_slice.items(.value);
4705 for (then_keys) |then_key, then_idx| {
4705 for (then_keys, 0..) |then_key, then_idx| {
47064706 const then_value = then_values[then_idx];
47074707 // We already deleted the items from this table that matched the else_branch.
47084708 // So these are all instructions that are only overridden in the then branch.
......@@ -4991,7 +4991,7 @@ fn airSwitch(self: *Self, inst: Air.Inst.Index) !void {
49914991 const branch_into_prong_relocs = try self.gpa.alloc(u32, items.len);
49924992 defer self.gpa.free(branch_into_prong_relocs);
49934993
4994 for (items) |item, idx| {
4994 for (items, 0..) |item, idx| {
49954995 const cmp_result = try self.cmp(.{ .inst = pl_op.operand }, .{ .inst = item }, condition_ty, .neq);
49964996 branch_into_prong_relocs[idx] = try self.condBr(cmp_result);
49974997 }
......@@ -6296,7 +6296,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues {
62966296 }
62976297 }
62986298
6299 for (param_types) |ty, i| {
6299 for (param_types, 0..) |ty, i| {
63006300 if (ty.abiAlignment(self.target.*) == 8)
63016301 ncrn = std.mem.alignForwardGeneric(usize, ncrn, 2);
63026302
......@@ -6346,7 +6346,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues {
63466346
63476347 var stack_offset: u32 = 0;
63486348
6349 for (param_types) |ty, i| {
6349 for (param_types, 0..) |ty, i| {
63506350 if (ty.abiSize(self.target.*) > 0) {
63516351 const param_size = @intCast(u32, ty.abiSize(self.target.*));
63526352 const param_alignment = ty.abiAlignment(self.target.*);
src/arch/arm/Emit.zig+3-3
......@@ -77,7 +77,7 @@ pub fn emitMir(
7777 try emit.lowerBranches();
7878
7979 // Emit machine code
80 for (mir_tags) |tag, index| {
80 for (mir_tags, 0..) |tag, index| {
8181 const inst = @intCast(u32, index);
8282 switch (tag) {
8383 .add => try emit.mirDataProcessing(inst),
......@@ -239,7 +239,7 @@ fn lowerBranches(emit: *Emit) !void {
239239 //
240240 // TODO optimization opportunity: do this in codegen while
241241 // generating MIR
242 for (mir_tags) |tag, index| {
242 for (mir_tags, 0..) |tag, index| {
243243 const inst = @intCast(u32, index);
244244 if (isBranch(tag)) {
245245 const target_inst = emit.branchTarget(inst);
......@@ -284,7 +284,7 @@ fn lowerBranches(emit: *Emit) !void {
284284 all_branches_lowered = true;
285285 var current_code_offset: usize = 0;
286286
287 for (mir_tags) |tag, index| {
287 for (mir_tags, 0..) |tag, index| {
288288 const inst = @intCast(u32, index);
289289
290290 // If this instruction contained in the code offset
src/arch/arm/bits.zig+2-2
......@@ -452,11 +452,11 @@ pub const Instruction = union(enum) {
452452 const masks = comptime blk: {
453453 const base_mask: u32 = std.math.maxInt(u8);
454454 var result = [_]u32{0} ** 16;
455 for (result) |*mask, i| mask.* = std.math.rotr(u32, base_mask, 2 * i);
455 for (&result, 0..) |*mask, i| mask.* = std.math.rotr(u32, base_mask, 2 * i);
456456 break :blk result;
457457 };
458458
459 return for (masks) |mask, i| {
459 return for (masks, 0..) |mask, i| {
460460 if (x & mask == x) {
461461 break Operand{
462462 .immediate = .{
src/arch/riscv64/CodeGen.zig+2-2
......@@ -1689,7 +1689,7 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
16891689 // Due to incremental compilation, how function calls are generated depends
16901690 // on linking.
16911691 if (self.bin_file.cast(link.File.Elf)) |elf_file| {
1692 for (info.args) |mc_arg, arg_i| {
1692 for (info.args, 0..) |mc_arg, arg_i| {
16931693 const arg = args[arg_i];
16941694 const arg_ty = self.air.typeOf(arg);
16951695 const arg_mcv = try self.resolveInst(args[arg_i]);
......@@ -2727,7 +2727,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues {
27272727 var next_stack_offset: u32 = 0;
27282728 const argument_registers = [_]Register{ .a0, .a1, .a2, .a3, .a4, .a5, .a6, .a7 };
27292729
2730 for (param_types) |ty, i| {
2730 for (param_types, 0..) |ty, i| {
27312731 const param_size = @intCast(u32, ty.abiSize(self.target.*));
27322732 if (param_size <= 8) {
27332733 if (next_register < argument_registers.len) {
src/arch/riscv64/Emit.zig+1-1
......@@ -38,7 +38,7 @@ pub fn emitMir(
3838 const mir_tags = emit.mir.instructions.items(.tag);
3939
4040 // Emit machine code
41 for (mir_tags) |tag, index| {
41 for (mir_tags, 0..) |tag, index| {
4242 const inst = @intCast(u32, index);
4343 switch (tag) {
4444 .add => try emit.mirRType(inst),
src/arch/sparc64/CodeGen.zig+4-4
......@@ -1189,7 +1189,7 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
11891189 try self.register_manager.getReg(reg, null);
11901190 }
11911191
1192 for (info.args) |mc_arg, arg_i| {
1192 for (info.args, 0..) |mc_arg, arg_i| {
11931193 const arg = args[arg_i];
11941194 const arg_ty = self.air.typeOf(arg);
11951195 const arg_mcv = try self.resolveInst(arg);
......@@ -1450,7 +1450,7 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void {
14501450 const else_slice = else_branch.inst_table.entries.slice();
14511451 const else_keys = else_slice.items(.key);
14521452 const else_values = else_slice.items(.value);
1453 for (else_keys) |else_key, else_idx| {
1453 for (else_keys, 0..) |else_key, else_idx| {
14541454 const else_value = else_values[else_idx];
14551455 const canon_mcv = if (saved_then_branch.inst_table.fetchSwapRemove(else_key)) |then_entry| blk: {
14561456 // The instruction's MCValue is overridden in both branches.
......@@ -1484,7 +1484,7 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void {
14841484 const then_slice = saved_then_branch.inst_table.entries.slice();
14851485 const then_keys = then_slice.items(.key);
14861486 const then_values = then_slice.items(.value);
1487 for (then_keys) |then_key, then_idx| {
1487 for (then_keys, 0..) |then_key, then_idx| {
14881488 const then_value = then_values[then_idx];
14891489 // We already deleted the items from this table that matched the else_branch.
14901490 // So these are all instructions that are only overridden in the then branch.
......@@ -4363,7 +4363,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type, role: RegisterView)
43634363 .callee => abi.c_abi_int_param_regs_callee_view,
43644364 };
43654365
4366 for (param_types) |ty, i| {
4366 for (param_types, 0..) |ty, i| {
43674367 const param_size = @intCast(u32, ty.abiSize(self.target.*));
43684368 if (param_size <= 8) {
43694369 if (next_register < argument_registers.len) {
src/arch/sparc64/Emit.zig+3-3
......@@ -69,7 +69,7 @@ pub fn emitMir(
6969 try emit.lowerBranches();
7070
7171 // Emit machine code
72 for (mir_tags) |tag, index| {
72 for (mir_tags, 0..) |tag, index| {
7373 const inst = @intCast(u32, index);
7474 switch (tag) {
7575 .dbg_line => try emit.mirDbgLine(inst),
......@@ -513,7 +513,7 @@ fn lowerBranches(emit: *Emit) !void {
513513 //
514514 // TODO optimization opportunity: do this in codegen while
515515 // generating MIR
516 for (mir_tags) |tag, index| {
516 for (mir_tags, 0..) |tag, index| {
517517 const inst = @intCast(u32, index);
518518 if (isBranch(tag)) {
519519 const target_inst = emit.branchTarget(inst);
......@@ -558,7 +558,7 @@ fn lowerBranches(emit: *Emit) !void {
558558 all_branches_lowered = true;
559559 var current_code_offset: usize = 0;
560560
561 for (mir_tags) |tag, index| {
561 for (mir_tags, 0..) |tag, index| {
562562 const inst = @intCast(u32, index);
563563
564564 // If this instruction contained in the code offset
src/arch/wasm/CodeGen.zig+9-9
......@@ -1255,7 +1255,7 @@ fn genFunc(func: *CodeGen) InnerError!void {
12551255 // reserve space and insert all prologue instructions at the front of the instruction list
12561256 // We insert them in reserve order as there is no insertSlice in multiArrayList.
12571257 try func.mir_instructions.ensureUnusedCapacity(func.gpa, prologue.items.len);
1258 for (prologue.items) |_, index| {
1258 for (prologue.items, 0..) |_, index| {
12591259 const inst = prologue.items[prologue.items.len - 1 - index];
12601260 func.mir_instructions.insertAssumeCapacity(0, inst);
12611261 }
......@@ -3117,7 +3117,7 @@ fn mergeBranch(func: *CodeGen, branch: *const Branch) !void {
31173117 const target_values = target_slice.items(.value);
31183118
31193119 try parent.values.ensureUnusedCapacity(func.gpa, branch.values.count());
3120 for (target_keys) |key, index| {
3120 for (target_keys, 0..) |key, index| {
31213121 // TODO: process deaths from branches
31223122 parent.values.putAssumeCapacity(key, target_values[index]);
31233123 }
......@@ -3501,7 +3501,7 @@ fn airSwitchBr(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
35013501 const values = try func.gpa.alloc(CaseValue, items.len);
35023502 errdefer func.gpa.free(values);
35033503
3504 for (items) |ref, i| {
3504 for (items, 0..) |ref, i| {
35053505 const item_val = func.air.value(ref).?;
35063506 const int_val = func.valueAsI32(item_val, target_ty);
35073507 if (lowest_maybe == null or int_val < lowest_maybe.?) {
......@@ -3561,7 +3561,7 @@ fn airSwitchBr(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
35613561 while (value <= highest) : (value += 1) {
35623562 // idx represents the branch we jump to
35633563 const idx = blk: {
3564 for (case_list.items) |case, idx| {
3564 for (case_list.items, 0..) |case, idx| {
35653565 for (case.values) |case_value| {
35663566 if (case_value.integer == value) break :blk @intCast(u32, idx);
35673567 }
......@@ -3588,7 +3588,7 @@ fn airSwitchBr(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
35883588 };
35893589
35903590 try func.branches.ensureUnusedCapacity(func.gpa, case_list.items.len + @boolToInt(has_else_body));
3591 for (case_list.items) |case, index| {
3591 for (case_list.items, 0..) |case, index| {
35923592 // when sparse, we use if/else-chain, so emit conditional checks
35933593 if (is_sparse) {
35943594 // for single value prong we can emit a simple if
......@@ -4558,7 +4558,7 @@ fn airAggregateInit(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
45584558 // copy stack pointer into a temporary local, which is
45594559 // moved for each element to store each value in the right position.
45604560 const offset = try func.buildPointerOffset(result, 0, .new);
4561 for (elements) |elem, elem_index| {
4561 for (elements, 0..) |elem, elem_index| {
45624562 const elem_val = try func.resolveInst(elem);
45634563 try func.store(offset, elem_val, elem_ty, 0);
45644564
......@@ -4587,7 +4587,7 @@ fn airAggregateInit(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
45874587 // we ensure a new local is created so it's zero-initialized
45884588 const result = try func.ensureAllocLocal(backing_type);
45894589 var current_bit: u16 = 0;
4590 for (elements) |elem, elem_index| {
4590 for (elements, 0..) |elem, elem_index| {
45914591 const field = fields[elem_index];
45924592 if (!field.ty.hasRuntimeBitsIgnoreComptime()) continue;
45934593
......@@ -4623,7 +4623,7 @@ fn airAggregateInit(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
46234623 else => {
46244624 const result = try func.allocStack(result_ty);
46254625 const offset = try func.buildPointerOffset(result, 0, .new); // pointer to offset
4626 for (elements) |elem, elem_index| {
4626 for (elements, 0..) |elem, elem_index| {
46274627 if (result_ty.structFieldValueComptime(elem_index) != null) continue;
46284628
46294629 const elem_ty = result_ty.structFieldType(elem_index);
......@@ -6149,7 +6149,7 @@ fn callIntrinsic(
61496149 } else WValue{ .none = {} };
61506150
61516151 // Lower all arguments to the stack before we call our function
6152 for (args) |arg, arg_i| {
6152 for (args, 0..) |arg, arg_i| {
61536153 assert(!(want_sret_param and arg == .stack));
61546154 assert(param_types[arg_i].hasRuntimeBitsIgnoreComptime());
61556155 try func.lowerArg(.C, param_types[arg_i], arg);
src/arch/wasm/Emit.zig+1-1
......@@ -44,7 +44,7 @@ pub fn emitMir(emit: *Emit) InnerError!void {
4444 // before we emit the function body when lowering MIR
4545 try emit.emitLocals();
4646
47 for (mir_tags) |tag, index| {
47 for (mir_tags, 0..) |tag, index| {
4848 const inst = @intCast(u32, index);
4949 switch (tag) {
5050 // block instructions
src/arch/x86_64/CodeGen.zig+10-10
......@@ -186,7 +186,7 @@ const Branch = struct {
186186 _ = options;
187187 comptime assert(unused_format_string.len == 0);
188188 try writer.writeAll("Branch {\n");
189 for (ctx.insts) |inst, i| {
189 for (ctx.insts, 0..) |inst, i| {
190190 const mcv = ctx.mcvs[i];
191191 try writer.print(" %{d} => {}\n", .{ inst, mcv });
192192 }
......@@ -3951,7 +3951,7 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallModifier
39513951 };
39523952 defer if (ret_reg_lock) |lock| self.register_manager.unlockReg(lock);
39533953
3954 for (args) |arg, arg_i| {
3954 for (args, 0..) |arg, arg_i| {
39553955 const mc_arg = info.args[arg_i];
39563956 const arg_ty = self.air.typeOf(arg);
39573957 const arg_mcv = try self.resolveInst(args[arg_i]);
......@@ -4912,7 +4912,7 @@ fn airSwitch(self: *Self, inst: Air.Inst.Index) !void {
49124912 var relocs = try self.gpa.alloc(u32, items.len);
49134913 defer self.gpa.free(relocs);
49144914
4915 for (items) |item, item_i| {
4915 for (items, 0..) |item, item_i| {
49164916 const item_mcv = try self.resolveInst(item);
49174917 relocs[item_i] = try self.genCondSwitchMir(condition_ty, condition, item_mcv);
49184918 }
......@@ -4974,7 +4974,7 @@ fn airSwitch(self: *Self, inst: Air.Inst.Index) !void {
49744974 for (self.branch_stack.items) |bs| {
49754975 log.debug("{}", .{bs.fmtDebug()});
49764976 }
4977 for (branch_stack.items) |bs, i| {
4977 for (branch_stack.items, 0..) |bs, i| {
49784978 log.debug("Case-{d} branch: {}", .{ i, bs.fmtDebug() });
49794979 }
49804980
......@@ -4999,7 +4999,7 @@ fn canonicaliseBranches(self: *Self, parent_branch: *Branch, canon_branch: *Bran
49994999 const target_keys = target_slice.items(.key);
50005000 const target_values = target_slice.items(.value);
50015001
5002 for (target_keys) |target_key, target_idx| {
5002 for (target_keys, 0..) |target_key, target_idx| {
50035003 const target_value = target_values[target_idx];
50045004 const canon_mcv = if (canon_branch.inst_table.fetchSwapRemove(target_key)) |canon_entry| blk: {
50055005 // The instruction's MCValue is overridden in both branches.
......@@ -5032,7 +5032,7 @@ fn canonicaliseBranches(self: *Self, parent_branch: *Branch, canon_branch: *Bran
50325032 const canon_slice = canon_branch.inst_table.entries.slice();
50335033 const canon_keys = canon_slice.items(.key);
50345034 const canon_values = canon_slice.items(.value);
5035 for (canon_keys) |canon_key, canon_idx| {
5035 for (canon_keys, 0..) |canon_key, canon_idx| {
50365036 const canon_value = canon_values[canon_idx];
50375037 // We already deleted the items from this table that matched the target_branch.
50385038 // So these are all instructions that are only overridden in the canon branch.
......@@ -6571,7 +6571,7 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void {
65716571 switch (result_ty.zigTypeTag()) {
65726572 .Struct => {
65736573 const stack_offset = @intCast(i32, try self.allocMem(inst, abi_size, abi_align));
6574 for (elements) |elem, elem_i| {
6574 for (elements, 0..) |elem, elem_i| {
65756575 if (result_ty.structFieldValueComptime(elem_i) != null) continue; // comptime elem
65766576
65776577 const elem_ty = result_ty.structFieldType(elem_i);
......@@ -6586,7 +6586,7 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void {
65866586 const elem_ty = result_ty.childType();
65876587 const elem_size = @intCast(u32, elem_ty.abiSize(self.target.*));
65886588
6589 for (elements) |elem, elem_i| {
6589 for (elements, 0..) |elem, elem_i| {
65906590 const elem_mcv = try self.resolveInst(elem);
65916591 const elem_off = @intCast(i32, elem_size * elem_i);
65926592 try self.genSetStack(elem_ty, stack_offset - elem_off, elem_mcv, .{});
......@@ -6963,7 +6963,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues {
69636963 else => 0,
69646964 };
69656965
6966 for (param_types) |ty, i| {
6966 for (param_types, 0..) |ty, i| {
69676967 assert(ty.hasRuntimeBits());
69686968
69696969 const classes: []const abi.Class = switch (self.target.os.tag) {
......@@ -7039,7 +7039,7 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues {
70397039 else => 0,
70407040 };
70417041
7042 for (param_types) |ty, i| {
7042 for (param_types, 0..) |ty, i| {
70437043 if (!ty.hasRuntimeBits()) {
70447044 result.args[i] = .{ .none = {} };
70457045 continue;
src/arch/x86_64/Emit.zig+2-2
......@@ -61,7 +61,7 @@ const Reloc = struct {
6161pub fn lowerMir(emit: *Emit) InnerError!void {
6262 const mir_tags = emit.mir.instructions.items(.tag);
6363
64 for (mir_tags) |tag, index| {
64 for (mir_tags, 0..) |tag, index| {
6565 const inst = @intCast(u32, index);
6666 try emit.code_offset_mapping.putNoClobber(emit.bin_file.allocator, inst, emit.code.items.len);
6767 switch (tag) {
......@@ -1544,7 +1544,7 @@ const OpCode = struct {
15441544 fn init(comptime in_bytes: []const u8) OpCode {
15451545 comptime assert(in_bytes.len <= 3);
15461546 comptime var bytes: [3]u8 = undefined;
1547 inline for (in_bytes) |x, i| {
1547 inline for (in_bytes, 0..) |x, i| {
15481548 bytes[i] = x;
15491549 }
15501550 return .{ .bytes = bytes, .count = in_bytes.len };
src/arch/x86_64/Mir.zig+1-1
......@@ -535,7 +535,7 @@ pub const RegisterList = struct {
535535 const Self = @This();
536536
537537 fn getIndexForReg(registers: []const Register, reg: Register) BitSet.MaskInt {
538 for (registers) |cpreg, i| {
538 for (registers, 0..) |cpreg, i| {
539539 if (reg.id() == cpreg.id()) return @intCast(u32, i);
540540 }
541541 unreachable; // register not in input register list!
src/arch/x86_64/abi.zig+5-5
......@@ -335,7 +335,7 @@ pub fn classifySystemV(ty: Type, target: Target, ctx: Context) [8]Class {
335335 // "If one of the classes is MEMORY, the whole argument is passed in memory"
336336 // "If X87UP is not preceded by X87, the whole argument is passed in memory."
337337 var found_sseup = false;
338 for (result) |item, i| switch (item) {
338 for (result, 0..) |item, i| switch (item) {
339339 .memory => return memory_class,
340340 .x87up => if (i == 0 or result[i - 1] != .x87) return memory_class,
341341 .sseup => found_sseup = true,
......@@ -347,7 +347,7 @@ pub fn classifySystemV(ty: Type, target: Target, ctx: Context) [8]Class {
347347 if (ty_size > 16 and (result[0] != .sse or !found_sseup)) return memory_class;
348348
349349 // "If SSEUP is not preceded by SSE or SSEUP, it is converted to SSE."
350 for (result) |*item, i| {
350 for (&result, 0..) |*item, i| {
351351 if (item.* == .sseup) switch (result[i - 1]) {
352352 .sse, .sseup => continue,
353353 else => item.* = .sse,
......@@ -379,7 +379,7 @@ pub fn classifySystemV(ty: Type, target: Target, ctx: Context) [8]Class {
379379 }
380380 // Combine this field with the previous one.
381381 const field_class = classifySystemV(field.ty, target, .other);
382 for (result) |*result_item, i| {
382 for (&result, 0..) |*result_item, i| {
383383 const field_item = field_class[i];
384384 // "If both classes are equal, this is the resulting class."
385385 if (result_item.* == field_item) {
......@@ -431,7 +431,7 @@ pub fn classifySystemV(ty: Type, target: Target, ctx: Context) [8]Class {
431431 // "If one of the classes is MEMORY, the whole argument is passed in memory"
432432 // "If X87UP is not preceded by X87, the whole argument is passed in memory."
433433 var found_sseup = false;
434 for (result) |item, i| switch (item) {
434 for (result, 0..) |item, i| switch (item) {
435435 .memory => return memory_class,
436436 .x87up => if (i == 0 or result[i - 1] != .x87) return memory_class,
437437 .sseup => found_sseup = true,
......@@ -443,7 +443,7 @@ pub fn classifySystemV(ty: Type, target: Target, ctx: Context) [8]Class {
443443 if (ty_size > 16 and (result[0] != .sse or !found_sseup)) return memory_class;
444444
445445 // "If SSEUP is not preceded by SSE or SSEUP, it is converted to SSE."
446 for (result) |*item, i| {
446 for (&result, 0..) |*item, i| {
447447 if (item.* == .sseup) switch (result[i - 1]) {
448448 .sse, .sseup => continue,
449449 else => item.* = .sse,
src/codegen.zig+2-2
......@@ -511,7 +511,7 @@ pub fn generateSymbol(
511511 try code.resize(current_pos + abi_size);
512512 var bits: u16 = 0;
513513
514 for (field_vals) |field_val, index| {
514 for (field_vals, 0..) |field_val, index| {
515515 const field_ty = fields[index].ty;
516516 // pointer may point to a decl which must be marked used
517517 // but can also result in a relocation. Therefore we handle those seperately.
......@@ -537,7 +537,7 @@ pub fn generateSymbol(
537537
538538 const struct_begin = code.items.len;
539539 const field_vals = typed_value.val.castTag(.aggregate).?.data;
540 for (field_vals) |field_val, index| {
540 for (field_vals, 0..) |field_val, index| {
541541 const field_ty = typed_value.ty.structFieldType(index);
542542 if (!field_ty.hasRuntimeBits()) continue;
543543
src/codegen/c.zig+26-26
......@@ -253,7 +253,7 @@ fn formatIdent(
253253 if (solo and isReservedIdent(ident)) {
254254 try writer.writeAll("zig_e_");
255255 }
256 for (ident) |c, i| {
256 for (ident, 0..) |c, i| {
257257 switch (c) {
258258 'a'...'z', 'A'...'Z', '_' => try writer.writeByte(c),
259259 '.' => try writer.writeByte('_'),
......@@ -361,7 +361,7 @@ pub const Function = struct {
361361 _ = mutability;
362362
363363 if (f.getFreeLocals().getPtrContext(ty, f.tyHashCtx())) |locals_list| {
364 for (locals_list.items) |local_index, i| {
364 for (locals_list.items, 0..) |local_index, i| {
365365 const local = &f.locals.items[local_index];
366366 if (local.alignment >= alignment) {
367367 local.loop_depth = @intCast(LoopDepth, f.free_locals_stack.items.len - 1);
......@@ -1283,7 +1283,7 @@ pub const DeclGen = struct {
12831283
12841284 try writer.writeByte('{');
12851285 var empty = true;
1286 for (field_vals) |field_val, field_index| {
1286 for (field_vals, 0..) |field_val, field_index| {
12871287 const field_ty = ty.structFieldType(field_index);
12881288 if (!field_ty.hasRuntimeBits()) continue;
12891289
......@@ -1309,7 +1309,7 @@ pub const DeclGen = struct {
13091309 const bit_offset_val = Value.initPayload(&bit_offset_val_pl.base);
13101310
13111311 var eff_num_fields: usize = 0;
1312 for (field_vals) |_, index| {
1312 for (field_vals, 0..) |_, index| {
13131313 const field_ty = ty.structFieldType(index);
13141314 if (!field_ty.hasRuntimeBitsIgnoreComptime()) continue;
13151315
......@@ -1331,7 +1331,7 @@ pub const DeclGen = struct {
13311331
13321332 var eff_index: usize = 0;
13331333 var needs_closing_paren = false;
1334 for (field_vals) |field_val, index| {
1334 for (field_vals, 0..) |field_val, index| {
13351335 const field_ty = ty.structFieldType(index);
13361336 if (!field_ty.hasRuntimeBitsIgnoreComptime()) continue;
13371337
......@@ -1359,7 +1359,7 @@ pub const DeclGen = struct {
13591359 try writer.writeByte('(');
13601360 // a << a_off | b << b_off | c << c_off
13611361 var empty = true;
1362 for (field_vals) |field_val, index| {
1362 for (field_vals, 0..) |field_val, index| {
13631363 const field_ty = ty.structFieldType(index);
13641364 if (!field_ty.hasRuntimeBitsIgnoreComptime()) continue;
13651365
......@@ -1719,7 +1719,7 @@ pub const DeclGen = struct {
17191719 {
17201720 const fields = t.tupleFields();
17211721 var field_id: usize = 0;
1722 for (fields.types) |field_ty, i| {
1722 for (fields.types, 0..) |field_ty, i| {
17231723 if (!field_ty.hasRuntimeBits() or fields.values[i].tag() != .unreachable_value) continue;
17241724
17251725 try buffer.append(' ');
......@@ -2130,7 +2130,7 @@ pub const DeclGen = struct {
21302130 try tuple_storage.ensureTotalCapacity(allocator, t.structFieldCount());
21312131
21322132 const fields = t.tupleFields();
2133 for (fields.values) |value, index|
2133 for (fields.values, 0..) |value, index|
21342134 if (value.tag() == .unreachable_value)
21352135 tuple_storage.appendAssumeCapacity(.{
21362136 .type = fields.types[index],
......@@ -2415,7 +2415,7 @@ pub const DeclGen = struct {
24152415 const name_end = buffer.items.len - "(".len;
24162416 try dg.renderTypeAndName(bw, enum_ty, .{ .identifier = "tag" }, .Const, 0, .Complete);
24172417 try buffer.appendSlice(") {\n switch (tag) {\n");
2418 for (enum_ty.enumFields().keys()) |name, index| {
2418 for (enum_ty.enumFields().keys(), 0..) |name, index| {
24192419 const name_z = try dg.typedefs.allocator.dupeZ(u8, name);
24202420 defer dg.typedefs.allocator.free(name_z);
24212421 const name_bytes = name_z[0 .. name_z.len + 1];
......@@ -2681,7 +2681,7 @@ pub fn genErrDecls(o: *Object) !void {
26812681 try writer.writeAll("enum {\n");
26822682 o.indent_writer.pushIndent();
26832683 var max_name_len: usize = 0;
2684 for (o.dg.module.error_name_list.items) |name, value| {
2684 for (o.dg.module.error_name_list.items, 0..) |name, value| {
26852685 max_name_len = std.math.max(name.len, max_name_len);
26862686 var err_pl = Value.Payload.Error{ .data = .{ .name = name } };
26872687 try o.dg.renderValue(writer, Type.anyerror, Value.initPayload(&err_pl.base), .Other);
......@@ -2724,7 +2724,7 @@ pub fn genErrDecls(o: *Object) !void {
27242724 try writer.writeAll("static ");
27252725 try o.dg.renderTypeAndName(writer, name_array_ty, .{ .identifier = name_prefix }, .Const, 0, .Complete);
27262726 try writer.writeAll(" = {");
2727 for (o.dg.module.error_name_list.items) |name, value| {
2727 for (o.dg.module.error_name_list.items, 0..) |name, value| {
27282728 if (value != 0) try writer.writeByte(',');
27292729
27302730 var len_pl = Value.Payload.U64{ .base = .{ .tag = .int_u64 }, .data = name.len };
......@@ -2742,7 +2742,7 @@ fn genExports(o: *Object) !void {
27422742 defer tracy.end();
27432743
27442744 const fwd_decl_writer = o.dg.fwd_decl.writer();
2745 if (o.dg.module.decl_exports.get(o.dg.decl_index)) |exports| for (exports.items[1..]) |@"export", i| {
2745 if (o.dg.module.decl_exports.get(o.dg.decl_index)) |exports| for (exports.items[1..], 0..) |@"export", i| {
27462746 try fwd_decl_writer.writeAll("zig_export(");
27472747 try o.dg.renderFunctionSignature(fwd_decl_writer, .Forward, @intCast(u32, 1 + i));
27482748 try fwd_decl_writer.print(", {s}, {s});\n", .{
......@@ -2800,7 +2800,7 @@ pub fn genFunc(f: *Function) !void {
28002800 // alignment, descending.
28012801 const free_locals = f.getFreeLocals();
28022802 const values = f.allocs.values();
2803 for (f.allocs.keys()) |local_index, i| {
2803 for (f.allocs.keys(), 0..) |local_index, i| {
28042804 if (values[i]) continue; // static
28052805 const local = f.locals.items[local_index];
28062806 log.debug("inserting local {d} into free_locals", .{local_index});
......@@ -4238,7 +4238,7 @@ fn airCall(
42384238
42394239 const resolved_args = try gpa.alloc(CValue, args.len);
42404240 defer gpa.free(resolved_args);
4241 for (args) |arg, i| {
4241 for (args, 0..) |arg, i| {
42424242 resolved_args[i] = try f.resolveInst(arg);
42434243 }
42444244
......@@ -4303,7 +4303,7 @@ fn airCall(
43034303
43044304 try writer.writeByte('(');
43054305 var args_written: usize = 0;
4306 for (args) |arg, arg_i| {
4306 for (args, 0..) |arg, arg_i| {
43074307 const ty = f.air.typeOf(arg);
43084308 if (!ty.hasRuntimeBitsIgnoreComptime()) continue;
43094309 if (args_written != 0) {
......@@ -5043,7 +5043,7 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue {
50435043 extra_i = constraints_extra_begin;
50445044 var locals_index = locals_begin;
50455045 try writer.writeByte(':');
5046 for (outputs) |output, index| {
5046 for (outputs, 0..) |output, index| {
50475047 const extra_bytes = std.mem.sliceAsBytes(f.air.extra[extra_i..]);
50485048 const constraint = std.mem.sliceTo(extra_bytes, 0);
50495049 const name = std.mem.sliceTo(extra_bytes[constraint.len + 1 ..], 0);
......@@ -5067,7 +5067,7 @@ fn airAsm(f: *Function, inst: Air.Inst.Index) !CValue {
50675067 try writer.writeByte(')');
50685068 }
50695069 try writer.writeByte(':');
5070 for (inputs) |input, index| {
5070 for (inputs, 0..) |input, index| {
50715071 const extra_bytes = std.mem.sliceAsBytes(f.air.extra[extra_i..]);
50725072 const constraint = std.mem.sliceTo(extra_bytes, 0);
50735073 const name = std.mem.sliceTo(extra_bytes[constraint.len + 1 ..], 0);
......@@ -5426,7 +5426,7 @@ fn structFieldPtr(f: *Function, inst: Air.Inst.Index, struct_ptr_ty: Type, struc
54265426 };
54275427 const field_loc = switch (struct_ty.tag()) {
54285428 .@"struct" => switch (struct_ty.containerLayout()) {
5429 .Auto, .Extern => for (struct_ty.structFields().values()[index..]) |field, offset| {
5429 .Auto, .Extern => for (struct_ty.structFields().values()[index..], 0..) |field, offset| {
54305430 if (field.ty.hasRuntimeBitsIgnoreComptime()) break FieldLoc{ .field = .{
54315431 .identifier = struct_ty.structFieldName(index + offset),
54325432 } };
......@@ -5469,7 +5469,7 @@ fn structFieldPtr(f: *Function, inst: Air.Inst.Index, struct_ptr_ty: Type, struc
54695469 if (tuple.values[index].tag() != .unreachable_value) return CValue.none;
54705470
54715471 var id: usize = 0;
5472 break :field_name for (tuple.values) |value, i| {
5472 break :field_name for (tuple.values, 0..) |value, i| {
54735473 if (value.tag() != .unreachable_value) continue;
54745474 if (!tuple.types[i].hasRuntimeBitsIgnoreComptime()) continue;
54755475 if (i >= index) break FieldLoc{ .field = .{ .field = id } };
......@@ -6687,7 +6687,7 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue {
66876687 const gpa = f.object.dg.gpa;
66886688 const resolved_elements = try gpa.alloc(CValue, elements.len);
66896689 defer gpa.free(resolved_elements);
6690 for (elements) |element, i| {
6690 for (elements, 0..) |element, i| {
66916691 resolved_elements[i] = try f.resolveInst(element);
66926692 }
66936693 {
......@@ -6706,7 +6706,7 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue {
67066706 switch (inst_ty.zigTypeTag()) {
67076707 .Array, .Vector => {
67086708 const elem_ty = inst_ty.childType();
6709 for (resolved_elements) |element, i| {
6709 for (resolved_elements, 0..) |element, i| {
67106710 try f.writeCValue(writer, local, .Other);
67116711 try writer.print("[{d}] = ", .{i});
67126712 try f.writeCValue(writer, element, .Other);
......@@ -6727,7 +6727,7 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue {
67276727 try writer.writeAll(")");
67286728 try writer.writeByte('{');
67296729 var empty = true;
6730 for (elements) |element, index| {
6730 for (elements, 0..) |element, index| {
67316731 if (inst_ty.structFieldValueComptime(index)) |_| continue;
67326732
67336733 if (!empty) try writer.writeAll(", ");
......@@ -6746,7 +6746,7 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue {
67466746 try writer.writeAll("};\n");
67476747
67486748 var field_id: usize = 0;
6749 for (elements) |element, index| {
6749 for (elements, 0..) |element, index| {
67506750 if (inst_ty.structFieldValueComptime(index)) |_| continue;
67516751
67526752 const element_ty = f.air.typeOf(element);
......@@ -6784,7 +6784,7 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue {
67846784 const bit_offset_val = Value.initPayload(&bit_offset_val_pl.base);
67856785
67866786 var empty = true;
6787 for (elements) |_, index| {
6787 for (elements, 0..) |_, index| {
67886788 const field_ty = inst_ty.structFieldType(index);
67896789 if (!field_ty.hasRuntimeBitsIgnoreComptime()) continue;
67906790
......@@ -6796,7 +6796,7 @@ fn airAggregateInit(f: *Function, inst: Air.Inst.Index) !CValue {
67966796 empty = false;
67976797 }
67986798 empty = true;
6799 for (resolved_elements) |element, index| {
6799 for (resolved_elements, 0..) |element, index| {
68006800 const field_ty = inst_ty.structFieldType(index);
68016801 if (!field_ty.hasRuntimeBitsIgnoreComptime()) continue;
68026802
......@@ -7608,7 +7608,7 @@ fn deinitFreeLocalsMap(gpa: mem.Allocator, map: *LocalsMap) void {
76087608}
76097609
76107610fn noticeBranchFrees(f: *Function, pre_locals_len: LocalIndex, inst: Air.Inst.Index) !void {
7611 for (f.locals.items[pre_locals_len..]) |*local, local_offset| {
7611 for (f.locals.items[pre_locals_len..], 0..) |*local, local_offset| {
76127612 const local_index = pre_locals_len + @intCast(LocalIndex, local_offset);
76137613 if (f.allocs.contains(local_index)) continue; // allocs are not freeable
76147614
src/codegen/llvm.zig+30-30
......@@ -600,7 +600,7 @@ pub const Object = struct {
600600 defer mod.gpa.free(llvm_errors);
601601
602602 llvm_errors[0] = llvm_slice_ty.getUndef();
603 for (llvm_errors[1..]) |*llvm_error, i| {
603 for (llvm_errors[1..], 0..) |*llvm_error, i| {
604604 const name = error_name_list[1..][i];
605605 const str_init = self.context.constString(name.ptr, @intCast(c_uint, name.len), .False);
606606 const str_global = self.llvm_module.addGlobal(str_init.typeOf(), "");
......@@ -691,7 +691,7 @@ pub const Object = struct {
691691 object.extern_collisions.clearRetainingCapacity();
692692
693693 const export_keys = mod.decl_exports.keys();
694 for (mod.decl_exports.values()) |export_list, i| {
694 for (mod.decl_exports.values(), 0..) |export_list, i| {
695695 const decl_index = export_keys[i];
696696 const llvm_global = object.decl_map.get(decl_index) orelse continue;
697697 for (export_list.items) |exp| {
......@@ -1076,7 +1076,7 @@ pub const Object = struct {
10761076 const param_alignment = param_ty.abiAlignment(target);
10771077 const arg_ptr = buildAllocaInner(dg.context, builder, llvm_func, false, param_llvm_ty, param_alignment, target);
10781078 const llvm_ty = dg.context.structType(field_types.ptr, @intCast(c_uint, field_types.len), .False);
1079 for (field_types) |_, field_i_usize| {
1079 for (field_types, 0..) |_, field_i_usize| {
10801080 const field_i = @intCast(c_uint, field_i_usize);
10811081 const param = llvm_func.getParam(llvm_arg_i);
10821082 llvm_arg_i += 1;
......@@ -1495,7 +1495,7 @@ pub const Object = struct {
14951495 const int_info = ty.intInfo(target);
14961496 assert(int_info.bits != 0);
14971497
1498 for (field_names) |field_name, i| {
1498 for (field_names, 0..) |field_name, i| {
14991499 const field_name_z = try gpa.dupeZ(u8, field_name);
15001500 defer gpa.free(field_name_z);
15011501
......@@ -1992,7 +1992,7 @@ pub const Object = struct {
19921992 comptime assert(struct_layout_version == 2);
19931993 var offset: u64 = 0;
19941994
1995 for (tuple.types) |field_ty, i| {
1995 for (tuple.types, 0..) |field_ty, i| {
19961996 const field_val = tuple.values[i];
19971997 if (field_val.tag() != .unreachable_value or !field_ty.hasRuntimeBits()) continue;
19981998
......@@ -2921,7 +2921,7 @@ pub const DeclGen = struct {
29212921 var offset: u64 = 0;
29222922 var big_align: u32 = 0;
29232923
2924 for (tuple.types) |field_ty, i| {
2924 for (tuple.types, 0..) |field_ty, i| {
29252925 const field_val = tuple.values[i];
29262926 if (field_val.tag() != .unreachable_value or !field_ty.hasRuntimeBits()) continue;
29272927
......@@ -3432,7 +3432,7 @@ pub const DeclGen = struct {
34323432 const llvm_elems = try gpa.alloc(*llvm.Value, len);
34333433 defer gpa.free(llvm_elems);
34343434 var need_unnamed = false;
3435 for (elem_vals[0..len]) |elem_val, i| {
3435 for (elem_vals[0..len], 0..) |elem_val, i| {
34363436 llvm_elems[i] = try dg.lowerValue(.{ .ty = elem_ty, .val = elem_val });
34373437 need_unnamed = need_unnamed or dg.isUnnamedType(elem_ty, llvm_elems[i]);
34383438 }
......@@ -3618,7 +3618,7 @@ pub const DeclGen = struct {
36183618 var big_align: u32 = 0;
36193619 var need_unnamed = false;
36203620
3621 for (tuple.types) |field_ty, i| {
3621 for (tuple.types, 0..) |field_ty, i| {
36223622 if (tuple.values[i].tag() != .unreachable_value) continue;
36233623 if (!field_ty.hasRuntimeBitsIgnoreComptime()) continue;
36243624
......@@ -3680,7 +3680,7 @@ pub const DeclGen = struct {
36803680 comptime assert(Type.packed_struct_layout_version == 2);
36813681 var running_int: *llvm.Value = int_llvm_ty.constNull();
36823682 var running_bits: u16 = 0;
3683 for (field_vals) |field_val, i| {
3683 for (field_vals, 0..) |field_val, i| {
36843684 const field = fields[i];
36853685 if (!field.ty.hasRuntimeBitsIgnoreComptime()) continue;
36863686
......@@ -3855,7 +3855,7 @@ pub const DeclGen = struct {
38553855 const elem_ty = tv.ty.elemType();
38563856 const llvm_elems = try dg.gpa.alloc(*llvm.Value, vector_len);
38573857 defer dg.gpa.free(llvm_elems);
3858 for (llvm_elems) |*elem, i| {
3858 for (llvm_elems, 0..) |*elem, i| {
38593859 var byte_payload: Value.Payload.U64 = .{
38603860 .base = .{ .tag = .int_u64 },
38613861 .data = bytes[i],
......@@ -3880,7 +3880,7 @@ pub const DeclGen = struct {
38803880 const elem_ty = tv.ty.elemType();
38813881 const llvm_elems = try dg.gpa.alloc(*llvm.Value, vector_len);
38823882 defer dg.gpa.free(llvm_elems);
3883 for (llvm_elems) |*elem, i| {
3883 for (llvm_elems, 0..) |*elem, i| {
38843884 elem.* = try dg.lowerValue(.{ .ty = elem_ty, .val = elem_vals[i] });
38853885 }
38863886 return llvm.constVector(
......@@ -3913,7 +3913,7 @@ pub const DeclGen = struct {
39133913 const elem_ty = tv.ty.elemType();
39143914 const llvm_elems = try dg.gpa.alloc(*llvm.Value, vector_len);
39153915 defer dg.gpa.free(llvm_elems);
3916 for (llvm_elems) |*elem, i| {
3916 for (llvm_elems, 0..) |*elem, i| {
39173917 var byte_payload: Value.Payload.U64 = .{
39183918 .base = .{ .tag = .int_u64 },
39193919 .data = bytes[i],
......@@ -4479,7 +4479,7 @@ pub const FuncGen = struct {
44794479
44804480 fn genBody(self: *FuncGen, body: []const Air.Inst.Index) Error!void {
44814481 const air_tags = self.air.instructions.items(.tag);
4482 for (body) |inst, i| {
4482 for (body, 0..) |inst, i| {
44834483 const opt_value: ?*llvm.Value = switch (air_tags[inst]) {
44844484 // zig fmt: off
44854485 .add => try self.airAdd(inst, false),
......@@ -4852,7 +4852,7 @@ pub const FuncGen = struct {
48524852
48534853 const llvm_ty = self.context.structType(llvm_types.ptr, @intCast(c_uint, llvm_types.len), .False);
48544854 try llvm_args.ensureUnusedCapacity(it.llvm_types_len);
4855 for (llvm_types) |field_ty, i_usize| {
4855 for (llvm_types, 0..) |field_ty, i_usize| {
48564856 const i = @intCast(c_uint, i_usize);
48574857 const field_ptr = self.builder.buildStructGEP(llvm_ty, arg_ptr, i, "");
48584858 const load_inst = self.builder.buildLoad(field_ty, field_ptr, "");
......@@ -6250,7 +6250,7 @@ pub const FuncGen = struct {
62506250 var name_map: std.StringArrayHashMapUnmanaged(u16) = .{};
62516251 try name_map.ensureUnusedCapacity(arena, max_param_count);
62526252
6253 for (outputs) |output, i| {
6253 for (outputs, 0..) |output, i| {
62546254 const extra_bytes = std.mem.sliceAsBytes(self.air.extra[extra_i..]);
62556255 const constraint = std.mem.sliceTo(std.mem.sliceAsBytes(self.air.extra[extra_i..]), 0);
62566256 const name = std.mem.sliceTo(extra_bytes[constraint.len + 1 ..], 0);
......@@ -6435,7 +6435,7 @@ pub const FuncGen = struct {
64356435
64366436 var name_start: usize = undefined;
64376437 var modifier_start: usize = undefined;
6438 for (asm_source) |byte, i| {
6438 for (asm_source, 0..) |byte, i| {
64396439 switch (state) {
64406440 .start => switch (byte) {
64416441 '%' => state = .percent,
......@@ -6526,7 +6526,7 @@ pub const FuncGen = struct {
65266526 .Auto,
65276527 "",
65286528 );
6529 for (llvm_param_attrs[0..param_count]) |llvm_elem_ty, i| {
6529 for (llvm_param_attrs[0..param_count], 0..) |llvm_elem_ty, i| {
65306530 if (llvm_elem_ty) |llvm_ty| {
65316531 llvm.setCallElemTypeAttr(call, i, llvm_ty);
65326532 }
......@@ -6534,7 +6534,7 @@ pub const FuncGen = struct {
65346534
65356535 var ret_val = call;
65366536 llvm_ret_i = 0;
6537 for (outputs) |output, i| {
6537 for (outputs, 0..) |output, i| {
65386538 if (llvm_ret_indirect[i]) continue;
65396539
65406540 const output_value = if (return_count > 1) b: {
......@@ -7416,7 +7416,7 @@ pub const FuncGen = struct {
74167416 const index_i32 = llvm_i32.constInt(i, .False);
74177417
74187418 var args: [3]*llvm.Value = undefined;
7419 for (args_vectors) |arg_vector, k| {
7419 for (args_vectors, 0..) |arg_vector, k| {
74207420 args[k] = self.builder.buildExtractElement(arg_vector, index_i32, "");
74217421 }
74227422 const result_elem = self.builder.buildCall(llvm_fn.globalGetValueType(), llvm_fn, &args, args_len, .C, .Auto, "");
......@@ -8785,7 +8785,7 @@ pub const FuncGen = struct {
87858785 const tag_int_value = fn_val.getParam(0);
87868786 const switch_instr = self.builder.buildSwitch(tag_int_value, unnamed_block, @intCast(c_uint, fields.count()));
87878787
8788 for (fields.keys()) |_, field_index| {
8788 for (fields.keys(), 0..) |_, field_index| {
87898789 const this_tag_int_value = int: {
87908790 var tag_val_payload: Value.Payload.U32 = .{
87918791 .base = .{ .tag = .enum_field_index },
......@@ -8874,7 +8874,7 @@ pub const FuncGen = struct {
88748874 usize_llvm_ty.constNull(), usize_llvm_ty.constNull(),
88758875 };
88768876
8877 for (fields.keys()) |name, field_index| {
8877 for (fields.keys(), 0..) |name, field_index| {
88788878 const str_init = self.context.constString(name.ptr, @intCast(c_uint, name.len), .False);
88798879 const str_init_llvm_ty = str_init.typeOf();
88808880 const str_global = self.dg.object.llvm_module.addGlobal(str_init_llvm_ty, "");
......@@ -8998,7 +8998,7 @@ pub const FuncGen = struct {
89988998
89998999 const llvm_i32 = self.context.intType(32);
90009000
9001 for (values) |*val, i| {
9001 for (values, 0..) |*val, i| {
90029002 var buf: Value.ElemValueBuffer = undefined;
90039003 const elem = mask.elemValueBuffer(self.dg.module, i, &buf);
90049004 if (elem.isUndef()) {
......@@ -9180,7 +9180,7 @@ pub const FuncGen = struct {
91809180 const llvm_u32 = self.context.intType(32);
91819181
91829182 var vector = llvm_result_ty.getUndef();
9183 for (elements) |elem, i| {
9183 for (elements, 0..) |elem, i| {
91849184 const index_u32 = llvm_u32.constInt(i, .False);
91859185 const llvm_elem = try self.resolveInst(elem);
91869186 vector = self.builder.buildInsertElement(vector, llvm_elem, index_u32, "");
......@@ -9197,7 +9197,7 @@ pub const FuncGen = struct {
91979197 comptime assert(Type.packed_struct_layout_version == 2);
91989198 var running_int: *llvm.Value = int_llvm_ty.constNull();
91999199 var running_bits: u16 = 0;
9200 for (elements) |elem, i| {
9200 for (elements, 0..) |elem, i| {
92019201 const field = fields[i];
92029202 if (!field.ty.hasRuntimeBitsIgnoreComptime()) continue;
92039203
......@@ -9229,7 +9229,7 @@ pub const FuncGen = struct {
92299229 const alloca_inst = self.buildAlloca(llvm_result_ty, result_ty.abiAlignment(target));
92309230
92319231 var indices: [2]*llvm.Value = .{ llvm_u32.constNull(), undefined };
9232 for (elements) |elem, i| {
9232 for (elements, 0..) |elem, i| {
92339233 if (result_ty.structFieldValueComptime(i) != null) continue;
92349234
92359235 const llvm_elem = try self.resolveInst(elem);
......@@ -9250,7 +9250,7 @@ pub const FuncGen = struct {
92509250 return alloca_inst;
92519251 } else {
92529252 var result = llvm_result_ty.getUndef();
9253 for (elements) |elem, i| {
9253 for (elements, 0..) |elem, i| {
92549254 if (result_ty.structFieldValueComptime(i) != null) continue;
92559255
92569256 const llvm_elem = try self.resolveInst(elem);
......@@ -9275,7 +9275,7 @@ pub const FuncGen = struct {
92759275 };
92769276 const elem_ptr_ty = Type.initPayload(&elem_ptr_payload.base);
92779277
9278 for (elements) |elem, i| {
9278 for (elements, 0..) |elem, i| {
92799279 const indices: [2]*llvm.Value = .{
92809280 llvm_usize.constNull(),
92819281 llvm_usize.constInt(@intCast(c_uint, i), .False),
......@@ -9914,7 +9914,7 @@ pub const FuncGen = struct {
99149914 };
99159915 const array_elements = [_]*llvm.Value{ request, a1, a2, a3, a4, a5 };
99169916 const zero = usize_llvm_ty.constInt(0, .False);
9917 for (array_elements) |elem, i| {
9917 for (array_elements, 0..) |elem, i| {
99189918 const indexes = [_]*llvm.Value{
99199919 zero, usize_llvm_ty.constInt(@intCast(c_uint, i), .False),
99209920 };
......@@ -10327,7 +10327,7 @@ fn llvmFieldIndex(
1032710327 if (ty.isSimpleTupleOrAnonStruct()) {
1032810328 const tuple = ty.tupleFields();
1032910329 var llvm_field_index: c_uint = 0;
10330 for (tuple.types) |field_ty, i| {
10330 for (tuple.types, 0..) |field_ty, i| {
1033110331 if (tuple.values[i].tag() != .unreachable_value or !field_ty.hasRuntimeBits()) continue;
1033210332
1033310333 const field_align = field_ty.abiAlignment(target);
......@@ -10938,7 +10938,7 @@ fn isByRef(ty: Type) bool {
1093810938 if (ty.isSimpleTupleOrAnonStruct()) {
1093910939 const tuple = ty.tupleFields();
1094010940 var count: usize = 0;
10941 for (tuple.values) |field_val, i| {
10941 for (tuple.values, 0..) |field_val, i| {
1094210942 if (field_val.tag() != .unreachable_value or !tuple.types[i].hasRuntimeBits()) continue;
1094310943
1094410944 count += 1;
src/codegen/spirv.zig+2-2
......@@ -418,7 +418,7 @@ pub const DeclGen = struct {
418418
419419 const elem_refs = try self.gpa.alloc(IdRef, vector_len);
420420 defer self.gpa.free(elem_refs);
421 for (elem_refs) |*elem, i| {
421 for (elem_refs, 0..) |*elem, i| {
422422 elem.* = try self.genConstant(elem_ty, elem_vals[i]);
423423 }
424424 try section.emit(self.spv.gpa, .OpConstantComposite, .{
......@@ -498,7 +498,7 @@ pub const DeclGen = struct {
498498 return self.fail("VarArgs functions are unsupported for SPIR-V", .{});
499499
500500 const param_types = try self.spv.arena.alloc(SpvType.Ref, ty.fnParamLen());
501 for (param_types) |*param, i| {
501 for (param_types, 0..) |*param, i| {
502502 param.* = try self.resolveType(ty.fnParamType(i));
503503 }
504504
src/codegen/spirv/Assembler.zig+1-1
......@@ -392,7 +392,7 @@ fn processTypeInstruction(self: *Assembler) !AsmValue {
392392 .OpTypeFunction => blk: {
393393 const param_operands = operands[2..];
394394 const param_types = try self.spv.arena.alloc(SpvType.Ref, param_operands.len);
395 for (param_types) |*param, i| {
395 for (param_types, 0..) |*param, i| {
396396 param.* = try self.resolveTypeRef(param_operands[i].ref_id);
397397 }
398398 const payload = try self.spv.arena.create(SpvType.Payload.Function);
src/codegen/spirv/Module.zig+2-2
......@@ -161,7 +161,7 @@ pub fn flush(self: Module, file: std.fs.File) !void {
161161
162162 var iovc_buffers: [buffers.len]std.os.iovec_const = undefined;
163163 var file_size: u64 = 0;
164 for (iovc_buffers) |*iovc, i| {
164 for (&iovc_buffers, 0..) |*iovc, i| {
165165 // Note, since spir-v supports both little and big endian we can ignore byte order here and
166166 // just treat the words as a sequence of bytes.
167167 const bytes = std.mem.sliceAsBytes(buffers[i]);
......@@ -389,7 +389,7 @@ fn decorateStruct(self: *Module, target: IdRef, info: *const Type.Payload.Struct
389389 // Decorations for the struct members.
390390 const extra = info.member_decoration_extra;
391391 var extra_i: u32 = 0;
392 for (info.members) |member, i| {
392 for (info.members, 0..) |member, i| {
393393 const d = member.decorations;
394394 const index = @intCast(Word, i);
395395 switch (d.matrix_layout) {
src/codegen/spirv/Section.zig+1-1
......@@ -195,7 +195,7 @@ fn writeContextDependentNumber(section: *Section, operand: spec.LiteralContextDe
195195
196196fn writeExtendedMask(section: *Section, comptime Operand: type, operand: Operand) void {
197197 var mask: Word = 0;
198 inline for (@typeInfo(Operand).Struct.fields) |field, bit| {
198 inline for (@typeInfo(Operand).Struct.fields, 0..) |field, bit| {
199199 switch (@typeInfo(field.type)) {
200200 .Optional => if (@field(operand, field.name) != null) {
201201 mask |= 1 << @intCast(u5, bit);
src/codegen/spirv/type.zig+1-1
......@@ -98,7 +98,7 @@ pub const Type = extern union {
9898 const struct_b = b.payload(.@"struct");
9999 if (struct_a.members.len != struct_b.members.len)
100100 return false;
101 for (struct_a.members) |mem_a, i| {
101 for (struct_a.members, 0..) |mem_a, i| {
102102 if (!std.meta.eql(mem_a, struct_b.members[i]))
103103 return false;
104104 }
src/glibc.zig+3-3
......@@ -698,7 +698,7 @@ pub fn buildSharedObjects(comp: *Compilation) !void {
698698 const metadata = try loadMetaData(comp.gpa, abilists_contents);
699699 defer metadata.destroy(comp.gpa);
700700
701 const target_targ_index = for (metadata.all_targets) |targ, i| {
701 const target_targ_index = for (metadata.all_targets, 0..) |targ, i| {
702702 if (targ.arch == target.cpu.arch and
703703 targ.os == target.os.tag and
704704 targ.abi == target.abi)
......@@ -709,7 +709,7 @@ pub fn buildSharedObjects(comp: *Compilation) !void {
709709 unreachable; // target_util.available_libcs prevents us from getting here
710710 };
711711
712 const target_ver_index = for (metadata.all_versions) |ver, i| {
712 const target_ver_index = for (metadata.all_versions, 0..) |ver, i| {
713713 switch (ver.order(target_version)) {
714714 .eq => break i,
715715 .lt => continue,
......@@ -743,7 +743,7 @@ pub fn buildSharedObjects(comp: *Compilation) !void {
743743 var stubs_asm = std.ArrayList(u8).init(comp.gpa);
744744 defer stubs_asm.deinit();
745745
746 for (libs) |lib, lib_i| {
746 for (libs, 0..) |lib, lib_i| {
747747 stubs_asm.shrinkRetainingCapacity(0);
748748 try stubs_asm.appendSlice(".text\n");
749749
src/libc_installation.zig+3-3
......@@ -66,7 +66,7 @@ pub const LibCInstallation = struct {
6666 var line_it = std.mem.split(u8, line, "=");
6767 const name = line_it.first();
6868 const value = line_it.rest();
69 inline for (fields) |field, i| {
69 inline for (fields, 0..) |field, i| {
7070 if (std.mem.eql(u8, name, field.name)) {
7171 found_keys[i].found = true;
7272 if (value.len == 0) {
......@@ -79,7 +79,7 @@ pub const LibCInstallation = struct {
7979 }
8080 }
8181 }
82 inline for (fields) |field, i| {
82 inline for (fields, 0..) |field, i| {
8383 if (!found_keys[i].found) {
8484 log.err("missing field: {s}\n", .{field.name});
8585 return error.ParseError;
......@@ -640,7 +640,7 @@ fn printVerboseInvocation(
640640 } else {
641641 std.debug.print("Zig attempted to find the path to native system libc headers by executing this command:\n", .{});
642642 }
643 for (argv) |arg, i| {
643 for (argv, 0..) |arg, i| {
644644 if (i != 0) std.debug.print(" ", .{});
645645 std.debug.print("{s}", .{arg});
646646 }
src/libunwind.zig+1-1
......@@ -34,7 +34,7 @@ pub fn buildStaticLib(comp: *Compilation) !void {
3434 .basename = basename,
3535 };
3636 var c_source_files: [unwind_src_list.len]Compilation.CSourceFile = undefined;
37 for (unwind_src_list) |unwind_src, i| {
37 for (unwind_src_list, 0..) |unwind_src, i| {
3838 var cflags = std.ArrayList([]const u8).init(arena);
3939
4040 switch (Compilation.classifyFileExt(unwind_src)) {
src/link/Coff.zig+3-3
......@@ -486,7 +486,7 @@ fn growSectionVM(self: *Coff, sect_id: u32, needed_size: u32) !void {
486486
487487 // TODO: enforce order by increasing VM addresses in self.sections container.
488488 // This is required by the loader anyhow as far as I can tell.
489 for (self.sections.items(.header)[sect_id + 1 ..]) |*next_header, next_sect_id| {
489 for (self.sections.items(.header)[sect_id + 1 ..], 0..) |*next_header, next_sect_id| {
490490 const maybe_last_atom_index = self.sections.items(.last_atom_index)[sect_id + 1 + next_sect_id];
491491 next_header.virtual_address += diff;
492492
......@@ -2191,7 +2191,7 @@ fn logSymtab(self: *Coff) void {
21912191
21922192 log.debug("symtab:", .{});
21932193 log.debug(" object(null)", .{});
2194 for (self.locals.items) |*sym, sym_id| {
2194 for (self.locals.items, 0..) |*sym, sym_id| {
21952195 const where = if (sym.section_number == .UNDEFINED) "ord" else "sect";
21962196 const def_index: u16 = switch (sym.section_number) {
21972197 .UNDEFINED => 0, // TODO
......@@ -2216,7 +2216,7 @@ fn logSymtab(self: *Coff) void {
22162216 }
22172217
22182218 log.debug("GOT entries:", .{});
2219 for (self.got_entries.items) |entry, i| {
2219 for (self.got_entries.items, 0..) |entry, i| {
22202220 const got_sym = self.getSymbol(.{ .sym_index = entry.sym_index, .file = null });
22212221 const target_sym = self.getSymbol(entry.target);
22222222 if (target_sym.section_number == .UNDEFINED) {
src/link/Dwarf.zig+5-5
......@@ -339,7 +339,7 @@ pub const DeclState = struct {
339339 try dbg_info_buffer.writer().print("{}\x00", .{ty.fmt(module)});
340340
341341 const fields = ty.tupleFields();
342 for (fields.types) |field, field_index| {
342 for (fields.types, 0..) |field, field_index| {
343343 // DW.AT.member
344344 try dbg_info_buffer.append(@enumToInt(AbbrevKind.struct_member));
345345 // DW.AT.name, DW.FORM.string
......@@ -367,7 +367,7 @@ pub const DeclState = struct {
367367 }
368368
369369 const fields = ty.structFields();
370 for (fields.keys()) |field_name, field_index| {
370 for (fields.keys(), 0..) |field_name, field_index| {
371371 const field = fields.get(field_name).?;
372372 if (!field.ty.hasRuntimeBits()) continue;
373373 // DW.AT.member
......@@ -409,7 +409,7 @@ pub const DeclState = struct {
409409 .enum_numbered => ty.castTag(.enum_numbered).?.data.values,
410410 else => unreachable,
411411 };
412 for (fields.keys()) |field_name, field_i| {
412 for (fields.keys(), 0..) |field_name, field_i| {
413413 // DW.AT.enumerator
414414 try dbg_info_buffer.ensureUnusedCapacity(field_name.len + 2 + @sizeOf(u64));
415415 dbg_info_buffer.appendAssumeCapacity(@enumToInt(AbbrevKind.enum_variant));
......@@ -2252,14 +2252,14 @@ pub fn writeDbgLineHeader(self: *Dwarf) !void {
22522252 1, // `DW.LNS.set_isa`
22532253 });
22542254
2255 for (paths.dirs) |dir, i| {
2255 for (paths.dirs, 0..) |dir, i| {
22562256 log.debug("adding new include dir at {d} of '{s}'", .{ i + 1, dir });
22572257 di_buf.appendSliceAssumeCapacity(dir);
22582258 di_buf.appendAssumeCapacity(0);
22592259 }
22602260 di_buf.appendAssumeCapacity(0); // include directories sentinel
22612261
2262 for (paths.files) |file, i| {
2262 for (paths.files, 0..) |file, i| {
22632263 const dir_index = paths.files_dirs_indexes[i];
22642264 log.debug("adding new file name at {d} of '{s}' referencing directory {d}", .{ i + 1, file, dir_index + 1 });
22652265 di_buf.appendSliceAssumeCapacity(file);
src/link/Elf.zig+9-9
......@@ -1126,7 +1126,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
11261126 const buf = try gpa.alloc(elf.Elf32_Phdr, self.program_headers.items.len);
11271127 defer gpa.free(buf);
11281128
1129 for (buf) |*phdr, i| {
1129 for (buf, 0..) |*phdr, i| {
11301130 phdr.* = progHeaderTo32(self.program_headers.items[i]);
11311131 if (foreign_endian) {
11321132 mem.byteSwapAllFields(elf.Elf32_Phdr, phdr);
......@@ -1138,7 +1138,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
11381138 const buf = try gpa.alloc(elf.Elf64_Phdr, self.program_headers.items.len);
11391139 defer gpa.free(buf);
11401140
1141 for (buf) |*phdr, i| {
1141 for (buf, 0..) |*phdr, i| {
11421142 phdr.* = self.program_headers.items[i];
11431143 if (foreign_endian) {
11441144 mem.byteSwapAllFields(elf.Elf64_Phdr, phdr);
......@@ -1193,7 +1193,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
11931193 const buf = try gpa.alloc(elf.Elf32_Shdr, slice.len);
11941194 defer gpa.free(buf);
11951195
1196 for (buf) |*shdr, i| {
1196 for (buf, 0..) |*shdr, i| {
11971197 shdr.* = sectHeaderTo32(slice.items(.shdr)[i]);
11981198 log.debug("writing section {?s}: {}", .{ self.shstrtab.get(shdr.sh_name), shdr.* });
11991199 if (foreign_endian) {
......@@ -1207,7 +1207,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
12071207 const buf = try gpa.alloc(elf.Elf64_Shdr, slice.len);
12081208 defer gpa.free(buf);
12091209
1210 for (buf) |*shdr, i| {
1210 for (buf, 0..) |*shdr, i| {
12111211 shdr.* = slice.items(.shdr)[i];
12121212 log.debug("writing section {?s}: {}", .{ self.shstrtab.get(shdr.sh_name), shdr.* });
12131213 if (foreign_endian) {
......@@ -1732,7 +1732,7 @@ fn linkWithLLD(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node) !v
17321732 argv.appendAssumeCapacity("--as-needed");
17331733 var as_needed = true;
17341734
1735 for (system_libs) |link_lib, i| {
1735 for (system_libs, 0..) |link_lib, i| {
17361736 const lib_as_needed = !system_libs_values[i].needed;
17371737 switch ((@as(u2, @boolToInt(lib_as_needed)) << 1) | @boolToInt(as_needed)) {
17381738 0b00, 0b11 => {},
......@@ -2909,7 +2909,7 @@ fn writeAllGlobalSymbols(self: *Elf) !void {
29092909 const buf = try self.base.allocator.alloc(elf.Elf32_Sym, self.global_symbols.items.len);
29102910 defer self.base.allocator.free(buf);
29112911
2912 for (buf) |*sym, i| {
2912 for (buf, 0..) |*sym, i| {
29132913 const global = self.global_symbols.items[i];
29142914 sym.* = .{
29152915 .st_name = global.st_name,
......@@ -2929,7 +2929,7 @@ fn writeAllGlobalSymbols(self: *Elf) !void {
29292929 const buf = try self.base.allocator.alloc(elf.Elf64_Sym, self.global_symbols.items.len);
29302930 defer self.base.allocator.free(buf);
29312931
2932 for (buf) |*sym, i| {
2932 for (buf, 0..) |*sym, i| {
29332933 const global = self.global_symbols.items[i];
29342934 sym.* = .{
29352935 .st_name = global.st_name,
......@@ -3238,11 +3238,11 @@ const CsuObjects = struct {
32383238
32393239fn logSymtab(self: Elf) void {
32403240 log.debug("locals:", .{});
3241 for (self.local_symbols.items) |sym, id| {
3241 for (self.local_symbols.items, 0..) |sym, id| {
32423242 log.debug(" {d}: {?s}: @{x} in {d}", .{ id, self.shstrtab.get(sym.st_name), sym.st_value, sym.st_shndx });
32433243 }
32443244 log.debug("globals:", .{});
3245 for (self.global_symbols.items) |sym, id| {
3245 for (self.global_symbols.items, 0..) |sym, id| {
32463246 log.debug(" {d}: {?s}: @{x} in {d}", .{ id, self.shstrtab.get(sym.st_name), sym.st_value, sym.st_shndx });
32473247 }
32483248}
src/link/MachO.zig+18-18
......@@ -962,7 +962,7 @@ pub fn parseLibs(
962962 syslibroot: ?[]const u8,
963963 dependent_libs: anytype,
964964) !void {
965 for (lib_names) |lib, i| {
965 for (lib_names, 0..) |lib, i| {
966966 const lib_info = lib_infos[i];
967967 log.debug("parsing lib path '{s}'", .{lib});
968968 if (try self.parseDylib(lib, dependent_libs, .{
......@@ -1584,7 +1584,7 @@ pub fn resolveSymbolsInDylibs(self: *MachO) !void {
15841584 const sym = self.getSymbolPtr(global);
15851585 const sym_name = self.getSymbolName(global);
15861586
1587 for (self.dylibs.items) |dylib, id| {
1587 for (self.dylibs.items, 0..) |dylib, id| {
15881588 if (!dylib.symbols.contains(sym_name)) continue;
15891589
15901590 const dylib_id = @intCast(u16, id);
......@@ -1686,7 +1686,7 @@ pub fn resolveDyldStubBinder(self: *MachO) !void {
16861686 gop.value_ptr.* = sym_loc;
16871687 const global = gop.value_ptr.*;
16881688
1689 for (self.dylibs.items) |dylib, id| {
1689 for (self.dylibs.items, 0..) |dylib, id| {
16901690 if (!dylib.symbols.contains(sym_name)) continue;
16911691
16921692 const dylib_id = @intCast(u16, id);
......@@ -2852,7 +2852,7 @@ fn moveSectionInVirtualMemory(self: *MachO, sect_id: u8, needed_size: u64) !void
28522852 });
28532853
28542854 // TODO: enforce order by increasing VM addresses in self.sections container.
2855 for (self.sections.items(.header)[sect_id + 1 ..]) |*next_header, next_sect_id| {
2855 for (self.sections.items(.header)[sect_id + 1 ..], 0..) |*next_header, next_sect_id| {
28562856 const index = @intCast(u8, sect_id + 1 + next_sect_id);
28572857 const next_segment = self.getSegmentPtr(index);
28582858 next_header.addr += diff;
......@@ -3082,7 +3082,7 @@ pub fn initSection(self: *MachO, segname: []const u8, sectname: []const u8, opts
30823082fn insertSection(self: *MachO, segment_index: u8, header: macho.section_64) !u8 {
30833083 const precedence = getSectionPrecedence(header);
30843084 const indexes = self.getSectionIndexes(segment_index);
3085 const insertion_index = for (self.sections.items(.header)[indexes.start..indexes.end]) |hdr, i| {
3085 const insertion_index = for (self.sections.items(.header)[indexes.start..indexes.end], 0..) |hdr, i| {
30863086 if (getSectionPrecedence(hdr) > precedence) break @intCast(u8, i + indexes.start);
30873087 } else indexes.end;
30883088 log.debug("inserting section '{s},{s}' at index {d}", .{
......@@ -3133,7 +3133,7 @@ pub fn getGlobalSymbol(self: *MachO, name: []const u8) !u32 {
31333133}
31343134
31353135fn writeSegmentHeaders(self: *MachO, writer: anytype) !void {
3136 for (self.segments.items) |seg, i| {
3136 for (self.segments.items, 0..) |seg, i| {
31373137 const indexes = self.getSectionIndexes(@intCast(u8, i));
31383138 try writer.writeStruct(seg);
31393139 for (self.sections.items(.header)[indexes.start..indexes.end]) |header| {
......@@ -3147,7 +3147,7 @@ fn writeLinkeditSegmentData(self: *MachO) !void {
31473147 seg.filesize = 0;
31483148 seg.vmsize = 0;
31493149
3150 for (self.segments.items) |segment, id| {
3150 for (self.segments.items, 0..) |segment, id| {
31513151 if (self.linkedit_segment_cmd_index.? == @intCast(u8, id)) continue;
31523152 if (seg.vmaddr < segment.vmaddr + segment.vmsize) {
31533153 seg.vmaddr = mem.alignForwardGeneric(u64, segment.vmaddr + segment.vmsize, self.page_size);
......@@ -3167,7 +3167,7 @@ fn collectRebaseData(self: *MachO, rebase: *Rebase) !void {
31673167 const gpa = self.base.allocator;
31683168 const slice = self.sections.slice();
31693169
3170 for (self.rebases.keys()) |atom_index, i| {
3170 for (self.rebases.keys(), 0..) |atom_index, i| {
31713171 const atom = self.getAtom(atom_index);
31723172 log.debug(" ATOM(%{?d}, '{s}')", .{ atom.getSymbolIndex(), atom.getName(self) });
31733173
......@@ -3197,7 +3197,7 @@ fn collectBindData(self: *MachO, bind: anytype, raw_bindings: anytype) !void {
31973197 const gpa = self.base.allocator;
31983198 const slice = self.sections.slice();
31993199
3200 for (raw_bindings.keys()) |atom_index, i| {
3200 for (raw_bindings.keys(), 0..) |atom_index, i| {
32013201 const atom = self.getAtom(atom_index);
32023202 log.debug(" ATOM(%{?d}, '{s}')", .{ atom.getSymbolIndex(), atom.getName(self) });
32033203
......@@ -3417,7 +3417,7 @@ fn writeSymtab(self: *MachO) !SymtabCtx {
34173417 var locals = std.ArrayList(macho.nlist_64).init(gpa);
34183418 defer locals.deinit();
34193419
3420 for (self.locals.items) |sym, sym_id| {
3420 for (self.locals.items, 0..) |sym, sym_id| {
34213421 if (sym.n_strx == 0) continue; // no name, skip
34223422 const sym_loc = SymbolWithLoc{ .sym_index = @intCast(u32, sym_id), .file = null };
34233423 if (self.symbolIsTemp(sym_loc)) continue; // local temp symbol, skip
......@@ -3736,7 +3736,7 @@ pub fn makeStaticString(bytes: []const u8) [16]u8 {
37363736}
37373737
37383738fn getSegmentByName(self: MachO, segname: []const u8) ?u8 {
3739 for (self.segments.items) |seg, i| {
3739 for (self.segments.items, 0..) |seg, i| {
37403740 if (mem.eql(u8, segname, seg.segName())) return @intCast(u8, i);
37413741 } else return null;
37423742}
......@@ -3758,7 +3758,7 @@ pub fn getLinkeditSegmentPtr(self: *MachO) *macho.segment_command_64 {
37583758
37593759pub fn getSectionByName(self: MachO, segname: []const u8, sectname: []const u8) ?u8 {
37603760 // TODO investigate caching with a hashmap
3761 for (self.sections.items(.header)) |header, i| {
3761 for (self.sections.items(.header), 0..) |header, i| {
37623762 if (mem.eql(u8, header.segName(), segname) and mem.eql(u8, header.sectName(), sectname))
37633763 return @intCast(u8, i);
37643764 } else return null;
......@@ -3766,7 +3766,7 @@ pub fn getSectionByName(self: MachO, segname: []const u8, sectname: []const u8)
37663766
37673767pub fn getSectionIndexes(self: MachO, segment_index: u8) struct { start: u8, end: u8 } {
37683768 var start: u8 = 0;
3769 const nsects = for (self.segments.items) |seg, i| {
3769 const nsects = for (self.segments.items, 0..) |seg, i| {
37703770 if (i == segment_index) break @intCast(u8, seg.nsects);
37713771 start += @intCast(u8, seg.nsects);
37723772 } else 0;
......@@ -4160,7 +4160,7 @@ pub fn findFirst(comptime T: type, haystack: []align(1) const T, start: usize, p
41604160
41614161pub fn logSections(self: *MachO) void {
41624162 log.debug("sections:", .{});
4163 for (self.sections.items(.header)) |header, i| {
4163 for (self.sections.items(.header), 0..) |header, i| {
41644164 log.debug(" sect({d}): {s},{s} @{x}, sizeof({x})", .{
41654165 i + 1,
41664166 header.segName(),
......@@ -4197,7 +4197,7 @@ pub fn logSymtab(self: *MachO) void {
41974197 var buf: [4]u8 = undefined;
41984198
41994199 log.debug("symtab:", .{});
4200 for (self.locals.items) |sym, sym_id| {
4200 for (self.locals.items, 0..) |sym, sym_id| {
42014201 const where = if (sym.undf() and !sym.tentative()) "ord" else "sect";
42024202 const def_index = if (sym.undf() and !sym.tentative())
42034203 @divTrunc(sym.n_desc, macho.N_SYMBOL_RESOLVER)
......@@ -4220,7 +4220,7 @@ pub fn logSymtab(self: *MachO) void {
42204220 }
42214221
42224222 log.debug("GOT entries:", .{});
4223 for (self.got_entries.items) |entry, i| {
4223 for (self.got_entries.items, 0..) |entry, i| {
42244224 const atom_sym = entry.getSymbol(self);
42254225 const target_sym = self.getSymbol(entry.target);
42264226 if (target_sym.undf()) {
......@@ -4241,7 +4241,7 @@ pub fn logSymtab(self: *MachO) void {
42414241 }
42424242
42434243 log.debug("stubs entries:", .{});
4244 for (self.stubs.items) |entry, i| {
4244 for (self.stubs.items, 0..) |entry, i| {
42454245 const target_sym = self.getSymbol(entry.target);
42464246 const atom_sym = entry.getSymbol(self);
42474247 assert(target_sym.undf());
......@@ -4257,7 +4257,7 @@ pub fn logAtoms(self: *MachO) void {
42574257 log.debug("atoms:", .{});
42584258
42594259 const slice = self.sections.slice();
4260 for (slice.items(.last_atom_index)) |last_atom_index, i| {
4260 for (slice.items(.last_atom_index), 0..) |last_atom_index, i| {
42614261 var atom_index = last_atom_index orelse continue;
42624262 const header = slice.items(.header)[i];
42634263
src/link/MachO/DebugSymbols.zig+4-4
......@@ -383,7 +383,7 @@ fn finalizeDwarfSegment(self: *DebugSymbols, macho_file: *MachO) void {
383383fn writeSegmentHeaders(self: *DebugSymbols, macho_file: *MachO, writer: anytype) !void {
384384 // Write segment/section headers from the binary file first.
385385 const end = macho_file.linkedit_segment_cmd_index.?;
386 for (macho_file.segments.items[0..end]) |seg, i| {
386 for (macho_file.segments.items[0..end], 0..) |seg, i| {
387387 const indexes = macho_file.getSectionIndexes(@intCast(u8, i));
388388 var out_seg = seg;
389389 out_seg.fileoff = 0;
......@@ -412,7 +412,7 @@ fn writeSegmentHeaders(self: *DebugSymbols, macho_file: *MachO, writer: anytype)
412412 }
413413 }
414414 // Next, commit DSYM's __LINKEDIT and __DWARF segments headers.
415 for (self.segments.items) |seg, i| {
415 for (self.segments.items, 0..) |seg, i| {
416416 const indexes = self.getSectionIndexes(@intCast(u8, i));
417417 try writer.writeStruct(seg);
418418 for (self.sections.items[indexes.start..indexes.end]) |header| {
......@@ -477,7 +477,7 @@ fn writeSymtab(self: *DebugSymbols, macho_file: *MachO) !void {
477477 var locals = std.ArrayList(macho.nlist_64).init(gpa);
478478 defer locals.deinit();
479479
480 for (macho_file.locals.items) |sym, sym_id| {
480 for (macho_file.locals.items, 0..) |sym, sym_id| {
481481 if (sym.n_strx == 0) continue; // no name, skip
482482 const sym_loc = MachO.SymbolWithLoc{ .sym_index = @intCast(u32, sym_id), .file = null };
483483 if (macho_file.symbolIsTemp(sym_loc)) continue; // local temp symbol, skip
......@@ -547,7 +547,7 @@ fn writeStrtab(self: *DebugSymbols) !void {
547547
548548pub fn getSectionIndexes(self: *DebugSymbols, segment_index: u8) struct { start: u8, end: u8 } {
549549 var start: u8 = 0;
550 const nsects = for (self.segments.items) |seg, i| {
550 const nsects = for (self.segments.items, 0..) |seg, i| {
551551 if (i == segment_index) break @intCast(u8, seg.nsects);
552552 start += @intCast(u8, seg.nsects);
553553 } else 0;
src/link/MachO/Dylib.zig+1-1
......@@ -347,7 +347,7 @@ pub fn parseFromStub(
347347 });
348348 defer matcher.deinit();
349349
350 for (lib_stub.inner) |elem, stub_index| {
350 for (lib_stub.inner, 0..) |elem, stub_index| {
351351 const is_match = switch (elem) {
352352 .v3 => |stub| matcher.matchesArch(stub.archs),
353353 .v4 => |stub| matcher.matchesTarget(stub.targets),
src/link/MachO/Object.zig+7-7
......@@ -201,7 +201,7 @@ pub fn parse(self: *Object, allocator: Allocator, cpu_arch: std.Target.Cpu.Arch)
201201 var sorted_all_syms = try std.ArrayList(SymbolAtIndex).initCapacity(allocator, self.in_symtab.?.len);
202202 defer sorted_all_syms.deinit();
203203
204 for (self.in_symtab.?) |_, index| {
204 for (self.in_symtab.?, 0..) |_, index| {
205205 sorted_all_syms.appendAssumeCapacity(.{ .index = @intCast(u32, index) });
206206 }
207207
......@@ -211,7 +211,7 @@ pub fn parse(self: *Object, allocator: Allocator, cpu_arch: std.Target.Cpu.Arch)
211211 // is kind enough to specify the symbols in the correct order.
212212 sort.sort(SymbolAtIndex, sorted_all_syms.items, self, SymbolAtIndex.lessThan);
213213
214 for (sorted_all_syms.items) |sym_id, i| {
214 for (sorted_all_syms.items, 0..) |sym_id, i| {
215215 const sym = sym_id.getSymbol(self);
216216
217217 if (sym.sect() and self.source_section_index_lookup[sym.n_sect - 1] == -1) {
......@@ -380,7 +380,7 @@ pub fn splitRegularSections(self: *Object, zld: *Zld, object_id: u32) !void {
380380 const gpa = zld.gpa;
381381
382382 const sections = self.getSourceSections();
383 for (sections) |sect, id| {
383 for (sections, 0..) |sect, id| {
384384 if (sect.isDebug()) continue;
385385 const out_sect_id = (try zld.getOutputSection(sect)) orelse {
386386 log.debug(" unhandled section '{s},{s}'", .{ sect.segName(), sect.sectName() });
......@@ -400,7 +400,7 @@ pub fn splitRegularSections(self: *Object, zld: *Zld, object_id: u32) !void {
400400 }
401401
402402 if (self.in_symtab == null) {
403 for (sections) |sect, id| {
403 for (sections, 0..) |sect, id| {
404404 if (sect.isDebug()) continue;
405405 const out_sect_id = (try zld.getOutputSection(sect)) orelse continue;
406406 if (sect.size == 0) continue;
......@@ -446,7 +446,7 @@ pub fn splitRegularSections(self: *Object, zld: *Zld, object_id: u32) !void {
446446 var sorted_sections = try gpa.alloc(SortedSection, sections.len);
447447 defer gpa.free(sorted_sections);
448448
449 for (sections) |sect, id| {
449 for (sections, 0..) |sect, id| {
450450 sorted_sections[id] = .{ .header = sect, .id = @intCast(u8, id) };
451451 }
452452
......@@ -804,7 +804,7 @@ fn parseUnwindInfo(self: *Object, zld: *Zld, object_id: u32) !void {
804804 try self.parseRelocs(gpa, sect_id);
805805 const relocs = self.getRelocs(sect_id);
806806
807 for (unwind_records) |record, record_id| {
807 for (unwind_records, 0..) |record, record_id| {
808808 const offset = record_id * @sizeOf(macho.compact_unwind_entry);
809809 const rel_pos = filterRelocs(
810810 relocs,
......@@ -857,7 +857,7 @@ pub fn getSourceSectionByName(self: Object, segname: []const u8, sectname: []con
857857
858858pub fn getSourceSectionIndexByName(self: Object, segname: []const u8, sectname: []const u8) ?u8 {
859859 const sections = self.getSourceSections();
860 for (sections) |sect, i| {
860 for (sections, 0..) |sect, i| {
861861 if (mem.eql(u8, segname, sect.segName()) and mem.eql(u8, sectname, sect.sectName()))
862862 return @intCast(u8, i);
863863 } else return null;
src/link/MachO/UnwindInfo.zig+8-8
......@@ -126,7 +126,7 @@ const Page = struct {
126126 ctx.page.start + ctx.page.count,
127127 });
128128 try writer.print(" encodings (count = {d})\n", .{ctx.page.page_encodings_count});
129 for (ctx.page.page_encodings[0..ctx.page.page_encodings_count]) |record_id, i| {
129 for (ctx.page.page_encodings[0..ctx.page.page_encodings_count], 0..) |record_id, i| {
130130 const record = ctx.info.records.items[record_id];
131131 const enc = record.compactUnwindEncoding;
132132 try writer.print(" {d}: 0x{x:0>8}\n", .{ ctx.info.common_encodings_count + i, enc });
......@@ -205,7 +205,7 @@ pub fn scanRelocs(zld: *Zld) !void {
205205 if (zld.getSectionByName("__TEXT", "__unwind_info") == null) return;
206206
207207 const cpu_arch = zld.options.target.cpu.arch;
208 for (zld.objects.items) |*object, object_id| {
208 for (zld.objects.items, 0..) |*object, object_id| {
209209 const unwind_records = object.getUnwindRecords();
210210 for (object.exec_atoms.items) |atom_index| {
211211 const record_id = object.unwind_records_lookup.get(atom_index) orelse continue;
......@@ -244,7 +244,7 @@ pub fn collect(info: *UnwindInfo, zld: *Zld) !void {
244244 defer atom_indexes.deinit();
245245
246246 // TODO handle dead stripping
247 for (zld.objects.items) |*object, object_id| {
247 for (zld.objects.items, 0..) |*object, object_id| {
248248 log.debug("collecting unwind records in {s} ({d})", .{ object.name, object_id });
249249 const unwind_records = object.getUnwindRecords();
250250
......@@ -335,7 +335,7 @@ pub fn collect(info: *UnwindInfo, zld: *Zld) !void {
335335 try info.records_lookup.ensureTotalCapacity(info.gpa, @intCast(u32, atom_indexes.items.len));
336336
337337 var maybe_prev: ?macho.compact_unwind_entry = null;
338 for (records.items) |record, i| {
338 for (records.items, 0..) |record, i| {
339339 const record_id = blk: {
340340 if (maybe_prev) |prev| {
341341 const is_dwarf = UnwindEncoding.isDwarf(record.compactUnwindEncoding, cpu_arch);
......@@ -483,7 +483,7 @@ pub fn collect(info: *UnwindInfo, zld: *Zld) !void {
483483
484484 // Save indices of records requiring LSDA relocation
485485 try info.lsdas_lookup.ensureTotalCapacity(info.gpa, @intCast(u32, info.records.items.len));
486 for (info.records.items) |rec, i| {
486 for (info.records.items, 0..) |rec, i| {
487487 info.lsdas_lookup.putAssumeCapacityNoClobber(@intCast(RecordIndex, i), @intCast(u32, info.lsdas.items.len));
488488 if (rec.lsda == 0) continue;
489489 try info.lsdas.append(info.gpa, @intCast(RecordIndex, i));
......@@ -556,7 +556,7 @@ pub fn write(info: *UnwindInfo, zld: *Zld) !void {
556556 const cpu_arch = zld.options.target.cpu.arch;
557557
558558 log.debug("Personalities:", .{});
559 for (info.personalities[0..info.personalities_count]) |target, i| {
559 for (info.personalities[0..info.personalities_count], 0..) |target, i| {
560560 const atom_index = zld.getGotAtomIndexForSymbol(target).?;
561561 const atom = zld.getAtom(atom_index);
562562 const sym = zld.getSymbol(atom.getSymbolWithLoc());
......@@ -581,7 +581,7 @@ pub fn write(info: *UnwindInfo, zld: *Zld) !void {
581581 }
582582 }
583583
584 for (info.records.items) |record, i| {
584 for (info.records.items, 0..) |record, i| {
585585 log.debug("Unwind record at offset 0x{x}", .{i * @sizeOf(macho.compact_unwind_entry)});
586586 log.debug(" start: 0x{x}", .{record.rangeStart});
587587 log.debug(" length: 0x{x}", .{record.rangeLength});
......@@ -621,7 +621,7 @@ pub fn write(info: *UnwindInfo, zld: *Zld) !void {
621621 const pages_base_offset = @intCast(u32, size - (info.pages.items.len * second_level_page_bytes));
622622 const lsda_base_offset = @intCast(u32, pages_base_offset -
623623 (info.lsdas.items.len * @sizeOf(macho.unwind_info_section_header_lsda_index_entry)));
624 for (info.pages.items) |page, i| {
624 for (info.pages.items, 0..) |page, i| {
625625 assert(page.count > 0);
626626 const first_entry = info.records.items[page.start];
627627 try writer.writeStruct(macho.unwind_info_section_header_index_entry{
src/link/MachO/dead_strip.zig+1-1
......@@ -238,7 +238,7 @@ fn mark(zld: *Zld, roots: AtomTable, alive: *AtomTable) !void {
238238 }
239239 }
240240
241 for (zld.objects.items) |_, object_id| {
241 for (zld.objects.items, 0..) |_, object_id| {
242242 // Traverse unwind and eh_frame records noting if the source symbol has been marked, and if so,
243243 // marking all references as live.
244244 try markUnwindRecords(zld, @intCast(u32, object_id), alive);
src/link/MachO/dyld_info/Rebase.zig+1-1
......@@ -45,7 +45,7 @@ pub fn finalize(rebase: *Rebase, gpa: Allocator) !void {
4545
4646 var start: usize = 0;
4747 var seg_id: ?u8 = null;
48 for (rebase.entries.items) |entry, i| {
48 for (rebase.entries.items, 0..) |entry, i| {
4949 if (seg_id != null and seg_id.? == entry.segment_id) continue;
5050 try finalizeSegment(rebase.entries.items[start..i], writer);
5151 seg_id = entry.segment_id;
src/link/MachO/dyld_info/bind.zig+1-1
......@@ -51,7 +51,7 @@ pub fn Bind(comptime Ctx: type, comptime Target: type) type {
5151
5252 var start: usize = 0;
5353 var seg_id: ?u8 = null;
54 for (self.entries.items) |entry, i| {
54 for (self.entries.items, 0..) |entry, i| {
5555 if (seg_id != null and seg_id.? == entry.segment_id) continue;
5656 try finalizeSegment(self.entries.items[start..i], ctx, writer);
5757 seg_id = entry.segment_id;
src/link/MachO/eh_frame.zig+4-4
......@@ -16,7 +16,7 @@ const Zld = @import("zld.zig").Zld;
1616pub fn scanRelocs(zld: *Zld) !void {
1717 const gpa = zld.gpa;
1818
19 for (zld.objects.items) |*object, object_id| {
19 for (zld.objects.items, 0..) |*object, object_id| {
2020 var cies = std.AutoHashMap(u32, void).init(gpa);
2121 defer cies.deinit();
2222
......@@ -108,7 +108,7 @@ pub fn write(zld: *Zld, unwind_info: *UnwindInfo) !void {
108108
109109 var eh_frame_offset: u32 = 0;
110110
111 for (zld.objects.items) |*object, object_id| {
111 for (zld.objects.items, 0..) |*object, object_id| {
112112 try eh_records.ensureUnusedCapacity(2 * @intCast(u32, object.exec_atoms.items.len));
113113
114114 var cies = std.AutoHashMap(u32, u32).init(gpa);
......@@ -407,7 +407,7 @@ pub fn EhFrameRecord(comptime is_mutable: bool) type {
407407 var creader = std.io.countingReader(stream.reader());
408408 const reader = creader.reader();
409409
410 for (aug_str) |ch, i| switch (ch) {
410 for (aug_str, 0..) |ch, i| switch (ch) {
411411 'z' => if (i > 0) {
412412 return error.BadDwarfCfi;
413413 } else {
......@@ -467,7 +467,7 @@ pub fn EhFrameRecord(comptime is_mutable: bool) type {
467467 var creader = std.io.countingReader(stream.reader());
468468 const reader = creader.reader();
469469
470 for (aug_str) |ch, i| switch (ch) {
470 for (aug_str, 0..) |ch, i| switch (ch) {
471471 'z' => if (i > 0) {
472472 return error.BadDwarfCfi;
473473 } else {
src/link/MachO/thunks.zig+1-1
......@@ -329,7 +329,7 @@ fn createThunkAtom(zld: *Zld) !AtomIndex {
329329fn getThunkIndex(zld: *Zld, atom_index: AtomIndex) ?ThunkIndex {
330330 const atom = zld.getAtom(atom_index);
331331 const sym = zld.getSymbol(atom.getSymbolWithLoc());
332 for (zld.thunks.items) |thunk, i| {
332 for (zld.thunks.items, 0..) |thunk, i| {
333333 if (thunk.len == 0) continue;
334334
335335 const thunk_atom_index = thunk.getStartAtomIndex();
src/link/MachO/zld.zig+31-31
......@@ -321,7 +321,7 @@ pub const Zld = struct {
321321 syslibroot: ?[]const u8,
322322 dependent_libs: anytype,
323323 ) !void {
324 for (lib_names) |lib, i| {
324 for (lib_names, 0..) |lib, i| {
325325 const lib_info = lib_infos[i];
326326 log.debug("parsing lib path '{s}'", .{lib});
327327 if (try self.parseDylib(lib, dependent_libs, .{
......@@ -1092,7 +1092,7 @@ pub const Zld = struct {
10921092 const sym = self.getSymbolPtr(global);
10931093 const sym_name = self.getSymbolName(global);
10941094
1095 for (self.dylibs.items) |dylib, id| {
1095 for (self.dylibs.items, 0..) |dylib, id| {
10961096 if (!dylib.symbols.contains(sym_name)) continue;
10971097
10981098 const dylib_id = @intCast(u16, id);
......@@ -1223,7 +1223,7 @@ pub const Zld = struct {
12231223 const global = SymbolWithLoc{ .sym_index = sym_index };
12241224 try self.globals.append(gpa, global);
12251225
1226 for (self.dylibs.items) |dylib, id| {
1226 for (self.dylibs.items, 0..) |dylib, id| {
12271227 if (!dylib.symbols.contains(sym_name)) continue;
12281228
12291229 const dylib_id = @intCast(u16, id);
......@@ -1311,7 +1311,7 @@ pub const Zld = struct {
13111311 });
13121312 }
13131313
1314 for (self.sections.items(.header)) |header, sect_id| {
1314 for (self.sections.items(.header), 0..) |header, sect_id| {
13151315 if (header.size == 0) continue; // empty section
13161316
13171317 const segname = header.segName();
......@@ -1385,7 +1385,7 @@ pub const Zld = struct {
13851385 const gpa = self.gpa;
13861386 const slice = self.sections.slice();
13871387
1388 for (slice.items(.first_atom_index)) |first_atom_index, sect_id| {
1388 for (slice.items(.first_atom_index), 0..) |first_atom_index, sect_id| {
13891389 const header = slice.items(.header)[sect_id];
13901390 var atom_index = first_atom_index;
13911391
......@@ -1525,7 +1525,7 @@ pub const Zld = struct {
15251525
15261526 fn calcSectionSizes(self: *Zld) !void {
15271527 const slice = self.sections.slice();
1528 for (slice.items(.header)) |*header, sect_id| {
1528 for (slice.items(.header), 0..) |*header, sect_id| {
15291529 if (header.size == 0) continue;
15301530 if (self.requiresThunks()) {
15311531 if (header.isCode() and !(header.type() == macho.S_SYMBOL_STUBS) and !mem.eql(u8, header.sectName(), "__stub_helper")) continue;
......@@ -1556,7 +1556,7 @@ pub const Zld = struct {
15561556 }
15571557
15581558 if (self.requiresThunks()) {
1559 for (slice.items(.header)) |header, sect_id| {
1559 for (slice.items(.header), 0..) |header, sect_id| {
15601560 if (!header.isCode()) continue;
15611561 if (header.type() == macho.S_SYMBOL_STUBS) continue;
15621562 if (mem.eql(u8, header.sectName(), "__stub_helper")) continue;
......@@ -1568,7 +1568,7 @@ pub const Zld = struct {
15681568 }
15691569
15701570 fn allocateSegments(self: *Zld) !void {
1571 for (self.segments.items) |*segment, segment_index| {
1571 for (self.segments.items, 0..) |*segment, segment_index| {
15721572 const is_text_segment = mem.eql(u8, segment.segName(), "__TEXT");
15731573 const base_size = if (is_text_segment) try load_commands.calcMinHeaderPad(self.gpa, self.options, .{
15741574 .segments = self.segments.items,
......@@ -1606,7 +1606,7 @@ pub const Zld = struct {
16061606 var start = init_size;
16071607
16081608 const slice = self.sections.slice();
1609 for (slice.items(.header)[indexes.start..indexes.end]) |*header, sect_id| {
1609 for (slice.items(.header)[indexes.start..indexes.end], 0..) |*header, sect_id| {
16101610 const alignment = try math.powi(u32, 2, header.@"align");
16111611 const start_aligned = mem.alignForwardGeneric(u64, start, alignment);
16121612 const n_sect = @intCast(u8, indexes.start + sect_id + 1);
......@@ -1750,7 +1750,7 @@ pub const Zld = struct {
17501750 }
17511751
17521752 fn writeSegmentHeaders(self: *Zld, writer: anytype) !void {
1753 for (self.segments.items) |seg, i| {
1753 for (self.segments.items, 0..) |seg, i| {
17541754 const indexes = self.getSectionIndexes(@intCast(u8, i));
17551755 var out_seg = seg;
17561756 out_seg.cmdsize = @sizeOf(macho.segment_command_64);
......@@ -1852,7 +1852,7 @@ pub const Zld = struct {
18521852 }
18531853
18541854 // Finally, unpack the rest.
1855 for (slice.items(.header)) |header, sect_id| {
1855 for (slice.items(.header), 0..) |header, sect_id| {
18561856 switch (header.type()) {
18571857 macho.S_LITERAL_POINTERS,
18581858 macho.S_REGULAR,
......@@ -1989,7 +1989,7 @@ pub const Zld = struct {
19891989
19901990 // Finally, unpack the rest.
19911991 const slice = self.sections.slice();
1992 for (slice.items(.header)) |header, sect_id| {
1992 for (slice.items(.header), 0..) |header, sect_id| {
19931993 switch (header.type()) {
19941994 macho.S_LITERAL_POINTERS,
19951995 macho.S_REGULAR,
......@@ -2710,7 +2710,7 @@ pub const Zld = struct {
27102710 const amt = try self.file.preadAll(locals_buf, self.symtab_cmd.symoff);
27112711 if (amt != locals_buf.len) return error.InputOutput;
27122712
2713 const istab: usize = for (locals) |local, i| {
2713 const istab: usize = for (locals, 0..) |local, i| {
27142714 if (local.stab()) break i;
27152715 } else locals.len;
27162716 const nstabs = locals.len - istab;
......@@ -2897,7 +2897,7 @@ pub const Zld = struct {
28972897 }
28982898
28992899 fn getSegmentByName(self: Zld, segname: []const u8) ?u8 {
2900 for (self.segments.items) |seg, i| {
2900 for (self.segments.items, 0..) |seg, i| {
29012901 if (mem.eql(u8, segname, seg.segName())) return @intCast(u8, i);
29022902 } else return null;
29032903 }
......@@ -2921,7 +2921,7 @@ pub const Zld = struct {
29212921
29222922 pub fn getSectionByName(self: Zld, segname: []const u8, sectname: []const u8) ?u8 {
29232923 // TODO investigate caching with a hashmap
2924 for (self.sections.items(.header)) |header, i| {
2924 for (self.sections.items(.header), 0..) |header, i| {
29252925 if (mem.eql(u8, header.segName(), segname) and mem.eql(u8, header.sectName(), sectname))
29262926 return @intCast(u8, i);
29272927 } else return null;
......@@ -2929,7 +2929,7 @@ pub const Zld = struct {
29292929
29302930 pub fn getSectionIndexes(self: Zld, segment_index: u8) struct { start: u8, end: u8 } {
29312931 var start: u8 = 0;
2932 const nsects = for (self.segments.items) |seg, i| {
2932 const nsects = for (self.segments.items, 0..) |seg, i| {
29332933 if (i == segment_index) break @intCast(u8, seg.nsects);
29342934 start += @intCast(u8, seg.nsects);
29352935 } else 0;
......@@ -3220,7 +3220,7 @@ pub const Zld = struct {
32203220
32213221 fn logSegments(self: *Zld) void {
32223222 log.debug("segments:", .{});
3223 for (self.segments.items) |segment, i| {
3223 for (self.segments.items, 0..) |segment, i| {
32243224 log.debug(" segment({d}): {s} @{x} ({x}), sizeof({x})", .{
32253225 i,
32263226 segment.segName(),
......@@ -3233,7 +3233,7 @@ pub const Zld = struct {
32333233
32343234 fn logSections(self: *Zld) void {
32353235 log.debug("sections:", .{});
3236 for (self.sections.items(.header)) |header, i| {
3236 for (self.sections.items(.header), 0..) |header, i| {
32373237 log.debug(" sect({d}): {s},{s} @{x} ({x}), sizeof({x})", .{
32383238 i + 1,
32393239 header.segName(),
......@@ -3271,10 +3271,10 @@ pub const Zld = struct {
32713271 const scoped_log = std.log.scoped(.symtab);
32723272
32733273 scoped_log.debug("locals:", .{});
3274 for (self.objects.items) |object, id| {
3274 for (self.objects.items, 0..) |object, id| {
32753275 scoped_log.debug(" object({d}): {s}", .{ id, object.name });
32763276 if (object.in_symtab == null) continue;
3277 for (object.symtab) |sym, sym_id| {
3277 for (object.symtab, 0..) |sym, sym_id| {
32783278 mem.set(u8, &buf, '_');
32793279 scoped_log.debug(" %{d}: {s} @{x} in sect({d}), {s}", .{
32803280 sym_id,
......@@ -3286,7 +3286,7 @@ pub const Zld = struct {
32863286 }
32873287 }
32883288 scoped_log.debug(" object(-1)", .{});
3289 for (self.locals.items) |sym, sym_id| {
3289 for (self.locals.items, 0..) |sym, sym_id| {
32903290 if (sym.undf()) continue;
32913291 scoped_log.debug(" %{d}: {s} @{x} in sect({d}), {s}", .{
32923292 sym_id,
......@@ -3298,7 +3298,7 @@ pub const Zld = struct {
32983298 }
32993299
33003300 scoped_log.debug("exports:", .{});
3301 for (self.globals.items) |global, i| {
3301 for (self.globals.items, 0..) |global, i| {
33023302 const sym = self.getSymbol(global);
33033303 if (sym.undf()) continue;
33043304 if (sym.n_desc == N_DEAD) continue;
......@@ -3313,7 +3313,7 @@ pub const Zld = struct {
33133313 }
33143314
33153315 scoped_log.debug("imports:", .{});
3316 for (self.globals.items) |global, i| {
3316 for (self.globals.items, 0..) |global, i| {
33173317 const sym = self.getSymbol(global);
33183318 if (!sym.undf()) continue;
33193319 if (sym.n_desc == N_DEAD) continue;
......@@ -3328,7 +3328,7 @@ pub const Zld = struct {
33283328 }
33293329
33303330 scoped_log.debug("GOT entries:", .{});
3331 for (self.got_entries.items) |entry, i| {
3331 for (self.got_entries.items, 0..) |entry, i| {
33323332 const atom_sym = entry.getAtomSymbol(self);
33333333 const target_sym = entry.getTargetSymbol(self);
33343334 const target_sym_name = entry.getTargetSymbolName(self);
......@@ -3350,7 +3350,7 @@ pub const Zld = struct {
33503350 }
33513351
33523352 scoped_log.debug("__thread_ptrs entries:", .{});
3353 for (self.tlv_ptr_entries.items) |entry, i| {
3353 for (self.tlv_ptr_entries.items, 0..) |entry, i| {
33543354 const atom_sym = entry.getAtomSymbol(self);
33553355 const target_sym = entry.getTargetSymbol(self);
33563356 const target_sym_name = entry.getTargetSymbolName(self);
......@@ -3363,7 +3363,7 @@ pub const Zld = struct {
33633363 }
33643364
33653365 scoped_log.debug("stubs entries:", .{});
3366 for (self.stubs.items) |entry, i| {
3366 for (self.stubs.items, 0..) |entry, i| {
33673367 const atom_sym = entry.getAtomSymbol(self);
33683368 const target_sym = entry.getTargetSymbol(self);
33693369 const target_sym_name = entry.getTargetSymbolName(self);
......@@ -3376,9 +3376,9 @@ pub const Zld = struct {
33763376 }
33773377
33783378 scoped_log.debug("thunks:", .{});
3379 for (self.thunks.items) |thunk, i| {
3379 for (self.thunks.items, 0..) |thunk, i| {
33803380 scoped_log.debug(" thunk({d})", .{i});
3381 for (thunk.lookup.keys()) |target, j| {
3381 for (thunk.lookup.keys(), 0..) |target, j| {
33823382 const target_sym = self.getSymbol(target);
33833383 const atom = self.getAtom(thunk.lookup.get(target).?);
33843384 const atom_sym = self.getSymbol(atom.getSymbolWithLoc());
......@@ -3395,7 +3395,7 @@ pub const Zld = struct {
33953395 fn logAtoms(self: *Zld) void {
33963396 log.debug("atoms:", .{});
33973397 const slice = self.sections.slice();
3398 for (slice.items(.first_atom_index)) |first_atom_index, sect_id| {
3398 for (slice.items(.first_atom_index), 0..) |first_atom_index, sect_id| {
33993399 var atom_index = first_atom_index;
34003400 if (atom_index == 0) continue;
34013401
......@@ -3980,7 +3980,7 @@ pub fn linkWithZld(macho_file: *MachO, comp: *Compilation, prog_node: *std.Progr
39803980 .unresolved = std.AutoArrayHashMap(u32, void).init(arena),
39813981 };
39823982
3983 for (zld.objects.items) |_, object_id| {
3983 for (zld.objects.items, 0..) |_, object_id| {
39843984 try zld.resolveSymbolsInObject(@intCast(u32, object_id), &resolver);
39853985 }
39863986
......@@ -4010,7 +4010,7 @@ pub fn linkWithZld(macho_file: *MachO, comp: *Compilation, prog_node: *std.Progr
40104010 zld.entry_index = global_index;
40114011 }
40124012
4013 for (zld.objects.items) |*object, object_id| {
4013 for (zld.objects.items, 0..) |*object, object_id| {
40144014 try object.splitIntoAtoms(&zld, @intCast(u32, object_id));
40154015 }
40164016
src/link/SpirV.zig+2-2
......@@ -298,7 +298,7 @@ fn cloneAir(air: Air, gpa: Allocator, air_arena: Allocator) !Air {
298298 const values = try gpa.alloc(Value, air.values.len);
299299 errdefer gpa.free(values);
300300
301 for (values) |*value, i| {
301 for (values, 0..) |*value, i| {
302302 value.* = try air.values[i].copy(air_arena);
303303 }
304304
......@@ -308,7 +308,7 @@ fn cloneAir(air: Air, gpa: Allocator, air_arena: Allocator) !Air {
308308 const air_tags = instructions.items(.tag);
309309 const air_datas = instructions.items(.data);
310310
311 for (air_tags) |tag, i| {
311 for (air_tags, 0..) |tag, i| {
312312 switch (tag) {
313313 .alloc, .ret_ptr, .const_ty => air_datas[i].ty = try air_datas[i].ty.copy(air_arena),
314314 else => {},
src/link/Wasm.zig+10-10
......@@ -590,7 +590,7 @@ fn resolveSymbolsInObject(wasm: *Wasm, object_index: u16) !void {
590590 const object: Object = wasm.objects.items[object_index];
591591 log.debug("Resolving symbols in object: '{s}'", .{object.name});
592592
593 for (object.symtable) |symbol, i| {
593 for (object.symtable, 0..) |symbol, i| {
594594 const sym_index = @intCast(u32, i);
595595 const location: SymbolLoc = .{
596596 .file = object_index,
......@@ -794,7 +794,7 @@ fn validateFeatures(
794794
795795 // extract all the used, disallowed and required features from each
796796 // linked object file so we can test them.
797 for (wasm.objects.items) |object, object_index| {
797 for (wasm.objects.items, 0..) |object, object_index| {
798798 for (object.features) |feature| {
799799 const value = @intCast(u16, object_index) << 1 | @as(u1, 1);
800800 switch (feature.prefix) {
......@@ -815,7 +815,7 @@ fn validateFeatures(
815815 // when we infer the features, we allow each feature found in the 'used' set
816816 // and insert it into the 'allowed' set. When features are not inferred,
817817 // we validate that a used feature is allowed.
818 for (used) |used_set, used_index| {
818 for (used, 0..) |used_set, used_index| {
819819 const is_enabled = @truncate(u1, used_set) != 0;
820820 if (infer) {
821821 allowed[used_index] = is_enabled;
......@@ -849,7 +849,7 @@ fn validateFeatures(
849849 }
850850
851851 // validate the linked object file has each required feature
852 for (required) |required_feature, feature_index| {
852 for (required, 0..) |required_feature, feature_index| {
853853 const is_required = @truncate(u1, required_feature) != 0;
854854 if (is_required and !object_used_features[feature_index]) {
855855 log.err("feature '{s}' is required but not used in linked object", .{(@intToEnum(types.Feature.Tag, feature_index)).toString()});
......@@ -1818,7 +1818,7 @@ fn sortDataSegments(wasm: *Wasm) !void {
18181818/// original functions and their types. We need to know the type to verify it doesn't
18191819/// contain any parameters.
18201820fn setupInitFunctions(wasm: *Wasm) !void {
1821 for (wasm.objects.items) |object, file_index| {
1821 for (wasm.objects.items, 0..) |object, file_index| {
18221822 try wasm.init_funcs.ensureUnusedCapacity(wasm.base.allocator, object.init_funcs.len);
18231823 for (object.init_funcs) |init_func| {
18241824 const symbol = object.symtable[init_func.symbol_index];
......@@ -2717,7 +2717,7 @@ fn linkWithZld(wasm: *Wasm, comp: *Compilation, prog_node: *std.Progress.Node) l
27172717
27182718 try wasm.parseInputFiles(positionals.items);
27192719
2720 for (wasm.objects.items) |_, object_index| {
2720 for (wasm.objects.items, 0..) |_, object_index| {
27212721 try wasm.resolveSymbolsInObject(@intCast(u16, object_index));
27222722 }
27232723
......@@ -2732,7 +2732,7 @@ fn linkWithZld(wasm: *Wasm, comp: *Compilation, prog_node: *std.Progress.Node) l
27322732 try wasm.setupStart();
27332733 try wasm.setupImports();
27342734
2735 for (wasm.objects.items) |*object, object_index| {
2735 for (wasm.objects.items, 0..) |*object, object_index| {
27362736 try object.parseIntoAtoms(gpa, @intCast(u16, object_index), wasm);
27372737 }
27382738
......@@ -2801,7 +2801,7 @@ pub fn flushModule(wasm: *Wasm, comp: *Compilation, prog_node: *std.Progress.Nod
28012801
28022802 try wasm.parseInputFiles(positionals.items);
28032803
2804 for (wasm.objects.items) |_, object_index| {
2804 for (wasm.objects.items, 0..) |_, object_index| {
28052805 try wasm.resolveSymbolsInObject(@intCast(u16, object_index));
28062806 }
28072807
......@@ -2850,7 +2850,7 @@ pub fn flushModule(wasm: *Wasm, comp: *Compilation, prog_node: *std.Progress.Nod
28502850 }
28512851 }
28522852
2853 for (wasm.objects.items) |*object, object_index| {
2853 for (wasm.objects.items, 0..) |*object, object_index| {
28542854 try object.parseIntoAtoms(wasm.base.allocator, @intCast(u16, object_index), wasm);
28552855 }
28562856
......@@ -3362,7 +3362,7 @@ fn emitFeaturesSection(binary_bytes: *std.ArrayList(u8), enabled_features: []con
33623362 try writer.writeAll(target_features);
33633363
33643364 try leb.writeULEB128(writer, features_count);
3365 for (enabled_features) |enabled, feature_index| {
3365 for (enabled_features, 0..) |enabled, feature_index| {
33663366 if (enabled) {
33673367 const feature: types.Feature = .{ .prefix = .used, .tag = @intToEnum(types.Feature.Tag, feature_index) };
33683368 try leb.writeULEB128(writer, @enumToInt(feature.prefix));
src/link/Wasm/Object.zig+2-2
......@@ -882,7 +882,7 @@ pub fn parseIntoAtoms(object: *Object, gpa: Allocator, object_index: u16, wasm_b
882882 list.deinit();
883883 } else symbol_for_segment.deinit();
884884
885 for (object.symtable) |symbol, symbol_index| {
885 for (object.symtable, 0..) |symbol, symbol_index| {
886886 switch (symbol.tag) {
887887 .function, .data, .section => if (!symbol.isUndefined()) {
888888 const gop = try symbol_for_segment.getOrPut(.{ .kind = symbol.tag, .index = symbol.index });
......@@ -896,7 +896,7 @@ pub fn parseIntoAtoms(object: *Object, gpa: Allocator, object_index: u16, wasm_b
896896 }
897897 }
898898
899 for (object.relocatable_data) |relocatable_data, index| {
899 for (object.relocatable_data, 0..) |relocatable_data, index| {
900900 const final_index = (try wasm_bin.getMatchingSegment(object_index, @intCast(u32, index))) orelse {
901901 continue; // found unknown section, so skip parsing into atom as we do not know how to handle it.
902902 };
src/link/tapi.zig+2-2
......@@ -124,7 +124,7 @@ pub const LibStub = struct {
124124 log.debug("trying to parse as []TbdV4", .{});
125125 const inner = lib_stub.yaml.parse([]TbdV4) catch break :err;
126126 var out = try lib_stub.yaml.arena.allocator().alloc(Tbd, inner.len);
127 for (inner) |doc, i| {
127 for (inner, 0..) |doc, i| {
128128 out[i] = .{ .v4 = doc };
129129 }
130130 break :blk out;
......@@ -142,7 +142,7 @@ pub const LibStub = struct {
142142 log.debug("trying to parse as []TbdV3", .{});
143143 const inner = lib_stub.yaml.parse([]TbdV3) catch break :err;
144144 var out = try lib_stub.yaml.arena.allocator().alloc(Tbd, inner.len);
145 for (inner) |doc, i| {
145 for (inner, 0..) |doc, i| {
146146 out[i] = .{ .v3 = doc };
147147 }
148148 break :blk out;
src/link/tapi/yaml.zig+7-7
......@@ -84,7 +84,7 @@ pub const Value = union(ValueType) {
8484
8585 const first = list[0];
8686 if (first.is_compound()) {
87 for (list) |elem, i| {
87 for (list, 0..) |elem, i| {
8888 try writer.writeByteNTimes(' ', args.indentation);
8989 try writer.writeAll("- ");
9090 try elem.stringify(writer, .{
......@@ -99,7 +99,7 @@ pub const Value = union(ValueType) {
9999 }
100100
101101 try writer.writeAll("[ ");
102 for (list) |elem, i| {
102 for (list, 0..) |elem, i| {
103103 try elem.stringify(writer, args);
104104 if (i < len - 1) {
105105 try writer.writeAll(", ");
......@@ -112,7 +112,7 @@ pub const Value = union(ValueType) {
112112 const len = keys.len;
113113 if (len == 0) return;
114114
115 for (keys) |key, i| {
115 for (keys, 0..) |key, i| {
116116 if (!args.should_inline_first_key or i != 0) {
117117 try writer.writeByteNTimes(' ', args.indentation);
118118 }
......@@ -292,7 +292,7 @@ pub const Yaml = struct {
292292 switch (@typeInfo(T)) {
293293 .Array => |info| {
294294 var parsed: T = undefined;
295 for (self.docs.items) |doc, i| {
295 for (self.docs.items, 0..) |doc, i| {
296296 parsed[i] = try self.parseValue(info.child, doc);
297297 }
298298 return parsed;
......@@ -301,7 +301,7 @@ pub const Yaml = struct {
301301 switch (info.size) {
302302 .Slice => {
303303 var parsed = try self.arena.allocator().alloc(info.child, self.docs.items.len);
304 for (self.docs.items) |doc, i| {
304 for (self.docs.items, 0..) |doc, i| {
305305 parsed[i] = try self.parseValue(info.child, doc);
306306 }
307307 return parsed;
......@@ -393,7 +393,7 @@ pub const Yaml = struct {
393393 }
394394
395395 var parsed = try arena.alloc(ptr_info.child, value.list.len);
396 for (value.list) |elem, i| {
396 for (value.list, 0..) |elem, i| {
397397 parsed[i] = try self.parseValue(ptr_info.child, elem);
398398 }
399399 return parsed;
......@@ -407,7 +407,7 @@ pub const Yaml = struct {
407407 if (array_info.len != list.len) return error.ArraySizeMismatch;
408408
409409 var parsed: T = undefined;
410 for (list) |elem, i| {
410 for (list, 0..) |elem, i| {
411411 parsed[i] = try self.parseValue(array_info.child, elem);
412412 }
413413
src/main.zig+3-3
......@@ -3684,10 +3684,10 @@ fn cmdTranslateC(comp: *Compilation, arena: Allocator, enable_cache: bool) !void
36843684 const new_argv_with_sentinel = try arena.alloc(?[*:0]const u8, clang_args_len + 1);
36853685 new_argv_with_sentinel[clang_args_len] = null;
36863686 const new_argv = new_argv_with_sentinel[0..clang_args_len :null];
3687 for (argv.items) |arg, i| {
3687 for (argv.items, 0..) |arg, i| {
36883688 new_argv[i] = try arena.dupeZ(u8, arg);
36893689 }
3690 for (c_source_file.extra_flags) |arg, i| {
3690 for (c_source_file.extra_flags, 0..) |arg, i| {
36913691 new_argv[argv.items.len + i] = try arena.dupeZ(u8, arg);
36923692 }
36933693
......@@ -4816,7 +4816,7 @@ extern "c" fn ZigLlvmAr_main(argc: c_int, argv: [*:null]?[*:0]u8) c_int;
48164816
48174817fn argsCopyZ(alloc: Allocator, args: []const []const u8) ![:null]?[*:0]u8 {
48184818 var argv = try alloc.allocSentinel(?[*:0]u8, args.len, null);
4819 for (args) |arg, i| {
4819 for (args, 0..) |arg, i| {
48204820 argv[i] = try alloc.dupeZ(u8, arg); // TODO If there was an argsAllocZ we could avoid this allocation.
48214821 }
48224822 return argv;
src/mingw.zig+2-2
......@@ -72,7 +72,7 @@ pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile) !void {
7272
7373 .mingw32_lib => {
7474 var c_source_files: [mingw32_lib_deps.len]Compilation.CSourceFile = undefined;
75 for (mingw32_lib_deps) |dep, i| {
75 for (mingw32_lib_deps, 0..) |dep, i| {
7676 var args = std.ArrayList([]const u8).init(arena);
7777 try args.appendSlice(&[_][]const u8{
7878 "-DHAVE_CONFIG_H",
......@@ -236,7 +236,7 @@ pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile) !void {
236236 }),
237237 });
238238 var c_source_files: [uuid_src.len]Compilation.CSourceFile = undefined;
239 for (uuid_src) |dep, i| {
239 for (uuid_src, 0..) |dep, i| {
240240 c_source_files[i] = .{
241241 .src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
242242 "libc", "mingw", "libsrc", dep,
src/objcopy.zig+1-1
......@@ -312,7 +312,7 @@ const BinaryElfOutput = struct {
312312
313313 std.sort.sort(*BinaryElfSegment, self.segments.items, {}, segmentSortCompare);
314314
315 for (self.segments.items) |firstSegment, i| {
315 for (self.segments.items, 0..) |firstSegment, i| {
316316 if (firstSegment.firstSection) |firstSection| {
317317 const diff = firstSection.elfOffset - firstSegment.elfOffset;
318318
src/print_air.zig+8-8
......@@ -68,7 +68,7 @@ const Writer = struct {
6868 indent: usize,
6969
7070 fn writeAllConstants(w: *Writer, s: anytype) @TypeOf(s).Error!void {
71 for (w.air.instructions.items(.tag)) |tag, i| {
71 for (w.air.instructions.items(.tag), 0..) |tag, i| {
7272 const inst = @intCast(u32, i);
7373 switch (tag) {
7474 .constant, .const_ty => {
......@@ -388,7 +388,7 @@ const Writer = struct {
388388
389389 try w.writeType(s, vector_ty);
390390 try s.writeAll(", [");
391 for (elements) |elem, i| {
391 for (elements, 0..) |elem, i| {
392392 if (i != 0) try s.writeAll(", ");
393393 try w.writeOperand(s, inst, i, elem);
394394 }
......@@ -682,7 +682,7 @@ const Writer = struct {
682682 const args = @ptrCast([]const Air.Inst.Ref, w.air.extra[extra.end..][0..extra.data.args_len]);
683683 try w.writeOperand(s, inst, 0, pl_op.operand);
684684 try s.writeAll(", [");
685 for (args) |arg, i| {
685 for (args, 0..) |arg, i| {
686686 if (i != 0) try s.writeAll(", ");
687687 try w.writeOperand(s, inst, 1 + i, arg);
688688 }
......@@ -743,7 +743,7 @@ const Writer = struct {
743743
744744 if (liveness_condbr.then_deaths.len != 0) {
745745 try s.writeByteNTimes(' ', w.indent);
746 for (liveness_condbr.then_deaths) |operand, i| {
746 for (liveness_condbr.then_deaths, 0..) |operand, i| {
747747 if (i != 0) try s.writeAll(" ");
748748 try s.print("%{d}!", .{operand});
749749 }
......@@ -756,7 +756,7 @@ const Writer = struct {
756756
757757 if (liveness_condbr.else_deaths.len != 0) {
758758 try s.writeByteNTimes(' ', w.indent);
759 for (liveness_condbr.else_deaths) |operand, i| {
759 for (liveness_condbr.else_deaths, 0..) |operand, i| {
760760 if (i != 0) try s.writeAll(" ");
761761 try s.print("%{d}!", .{operand});
762762 }
......@@ -790,7 +790,7 @@ const Writer = struct {
790790 extra_index = case.end + case.data.items_len + case_body.len;
791791
792792 try s.writeAll(", [");
793 for (items) |item, item_i| {
793 for (items, 0..) |item, item_i| {
794794 if (item_i != 0) try s.writeAll(", ");
795795 try w.writeInstRef(s, item, false);
796796 }
......@@ -800,7 +800,7 @@ const Writer = struct {
800800 const deaths = liveness.deaths[case_i];
801801 if (deaths.len != 0) {
802802 try s.writeByteNTimes(' ', w.indent);
803 for (deaths) |operand, i| {
803 for (deaths, 0..) |operand, i| {
804804 if (i != 0) try s.writeAll(" ");
805805 try s.print("%{d}!", .{operand});
806806 }
......@@ -821,7 +821,7 @@ const Writer = struct {
821821 const deaths = liveness.deaths[liveness.deaths.len - 1];
822822 if (deaths.len != 0) {
823823 try s.writeByteNTimes(' ', w.indent);
824 for (deaths) |operand, i| {
824 for (deaths, 0..) |operand, i| {
825825 if (i != 0) try s.writeAll(" ");
826826 try s.print("%{d}!", .{operand});
827827 }
src/print_targets.zig+2-2
......@@ -99,7 +99,7 @@ pub fn cmdTargets(
9999 for (arch.allCpuModels()) |model| {
100100 try jws.objectField(model.name);
101101 try jws.beginArray();
102 for (arch.allFeaturesList()) |feature, i| {
102 for (arch.allFeaturesList(), 0..) |feature, i| {
103103 if (model.features.isEnabled(@intCast(u8, i))) {
104104 try jws.arrayElem();
105105 try jws.emitString(feature.name);
......@@ -145,7 +145,7 @@ pub fn cmdTargets(
145145 {
146146 try jws.objectField("features");
147147 try jws.beginArray();
148 for (native_target.cpu.arch.allFeaturesList()) |feature, i_usize| {
148 for (native_target.cpu.arch.allFeaturesList(), 0..) |feature, i_usize| {
149149 const index = @intCast(Target.Cpu.Feature.Set.Index, i_usize);
150150 if (cpu.features.isEnabled(index)) {
151151 try jws.arrayElem();
src/print_zir.zig+23-7
......@@ -296,6 +296,7 @@ const Writer = struct {
296296 .add,
297297 .addwrap,
298298 .add_sat,
299 .add_unsafe,
299300 .array_cat,
300301 .array_mul,
301302 .mul,
......@@ -355,6 +356,8 @@ const Writer = struct {
355356 .array_type,
356357 => try self.writePlNodeBin(stream, inst),
357358
359 .for_len => try self.writePlNodeMultiOp(stream, inst),
360
358361 .elem_ptr_imm => try self.writeElemPtrImm(stream, inst),
359362
360363 .@"export" => try self.writePlNodeExport(stream, inst),
......@@ -868,6 +871,19 @@ const Writer = struct {
868871 try self.writeSrc(stream, inst_data.src());
869872 }
870873
874 fn writePlNodeMultiOp(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
875 const inst_data = self.code.instructions.items(.data)[inst].pl_node;
876 const extra = self.code.extraData(Zir.Inst.MultiOp, inst_data.payload_index);
877 const args = self.code.refSlice(extra.end, extra.data.operands_len);
878 try stream.writeAll("{");
879 for (args, 0..) |arg, i| {
880 if (i != 0) try stream.writeAll(", ");
881 try self.writeInstRef(stream, arg);
882 }
883 try stream.writeAll("}) ");
884 try self.writeSrc(stream, inst_data.src());
885 }
886
871887 fn writeElemPtrImm(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
872888 const inst_data = self.code.instructions.items(.data)[inst].pl_node;
873889 const extra = self.code.extraData(Zir.Inst.ElemPtrImm, inst_data.payload_index).data;
......@@ -1053,7 +1069,7 @@ const Writer = struct {
10531069 const src = LazySrcLoc.nodeOffset(extra.data.src_node);
10541070 const operands = self.code.refSlice(extra.end, extended.small);
10551071
1056 for (operands) |operand, i| {
1072 for (operands, 0..) |operand, i| {
10571073 if (i != 0) try stream.writeAll(", ");
10581074 try self.writeInstRef(stream, operand);
10591075 }
......@@ -1377,7 +1393,7 @@ const Writer = struct {
13771393 try stream.writeAll("{\n");
13781394 self.indent += 2;
13791395
1380 for (fields) |field, i| {
1396 for (fields, 0..) |field, i| {
13811397 try self.writeDocComment(stream, field.doc_comment_index);
13821398 try stream.writeByteNTimes(' ', self.indent);
13831399 try self.writeFlag(stream, "comptime ", field.is_comptime);
......@@ -1944,7 +1960,7 @@ const Writer = struct {
19441960 try stream.writeByteNTimes(' ', self.indent);
19451961 if (is_inline) try stream.writeAll("inline ");
19461962
1947 for (items) |item_ref, item_i| {
1963 for (items, 0..) |item_ref, item_i| {
19481964 if (item_i != 0) try stream.writeAll(", ");
19491965 try self.writeInstRef(stream, item_ref);
19501966 }
......@@ -2260,7 +2276,7 @@ const Writer = struct {
22602276 try self.writeBracedBody(stream, body);
22612277 try stream.writeAll(",[");
22622278 const args = self.code.refSlice(extra.end, extended.small);
2263 for (args) |arg, i| {
2279 for (args, 0..) |arg, i| {
22642280 if (i != 0) try stream.writeAll(", ");
22652281 try self.writeInstRef(stream, arg);
22662282 }
......@@ -2319,7 +2335,7 @@ const Writer = struct {
23192335
23202336 try self.writeInstRef(stream, args[0]);
23212337 try stream.writeAll("{");
2322 for (args[1..]) |arg, i| {
2338 for (args[1..], 0..) |arg, i| {
23232339 if (i != 0) try stream.writeAll(", ");
23242340 try self.writeInstRef(stream, arg);
23252341 }
......@@ -2334,7 +2350,7 @@ const Writer = struct {
23342350 const args = self.code.refSlice(extra.end, extra.data.operands_len);
23352351
23362352 try stream.writeAll("{");
2337 for (args) |arg, i| {
2353 for (args, 0..) |arg, i| {
23382354 if (i != 0) try stream.writeAll(", ");
23392355 try self.writeInstRef(stream, arg);
23402356 }
......@@ -2354,7 +2370,7 @@ const Writer = struct {
23542370 try stream.writeAll(", ");
23552371
23562372 try stream.writeAll(".{");
2357 for (elems) |elem, i| {
2373 for (elems, 0..) |elem, i| {
23582374 if (i != 0) try stream.writeAll(", ");
23592375 try self.writeInstRef(stream, elem);
23602376 }
src/register_manager.zig+3-3
......@@ -82,7 +82,7 @@ pub fn RegisterManager(
8282 comptime registers: []const Register,
8383 reg: Register,
8484 ) ?std.math.IntFittingRange(0, registers.len - 1) {
85 inline for (tracked_registers) |cpreg, i| {
85 inline for (tracked_registers, 0..) |cpreg, i| {
8686 if (reg.id() == cpreg.id()) return i;
8787 }
8888 return null;
......@@ -153,7 +153,7 @@ pub fn RegisterManager(
153153 regs: [count]Register,
154154 ) [count]RegisterLock {
155155 var buf: [count]RegisterLock = undefined;
156 for (regs) |reg, i| {
156 for (regs, 0..) |reg, i| {
157157 buf[i] = self.lockRegAssumeUnused(reg);
158158 }
159159 return buf;
......@@ -207,7 +207,7 @@ pub fn RegisterManager(
207207 }
208208 assert(i == count);
209209
210 for (regs) |reg, j| {
210 for (regs, 0..) |reg, j| {
211211 self.markRegAllocated(reg);
212212
213213 if (insts[j]) |inst| {
src/test.zig+5-5
......@@ -664,7 +664,7 @@ pub const TestContext = struct {
664664 errors: []const []const u8,
665665 ) void {
666666 var array = self.updates.allocator.alloc(ErrorMsg, errors.len) catch @panic("out of memory");
667 for (errors) |err_msg_line, i| {
667 for (errors, 0..) |err_msg_line, i| {
668668 if (std.mem.startsWith(u8, err_msg_line, "error: ")) {
669669 array[i] = .{
670670 .plain = .{
......@@ -1558,7 +1558,7 @@ pub const TestContext = struct {
15581558 });
15591559 defer comp.destroy();
15601560
1561 update: for (case.updates.items) |update, update_index| {
1561 update: for (case.updates.items, 0..) |update, update_index| {
15621562 var update_node = root_node.start(update.name, 3);
15631563 update_node.activate();
15641564 defer update_node.end();
......@@ -1631,7 +1631,7 @@ pub const TestContext = struct {
16311631 defer notes_to_check.deinit();
16321632
16331633 for (actual_errors.list) |actual_error| {
1634 for (case_error_list) |case_msg, i| {
1634 for (case_error_list, 0..) |case_msg, i| {
16351635 if (handled_errors[i]) continue;
16361636
16371637 const ex_tag: std.meta.Tag(@TypeOf(case_msg)) = case_msg;
......@@ -1702,7 +1702,7 @@ pub const TestContext = struct {
17021702 }
17031703 }
17041704 while (notes_to_check.popOrNull()) |note| {
1705 for (case_error_list) |case_msg, i| {
1705 for (case_error_list, 0..) |case_msg, i| {
17061706 const ex_tag: std.meta.Tag(@TypeOf(case_msg)) = case_msg;
17071707 switch (note.*) {
17081708 .src => |actual_msg| {
......@@ -1752,7 +1752,7 @@ pub const TestContext = struct {
17521752 }
17531753 }
17541754
1755 for (handled_errors) |handled, i| {
1755 for (handled_errors, 0..) |handled, i| {
17561756 if (!handled) {
17571757 print(
17581758 "\nExpected error not found:\n{s}\n{}\n{s}",
src/translate_c.zig+7-7
......@@ -1423,7 +1423,7 @@ fn transConvertVectorExpr(
14231423 }
14241424
14251425 const init_list = try c.arena.alloc(Node, num_elements);
1426 for (init_list) |*init, init_index| {
1426 for (init_list, 0..) |*init, init_index| {
14271427 const tmp_decl = block_scope.statements.items[init_index];
14281428 const name = tmp_decl.castTag(.var_simple).?.data.name;
14291429 init.* = try Tag.identifier.create(c.arena, name);
......@@ -1454,7 +1454,7 @@ fn makeShuffleMask(c: *Context, scope: *Scope, expr: *const clang.ShuffleVectorE
14541454
14551455 const init_list = try c.arena.alloc(Node, mask_len);
14561456
1457 for (init_list) |*init, i| {
1457 for (init_list, 0..) |*init, i| {
14581458 const index_expr = try transExprCoercing(c, scope, expr.getExpr(@intCast(c_uint, i + 2)), .used);
14591459 const converted_index = try Tag.helpers_shuffle_vector_index.create(c.arena, .{ .lhs = index_expr, .rhs = vector_len });
14601460 init.* = converted_index;
......@@ -2686,7 +2686,7 @@ fn transInitListExprArray(
26862686 const init_node = if (init_count != 0) blk: {
26872687 const init_list = try c.arena.alloc(Node, init_count);
26882688
2689 for (init_list) |*init, i| {
2689 for (init_list, 0..) |*init, i| {
26902690 const elem_expr = expr.getInit(@intCast(c_uint, i));
26912691 init.* = try transExprCoercing(c, scope, elem_expr, .used);
26922692 }
......@@ -2760,7 +2760,7 @@ fn transInitListExprVector(
27602760 }
27612761
27622762 const init_list = try c.arena.alloc(Node, num_elements);
2763 for (init_list) |*init, init_index| {
2763 for (init_list, 0..) |*init, init_index| {
27642764 if (init_index < init_count) {
27652765 const tmp_decl = block_scope.statements.items[init_index];
27662766 const name = tmp_decl.castTag(.var_simple).?.data.name;
......@@ -4649,7 +4649,7 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: Node, proto_alias:
46494649
46504650 const unwrap_expr = try Tag.unwrap.create(c.arena, init);
46514651 const args = try c.arena.alloc(Node, fn_params.items.len);
4652 for (fn_params.items) |param, i| {
4652 for (fn_params.items, 0..) |param, i| {
46534653 args[i] = try Tag.identifier.create(c.arena, param.name.?);
46544654 }
46554655 const call_expr = try Tag.call.create(c.arena, .{
......@@ -5293,7 +5293,7 @@ const PatternList = struct {
52935293
52945294 fn init(allocator: mem.Allocator) Error!PatternList {
52955295 const patterns = try allocator.alloc(Pattern, templates.len);
5296 for (templates) |template, i| {
5296 for (templates, 0..) |template, i| {
52975297 try patterns[i].init(allocator, template);
52985298 }
52995299 return PatternList{ .patterns = patterns };
......@@ -5778,7 +5778,7 @@ fn parseCNumLit(c: *Context, m: *MacroCtx) ParseError!Node {
57785778
57795779fn zigifyEscapeSequences(ctx: *Context, m: *MacroCtx) ![]const u8 {
57805780 var source = m.slice();
5781 for (source) |c, i| {
5781 for (source, 0..) |c, i| {
57825782 if (c == '\"' or c == '\'') {
57835783 source = source[i..];
57845784 break;
src/translate_c/ast.zig+11-11
......@@ -1765,7 +1765,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
17651765 _ = try c.addToken(.l_brace, "{");
17661766 var cases = try c.gpa.alloc(NodeIndex, payload.cases.len);
17671767 defer c.gpa.free(cases);
1768 for (payload.cases) |case, i| {
1768 for (payload.cases, 0..) |case, i| {
17691769 cases[i] = try renderNode(c, case);
17701770 _ = try c.addToken(.comma, ",");
17711771 }
......@@ -1800,7 +1800,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
18001800 var items = try c.gpa.alloc(NodeIndex, std.math.max(payload.cases.len, 1));
18011801 defer c.gpa.free(items);
18021802 items[0] = 0;
1803 for (payload.cases) |item, i| {
1803 for (payload.cases, 0..) |item, i| {
18041804 if (i != 0) _ = try c.addToken(.comma, ",");
18051805 items[i] = try renderNode(c, item);
18061806 }
......@@ -1950,7 +1950,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
19501950 defer c.gpa.free(inits);
19511951 inits[0] = 0;
19521952 inits[1] = 0;
1953 for (payload) |init, i| {
1953 for (payload, 0..) |init, i| {
19541954 if (i != 0) _ = try c.addToken(.comma, ",");
19551955 inits[i] = try renderNode(c, init);
19561956 }
......@@ -1984,7 +1984,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
19841984 defer c.gpa.free(inits);
19851985 inits[0] = 0;
19861986 inits[1] = 0;
1987 for (payload) |init, i| {
1987 for (payload, 0..) |init, i| {
19881988 _ = try c.addToken(.period, ".");
19891989 _ = try c.addIdentifier(init.name);
19901990 _ = try c.addToken(.equal, "=");
......@@ -2022,7 +2022,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
20222022 var inits = try c.gpa.alloc(NodeIndex, std.math.max(payload.inits.len, 1));
20232023 defer c.gpa.free(inits);
20242024 inits[0] = 0;
2025 for (payload.inits) |init, i| {
2025 for (payload.inits, 0..) |init, i| {
20262026 _ = try c.addToken(.period, ".");
20272027 _ = try c.addIdentifier(init.name);
20282028 _ = try c.addToken(.equal, "=");
......@@ -2080,7 +2080,7 @@ fn renderRecord(c: *Context, node: Node) !NodeIndex {
20802080 members[0] = 0;
20812081 members[1] = 0;
20822082
2083 for (payload.fields) |field, i| {
2083 for (payload.fields, 0..) |field, i| {
20842084 const name_tok = try c.addTokenFmt(.identifier, "{s}", .{std.zig.fmtId(field.name)});
20852085 _ = try c.addToken(.colon, ":");
20862086 const type_expr = try renderNode(c, field.type);
......@@ -2116,10 +2116,10 @@ fn renderRecord(c: *Context, node: Node) !NodeIndex {
21162116 });
21172117 _ = try c.addToken(.comma, ",");
21182118 }
2119 for (payload.variables) |variable, i| {
2119 for (payload.variables, 0..) |variable, i| {
21202120 members[payload.fields.len + i] = try renderNode(c, variable);
21212121 }
2122 for (payload.functions) |function, i| {
2122 for (payload.functions, 0..) |function, i| {
21232123 members[payload.fields.len + num_vars + i] = try renderNode(c, function);
21242124 }
21252125 _ = try c.addToken(.r_brace, "}");
......@@ -2171,7 +2171,7 @@ fn renderArrayInit(c: *Context, lhs: NodeIndex, inits: []const Node) !NodeIndex
21712171 var rendered = try c.gpa.alloc(NodeIndex, std.math.max(inits.len, 1));
21722172 defer c.gpa.free(rendered);
21732173 rendered[0] = 0;
2174 for (inits) |init, i| {
2174 for (inits, 0..) |init, i| {
21752175 rendered[i] = try renderNode(c, init);
21762176 _ = try c.addToken(.comma, ",");
21772177 }
......@@ -2539,7 +2539,7 @@ fn renderCall(c: *Context, lhs: NodeIndex, args: []const Node) !NodeIndex {
25392539 var rendered = try c.gpa.alloc(NodeIndex, args.len);
25402540 defer c.gpa.free(rendered);
25412541
2542 for (args) |arg, i| {
2542 for (args, 0..) |arg, i| {
25432543 if (i != 0) _ = try c.addToken(.comma, ",");
25442544 rendered[i] = try renderNode(c, arg);
25452545 }
......@@ -2879,7 +2879,7 @@ fn renderParams(c: *Context, params: []Payload.Param, is_var_args: bool) !std.Ar
28792879 var rendered = try std.ArrayList(NodeIndex).initCapacity(c.gpa, std.math.max(params.len, 1));
28802880 errdefer rendered.deinit();
28812881
2882 for (params) |param, i| {
2882 for (params, 0..) |param, i| {
28832883 if (i != 0) _ = try c.addToken(.comma, ",");
28842884 if (param.is_noalias) _ = try c.addToken(.keyword_noalias, "noalias");
28852885 if (param.name) |some| {
src/type.zig+45-32
......@@ -628,7 +628,7 @@ pub const Type = extern union {
628628 const a_set = a.errorSetNames();
629629 const b_set = b.errorSetNames();
630630 if (a_set.len != b_set.len) return false;
631 for (a_set) |a_item, i| {
631 for (a_set, 0..) |a_item, i| {
632632 const b_item = b_set[i];
633633 if (!std.mem.eql(u8, a_item, b_item)) return false;
634634 }
......@@ -675,7 +675,7 @@ pub const Type = extern union {
675675 if (a_info.param_types.len != b_info.param_types.len)
676676 return false;
677677
678 for (a_info.param_types) |a_param_ty, i| {
678 for (a_info.param_types, 0..) |a_param_ty, i| {
679679 const b_param_ty = b_info.param_types[i];
680680 if (a_info.comptime_params[i] != b_info.comptime_params[i])
681681 return false;
......@@ -824,12 +824,12 @@ pub const Type = extern union {
824824
825825 if (a_tuple.types.len != b_tuple.types.len) return false;
826826
827 for (a_tuple.types) |a_ty, i| {
827 for (a_tuple.types, 0..) |a_ty, i| {
828828 const b_ty = b_tuple.types[i];
829829 if (!eql(a_ty, b_ty, mod)) return false;
830830 }
831831
832 for (a_tuple.values) |a_val, i| {
832 for (a_tuple.values, 0..) |a_val, i| {
833833 const ty = a_tuple.types[i];
834834 const b_val = b_tuple.values[i];
835835 if (a_val.tag() == .unreachable_value) {
......@@ -855,17 +855,17 @@ pub const Type = extern union {
855855
856856 if (a_struct_obj.types.len != b_struct_obj.types.len) return false;
857857
858 for (a_struct_obj.names) |a_name, i| {
858 for (a_struct_obj.names, 0..) |a_name, i| {
859859 const b_name = b_struct_obj.names[i];
860860 if (!std.mem.eql(u8, a_name, b_name)) return false;
861861 }
862862
863 for (a_struct_obj.types) |a_ty, i| {
863 for (a_struct_obj.types, 0..) |a_ty, i| {
864864 const b_ty = b_struct_obj.types[i];
865865 if (!eql(a_ty, b_ty, mod)) return false;
866866 }
867867
868 for (a_struct_obj.values) |a_val, i| {
868 for (a_struct_obj.values, 0..) |a_val, i| {
869869 const ty = a_struct_obj.types[i];
870870 const b_val = b_struct_obj.values[i];
871871 if (a_val.tag() == .unreachable_value) {
......@@ -1073,7 +1073,7 @@ pub const Type = extern union {
10731073 std.hash.autoHash(hasher, fn_info.noalias_bits);
10741074
10751075 std.hash.autoHash(hasher, fn_info.param_types.len);
1076 for (fn_info.param_types) |param_ty, i| {
1076 for (fn_info.param_types, 0..) |param_ty, i| {
10771077 std.hash.autoHash(hasher, fn_info.paramIsComptime(i));
10781078 if (param_ty.tag() == .generic_poison) continue;
10791079 hashWithHasher(param_ty, hasher, mod);
......@@ -1175,7 +1175,7 @@ pub const Type = extern union {
11751175 const tuple = ty.tupleFields();
11761176 std.hash.autoHash(hasher, tuple.types.len);
11771177
1178 for (tuple.types) |field_ty, i| {
1178 for (tuple.types, 0..) |field_ty, i| {
11791179 hashWithHasher(field_ty, hasher, mod);
11801180 const field_val = tuple.values[i];
11811181 if (field_val.tag() == .unreachable_value) continue;
......@@ -1187,7 +1187,7 @@ pub const Type = extern union {
11871187 std.hash.autoHash(hasher, std.builtin.TypeId.Struct);
11881188 std.hash.autoHash(hasher, struct_obj.types.len);
11891189
1190 for (struct_obj.types) |field_ty, i| {
1190 for (struct_obj.types, 0..) |field_ty, i| {
11911191 const field_name = struct_obj.names[i];
11921192 const field_val = struct_obj.values[i];
11931193 hasher.update(field_name);
......@@ -1403,10 +1403,10 @@ pub const Type = extern union {
14031403 const payload = self.castTag(.tuple).?.data;
14041404 const types = try allocator.alloc(Type, payload.types.len);
14051405 const values = try allocator.alloc(Value, payload.values.len);
1406 for (payload.types) |ty, i| {
1406 for (payload.types, 0..) |ty, i| {
14071407 types[i] = try ty.copy(allocator);
14081408 }
1409 for (payload.values) |val, i| {
1409 for (payload.values, 0..) |val, i| {
14101410 values[i] = try val.copy(allocator);
14111411 }
14121412 return Tag.tuple.create(allocator, .{
......@@ -1419,13 +1419,13 @@ pub const Type = extern union {
14191419 const names = try allocator.alloc([]const u8, payload.names.len);
14201420 const types = try allocator.alloc(Type, payload.types.len);
14211421 const values = try allocator.alloc(Value, payload.values.len);
1422 for (payload.names) |name, i| {
1422 for (payload.names, 0..) |name, i| {
14231423 names[i] = try allocator.dupe(u8, name);
14241424 }
1425 for (payload.types) |ty, i| {
1425 for (payload.types, 0..) |ty, i| {
14261426 types[i] = try ty.copy(allocator);
14271427 }
1428 for (payload.values) |val, i| {
1428 for (payload.values, 0..) |val, i| {
14291429 values[i] = try val.copy(allocator);
14301430 }
14311431 return Tag.anon_struct.create(allocator, .{
......@@ -1437,7 +1437,7 @@ pub const Type = extern union {
14371437 .function => {
14381438 const payload = self.castTag(.function).?.data;
14391439 const param_types = try allocator.alloc(Type, payload.param_types.len);
1440 for (payload.param_types) |param_ty, i| {
1440 for (payload.param_types, 0..) |param_ty, i| {
14411441 param_types[i] = try param_ty.copy(allocator);
14421442 }
14431443 const other_comptime_params = payload.comptime_params[0..payload.param_types.len];
......@@ -1678,7 +1678,7 @@ pub const Type = extern union {
16781678 .function => {
16791679 const payload = ty.castTag(.function).?.data;
16801680 try writer.writeAll("fn(");
1681 for (payload.param_types) |param_type, i| {
1681 for (payload.param_types, 0..) |param_type, i| {
16821682 if (i != 0) try writer.writeAll(", ");
16831683 try param_type.dump("", .{}, writer);
16841684 }
......@@ -1739,7 +1739,7 @@ pub const Type = extern union {
17391739 .tuple => {
17401740 const tuple = ty.castTag(.tuple).?.data;
17411741 try writer.writeAll("tuple{");
1742 for (tuple.types) |field_ty, i| {
1742 for (tuple.types, 0..) |field_ty, i| {
17431743 if (i != 0) try writer.writeAll(", ");
17441744 const val = tuple.values[i];
17451745 if (val.tag() != .unreachable_value) {
......@@ -1756,7 +1756,7 @@ pub const Type = extern union {
17561756 .anon_struct => {
17571757 const anon_struct = ty.castTag(.anon_struct).?.data;
17581758 try writer.writeAll("struct{");
1759 for (anon_struct.types) |field_ty, i| {
1759 for (anon_struct.types, 0..) |field_ty, i| {
17601760 if (i != 0) try writer.writeAll(", ");
17611761 const val = anon_struct.values[i];
17621762 if (val.tag() != .unreachable_value) {
......@@ -1892,7 +1892,7 @@ pub const Type = extern union {
18921892 .error_set => {
18931893 const names = ty.castTag(.error_set).?.data.names.keys();
18941894 try writer.writeAll("error{");
1895 for (names) |name, i| {
1895 for (names, 0..) |name, i| {
18961896 if (i != 0) try writer.writeByte(',');
18971897 try writer.writeAll(name);
18981898 }
......@@ -1908,7 +1908,7 @@ pub const Type = extern union {
19081908 .error_set_merged => {
19091909 const names = ty.castTag(.error_set_merged).?.data.keys();
19101910 try writer.writeAll("error{");
1911 for (names) |name, i| {
1911 for (names, 0..) |name, i| {
19121912 if (i != 0) try writer.writeByte(',');
19131913 try writer.writeAll(name);
19141914 }
......@@ -2063,7 +2063,7 @@ pub const Type = extern union {
20632063 .function => {
20642064 const fn_info = ty.fnInfo();
20652065 try writer.writeAll("fn(");
2066 for (fn_info.param_types) |param_ty, i| {
2066 for (fn_info.param_types, 0..) |param_ty, i| {
20672067 if (i != 0) try writer.writeAll(", ");
20682068 if (fn_info.paramIsComptime(i)) {
20692069 try writer.writeAll("comptime ");
......@@ -2137,7 +2137,7 @@ pub const Type = extern union {
21372137 const tuple = ty.castTag(.tuple).?.data;
21382138
21392139 try writer.writeAll("tuple{");
2140 for (tuple.types) |field_ty, i| {
2140 for (tuple.types, 0..) |field_ty, i| {
21412141 if (i != 0) try writer.writeAll(", ");
21422142 const val = tuple.values[i];
21432143 if (val.tag() != .unreachable_value) {
......@@ -2154,7 +2154,7 @@ pub const Type = extern union {
21542154 const anon_struct = ty.castTag(.anon_struct).?.data;
21552155
21562156 try writer.writeAll("struct{");
2157 for (anon_struct.types) |field_ty, i| {
2157 for (anon_struct.types, 0..) |field_ty, i| {
21582158 if (i != 0) try writer.writeAll(", ");
21592159 const val = anon_struct.values[i];
21602160 if (val.tag() != .unreachable_value) {
......@@ -2253,7 +2253,7 @@ pub const Type = extern union {
22532253 .error_set => {
22542254 const names = ty.castTag(.error_set).?.data.names.keys();
22552255 try writer.writeAll("error{");
2256 for (names) |name, i| {
2256 for (names, 0..) |name, i| {
22572257 if (i != 0) try writer.writeByte(',');
22582258 try writer.writeAll(name);
22592259 }
......@@ -2266,7 +2266,7 @@ pub const Type = extern union {
22662266 .error_set_merged => {
22672267 const names = ty.castTag(.error_set_merged).?.data.keys();
22682268 try writer.writeAll("error{");
2269 for (names) |name, i| {
2269 for (names, 0..) |name, i| {
22702270 if (i != 0) try writer.writeByte(',');
22712271 try writer.writeAll(name);
22722272 }
......@@ -2568,7 +2568,7 @@ pub const Type = extern union {
25682568
25692569 .tuple, .anon_struct => {
25702570 const tuple = ty.tupleFields();
2571 for (tuple.types) |field_ty, i| {
2571 for (tuple.types, 0..) |field_ty, i| {
25722572 const val = tuple.values[i];
25732573 if (val.tag() != .unreachable_value) continue; // comptime field
25742574 if (try field_ty.hasRuntimeBitsAdvanced(ignore_comptime_only, strat)) return true;
......@@ -3125,7 +3125,7 @@ pub const Type = extern union {
31253125 .tuple, .anon_struct => {
31263126 const tuple = ty.tupleFields();
31273127 var big_align: u32 = 0;
3128 for (tuple.types) |field_ty, i| {
3128 for (tuple.types, 0..) |field_ty, i| {
31293129 const val = tuple.values[i];
31303130 if (val.tag() != .unreachable_value) continue; // comptime field
31313131 if (!(field_ty.hasRuntimeBits())) continue;
......@@ -5044,7 +5044,7 @@ pub const Type = extern union {
50445044
50455045 .tuple, .anon_struct => {
50465046 const tuple = ty.tupleFields();
5047 for (tuple.values) |val, i| {
5047 for (tuple.values, 0..) |val, i| {
50485048 const is_comptime = val.tag() != .unreachable_value;
50495049 if (is_comptime) continue;
50505050 if (tuple.types[i].onePossibleValue() != null) continue;
......@@ -5256,7 +5256,7 @@ pub const Type = extern union {
52565256
52575257 .tuple, .anon_struct => {
52585258 const tuple = ty.tupleFields();
5259 for (tuple.types) |field_ty, i| {
5259 for (tuple.types, 0..) |field_ty, i| {
52605260 const have_comptime_val = tuple.values[i].tag() != .unreachable_value;
52615261 if (!have_comptime_val and field_ty.comptimeOnly()) return true;
52625262 }
......@@ -5326,6 +5326,19 @@ pub const Type = extern union {
53265326 };
53275327 }
53285328
5329 pub fn indexableHasLen(ty: Type) bool {
5330 return switch (ty.zigTypeTag()) {
5331 .Array, .Vector => true,
5332 .Pointer => switch (ty.ptrSize()) {
5333 .Many, .C => false,
5334 .Slice => true,
5335 .One => ty.elemType().zigTypeTag() == .Array,
5336 },
5337 .Struct => ty.isTuple(),
5338 else => false,
5339 };
5340 }
5341
53295342 /// Returns null if the type has no namespace.
53305343 pub fn getNamespace(self: Type) ?*Module.Namespace {
53315344 return switch (self.tag()) {
......@@ -5740,7 +5753,7 @@ pub const Type = extern union {
57405753 var bit_offset: u16 = undefined;
57415754 var elem_size_bits: u16 = undefined;
57425755 var running_bits: u16 = 0;
5743 for (struct_obj.fields.values()) |f, i| {
5756 for (struct_obj.fields.values(), 0..) |f, i| {
57445757 if (!f.ty.hasRuntimeBits()) continue;
57455758
57465759 const field_bits = @intCast(u16, f.ty.bitSize(target));
......@@ -5821,7 +5834,7 @@ pub const Type = extern union {
58215834 var offset: u64 = 0;
58225835 var big_align: u32 = 0;
58235836
5824 for (tuple.types) |field_ty, i| {
5837 for (tuple.types, 0..) |field_ty, i| {
58255838 const field_val = tuple.values[i];
58265839 if (field_val.tag() != .unreachable_value or !field_ty.hasRuntimeBits()) {
58275840 // comptime field
src/value.zig+56-56
......@@ -614,7 +614,7 @@ pub const Value = extern union {
614614 .base = payload.base,
615615 .data = try arena.alloc(Value, payload.data.len),
616616 };
617 for (new_payload.data) |*elem, i| {
617 for (new_payload.data, 0..) |*elem, i| {
618618 elem.* = try payload.data[i].copy(arena);
619619 }
620620 return Value{ .ptr_otherwise = &new_payload.base };
......@@ -891,7 +891,7 @@ pub const Value = extern union {
891891 fn arrayToAllocatedBytes(val: Value, len: u64, allocator: Allocator, mod: *Module) ![]u8 {
892892 const result = try allocator.alloc(u8, @intCast(usize, len));
893893 var elem_value_buf: ElemValueBuffer = undefined;
894 for (result) |*elem, i| {
894 for (result, 0..) |*elem, i| {
895895 const elem_val = val.elemValueBuffer(mod, i, &elem_value_buf);
896896 elem.* = @intCast(u8, elem_val.toUnsignedInt(mod.getTarget()));
897897 }
......@@ -1282,7 +1282,7 @@ pub const Value = extern union {
12821282 .int_i64 => @bitCast(u64, int_val.castTag(.int_i64).?.data),
12831283 else => unreachable,
12841284 };
1285 for (buffer[0..byte_count]) |_, i| switch (endian) {
1285 for (buffer[0..byte_count], 0..) |_, i| switch (endian) {
12861286 .Little => buffer[i] = @truncate(u8, (int >> @intCast(u6, (8 * i)))),
12871287 .Big => buffer[byte_count - i - 1] = @truncate(u8, (int >> @intCast(u6, (8 * i)))),
12881288 };
......@@ -1324,7 +1324,7 @@ pub const Value = extern union {
13241324 .Extern => {
13251325 const fields = ty.structFields().values();
13261326 const field_vals = val.castTag(.aggregate).?.data;
1327 for (fields) |field, i| {
1327 for (fields, 0..) |field, i| {
13281328 const off = @intCast(usize, ty.structFieldOffset(i, target));
13291329 writeToMemory(field_vals[i], field.ty, mod, buffer[off..]);
13301330 }
......@@ -1431,7 +1431,7 @@ pub const Value = extern union {
14311431 var bits: u16 = 0;
14321432 const fields = ty.structFields().values();
14331433 const field_vals = val.castTag(.aggregate).?.data;
1434 for (fields) |field, i| {
1434 for (fields, 0..) |field, i| {
14351435 const field_bits = @intCast(u16, field.ty.bitSize(target));
14361436 field_vals[i].writeToPackedMemory(field.ty, mod, buffer, bit_offset + bits);
14371437 bits += field_bits;
......@@ -1529,7 +1529,7 @@ pub const Value = extern union {
15291529 .Extern => {
15301530 const fields = ty.structFields().values();
15311531 const field_vals = try arena.alloc(Value, fields.len);
1532 for (fields) |field, i| {
1532 for (fields, 0..) |field, i| {
15331533 const off = @intCast(usize, ty.structFieldOffset(i, target));
15341534 const sz = @intCast(usize, ty.structFieldType(i).abiSize(target));
15351535 field_vals[i] = try readFromMemory(field.ty, mod, buffer[off..(off + sz)], arena);
......@@ -1617,7 +1617,7 @@ pub const Value = extern union {
16171617
16181618 var bits: u16 = 0;
16191619 const elem_bit_size = @intCast(u16, elem_ty.bitSize(target));
1620 for (elems) |_, i| {
1620 for (elems, 0..) |_, i| {
16211621 // On big-endian systems, LLVM reverses the element order of vectors by default
16221622 const tgt_elem_i = if (endian == .Big) elems.len - i - 1 else i;
16231623 elems[tgt_elem_i] = try readFromPackedMemory(elem_ty, mod, buffer, bit_offset + bits, arena);
......@@ -1632,7 +1632,7 @@ pub const Value = extern union {
16321632 var bits: u16 = 0;
16331633 const fields = ty.structFields().values();
16341634 const field_vals = try arena.alloc(Value, fields.len);
1635 for (fields) |field, i| {
1635 for (fields, 0..) |field, i| {
16361636 const field_bits = @intCast(u16, field.ty.bitSize(target));
16371637 field_vals[i] = try readFromPackedMemory(field.ty, mod, buffer, bit_offset + bits, arena);
16381638 bits += field_bits;
......@@ -2259,7 +2259,7 @@ pub const Value = extern union {
22592259 if (ty.isSimpleTupleOrAnonStruct()) {
22602260 const types = ty.tupleFields().types;
22612261 assert(types.len == a_field_vals.len);
2262 for (types) |field_ty, i| {
2262 for (types, 0..) |field_ty, i| {
22632263 if (!(try eqlAdvanced(a_field_vals[i], field_ty, b_field_vals[i], field_ty, mod, opt_sema))) {
22642264 return false;
22652265 }
......@@ -2270,7 +2270,7 @@ pub const Value = extern union {
22702270 if (ty.zigTypeTag() == .Struct) {
22712271 const fields = ty.structFields().values();
22722272 assert(fields.len == a_field_vals.len);
2273 for (fields) |field, i| {
2273 for (fields, 0..) |field, i| {
22742274 if (!(try eqlAdvanced(a_field_vals[i], field.ty, b_field_vals[i], field.ty, mod, opt_sema))) {
22752275 return false;
22762276 }
......@@ -2279,7 +2279,7 @@ pub const Value = extern union {
22792279 }
22802280
22812281 const elem_ty = ty.childType();
2282 for (a_field_vals) |a_elem, i| {
2282 for (a_field_vals, 0..) |a_elem, i| {
22832283 const b_elem = b_field_vals[i];
22842284
22852285 if (!(try eqlAdvanced(a_elem, elem_ty, b_elem, elem_ty, mod, opt_sema))) {
......@@ -2526,7 +2526,7 @@ pub const Value = extern union {
25262526 .empty_struct_value => {},
25272527 .aggregate => {
25282528 const field_values = val.castTag(.aggregate).?.data;
2529 for (field_values) |field_val, i| {
2529 for (field_values, 0..) |field_val, i| {
25302530 const field_ty = ty.structFieldType(i);
25312531 field_val.hash(field_ty, hasher, mod);
25322532 }
......@@ -3228,7 +3228,7 @@ pub const Value = extern union {
32283228 const target = mod.getTarget();
32293229 if (int_ty.zigTypeTag() == .Vector) {
32303230 const result_data = try arena.alloc(Value, int_ty.vectorLen());
3231 for (result_data) |*scalar, i| {
3231 for (result_data, 0..) |*scalar, i| {
32323232 var buf: Value.ElemValueBuffer = undefined;
32333233 const elem_val = val.elemValueBuffer(mod, i, &buf);
32343234 scalar.* = try intToFloatScalar(elem_val, arena, float_ty.scalarType(), target, opt_sema);
......@@ -3341,7 +3341,7 @@ pub const Value = extern union {
33413341 const target = mod.getTarget();
33423342 if (ty.zigTypeTag() == .Vector) {
33433343 const result_data = try arena.alloc(Value, ty.vectorLen());
3344 for (result_data) |*scalar, i| {
3344 for (result_data, 0..) |*scalar, i| {
33453345 var lhs_buf: Value.ElemValueBuffer = undefined;
33463346 var rhs_buf: Value.ElemValueBuffer = undefined;
33473347 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -3390,7 +3390,7 @@ pub const Value = extern union {
33903390 const target = mod.getTarget();
33913391 if (ty.zigTypeTag() == .Vector) {
33923392 const result_data = try arena.alloc(Value, ty.vectorLen());
3393 for (result_data) |*scalar, i| {
3393 for (result_data, 0..) |*scalar, i| {
33943394 var lhs_buf: Value.ElemValueBuffer = undefined;
33953395 var rhs_buf: Value.ElemValueBuffer = undefined;
33963396 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -3439,7 +3439,7 @@ pub const Value = extern union {
34393439 if (ty.zigTypeTag() == .Vector) {
34403440 const overflowed_data = try arena.alloc(Value, ty.vectorLen());
34413441 const result_data = try arena.alloc(Value, ty.vectorLen());
3442 for (result_data) |*scalar, i| {
3442 for (result_data, 0..) |*scalar, i| {
34433443 var lhs_buf: Value.ElemValueBuffer = undefined;
34443444 var rhs_buf: Value.ElemValueBuffer = undefined;
34453445 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -3501,7 +3501,7 @@ pub const Value = extern union {
35013501 ) !Value {
35023502 if (ty.zigTypeTag() == .Vector) {
35033503 const result_data = try arena.alloc(Value, ty.vectorLen());
3504 for (result_data) |*scalar, i| {
3504 for (result_data, 0..) |*scalar, i| {
35053505 var lhs_buf: Value.ElemValueBuffer = undefined;
35063506 var rhs_buf: Value.ElemValueBuffer = undefined;
35073507 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -3546,7 +3546,7 @@ pub const Value = extern union {
35463546 const target = mod.getTarget();
35473547 if (ty.zigTypeTag() == .Vector) {
35483548 const result_data = try arena.alloc(Value, ty.vectorLen());
3549 for (result_data) |*scalar, i| {
3549 for (result_data, 0..) |*scalar, i| {
35503550 var lhs_buf: Value.ElemValueBuffer = undefined;
35513551 var rhs_buf: Value.ElemValueBuffer = undefined;
35523552 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -3622,7 +3622,7 @@ pub const Value = extern union {
36223622 const target = mod.getTarget();
36233623 if (ty.zigTypeTag() == .Vector) {
36243624 const result_data = try arena.alloc(Value, ty.vectorLen());
3625 for (result_data) |*scalar, i| {
3625 for (result_data, 0..) |*scalar, i| {
36263626 var buf: Value.ElemValueBuffer = undefined;
36273627 const elem_val = val.elemValueBuffer(mod, i, &buf);
36283628 scalar.* = try bitwiseNotScalar(elem_val, ty.scalarType(), arena, target);
......@@ -3661,7 +3661,7 @@ pub const Value = extern union {
36613661 const target = mod.getTarget();
36623662 if (ty.zigTypeTag() == .Vector) {
36633663 const result_data = try allocator.alloc(Value, ty.vectorLen());
3664 for (result_data) |*scalar, i| {
3664 for (result_data, 0..) |*scalar, i| {
36653665 var lhs_buf: Value.ElemValueBuffer = undefined;
36663666 var rhs_buf: Value.ElemValueBuffer = undefined;
36673667 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -3697,7 +3697,7 @@ pub const Value = extern union {
36973697 pub fn bitwiseNand(lhs: Value, rhs: Value, ty: Type, arena: Allocator, mod: *Module) !Value {
36983698 if (ty.zigTypeTag() == .Vector) {
36993699 const result_data = try arena.alloc(Value, ty.vectorLen());
3700 for (result_data) |*scalar, i| {
3700 for (result_data, 0..) |*scalar, i| {
37013701 var lhs_buf: Value.ElemValueBuffer = undefined;
37023702 var rhs_buf: Value.ElemValueBuffer = undefined;
37033703 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -3728,7 +3728,7 @@ pub const Value = extern union {
37283728 const target = mod.getTarget();
37293729 if (ty.zigTypeTag() == .Vector) {
37303730 const result_data = try allocator.alloc(Value, ty.vectorLen());
3731 for (result_data) |*scalar, i| {
3731 for (result_data, 0..) |*scalar, i| {
37323732 var lhs_buf: Value.ElemValueBuffer = undefined;
37333733 var rhs_buf: Value.ElemValueBuffer = undefined;
37343734 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -3764,7 +3764,7 @@ pub const Value = extern union {
37643764 const target = mod.getTarget();
37653765 if (ty.zigTypeTag() == .Vector) {
37663766 const result_data = try allocator.alloc(Value, ty.vectorLen());
3767 for (result_data) |*scalar, i| {
3767 for (result_data, 0..) |*scalar, i| {
37683768 var lhs_buf: Value.ElemValueBuffer = undefined;
37693769 var rhs_buf: Value.ElemValueBuffer = undefined;
37703770 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -3800,7 +3800,7 @@ pub const Value = extern union {
38003800 const target = mod.getTarget();
38013801 if (ty.zigTypeTag() == .Vector) {
38023802 const result_data = try allocator.alloc(Value, ty.vectorLen());
3803 for (result_data) |*scalar, i| {
3803 for (result_data, 0..) |*scalar, i| {
38043804 var lhs_buf: Value.ElemValueBuffer = undefined;
38053805 var rhs_buf: Value.ElemValueBuffer = undefined;
38063806 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -3841,7 +3841,7 @@ pub const Value = extern union {
38413841 const target = mod.getTarget();
38423842 if (ty.zigTypeTag() == .Vector) {
38433843 const result_data = try allocator.alloc(Value, ty.vectorLen());
3844 for (result_data) |*scalar, i| {
3844 for (result_data, 0..) |*scalar, i| {
38453845 var lhs_buf: Value.ElemValueBuffer = undefined;
38463846 var rhs_buf: Value.ElemValueBuffer = undefined;
38473847 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -3882,7 +3882,7 @@ pub const Value = extern union {
38823882 const target = mod.getTarget();
38833883 if (ty.zigTypeTag() == .Vector) {
38843884 const result_data = try allocator.alloc(Value, ty.vectorLen());
3885 for (result_data) |*scalar, i| {
3885 for (result_data, 0..) |*scalar, i| {
38863886 var lhs_buf: Value.ElemValueBuffer = undefined;
38873887 var rhs_buf: Value.ElemValueBuffer = undefined;
38883888 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -3958,7 +3958,7 @@ pub const Value = extern union {
39583958 const target = mod.getTarget();
39593959 if (float_type.zigTypeTag() == .Vector) {
39603960 const result_data = try arena.alloc(Value, float_type.vectorLen());
3961 for (result_data) |*scalar, i| {
3961 for (result_data, 0..) |*scalar, i| {
39623962 var lhs_buf: Value.ElemValueBuffer = undefined;
39633963 var rhs_buf: Value.ElemValueBuffer = undefined;
39643964 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -4005,7 +4005,7 @@ pub const Value = extern union {
40054005 const target = mod.getTarget();
40064006 if (float_type.zigTypeTag() == .Vector) {
40074007 const result_data = try arena.alloc(Value, float_type.vectorLen());
4008 for (result_data) |*scalar, i| {
4008 for (result_data, 0..) |*scalar, i| {
40094009 var lhs_buf: Value.ElemValueBuffer = undefined;
40104010 var rhs_buf: Value.ElemValueBuffer = undefined;
40114011 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -4052,7 +4052,7 @@ pub const Value = extern union {
40524052 const target = mod.getTarget();
40534053 if (ty.zigTypeTag() == .Vector) {
40544054 const result_data = try allocator.alloc(Value, ty.vectorLen());
4055 for (result_data) |*scalar, i| {
4055 for (result_data, 0..) |*scalar, i| {
40564056 var lhs_buf: Value.ElemValueBuffer = undefined;
40574057 var rhs_buf: Value.ElemValueBuffer = undefined;
40584058 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -4089,7 +4089,7 @@ pub const Value = extern union {
40894089 const target = mod.getTarget();
40904090 if (ty.zigTypeTag() == .Vector) {
40914091 const result_data = try allocator.alloc(Value, ty.vectorLen());
4092 for (result_data) |*scalar, i| {
4092 for (result_data, 0..) |*scalar, i| {
40934093 var buf: Value.ElemValueBuffer = undefined;
40944094 const elem_val = val.elemValueBuffer(mod, i, &buf);
40954095 scalar.* = try intTruncScalar(elem_val, allocator, signedness, bits, target);
......@@ -4111,7 +4111,7 @@ pub const Value = extern union {
41114111 const target = mod.getTarget();
41124112 if (ty.zigTypeTag() == .Vector) {
41134113 const result_data = try allocator.alloc(Value, ty.vectorLen());
4114 for (result_data) |*scalar, i| {
4114 for (result_data, 0..) |*scalar, i| {
41154115 var buf: Value.ElemValueBuffer = undefined;
41164116 const elem_val = val.elemValueBuffer(mod, i, &buf);
41174117 var bits_buf: Value.ElemValueBuffer = undefined;
......@@ -4143,7 +4143,7 @@ pub const Value = extern union {
41434143 const target = mod.getTarget();
41444144 if (ty.zigTypeTag() == .Vector) {
41454145 const result_data = try allocator.alloc(Value, ty.vectorLen());
4146 for (result_data) |*scalar, i| {
4146 for (result_data, 0..) |*scalar, i| {
41474147 var lhs_buf: Value.ElemValueBuffer = undefined;
41484148 var rhs_buf: Value.ElemValueBuffer = undefined;
41494149 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -4185,7 +4185,7 @@ pub const Value = extern union {
41854185 if (ty.zigTypeTag() == .Vector) {
41864186 const overflowed_data = try allocator.alloc(Value, ty.vectorLen());
41874187 const result_data = try allocator.alloc(Value, ty.vectorLen());
4188 for (result_data) |*scalar, i| {
4188 for (result_data, 0..) |*scalar, i| {
41894189 var lhs_buf: Value.ElemValueBuffer = undefined;
41904190 var rhs_buf: Value.ElemValueBuffer = undefined;
41914191 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -4243,7 +4243,7 @@ pub const Value = extern union {
42434243 const target = mod.getTarget();
42444244 if (ty.zigTypeTag() == .Vector) {
42454245 const result_data = try arena.alloc(Value, ty.vectorLen());
4246 for (result_data) |*scalar, i| {
4246 for (result_data, 0..) |*scalar, i| {
42474247 var lhs_buf: Value.ElemValueBuffer = undefined;
42484248 var rhs_buf: Value.ElemValueBuffer = undefined;
42494249 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -4291,7 +4291,7 @@ pub const Value = extern union {
42914291 ) !Value {
42924292 if (ty.zigTypeTag() == .Vector) {
42934293 const result_data = try arena.alloc(Value, ty.vectorLen());
4294 for (result_data) |*scalar, i| {
4294 for (result_data, 0..) |*scalar, i| {
42954295 var lhs_buf: Value.ElemValueBuffer = undefined;
42964296 var rhs_buf: Value.ElemValueBuffer = undefined;
42974297 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -4320,7 +4320,7 @@ pub const Value = extern union {
43204320 const target = mod.getTarget();
43214321 if (ty.zigTypeTag() == .Vector) {
43224322 const result_data = try allocator.alloc(Value, ty.vectorLen());
4323 for (result_data) |*scalar, i| {
4323 for (result_data, 0..) |*scalar, i| {
43244324 var lhs_buf: Value.ElemValueBuffer = undefined;
43254325 var rhs_buf: Value.ElemValueBuffer = undefined;
43264326 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -4372,7 +4372,7 @@ pub const Value = extern union {
43724372 const target = mod.getTarget();
43734373 if (float_type.zigTypeTag() == .Vector) {
43744374 const result_data = try arena.alloc(Value, float_type.vectorLen());
4375 for (result_data) |*scalar, i| {
4375 for (result_data, 0..) |*scalar, i| {
43764376 var buf: Value.ElemValueBuffer = undefined;
43774377 const elem_val = val.elemValueBuffer(mod, i, &buf);
43784378 scalar.* = try floatNegScalar(elem_val, float_type.scalarType(), arena, target);
......@@ -4408,7 +4408,7 @@ pub const Value = extern union {
44084408 const target = mod.getTarget();
44094409 if (float_type.zigTypeTag() == .Vector) {
44104410 const result_data = try arena.alloc(Value, float_type.vectorLen());
4411 for (result_data) |*scalar, i| {
4411 for (result_data, 0..) |*scalar, i| {
44124412 var lhs_buf: Value.ElemValueBuffer = undefined;
44134413 var rhs_buf: Value.ElemValueBuffer = undefined;
44144414 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -4467,7 +4467,7 @@ pub const Value = extern union {
44674467 const target = mod.getTarget();
44684468 if (float_type.zigTypeTag() == .Vector) {
44694469 const result_data = try arena.alloc(Value, float_type.vectorLen());
4470 for (result_data) |*scalar, i| {
4470 for (result_data, 0..) |*scalar, i| {
44714471 var lhs_buf: Value.ElemValueBuffer = undefined;
44724472 var rhs_buf: Value.ElemValueBuffer = undefined;
44734473 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -4526,7 +4526,7 @@ pub const Value = extern union {
45264526 const target = mod.getTarget();
45274527 if (float_type.zigTypeTag() == .Vector) {
45284528 const result_data = try arena.alloc(Value, float_type.vectorLen());
4529 for (result_data) |*scalar, i| {
4529 for (result_data, 0..) |*scalar, i| {
45304530 var lhs_buf: Value.ElemValueBuffer = undefined;
45314531 var rhs_buf: Value.ElemValueBuffer = undefined;
45324532 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -4585,7 +4585,7 @@ pub const Value = extern union {
45854585 const target = mod.getTarget();
45864586 if (float_type.zigTypeTag() == .Vector) {
45874587 const result_data = try arena.alloc(Value, float_type.vectorLen());
4588 for (result_data) |*scalar, i| {
4588 for (result_data, 0..) |*scalar, i| {
45894589 var lhs_buf: Value.ElemValueBuffer = undefined;
45904590 var rhs_buf: Value.ElemValueBuffer = undefined;
45914591 const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf);
......@@ -4638,7 +4638,7 @@ pub const Value = extern union {
46384638 const target = mod.getTarget();
46394639 if (float_type.zigTypeTag() == .Vector) {
46404640 const result_data = try arena.alloc(Value, float_type.vectorLen());
4641 for (result_data) |*scalar, i| {
4641 for (result_data, 0..) |*scalar, i| {
46424642 var buf: Value.ElemValueBuffer = undefined;
46434643 const elem_val = val.elemValueBuffer(mod, i, &buf);
46444644 scalar.* = try sqrtScalar(elem_val, float_type.scalarType(), arena, target);
......@@ -4678,7 +4678,7 @@ pub const Value = extern union {
46784678 const target = mod.getTarget();
46794679 if (float_type.zigTypeTag() == .Vector) {
46804680 const result_data = try arena.alloc(Value, float_type.vectorLen());
4681 for (result_data) |*scalar, i| {
4681 for (result_data, 0..) |*scalar, i| {
46824682 var buf: Value.ElemValueBuffer = undefined;
46834683 const elem_val = val.elemValueBuffer(mod, i, &buf);
46844684 scalar.* = try sinScalar(elem_val, float_type.scalarType(), arena, target);
......@@ -4718,7 +4718,7 @@ pub const Value = extern union {
47184718 const target = mod.getTarget();
47194719 if (float_type.zigTypeTag() == .Vector) {
47204720 const result_data = try arena.alloc(Value, float_type.vectorLen());
4721 for (result_data) |*scalar, i| {
4721 for (result_data, 0..) |*scalar, i| {
47224722 var buf: Value.ElemValueBuffer = undefined;
47234723 const elem_val = val.elemValueBuffer(mod, i, &buf);
47244724 scalar.* = try cosScalar(elem_val, float_type.scalarType(), arena, target);
......@@ -4758,7 +4758,7 @@ pub const Value = extern union {
47584758 const target = mod.getTarget();
47594759 if (float_type.zigTypeTag() == .Vector) {
47604760 const result_data = try arena.alloc(Value, float_type.vectorLen());
4761 for (result_data) |*scalar, i| {
4761 for (result_data, 0..) |*scalar, i| {
47624762 var buf: Value.ElemValueBuffer = undefined;
47634763 const elem_val = val.elemValueBuffer(mod, i, &buf);
47644764 scalar.* = try tanScalar(elem_val, float_type.scalarType(), arena, target);
......@@ -4798,7 +4798,7 @@ pub const Value = extern union {
47984798 const target = mod.getTarget();
47994799 if (float_type.zigTypeTag() == .Vector) {
48004800 const result_data = try arena.alloc(Value, float_type.vectorLen());
4801 for (result_data) |*scalar, i| {
4801 for (result_data, 0..) |*scalar, i| {
48024802 var buf: Value.ElemValueBuffer = undefined;
48034803 const elem_val = val.elemValueBuffer(mod, i, &buf);
48044804 scalar.* = try expScalar(elem_val, float_type.scalarType(), arena, target);
......@@ -4838,7 +4838,7 @@ pub const Value = extern union {
48384838 const target = mod.getTarget();
48394839 if (float_type.zigTypeTag() == .Vector) {
48404840 const result_data = try arena.alloc(Value, float_type.vectorLen());
4841 for (result_data) |*scalar, i| {
4841 for (result_data, 0..) |*scalar, i| {
48424842 var buf: Value.ElemValueBuffer = undefined;
48434843 const elem_val = val.elemValueBuffer(mod, i, &buf);
48444844 scalar.* = try exp2Scalar(elem_val, float_type.scalarType(), arena, target);
......@@ -4878,7 +4878,7 @@ pub const Value = extern union {
48784878 const target = mod.getTarget();
48794879 if (float_type.zigTypeTag() == .Vector) {
48804880 const result_data = try arena.alloc(Value, float_type.vectorLen());
4881 for (result_data) |*scalar, i| {
4881 for (result_data, 0..) |*scalar, i| {
48824882 var buf: Value.ElemValueBuffer = undefined;
48834883 const elem_val = val.elemValueBuffer(mod, i, &buf);
48844884 scalar.* = try logScalar(elem_val, float_type.scalarType(), arena, target);
......@@ -4918,7 +4918,7 @@ pub const Value = extern union {
49184918 const target = mod.getTarget();
49194919 if (float_type.zigTypeTag() == .Vector) {
49204920 const result_data = try arena.alloc(Value, float_type.vectorLen());
4921 for (result_data) |*scalar, i| {
4921 for (result_data, 0..) |*scalar, i| {
49224922 var buf: Value.ElemValueBuffer = undefined;
49234923 const elem_val = val.elemValueBuffer(mod, i, &buf);
49244924 scalar.* = try log2Scalar(elem_val, float_type.scalarType(), arena, target);
......@@ -4958,7 +4958,7 @@ pub const Value = extern union {
49584958 const target = mod.getTarget();
49594959 if (float_type.zigTypeTag() == .Vector) {
49604960 const result_data = try arena.alloc(Value, float_type.vectorLen());
4961 for (result_data) |*scalar, i| {
4961 for (result_data, 0..) |*scalar, i| {
49624962 var buf: Value.ElemValueBuffer = undefined;
49634963 const elem_val = val.elemValueBuffer(mod, i, &buf);
49644964 scalar.* = try log10Scalar(elem_val, float_type.scalarType(), arena, target);
......@@ -4998,7 +4998,7 @@ pub const Value = extern union {
49984998 const target = mod.getTarget();
49994999 if (float_type.zigTypeTag() == .Vector) {
50005000 const result_data = try arena.alloc(Value, float_type.vectorLen());
5001 for (result_data) |*scalar, i| {
5001 for (result_data, 0..) |*scalar, i| {
50025002 var buf: Value.ElemValueBuffer = undefined;
50035003 const elem_val = val.elemValueBuffer(mod, i, &buf);
50045004 scalar.* = try fabsScalar(elem_val, float_type.scalarType(), arena, target);
......@@ -5038,7 +5038,7 @@ pub const Value = extern union {
50385038 const target = mod.getTarget();
50395039 if (float_type.zigTypeTag() == .Vector) {
50405040 const result_data = try arena.alloc(Value, float_type.vectorLen());
5041 for (result_data) |*scalar, i| {
5041 for (result_data, 0..) |*scalar, i| {
50425042 var buf: Value.ElemValueBuffer = undefined;
50435043 const elem_val = val.elemValueBuffer(mod, i, &buf);
50445044 scalar.* = try floorScalar(elem_val, float_type.scalarType(), arena, target);
......@@ -5078,7 +5078,7 @@ pub const Value = extern union {
50785078 const target = mod.getTarget();
50795079 if (float_type.zigTypeTag() == .Vector) {
50805080 const result_data = try arena.alloc(Value, float_type.vectorLen());
5081 for (result_data) |*scalar, i| {
5081 for (result_data, 0..) |*scalar, i| {
50825082 var buf: Value.ElemValueBuffer = undefined;
50835083 const elem_val = val.elemValueBuffer(mod, i, &buf);
50845084 scalar.* = try ceilScalar(elem_val, float_type.scalarType(), arena, target);
......@@ -5118,7 +5118,7 @@ pub const Value = extern union {
51185118 const target = mod.getTarget();
51195119 if (float_type.zigTypeTag() == .Vector) {
51205120 const result_data = try arena.alloc(Value, float_type.vectorLen());
5121 for (result_data) |*scalar, i| {
5121 for (result_data, 0..) |*scalar, i| {
51225122 var buf: Value.ElemValueBuffer = undefined;
51235123 const elem_val = val.elemValueBuffer(mod, i, &buf);
51245124 scalar.* = try roundScalar(elem_val, float_type.scalarType(), arena, target);
......@@ -5158,7 +5158,7 @@ pub const Value = extern union {
51585158 const target = mod.getTarget();
51595159 if (float_type.zigTypeTag() == .Vector) {
51605160 const result_data = try arena.alloc(Value, float_type.vectorLen());
5161 for (result_data) |*scalar, i| {
5161 for (result_data, 0..) |*scalar, i| {
51625162 var buf: Value.ElemValueBuffer = undefined;
51635163 const elem_val = val.elemValueBuffer(mod, i, &buf);
51645164 scalar.* = try truncScalar(elem_val, float_type.scalarType(), arena, target);
......@@ -5205,7 +5205,7 @@ pub const Value = extern union {
52055205 const target = mod.getTarget();
52065206 if (float_type.zigTypeTag() == .Vector) {
52075207 const result_data = try arena.alloc(Value, float_type.vectorLen());
5208 for (result_data) |*scalar, i| {
5208 for (result_data, 0..) |*scalar, i| {
52095209 var mulend1_buf: Value.ElemValueBuffer = undefined;
52105210 const mulend1_elem = mulend1.elemValueBuffer(mod, i, &mulend1_buf);
52115211 var mulend2_buf: Value.ElemValueBuffer = undefined;
stage1/zig1.wasm
Binary files a/stage1/zig1.wasm and b/stage1/zig1.wasm differ
test/behavior/array.zig+1-1
......@@ -185,7 +185,7 @@ test "nested arrays of strings" {
185185 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
186186
187187 const array_of_strings = [_][]const u8{ "hello", "this", "is", "my", "thing" };
188 for (array_of_strings) |s, i| {
188 for (array_of_strings, 0..) |s, i| {
189189 if (i == 0) try expect(mem.eql(u8, s, "hello"));
190190 if (i == 1) try expect(mem.eql(u8, s, "this"));
191191 if (i == 2) try expect(mem.eql(u8, s, "is"));
test/behavior/bit_shifting.zig+2-2
......@@ -84,14 +84,14 @@ fn testShardedTable(comptime Key: type, comptime mask_bit_count: comptime_int, c
8484
8585 var table = Table.create();
8686 var node_buffer: [node_count]Table.Node = undefined;
87 for (node_buffer) |*node, i| {
87 for (&node_buffer, 0..) |*node, i| {
8888 const key = @intCast(Key, i);
8989 try expect(table.get(key) == null);
9090 node.init(key, {});
9191 table.put(node);
9292 }
9393
94 for (node_buffer) |*node, i| {
94 for (&node_buffer, 0..) |*node, i| {
9595 try expect(table.get(@intCast(Key, i)) == node);
9696 }
9797}
test/behavior/bugs/1607.zig+1-1
......@@ -5,7 +5,7 @@ const builtin = @import("builtin");
55const a = [_]u8{ 1, 2, 3 };
66
77fn checkAddress(s: []const u8) !void {
8 for (s) |*i, j| {
8 for (s, 0..) |*i, j| {
99 try testing.expect(i == &a[j]);
1010 }
1111}
test/behavior/bugs/920.zig+3-3
......@@ -23,13 +23,13 @@ fn ZigTableGen(comptime is_symmetric: bool, comptime r: f64, comptime v: f64, co
2323 tables.x[0] = v / f(r);
2424 tables.x[1] = r;
2525
26 for (tables.x[2..256]) |*entry, i| {
26 for (tables.x[2..256], 0..) |*entry, i| {
2727 const last = tables.x[2 + i - 1];
2828 entry.* = f_inv(v / last + f(last));
2929 }
3030 tables.x[256] = 0;
3131
32 for (tables.f[0..]) |*entry, i| {
32 for (tables.f[0..], 0..) |*entry, i| {
3333 entry.* = f(tables.x[i]);
3434 }
3535
......@@ -67,7 +67,7 @@ test "bug 920 fixed" {
6767 break :blk ZigTableGen(true, norm_r, norm_v, norm_f, norm_f_inv, norm_zero_case);
6868 };
6969
70 for (NormalDist1.f) |_, i| {
70 for (NormalDist1.f, 0..) |_, i| {
7171 // Here we use `expectApproxEqAbs` instead of `expectEqual` to account for the small
7272 // differences in math functions of different libcs. For example, if the compiler
7373 // links against glibc, but the target is musl libc, then these values might be
test/behavior/call.zig+1-1
......@@ -364,7 +364,7 @@ test "Enum constructed by @Type passed as generic argument" {
364364 try expect(@enumToInt(a) == b);
365365 }
366366 };
367 inline for (@typeInfo(S.E).Enum.fields) |_, i| {
367 inline for (@typeInfo(S.E).Enum.fields, 0..) |_, i| {
368368 try S.foo(@intToEnum(S.E, i), i);
369369 }
370370}
test/behavior/const_slice_child.zig+2-2
......@@ -26,7 +26,7 @@ fn foo(args: [][]const u8) !void {
2626fn bar(argc: usize) !void {
2727 var args_buffer: [10][]const u8 = undefined;
2828 const args = args_buffer[0..argc];
29 for (args) |_, i| {
29 for (args, 0..) |_, i| {
3030 const ptr = argv[i];
3131 args[i] = ptr[0..strlen(ptr)];
3232 }
......@@ -41,7 +41,7 @@ fn strlen(ptr: [*]const u8) usize {
4141
4242fn streql(a: []const u8, b: []const u8) bool {
4343 if (a.len != b.len) return false;
44 for (a) |item, index| {
44 for (a, 0..) |item, index| {
4545 if (b[index] != item) return false;
4646 }
4747 return true;
test/behavior/eval.zig+3-3
......@@ -317,7 +317,7 @@ test "create global array with for loop" {
317317
318318const global_array = x: {
319319 var result: [10]usize = undefined;
320 for (result) |*item, index| {
320 for (&result, 0..) |*item, index| {
321321 item.* = index * index;
322322 }
323323 break :x result;
......@@ -447,7 +447,7 @@ test "binary math operator in partially inlined function" {
447447 var s: [4]u32 = undefined;
448448 var b: [16]u8 = undefined;
449449
450 for (b) |*r, i|
450 for (&b, 0..) |*r, i|
451451 r.* = @intCast(u8, i + 1);
452452
453453 copyWithPartialInline(s[0..], b[0..]);
......@@ -915,7 +915,7 @@ test "comptime pointer load through elem_ptr" {
915915
916916 comptime {
917917 var array: [10]S = undefined;
918 for (array) |*elem, i| {
918 for (&array, 0..) |*elem, i| {
919919 elem.* = .{
920920 .x = i,
921921 };
test/behavior/fn.zig+1-1
......@@ -311,7 +311,7 @@ test "function pointers" {
311311 &fn3,
312312 &fn4,
313313 };
314 for (fns) |f, i| {
314 for (fns, 0..) |f, i| {
315315 try expect(f() == @intCast(u32, i) + 5);
316316 }
317317}
test/behavior/for.zig+220-10
......@@ -55,9 +55,9 @@ fn testContinueOuter() !void {
5555}
5656
5757test "ignore lval with underscore (for loop)" {
58 for ([_]void{}) |_, i| {
58 for ([_]void{}, 0..) |_, i| {
5959 _ = i;
60 for ([_]void{}) |_, j| {
60 for ([_]void{}, 0..) |_, j| {
6161 _ = j;
6262 break;
6363 }
......@@ -81,7 +81,7 @@ test "basic for loop" {
8181 buffer[buf_index] = item;
8282 buf_index += 1;
8383 }
84 for (array) |item, index| {
84 for (array, 0..) |item, index| {
8585 _ = item;
8686 buffer[buf_index] = @intCast(u8, index);
8787 buf_index += 1;
......@@ -91,7 +91,7 @@ test "basic for loop" {
9191 buffer[buf_index] = item;
9292 buf_index += 1;
9393 }
94 for (array_ptr) |item, index| {
94 for (array_ptr, 0..) |item, index| {
9595 _ = item;
9696 buffer[buf_index] = @intCast(u8, index);
9797 buf_index += 1;
......@@ -101,7 +101,7 @@ test "basic for loop" {
101101 buffer[buf_index] = item;
102102 buf_index += 1;
103103 }
104 for (unknown_size) |_, index| {
104 for (unknown_size, 0..) |_, index| {
105105 buffer[buf_index] = @intCast(u8, index);
106106 buf_index += 1;
107107 }
......@@ -163,11 +163,11 @@ test "for loop with pointer elem var" {
163163 mangleString(target[0..]);
164164 try expect(mem.eql(u8, &target, "bcdefgh"));
165165
166 for (source) |*c, i| {
166 for (source, 0..) |*c, i| {
167167 _ = i;
168168 try expect(@TypeOf(c) == *const u8);
169169 }
170 for (target) |*c, i| {
170 for (&target, 0..) |*c, i| {
171171 _ = i;
172172 try expect(@TypeOf(c) == *u8);
173173 }
......@@ -186,7 +186,7 @@ test "for copies its payload" {
186186 const S = struct {
187187 fn doTheTest() !void {
188188 var x = [_]usize{ 1, 2, 3 };
189 for (x) |value, i| {
189 for (x, 0..) |value, i| {
190190 // Modify the original array
191191 x[i] += 99;
192192 try expect(value == i + 1);
......@@ -206,8 +206,8 @@ test "for on slice with allowzero ptr" {
206206 const S = struct {
207207 fn doTheTest(slice: []const u8) !void {
208208 var ptr = @ptrCast([*]allowzero const u8, slice.ptr)[0..slice.len];
209 for (ptr) |x, i| try expect(x == i + 1);
210 for (ptr) |*x, i| try expect(x.* == i + 1);
209 for (ptr, 0..) |x, i| try expect(x == i + 1);
210 for (ptr, 0..) |*x, i| try expect(x.* == i + 1);
211211 }
212212 };
213213 try S.doTheTest(&[_]u8{ 1, 2, 3, 4 });
......@@ -249,3 +249,213 @@ test "for loop with else branch" {
249249 try expect(q == 4);
250250 }
251251}
252
253test "count over fixed range" {
254 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
255 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
256 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
257
258 var sum: usize = 0;
259 for (0..6) |i| {
260 sum += i;
261 }
262
263 try expect(sum == 15);
264}
265
266test "two counters" {
267 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
268 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
269 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
270
271 var sum: usize = 0;
272 for (0..10, 10..20) |i, j| {
273 sum += 1;
274 try expect(i + 10 == j);
275 }
276
277 try expect(sum == 10);
278}
279
280test "1-based counter and ptr to array" {
281 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
282 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
283 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
284
285 var ok: usize = 0;
286
287 for (1..6, "hello") |i, b| {
288 if (i == 1) {
289 try expect(b == 'h');
290 ok += 1;
291 }
292 if (i == 2) {
293 try expect(b == 'e');
294 ok += 1;
295 }
296 if (i == 3) {
297 try expect(b == 'l');
298 ok += 1;
299 }
300 if (i == 4) {
301 try expect(b == 'l');
302 ok += 1;
303 }
304 if (i == 5) {
305 try expect(b == 'o');
306 ok += 1;
307 }
308 }
309
310 try expect(ok == 5);
311}
312
313test "slice and two counters, one is offset and one is runtime" {
314 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
315 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
316 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
317 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
318
319 const slice: []const u8 = "blah";
320 var start: usize = 0;
321
322 for (slice, start..4, 1..5) |a, b, c| {
323 if (a == 'b') {
324 try expect(b == 0);
325 try expect(c == 1);
326 }
327 if (a == 'l') {
328 try expect(b == 1);
329 try expect(c == 2);
330 }
331 if (a == 'a') {
332 try expect(b == 2);
333 try expect(c == 3);
334 }
335 if (a == 'h') {
336 try expect(b == 3);
337 try expect(c == 4);
338 }
339 }
340}
341
342test "two slices, one captured by-ref" {
343 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
344 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
345 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
346 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
347
348 var buf: [10]u8 = undefined;
349 const slice1: []const u8 = "blah";
350 const slice2: []u8 = buf[0..4];
351
352 for (slice1, slice2) |a, *b| {
353 b.* = a;
354 }
355
356 try expect(slice2[0] == 'b');
357 try expect(slice2[1] == 'l');
358 try expect(slice2[2] == 'a');
359 try expect(slice2[3] == 'h');
360}
361
362test "raw pointer and slice" {
363 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
364 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
365 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
366 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
367
368 var buf: [10]u8 = undefined;
369 const slice: []const u8 = "blah";
370 const ptr: [*]u8 = buf[0..4];
371
372 for (ptr, slice) |*a, b| {
373 a.* = b;
374 }
375
376 try expect(buf[0] == 'b');
377 try expect(buf[1] == 'l');
378 try expect(buf[2] == 'a');
379 try expect(buf[3] == 'h');
380}
381
382test "raw pointer and counter" {
383 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
384 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
385 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
386 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
387
388 var buf: [10]u8 = undefined;
389 const ptr: [*]u8 = &buf;
390
391 for (ptr, 0..4) |*a, b| {
392 a.* = @intCast(u8, 'A' + b);
393 }
394
395 try expect(buf[0] == 'A');
396 try expect(buf[1] == 'B');
397 try expect(buf[2] == 'C');
398 try expect(buf[3] == 'D');
399}
400
401test "inline for with slice as the comptime-known" {
402 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
403 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
404 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
405 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
406
407 const comptime_slice = "hello";
408 var runtime_i: usize = 3;
409
410 const S = struct {
411 var ok: usize = 0;
412 fn check(comptime a: u8, b: usize) !void {
413 if (a == 'l') {
414 try expect(b == 3);
415 ok += 1;
416 } else if (a == 'o') {
417 try expect(b == 4);
418 ok += 1;
419 } else {
420 @compileError("fail");
421 }
422 }
423 };
424
425 inline for (comptime_slice[3..5], runtime_i..5) |a, b| {
426 try S.check(a, b);
427 }
428
429 try expect(S.ok == 2);
430}
431
432test "inline for with counter as the comptime-known" {
433 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
434 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
435 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
436 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
437
438 var runtime_slice = "hello";
439 var runtime_i: usize = 3;
440
441 const S = struct {
442 var ok: usize = 0;
443 fn check(a: u8, comptime b: usize) !void {
444 if (b == 3) {
445 try expect(a == 'l');
446 ok += 1;
447 } else if (b == 4) {
448 try expect(a == 'o');
449 ok += 1;
450 } else {
451 @compileError("fail");
452 }
453 }
454 };
455
456 inline for (runtime_slice[runtime_i..5], 3..5) |a, b| {
457 try S.check(a, b);
458 }
459
460 try expect(S.ok == 2);
461}
test/behavior/generics.zig+1-1
......@@ -325,7 +325,7 @@ test "generic function instantiation non-duplicates" {
325325 const S = struct {
326326 fn copy(comptime T: type, dest: []T, source: []const T) void {
327327 @export(foo, .{ .name = "test_generic_instantiation_non_dupe" });
328 for (source) |s, i| dest[i] = s;
328 for (source, 0..) |s, i| dest[i] = s;
329329 }
330330
331331 fn foo() callconv(.C) void {}
test/behavior/lower_strlit_to_vector.zig+1-1
......@@ -12,7 +12,7 @@ test "strlit to vector" {
1212 const strlit = "0123456789abcdef0123456789ABCDEF";
1313 const vec_from_strlit: @Vector(32, u8) = strlit.*;
1414 const arr_from_vec = @as([32]u8, vec_from_strlit);
15 for (strlit) |c, i|
15 for (strlit, 0..) |c, i|
1616 try std.testing.expect(c == arr_from_vec[i]);
1717 try std.testing.expectEqualSlices(u8, strlit, &arr_from_vec);
1818}
test/behavior/math.zig+1-1
......@@ -1221,7 +1221,7 @@ test "quad hex float literal parsing accurate" {
12211221 0xb6a0000000000000,
12221222 };
12231223
1224 for (exp2ft) |x, i| {
1224 for (exp2ft, 0..) |x, i| {
12251225 try expect(@bitCast(u64, x) == answers[i]);
12261226 }
12271227 }
test/behavior/slice.zig+2-2
......@@ -99,7 +99,7 @@ test "comptime slice of slice preserves comptime var" {
9999test "slice of type" {
100100 comptime {
101101 var types_array = [_]type{ i32, f64, type };
102 for (types_array) |T, i| {
102 for (types_array, 0..) |T, i| {
103103 switch (i) {
104104 0 => try expect(T == i32),
105105 1 => try expect(T == f64),
......@@ -107,7 +107,7 @@ test "slice of type" {
107107 else => unreachable,
108108 }
109109 }
110 for (types_array[0..]) |T, i| {
110 for (types_array[0..], 0..) |T, i| {
111111 switch (i) {
112112 0 => try expect(T == i32),
113113 1 => try expect(T == f64),
test/behavior/tuple.zig+1-1
......@@ -40,7 +40,7 @@ test "tuple multiplication" {
4040 {
4141 const t = .{ 1, 2, 3 } ** 4;
4242 try expect(@typeInfo(@TypeOf(t)).Struct.fields.len == 12);
43 inline for (t) |x, i| try expect(x == 1 + i % 3);
43 inline for (t, 0..) |x, i| try expect(x == 1 + i % 3);
4444 }
4545 }
4646 };
test/behavior/vector.zig+11-11
......@@ -456,20 +456,20 @@ test "vector division operators" {
456456 fn doTheTestDiv(comptime T: type, x: @Vector(4, T), y: @Vector(4, T)) !void {
457457 if (!comptime std.meta.trait.isSignedInt(T)) {
458458 const d0 = x / y;
459 for (@as([4]T, d0)) |v, i| {
459 for (@as([4]T, d0), 0..) |v, i| {
460460 try expect(x[i] / y[i] == v);
461461 }
462462 }
463463 const d1 = @divExact(x, y);
464 for (@as([4]T, d1)) |v, i| {
464 for (@as([4]T, d1), 0..) |v, i| {
465465 try expect(@divExact(x[i], y[i]) == v);
466466 }
467467 const d2 = @divFloor(x, y);
468 for (@as([4]T, d2)) |v, i| {
468 for (@as([4]T, d2), 0..) |v, i| {
469469 try expect(@divFloor(x[i], y[i]) == v);
470470 }
471471 const d3 = @divTrunc(x, y);
472 for (@as([4]T, d3)) |v, i| {
472 for (@as([4]T, d3), 0..) |v, i| {
473473 try expect(@divTrunc(x[i], y[i]) == v);
474474 }
475475 }
......@@ -477,16 +477,16 @@ test "vector division operators" {
477477 fn doTheTestMod(comptime T: type, x: @Vector(4, T), y: @Vector(4, T)) !void {
478478 if ((!comptime std.meta.trait.isSignedInt(T)) and @typeInfo(T) != .Float) {
479479 const r0 = x % y;
480 for (@as([4]T, r0)) |v, i| {
480 for (@as([4]T, r0), 0..) |v, i| {
481481 try expect(x[i] % y[i] == v);
482482 }
483483 }
484484 const r1 = @mod(x, y);
485 for (@as([4]T, r1)) |v, i| {
485 for (@as([4]T, r1), 0..) |v, i| {
486486 try expect(@mod(x[i], y[i]) == v);
487487 }
488488 const r2 = @rem(x, y);
489 for (@as([4]T, r2)) |v, i| {
489 for (@as([4]T, r2), 0..) |v, i| {
490490 try expect(@rem(x[i], y[i]) == v);
491491 }
492492 }
......@@ -538,7 +538,7 @@ test "vector bitwise not operator" {
538538 const S = struct {
539539 fn doTheTestNot(comptime T: type, x: @Vector(4, T)) !void {
540540 var y = ~x;
541 for (@as([4]T, y)) |v, i| {
541 for (@as([4]T, y), 0..) |v, i| {
542542 try expect(~x[i] == v);
543543 }
544544 }
......@@ -577,11 +577,11 @@ test "vector shift operators" {
577577 var yv = @as(@Vector(N, TY), y);
578578
579579 var z0 = xv >> yv;
580 for (@as([N]TX, z0)) |v, i| {
580 for (@as([N]TX, z0), 0..) |v, i| {
581581 try expect(x[i] >> y[i] == v);
582582 }
583583 var z1 = xv << yv;
584 for (@as([N]TX, z1)) |v, i| {
584 for (@as([N]TX, z1), 0..) |v, i| {
585585 try expect(x[i] << y[i] == v);
586586 }
587587 }
......@@ -594,7 +594,7 @@ test "vector shift operators" {
594594 var yv = @as(@Vector(N, TY), y);
595595
596596 var z = if (dir == .Left) @shlExact(xv, yv) else @shrExact(xv, yv);
597 for (@as([N]TX, z)) |v, i| {
597 for (@as([N]TX, z), 0..) |v, i| {
598598 const check = if (dir == .Left) x[i] << y[i] else x[i] >> y[i];
599599 try expect(check == v);
600600 }
test/behavior/void.zig+1-1
......@@ -22,7 +22,7 @@ test "iterate over a void slice" {
2222 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2323
2424 var j: usize = 0;
25 for (times(10)) |_, i| {
25 for (times(10), 0..) |_, i| {
2626 try expect(i == j);
2727 j += 1;
2828 }
test/cases/compile_errors/for.zig created+40
......@@ -0,0 +1,40 @@
1export fn a() void {
2 for (0..10, 10..21) |i, j| {
3 _ = i; _ = j;
4 }
5}
6export fn b() void {
7 const s1 = "hello";
8 const s2 = true;
9 for (s1, s2) |i, j| {
10 _ = i; _ = j;
11 }
12}
13export fn c() void {
14 var buf: [10]u8 = undefined;
15 for (buf) |*byte| {
16 _ = byte;
17 }
18}
19export fn d() void {
20 const x: [*]const u8 = "hello";
21 const y: [*]const u8 = "world";
22 for (x, 0.., y) |x1, x2, x3| {
23 _ = x1; _ = x2; _ = x3;
24 }
25}
26
27// error
28// backend=stage2
29// target=native
30//
31// :2:5: error: non-matching for loop lengths
32// :2:11: note: length 10 here
33// :2:19: note: length 11 here
34// :9:14: error: type 'bool' does not support indexing
35// :9:14: note: for loop operand must be an array, slice, tuple, or vector
36// :15:16: error: pointer capture of non pointer type '[10]u8'
37// :15:10: note: consider using '&' here
38// :22:5: error: unbounded for loop
39// :22:10: note: type '[*]const u8' has no upper bound
40// :22:18: note: type '[*]const u8' has no upper bound
test/cases/compile_errors/for_discard_unbounded.zig created+10
......@@ -0,0 +1,10 @@
1export fn a() void {
2 for (0..10, 10..) |i, _| {
3 _ = i;
4 }
5}
6// error
7// backend=stage2
8// target=native
9//
10// :2:27: error: discard of unbounded counter
test/cases/compile_errors/for_empty.zig created+11
......@@ -0,0 +1,11 @@
1export fn b() void {
2 for () |i| {
3 _ = i;
4 }
5}
6
7// error
8// backend=stage2
9// target=native
10//
11// :2:10: error: expected expression, found ')'
test/cases/compile_errors/for_extra_capture.zig created+12
......@@ -0,0 +1,12 @@
1export fn b() void {
2 for (0..10) |i, j| {
3 _ = i; _ = j;
4 }
5}
6
7// error
8// backend=stage2
9// target=native
10//
11// :2:21: error: extra capture in for loop
12// :2:21: note: run 'zig fmt' to upgrade your code automatically
test/cases/compile_errors/for_extra_condition.zig created+11
......@@ -0,0 +1,11 @@
1export fn a() void {
2 for (0..10, 10..20) |i| {
3 _ = i;
4 }
5}
6
7// error
8// backend=stage2
9// target=native
10//
11// :2:19: error: for input is not captured
test/cases/compile_errors/for_unbounded.zig created+11
......@@ -0,0 +1,11 @@
1export fn b() void {
2 for (0..) |i| {
3 _ = i;
4 }
5}
6
7// error
8// backend=stage2
9// target=native
10//
11// :2:5: error: unbounded for loop
test/cases/compile_errors/invalid_pointer_for_var_type.zig+1-1
......@@ -1,7 +1,7 @@
11extern fn ext() usize;
22var bytes: [ext()]u8 = undefined;
33export fn f() void {
4 for (bytes) |*b, i| {
4 for (&bytes, 0..) |*b, i| {
55 b.* = @as(u8, i);
66 }
77}
test/cases/compile_errors/underscore_should_not_be_usable_inside_for.zig+2-2
......@@ -1,6 +1,6 @@
11export fn returns() void {
2 for ([_]void{}) |_, i| {
3 for ([_]void{}) |_, j| {
2 for ([_]void{}, 0..) |_, i| {
3 for ([_]void{}, 0..) |_, j| {
44 return _;
55 }
66 }
test/cases/llvm/for_loop.zig+1-1
......@@ -11,6 +11,6 @@ pub fn main() void {
1111}
1212
1313// run
14// backend=stage2,llvm
14// backend=llvm
1515// target=x86_64-linux,x86_64-macos
1616//
test/cases/safety/for_len_mismatch.zig created+24
......@@ -0,0 +1,24 @@
1const std = @import("std");
2
3pub fn panic(message: []const u8, stack_trace: ?*std.builtin.StackTrace, _: ?usize) noreturn {
4 _ = stack_trace;
5 if (std.mem.eql(u8, message, "for loop over objects with non-equal lengths")) {
6 std.process.exit(0);
7 }
8 std.process.exit(1);
9}
10
11pub fn main() !void {
12 var runtime_i: usize = 1;
13 var j: usize = 3;
14 var slice = "too long";
15 for (runtime_i..j, slice) |a, b| {
16 _ = a;
17 _ = b;
18 return error.TestFailed;
19 }
20 return error.TestFailed;
21}
22// run
23// backend=llvm
24// target=native
test/cases/safety/for_len_mismatch_three.zig created+24
......@@ -0,0 +1,24 @@
1const std = @import("std");
2
3pub fn panic(message: []const u8, stack_trace: ?*std.builtin.StackTrace, _: ?usize) noreturn {
4 _ = stack_trace;
5 if (std.mem.eql(u8, message, "for loop over objects with non-equal lengths")) {
6 std.process.exit(0);
7 }
8 std.process.exit(1);
9}
10
11pub fn main() !void {
12 var slice: []const u8 = "hello";
13 for (10..20, slice, 20..30) |a, b, c| {
14 _ = a;
15 _ = b;
16 _ = c;
17 return error.TestFailed;
18 }
19 return error.TestFailed;
20}
21// run
22// backend=llvm
23// target=native
24
test/cases/variable_shadowing.3.zig+2-2
......@@ -1,10 +1,10 @@
11pub fn main() void {
22 var i = 0;
3 for ("n") |_, i| {
3 for ("n", 0..) |_, i| {
44 }
55}
66
77// error
88//
9// :3:19: error: loop index capture 'i' shadows local variable from outer scope
9// :3:24: error: capture 'i' shadows local variable from outer scope
1010// :2:9: note: previous declaration here
test/compare_output.zig+1-1
......@@ -196,7 +196,7 @@ pub fn addCases(cases: *tests.CompareOutputContext) void {
196196 \\
197197 \\ c.qsort(@ptrCast(?*anyopaque, &array), @intCast(c_ulong, array.len), @sizeOf(i32), compare_fn);
198198 \\
199 \\ for (array) |item, i| {
199 \\ for (array, 0..) |item, i| {
200200 \\ if (item != i) {
201201 \\ c.abort();
202202 \\ }
test/standalone/brace_expansion/main.zig+2-2
......@@ -29,7 +29,7 @@ fn tokenize(input: []const u8) !ArrayList(Token) {
2929 var tok_begin: usize = undefined;
3030 var state = State.Start;
3131
32 for (input) |b, i| {
32 for (input, 0..) |b, i| {
3333 switch (state) {
3434 .Start => switch (b) {
3535 'a'...'z', 'A'...'Z' => {
......@@ -159,7 +159,7 @@ fn expandString(input: []const u8, output: *ArrayList(u8)) !void {
159159 try expandNode(root, &result_list);
160160
161161 try output.resize(0);
162 for (result_list.items) |buf, i| {
162 for (result_list.items, 0..) |buf, i| {
163163 if (i != 0) {
164164 try output.append(' ');
165165 }
test/tests.zig+9-9
......@@ -58,14 +58,14 @@ const test_targets = blk: {
5858 .link_libc = true,
5959 .backend = .stage2_c,
6060 },
61 .{
62 .target = .{
63 .cpu_arch = .x86_64,
64 .os_tag = .linux,
65 .abi = .none,
66 },
67 .backend = .stage2_x86_64,
68 },
61 //.{
62 // .target = .{
63 // .cpu_arch = .x86_64,
64 // .os_tag = .linux,
65 // .abi = .none,
66 // },
67 // .backend = .stage2_x86_64,
68 //},
6969 .{
7070 .target = .{
7171 .cpu_arch = .aarch64,
......@@ -958,7 +958,7 @@ pub const StackTracesContext = struct {
958958 // locate delims/anchor
959959 const delims = [_][]const u8{ ":", ":", ":", " in ", "(", ")" };
960960 var marks = [_]usize{0} ** delims.len;
961 for (delims) |delim, i| {
961 for (delims, 0..) |delim, i| {
962962 marks[i] = mem.indexOfPos(u8, line, pos, delim) orelse {
963963 // unexpected pattern: emit raw line and cont
964964 try buf.appendSlice(line);
tools/gen_spirv_spec.zig+9-9
......@@ -251,7 +251,7 @@ fn renderEnumerant(writer: anytype, enumerant: g.Enumerant) !void {
251251 .int => |int| try writer.print("{}", .{int}),
252252 }
253253 try writer.writeAll(", .parameters = &[_]OperandKind{");
254 for (enumerant.parameters) |param, i| {
254 for (enumerant.parameters, 0..) |param, i| {
255255 if (i != 0)
256256 try writer.writeAll(", ");
257257 // Note, param.quantifier will always be one.
......@@ -272,7 +272,7 @@ fn renderOpcodes(
272272 var aliases = std.ArrayList(struct { inst: usize, alias: usize }).init(allocator);
273273 try aliases.ensureTotalCapacity(instructions.len);
274274
275 for (instructions) |inst, i| {
275 for (instructions, 0..) |inst, i| {
276276 if (std.mem.eql(u8, inst.class.?, "@exclude")) {
277277 continue;
278278 }
......@@ -397,7 +397,7 @@ fn renderValueEnum(
397397 var aliases = std.ArrayList(struct { enumerant: usize, alias: usize }).init(allocator);
398398 try aliases.ensureTotalCapacity(enumerants.len);
399399
400 for (enumerants) |enumerant, i| {
400 for (enumerants, 0..) |enumerant, i| {
401401 const result = enum_map.getOrPutAssumeCapacity(enumerant.value.int);
402402 if (!result.found_existing) {
403403 result.value_ptr.* = i;
......@@ -468,7 +468,7 @@ fn renderBitEnum(
468468 var aliases = std.ArrayList(struct { flag: usize, alias: u5 }).init(allocator);
469469 try aliases.ensureTotalCapacity(enumerants.len);
470470
471 for (enumerants) |enumerant, i| {
471 for (enumerants, 0..) |enumerant, i| {
472472 if (enumerant.value != .bitflag) return error.InvalidRegistry;
473473 const value = try parseHexInt(enumerant.value.bitflag);
474474 if (value == 0) {
......@@ -494,7 +494,7 @@ fn renderBitEnum(
494494 }
495495 }
496496
497 for (flags_by_bitpos) |maybe_flag_index, bitpos| {
497 for (flags_by_bitpos, 0..) |maybe_flag_index, bitpos| {
498498 if (maybe_flag_index) |flag_index| {
499499 try writer.print("{}", .{std.zig.fmtId(enumerants[flag_index].enumerant)});
500500 } else {
......@@ -521,7 +521,7 @@ fn renderBitEnum(
521521
522522 try writer.print("\npub const Extended = struct {{\n", .{});
523523
524 for (flags_by_bitpos) |maybe_flag_index, bitpos| {
524 for (flags_by_bitpos, 0..) |maybe_flag_index, bitpos| {
525525 const flag_index = maybe_flag_index orelse {
526526 try writer.print("_reserved_bit_{}: bool = false,\n", .{bitpos});
527527 continue;
......@@ -570,7 +570,7 @@ fn renderOperand(
570570
571571 try writer.writeAll("struct{");
572572
573 for (parameters) |param, j| {
573 for (parameters, 0..) |param, j| {
574574 if (j != 0) {
575575 try writer.writeAll(", ");
576576 }
......@@ -642,7 +642,7 @@ fn renderFieldName(writer: anytype, operands: []const g.Operand, field_index: us
642642
643643 // Translate to snake case.
644644 name_buffer.len = 0;
645 for (operand.kind) |c, i| {
645 for (operand.kind, 0..) |c, i| {
646646 switch (c) {
647647 'a'...'z', '0'...'9' => try name_buffer.append(c),
648648 'A'...'Z' => if (i > 0 and std.ascii.isLower(operand.kind[i - 1])) {
......@@ -658,7 +658,7 @@ fn renderFieldName(writer: anytype, operands: []const g.Operand, field_index: us
658658
659659 // For fields derived from type name, there could be any amount.
660660 // Simply check against all other fields, and if another similar one exists, add a number.
661 const need_extra_index = for (operands) |other_operand, i| {
661 const need_extra_index = for (operands, 0..) |other_operand, i| {
662662 if (i != field_index and std.mem.eql(u8, operand.kind, other_operand.kind)) {
663663 break true;
664664 }
tools/gen_stubs.zig+9-9
......@@ -45,7 +45,7 @@ const MultiSym = struct {
4545 visib: elf.STV,
4646
4747 fn allPresent(ms: MultiSym) bool {
48 for (arches) |_, i| {
48 for (arches, 0..) |_, i| {
4949 if (!ms.present[i]) {
5050 return false;
5151 }
......@@ -65,7 +65,7 @@ const MultiSym = struct {
6565
6666 fn commonSize(ms: MultiSym) ?u64 {
6767 var size: ?u64 = null;
68 for (arches) |_, i| {
68 for (arches, 0..) |_, i| {
6969 if (!ms.present[i]) continue;
7070 if (size) |s| {
7171 if (ms.size[i] != s) {
......@@ -80,7 +80,7 @@ const MultiSym = struct {
8080
8181 fn commonBinding(ms: MultiSym) ?u4 {
8282 var binding: ?u4 = null;
83 for (arches) |_, i| {
83 for (arches, 0..) |_, i| {
8484 if (!ms.present[i]) continue;
8585 if (binding) |b| {
8686 if (ms.binding[i] != b) {
......@@ -268,7 +268,7 @@ pub fn main() !void {
268268
269269 var prev_section: u16 = std.math.maxInt(u16);
270270 var prev_pp_state: enum { none, ptr32, special } = .none;
271 for (sym_table.values()) |multi_sym, sym_index| {
271 for (sym_table.values(), 0..) |multi_sym, sym_index| {
272272 const name = sym_table.keys()[sym_index];
273273
274274 if (multi_sym.section != prev_section) {
......@@ -309,7 +309,7 @@ pub fn main() !void {
309309 var first = true;
310310 try stdout.writeAll("#if ");
311311
312 for (arches) |arch, i| {
312 for (arches, 0..) |arch, i| {
313313 if (multi_sym.present[i]) continue;
314314
315315 if (!first) try stdout.writeAll(" && ");
......@@ -333,7 +333,7 @@ pub fn main() !void {
333333 } else if (multi_sym.isWeak64()) {
334334 try stdout.print("WEAK64 {s}\n", .{name});
335335 } else {
336 for (arches) |arch, i| {
336 for (arches, 0..) |arch, i| {
337337 log.info("symbol '{s}' binding on {s}: {d}", .{
338338 name, @tagName(arch), multi_sym.binding[i],
339339 });
......@@ -355,7 +355,7 @@ pub fn main() !void {
355355 } else if (multi_sym.isPtr2Size()) {
356356 try stdout.print(".size {s}, PTR2_SIZE_BYTES\n", .{name});
357357 } else {
358 for (arches) |arch, i| {
358 for (arches, 0..) |arch, i| {
359359 log.info("symbol '{s}' size on {s}: {d}", .{
360360 name, @tagName(arch), multi_sym.size[i],
361361 });
......@@ -415,7 +415,7 @@ fn parseElf(parse: Parse, comptime is_64: bool, comptime endian: builtin.Endian)
415415
416416 // Find the offset of the dynamic symbol table.
417417 var dynsym_index: u16 = 0;
418 for (shdrs) |shdr, i| {
418 for (shdrs, 0..) |shdr, i| {
419419 const sh_name = try arena.dupe(u8, mem.sliceTo(shstrtab[s(shdr.sh_name)..], 0));
420420 log.debug("found section: {s}", .{sh_name});
421421 if (mem.eql(u8, sh_name, ".dynsym")) {
......@@ -566,7 +566,7 @@ fn archIndex(arch: std.Target.Cpu.Arch) u8 {
566566}
567567
568568fn archSetName(arch_set: [arches.len]bool) []const u8 {
569 for (arches) |arch, i| {
569 for (arches, 0..) |arch, i| {
570570 if (arch_set[i]) {
571571 return @tagName(arch);
572572 }
tools/update_clang_options.zig+1-1
......@@ -573,7 +573,7 @@ pub fn main() anyerror!void {
573573 const Feature = @field(cpu_targets, decl.name).Feature;
574574 const all_features = @field(cpu_targets, decl.name).all_features;
575575
576 for (all_features) |feat, i| {
576 for (all_features, 0..) |feat, i| {
577577 const llvm_name = feat.llvm_name orelse continue;
578578 const zig_feat = @intToEnum(Feature, i);
579579 const zig_name = @tagName(zig_feat);
tools/update_cpu_features.zig+2-2
......@@ -899,7 +899,7 @@ pub fn main() anyerror!void {
899899 }
900900 } else {
901901 var threads = try arena.alloc(std.Thread, llvm_targets.len);
902 for (llvm_targets) |llvm_target, i| {
902 for (llvm_targets, 0..) |llvm_target, i| {
903903 const job = Job{
904904 .llvm_tblgen_exe = llvm_tblgen_exe,
905905 .llvm_src_root = llvm_src_root,
......@@ -1226,7 +1226,7 @@ fn processOneTarget(job: Job) anyerror!void {
12261226 }
12271227 try w.writeAll(
12281228 \\ const ti = @typeInfo(Feature);
1229 \\ for (result) |*elem, i| {
1229 \\ for (&result, 0..) |*elem, i| {
12301230 \\ elem.index = i;
12311231 \\ elem.name = ti.Enum.fields[i].name;
12321232 \\ }
tools/update_crc_catalog.zig+1-1
......@@ -116,7 +116,7 @@ pub fn main() anyerror!void {
116116 defer buf.deinit();
117117
118118 var prev: u8 = 0;
119 for (snakecase) |c, i| {
119 for (snakecase, 0..) |c, i| {
120120 if (c == '_') {
121121 // do nothing
122122 } else if (i == 0) {
tools/update_spirv_features.zig+2-2
......@@ -130,7 +130,7 @@ pub fn main() !void {
130130 \\
131131 );
132132
133 for (versions) |ver, i| {
133 for (versions, 0..) |ver, i| {
134134 try w.print(
135135 \\ result[@enumToInt(Feature.v{0}_{1})] = .{{
136136 \\ .llvm_name = null,
......@@ -203,7 +203,7 @@ pub fn main() !void {
203203
204204 try w.writeAll(
205205 \\ const ti = @typeInfo(Feature);
206 \\ for (result) |*elem, i| {
206 \\ for (&result, 0..) |*elem, i| {
207207 \\ elem.index = i;
208208 \\ elem.name = ti.Enum.fields[i].name;
209209 \\ }