Re: [PATCH 4/5] drivers: staging: erofs: Fix parentheses error in macro

From: Joe Perches
Date: Tue Dec 11 2018 - 10:49:08 EST


On Tue, 2018-12-11 at 19:06 +0800, Gao Xiang wrote:
> Hi Aaron,
>
> On 2018/12/11 18:54, Aaron Strahlberger wrote:
> > Fix of ERROR: Macros with complex values should be enclosed in parentheses
> > from checkpatch.pl
[]
> > diff --git a/drivers/staging/erofs/erofs_fs.h b/drivers/staging/erofs/erofs_fs.h
[]
> > @@ -38,9 +38,9 @@ struct erofs_super_block {
> > /* 80 */__u8 reserved2[48]; /* 128 bytes */
> > } __packed;
> >
> > -#define __EROFS_BIT(_prefix, _cur, _pre) enum { \
> > +#define __EROFS_BIT(_prefix, _cur, _pre) (enum { \
> > _prefix ## _cur ## _BIT = _prefix ## _pre ## _BIT + \
> > - _prefix ## _pre ## _BITS }
> > + _prefix ## _pre ## _BITS })
>
> It seems not the valid C, here is the compiler error:
>
> ...
>
> In file included from drivers/staging/erofs/internal.h:25:0,
> from drivers/staging/erofs/xattr.h:16,
> from drivers/staging/erofs/xattr.c:14:
> drivers/staging/erofs/erofs_fs.h:41:43: error: expected identifier or â(â before âenumâ
> #define __EROFS_BIT(_prefix, _cur, _pre) (enum { \
> ^
> drivers/staging/erofs/erofs_fs.h:65:1: note: in expansion of macro â__EROFS_BITâ
> __EROFS_BIT(EROFS_I_, DATA_MAPPING, VERSION);
> ^~~~~~~~~~~
> make[3]: *** [scripts/Makefile.build:292: drivers/staging/erofs/xattr.o] Error 1
>
> ...
>
>
> the __EROFS_BIT marco is used to define yyy_BIT according to xxx_BIT + xxx_BITS for cascade, eg.
>
> __EROFS_BIT(EROFS_I_, DATA_MAPPING, VERSION);
> it will defines EROFS_I_DATA_MAPPING_BIT = EROFS_I_VERSION_BIT + EROFS_I_VERSION_BITS;
>
> __EROFS_BIT(EROFS_I_, FEATURE2, DATA_MAPPING);
> it will defines EROFS_I_FEATURE2_BIT = EROFS_I_DATA_MAPPING_BIT + EROFS_I_DATA_MAPPING_BITS;

This macro is used only once and is merely obfuscation
for that one use. Please remove the macro and expand
it in the one place it is used.