[cfe-commits] r64761 - /cfe/trunk/lib/Driver/TextDiagnosticPrinter.cpp

Chris Lattner sabre at nondot.org
Tue Feb 17 00:44:52 PST 2009


Author: lattner
Date: Tue Feb 17 02:44:50 2009
New Revision: 64761

URL: http://llvm.org/viewvc/llvm-project?rev=64761&view=rev
Log:
As an experimental hack, emit "instantiated from" information in
diagnostics.  I'm not sure I want to keep this, but hey, it's easy
and could be useful or something, even if guarded by a 
-fshow-me-tons-of-details option.  A silly example is:

#define A B
#define C A
#define D C

int y = D;

We now emit:

t.c:11:9: error: use of undeclared identifier 'B'
int y = D;
        ^
t.c:9:11: note: instantiated from:
#define D C
          ^
t.c:8:11: note: instantiated from:
#define C A
          ^
t.c:7:11: note: instantiated from:
#define A B
          ^

A more useful example is from tgmath:

t.c:4:9: error: no matching function for call to '__tg_acos'
 return acos(x);
        ^~~~~~~
/Users/sabre/llvm/Debug/Headers/tgmath-sofar.h:51:17: note: instantiated from:
#define acos(x) __tg_acos(x)
                ^
.. candidate set follows ...

This does not yet print ranges in instantiation info, (e.g. highlighting the
range "__tg_acos(x)" in the last example), but that could be added if we 
decide this is a good idea :).

Thoughts and bug reports welcome!


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

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

==============================================================================
--- cfe/trunk/lib/Driver/TextDiagnosticPrinter.cpp (original)
+++ cfe/trunk/lib/Driver/TextDiagnosticPrinter.cpp Tue Feb 17 02:44:50 2009
@@ -104,9 +104,25 @@
 void TextDiagnosticPrinter::EmitCaretDiagnostic(const DiagnosticInfo &Info,
                                                 SourceLocation Loc,
                                                 SourceManager &SM) {
+  assert(!Loc.isInvalid() && "must have a valid source location here");
+  
   // We always emit diagnostics about the instantiation points, not the spelling
   // points.  This more closely correlates to what the user writes.
-  Loc = SM.getInstantiationLoc(Loc);
+  if (!Loc.isFileID()) {
+    SourceLocation OneLevelUp;
+    OneLevelUp = SM.getImmediateInstantiationRange(Loc).first;
+    
+    EmitCaretDiagnostic(Info, OneLevelUp, SM);
+    
+    Loc = SM.getInstantiationLoc(SM.getImmediateSpellingLoc(Loc));
+    
+    // Emit the file/line/column that this expansion came from.
+    OS << SM.getBufferName(Loc) << ':' << SM.getInstantiationLineNumber(Loc)
+       << ':';
+    if (ShowColumn)
+      OS << SM.getInstantiationColumnNumber(Loc) << ':';
+    OS << " note: instantiated from:\n";
+  }
   
   // Decompose the location into a FID/Offset pair.
   std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc);





More information about the cfe-commits mailing list