diff options
| author | Haojian Wu <hokein.wu@gmail.com> | 2020-04-23 16:20:56 +0200 |
|---|---|---|
| committer | Haojian Wu <hokein.wu@gmail.com> | 2020-06-10 10:57:46 +0200 |
| commit | cd477e7fdbf75642caa58b55b498a62f82a88bf7 (patch) | |
| tree | d419a4e3d1eef300ea1ad822af5612173b2b567c /clang-tools-extra/clang-tidy/modernize | |
| parent | 85a2d23d963a5bd537a447378c6fc19b6a8b224a (diff) | |
| download | bcm5719-llvm-cd477e7fdbf75642caa58b55b498a62f82a88bf7.tar.gz bcm5719-llvm-cd477e7fdbf75642caa58b55b498a62f82a88bf7.zip | |
[clangd] Fix modernize-loop-convert "multiple diag in flight" crash.
Summary:
this maybe not ideal, but it is trivial and does fix the crash.
Fixes https://github.com/clangd/clangd/issues/156.
Reviewers: sammccall
Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D78715
(cherry picked from commit a466e4be3831848d7ff6ffbe4f57d99de8fb66af)
Diffstat (limited to 'clang-tools-extra/clang-tidy/modernize')
| -rw-r--r-- | clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp b/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp index f359702b3f5..01a6ca74898 100644 --- a/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp @@ -522,13 +522,11 @@ void LoopConvertCheck::doConversion( const ValueDecl *MaybeContainer, const UsageResult &Usages, const DeclStmt *AliasDecl, bool AliasUseRequired, bool AliasFromForInit, const ForStmt *Loop, RangeDescriptor Descriptor) { - auto Diag = diag(Loop->getForLoc(), "use range-based for loop instead"); - std::string VarName; bool VarNameFromAlias = (Usages.size() == 1) && AliasDecl; bool AliasVarIsRef = false; bool CanCopy = true; - + std::vector<FixItHint> FixIts; if (VarNameFromAlias) { const auto *AliasVar = cast<VarDecl>(AliasDecl->getSingleDecl()); VarName = AliasVar->getName().str(); @@ -560,8 +558,8 @@ void LoopConvertCheck::doConversion( getAliasRange(Context->getSourceManager(), ReplaceRange); } - Diag << FixItHint::CreateReplacement( - CharSourceRange::getTokenRange(ReplaceRange), ReplacementText); + FixIts.push_back(FixItHint::CreateReplacement( + CharSourceRange::getTokenRange(ReplaceRange), ReplacementText)); // No further replacements are made to the loop, since the iterator or index // was used exactly once - in the initialization of AliasVar. } else { @@ -606,8 +604,8 @@ void LoopConvertCheck::doConversion( Usage.Kind == Usage::UK_CaptureByCopy ? "&" + VarName : VarName; } TUInfo->getReplacedVars().insert(std::make_pair(Loop, IndexVar)); - Diag << FixItHint::CreateReplacement( - CharSourceRange::getTokenRange(Range), ReplaceText); + FixIts.push_back(FixItHint::CreateReplacement( + CharSourceRange::getTokenRange(Range), ReplaceText)); } } @@ -645,8 +643,9 @@ void LoopConvertCheck::doConversion( std::string Range = ("(" + TypeString + " " + VarName + " : " + MaybeDereference + Descriptor.ContainerString + ")") .str(); - Diag << FixItHint::CreateReplacement( - CharSourceRange::getTokenRange(ParenRange), Range); + FixIts.push_back(FixItHint::CreateReplacement( + CharSourceRange::getTokenRange(ParenRange), Range)); + diag(Loop->getForLoc(), "use range-based for loop instead") << FixIts; TUInfo->getGeneratedDecls().insert(make_pair(Loop, VarName)); } |

