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(...@@ -4092,15 +4092,17 @@ fn structDeclInner(
4092 const doc_comment_index = try astgen.docCommentAsString(member.firstToken());4092 const doc_comment_index = try astgen.docCommentAsString(member.firstToken());
4093 wip_members.appendToField(doc_comment_index);4093 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
4100 const have_align = member.ast.align_expr != 0;4095 const have_align = member.ast.align_expr != 0;
4101 const have_value = member.ast.value_expr != 0;4096 const have_value = member.ast.value_expr != 0;
4102 const is_comptime = member.comptime_token != null;4097 const is_comptime = member.comptime_token != null;
4103 const unused = false;4098 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 }
4104 wip_members.nextField(bits_per_field, .{ have_align, have_value, is_comptime, unused });4106 wip_members.nextField(bits_per_field, .{ have_align, have_value, is_comptime, unused });
41054107
4106 if (have_align) {4108 if (have_align) {
src/Sema.zig+2
...@@ -20860,6 +20860,7 @@ pub fn typeHasOnePossibleValue(...@@ -20860,6 +20860,7 @@ pub fn typeHasOnePossibleValue(
20860 const resolved_ty = try sema.resolveTypeFields(block, src, ty);20860 const resolved_ty = try sema.resolveTypeFields(block, src, ty);
20861 const s = resolved_ty.castTag(.@"struct").?.data;20861 const s = resolved_ty.castTag(.@"struct").?.data;
20862 for (s.fields.values()) |value| {20862 for (s.fields.values()) |value| {
20863 if (value.is_comptime) continue;
20863 if ((try sema.typeHasOnePossibleValue(block, src, value.ty)) == null) {20864 if ((try sema.typeHasOnePossibleValue(block, src, value.ty)) == null) {
20864 return null;20865 return null;
20865 }20866 }
...@@ -21532,6 +21533,7 @@ fn typeRequiresComptime(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type) C...@@ -21532,6 +21533,7 @@ fn typeRequiresComptime(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type) C
2153221533
21533 struct_obj.requires_comptime = .wip;21534 struct_obj.requires_comptime = .wip;
21534 for (struct_obj.fields.values()) |field| {21535 for (struct_obj.fields.values()) |field| {
21536 if (field.is_comptime) continue;
21535 if (try sema.typeRequiresComptime(block, src, field.ty)) {21537 if (try sema.typeRequiresComptime(block, src, field.ty)) {
21536 struct_obj.requires_comptime = .yes;21538 struct_obj.requires_comptime = .yes;
21537 return true;21539 return true;
src/type.zig+1
...@@ -2098,6 +2098,7 @@ pub const Type = extern union {...@@ -2098,6 +2098,7 @@ pub const Type = extern union {
2098 }2098 }
2099 assert(struct_obj.haveFieldTypes());2099 assert(struct_obj.haveFieldTypes());
2100 for (struct_obj.fields.values()) |value| {2100 for (struct_obj.fields.values()) |value| {
2101 if (value.is_comptime) continue;
2101 if (value.ty.hasRuntimeBitsAdvanced(ignore_comptime_only))2102 if (value.ty.hasRuntimeBitsAdvanced(ignore_comptime_only))
2102 return true;2103 return true;
2103 } else {2104 } else {