From d3c9c8aa8f785266dd4302f8ab980c9a6ce99b5b Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@gmail.com>
Date: Sat, 16 May 2020 09:26:10 +1200
Subject: [PATCH] Fix formatting of macros that take types.

Previously, we would assume that a macro like IsA() in the following
example was a cast just because it mentions a known type between parens,
and that messed up the formatting of any binary operator that followed:

       if (IsA(outer_path, UniquePath) ||path->skip_mark_restore)

This change errs on the side of assuming that function-like macros are
similar to sizeof() and offsetof(), so that operators are formatted
correctly:

       if (IsA(outer_path, UniquePath) || path->skip_mark_restore)

Discussion: https://postgr.es/m/20200114221814.GA19630%40alvherre.pgsql
---
 indent.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/indent.c b/indent.c
index 9faf57a..29b3fa4 100644
--- a/indent.c
+++ b/indent.c
@@ -570,8 +570,13 @@ check_type:
 		ps.in_or_st = false;	/* turn off flag for structure decl or
 					 * initialization */
 	    }
-	    /* parenthesized type following sizeof or offsetof is not a cast */
-	    if (ps.keyword == 1 || ps.keyword == 2)
+	    /*
+	     * parenthesized type following sizeof or offsetof is not a cast,
+	     * and we assume the same for any other non-keyword identifier,
+	     * to support macros that take types
+	     */
+	    if (ps.last_token == ident &&
+		(ps.keyword == 0 || ps.keyword == 1 || ps.keyword == 2))
 		ps.not_cast_mask |= 1 << ps.p_l_follow;
 	    break;
 
-- 
2.20.1

