<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Wed, Nov 15, 2017 at 12:20 AM Manuel Klimek <<a href="mailto:klimek@google.com">klimek@google.com</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_quote"><div dir="ltr">On Wed, Nov 15, 2017 at 9:18 AM Manuel Klimek <<a href="mailto:klimek@google.com" target="_blank">klimek@google.com</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_quote"><div dir="ltr">On Tue, Nov 14, 2017 at 9:26 PM David Blaikie <<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</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_quote"><div dir="ltr">On Tue, Nov 14, 2017 at 1:04 AM Manuel Klimek <<a href="mailto:klimek@google.com" target="_blank">klimek@google.com</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"><span style="font-size:13px">On Tue, Nov 14, 2017, 12:53 AM David Blaikie <<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</a>> wrote:</span><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">Ping?<br><br>Richard & I decided that supporting this particular case of namespace-scope static variables in modular headers using modular codegen.</div></blockquote></div><div><br></div></div><div dir="ltr"><div>Part of the sentence is missing?</div></div></blockquote></div></div><div dir="ltr"><div class="gmail_quote"><div><br>Huh, right you are... <br><br>What I was going to say (but lost track through all the caveats/criteria): Richard & I decided that <stuff> is invalid (it's a legit ODR violation) & doesn't need to be supported.<br><br>(though there may still be issues with the non-ODR violation - such as the use of internal linkage namespace-scope reference variables... :/ )<br> </div></div></div><div dir="ltr"><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><br></div><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"> (specifically the case where the namespace-scope static variable is referenced from an inline function - thus making a true ODR violation (in classic C++ this'd be an ODR violation if more than one TU used that header - so it seems OK to not support this in modular codegen))<br></div></blockquote></div><div><br></div></div><div dir="ltr"><div>Calling is not an odr use, right? And I thought referencing alone doesn't lead to an odr violation?</div></div></blockquote></div></div><div dir="ltr"><div class="gmail_quote"><div><br>This is what the ASTMatcher code boils down to:<br><br>struct foo {<br>  foo();</div></div></div></blockquote></div></div></blockquote><div><br></div></div></div><div dir="ltr"><div class="gmail_quote"><div>Ah, here's the detail I missed: it actually boils down to</div><div>struct foo {</div><div>  ExpressionTemplateMatcherType operator()(...);</div><div>}</div><div>The only use of foo is by calling the operator on it.</div></div></div></blockquote><div><br>Right, yep yep (sorry I skipped over a few too many steps in my reduction/example). Calling a non-static member function is an ODR use, roughly equivalent to passing the value by reference to another function (much the same as returning by reference).<br><br>- Dave<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_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 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_quote"><div>};<br>const foo f; // this has internal linkage<br>const foo &x() { return f; }<br></div></div></div></blockquote><div><br></div></div></div><div dir="ltr"><div class="gmail_quote"><div>Where do we return matcher reference types?</div><div>This should just return foo by value?</div></div></div><div dir="ltr"><div class="gmail_quote"><div><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_quote"><div>if 'x' appears in more than one TU, it's an ODR violation because 'f' resolves to different entities in each TU so there are multiple distinct definitions of 'x'.<br><br>In this case, for example, 'f' is 'callExpr' (ASTMatchers.h:1138) and 'x' is the AST_POLYMORPHIC_MATCHER_P2 on ASTMatchers.h:3491 that uses 'callExpr' in an inline function in the header.<br></div></div></div></blockquote><div><br></div></div></div><div dir="ltr"><div class="gmail_quote"><div>That just calls callExpr() though, and never ODR uses it?</div></div></div><div dir="ltr"><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 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_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">If the namespace-scoped static variable is unreferenced from inline functions, that's fine - such as the iostreams global initializer.<br><br>I'll send a CR to move these definitions out of line.</div></blockquote></div><div><br></div></div><div dir="ltr"><div>I'm happy with that, too. I assume once c++17 hits the shelves we'll be able to replace it anyway?</div></div></blockquote></div></div><div dir="ltr"><div class="gmail_quote"><div><br>With inline variables? Yeah, I think so. Though I should test/figure out whether/how modular codegen will work with inline variables... <br> </div></div></div><div dir="ltr"><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><br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_quote"><div dir="ltr">On Thu, Nov 9, 2017 at 12:30 AM Manuel Klimek <<a href="mailto:klimek@google.com" target="_blank">klimek@google.com</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_quote"><div dir="ltr">On Thu, Nov 9, 2017 at 12:43 AM David Blaikie <<a href="mailto:dblaikie@gmail.com" target="_blank">dblaikie@gmail.com</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">Hey Manuel,<br><br>In an effort to apply Modular Code Generation to Clang internally, I came across the fact that this header contains a bunch of internal linkage variables. (now, maybe modular code generation should be compatible with internal linkage namespace-scoped variables... I'm looking into that)<br><br>These variables technically create ODR violations any time they're ODR-used in another inline function used in more than one translation unit.<br><br>Is there a good way we could fix this header so it doesn't create ODR violations (hopefully by not containing internal linkage entities)? I mean one simple solution is to declare all these things in a header and define them out of line. Since they have no actual state, that's probably pretty low-cost except for a lot of duplication. I'm happy to use a .def/.inc file to help remove a bunch of that duplication, if useful.<br></div></blockquote><div><br></div></div></div><div dir="ltr"><div class="gmail_quote"><div>I remember having that argument a long time ago with somebody (perhaps Sam (cc'ed)?)</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
</blockquote></div></div>
</blockquote></div>
</blockquote></div></div></blockquote></div></div></blockquote></div></div></blockquote></div></div></blockquote></div></div>