Chris Lattner a écrit : > 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: >
It would definitively be useful in some case. For example, I wrote some Boost PP (preprocessor programming) code some time ago, and it was nearly impossible to understand what, when and why an instantiation went wrong. This would help. > #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); > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
