[cfe-commits] r45901 - in /cfe/trunk/Driver: TextDiagnosticPrinter.cpp TextDiagnosticPrinter.h

Chris Lattner sabre at nondot.org
Fri Jan 11 22:43:35 PST 2008


Author: lattner
Date: Sat Jan 12 00:43:35 2008
New Revision: 45901

URL: http://llvm.org/viewvc/llvm-project?rev=45901&view=rev
Log:
When forming the squigly underline for a diagnostic, make sure to
verify that the source range corresponds to the current file, not
just the current line.  This allows us to emit:

a.c:1:44: error: invalid operands to binary expression ('double' and 'int *')
double a; int *b; void f(void) { int c = a +
                                         ~ ^

instead of:

a.c:1:44: error: invalid operands to binary expression ('double' and 'int *')
double a; int *b; void f(void) { int c = a +
~                                        ~ ^

for PR1906 (note the leading ~).

Thanks to Neil for noticing this.

Modified:
    cfe/trunk/Driver/TextDiagnosticPrinter.cpp
    cfe/trunk/Driver/TextDiagnosticPrinter.h

Modified: cfe/trunk/Driver/TextDiagnosticPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/TextDiagnosticPrinter.cpp?rev=45901&r1=45900&r2=45901&view=diff

==============================================================================
--- cfe/trunk/Driver/TextDiagnosticPrinter.cpp (original)
+++ cfe/trunk/Driver/TextDiagnosticPrinter.cpp Sat Jan 12 00:43:35 2008
@@ -47,19 +47,23 @@
 /// HighlightRange - Given a SourceRange and a line number, highlight (with ~'s)
 /// any characters in LineNo that intersect the SourceRange.
 void TextDiagnosticPrinter::HighlightRange(const SourceRange &R,
-                                          SourceManager& SourceMgr,
-                                           unsigned LineNo,
+                                           SourceManager& SourceMgr,
+                                           unsigned LineNo, unsigned FileID,
                                            std::string &CaratLine,
                                            const std::string &SourceLine) {  
   assert(CaratLine.size() == SourceLine.size() &&
          "Expect a correspondence between source and carat line!");
   if (!R.isValid()) return;
 
-  unsigned StartLineNo = SourceMgr.getLogicalLineNumber(R.getBegin());
-  if (StartLineNo > LineNo) return;  // No intersection.
-  
-  unsigned EndLineNo = SourceMgr.getLogicalLineNumber(R.getEnd());
-  if (EndLineNo < LineNo) return;  // No intersection.
+  SourceLocation LogicalStart = SourceMgr.getLogicalLoc(R.getBegin());
+  unsigned StartLineNo = SourceMgr.getLineNumber(LogicalStart);
+  if (StartLineNo > LineNo || LogicalStart.getFileID() != FileID)
+    return;  // No intersection.
+  
+  SourceLocation LogicalEnd = SourceMgr.getLogicalLoc(R.getEnd());
+  unsigned EndLineNo = SourceMgr.getLineNumber(LogicalEnd);
+  if (EndLineNo < LineNo || LogicalStart.getFileID() != FileID)
+    return;  // No intersection.
   
   // Compute the column number of the start.
   unsigned StartColNo = 0;
@@ -107,11 +111,13 @@
                                              const SourceRange *Ranges,
                                              unsigned NumRanges) {
   unsigned LineNo = 0, ColNo = 0;
+  unsigned FileID = 0;
   const char *LineStart = 0, *LineEnd = 0;
   
   if (Pos.isValid()) {
     FullSourceLoc LPos = Pos.getLogicalLoc();
     LineNo = LPos.getLineNumber();
+    FileID = LPos.getLocation().getFileID();
     
     // First, if this diagnostic is not in the main file, print out the
     // "included from" lines.
@@ -163,7 +169,8 @@
     
     // Highlight all of the characters covered by Ranges with ~ characters.
     for (unsigned i = 0; i != NumRanges; ++i)
-      HighlightRange(Ranges[i], Pos.getManager(),LineNo, CaratLine, SourceLine);
+      HighlightRange(Ranges[i], Pos.getManager(), LineNo, FileID,
+                     CaratLine, SourceLine);
     
     // Next, insert the carat itself.
     if (ColNo-1 < CaratLine.size())

Modified: cfe/trunk/Driver/TextDiagnosticPrinter.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/TextDiagnosticPrinter.h?rev=45901&r1=45900&r2=45901&view=diff

==============================================================================
--- cfe/trunk/Driver/TextDiagnosticPrinter.h (original)
+++ cfe/trunk/Driver/TextDiagnosticPrinter.h Sat Jan 12 00:43:35 2008
@@ -30,7 +30,7 @@
 
   void HighlightRange(const SourceRange &R,
                       SourceManager& SrcMgr,
-                      unsigned LineNo,
+                      unsigned LineNo, unsigned FileID,
                       std::string &CaratLine,
                       const std::string &SourceLine);
 





More information about the cfe-commits mailing list