From 804bb1097a44cc35178f3e1de46d17422ce7b67f Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Tue, 5 May 2026 16:03:13 -0500 Subject: [PATCH v1 1/2] pgindent: Fix spacing after != when member name matches typedef. When a struct member name matches a registered typedef, pgindent removes the space after "!=" (and some other operators): entry->dsh.dsa_handle !=DSA_HANDLE_INVALID In lexi.c, when an identifier matches the typedef list, the code sets last_u_d = true before jumping to found_typename. This flag tells the lexer that the next operator should be treated as unary, which is correct for type names (e.g., "Datum *x" needs * to be unary, not multiplication). However, found_typename has a guard that recognizes when a typedef name appears after "." or "->": in that case, the name is a struct member, not a type, so it's returned as a plain identifier. The problem is that last_u_d has already been set to true and is never corrected. This causes the next operator (e.g., "!=") to be misclassified as unary, which suppresses the space after it. To fix, only set last_u_d when the token won't be caught by the guard, i.e., when it will actually be treated as a type name. This also explains why "==" was not affected: the "==" case always returns binary_op regardless of last_u_d, while "!=" checks last_u_d to decide. --- src/tools/pg_bsd_indent/lexi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tools/pg_bsd_indent/lexi.c b/src/tools/pg_bsd_indent/lexi.c index 943bf7ce6b0..e846188d6f4 100644 --- a/src/tools/pg_bsd_indent/lexi.c +++ b/src/tools/pg_bsd_indent/lexi.c @@ -363,7 +363,8 @@ lexi(struct parser_state *state) bsearch(s_token, typenames, typename_top + 1, sizeof(typenames[0]), strcmp_type))) { state->keyword = 4; /* a type name */ - state->last_u_d = true; + if (state->last_token != period && state->last_token != unary_op) + state->last_u_d = true; goto found_typename; } } else { /* we have a keyword */ -- 2.50.1 (Apple Git-155)