diff options
-rw-r--r-- | clang/include/clang/Basic/Diagnostic.h | 31 | ||||
-rw-r--r-- | clang/lib/Basic/Diagnostic.cpp | 42 |
2 files changed, 40 insertions, 33 deletions
diff --git a/clang/include/clang/Basic/Diagnostic.h b/clang/include/clang/Basic/Diagnostic.h index b83ef4d44b2..a1683324b7a 100644 --- a/clang/include/clang/Basic/Diagnostic.h +++ b/clang/include/clang/Basic/Diagnostic.h @@ -239,19 +239,9 @@ private: /// modifications done through the command-line. struct DiagStatePoint { DiagState *State; - FullSourceLoc Loc; - DiagStatePoint(DiagState *State, FullSourceLoc Loc) + SourceLocation Loc; + DiagStatePoint(DiagState *State, SourceLocation Loc) : State(State), Loc(Loc) { } - - bool operator<(const DiagStatePoint &RHS) const { - // If Loc is invalid it means it came from <command-line>, in which case - // we regard it as coming before any valid source location. - if (RHS.Loc.isInvalid()) - return false; - if (Loc.isInvalid()) - return true; - return Loc.isBeforeInTranslationUnitThan(RHS.Loc); - } }; /// \brief A sorted vector of all DiagStatePoints representing changes in @@ -271,16 +261,7 @@ private: return DiagStatePoints.back().State; } - void PushDiagStatePoint(DiagState *State, SourceLocation L) { - FullSourceLoc Loc(L, getSourceManager()); - // Make sure that DiagStatePoints is always sorted according to Loc. - assert(Loc.isValid() && "Adding invalid loc point"); - assert(!DiagStatePoints.empty() && - (DiagStatePoints.back().Loc.isInvalid() || - DiagStatePoints.back().Loc.isBeforeInTranslationUnitThan(Loc)) && - "Previous point loc comes after or is the same as new one"); - DiagStatePoints.push_back(DiagStatePoint(State, Loc)); - } + void PushDiagStatePoint(DiagState *State, SourceLocation L); /// \brief Finds the DiagStatePoint that contains the diagnostic state of /// the given source location. @@ -390,7 +371,11 @@ public: assert(SourceMgr && "SourceManager not set!"); return *SourceMgr; } - void setSourceManager(SourceManager *SrcMgr) { SourceMgr = SrcMgr; } + void setSourceManager(SourceManager *SrcMgr) { + assert(DiagStatePoints.size() == 1 && DiagStatePoints[0].Loc.isInvalid() && + "Leftover diag state from a different SourceManager."); + SourceMgr = SrcMgr; + } //===--------------------------------------------------------------------===// // DiagnosticsEngine characterization methods, used by a client to customize diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index 7529c475d6b..89b704da011 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -16,6 +16,7 @@ #include "clang/Basic/DiagnosticOptions.h" #include "clang/Basic/IdentifierTable.h" #include "clang/Basic/PartialDiagnostic.h" +#include "clang/Basic/SourceManager.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/CrashRecoveryContext.h" @@ -137,7 +138,7 @@ void DiagnosticsEngine::Reset() { // Create a DiagState and DiagStatePoint representing diagnostic changes // through command-line. DiagStates.emplace_back(); - DiagStatePoints.push_back(DiagStatePoint(&DiagStates.back(), FullSourceLoc())); + DiagStatePoints.emplace_back(&DiagStates.back(), SourceLocation()); } void DiagnosticsEngine::SetDelayedDiagnostic(unsigned DiagID, StringRef Arg1, @@ -157,6 +158,18 @@ void DiagnosticsEngine::ReportDelayed() { DelayedDiagArg2.clear(); } +void DiagnosticsEngine::PushDiagStatePoint(DiagState *State, + SourceLocation Loc) { + // Make sure that DiagStatePoints is always sorted according to Loc. + assert(Loc.isValid() && "Adding invalid loc point"); + assert(!DiagStatePoints.empty() && + (DiagStatePoints.back().Loc.isInvalid() || + getSourceManager().isBeforeInTranslationUnit( + DiagStatePoints.back().Loc, Loc)) && + "Previous point loc comes after or is the same as new one"); + DiagStatePoints.push_back(DiagStatePoint(State, Loc)); +} + DiagnosticsEngine::DiagStatePointsTy::iterator DiagnosticsEngine::GetDiagStatePointForLoc(SourceLocation L) const { assert(!DiagStatePoints.empty()); @@ -171,11 +184,21 @@ DiagnosticsEngine::GetDiagStatePointForLoc(SourceLocation L) const { return DiagStatePoints.end() - 1; DiagStatePointsTy::iterator Pos = DiagStatePoints.end(); - FullSourceLoc LastStateChangePos = DiagStatePoints.back().Loc; + SourceLocation LastStateChangePos = DiagStatePoints.back().Loc; if (LastStateChangePos.isValid() && Loc.isBeforeInTranslationUnitThan(LastStateChangePos)) - Pos = std::upper_bound(DiagStatePoints.begin(), DiagStatePoints.end(), - DiagStatePoint(nullptr, Loc)); + Pos = std::upper_bound( + DiagStatePoints.begin(), DiagStatePoints.end(), + DiagStatePoint(nullptr, Loc), + [this](const DiagStatePoint &LHS, const DiagStatePoint &RHS) { + // If Loc is invalid it means it came from <command-line>, in which + // case we regard it as coming before any valid source location. + if (RHS.Loc.isInvalid()) + return false; + if (LHS.Loc.isInvalid()) + return true; + return SourceMgr->isBeforeInTranslationUnit(LHS.Loc, RHS.Loc); + }); --Pos; return Pos; } @@ -190,8 +213,8 @@ void DiagnosticsEngine::setSeverity(diag::kind Diag, diag::Severity Map, assert(!DiagStatePoints.empty()); assert((L.isInvalid() || SourceMgr) && "No SourceMgr for valid location"); - FullSourceLoc Loc = SourceMgr? FullSourceLoc(L, *SourceMgr) : FullSourceLoc(); - FullSourceLoc LastStateChangePos = DiagStatePoints.back().Loc; + SourceLocation Loc = SourceMgr ? L : SourceLocation(); + SourceLocation LastStateChangePos = DiagStatePoints.back().Loc; // Don't allow a mapping to a warning override an error/fatal mapping. if (Map == diag::Severity::Warning) { DiagnosticMapping &Info = GetCurDiagState()->getOrAddMapping(Diag); @@ -210,7 +233,7 @@ void DiagnosticsEngine::setSeverity(diag::kind Diag, diag::Severity Map, // Another common case; modifying diagnostic state in a source location // after the previous one. if ((Loc.isValid() && LastStateChangePos.isInvalid()) || - LastStateChangePos.isBeforeInTranslationUnitThan(Loc)) { + SourceMgr->isBeforeInTranslationUnit(LastStateChangePos, Loc)) { // A diagnostic pragma occurred, create a new DiagState initialized with // the current one and a new DiagStatePoint to record at which location // the new state became active. @@ -240,12 +263,11 @@ void DiagnosticsEngine::setSeverity(diag::kind Diag, diag::Severity Map, // Create a new state/point and fit it into the vector of DiagStatePoints // so that the vector is always ordered according to location. - assert(Pos->Loc.isBeforeInTranslationUnitThan(Loc)); + assert(SourceMgr->isBeforeInTranslationUnit(Pos->Loc, Loc)); DiagStates.push_back(*Pos->State); DiagState *NewState = &DiagStates.back(); NewState->setMapping(Diag, Mapping); - DiagStatePoints.insert(Pos+1, DiagStatePoint(NewState, - FullSourceLoc(Loc, *SourceMgr))); + DiagStatePoints.insert(Pos + 1, DiagStatePoint(NewState, Loc)); } bool DiagnosticsEngine::setSeverityForGroup(diag::Flavor Flavor, |