Skip to content

preserve allowzero, align, volatile, and addrspace on pointer types#3172

Open
barry3406 wants to merge 1 commit intozigtools:masterfrom
barry3406:fix-pointer-modifier-inlay-hints
Open

preserve allowzero, align, volatile, and addrspace on pointer types#3172
barry3406 wants to merge 1 commit intozigtools:masterfrom
barry3406:fix-pointer-modifier-inlay-hints

Conversation

@barry3406
Copy link
Copy Markdown

The ptr_type resolver in analysis.zig only read const_token from ptr_info, and Data.createPointer only set is_const on the InternPool.pointer_type flags. So *allowzero u8, *align(4) u8, *volatile u8 and friends all collapsed to *u8 in inlay hints (and anywhere else that runs through stringifyTypeOf).

This reads volatile_token, allowzero_token, and the literal integer in ast.align_node from ptr_info, plumbs them through createPointerType / Data.createPointer into the IP flags and the .pointer Data fallback, and updates rawStringify so the fallback path matches the InternPool printer.

Address-space resolution from arbitrary expressions still defers to .generic; the field is plumbed through but only the literal alignment integer is currently read.

Regression coverage added in tests/lsp_features/inlay_hints.zig.

Fixes #2603.

The `ptr_type` resolver in analysis.zig only read `const_token` from
`ptr_info`, and `Data.createPointer` only set `is_const` on the
`InternPool.pointer_type` flags. As a result, types like
`*allowzero u8`, `*align(4) u8`, `*volatile u8` were collapsed to
`*u8` in inlay hints (and any other surface that runs through
`stringifyTypeOf`).

Read `volatile_token`, `allowzero_token`, and the integer literal in
`ast.align_node` from `ptr_info`, plumb them through
`createPointerType` / `Data.createPointer` into the IP flags and the
`.pointer` Data fallback, and update `rawStringify` so the fallback
path matches the InternPool printer.

Address-space resolution from arbitrary expressions still defers to
`.generic`; only the literal alignment integer is read for now.

Fixes zigtools#2603.
@Techatrix Techatrix force-pushed the fix-pointer-modifier-inlay-hints branch from 3cfe1a1 to e2cfbe7 Compare April 21, 2026 14:24
, .{ .kind = .Type });
}

test "var decl - pointer modifiers" {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These tests shouldn't need to go through inlay hints. Instead, add new tests to tests/analysis/pointer.zig which directly target the analysis backend without going through LSP requests.

Example:

diff --git a/tests/analysis/pointer.zig b/tests/analysis/pointer.zig
index 4086f8d4..5aa7acab 100644
--- a/tests/analysis/pointer.zig
+++ b/tests/analysis/pointer.zig
@@ -270,6 +270,9 @@ const ManyPointerWithSentinel = [*:.{}]addrspace(.generic) const packed struct {
 //                                 ^ (packed struct {})()
 //                                               ^^^^^^^^ (AddressSpace)()
 
+const VolatilePointer = *volatile u32;
+//    ^^^^^^^^^^^^^^^ (type)(*volatile u32)
+
 var runtime_index: usize = 5;
 var runtime_u8: u8 = 1;
 var runtime_i8: i8 = -1;

Comment thread src/analysis.zig
Comment on lines 3810 to 3817
size: std.builtin.Type.Pointer.Size,
sentinel: InternPool.Index,
is_const: bool,
is_volatile: bool,
is_allowzero: bool,
alignment: u16,
address_space: std.builtin.AddressSpace,
elem_ty: Type,
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We already have a type that can store most pointer attributes. So the number of function parameters can be reduced here:

Suggested change
size: std.builtin.Type.Pointer.Size,
sentinel: InternPool.Index,
is_const: bool,
is_volatile: bool,
is_allowzero: bool,
alignment: u16,
address_space: std.builtin.AddressSpace,
elem_ty: Type,
elem_ty: Type,
sentinel: InternPool.Index,
flags: InternPool.Key.Pointer.Flags,

Comment thread src/analysis.zig
Comment on lines +3204 to +3208
is_volatile: bool = false,
is_allowzero: bool = false,
/// `0` means default alignment.
alignment: u16 = 0,
address_space: std.builtin.AddressSpace = .generic,
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We already have a type that can store most pointer attributes.

elem_ty: *Type,
/// `.none` means no sentinel, `.unknown_unknown` means unknown sentinel
sentinel: InternPool.Index,
flags: InternPool.Key.Pointer.Flags,

Comment thread src/analysis.zig
Comment on lines 3312 to 3319
size: std.builtin.Type.Pointer.Size,
sentinel: InternPool.Index,
is_const: bool,
is_volatile: bool,
is_allowzero: bool,
alignment: u16,
address_space: std.builtin.AddressSpace,
elem_ty: Type,
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We already have a type that can store most pointer attributes. So the number of function parameters can be reduced here:

Suggested change
size: std.builtin.Type.Pointer.Size,
sentinel: InternPool.Index,
is_const: bool,
is_volatile: bool,
is_allowzero: bool,
alignment: u16,
address_space: std.builtin.AddressSpace,
elem_ty: Type,
elem_ty: Type,
sentinel: InternPool.Index,
flags: InternPool.Key.Pointer.Flags,

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Inline hint of the pointer type is incomplete.

2 participants