Re: [RFC PATCH 12/13] blk-mq.h: Fix parentheses around macro parameter use

From: Mathieu Desnoyers
Date: Fri May 05 2023 - 16:08:13 EST


On 2023-05-05 15:54, Linus Torvalds wrote:
On Fri, May 5, 2023 at 11:49 AM Mathieu Desnoyers
<mathieu.desnoyers@xxxxxxxxxxxx> wrote:

[...]

The other exception I would add is when a parameter is used as an
lvalue, as:

#define m(x) do { x = 2; } while (0)

I really don't understand why you think '=' is so special. It's very
much not special.

It happens to have the lowest precedence, sure, but the keyword is "happens".

I think you are confused by the non-C languages that make assignment
be not an expression operator, but a statement.

The reason why I think the lvalue of a "=" operator can be argued to be "special" is because it is simply invalid to apply many of the C operators to an lvalue (e.g. +, -, /, ...), which leads me to think that there are no valid lvalue parameters which can cause unexpected operator precedence.

That being said, just having to *think* about it is wasted brain power, so I am in favor of just adding the parentheses for lvalues as well.

So I think you are technically correct in that the parentheses aren't
_needed_, but the above is still the same case that in many other
situations parentheses aren't technically *needed*, but not having to
think about it is better than having to do so.

Yes, so no exception for the lvalue of an assignment, therefore giving:

#define m(x) do { (x) = 2; } while (0)

If we are OK with this, I will go ahead and update my patch set accordingly.

Thanks,

Mathieu

--
Mathieu Desnoyers
EfficiOS Inc.
https://www.efficios.com