[cfe-dev] Unused expression and comma operator

Chris Lattner clattner at apple.com
Thu Nov 15 09:19:11 PST 2007


On Nov 15, 2007, at 3:22 AM, Sanghyeon Seo wrote:

> This issue is similar to that of conditional operator I raised before.
> I concede that "a ? b : c" can be warned as unused expression even if
> b or c have side effects, since computation done by ?: itself is
> unused.

Ok.

> How about "a, b"?

I don't consider "," to be as clear-cut as "?:".

> #define luaZ_initbuffer(L, buff) ((buff)->buffer = NULL, (buff)- 
> >buffsize = 0)
> luaZ_initbuffer(L, &p.buff);
>
> Comma operators are often used in preprocessor macro. If "a, b" is
> changed to "a; b", people who use macro as if it is function in codes
> like "if (condition) macro(...)" without braces will get a nasty
> surprise.
>
> I think the standard way to replace "a, b" is "do { a; b; }
> while(0);". But should this warn?
>
> http://c2.com/cgi/wiki?TrivialDoWhileLoop discusses comma operators,
> do while loop, and related tricks in detail.

There are two different ways to handle this.  One is to allow the  
comma operator.  However, if a 'dead' comma is allowed, the checker  
should recursively check that no operands are unused expressions.  We  
should warn on "foo(), 4+5;".

Alternatively, and probably better: just silence the warning if the  
operator is a comma that came from a macro expansion.  You can check  
this by using SourceLocation::isMacroID() on the comma's location.

-Chris



More information about the cfe-dev mailing list