diff --git a/astgen.c b/astgen.c index 45ab95e3e7..040528f9cc 100644 --- a/astgen.c +++ b/astgen.c @@ -3033,6 +3033,18 @@ static uint32_t ptrTypeExpr(GenZir* gz, Scope* scope, uint32_t node) { } } + // C pointers always allow address zero (AstGen.zig:3840-3842). + if (size == 3 && has_allowzero) { + SET_ERROR(ag); + return ZIR_REF_VOID_VALUE; + } + + // Save source cursor before typeExpr so we can restore it before each + // trailing expression (AstGen.zig:3844-3846). + uint32_t saved_source_offset = ag->source_offset; + uint32_t saved_source_line = ag->source_line; + uint32_t saved_source_column = ag->source_column; + // Evaluate element type (AstGen.zig:3847). uint32_t elem_type = typeExpr(gz, scope, child_type_node); @@ -3045,6 +3057,10 @@ static uint32_t ptrTypeExpr(GenZir* gz, Scope* scope, uint32_t node) { uint32_t trailing_count = 0; if (sentinel_node != UINT32_MAX) { + // Restore source cursor (AstGen.zig:3859-3861). + ag->source_offset = saved_source_offset; + ag->source_line = saved_source_line; + ag->source_column = saved_source_column; uint32_t reason = (size == 2) ? COMPTIME_REASON_SLICE_SENTINEL : COMPTIME_REASON_POINTER_SENTINEL; ResultLoc srl = { @@ -3054,6 +3070,10 @@ static uint32_t ptrTypeExpr(GenZir* gz, Scope* scope, uint32_t node) { trailing_count++; } if (addrspace_node != UINT32_MAX) { + // Restore source cursor (AstGen.zig:3876-3878). + ag->source_offset = saved_source_offset; + ag->source_line = saved_source_line; + ag->source_column = saved_source_column; // Upstream creates addrspace_ty via addBuiltinValue, we don't have // that yet, so pass RL_NONE (matching previous behavior). addrspace_ref = comptimeExpr( @@ -3061,6 +3081,10 @@ static uint32_t ptrTypeExpr(GenZir* gz, Scope* scope, uint32_t node) { trailing_count++; } if (align_node != UINT32_MAX) { + // Restore source cursor (AstGen.zig:3885-3887). + ag->source_offset = saved_source_offset; + ag->source_line = saved_source_line; + ag->source_column = saved_source_column; ResultLoc arl = { .tag = RL_COERCED_TY, .data = ZIR_REF_U29_TYPE, .src_node = 0,