[clang] [llvm] Convert SpecialCaseList::Sections from StringMap to vector. (PR #140115)
Qinkun Bao via cfe-commits
cfe-commits at lists.llvm.org
Thu May 15 11:39:09 PDT 2025
https://github.com/qinkunbao updated https://github.com/llvm/llvm-project/pull/140115
>From 543a283bb9058ed8940c20f1d03901f7c2f702f9 Mon Sep 17 00:00:00 2001
From: Qinkun Bao <qinkun at google.com>
Date: Thu, 15 May 2025 18:18:08 +0000
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
=?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.6
---
clang/lib/Basic/Diagnostic.cpp | 166 ++++++++++---------
clang/lib/Basic/ProfileList.cpp | 2 +-
clang/lib/Basic/SanitizerSpecialCaseList.cpp | 5 +-
llvm/include/llvm/Support/SpecialCaseList.h | 10 +-
llvm/lib/Support/SpecialCaseList.cpp | 29 ++--
5 files changed, 114 insertions(+), 98 deletions(-)
diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp
index 538c1d18a8ac1..fcf86cc4c234c 100644
--- a/clang/lib/Basic/Diagnostic.cpp
+++ b/clang/lib/Basic/Diagnostic.cpp
@@ -67,12 +67,12 @@ const StreamingDiagnostic &clang::operator<<(const StreamingDiagnostic &DB,
return DB;
}
-static void DummyArgToStringFn(DiagnosticsEngine::ArgumentKind AK, intptr_t QT,
- StringRef Modifier, StringRef Argument,
- ArrayRef<DiagnosticsEngine::ArgumentValue> PrevArgs,
- SmallVectorImpl<char> &Output,
- void *Cookie,
- ArrayRef<intptr_t> QualTypeVals) {
+static void
+DummyArgToStringFn(DiagnosticsEngine::ArgumentKind AK, intptr_t QT,
+ StringRef Modifier, StringRef Argument,
+ ArrayRef<DiagnosticsEngine::ArgumentValue> PrevArgs,
+ SmallVectorImpl<char> &Output, void *Cookie,
+ ArrayRef<intptr_t> QualTypeVals) {
StringRef Str = "<can't format argument>";
Output.append(Str.begin(), Str.end());
}
@@ -94,9 +94,7 @@ DiagnosticsEngine::~DiagnosticsEngine() {
setClient(nullptr);
}
-void DiagnosticsEngine::dump() const {
- DiagStatesByLoc.dump(*SourceMgr);
-}
+void DiagnosticsEngine::dump() const { DiagStatesByLoc.dump(*SourceMgr); }
void DiagnosticsEngine::dump(StringRef DiagName) const {
DiagStatesByLoc.dump(*SourceMgr, DiagName);
@@ -259,7 +257,8 @@ void DiagnosticsEngine::DiagStateMap::dump(SourceManager &SrcMgr,
bool PrintedOuterHeading = false;
auto PrintOuterHeading = [&] {
- if (PrintedOuterHeading) return;
+ if (PrintedOuterHeading)
+ return;
PrintedOuterHeading = true;
llvm::errs() << "File " << &File << " <FileID " << ID.getHashValue()
@@ -272,8 +271,8 @@ void DiagnosticsEngine::DiagStateMap::dump(SourceManager &SrcMgr,
llvm::errs() << " parent " << File.Parent << " <FileID "
<< Decomp.first.getHashValue() << "> ";
SrcMgr.getLocForStartOfFile(Decomp.first)
- .getLocWithOffset(Decomp.second)
- .print(llvm::errs(), SrcMgr);
+ .getLocWithOffset(Decomp.second)
+ .print(llvm::errs(), SrcMgr);
}
if (File.HasLocalTransitions)
llvm::errs() << " has_local_transitions";
@@ -286,14 +285,15 @@ void DiagnosticsEngine::DiagStateMap::dump(SourceManager &SrcMgr,
for (DiagStatePoint &Transition : File.StateTransitions) {
bool PrintedInnerHeading = false;
auto PrintInnerHeading = [&] {
- if (PrintedInnerHeading) return;
+ if (PrintedInnerHeading)
+ return;
PrintedInnerHeading = true;
PrintOuterHeading();
llvm::errs() << " ";
SrcMgr.getLocForStartOfFile(ID)
- .getLocWithOffset(Transition.Offset)
- .print(llvm::errs(), SrcMgr);
+ .getLocWithOffset(Transition.Offset)
+ .print(llvm::errs(), SrcMgr);
llvm::errs() << ": state " << Transition.State << ":\n";
};
@@ -316,11 +316,21 @@ void DiagnosticsEngine::DiagStateMap::dump(SourceManager &SrcMgr,
llvm::errs() << ": ";
switch (Mapping.second.getSeverity()) {
- case diag::Severity::Ignored: llvm::errs() << "ignored"; break;
- case diag::Severity::Remark: llvm::errs() << "remark"; break;
- case diag::Severity::Warning: llvm::errs() << "warning"; break;
- case diag::Severity::Error: llvm::errs() << "error"; break;
- case diag::Severity::Fatal: llvm::errs() << "fatal"; break;
+ case diag::Severity::Ignored:
+ llvm::errs() << "ignored";
+ break;
+ case diag::Severity::Remark:
+ llvm::errs() << "remark";
+ break;
+ case diag::Severity::Warning:
+ llvm::errs() << "warning";
+ break;
+ case diag::Severity::Error:
+ llvm::errs() << "error";
+ break;
+ case diag::Severity::Fatal:
+ llvm::errs() << "fatal";
+ break;
}
if (!Mapping.second.isUser())
@@ -533,16 +543,20 @@ void WarningsSpecialCaseList::processSections(DiagnosticsEngine &Diags) {
// Drop the default section introduced by special case list, we only support
// exact diagnostic group names.
// FIXME: We should make this configurable in the parser instead.
- Sections.erase("*");
+ // FIXME: C++20 can use std::erase_if(Sections, [](Section &sec) { return
+ // sec.SectionStr == "*"; });
+ Sections.erase(
+ std::remove_if(Sections.begin(), Sections.end(),
+ [](Section &sec) { return sec.SectionStr == "*"; }),
+ Sections.end());
// Make sure we iterate sections by their line numbers.
- std::vector<std::pair<unsigned, const llvm::StringMapEntry<Section> *>>
- LineAndSectionEntry;
+ std::vector<std::pair<unsigned, const Section *>> LineAndSectionEntry;
LineAndSectionEntry.reserve(Sections.size());
for (const auto &Entry : Sections) {
- StringRef DiagName = Entry.getKey();
+ StringRef DiagName = Entry.SectionStr;
// Each section has a matcher with that section's name, attached to that
// line.
- const auto &DiagSectionMatcher = Entry.getValue().SectionMatcher;
+ const auto &DiagSectionMatcher = Entry.SectionMatcher;
unsigned DiagLine = DiagSectionMatcher->Globs.at(DiagName).second;
LineAndSectionEntry.emplace_back(DiagLine, &Entry);
}
@@ -550,7 +564,7 @@ void WarningsSpecialCaseList::processSections(DiagnosticsEngine &Diags) {
static constexpr auto WarningFlavor = clang::diag::Flavor::WarningOrError;
for (const auto &[_, SectionEntry] : LineAndSectionEntry) {
SmallVector<diag::kind> GroupDiags;
- StringRef DiagGroup = SectionEntry->getKey();
+ StringRef DiagGroup = SectionEntry->SectionStr;
if (Diags.getDiagnosticIDs()->getDiagnosticsInGroup(
WarningFlavor, DiagGroup, GroupDiags)) {
StringRef Suggestion =
@@ -563,7 +577,7 @@ void WarningsSpecialCaseList::processSections(DiagnosticsEngine &Diags) {
for (diag::kind Diag : GroupDiags)
// We're intentionally overwriting any previous mappings here to make sure
// latest one takes precedence.
- DiagToSection[Diag] = &SectionEntry->getValue();
+ DiagToSection[Diag] = SectionEntry;
}
}
@@ -662,8 +676,8 @@ bool DiagnosticsEngine::EmitDiagnostic(const DiagnosticBuilder &DB,
Diagnostic Info(this, DB);
// Figure out the diagnostic level of this message.
- DiagnosticIDs::Level DiagLevel
- = Diags->getDiagnosticLevel(Info.getID(), Info.getLocation(), *this);
+ DiagnosticIDs::Level DiagLevel =
+ Diags->getDiagnosticLevel(Info.getID(), Info.getLocation(), *this);
Emitted = (DiagLevel != DiagnosticIDs::Ignored);
if (Emitted) {
@@ -715,7 +729,7 @@ Diagnostic::Diagnostic(const DiagnosticsEngine *DO, SourceLocation DiagLoc,
DiagnosticConsumer::~DiagnosticConsumer() = default;
void DiagnosticConsumer::HandleDiagnostic(DiagnosticsEngine::Level DiagLevel,
- const Diagnostic &Info) {
+ const Diagnostic &Info) {
if (!IncludeInDiagnosticCounts())
return;
@@ -729,7 +743,7 @@ void DiagnosticConsumer::HandleDiagnostic(DiagnosticsEngine::Level DiagLevel,
template <std::size_t StrLen>
static bool ModifierIs(const char *Modifier, unsigned ModifierLen,
const char (&Str)[StrLen]) {
- return StrLen-1 == ModifierLen && memcmp(Modifier, Str, StrLen-1) == 0;
+ return StrLen - 1 == ModifierLen && memcmp(Modifier, Str, StrLen - 1) == 0;
}
/// ScanForward - Scans forward, looking for the given character, skipping
@@ -737,20 +751,25 @@ static bool ModifierIs(const char *Modifier, unsigned ModifierLen,
static const char *ScanFormat(const char *I, const char *E, char Target) {
unsigned Depth = 0;
- for ( ; I != E; ++I) {
- if (Depth == 0 && *I == Target) return I;
- if (Depth != 0 && *I == '}') Depth--;
+ for (; I != E; ++I) {
+ if (Depth == 0 && *I == Target)
+ return I;
+ if (Depth != 0 && *I == '}')
+ Depth--;
if (*I == '%') {
I++;
- if (I == E) break;
+ if (I == E)
+ break;
// Escaped characters get implicitly skipped here.
// Format specifier.
if (!isDigit(*I) && !isPunctuation(*I)) {
- for (I++; I != E && !isDigit(*I) && *I != '{'; I++) ;
- if (I == E) break;
+ for (I++; I != E && !isDigit(*I) && *I != '{'; I++)
+ ;
+ if (I == E)
+ break;
if (*I == '{')
Depth++;
}
@@ -767,14 +786,15 @@ static const char *ScanFormat(const char *I, const char *E, char Target) {
static void HandleSelectModifier(const Diagnostic &DInfo, unsigned ValNo,
const char *Argument, unsigned ArgumentLen,
SmallVectorImpl<char> &OutStr) {
- const char *ArgumentEnd = Argument+ArgumentLen;
+ const char *ArgumentEnd = Argument + ArgumentLen;
// Skip over 'ValNo' |'s.
while (ValNo) {
const char *NextVal = ScanFormat(Argument, ArgumentEnd, '|');
- assert(NextVal != ArgumentEnd && "Value for integer select modifier was"
+ assert(NextVal != ArgumentEnd &&
+ "Value for integer select modifier was"
" larger than the number of options in the diagnostic string!");
- Argument = NextVal+1; // Skip this string.
+ Argument = NextVal + 1; // Skip this string.
--ValNo;
}
@@ -973,15 +993,13 @@ static const char *getTokenDescForDiagnostic(tok::TokenKind Kind) {
/// FormatDiagnostic - Format this diagnostic into a string, substituting the
/// formal arguments into the %0 slots. The result is appended onto the Str
/// array.
-void Diagnostic::
-FormatDiagnostic(SmallVectorImpl<char> &OutStr) const {
+void Diagnostic::FormatDiagnostic(SmallVectorImpl<char> &OutStr) const {
if (StoredDiagMessage.has_value()) {
OutStr.append(StoredDiagMessage->begin(), StoredDiagMessage->end());
return;
}
- StringRef Diag =
- getDiags()->getDiagnosticIDs()->getDescription(getID());
+ StringRef Diag = getDiags()->getDiagnosticIDs()->getDescription(getID());
FormatDiagnostic(Diag.begin(), Diag.end(), OutStr);
}
@@ -1031,9 +1049,8 @@ void clang::EscapeStringForDiagnostic(StringRef Str,
}
}
-void Diagnostic::
-FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
- SmallVectorImpl<char> &OutStr) const {
+void Diagnostic::FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
+ SmallVectorImpl<char> &OutStr) const {
// When the diagnostic string is only "%0", the entire string is being given
// by an outside source. Remove unprintable characters from this string
// and skip all the other string processing.
@@ -1067,7 +1084,7 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
DiagStr = StrEnd;
continue;
} else if (isPunctuation(DiagStr[1])) {
- OutStr.push_back(DiagStr[1]); // %% -> %.
+ OutStr.push_back(DiagStr[1]); // %% -> %.
DiagStr += 2;
continue;
}
@@ -1086,10 +1103,9 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
// Check to see if we have a modifier. If so eat it.
if (!isDigit(DiagStr[0])) {
Modifier = DiagStr;
- while (DiagStr[0] == '-' ||
- (DiagStr[0] >= 'a' && DiagStr[0] <= 'z'))
+ while (DiagStr[0] == '-' || (DiagStr[0] >= 'a' && DiagStr[0] <= 'z'))
++DiagStr;
- ModifierLen = DiagStr-Modifier;
+ ModifierLen = DiagStr - Modifier;
// If we have an argument, get it next.
if (DiagStr[0] == '{') {
@@ -1098,8 +1114,8 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
DiagStr = ScanFormat(DiagStr, DiagEnd, '}');
assert(DiagStr != DiagEnd && "Mismatched {}'s in diagnostic string!");
- ArgumentLen = DiagStr-Argument;
- ++DiagStr; // Skip }.
+ ArgumentLen = DiagStr - Argument;
+ ++DiagStr; // Skip }.
}
}
@@ -1113,7 +1129,7 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
if (ModifierIs(Modifier, ModifierLen, "diff")) {
assert(*DiagStr == ',' && isDigit(*(DiagStr + 1)) &&
"Invalid format for diff modifier");
- ++DiagStr; // Comma.
+ ++DiagStr; // Comma.
ArgNo2 = *DiagStr++ - '0';
DiagnosticsEngine::ArgumentKind Kind2 = getArgKind(ArgNo2);
if (Kind == DiagnosticsEngine::ak_qualtype &&
@@ -1131,8 +1147,8 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
"Found too many '|'s in a %diff modifier!");
const char *FirstDollar = ScanFormat(Argument, Pipe, '$');
const char *SecondDollar = ScanFormat(FirstDollar + 1, Pipe, '$');
- const char ArgStr1[] = { '%', static_cast<char>('0' + ArgNo) };
- const char ArgStr2[] = { '%', static_cast<char>('0' + ArgNo2) };
+ const char ArgStr1[] = {'%', static_cast<char>('0' + ArgNo)};
+ const char ArgStr2[] = {'%', static_cast<char>('0' + ArgNo2)};
FormatDiagnostic(Argument, FirstDollar, OutStr);
FormatDiagnostic(ArgStr1, ArgStr1 + 2, OutStr);
FormatDiagnostic(FirstDollar + 1, SecondDollar, OutStr);
@@ -1256,8 +1272,7 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
getDiags()->ConvertArgToString(Kind, getRawArg(ArgNo),
StringRef(Modifier, ModifierLen),
StringRef(Argument, ArgumentLen),
- FormattedArgs,
- OutStr, QualTypeVals);
+ FormattedArgs, OutStr, QualTypeVals);
break;
case DiagnosticsEngine::ak_qualtype_pair: {
// Create a struct with all the info needed for printing.
@@ -1280,8 +1295,7 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
getDiags()->ConvertArgToString(Kind, val,
StringRef(Modifier, ModifierLen),
StringRef(Argument, ArgumentLen),
- FormattedArgs,
- Tree, QualTypeVals);
+ FormattedArgs, Tree, QualTypeVals);
// If there is no tree information, fall back to regular printing.
if (!Tree.empty()) {
FormatDiagnostic(Pipe + 1, ArgumentEnd, OutStr);
@@ -1303,11 +1317,10 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
getDiags()->ConvertArgToString(Kind, val,
StringRef(Modifier, ModifierLen),
StringRef(Argument, ArgumentLen),
- FormattedArgs,
- OutStr, QualTypeVals);
+ FormattedArgs, OutStr, QualTypeVals);
if (!TDT.TemplateDiffUsed)
- FormattedArgs.push_back(std::make_pair(DiagnosticsEngine::ak_qualtype,
- TDT.FromType));
+ FormattedArgs.push_back(
+ std::make_pair(DiagnosticsEngine::ak_qualtype, TDT.FromType));
// Append middle text
FormatDiagnostic(FirstDollar + 1, SecondDollar, OutStr);
@@ -1317,11 +1330,10 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
getDiags()->ConvertArgToString(Kind, val,
StringRef(Modifier, ModifierLen),
StringRef(Argument, ArgumentLen),
- FormattedArgs,
- OutStr, QualTypeVals);
+ FormattedArgs, OutStr, QualTypeVals);
if (!TDT.TemplateDiffUsed)
- FormattedArgs.push_back(std::make_pair(DiagnosticsEngine::ak_qualtype,
- TDT.ToType));
+ FormattedArgs.push_back(
+ std::make_pair(DiagnosticsEngine::ak_qualtype, TDT.ToType));
// Append end text
FormatDiagnostic(SecondDollar + 1, Pipe, OutStr);
@@ -1337,8 +1349,9 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
else if (Kind != DiagnosticsEngine::ak_std_string)
FormattedArgs.push_back(std::make_pair(Kind, getRawArg(ArgNo)));
else
- FormattedArgs.push_back(std::make_pair(DiagnosticsEngine::ak_c_string,
- (intptr_t)getArgStdStr(ArgNo).c_str()));
+ FormattedArgs.push_back(
+ std::make_pair(DiagnosticsEngine::ak_c_string,
+ (intptr_t)getArgStdStr(ArgNo).c_str()));
}
// Append the type tree to the end of the diagnostics.
@@ -1352,8 +1365,9 @@ StoredDiagnostic::StoredDiagnostic(DiagnosticsEngine::Level Level, unsigned ID,
StoredDiagnostic::StoredDiagnostic(DiagnosticsEngine::Level Level,
const Diagnostic &Info)
: ID(Info.getID()), Level(Level) {
- assert((Info.getLocation().isInvalid() || Info.hasSourceManager()) &&
- "Valid source location without setting a source manager for diagnostic");
+ assert(
+ (Info.getLocation().isInvalid() || Info.hasSourceManager()) &&
+ "Valid source location without setting a source manager for diagnostic");
if (Info.getLocation().isValid())
Loc = FullSourceLoc(Info.getLocation(), Info.getSourceManager());
SmallString<64> Message;
@@ -1368,9 +1382,8 @@ StoredDiagnostic::StoredDiagnostic(DiagnosticsEngine::Level Level, unsigned ID,
ArrayRef<CharSourceRange> Ranges,
ArrayRef<FixItHint> FixIts)
: ID(ID), Level(Level), Loc(Loc), Message(Message),
- Ranges(Ranges.begin(), Ranges.end()), FixIts(FixIts.begin(), FixIts.end())
-{
-}
+ Ranges(Ranges.begin(), Ranges.end()),
+ FixIts(FixIts.begin(), FixIts.end()) {}
llvm::raw_ostream &clang::operator<<(llvm::raw_ostream &OS,
const StoredDiagnostic &SD) {
@@ -1391,8 +1404,7 @@ void IgnoringDiagConsumer::anchor() {}
ForwardingDiagnosticConsumer::~ForwardingDiagnosticConsumer() = default;
void ForwardingDiagnosticConsumer::HandleDiagnostic(
- DiagnosticsEngine::Level DiagLevel,
- const Diagnostic &Info) {
+ DiagnosticsEngine::Level DiagLevel, const Diagnostic &Info) {
Target.HandleDiagnostic(DiagLevel, Info);
}
diff --git a/clang/lib/Basic/ProfileList.cpp b/clang/lib/Basic/ProfileList.cpp
index 01b8d7a073432..f2383c76853ec 100644
--- a/clang/lib/Basic/ProfileList.cpp
+++ b/clang/lib/Basic/ProfileList.cpp
@@ -37,7 +37,7 @@ class ProfileSpecialCaseList : public llvm::SpecialCaseList {
bool hasPrefix(StringRef Prefix) const {
for (const auto &It : Sections)
- if (It.second.Entries.count(Prefix) > 0)
+ if (It.Entries.count(Prefix) > 0)
return true;
return false;
}
diff --git a/clang/lib/Basic/SanitizerSpecialCaseList.cpp b/clang/lib/Basic/SanitizerSpecialCaseList.cpp
index b02e868cdaa44..1c1e51632bd8a 100644
--- a/clang/lib/Basic/SanitizerSpecialCaseList.cpp
+++ b/clang/lib/Basic/SanitizerSpecialCaseList.cpp
@@ -38,11 +38,10 @@ SanitizerSpecialCaseList::createOrDie(const std::vector<std::string> &Paths,
void SanitizerSpecialCaseList::createSanitizerSections() {
for (auto &It : Sections) {
- auto &S = It.second;
SanitizerMask Mask;
#define SANITIZER(NAME, ID) \
- if (S.SectionMatcher->match(NAME)) \
+ if (It.SectionMatcher->match(NAME)) \
Mask |= SanitizerKind::ID;
#define SANITIZER_GROUP(NAME, ID, ALIAS) SANITIZER(NAME, ID)
@@ -50,7 +49,7 @@ void SanitizerSpecialCaseList::createSanitizerSections() {
#undef SANITIZER
#undef SANITIZER_GROUP
- SanitizerSections.emplace_back(Mask, S.Entries);
+ SanitizerSections.emplace_back(Mask, It.Entries);
}
}
diff --git a/llvm/include/llvm/Support/SpecialCaseList.h b/llvm/include/llvm/Support/SpecialCaseList.h
index ca2030abdc1f5..4f4c097c7162a 100644
--- a/llvm/include/llvm/Support/SpecialCaseList.h
+++ b/llvm/include/llvm/Support/SpecialCaseList.h
@@ -132,14 +132,16 @@ class SpecialCaseList {
using SectionEntries = StringMap<StringMap<Matcher>>;
struct Section {
- Section(std::unique_ptr<Matcher> M) : SectionMatcher(std::move(M)){};
- Section() : Section(std::make_unique<Matcher>()) {}
+ Section(std::unique_ptr<Matcher> M, StringRef str)
+ : SectionMatcher(std::move(M)), SectionStr(SectionStr) {};
+ Section(StringRef str) : Section(std::make_unique<Matcher>(), str) {};
std::unique_ptr<Matcher> SectionMatcher;
SectionEntries Entries;
+ std::string SectionStr;
};
- StringMap<Section> Sections;
+ std::vector<Section> Sections;
LLVM_ABI Expected<Section *> addSection(StringRef SectionStr, unsigned LineNo,
bool UseGlobs = true);
@@ -154,6 +156,6 @@ class SpecialCaseList {
StringRef Category) const;
};
-} // namespace llvm
+} // namespace llvm
#endif // LLVM_SUPPORT_SPECIALCASELIST_H
diff --git a/llvm/lib/Support/SpecialCaseList.cpp b/llvm/lib/Support/SpecialCaseList.cpp
index 7a23421eaeb89..76c705c097aaa 100644
--- a/llvm/lib/Support/SpecialCaseList.cpp
+++ b/llvm/lib/Support/SpecialCaseList.cpp
@@ -132,14 +132,16 @@ bool SpecialCaseList::createInternal(const MemoryBuffer *MB,
Expected<SpecialCaseList::Section *>
SpecialCaseList::addSection(StringRef SectionStr, unsigned LineNo,
bool UseGlobs) {
- auto [It, DidEmplace] = Sections.try_emplace(SectionStr);
- auto &Section = It->getValue();
- if (DidEmplace)
- if (auto Err = Section.SectionMatcher->insert(SectionStr, LineNo, UseGlobs))
- return createStringError(errc::invalid_argument,
- "malformed section at line " + Twine(LineNo) +
- ": '" + SectionStr +
- "': " + toString(std::move(Err)));
+ Sections.emplace_back(SectionStr);
+ auto &Section = Sections.back();
+
+ if (auto Err = Section.SectionMatcher->insert(SectionStr, LineNo, UseGlobs)) {
+ return createStringError(errc::invalid_argument,
+ "malformed section at line " + Twine(LineNo) +
+ ": '" + SectionStr +
+ "': " + toString(std::move(Err)));
+ }
+
return &Section;
}
@@ -213,9 +215,8 @@ unsigned SpecialCaseList::inSectionBlame(StringRef Section, StringRef Prefix,
StringRef Query,
StringRef Category) const {
for (const auto &It : Sections) {
- const auto &S = It.getValue();
- if (S.SectionMatcher->match(Section)) {
- unsigned Blame = inSectionBlame(S.Entries, Prefix, Query, Category);
+ if (It.SectionMatcher->match(Section)) {
+ unsigned Blame = inSectionBlame(It.Entries, Prefix, Query, Category);
if (Blame)
return Blame;
}
@@ -227,9 +228,11 @@ unsigned SpecialCaseList::inSectionBlame(const SectionEntries &Entries,
StringRef Prefix, StringRef Query,
StringRef Category) const {
SectionEntries::const_iterator I = Entries.find(Prefix);
- if (I == Entries.end()) return 0;
+ if (I == Entries.end())
+ return 0;
StringMap<Matcher>::const_iterator II = I->second.find(Category);
- if (II == I->second.end()) return 0;
+ if (II == I->second.end())
+ return 0;
return II->getValue().match(Query);
}
More information about the cfe-commits
mailing list