From 762c4a876bfa999d5f49edc7bbaf2917c06d320d Mon Sep 17 00:00:00 2001 From: Cody Tapscott Date: Tue, 15 Mar 2022 13:53:17 -0700 Subject: [PATCH] stage2: comptime fields should not affect opv/comptime-only --- src/AstGen.zig | 12 +++++++----- src/Sema.zig | 2 ++ src/type.zig | 1 + 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/AstGen.zig b/src/AstGen.zig index c3e94ef631fbe1cd55c6dd1496a9c1cf01210cc5..60a7f54e54ef8646d1611e784462336e4ba29e81 100644 --- a/src/AstGen.zig +++ b/src/AstGen.zig @@ -4092,15 +4092,17 @@ fn structDeclInner( const doc_comment_index = try astgen.docCommentAsString(member.firstToken()); wip_members.appendToField(doc_comment_index); - known_non_opv = known_non_opv or - nodeImpliesMoreThanOnePossibleValue(tree, member.ast.type_expr); - known_comptime_only = known_comptime_only or - nodeImpliesComptimeOnly(tree, member.ast.type_expr); - const have_align = member.ast.align_expr != 0; const have_value = member.ast.value_expr != 0; const is_comptime = member.comptime_token != null; const unused = false; + + if (!is_comptime) { + known_non_opv = known_non_opv or + nodeImpliesMoreThanOnePossibleValue(tree, member.ast.type_expr); + known_comptime_only = known_comptime_only or + nodeImpliesComptimeOnly(tree, member.ast.type_expr); + } wip_members.nextField(bits_per_field, .{ have_align, have_value, is_comptime, unused }); if (have_align) { diff --git a/src/Sema.zig b/src/Sema.zig index 8c81f96edf1f016bc7a464b516ee18090c68ac7d..55d33d47e112501c215b1a9f3d2d16611bfa6e00 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -20860,6 +20860,7 @@ pub fn typeHasOnePossibleValue( const resolved_ty = try sema.resolveTypeFields(block, src, ty); const s = resolved_ty.castTag(.@"struct").?.data; for (s.fields.values()) |value| { + if (value.is_comptime) continue; if ((try sema.typeHasOnePossibleValue(block, src, value.ty)) == null) { return null; } @@ -21532,6 +21533,7 @@ fn typeRequiresComptime(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type) C struct_obj.requires_comptime = .wip; for (struct_obj.fields.values()) |field| { + if (field.is_comptime) continue; if (try sema.typeRequiresComptime(block, src, field.ty)) { struct_obj.requires_comptime = .yes; return true; diff --git a/src/type.zig b/src/type.zig index 2df7cc83d84566cd11aad6a70b1d84960ce061a1..ffa43d32c0aa181a3b449e0af79f909351e21c2f 100644 --- a/src/type.zig +++ b/src/type.zig @@ -2098,6 +2098,7 @@ pub const Type = extern union { } assert(struct_obj.haveFieldTypes()); for (struct_obj.fields.values()) |value| { + if (value.is_comptime) continue; if (value.ty.hasRuntimeBitsAdvanced(ignore_comptime_only)) return true; } else { -- 2.54.0