diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp b/clang/lib/Format/QualifierAlignmentFixer.cpp --- a/clang/lib/Format/QualifierAlignmentFixer.cpp +++ b/clang/lib/Format/QualifierAlignmentFixer.cpp @@ -223,6 +223,12 @@ 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 @@ 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 @@ 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 @@ 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 --- a/clang/unittests/Format/QualifierFixerTest.cpp +++ b/clang/unittests/Format/QualifierFixerTest.cpp @@ -895,5 +895,40 @@ Style); } +TEST_F(QualifierFixerTest, TemplatesRight) { + FormatStyle Style = getLLVMStyle(); + Style.QualifierAlignment = FormatStyle::QAS_Custom; + Style.QualifierOrder = {"type", "const"}; + + verifyFormat("template \n" + " requires Concept\n" + "void f();", + "template \n" + " requires Concept\n" + "void f();", + Style); + verifyFormat("TemplateType t;", "TemplateType t;", Style); + verifyFormat("TemplateType t;", + "TemplateType t;", Style); +} + +TEST_F(QualifierFixerTest, TemplatesLeft) { + FormatStyle Style = getLLVMStyle(); + Style.QualifierAlignment = FormatStyle::QAS_Custom; + Style.QualifierOrder = {"const", "type"}; + + verifyFormat("template t;", "template t;", Style); + verifyFormat("template \n" + " requires Concept\n" + "void f();", + "template \n" + " requires Concept\n" + "void f();", + Style); + verifyFormat("TemplateType t;", "TemplateType t;", Style); + verifyFormat("TemplateType t;", + "TemplateType t;", Style); +} + } // namespace format } // namespace clang