Author: Emilia Dreamer Date: 2022-12-16T23:26:05+02:00 New Revision: 8384347997f87d73c70f194d90c3efb7ddf6f963
URL: https://github.com/llvm/llvm-project/commit/8384347997f87d73c70f194d90c3efb7ddf6f963 DIFF: https://github.com/llvm/llvm-project/commit/8384347997f87d73c70f194d90c3efb7ddf6f963.diff LOG: [clang-format] Don't require deduction guides to be templates The C++ standard doesn't require that class template deduction guides be templates themselves, but previously `isDeductionGuide` would assert for the existence of a template closer or requires clause closer before the deduction guide declaration. This patch simply removes that check. Because of this, a test which asserted that `x()->x<1>;` *isn't* a deduction guide failed, as it is now formatted as a deduction guide. However, as @JohelEGP demonstrated, it is [possible to make that a viable deduction guide][1]. Thus, that test has been removed, but other tests related to non-template class template deduction guides have been added. Fixes https://github.com/llvm/llvm-project/issues/55142 [1]: https://compiler-explorer.com/z/Wx3K6d5K9 Reviewed By: HazardyKnusperkeks, owenpan Differential Revision: https://reviews.llvm.org/D139416 Added: Modified: clang/lib/Format/TokenAnnotator.cpp clang/unittests/Format/FormatTest.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index cc0b7719b9e52..1fdceabbabc89 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -1804,21 +1804,8 @@ class AnnotatingParser { FormatToken *LeadingIdentifier = Current.Previous->MatchingParen->Previous; - // Differentiate a deduction guide by seeing the - // > of the template prior to the leading identifier. - if (LeadingIdentifier) { - FormatToken *PriorLeadingIdentifier = LeadingIdentifier->Previous; - // Skip back past explicit decoration - if (PriorLeadingIdentifier && - PriorLeadingIdentifier->is(tok::kw_explicit)) { - PriorLeadingIdentifier = PriorLeadingIdentifier->Previous; - } - - return PriorLeadingIdentifier && - (PriorLeadingIdentifier->is(TT_TemplateCloser) || - PriorLeadingIdentifier->ClosesRequiresClause) && - LeadingIdentifier->TokenText == Current.Next->TokenText; - } + return LeadingIdentifier && + LeadingIdentifier->TokenText == Current.Next->TokenText; } } return false; diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 00f5c4bc80c7e..79e2979fcab5d 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -8008,12 +8008,14 @@ TEST_F(FormatTest, DeductionGuides) { verifyFormat("template <class T> x() -> x<1>;"); verifyFormat("template <class T> explicit x(T &) -> x<1>;"); + verifyFormat("A(const char *) -> A<string &>;"); + verifyFormat("A() -> A<int>;"); + // Ensure not deduction guides. verifyFormat("c()->f<int>();"); verifyFormat("x()->foo<1>;"); verifyFormat("x = p->foo<3>();"); verifyFormat("x()->x<1>();"); - verifyFormat("x()->x<1>;"); } TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits