https://gcc.gnu.org/bugzilla/show_bug.cgi?id=46073
--- Comment #5 from Joseph S. Myers <jsm28 at gcc dot gnu.org> --- It's doubtful that this is a bug. You could define __builtin_choose_expr so the unselected operand only needs to be a balanced token sequence (with no commas unless nested inside () [] {}), but it's less clear that you should; there are disadvantages to not checking unselected operands as well as advantages. (Cf. how it's often better to use if () rather than #if for conditionals on compile-time constants so that more of the syntax gets checked in all build configurations.) (Technically, some valid code could change its semantics if you start treating one half as only a balanced token sequence - struct / union / enum types defined inside the unselected expression would no longer get declared for the rest of the scope - but I think that could safely be ignored, just included in the tests added, if we decide to make such a change.)