authorgravatar for topolarity@tapscott.meCody Tapscott <topolarity@tapscott.me> 2022-03-15 13:53:17-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-15 17:01:07-07:00
log762c4a876bfa999d5f49edc7bbaf2917c06d320d
tree1730fd0074aaf13b79d04ce83d6b3286844343f1
parent7d0b6956c0935807f0e5862c45da857e8e065c6b

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


3 files changed, 10 insertions(+), 5 deletions(-)

src/AstGen.zig+7-5
......@@ -4092,15 +4092,17 @@ fn structDeclInner(
40924092 const doc_comment_index = try astgen.docCommentAsString(member.firstToken());
40934093 wip_members.appendToField(doc_comment_index);
40944094
4095 known_non_opv = known_non_opv or
4096 nodeImpliesMoreThanOnePossibleValue(tree, member.ast.type_expr);
4097 known_comptime_only = known_comptime_only or
4098 nodeImpliesComptimeOnly(tree, member.ast.type_expr);
4099
41004095 const have_align = member.ast.align_expr != 0;
41014096 const have_value = member.ast.value_expr != 0;
41024097 const is_comptime = member.comptime_token != null;
41034098 const unused = false;
4099
4100 if (!is_comptime) {
4101 known_non_opv = known_non_opv or
4102 nodeImpliesMoreThanOnePossibleValue(tree, member.ast.type_expr);
4103 known_comptime_only = known_comptime_only or
4104 nodeImpliesComptimeOnly(tree, member.ast.type_expr);
4105 }
41044106 wip_members.nextField(bits_per_field, .{ have_align, have_value, is_comptime, unused });
41054107
41064108 if (have_align) {
src/Sema.zig+2
......@@ -20860,6 +20860,7 @@ pub fn typeHasOnePossibleValue(
2086020860 const resolved_ty = try sema.resolveTypeFields(block, src, ty);
2086120861 const s = resolved_ty.castTag(.@"struct").?.data;
2086220862 for (s.fields.values()) |value| {
20863 if (value.is_comptime) continue;
2086320864 if ((try sema.typeHasOnePossibleValue(block, src, value.ty)) == null) {
2086420865 return null;
2086520866 }
......@@ -21532,6 +21533,7 @@ fn typeRequiresComptime(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type) C
2153221533
2153321534 struct_obj.requires_comptime = .wip;
2153421535 for (struct_obj.fields.values()) |field| {
21536 if (field.is_comptime) continue;
2153521537 if (try sema.typeRequiresComptime(block, src, field.ty)) {
2153621538 struct_obj.requires_comptime = .yes;
2153721539 return true;
src/type.zig+1
......@@ -2098,6 +2098,7 @@ pub const Type = extern union {
20982098 }
20992099 assert(struct_obj.haveFieldTypes());
21002100 for (struct_obj.fields.values()) |value| {
2101 if (value.is_comptime) continue;
21012102 if (value.ty.hasRuntimeBitsAdvanced(ignore_comptime_only))
21022103 return true;
21032104 } else {