Index: clang/lib/Format/UnwrappedLineParser.cpp =================================================================== --- clang/lib/Format/UnwrappedLineParser.cpp +++ clang/lib/Format/UnwrappedLineParser.cpp @@ -2401,10 +2401,14 @@ // it is often token-pasted. while (FormatTok->isOneOf(tok::identifier, tok::coloncolon, tok::hashhash, tok::kw___attribute, tok::kw___declspec, - tok::kw_alignas) || + tok::kw_alignas, tok::l_square) || ((Style.Language == FormatStyle::LK_Java || Style.Language == FormatStyle::LK_JavaScript) && FormatTok->isOneOf(tok::period, tok::comma))) { + + if (FormatTok->is(tok::l_square)) { + parseSquare(); + } if (Style.Language == FormatStyle::LK_JavaScript && FormatTok->isOneOf(Keywords.kw_extends, Keywords.kw_implements)) { // JavaScript/TypeScript supports inline object types in Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -7636,6 +7636,10 @@ verifyFormat("void f() [[deprecated(\"so sorry\")]];"); verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" " [[unused]] aaaaaaaaaaaaaaaaaaaaaaa(int i);"); + verifyFormat("[[nodiscard]] bool f() { return false; }"); + verifyFormat("class [[nodiscard]] f {\npublic:\n f() {}\n}"); + verifyFormat("class [[deprecated(\"so sorry\")]] f {\npublic:\n f() {}\n}"); + verifyFormat("class [[gnu::unused]] f {\npublic:\n f() {}\n}"); // Make sure we do not mistake attributes for array subscripts. verifyFormat("int a() {}\n"