authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-09-23 12:00:02+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-09-23 17:39:06+03:00
log8d1fdfc8ede94b1aea524041c1df10c42d4002e4
treecb57b64f9eb88c2352bc488a6c6ae2ec0b3242bc
parentcae76d8293f6416ff698171c2ae10552fa014587

Sema: preserve volatileness when constructing field pointers

Closes #12928

3 files changed, 30 insertions(+), 0 deletions(-)

src/Sema.zig+3
...@@ -22027,6 +22027,7 @@ fn structFieldPtrByIndex(...@@ -22027,6 +22027,7 @@ fn structFieldPtrByIndex(
22027 var ptr_ty_data: Type.Payload.Pointer.Data = .{22027 var ptr_ty_data: Type.Payload.Pointer.Data = .{
22028 .pointee_type = field.ty,22028 .pointee_type = field.ty,
22029 .mutable = struct_ptr_ty_info.mutable,22029 .mutable = struct_ptr_ty_info.mutable,
22030 .@"volatile" = struct_ptr_ty_info.@"volatile",
22030 .@"addrspace" = struct_ptr_ty_info.@"addrspace",22031 .@"addrspace" = struct_ptr_ty_info.@"addrspace",
22031 };22032 };
2203222033
...@@ -22246,6 +22247,7 @@ fn unionFieldPtr(...@@ -22246,6 +22247,7 @@ fn unionFieldPtr(
22246 const ptr_field_ty = try Type.ptr(arena, sema.mod, .{22247 const ptr_field_ty = try Type.ptr(arena, sema.mod, .{
22247 .pointee_type = field.ty,22248 .pointee_type = field.ty,
22248 .mutable = union_ptr_ty.ptrIsMutable(),22249 .mutable = union_ptr_ty.ptrIsMutable(),
22250 .@"volatile" = union_ptr_ty.isVolatilePtr(),
22249 .@"addrspace" = union_ptr_ty.ptrAddressSpace(),22251 .@"addrspace" = union_ptr_ty.ptrAddressSpace(),
22250 });22252 });
22251 const enum_field_index = @intCast(u32, union_obj.tag_ty.enumFieldIndex(field_name).?);22253 const enum_field_index = @intCast(u32, union_obj.tag_ty.enumFieldIndex(field_name).?);
...@@ -22568,6 +22570,7 @@ fn tupleFieldPtr(...@@ -22568,6 +22570,7 @@ fn tupleFieldPtr(
22568 const ptr_field_ty = try Type.ptr(sema.arena, sema.mod, .{22570 const ptr_field_ty = try Type.ptr(sema.arena, sema.mod, .{
22569 .pointee_type = field_ty,22571 .pointee_type = field_ty,
22570 .mutable = tuple_ptr_ty.ptrIsMutable(),22572 .mutable = tuple_ptr_ty.ptrIsMutable(),
22573 .@"volatile" = tuple_ptr_ty.isVolatilePtr(),
22571 .@"addrspace" = tuple_ptr_ty.ptrAddressSpace(),22574 .@"addrspace" = tuple_ptr_ty.ptrAddressSpace(),
22572 });22575 });
2257322576
test/behavior.zig+1
...@@ -93,6 +93,7 @@ test {...@@ -93,6 +93,7 @@ test {
93 _ = @import("behavior/bugs/12794.zig");93 _ = @import("behavior/bugs/12794.zig");
94 _ = @import("behavior/bugs/12801-1.zig");94 _ = @import("behavior/bugs/12801-1.zig");
95 _ = @import("behavior/bugs/12801-2.zig");95 _ = @import("behavior/bugs/12801-2.zig");
96 _ = @import("behavior/bugs/12928.zig");
96 _ = @import("behavior/byteswap.zig");97 _ = @import("behavior/byteswap.zig");
97 _ = @import("behavior/byval_arg_var.zig");98 _ = @import("behavior/byval_arg_var.zig");
98 _ = @import("behavior/call.zig");99 _ = @import("behavior/call.zig");
test/behavior/bugs/12928.zig created+26
...@@ -0,0 +1,26 @@
1const std = @import("std");
2const expect = std.testing.expect;
3const A = extern struct {
4 value: *volatile B,
5};
6const B = extern struct {
7 a: u32,
8 b: i32,
9};
10test {
11 var a: *A = undefined;
12 try expect(@TypeOf(&a.value.a) == *volatile u32);
13 try expect(@TypeOf(&a.value.b) == *volatile i32);
14}
15const C = extern struct {
16 value: *volatile D,
17};
18const D = extern union {
19 a: u32,
20 b: i32,
21};
22test {
23 var c: *C = undefined;
24 try expect(@TypeOf(&c.value.a) == *volatile u32);
25 try expect(@TypeOf(&c.value.b) == *volatile i32);
26}