<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<p><br>
</p>
<br>
<div class="moz-cite-prefix">On 12/12/2017 01:38 PM, Mikhail
Zolotukhin via llvm-dev wrote:<br>
</div>
<blockquote type="cite"
cite="mid:5F810B87-0AD8-4BCF-812E-8BF413B2A4A9@apple.com">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<br class="">
<div>
<blockquote type="cite" class="">
<div class="">On Dec 12, 2017, at 12:57 PM, James Y Knight
<<a href="mailto:jyknight@google.com" class=""
moz-do-not-send="true">jyknight@google.com</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div dir="ltr" class=""><br class="">
<div class="gmail_extra"><br class="">
<div class="gmail_quote">On Mon, Dec 11, 2017 at 3:37
PM, Mikhail Zolotukhin via cfe-dev <span dir="ltr"
class=""><<a href="mailto:cfe-dev@lists.llvm.org"
target="_blank" class="" moz-do-not-send="true">cfe-dev@lists.llvm.org</a>></span>
wrote:<br class="">
<blockquote class="gmail_quote" style="margin:0px 0px
0px 0.8ex;border-left:1px solid
rgb(204,204,204);padding-left:1ex">
<div style="word-wrap:break-word" class="">Hi Kim,
<div class=""><br class="">
<div class=""><span class="gmail-">
<blockquote type="cite" class="">
<div class="">On Dec 10, 2017, at 7:39 AM,
Kim Gräsman <<a
href="mailto:kim.grasman@gmail.com"
target="_blank" class=""
moz-do-not-send="true">kim.grasman@gmail.com</a>>
wrote:</div>
<br
class="gmail-m_8798084079379340611Apple-interchange-newline">
<div class="">
<div class="">Hi Michael,<br class="">
<br class="">
On Thu, Dec 7, 2017 at 3:16 AM,
Michael Zolotukhin<br class="">
<<a
href="mailto:mzolotukhin@apple.com"
target="_blank" class=""
moz-do-not-send="true">mzolotukhin@apple.com</a>>
wrote:<br class="">
<blockquote type="cite" class=""><br
class="">
Nice to IWYU developers here:) I
wonder how hard it would be to run
IWYU on<br class="">
LLVM/Clang (or, if it’s supposed to
work, I wonder what I did wrong).<br
class="">
</blockquote>
<br class="">
There are known problems with running
IWYU over LLVM/Clang -- Zachary<br
class="">
Turner made an attempt a while back to
get it up and running. Since<br
class="">
the LLVM tree uses all sorts of modern
and moderately complex<br class="">
patterns, we're struggling to keep up.<br
class="">
</div>
</div>
</blockquote>
</span>I see.<span class="gmail-"><br class="">
<blockquote type="cite" class="">
<div class="">
<div class=""><br class="">
<blockquote type="cite" class="">If we
also can tweak it a bit to make it
choose more human-like (~more<br
class="">
conservative) decisions, we would be
able to just apply what it suggests!<br
class="">
</blockquote>
<br class="">
Different humans appear to have
different preferences :)<br class="">
</div>
</div>
</blockquote>
</span>True, what I meant hear is to make the
changes more conservative: e.g. if we can
replace</div>
<div class=""><font class="" face="Menlo">#include
"MyClass.h"</font></div>
<div class="">with </div>
<div class=""><font class="" face="Menlo">class
MyClass;</font></div>
<div class="">then this change is probably
desirable in every way: it documents the code
better, it decreases coupling, it improves
compile time.</div>
</div>
</div>
</blockquote>
<div class=""><br class="">
</div>
<div class="">This is not a transform which is clearly
"desirable in every way", because it _increases_
coupling between the user of the class and the
implementation. The owner of the class can't add
optional template arguments, change a class into a
typedef, change the namespace, or other such
refactorings. It also introduces the possibility of
code which changes behavior depending on whether the
full or forward decl are available (which, then, may
be an ODR-violation).</div>
<div class=""><br class="">
</div>
<div class="">Effectively the same reasons why the
standard forbids users from forward-declaring std::
names apply to doing so to user-defined names.<br
class="">
</div>
<div class=""><br class="">
</div>
<div class=""><a
href="https://google.github.io/styleguide/cppguide.html#Forward_Declarations"
class="" moz-do-not-send="true">https://google.github.io/styleguide/cppguide.html#Forward_Declarations</a>
lists some of the issues, and a recommendation not
to do so.<br class="">
</div>
<div class=""><br class="">
</div>
<div class="">Of course you do have the upside is that
it can improve compile time. Which is certainly of
value, and perhaps that's a worthwhile trade-off
when the implementation and forward-declare are both
within a single project and thus easy to coordinate.
But, it's not by any means a _pure_ win.</div>
</div>
</div>
</div>
</div>
</blockquote>
That's correct. I was speaking about the LLVM codebase though (I
should've stated that clearer), and in LLVM I don't remember
many occasions of refactorings you mentioned. For LLVM forward
declaration is recommended by the style guide:</div>
<div><a
href="http://llvm.org/docs/CodingStandards.html#minimal-list-of-includes"
class="" moz-do-not-send="true">http://llvm.org/docs/CodingStandards.html#minimal-list-of-includes</a></div>
<br>
</blockquote>
As an aside, there is a standard idiom used in some code bases which
might be applicable.<br>
<br>
For each header "Header.h" which contains a class MyClass, you
introduce a header called "Header.FwdDecls.h" which contains forward
decls for all of the classes declared in the header. There are also
variants which declare "MyClass.FwdDecl.h". Both of these schemes
have the advantage of only putting the forward decl in one place
while reducing the transitive include set greatly. I've seen
environments where these forward decl headers are automatically
generated by the build system.<br>
<br>
Philip<br>
</body>
</html>