From 60fab68d897943b3533b857bccbd40f6ea572989 Mon Sep 17 00:00:00 2001 From: Gregory Bean Date: Wed, 11 May 2011 09:11:12 -0700 Subject: [PATCH] checkpatch: Handle long multi-line macros better. Improve parsing of multiline macros which run beyond the available diff context. These beyond-the-horizon macros previously caused two distinct naughty behaviors: - The scanner, confused by the trailing backslash, would grab the header of the next context hunk and treat it as the last line of the preceding macro. - The analyzer, unable to fully reduce the macro, would blame the patch for submitting an unbalanced or unprotected macro. Change-Id: I6b7dd3d577c524d30b59dff7b20393bb5135f16d Signed-off-by: Gregory Bean (cherry picked from commit ddd028c47b4d91aa9c0e97445eb584b2de367769) Signed-off-by: Stepan Moskovchenko --- scripts/checkpatch.pl | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index fa32f21bc16f..002f4bbfe687 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -5075,7 +5075,7 @@ sub process { if ($realfile !~ m@/vmlinux.lds.h$@ && $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) { my $ln = $linenr; - my $cnt = $realcnt; + my $cnt = $realcnt - 1; my ($off, $dstat, $dcond, $rest); my $ctx = ''; my $has_flow_statement = 0; @@ -5113,6 +5113,12 @@ sub process { { } + # Extremely long macros may fall off the end of the + # available context without closing. Give a dangling + # backslash the benefit of the doubt and allow it + # to gobble any hanging open-parens. + $dstat =~ s/\(.+\\$/1/; + # Flatten any obvious string concatentation. while ($dstat =~ s/($String)\s*$Ident/$1/ || $dstat =~ s/$Ident\s*($String)/$1/)