commit b13edf7ff2d ("checkpatch: add checks for do {} while (0) macro misuses")
added a test that is overly simplistic for single statement macros.

Macros that start with control tests should be enclosed
in a do {} while (0) loop.

Add the necessary control tests to the check.

Signed-off-by: Joe Perches <[email protected]>
---
On Thu, 2012-08-02 at 15:20 +0100, Andy Whitcroft wrote:
> On Thu, Aug 02, 2012 at 10:00:04AM +0200, Schrober wrote:
> > Hi,

Hello and thanks for the report.

> > I think your check for SINGLE_STATEMENT_DO_WHILE_MACRO is wrong.

And you are correct.

> It does appear this check should not apply when a control statement is
> included.

The patch below is tested with:
$ cat t.c

#define bar_1(foo)                              \
        if (foo)                                \
                baz();                          \

#define bar_2(foo)                              \
do {                                            \
        if (foo)                                \
                baz();                          \
} while (0)

#define bar_3(foo)                              \
do {                                            \
        baz();                                  \
} while (0)

#define bar_4(foo)                              \
do {                                            \
        baz();                                  \
} while (0);

#define bar_5(foo)                              \
do {                                            \
        while (foo)                             \
                baz();                          \
} while (0)

#define bar_6(foo)                              \
do {                                            \
        switch (foo) {                          \
        case 1:                                 \
                baz();                          \
        }                                       \
} while (0)

$

So perhaps...

 scripts/checkpatch.pl |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 913d6bd..ca05ba2 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -3016,7 +3016,8 @@ sub process {
                                        $herectx .= raw_line($linenr, $n) . 
"\n";
                                }
 
-                               if (($stmts =~ tr/;/;/) == 1) {
+                               if (($stmts =~ tr/;/;/) == 1 &&
+                                   $stmts !~ /^\s*(if|while|for|switch)\b/) {
                                        WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
                                             "Single statement macros should 
not use a do {} while (0) loop\n" . "$herectx");
                                }


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to