<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Nov 26, 2014 at 6:52 AM, Aaron Ballman <span dir="ltr"><<a href="mailto:aaron@aaronballman.com" target="_blank">aaron@aaronballman.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class="">On Tue, Nov 25, 2014 at 9:59 PM, Richard Trieu <<a href="mailto:rtrieu@google.com">rtrieu@google.com</a>> wrote:<br>
> After running some code through a Clang with this patch, a few issues came<br>
> up:<br>
<br>
</span>Thank you!<br>
<span class=""><br>
><br>
> 1) This warning should likely be disabled in macros.  Some macros will<br>
> perform a sizeof on the macro argument which will trigger this warning even<br>
> if argument is used elsewhere in the macro expansion.<br>
<br>
</span>Can you point me to an example of this? It seems like a reasonable<br>
idea, but I'd like to better understand the code patterns before I<br>
make the changes.<br></blockquote><div><br></div><div>Something like:</div><div><br></div><div>int check_small_size(int x);</div><div>long check_large_size(long x);</div><div><br></div><div>#define bar(x) \</div><div>    if (sizeof(x) < 4) \</div><div>      check_small_size((x)); \</div><div>    else \</div><div>      check_large_size((x));</div><div><br></div><div>void foo (const char * str) {</div><div>  int x = 0;</div><div>  bar(str[x++]);</div><div>}</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<span class=""><br>
><br>
> 2) This warning is counting a dereference of a volatile pointer as a side<br>
> effect, for instance:<br>
>   int* volatile x;<br>
>   return sizeof(*x);<br>
<br>
</span>Good catch!<br>
<span class=""><br>
><br>
> 3) This hits an llvm_unreachable:<br>
><br>
> template <typename T> void F(T t) {}<br>
> template <typename T> void G(T t) { decltype(&F<T>) x; }<br>
> template <typename T> class V {};<br>
> void foo() { G(V<int>()); }<br>
><br>
> shouldn't see dependent / unresolved nodes here<br>
> UNREACHABLE executed at ../tools/clang/lib/AST/Expr.cpp:2891!<br>
<br>
</span>Good catch, thanks!<br>
<span class=""><font color="#888888"><br>
~Aaron<br>
</font></span><div class=""><div class="h5">><br>
><br>
> On Tue, Nov 25, 2014 at 6:51 AM, Aaron Ballman <<a href="mailto:aaron@aaronballman.com">aaron@aaronballman.com</a>><br>
> wrote:<br>
>><br>
>> The attached patch adds a -Wunused-value warning when an expression<br>
>> with side effects is used in an unevaluated expression context, such<br>
>> as sizeof(), or decltype(). It mostly reuses the logic from<br>
>> Expr::HasSideEffects, except with a flag that treats certain<br>
>> expressions as not having side effects -- mostly<br>
>> instantiation-dependent contexts, and function call-like operations.<br>
>><br>
>> int f();<br>
>> int j = 0;<br>
>><br>
>> (void)sizeof(f()); // Ok<br>
>> (void)sizeof(++j); // Warn<br>
>> (void)sizeof(int[++j]); // Ok<br>
>><br>
>> I've added support for: sizeof, typeid, _Generic, _Alignof, noexcept,<br>
>> and decltype.<br>
>><br>
>> ~Aaron<br>
><br>
><br>
</div></div></blockquote></div><br></div></div>