From: Richard Smith Date: Wed, 5 Dec 2012 09:47:49 +0000 (+0000) Subject: Minor reorganization. No functionality change. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=98cffc6b30dacd71434530fee368b1f7d03bd565;p=clang Minor reorganization. No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@169367 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Frontend/DiagnosticRenderer.cpp b/lib/Frontend/DiagnosticRenderer.cpp index ded1120a3b..1bc940c940 100644 --- a/lib/Frontend/DiagnosticRenderer.cpp +++ b/lib/Frontend/DiagnosticRenderer.cpp @@ -123,32 +123,17 @@ void DiagnosticRenderer::emitDiagnostic(SourceLocation Loc, const SourceManager *SM, DiagOrStoredDiag D) { assert(SM || Loc.isInvalid()); - + beginDiagnostic(D, Level); - - SourceLocation ExpandedLoc = Loc; - PresumedLoc PLoc; - if (Loc.isValid()) { - // Perform the same walk as emitMacroExpansions, to find the ultimate - // expansion location for the diagnostic. - while (ExpandedLoc.isMacroID()) - ExpandedLoc = SM->getImmediateMacroCallerLoc(ExpandedLoc); - PLoc = SM->getPresumedLoc(ExpandedLoc, DiagOpts->ShowPresumedLoc); - - // First, if this diagnostic is not in the main file, print out the - // "included from" lines. - emitIncludeStack(ExpandedLoc, PLoc, Level, *SM); - } - - // Next, emit the actual diagnostic message. - emitDiagnosticMessage(ExpandedLoc, PLoc, Level, Message, Ranges, SM, D); - - // Only recurse if we have a valid location. - if (Loc.isValid()) { + + if (!Loc.isValid()) + // If we have no source location, just emit the diagnostic message. + emitDiagnosticMessage(Loc, PresumedLoc(), Level, Message, Ranges, SM, D); + else { // Get the ranges into a local array we can hack on. SmallVector MutableRanges(Ranges.begin(), Ranges.end()); - + llvm::SmallVector MergedFixits; if (!FixItHints.empty()) { mergeFixits(FixItHints, *SM, LangOpts, MergedFixits); @@ -161,20 +146,35 @@ void DiagnosticRenderer::emitDiagnostic(SourceLocation Loc, if (I->RemoveRange.isValid()) MutableRanges.push_back(I->RemoveRange); - emitCaret(ExpandedLoc, Level, MutableRanges, FixItHints, *SM); + SourceLocation UnexpandedLoc = Loc; + + // Perform the same walk as emitMacroExpansions, to find the ultimate + // expansion location for the diagnostic. + while (Loc.isMacroID()) + Loc = SM->getImmediateMacroCallerLoc(Loc); - // If this location is within a macro, walk from the unexpanded location - // up to ExpandedLoc and produce a macro backtrace. - if (Loc.isMacroID()) { + PresumedLoc PLoc = SM->getPresumedLoc(Loc, DiagOpts->ShowPresumedLoc); + + // First, if this diagnostic is not in the main file, print out the + // "included from" lines. + emitIncludeStack(Loc, PLoc, Level, *SM); + + // Next, emit the actual diagnostic message and caret. + emitDiagnosticMessage(Loc, PLoc, Level, Message, Ranges, SM, D); + emitCaret(Loc, Level, MutableRanges, FixItHints, *SM); + + // If this location is within a macro, walk from UnexpandedLoc up to Loc + // and produce a macro backtrace. + if (UnexpandedLoc.isValid() && UnexpandedLoc.isMacroID()) { unsigned MacroDepth = 0; - emitMacroExpansions(Loc, Level, MutableRanges, FixItHints, *SM, + emitMacroExpansions(UnexpandedLoc, Level, MutableRanges, FixItHints, *SM, MacroDepth); } } - + LastLoc = Loc; LastLevel = Level; - + endDiagnostic(D, Level); } @@ -314,7 +314,7 @@ void DiagnosticRenderer::emitModuleBuildStack(const SourceManager &SM) { static void mapDiagnosticRanges( SourceLocation CaretLoc, ArrayRef Ranges, - SmallVectorImpl& SpellingRanges, + SmallVectorImpl &SpellingRanges, const SourceManager *SM) { FileID CaretLocFileID = SM->getFileID(CaretLoc);