<div dir="auto"><div><br><br><div class="gmail_quote"><div dir="ltr">On Mon, Apr 9, 2018, 20:15 Nico Weber <<a href="mailto:thakis@chromium.org">thakis@chromium.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Apr 9, 2018 at 2:06 PM, Sam McCall via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank" rel="noreferrer">cfe-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>I never felt that I completely understood the code I wrote/reviewed in tools dealing with SourceLocation. And clangd has had several bugs that boil down to wrong locations in the presence of macros.</div><div><br></div><div>I couldn't find a good guide for how to think about them, so I spent a while reading the source code and wrote a tool to visualize them, which helped me a lot:</div><div>  <a href="https://imgur.com/f3cXp7E" target="_blank" rel="noreferrer">https://imgur.com/f3cXp7E</a></div></div></blockquote><div><br></div><div>More documentation is always good, but I for one have no idea what's going on in that image, and I like to think that I mostly understand SourceLocation :-)</div></div></div></div></blockquote></div></div><div dir="auto">That's very useful feedback!</div><div dir="auto"></div><div dir="auto">It definitely needs some work, and some text.</div><div dir="auto">But maybe it's just the wrong model.</div><div dir="auto"><br></div><div dir="auto">The idea is that SourceLocation is just a (FileID, offset) pair, and everyone knows how files and offsets work. So the difficult part is understanding the real and "virtual" files (SLocEntry) and how they relate to each other.</div><div dir="auto"><br></div><div dir="auto">The nodes in the diagram are the SLocEntrys in an example program (the main.cpp file).</div><div dir="auto">The text contents are shown, this is what a (FileID, offset) pair indexes into. (For expansions, this is the spelling).</div><div dir="auto"><br></div><div dir="auto">The black edges are (immediate) expansion location. This forms the logical macro expression tree that everyone is familiar with. Partial traversal can be useful/meaningful.</div><div dir="auto">Labels show what expression in the parent is being substituted.</div><div dir="auto"><br></div><div dir="auto">Yellow edges show (immediate) spelling location. As far as I can tell, these are mainly useful a) to get the content of expansion SLocEntrys which don't have buffers and b) to produce diagnostics that reference actual source code. But partial traversal here doesn't seem to be useful.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><br></div><div>(black edges are expansion, yellow edges are source)</div><div><br></div><div>Did I miss some documentation of this concept?</div><div>Would it be worth writing up an article illustrated with some examples, to add to <a href="http://llvm.org" target="_blank" rel="noreferrer">llvm.org</a>? Maybe this is niche or well-understood, interested in what others think.</div></div>
<br>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank" rel="noreferrer">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
<br></blockquote></div><br></div></div>
</blockquote></div></div></div>