zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 762c4a876bfa999d5f49edc7bbaf2917c06d320d (tree)
parent 7d0b6956c0935807f0e5862c45da857e8e065c6b
Author: Cody Tapscott <topolarity@tapscott.me>
Date:   Tue, 15 Mar 2022 13:53:17 -0700

stage2: comptime fields should not affect opv/comptime-only

Diffstat:
Msrc/AstGen.zig | 12+++++++-----
Msrc/Sema.zig | 2++
Msrc/type.zig | 1+
3 files changed, 10 insertions(+), 5 deletions(-)

diff --git 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 @@ -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 @@ -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 {