Hi, I was just looking at the diff for a fix, which adds a "ListCell *lc;" to function scope, even though it's only needed in a pretty narrow scope.
Unfortunately foreach(ListCell *lc, ...) doesn't work with the current definition. Which I think isn't great, because the large scopes for loop iteration variables imo makes the code harder to reason about. I wonder if we could either have a different version of foreach() that allows that, or find a way to make the above work. For the latter I don't immediately have a good idea of how to accomplish that. For the former it's easy enough if we either don't include the typename (thereby looking more alien), or if we reference the name separately (making it more complicated to use). I also wonder if a foreach version that includes the typical (Type *) var = (Type *) lfirst(lc); or (Type *) var = castNode(Type, lfirst(lc)); or OpExpr *hclause = lfirst_node(OpExpr, lc); would make it nicer to use lists. foreach_node_in(Type, name, list) could mean something like foreach(ListCell *name##_cell, list) { Type* name = lfirst_node(Type, name##_cell); } (using a hypothetical foreach that supports defining the ListCell in scope, just for display simplicity's sake). Greetings, Andres Freund