[cfe-dev] The Conditional Operator and Unused Results

Pierre Habouzit madcoder at madism.org
Sat Oct 2 16:44:23 PDT 2010


On Sat, Oct 02, 2010 at 02:51:36PM -0600, Justin Bogner wrote:
> Chris Lattner <clattner at apple.com> writes:
> > What is the real-world code you're seeing this on, and what diagnostic are you getting?
> 
> There are two cases in the code base I was compiling. The first is
> setting up a threading domain, of which the relevent bits are simply:
> 
>     #define _GNU_SOURCE
>     #include <sched.h>
>     extern cpu_set_t cpuMask;
>     
>     void setCpuAffinity(const int cpu)
>     {
>         CPU_ZERO( &cpuMask );
>         CPU_SET( cpu, &cpuMask );  
>     }
> 
> This gives me:
> 
>     $ ./Debug+Asserts/bin/clang -fsyntax-only ~/tmp/cpuset.c 
>     /home/bogner/tmp/cpuset.c:8:5: warning: expression result unused [-Wunused-value]
>         CPU_SET( cpu, &cpuMask );  
>         ^~~~~~~~~~~~~~~~~~~~~~~~
>     In file included from /home/bogner/tmp/cpuset.c:2:
>     /usr/include/sched.h:72:33: note: instantiated from:
>     # define CPU_SET(cpu, cpusetp)   __CPU_SET_S (cpu, sizeof (cpu_set_t), cpusetp)
>                                      ^
>     In file included from /home/bogner/tmp/cpuset.c:2:
>     In file included from /usr/include/sched.h:35:
>     /usr/include/bits/sched.h:145:9: note: instantiated from:
>           : 0; }))
>             ^
>     1 warning generated.
> 
> This is the more serious case, because It's not easy to suppress
> warnings from standard headers. The other case involved an iterator
> foreach macro, which has something like:
> 
>     for (...; ...; doNextIteration ? ++i : i)
> 
> This one's not so bad, as I can change it to:
> 
>     for (...; ...; (void)(doNextIteration ? ++i : i))

I opened http://llvm.org/bugs/show_bug.cgi?id=8218 about this a few days
ago. GCC heuristic seems that the return value of an expression
statement not being used is just fine.

And like I say in the bug report it makes sense because expression
statements are usually used through a macro, that looks like a funcall,
and well, if clang doesn't warn if you don't catch the return value of a
function call, then it shouldn't warn if you don't catch the return
value of an expression statement.
-- 
·O·  Pierre Habouzit
··O                                                madcoder at debian.org
OOO                                                http://www.madism.org



More information about the cfe-dev mailing list