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!)

llvm-svn: 65090
This commit is contained in:
Chris Lattner 2009-02-20 00:25:28 +00:00
parent f5a5c4fa11
commit 464ceb4ec8
2 changed files with 13 additions and 2 deletions

View File

@ -47,7 +47,7 @@ public:
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,

View File

@ -102,7 +102,7 @@ void TextDiagnosticPrinter::HighlightRange(const SourceRange &R,
}
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 @@ void TextDiagnosticPrinter::EmitCaretDiagnostic(SourceLocation Loc,
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)