From 55dcef08676aa4d8d6777931c532d6df9571cf8d Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 17 Feb 2009 08:44:50 +0000 Subject: [PATCH] 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! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64761 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Driver/TextDiagnosticPrinter.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/Driver/TextDiagnosticPrinter.cpp b/lib/Driver/TextDiagnosticPrinter.cpp index c6a8a23fac..a9d011a6cb 100644 --- a/lib/Driver/TextDiagnosticPrinter.cpp +++ b/lib/Driver/TextDiagnosticPrinter.cpp @@ -104,9 +104,25 @@ void TextDiagnosticPrinter::HighlightRange(const SourceRange &R, 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 LocInfo = SM.getDecomposedLoc(Loc); -- 2.50.1