diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -2050,6 +2050,13 @@ nextToken(); if (FormatTok->is(tok::l_paren)) parseParens(); + if (FormatTok->Previous && FormatTok->Previous->is(tok::identifier) && + FormatTok->is(tok::l_brace)) { + do { + nextToken(); + } while (!FormatTok->is(tok::r_brace)); + nextToken(); + } // In case identifiers were removed by clang-tidy, what might follow is // multiple commas in sequence - after the first identifier. diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -2727,6 +2727,29 @@ " throw;\n" " }\n" "};\n"); + verifyFormat("class A {\n" + " int a;\n" + " A() try : a(0), b{1} {\n" + " } catch (...) {\n" + " throw;\n" + " }\n" + "};\n"); + verifyFormat("class A {\n" + " int a;\n" + " A() try : a(0), b{1}, c{2} {\n" + " } catch (...) {\n" + " throw;\n" + " }\n" + "};\n"); + verifyFormat("class A {\n" + " int a;\n" + " A() try : a(0), b{1}, c{2} {\n" + " { // New scope.\n" + " }\n" + " } catch (...) {\n" + " throw;\n" + " }\n" + "};\n"); // Incomplete try-catch blocks. verifyIncompleteFormat("try {} catch ("); @@ -7756,8 +7779,8 @@ verifyFormat("co_yield -1;"); verifyFormat("co_return -1;"); - // Check that * is not treated as a binary operator when we set PointerAlignment - // as PAS_Left after a keyword and not a declaration. + // Check that * is not treated as a binary operator when we set + // PointerAlignment as PAS_Left after a keyword and not a declaration. FormatStyle PASLeftStyle = getLLVMStyle(); PASLeftStyle.PointerAlignment = FormatStyle::PAS_Left; verifyFormat("co_return *a;", PASLeftStyle);