map source ranges through macro expansions.  Before:

t.m:5:2: error: invalid operands to binary expression ('typeof(P)' (aka 'struct mystruct') and 'typeof(F)' (aka 'float'))
 MAX(P, F);
 ^~~~~~~~~
t.m:1:78: note: instantiated from:
#define MAX(A,B)    ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __b : __a; })
                                                                             ^

(no ranges on the second diagnostics)

After:

t.m:5:2: error: invalid operands to binary expression ('typeof(P)' (aka 'struct mystruct') and 'typeof(F)' (aka 'float'))
 MAX(P, F);
 ^~~~~~~~~
t.m:1:78: note: instantiated from:
#define MAX(A,B)    ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a < __b ? __b : __a; })
                                                                         ~~~ ^ ~~~

(ranges!)



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65090 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/clang/Driver/TextDiagnosticPrinter.h b/include/clang/Driver/TextDiagnosticPrinter.h
index 3f4f06a..8d702b4 100644
--- a/include/clang/Driver/TextDiagnosticPrinter.h
+++ b/include/clang/Driver/TextDiagnosticPrinter.h
@@ -47,7 +47,7 @@
                       const std::string &SourceLine);
 
   void EmitCaretDiagnostic(SourceLocation Loc, 
-                           const SourceRange *Ranges, unsigned NumRanges,
+                           SourceRange *Ranges, unsigned NumRanges,
                            SourceManager &SM);
   
   virtual void HandleDiagnostic(Diagnostic::Level DiagLevel,
diff --git a/lib/Driver/TextDiagnosticPrinter.cpp b/lib/Driver/TextDiagnosticPrinter.cpp
index 31b492a..b5226f5 100644
--- a/lib/Driver/TextDiagnosticPrinter.cpp
+++ b/lib/Driver/TextDiagnosticPrinter.cpp
@@ -102,7 +102,7 @@
 }
 
 void TextDiagnosticPrinter::EmitCaretDiagnostic(SourceLocation Loc,
-                                                const SourceRange *Ranges,
+                                                SourceRange *Ranges,
                                                 unsigned NumRanges,
                                                 SourceManager &SM) {
   assert(!Loc.isInvalid() && "must have a valid source location here");
@@ -113,7 +113,18 @@
     SourceLocation OneLevelUp = SM.getImmediateInstantiationRange(Loc).first;
     EmitCaretDiagnostic(OneLevelUp, Ranges, NumRanges, SM);
     
+    // Map the location through the macro.
     Loc = SM.getInstantiationLoc(SM.getImmediateSpellingLoc(Loc));
+
+    // Map the ranges.
+    for (unsigned i = 0; i != NumRanges; ++i) {
+      SourceLocation S = Ranges[i].getBegin(), E = Ranges[i].getEnd();
+      if (S.isMacroID())
+        S = SM.getInstantiationLoc(SM.getImmediateSpellingLoc(S));
+      if (E.isMacroID())
+        E = SM.getInstantiationLoc(SM.getImmediateSpellingLoc(E));
+      Ranges[i] = SourceRange(S, E);
+    }
     
     // Emit the file/line/column that this expansion came from.
     OS << SM.getBufferName(Loc) << ':' << SM.getInstantiationLineNumber(Loc)