forked from OSchip/llvm-project
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:
parent
f5a5c4fa11
commit
464ceb4ec8
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue