From: Andy Whitcroft <apw@canonical.com>
To: Ivo Sieben <meltedpianoman@gmail.com>
Cc: linux-kernel@vger.kernel.org, Joe Perches <joe@perches.com>
Subject: Re: [PATCH] [checkpatch.pl] ctx_statement_block #if/#else/#endif fix
Date: Wed, 11 Jun 2014 10:57:11 +0100 [thread overview]
Message-ID: <20140611095711.GL6819@bark> (raw)
In-Reply-To: <20140611091640.GK6819@bark>
On Wed, Jun 11, 2014 at 10:16:40AM +0100, Andy Whitcroft wrote:
> It doesn't seem right to remove the restore of the state. If you
> consider the effect of an #if/#else/#endif combination the state of the
> statement parser should be reset to the state at #if at the #else as the
> code there is an alternative for the code in the other branch(s) of the
> preprocessor, either is a continuation of the statement in progress when
> reached. This contrived example should make it clear we need to
> restore:
>
> c = (d +
> #if A
> a)
> #else
> b)
> #endif
>
>
> That said it appears to be doing something wrong in your example.
>
> /me will have a poke and get back to you.
Ok, the fundamental issue seems to have been an off by one thinko in the
attempt to restore the state to the previous level ($@array is the index
of the late element not the length of the array). The patch below seems
to sort out the issue. Could you give it a try and confirm it covers
your primary cases, and if so I will push it to akpm.
Thanks.
-apw
>From b47b6f4934471bcc4d653b53be0950b9dc590c87 Mon Sep 17 00:00:00 2001
From: Andy Whitcroft <apw@canonical.com>
Date: Wed, 11 Jun 2014 10:51:13 +0100
Subject: [PATCH] checkpatch: fix handling of stacked state for preprocessor if
branches
When reaching an alternative branch of a preprocessor directive we need to
reset statement state to that at the start of the if as this new segment
is logically ajacent to it. Currently we inadvertantly take the state
for the containing block (read off by one error). Pick the correct state.
This fixes statement parsing for the below style constructs:
if (!test()) {
#ifdef NEVER
foo();
bar();
#else
bar();
foo();
#endif
}
Signed-off-by: Andy Whitcroft <apw@canonical.com>
---
scripts/checkpatch.pl | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 010b18e..d3c0126 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -885,7 +885,7 @@ sub ctx_statement_block {
if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
push(@stack, [ $type, $level ]);
} elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
- ($type, $level) = @{$stack[$#stack - 1]};
+ ($type, $level) = @{$stack[$#stack]};
} elsif ($remainder =~ /^#\s*endif\b/) {
($type, $level) = @{pop(@stack)};
}
@@ -1057,7 +1057,7 @@ sub ctx_block_get {
if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
push(@stack, $level);
} elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
- $level = $stack[$#stack - 1];
+ $level = $stack[$#stack];
} elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
$level = pop(@stack);
}
--
2.0.0
next prev parent reply other threads:[~2014-06-11 9:57 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-15 14:43 [PATCH] [checkpatch.pl] ctx_statement_block #if/#else/#endif fix Ivo Sieben
2014-06-10 6:19 ` Ivo Sieben
2014-06-10 16:24 ` Joe Perches
2014-06-11 9:16 ` Andy Whitcroft
2014-06-11 9:57 ` Andy Whitcroft [this message]
2014-06-11 9:59 ` Andy Whitcroft
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140611095711.GL6819@bark \
--to=apw@canonical.com \
--cc=joe@perches.com \
--cc=linux-kernel@vger.kernel.org \
--cc=meltedpianoman@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox