https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81216
--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to Marek Polacek from comment #9) > > is what I've tried and it ICEs on that. So, either just initializing > > loc_after_labels to UNKNOWN_LOCATION and calling > > warn_for_multistatement_macros only if loc_after_labels != UNKNOWN_LOCATION > > like done in other spots should cure it, or we want to figure out why > > cp_parser_statement doesn't store anything. Here is a reduced testcase that shows the ICE with that patch: template <typename A, typename B> static bool equal (A a, A b, B c) { for (; a != b; ++a, (void)++c) if (!(*a == *c)) return false; return true; } Seems there are many reasons why it can not set *loc_after_labels, if it parses something into non-NULL statement, or various pragmas, or EOF.