Author: mydeveloperday Date: 2022-03-05T18:08:25Z New Revision: 28bb040ded83b7cffdd6e6102080ccbe7935dbfe
URL: https://github.com/llvm/llvm-project/commit/28bb040ded83b7cffdd6e6102080ccbe7935dbfe DIFF: https://github.com/llvm/llvm-project/commit/28bb040ded83b7cffdd6e6102080ccbe7935dbfe.diff LOG: [clang-format] QualifierOrder does not reorder template arguments https://github.com/llvm/llvm-project/issues/53981 Reorder the qualifiers inside the template argument. This should handle the simple cases of ``` <const T> <T const> ``` But only by relaxing that single letter capital variables are not possible macros Fixes: #53981 Reviewed By: HazardyKnusperkeks, curdeius Differential Revision: https://reviews.llvm.org/D120710 Added: Modified: clang/lib/Format/QualifierAlignmentFixer.cpp clang/unittests/Format/QualifierFixerTest.cpp Removed: ################################################################################ diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp b/clang/lib/Format/QualifierAlignmentFixer.cpp index aff5562dd9721..74802026690ef 100644 --- a/clang/lib/Format/QualifierAlignmentFixer.cpp +++ b/clang/lib/Format/QualifierAlignmentFixer.cpp @@ -223,6 +223,12 @@ const FormatToken *LeftRightQualifierAlignmentFixer::analyzeRight( if (LastQual && Qual != LastQual) { rotateTokens(SourceMgr, Fixes, Tok, LastQual, /*Left=*/false); Tok = LastQual; + } else if (Tok->startsSequence(QualifierType, tok::identifier, + TT_TemplateCloser)) { + FormatToken *Closer = Tok->Next->Next; + rotateTokens(SourceMgr, Fixes, Tok, Tok->Next, /*Left=*/false); + Tok = Closer; + return Tok; } else if (Tok->startsSequence(QualifierType, tok::identifier, TT_TemplateOpener)) { // Read from the TemplateOpener to @@ -307,6 +313,11 @@ const FormatToken *LeftRightQualifierAlignmentFixer::analyzeLeft( rotateTokens(SourceMgr, Fixes, Tok, Tok->Next, /*Left=*/true); Tok = Tok->Next; } + } else if (Tok->startsSequence(tok::identifier, QualifierType, + TT_TemplateCloser)) { + FormatToken *Closer = Tok->Next->Next; + rotateTokens(SourceMgr, Fixes, Tok, Tok->Next, /*Left=*/true); + Tok = Closer; } } if (Tok->is(TT_TemplateOpener) && Tok->Next && @@ -329,8 +340,12 @@ const FormatToken *LeftRightQualifierAlignmentFixer::analyzeLeft( Next = Next->getNextNonComment(); assert(Next->MatchingParen && "Missing template closer"); Next = Next->MatchingParen; + + // If the template closer is closing the requires clause, + // then stop and go back to the TemplateOpener and do whatever is + // inside the <>. if (Next->ClosesRequiresClause) - return Next; + return Next->MatchingParen; Next = Next->Next; // Move to the end of any template class members e.g. @@ -461,7 +476,8 @@ bool LeftRightQualifierAlignmentFixer::isPossibleMacro(const FormatToken *Tok) { if (!Tok->is(tok::identifier)) return false; if (Tok->TokenText.upper() == Tok->TokenText.str()) - return true; + // T,K,U,V likely could be template arguments + return (Tok->TokenText.size() != 1); return false; } diff --git a/clang/unittests/Format/QualifierFixerTest.cpp b/clang/unittests/Format/QualifierFixerTest.cpp index 0c81c831e1f18..167a30ec09d3f 100755 --- a/clang/unittests/Format/QualifierFixerTest.cpp +++ b/clang/unittests/Format/QualifierFixerTest.cpp @@ -895,5 +895,40 @@ TEST_F(QualifierFixerTest, DisableRegions) { Style); } +TEST_F(QualifierFixerTest, TemplatesRight) { + FormatStyle Style = getLLVMStyle(); + Style.QualifierAlignment = FormatStyle::QAS_Custom; + Style.QualifierOrder = {"type", "const"}; + + verifyFormat("template <typename T>\n" + " requires Concept<T const>\n" + "void f();", + "template <typename T>\n" + " requires Concept<const T>\n" + "void f();", + Style); + verifyFormat("TemplateType<T const> t;", "TemplateType<const T> t;", Style); + verifyFormat("TemplateType<Container const> t;", + "TemplateType<const Container> t;", Style); +} + +TEST_F(QualifierFixerTest, TemplatesLeft) { + FormatStyle Style = getLLVMStyle(); + Style.QualifierAlignment = FormatStyle::QAS_Custom; + Style.QualifierOrder = {"const", "type"}; + + verifyFormat("template <const T> t;", "template <T const> t;", Style); + verifyFormat("template <typename T>\n" + " requires Concept<const T>\n" + "void f();", + "template <typename T>\n" + " requires Concept<T const>\n" + "void f();", + Style); + verifyFormat("TemplateType<const T> t;", "TemplateType<T const> t;", Style); + verifyFormat("TemplateType<const Container> t;", + "TemplateType<Container const> t;", Style); +} + } // namespace format } // namespace clang _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits