From 8878f085dccaf9efe89a04b458205fddc215e095 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 1 Mar 2022 15:26:31 -0700 Subject: [PATCH] Sema: correct implementation of comptimeOnly for tuples This makes formatted printing work when mixing comptime and runtime fields. --- src/Sema.zig | 5 +++-- src/type.zig | 5 +++-- test/behavior/tuple.zig | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Sema.zig b/src/Sema.zig index 5bceb60aa0..e58fdef4a7 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -19585,8 +19585,9 @@ fn typeRequiresComptime(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type) C .tuple => { const tuple = ty.castTag(.tuple).?.data; - for (tuple.types) |field_ty| { - if (try sema.typeRequiresComptime(block, src, field_ty)) { + for (tuple.types) |field_ty, i| { + const have_comptime_val = tuple.values[i].tag() != .unreachable_value; + if (!have_comptime_val and try sema.typeRequiresComptime(block, src, field_ty)) { return true; } } diff --git a/src/type.zig b/src/type.zig index 40700f28af..90e79a8eed 100644 --- a/src/type.zig +++ b/src/type.zig @@ -4050,8 +4050,9 @@ pub const Type = extern union { .tuple => { const tuple = ty.castTag(.tuple).?.data; - for (tuple.types) |field_ty| { - if (field_ty.comptimeOnly()) return true; + for (tuple.types) |field_ty, i| { + const have_comptime_val = tuple.values[i].tag() != .unreachable_value; + if (!have_comptime_val and field_ty.comptimeOnly()) return true; } return false; }, diff --git a/test/behavior/tuple.zig b/test/behavior/tuple.zig index 2f4b85d0bc..4c13668dbd 100644 --- a/test/behavior/tuple.zig +++ b/test/behavior/tuple.zig @@ -45,7 +45,7 @@ test "tuple multiplication" { comptime try S.doTheTest(); } -test "tuple concatenation" { +test "more tuple concatenation" { if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO const T = struct {