From f2a6a1756bd3d3e284410c001ee997c4d12a260b Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 18 Feb 2023 10:27:08 -0700 Subject: [PATCH] Sema: fix for loops with comptime-known int ranges --- src/Sema.zig | 6 +++++- test/behavior/for.zig | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Sema.zig b/src/Sema.zig index fde9072d71..980aee720b 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -3924,7 +3924,11 @@ fn zirForLen(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air. const object_ty = sema.typeOf(object); // Each arg could be an indexable, or a range, in which case the length // is passed directly as an integer. - const arg_len = if (object_ty.zigTypeTag() == .Int) object else l: { + const is_int = switch (object_ty.zigTypeTag()) { + .Int, .ComptimeInt => true, + else => false, + }; + const arg_len = if (is_int) object else l: { try checkIndexable(sema, block, src, object_ty); if (!object_ty.indexableHasLen()) continue; diff --git a/test/behavior/for.zig b/test/behavior/for.zig index c9ae2f4461..20788f7269 100644 --- a/test/behavior/for.zig +++ b/test/behavior/for.zig @@ -249,3 +249,15 @@ test "for loop with else branch" { try expect(q == 4); } } + +test "count over fixed range" { + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO + + var sum: usize = 0; + for (0..6) |i| { + sum += i; + } + + try expect(sum == 15); +}