12898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek//===--- DiagnosticRenderer.cpp - Diagnostic Pretty-Printing --------------===//
22898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek//
32898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek//                     The LLVM Compiler Infrastructure
42898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek//
52898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek// This file is distributed under the University of Illinois Open Source
62898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek// License. See LICENSE.TXT for details.
72898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek//
82898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek//===----------------------------------------------------------------------===//
92898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek
102898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek#include "clang/Frontend/DiagnosticRenderer.h"
1102c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor#include "clang/Basic/DiagnosticOptions.h"
122898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek#include "clang/Basic/FileManager.h"
132898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek#include "clang/Basic/SourceManager.h"
1430660a898545416f0fea2d717f16f75640001e38Ted Kremenek#include "clang/Edit/Commit.h"
1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Edit/EditedSource.h"
1630660a898545416f0fea2d717f16f75640001e38Ted Kremenek#include "clang/Edit/EditsReceiver.h"
1755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/Lexer.h"
189cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman#include "llvm/ADT/SmallSet.h"
192898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek#include "llvm/ADT/SmallString.h"
2055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/ErrorHandling.h"
2155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/MemoryBuffer.h"
2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/raw_ostream.h"
232898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek#include <algorithm>
242898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenekusing namespace clang;
252898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek
2616afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios KyrtzidisDiagnosticRenderer::DiagnosticRenderer(const LangOptions &LangOpts,
2702c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor                                       DiagnosticOptions *DiagOpts)
2802c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor  : LangOpts(LangOpts), DiagOpts(DiagOpts), LastLevel() {}
292898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek
302898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted KremenekDiagnosticRenderer::~DiagnosticRenderer() {}
312898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek
3230660a898545416f0fea2d717f16f75640001e38Ted Kremeneknamespace {
3330660a898545416f0fea2d717f16f75640001e38Ted Kremenek
3430660a898545416f0fea2d717f16f75640001e38Ted Kremenekclass FixitReceiver : public edit::EditsReceiver {
3530660a898545416f0fea2d717f16f75640001e38Ted Kremenek  SmallVectorImpl<FixItHint> &MergedFixits;
3630660a898545416f0fea2d717f16f75640001e38Ted Kremenek
3730660a898545416f0fea2d717f16f75640001e38Ted Kremenekpublic:
3830660a898545416f0fea2d717f16f75640001e38Ted Kremenek  FixitReceiver(SmallVectorImpl<FixItHint> &MergedFixits)
3930660a898545416f0fea2d717f16f75640001e38Ted Kremenek    : MergedFixits(MergedFixits) { }
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void insert(SourceLocation loc, StringRef text) override {
4130660a898545416f0fea2d717f16f75640001e38Ted Kremenek    MergedFixits.push_back(FixItHint::CreateInsertion(loc, text));
4230660a898545416f0fea2d717f16f75640001e38Ted Kremenek  }
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void replace(CharSourceRange range, StringRef text) override {
4430660a898545416f0fea2d717f16f75640001e38Ted Kremenek    MergedFixits.push_back(FixItHint::CreateReplacement(range, text));
4530660a898545416f0fea2d717f16f75640001e38Ted Kremenek  }
4630660a898545416f0fea2d717f16f75640001e38Ted Kremenek};
4730660a898545416f0fea2d717f16f75640001e38Ted Kremenek
4830660a898545416f0fea2d717f16f75640001e38Ted Kremenek}
4930660a898545416f0fea2d717f16f75640001e38Ted Kremenek
5030660a898545416f0fea2d717f16f75640001e38Ted Kremenekstatic void mergeFixits(ArrayRef<FixItHint> FixItHints,
5130660a898545416f0fea2d717f16f75640001e38Ted Kremenek                        const SourceManager &SM, const LangOptions &LangOpts,
5230660a898545416f0fea2d717f16f75640001e38Ted Kremenek                        SmallVectorImpl<FixItHint> &MergedFixits) {
5330660a898545416f0fea2d717f16f75640001e38Ted Kremenek  edit::Commit commit(SM, LangOpts);
5430660a898545416f0fea2d717f16f75640001e38Ted Kremenek  for (ArrayRef<FixItHint>::const_iterator
5530660a898545416f0fea2d717f16f75640001e38Ted Kremenek         I = FixItHints.begin(), E = FixItHints.end(); I != E; ++I) {
5630660a898545416f0fea2d717f16f75640001e38Ted Kremenek    const FixItHint &Hint = *I;
5730660a898545416f0fea2d717f16f75640001e38Ted Kremenek    if (Hint.CodeToInsert.empty()) {
5830660a898545416f0fea2d717f16f75640001e38Ted Kremenek      if (Hint.InsertFromRange.isValid())
5930660a898545416f0fea2d717f16f75640001e38Ted Kremenek        commit.insertFromRange(Hint.RemoveRange.getBegin(),
6030660a898545416f0fea2d717f16f75640001e38Ted Kremenek                           Hint.InsertFromRange, /*afterToken=*/false,
6130660a898545416f0fea2d717f16f75640001e38Ted Kremenek                           Hint.BeforePreviousInsertions);
6230660a898545416f0fea2d717f16f75640001e38Ted Kremenek      else
6330660a898545416f0fea2d717f16f75640001e38Ted Kremenek        commit.remove(Hint.RemoveRange);
6430660a898545416f0fea2d717f16f75640001e38Ted Kremenek    } else {
6530660a898545416f0fea2d717f16f75640001e38Ted Kremenek      if (Hint.RemoveRange.isTokenRange() ||
6630660a898545416f0fea2d717f16f75640001e38Ted Kremenek          Hint.RemoveRange.getBegin() != Hint.RemoveRange.getEnd())
6730660a898545416f0fea2d717f16f75640001e38Ted Kremenek        commit.replace(Hint.RemoveRange, Hint.CodeToInsert);
6830660a898545416f0fea2d717f16f75640001e38Ted Kremenek      else
6930660a898545416f0fea2d717f16f75640001e38Ted Kremenek        commit.insert(Hint.RemoveRange.getBegin(), Hint.CodeToInsert,
7030660a898545416f0fea2d717f16f75640001e38Ted Kremenek                    /*afterToken=*/false, Hint.BeforePreviousInsertions);
7130660a898545416f0fea2d717f16f75640001e38Ted Kremenek    }
7230660a898545416f0fea2d717f16f75640001e38Ted Kremenek  }
7330660a898545416f0fea2d717f16f75640001e38Ted Kremenek
7430660a898545416f0fea2d717f16f75640001e38Ted Kremenek  edit::EditedSource Editor(SM, LangOpts);
7530660a898545416f0fea2d717f16f75640001e38Ted Kremenek  if (Editor.commit(commit)) {
7630660a898545416f0fea2d717f16f75640001e38Ted Kremenek    FixitReceiver Rec(MergedFixits);
7730660a898545416f0fea2d717f16f75640001e38Ted Kremenek    Editor.applyRewrites(Rec);
7830660a898545416f0fea2d717f16f75640001e38Ted Kremenek  }
7930660a898545416f0fea2d717f16f75640001e38Ted Kremenek}
802898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek
812898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenekvoid DiagnosticRenderer::emitDiagnostic(SourceLocation Loc,
822898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek                                        DiagnosticsEngine::Level Level,
832898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek                                        StringRef Message,
842898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek                                        ArrayRef<CharSourceRange> Ranges,
852898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek                                        ArrayRef<FixItHint> FixItHints,
8616afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis                                        const SourceManager *SM,
878be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek                                        DiagOrStoredDiag D) {
8816afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis  assert(SM || Loc.isInvalid());
8998cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith
908be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek  beginDiagnostic(D, Level);
9198cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith
9298cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith  if (!Loc.isValid())
9398cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith    // If we have no source location, just emit the diagnostic message.
9498cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith    emitDiagnosticMessage(Loc, PresumedLoc(), Level, Message, Ranges, SM, D);
9598cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith  else {
962898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek    // Get the ranges into a local array we can hack on.
972898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek    SmallVector<CharSourceRange, 20> MutableRanges(Ranges.begin(),
982898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek                                                   Ranges.end());
9998cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith
100cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko    SmallVector<FixItHint, 8> MergedFixits;
10130660a898545416f0fea2d717f16f75640001e38Ted Kremenek    if (!FixItHints.empty()) {
10216afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis      mergeFixits(FixItHints, *SM, LangOpts, MergedFixits);
10330660a898545416f0fea2d717f16f75640001e38Ted Kremenek      FixItHints = MergedFixits;
10430660a898545416f0fea2d717f16f75640001e38Ted Kremenek    }
10530660a898545416f0fea2d717f16f75640001e38Ted Kremenek
1062898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek    for (ArrayRef<FixItHint>::const_iterator I = FixItHints.begin(),
1072898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek         E = FixItHints.end();
1082898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek         I != E; ++I)
1092898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek      if (I->RemoveRange.isValid())
1102898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek        MutableRanges.push_back(I->RemoveRange);
111ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith
11298cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith    SourceLocation UnexpandedLoc = Loc;
11398cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith
1146ee225c8d4381e728c73252ed589f13e9f546defTed Kremenek    // Find the ultimate expansion location for the diagnostic.
1156ee225c8d4381e728c73252ed589f13e9f546defTed Kremenek    Loc = SM->getFileLoc(Loc);
116ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith
11798cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith    PresumedLoc PLoc = SM->getPresumedLoc(Loc, DiagOpts->ShowPresumedLoc);
11898cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith
11998cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith    // First, if this diagnostic is not in the main file, print out the
12098cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith    // "included from" lines.
12198cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith    emitIncludeStack(Loc, PLoc, Level, *SM);
12298cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith
12398cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith    // Next, emit the actual diagnostic message and caret.
12498cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith    emitDiagnosticMessage(Loc, PLoc, Level, Message, Ranges, SM, D);
12598cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith    emitCaret(Loc, Level, MutableRanges, FixItHints, *SM);
12698cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith
12798cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith    // If this location is within a macro, walk from UnexpandedLoc up to Loc
12898cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith    // and produce a macro backtrace.
12998cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith    if (UnexpandedLoc.isValid() && UnexpandedLoc.isMacroID()) {
13087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      emitMacroExpansions(UnexpandedLoc, Level, MutableRanges, FixItHints, *SM);
131ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith    }
1322898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek  }
13398cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith
1342898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek  LastLoc = Loc;
1352898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek  LastLevel = Level;
13698cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith
1378be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek  endDiagnostic(D, Level);
1388be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek}
1398be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek
1408be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek
1418be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenekvoid DiagnosticRenderer::emitStoredDiagnostic(StoredDiagnostic &Diag) {
1428be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek  emitDiagnostic(Diag.getLocation(), Diag.getLevel(), Diag.getMessage(),
1438be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek                 Diag.getRanges(), Diag.getFixIts(),
14416afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis                 Diag.getLocation().isValid() ? &Diag.getLocation().getManager()
1456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                              : nullptr,
1468be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek                 &Diag);
1472898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek}
1482898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek
149c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid DiagnosticRenderer::emitBasicNote(StringRef Message) {
150c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  emitDiagnosticMessage(
151c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      SourceLocation(), PresumedLoc(), DiagnosticsEngine::Note, Message,
152176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      None, nullptr, DiagOrStoredDiag());
153c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
154c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
1552898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// \brief Prints an include stack when appropriate for a particular
1562898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// diagnostic level and location.
1572898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek///
1582898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// This routine handles all the logic of suppressing particular include
1592898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// stacks (such as those for notes) and duplicate include stacks when
1602898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// repeated warnings occur within the same file. It also handles the logic
1612898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// of customizing the formatting and display of the include stack.
1622898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek///
1636c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor/// \param Loc   The diagnostic location.
1646c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor/// \param PLoc  The presumed location of the diagnostic location.
1652898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// \param Level The diagnostic level of the message this stack pertains to.
1662898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenekvoid DiagnosticRenderer::emitIncludeStack(SourceLocation Loc,
1676c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor                                          PresumedLoc PLoc,
16816afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis                                          DiagnosticsEngine::Level Level,
16916afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis                                          const SourceManager &SM) {
1704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  SourceLocation IncludeLoc =
1714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      PLoc.isInvalid() ? SourceLocation() : PLoc.getIncludeLoc();
1726c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor
1732898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek  // Skip redundant include stacks altogether.
1746c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  if (LastIncludeLoc == IncludeLoc)
1752898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek    return;
1766c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor
1776c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  LastIncludeLoc = IncludeLoc;
1782898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek
17902c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor  if (!DiagOpts->ShowNoteIncludeStack && Level == DiagnosticsEngine::Note)
1802898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek    return;
1816c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor
1826c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  if (IncludeLoc.isValid())
1836c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor    emitIncludeStackRecursively(IncludeLoc, SM);
1846c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  else {
1854565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor    emitModuleBuildStack(SM);
1866c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor    emitImportStack(Loc, SM);
1876c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  }
1882898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek}
1892898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek
1902898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// \brief Helper to recursivly walk up the include stack and print each layer
1912898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// on the way back down.
19216afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidisvoid DiagnosticRenderer::emitIncludeStackRecursively(SourceLocation Loc,
19316afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis                                                     const SourceManager &SM) {
194830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor  if (Loc.isInvalid()) {
1954565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor    emitModuleBuildStack(SM);
1962898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek    return;
197830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor  }
1982898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek
19962221b17c90457df9ca0ff20bb54d634e8951defRichard Smith  PresumedLoc PLoc = SM.getPresumedLoc(Loc, DiagOpts->ShowPresumedLoc);
2002898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek  if (PLoc.isInvalid())
2012898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek    return;
2026c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor
2036c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  // If this source location was imported from a module, print the module
2046c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  // import stack rather than the
2056c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  // FIXME: We want submodule granularity here.
2066c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  std::pair<SourceLocation, StringRef> Imported = SM.getModuleImportLoc(Loc);
20787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!Imported.second.empty()) {
2086c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor    // This location was imported by a module. Emit the module import stack.
2096c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor    emitImportStackRecursively(Imported.first, Imported.second, SM);
2106c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor    return;
2116c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  }
2126c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor
2132898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek  // Emit the other include frames first.
21416afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis  emitIncludeStackRecursively(PLoc.getIncludeLoc(), SM);
2152898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek
2162898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek  // Emit the inclusion text/note.
21716afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis  emitIncludeLocation(Loc, PLoc, SM);
2182898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek}
2192898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek
2206c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor/// \brief Emit the module import stack associated with the current location.
2216c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregorvoid DiagnosticRenderer::emitImportStack(SourceLocation Loc,
2226c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor                                         const SourceManager &SM) {
2236c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  if (Loc.isInvalid()) {
2244565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor    emitModuleBuildStack(SM);
2256c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor    return;
2266c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  }
2276c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor
2286c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  std::pair<SourceLocation, StringRef> NextImportLoc
2296c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor    = SM.getModuleImportLoc(Loc);
2306c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  emitImportStackRecursively(NextImportLoc.first, NextImportLoc.second, SM);
2316c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor}
2326c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor
2336c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor/// \brief Helper to recursivly walk up the import stack and print each layer
2346c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor/// on the way back down.
2356c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregorvoid DiagnosticRenderer::emitImportStackRecursively(SourceLocation Loc,
2366c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor                                                    StringRef ModuleName,
2376c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor                                                    const SourceManager &SM) {
23887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (ModuleName.empty()) {
2396c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor    return;
2406c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  }
2416c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor
2426c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  PresumedLoc PLoc = SM.getPresumedLoc(Loc, DiagOpts->ShowPresumedLoc);
2436c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor
2446c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  // Emit the other import frames first.
2456c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  std::pair<SourceLocation, StringRef> NextImportLoc
2466c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor    = SM.getModuleImportLoc(Loc);
2476c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  emitImportStackRecursively(NextImportLoc.first, NextImportLoc.second, SM);
2486c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor
2496c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  // Emit the inclusion text/note.
2506c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  emitImportLocation(Loc, PLoc, ModuleName, SM);
2516c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor}
2526c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor
2534565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor/// \brief Emit the module build stack, for cases where a module is (re-)built
254830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor/// on demand.
2554565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregorvoid DiagnosticRenderer::emitModuleBuildStack(const SourceManager &SM) {
2564565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor  ModuleBuildStack Stack = SM.getModuleBuildStack();
2574565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor  for (unsigned I = 0, N = Stack.size(); I != N; ++I) {
2584565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor    const SourceManager &CurSM = Stack[I].second.getManager();
2594565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor    SourceLocation CurLoc = Stack[I].second;
260830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor    emitBuildingModuleLocation(CurLoc,
261830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor                               CurSM.getPresumedLoc(CurLoc,
262830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor                                                    DiagOpts->ShowPresumedLoc),
2634565e487531c7bf6d348dbe9f5529784966fc7aeDouglas Gregor                               Stack[I].first,
264830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor                               CurSM);
265830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor  }
266830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor}
267830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor
26887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// A recursive function to trace all possible backtrace locations
26987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// to match the \p CaretLocFileID.
27087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic SourceLocation
27187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga NainarretrieveMacroLocation(SourceLocation Loc, FileID MacroFileID,
27287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                      FileID CaretFileID,
27387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                      const SmallVectorImpl<FileID> &CommonArgExpansions,
27487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                      bool IsBegin, const SourceManager *SM) {
27587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  assert(SM->getFileID(Loc) == MacroFileID);
27687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (MacroFileID == CaretFileID)
27787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return Loc;
27887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!Loc.isMacroID())
27987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return SourceLocation();
28087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
28187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation MacroLocation, MacroArgLocation;
28287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
28387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (SM->isMacroArgExpansion(Loc)) {
28487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // Only look at the immediate spelling location of this macro argument if
28587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // the other location in the source range is also present in that expansion.
28687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (std::binary_search(CommonArgExpansions.begin(),
28787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                           CommonArgExpansions.end(), MacroFileID))
28887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      MacroLocation = SM->getImmediateSpellingLoc(Loc);
28987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    MacroArgLocation = IsBegin ? SM->getImmediateExpansionRange(Loc).first
29087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                               : SM->getImmediateExpansionRange(Loc).second;
29187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  } else {
29287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    MacroLocation = IsBegin ? SM->getImmediateExpansionRange(Loc).first
29387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                            : SM->getImmediateExpansionRange(Loc).second;
29487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    MacroArgLocation = SM->getImmediateSpellingLoc(Loc);
29587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
29687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
29787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (MacroLocation.isValid()) {
29887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    MacroFileID = SM->getFileID(MacroLocation);
29987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    MacroLocation =
30087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar        retrieveMacroLocation(MacroLocation, MacroFileID, CaretFileID,
30187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                              CommonArgExpansions, IsBegin, SM);
30287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (MacroLocation.isValid())
30387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return MacroLocation;
30487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
30587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
30687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  MacroFileID = SM->getFileID(MacroArgLocation);
30787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return retrieveMacroLocation(MacroArgLocation, MacroFileID, CaretFileID,
30887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                               CommonArgExpansions, IsBegin, SM);
30987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
31087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
31187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// Walk up the chain of macro expansions and collect the FileIDs identifying the
31287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// expansions.
31387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic void getMacroArgExpansionFileIDs(SourceLocation Loc,
31487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                        SmallVectorImpl<FileID> &IDs,
31587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                        bool IsBegin, const SourceManager *SM) {
31687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  while (Loc.isMacroID()) {
31787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (SM->isMacroArgExpansion(Loc)) {
31887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      IDs.push_back(SM->getFileID(Loc));
31987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      Loc = SM->getImmediateSpellingLoc(Loc);
32087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    } else {
32187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      auto ExpRange = SM->getImmediateExpansionRange(Loc);
32287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      Loc = IsBegin ? ExpRange.first : ExpRange.second;
32387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    }
32487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
32587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
32687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
32787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// Collect the expansions of the begin and end locations and compute the set
32887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// intersection. Produces a sorted vector of FileIDs in CommonArgExpansions.
32987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic void computeCommonMacroArgExpansionFileIDs(
33087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    SourceLocation Begin, SourceLocation End, const SourceManager *SM,
33187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    SmallVectorImpl<FileID> &CommonArgExpansions) {
33287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SmallVector<FileID, 4> BeginArgExpansions;
33387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SmallVector<FileID, 4> EndArgExpansions;
33487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  getMacroArgExpansionFileIDs(Begin, BeginArgExpansions, /*IsBegin=*/true, SM);
33587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  getMacroArgExpansionFileIDs(End, EndArgExpansions, /*IsBegin=*/false, SM);
33687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  std::sort(BeginArgExpansions.begin(), BeginArgExpansions.end());
33787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  std::sort(EndArgExpansions.begin(), EndArgExpansions.end());
33887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  std::set_intersection(BeginArgExpansions.begin(), BeginArgExpansions.end(),
33987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                        EndArgExpansions.begin(), EndArgExpansions.end(),
34087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                        std::back_inserter(CommonArgExpansions));
34187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
34287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
3439cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// Helper function to fix up source ranges.  It takes in an array of ranges,
3449cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// and outputs an array of ranges where we want to draw the range highlighting
3459cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// around the location specified by CaretLoc.
3469cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman//
3479cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// To find locations which correspond to the caret, we crawl the macro caller
3489cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// chain for the beginning and end of each range.  If the caret location
3499cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// is in a macro expansion, we search each chain for a location
3509cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// in the same expansion as the caret; otherwise, we crawl to the top of
3519cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// each chain. Two locations are part of the same macro expansion
3529cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman// iff the FileID is the same.
3539cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedmanstatic void mapDiagnosticRanges(
3549cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman    SourceLocation CaretLoc,
355ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith    ArrayRef<CharSourceRange> Ranges,
35698cffc6b30dacd71434530fee368b1f7d03bd565Richard Smith    SmallVectorImpl<CharSourceRange> &SpellingRanges,
3579cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman    const SourceManager *SM) {
3589cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman  FileID CaretLocFileID = SM->getFileID(CaretLoc);
3599cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman
36087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (auto I = Ranges.begin(), E = Ranges.end(); I != E; ++I) {
36187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (I->isInvalid()) continue;
36287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
3639cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman    SourceLocation Begin = I->getBegin(), End = I->getEnd();
3649cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman    bool IsTokenRange = I->isTokenRange();
3659cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman
3660fdcd1e81db7b8f5b3fd05154d966b215b20a2ebEli Friedman    FileID BeginFileID = SM->getFileID(Begin);
3675bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem    FileID EndFileID = SM->getFileID(End);
3685bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem
3695bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem    // Find the common parent for the beginning and end of the range.
3705bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem
3715bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem    // First, crawl the expansion chain for the beginning of the range.
3725bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem    llvm::SmallDenseMap<FileID, SourceLocation> BeginLocsMap;
3735bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem    while (Begin.isMacroID() && BeginFileID != EndFileID) {
3745bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem      BeginLocsMap[BeginFileID] = Begin;
3755bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem      Begin = SM->getImmediateExpansionRange(Begin).first;
3765bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem      BeginFileID = SM->getFileID(Begin);
3775bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem    }
3785bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem
3795bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem    // Then, crawl the expansion chain for the end of the range.
3805bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem    if (BeginFileID != EndFileID) {
3815bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem      while (End.isMacroID() && !BeginLocsMap.count(EndFileID)) {
3825bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem        End = SM->getImmediateExpansionRange(End).second;
3835bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem        EndFileID = SM->getFileID(End);
3845bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem      }
3855bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem      if (End.isMacroID()) {
3865bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem        Begin = BeginLocsMap[EndFileID];
3875bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem        BeginFileID = EndFileID;
3885bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem      }
3895bdbc114da925304a774b726b0abb87d75bc3008Nadav Rotem    }
390ecdc8d3e0fc65610746a4e074491ca0807fca7b2Eli Friedman
39187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // Do the backtracking.
39287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    SmallVector<FileID, 4> CommonArgExpansions;
39387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    computeCommonMacroArgExpansionFileIDs(Begin, End, SM, CommonArgExpansions);
39487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    Begin = retrieveMacroLocation(Begin, BeginFileID, CaretLocFileID,
39587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                  CommonArgExpansions, /*IsBegin=*/true, SM);
39687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    End = retrieveMacroLocation(End, BeginFileID, CaretLocFileID,
39787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                CommonArgExpansions, /*IsBegin=*/false, SM);
39887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (Begin.isInvalid() || End.isInvalid()) continue;
3999cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman
4009cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman    // Return the spelling location of the beginning and end of the range.
4019cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman    Begin = SM->getSpellingLoc(Begin);
4029cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman    End = SM->getSpellingLoc(End);
40387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
4049cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman    SpellingRanges.push_back(CharSourceRange(SourceRange(Begin, End),
4059cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman                                             IsTokenRange));
4069cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman  }
4079cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman}
4089cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman
409ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smithvoid DiagnosticRenderer::emitCaret(SourceLocation Loc,
410ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith                                   DiagnosticsEngine::Level Level,
411ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith                                   ArrayRef<CharSourceRange> Ranges,
412ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith                                   ArrayRef<FixItHint> Hints,
413ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith                                   const SourceManager &SM) {
414ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith  SmallVector<CharSourceRange, 4> SpellingRanges;
415ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith  mapDiagnosticRanges(Loc, Ranges, SpellingRanges, &SM);
416ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith  emitCodeContext(Loc, Level, SpellingRanges, Hints, SM);
417ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith}
418ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith
41987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// \brief A helper function for emitMacroExpansion to print the
42087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// macro expansion message
42187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarvoid DiagnosticRenderer::emitSingleMacroExpansion(
42287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    SourceLocation Loc,
42387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    DiagnosticsEngine::Level Level,
42487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    ArrayRef<CharSourceRange> Ranges,
42587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    const SourceManager &SM) {
42687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Find the spelling location for the macro definition. We must use the
42787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // spelling location here to avoid emitting a macro backtrace for the note.
42887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation SpellingLoc = SM.getSpellingLoc(Loc);
42987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
43087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Map the ranges into the FileID of the diagnostic location.
43187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SmallVector<CharSourceRange, 4> SpellingRanges;
43287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  mapDiagnosticRanges(Loc, Ranges, SpellingRanges, &SM);
43387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
43487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SmallString<100> MessageStorage;
43587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  llvm::raw_svector_ostream Message(MessageStorage);
4364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StringRef MacroName =
4374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      Lexer::getImmediateMacroNameForDiagnostics(Loc, SM, LangOpts);
43887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (MacroName.empty())
43987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    Message << "expanded from here";
44087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  else
44187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    Message << "expanded from macro '" << MacroName << "'";
44287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
44387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  emitDiagnostic(SpellingLoc, DiagnosticsEngine::Note, Message.str(),
44487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 SpellingRanges, None, &SM);
44587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
44687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
44787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// Check that the macro argument location of Loc starts with ArgumentLoc.
44887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// The starting location of the macro expansions is used to differeniate
44987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// different macro expansions.
45087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic bool checkLocForMacroArgExpansion(SourceLocation Loc,
45187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                         const SourceManager &SM,
45287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                         SourceLocation ArgumentLoc) {
45387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation MacroLoc;
45487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (SM.isMacroArgExpansion(Loc, &MacroLoc)) {
45587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (ArgumentLoc == MacroLoc) return true;
45687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
45787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
45887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return false;
45987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
46087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
46187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// Check if all the locations in the range have the same macro argument
46287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// expansion, and that that expansion starts with ArgumentLoc.
46387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic bool checkRangeForMacroArgExpansion(CharSourceRange Range,
46487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                           const SourceManager &SM,
46587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                           SourceLocation ArgumentLoc) {
46687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation BegLoc = Range.getBegin(), EndLoc = Range.getEnd();
46787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  while (BegLoc != EndLoc) {
46887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (!checkLocForMacroArgExpansion(BegLoc, SM, ArgumentLoc))
46987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return false;
47087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    BegLoc.getLocWithOffset(1);
47187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
47287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
47387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return checkLocForMacroArgExpansion(BegLoc, SM, ArgumentLoc);
47487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
47587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
47687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// A helper function to check if the current ranges are all inside the same
47787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/// macro argument expansion as Loc.
47887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic bool checkRangesForMacroArgExpansion(SourceLocation Loc,
47987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                            ArrayRef<CharSourceRange> Ranges,
48087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                            const SourceManager &SM) {
48187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  assert(Loc.isMacroID() && "Must be a macro expansion!");
48287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
48387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SmallVector<CharSourceRange, 4> SpellingRanges;
48487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  mapDiagnosticRanges(Loc, Ranges, SpellingRanges, &SM);
48587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
48687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// Count all valid ranges.
48787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  unsigned ValidCount = 0;
48887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (auto I : Ranges)
48987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (I.isValid()) ValidCount++;
49087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
49187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (ValidCount > SpellingRanges.size())
49287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return false;
49387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
49487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// To store the source location of the argument location.
49587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SourceLocation ArgumentLoc;
49687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
49787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// Set the ArgumentLoc to the beginning location of the expansion of Loc
49887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// so to check if the ranges expands to the same beginning location.
49987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (!SM.isMacroArgExpansion(Loc,&ArgumentLoc))
50087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return false;
50187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
50287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (auto I = SpellingRanges.begin(), E = SpellingRanges.end(); I != E; ++I) {
50387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (!checkRangeForMacroArgExpansion(*I, SM, ArgumentLoc))
50487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return false;
50587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
50687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
50787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  return true;
50887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
50987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
5102898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// \brief Recursively emit notes for each macro expansion and caret
5112898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// diagnostics where appropriate.
5122898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek///
5132898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// Walks up the macro expansion stack printing expansion notes, the code
5142898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// snippet, caret, underlines and FixItHint display as appropriate at each
5152898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// level.
5162898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek///
5172898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// \param Loc The location for this caret.
5182898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// \param Level The diagnostic level currently being emitted.
5192898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// \param Ranges The underlined ranges for this code snippet.
5202898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek/// \param Hints The FixIt hints active for this diagnostic.
521ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smithvoid DiagnosticRenderer::emitMacroExpansions(SourceLocation Loc,
522ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith                                             DiagnosticsEngine::Level Level,
523ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith                                             ArrayRef<CharSourceRange> Ranges,
524ac31c8346f1ce3628b5a7fb862fefab5b94f8e82Richard Smith                                             ArrayRef<FixItHint> Hints,
52587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                                             const SourceManager &SM) {
52687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  assert(Loc.isValid() && "must have a valid source location here");
52787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
52887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  // Produce a stack of macro backtraces.
52987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SmallVector<SourceLocation, 8> LocationStack;
53087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  unsigned IgnoredEnd = 0;
53187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  while (Loc.isMacroID()) {
53287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // If this is the expansion of a macro argument, point the caret at the
53387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // use of the argument in the definition of the macro, not the expansion.
53487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (SM.isMacroArgExpansion(Loc))
53587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      LocationStack.push_back(SM.getImmediateExpansionRange(Loc).first);
53687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    else
53787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      LocationStack.push_back(Loc);
53887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
53987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (checkRangesForMacroArgExpansion(Loc, Ranges, SM))
54087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      IgnoredEnd = LocationStack.size();
54187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
54287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    Loc = SM.getImmediateMacroCallerLoc(Loc);
54387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
54487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // Once the location no longer points into a macro, try stepping through
54587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // the last found location.  This sometimes produces additional useful
54687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // backtraces.
54787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (Loc.isFileID())
54887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      Loc = SM.getImmediateMacroCallerLoc(LocationStack.back());
54987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    assert(Loc.isValid() && "must have a valid source location here");
5502898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek  }
551678839297204002df215e0be12bcd10b20a9a4a4Richard Smith
55287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  LocationStack.erase(LocationStack.begin(),
55387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                      LocationStack.begin() + IgnoredEnd);
55487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
55587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  unsigned MacroDepth = LocationStack.size();
55687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  unsigned MacroLimit = DiagOpts->MacroBacktraceLimit;
55787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (MacroDepth <= MacroLimit || MacroLimit == 0) {
55887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    for (auto I = LocationStack.rbegin(), E = LocationStack.rend();
55987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar         I != E; ++I)
56087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      emitSingleMacroExpansion(*I, Level, Ranges, SM);
5612898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek    return;
5622898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek  }
5639cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman
56487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  unsigned MacroStartMessages = MacroLimit / 2;
56587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  unsigned MacroEndMessages = MacroLimit / 2 + MacroLimit % 2;
566678839297204002df215e0be12bcd10b20a9a4a4Richard Smith
56787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (auto I = LocationStack.rbegin(),
56887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            E = LocationStack.rbegin() + MacroStartMessages;
56987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar       I != E; ++I)
57087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    emitSingleMacroExpansion(*I, Level, Ranges, SM);
5719cb1c3de9df7d944f0c5cccaf03fa414036487ebEli Friedman
57287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  SmallString<200> MessageStorage;
5732898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek  llvm::raw_svector_ostream Message(MessageStorage);
57487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Message << "(skipping " << (MacroDepth - MacroLimit)
57587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar          << " expansions in backtrace; use -fmacro-backtrace-limit=0 to "
57687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar             "see all)";
57787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  emitBasicNote(Message.str());
57887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
57987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (auto I = LocationStack.rend() - MacroEndMessages,
58087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            E = LocationStack.rend();
58187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar       I != E; ++I)
58287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    emitSingleMacroExpansion(*I, Level, Ranges, SM);
5832898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek}
5842898d4f7648e6ed5e9047068f1e8ee2f3c2bcd75Ted Kremenek
5858be51eab5ad34515d2a40dcdc8558128ca1800adTed KremenekDiagnosticNoteRenderer::~DiagnosticNoteRenderer() {}
5868be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek
5878be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenekvoid DiagnosticNoteRenderer::emitIncludeLocation(SourceLocation Loc,
58816afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis                                                 PresumedLoc PLoc,
58916afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis                                                 const SourceManager &SM) {
5908be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek  // Generate a note indicating the include location.
5918be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek  SmallString<200> MessageStorage;
5928be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek  llvm::raw_svector_ostream Message(MessageStorage);
5938be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek  Message << "in file included from " << PLoc.getFilename() << ':'
5948be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek          << PLoc.getLine() << ":";
59516afdf76b6f12e41ff6f6e6828bfb1d4732523baArgyrios Kyrtzidis  emitNote(Loc, Message.str(), &SM);
5968be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek}
5978be51eab5ad34515d2a40dcdc8558128ca1800adTed Kremenek
5986c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregorvoid DiagnosticNoteRenderer::emitImportLocation(SourceLocation Loc,
5996c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor                                                PresumedLoc PLoc,
6006c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor                                                StringRef ModuleName,
6016c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor                                                const SourceManager &SM) {
6026c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  // Generate a note indicating the include location.
6036c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  SmallString<200> MessageStorage;
6046c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  llvm::raw_svector_ostream Message(MessageStorage);
60587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Message << "in module '" << ModuleName;
60687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  if (PLoc.isValid())
60787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    Message << "' imported from " << PLoc.getFilename() << ':'
60887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar            << PLoc.getLine();
60987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  Message << ":";
6106c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor  emitNote(Loc, Message.str(), &SM);
6116c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor}
6126c3254316de2d0d554b19702f4b10117ae46b77bDouglas Gregor
613830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregorvoid
614830ea5b7c75413526c19531f0180fa6e45b98919Douglas GregorDiagnosticNoteRenderer::emitBuildingModuleLocation(SourceLocation Loc,
615830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor                                                   PresumedLoc PLoc,
616830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor                                                   StringRef ModuleName,
617830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor                                                   const SourceManager &SM) {
618830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor  // Generate a note indicating the include location.
619830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor  SmallString<200> MessageStorage;
620830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor  llvm::raw_svector_ostream Message(MessageStorage);
6214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  if (PLoc.isValid())
622651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Message << "while building module '" << ModuleName << "' imported from "
623651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            << PLoc.getFilename() << ':' << PLoc.getLine() << ":";
624651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  else
625176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    Message << "while building module '" << ModuleName << "':";
626830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor  emitNote(Loc, Message.str(), &SM);
627830ea5b7c75413526c19531f0180fa6e45b98919Douglas Gregor}
628