Index: clang/lib/Format/QualifierAlignmentFixer.cpp =================================================================== --- clang/lib/Format/QualifierAlignmentFixer.cpp +++ clang/lib/Format/QualifierAlignmentFixer.cpp @@ -303,6 +303,9 @@ if (LastQual && Qual != LastQual && Qual->is(QualifierType)) { rotateTokens(SourceMgr, Fixes, Tok, Qual, /*Left=*/true); + if (!Qual->Next) { + return Qual; + } Tok = Qual->Next; } else if (Tok->startsSequence(tok::identifier, QualifierType)) { if (Tok->Next->Next && Tok->Next->Next->isOneOf(tok::identifier, tok::star, @@ -320,11 +323,11 @@ Tok = Closer; } } - if (Tok->is(TT_TemplateOpener) && Tok->Next && + if (Tok && Tok->is(TT_TemplateOpener) && Tok->Next && (Tok->Next->is(tok::identifier) || Tok->Next->isSimpleTypeSpecifier()) && Tok->Next->Next && Tok->Next->Next->is(QualifierType)) rotateTokens(SourceMgr, Fixes, Tok->Next, Tok->Next->Next, /*Left=*/true); - if (Tok->startsSequence(tok::identifier) && Tok->Next) { + if (Tok && Tok->startsSequence(tok::identifier) && Tok->Next) { if (Tok->Previous && Tok->Previous->isOneOf(tok::star, tok::ampamp, tok::amp)) return Tok; Index: clang/unittests/Format/QualifierFixerTest.cpp =================================================================== --- clang/unittests/Format/QualifierFixerTest.cpp +++ clang/unittests/Format/QualifierFixerTest.cpp @@ -930,5 +930,15 @@ "TemplateType t;", Style); } +TEST_F(QualifierFixerTest, ConstVolatile) { + FormatStyle Style = getLLVMStyle(); + Style.QualifierAlignment = FormatStyle::QAS_Left; + Style.QualifierOrder = { "const", "volatile", "type" }; + + verifyFormat("bool empty() const volatile { return true; }", + "bool empty() const volatile { return true; }", + Style); +} + } // namespace format } // namespace clang