aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Format/QualifierAlignmentFixer.cpp
diff options
context:
space:
mode:
authormydeveloperday <mydeveloperday@gmail.com>2022-01-06 19:39:24 +0000
committermydeveloperday <mydeveloperday@gmail.com>2022-01-06 19:40:39 +0000
commit031d3ece3f2eb6bd785dcf7484e88cc6a306db94 (patch)
tree6ebdb8057868ed5d6cebf28fc77a8b52f4ca8d1e /clang/lib/Format/QualifierAlignmentFixer.cpp
parent9e35e61aa435708ffe9361f768e8b0568b94bb30 (diff)
downloadllvm-031d3ece3f2eb6bd785dcf7484e88cc6a306db94.zip
llvm-031d3ece3f2eb6bd785dcf7484e88cc6a306db94.tar.gz
llvm-031d3ece3f2eb6bd785dcf7484e88cc6a306db94.tar.bz2
[clang-format] Fix a crash (assertion) in qualifier alignment when matching template closer is null
https://github.com/llvm/llvm-project/issues/53008 ``` template <class Id> using A = quantity /**/<kind<Id>, 1>; ``` the presence of the comment between identifier and template opener seems to be causing the qualifier alignment to fail Reviewed By: curdeius Fixes: #53008 Differential Revision: https://reviews.llvm.org/D116726
Diffstat (limited to 'clang/lib/Format/QualifierAlignmentFixer.cpp')
-rw-r--r--clang/lib/Format/QualifierAlignmentFixer.cpp19
1 files changed, 11 insertions, 8 deletions
diff --git a/clang/lib/Format/QualifierAlignmentFixer.cpp b/clang/lib/Format/QualifierAlignmentFixer.cpp
index 5a89225..ec19a38 100644
--- a/clang/lib/Format/QualifierAlignmentFixer.cpp
+++ b/clang/lib/Format/QualifierAlignmentFixer.cpp
@@ -204,9 +204,9 @@ static void rotateTokens(const SourceManager &SourceMgr,
replaceToken(SourceMgr, Fixes, Range, NewText);
}
-FormatToken *LeftRightQualifierAlignmentFixer::analyzeRight(
+const FormatToken *LeftRightQualifierAlignmentFixer::analyzeRight(
const SourceManager &SourceMgr, const AdditionalKeywords &Keywords,
- tooling::Replacements &Fixes, FormatToken *Tok,
+ tooling::Replacements &Fixes, const FormatToken *Tok,
const std::string &Qualifier, tok::TokenKind QualifierType) {
// We only need to think about streams that begin with a qualifier.
if (!Tok->is(QualifierType))
@@ -281,16 +281,16 @@ FormatToken *LeftRightQualifierAlignmentFixer::analyzeRight(
return Tok;
}
-FormatToken *LeftRightQualifierAlignmentFixer::analyzeLeft(
+const FormatToken *LeftRightQualifierAlignmentFixer::analyzeLeft(
const SourceManager &SourceMgr, const AdditionalKeywords &Keywords,
- tooling::Replacements &Fixes, FormatToken *Tok,
+ tooling::Replacements &Fixes, const FormatToken *Tok,
const std::string &Qualifier, tok::TokenKind QualifierType) {
// if Tok is an identifier and possibly a macro then don't convert.
if (LeftRightQualifierAlignmentFixer::isPossibleMacro(Tok))
return Tok;
- FormatToken *Qual = Tok;
- FormatToken *LastQual = Qual;
+ const FormatToken *Qual = Tok;
+ const FormatToken *LastQual = Qual;
while (Qual && isQualifierOrType(Qual, ConfiguredQualifierTokens)) {
LastQual = Qual;
Qual = Qual->Next;
@@ -326,7 +326,7 @@ FormatToken *LeftRightQualifierAlignmentFixer::analyzeLeft(
Tok->Previous->isOneOf(tok::star, tok::ampamp, tok::amp)) {
return Tok;
}
- FormatToken *Next = Tok->Next;
+ const FormatToken *Next = Tok->Next;
// The case `std::Foo<T> const` -> `const std::Foo<T> &&`
while (Next && Next->isOneOf(tok::identifier, tok::coloncolon))
Next = Next->Next;
@@ -334,6 +334,8 @@ FormatToken *LeftRightQualifierAlignmentFixer::analyzeLeft(
Next->Previous->startsSequence(tok::identifier, TT_TemplateOpener)) {
// Read from to the end of the TemplateOpener to
// TemplateCloser const ArrayRef<int> a; const ArrayRef<int> &a;
+ if (Next->is(tok::comment) && Next->getNextNonComment())
+ Next = Next->getNextNonComment();
assert(Next->MatchingParen && "Missing template closer");
Next = Next->MatchingParen->Next;
@@ -398,7 +400,8 @@ LeftRightQualifierAlignmentFixer::analyze(
FormatToken *First = AnnotatedLines[I]->First;
const auto *Last = AnnotatedLines[I]->Last;
- for (auto *Tok = First; Tok && Tok != Last && Tok->Next; Tok = Tok->Next) {
+ for (const auto *Tok = First; Tok && Tok != Last && Tok->Next;
+ Tok = Tok->Next) {
if (Tok->is(tok::comment))
continue;
if (RightAlign)