rymiel created this revision. rymiel added reviewers: HazardyKnusperkeks, owenpan, MyDeveloperDay, curdeius. Herald added a project: All. rymiel requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
With the AlwaysBreakTemplateDeclarations option, having a constructor template for a type consisting of all-uppercase letters with a noexcept specifier would put said noexcept specifier on its own blank line. This is because the all-uppercase type is understood as a macro-like attribute (such as `DEPRECATED()`), and `noexcept` is seen as the declaration. However, `noexcept` is a keyword and cannot be an identifier on its own. Fixes https://github.com/llvm/llvm-project/issues/56216 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D132189 Files: clang/lib/Format/TokenAnnotator.cpp clang/unittests/Format/FormatTest.cpp Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -9525,6 +9525,12 @@ verifyFormat("template <typename T> // T can be A, B or C.\n" "struct C {};", AlwaysBreak); + verifyFormat("template <typename T>\n" + "C(T) noexcept;", + AlwaysBreak); + verifyFormat("template <typename T>\n" + "ClassName(T) noexcept;", + AlwaysBreak); verifyFormat("template <enum E> class A {\n" "public:\n" " E *f();\n" @@ -9535,6 +9541,8 @@ verifyFormat("template <typename T> class C {};", NeverBreak); verifyFormat("template <typename T> void f();", NeverBreak); verifyFormat("template <typename T> void f() {}", NeverBreak); + verifyFormat("template <typename T> C(T) noexcept;", NeverBreak); + verifyFormat("template <typename T> ClassName(T) noexcept;", NeverBreak); verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa " "bbbbbbbbbbbbbbbbbbbb) {}", NeverBreak); Index: clang/lib/Format/TokenAnnotator.cpp =================================================================== --- clang/lib/Format/TokenAnnotator.cpp +++ clang/lib/Format/TokenAnnotator.cpp @@ -1922,7 +1922,7 @@ !Current.Next->isBinaryOperator() && !Current.Next->isOneOf(tok::semi, tok::colon, tok::l_brace, tok::comma, tok::period, tok::arrow, - tok::coloncolon)) { + tok::coloncolon, tok::kw_noexcept)) { if (FormatToken *AfterParen = Current.MatchingParen->Next) { // Make sure this isn't the return type of an Obj-C block declaration if (AfterParen->isNot(tok::caret)) {
Index: clang/unittests/Format/FormatTest.cpp =================================================================== --- clang/unittests/Format/FormatTest.cpp +++ clang/unittests/Format/FormatTest.cpp @@ -9525,6 +9525,12 @@ verifyFormat("template <typename T> // T can be A, B or C.\n" "struct C {};", AlwaysBreak); + verifyFormat("template <typename T>\n" + "C(T) noexcept;", + AlwaysBreak); + verifyFormat("template <typename T>\n" + "ClassName(T) noexcept;", + AlwaysBreak); verifyFormat("template <enum E> class A {\n" "public:\n" " E *f();\n" @@ -9535,6 +9541,8 @@ verifyFormat("template <typename T> class C {};", NeverBreak); verifyFormat("template <typename T> void f();", NeverBreak); verifyFormat("template <typename T> void f() {}", NeverBreak); + verifyFormat("template <typename T> C(T) noexcept;", NeverBreak); + verifyFormat("template <typename T> ClassName(T) noexcept;", NeverBreak); verifyFormat("template <typename T>\nvoid foo(aaaaaaaaaaaaaaaaaaaaaaaaaa " "bbbbbbbbbbbbbbbbbbbb) {}", NeverBreak); Index: clang/lib/Format/TokenAnnotator.cpp =================================================================== --- clang/lib/Format/TokenAnnotator.cpp +++ clang/lib/Format/TokenAnnotator.cpp @@ -1922,7 +1922,7 @@ !Current.Next->isBinaryOperator() && !Current.Next->isOneOf(tok::semi, tok::colon, tok::l_brace, tok::comma, tok::period, tok::arrow, - tok::coloncolon)) { + tok::coloncolon, tok::kw_noexcept)) { if (FormatToken *AfterParen = Current.MatchingParen->Next) { // Make sure this isn't the return type of an Obj-C block declaration if (AfterParen->isNot(tok::caret)) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits