<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 15, 2014 at 6:41 AM, Stephan Bergmann <span dir="ltr"><<a href="mailto:sbergman@redhat.com" target="_blank">sbergman@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">BaseAndFieldInfo::<u></u>addFieldInitializer (lib/Sema/SemaDeclCXX.cpp) contains<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
    // Check whether this initializer makes the field "used".<br>
    if (Init->getInit()-><u></u>HasSideEffects(S.Context))<br>
      S.UnusedPrivateFields.remove(<u></u>Init->getAnyMember());<br>
</blockquote>
<br>
which filters out of the list of unused private member variables those with initializers that potentially incur side effects.  That is, in<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
int f();<br>
class C {<br>
    int i, j;<br>
public:<br>
    C(): i(f()), j(1) {}<br>
};<br>
</blockquote>
<br>
clang++ -Wall will emit a -Wunused-private-field for j but not for i.<br>
<br>
Is that behavior intended?  (Member variables of class type, where the constructor itself may have side effects, are already exempted from the UnusedPrivateFields list via the InitializationHasSideEffects() check elsewhere in lib/Sema/SemaDeclCXX.cpp.)<br>
<br>
Of course, such a warning cannot in general be addressed by naively removing the member variable along with any initializers, but that is no different to e.g. -Wunused-variable, which does get emitted for<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
int f();<br>
void g() {<br>
    int i(f());<br>
}<br>
</blockquote>
<br>
One arcane legitimate reason to not emit a -Wunused-private-field could be a case where f() needs to be called for side effects between construction of two other members, as in<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
int f();<br>
struct S1 { /*...*/ };<br>
struct S2 { /*...*/ };<br>
class C {<br>
    S1 s1;<br>
    int dummy;<br>
    S2 s2;<br>
public:<br>
    C(): s1(), dummy(f()), s2() {}<br></blockquote></blockquote><div><br></div><div>This could still be achieved assuming s2 was at least move constructible:<br><br>s2([]{f(); return S2(); }());</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
};<br>
</blockquote>
<br>
but that could arguably be required to use a  __attribute__((unused)).<br></blockquote><div><br>But that seems not unreasonable as well.<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Stephan<br>
______________________________<u></u>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu" target="_blank">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailman/listinfo/cfe-dev</a><br>
</blockquote></div><br></div></div>