63 | 63 |
my $allow_c99_comments = 1; # Can be overridden by --ignore C99_COMMENT_TOLERANCE
|
64 | 64 |
# git output parsing needs US English output, so first set backtick child process LANGUAGE
|
65 | 65 |
my $git_command ='export LANGUAGE=en_US.UTF-8; git';
|
|
66 |
my $tabsize = 8;
|
66 | 67 |
|
67 | 68 |
sub help {
|
68 | 69 |
my ($exitcode) = @_;
|
|
97 | 98 |
--show-types show the specific message type in the output
|
98 | 99 |
--max-line-length=n set the maximum line length, if exceeded, warn
|
99 | 100 |
--min-conf-desc-length=n set the min description length, if shorter, warn
|
|
101 |
--tab-size=n set the number of spaces for tab (default 8)
|
100 | 102 |
--root=PATH PATH to the kernel tree root
|
101 | 103 |
--no-summary suppress the per-file summary
|
102 | 104 |
--mailback only produce a report in case of warnings/errors
|
|
214 | 216 |
'list-types!' => \$list_types,
|
215 | 217 |
'max-line-length=i' => \$max_line_length,
|
216 | 218 |
'min-conf-desc-length=i' => \$min_conf_desc_length,
|
|
219 |
'tab-size=i' => \$tabsize,
|
217 | 220 |
'root=s' => \$root,
|
218 | 221 |
'summary!' => \$summary,
|
219 | 222 |
'mailback!' => \$mailback,
|
|
265 | 268 |
} else {
|
266 | 269 |
die "Invalid color mode: $color\n";
|
267 | 270 |
}
|
|
271 |
|
|
272 |
# skip TAB size 1 to avoid additional checks on $tabsize - 1
|
|
273 |
die "Invalid TAB size: $tabsize\n" if ($tabsize < 2);
|
268 | 274 |
|
269 | 275 |
sub hash_save_array_words {
|
270 | 276 |
my ($hashRef, $arrayRef) = @_;
|
|
472 | 478 |
(?:kv|k|v)[czm]alloc(?:_node|_array)? |
|
473 | 479 |
kstrdup(?:_const)? |
|
474 | 480 |
kmemdup(?:_nul)?) |
|
475 | |
(?:\w+)?alloc_skb(?:ip_align)? |
|
|
481 |
(?:\w+)?alloc_skb(?:_ip_align)? |
|
476 | 482 |
# dev_alloc_skb/netdev_alloc_skb, et al
|
477 | 483 |
dma_alloc_coherent
|
478 | 484 |
)};
|
|
803 | 809 |
}x;
|
804 | 810 |
$Type = qr{
|
805 | 811 |
$NonptrType
|
806 | |
(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
|
|
812 |
(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+){0,4}
|
807 | 813 |
(?:\s+$Inline|\s+$Modifier)*
|
808 | 814 |
}x;
|
809 | 815 |
$TypeMisordered = qr{
|
810 | 816 |
$NonptrTypeMisordered
|
811 | |
(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
|
|
817 |
(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+){0,4}
|
812 | 818 |
(?:\s+$Inline|\s+$Modifier)*
|
813 | 819 |
}x;
|
814 | 820 |
$Declare = qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
|
|
1117 | 1123 |
my ($formatted_email) = @_;
|
1118 | 1124 |
|
1119 | 1125 |
my $name = "";
|
|
1126 |
my $name_comment = "";
|
1120 | 1127 |
my $address = "";
|
1121 | 1128 |
my $comment = "";
|
1122 | 1129 |
|
|
1149 | 1156 |
|
1150 | 1157 |
$name = trim($name);
|
1151 | 1158 |
$name =~ s/^\"|\"$//g;
|
|
1159 |
$name =~ s/(\s*\([^\)]+\))\s*//;
|
|
1160 |
if (defined($1)) {
|
|
1161 |
$name_comment = trim($1);
|
|
1162 |
}
|
1152 | 1163 |
$address = trim($address);
|
1153 | 1164 |
$address =~ s/^\<|\>$//g;
|
1154 | 1165 |
|
|
1157 | 1168 |
$name = "\"$name\"";
|
1158 | 1169 |
}
|
1159 | 1170 |
|
1160 | |
return ($name, $address, $comment);
|
|
1171 |
return ($name, $name_comment, $address, $comment);
|
1161 | 1172 |
}
|
1162 | 1173 |
|
1163 | 1174 |
sub format_email {
|
|
1181 | 1192 |
}
|
1182 | 1193 |
|
1183 | 1194 |
return $formatted_email;
|
|
1195 |
}
|
|
1196 |
|
|
1197 |
sub reformat_email {
|
|
1198 |
my ($email) = @_;
|
|
1199 |
|
|
1200 |
my ($email_name, $name_comment, $email_address, $comment) = parse_email($email);
|
|
1201 |
return format_email($email_name, $email_address);
|
|
1202 |
}
|
|
1203 |
|
|
1204 |
sub same_email_addresses {
|
|
1205 |
my ($email1, $email2) = @_;
|
|
1206 |
|
|
1207 |
my ($email1_name, $name1_comment, $email1_address, $comment1) = parse_email($email1);
|
|
1208 |
my ($email2_name, $name2_comment, $email2_address, $comment2) = parse_email($email2);
|
|
1209 |
|
|
1210 |
return $email1_name eq $email2_name &&
|
|
1211 |
$email1_address eq $email2_address;
|
1184 | 1212 |
}
|
1185 | 1213 |
|
1186 | 1214 |
sub which {
|
|
1216 | 1244 |
if ($c eq "\t") {
|
1217 | 1245 |
$res .= ' ';
|
1218 | 1246 |
$n++;
|
1219 | |
for (; ($n % 8) != 0; $n++) {
|
|
1247 |
for (; ($n % $tabsize) != 0; $n++) {
|
1220 | 1248 |
$res .= ' ';
|
1221 | 1249 |
}
|
1222 | 1250 |
next;
|
|
2229 | 2257 |
sub tabify {
|
2230 | 2258 |
my ($leading) = @_;
|
2231 | 2259 |
|
2232 | |
my $source_indent = 8;
|
|
2260 |
my $source_indent = $tabsize;
|
2233 | 2261 |
my $max_spaces_before_tab = $source_indent - 1;
|
2234 | 2262 |
my $spaces_to_tab = " " x $source_indent;
|
2235 | 2263 |
|
|
2271 | 2299 |
return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
|
2272 | 2300 |
}
|
2273 | 2301 |
|
|
2302 |
sub get_raw_comment {
|
|
2303 |
my ($line, $rawline) = @_;
|
|
2304 |
my $comment = '';
|
|
2305 |
|
|
2306 |
for my $i (0 .. (length($line) - 1)) {
|
|
2307 |
if (substr($line, $i, 1) eq "$;") {
|
|
2308 |
$comment .= substr($rawline, $i, 1);
|
|
2309 |
}
|
|
2310 |
}
|
|
2311 |
|
|
2312 |
return $comment;
|
|
2313 |
}
|
|
2314 |
|
2274 | 2315 |
sub process {
|
2275 | 2316 |
my $filename = shift;
|
2276 | 2317 |
|
|
2293 | 2334 |
my $is_binding_patch = -1;
|
2294 | 2335 |
my $in_header_lines = $file ? 0 : 1;
|
2295 | 2336 |
my $in_commit_log = 0; #Scanning lines before patch
|
|
2337 |
my $has_patch_separator = 0; #Found a --- line
|
2296 | 2338 |
my $has_commit_log = 0; #Encountered lines before patch
|
2297 | 2339 |
my $commit_log_lines = 0; #Number of commit log lines
|
2298 | 2340 |
my $commit_log_possible_stack_dump = 0;
|
|
2432 | 2474 |
$sline =~ s/$;/ /g; #with comments as spaces
|
2433 | 2475 |
|
2434 | 2476 |
my $rawline = $rawlines[$linenr - 1];
|
|
2477 |
my $raw_comment = get_raw_comment($line, $rawline);
|
2435 | 2478 |
|
2436 | 2479 |
# check if it's a mode change, rename or start of a patch
|
2437 | 2480 |
if (!$in_commit_log &&
|
|
2603 | 2646 |
$author = $1;
|
2604 | 2647 |
$author = encode("utf8", $author) if ($line =~ /=\?utf-8\?/i);
|
2605 | 2648 |
$author =~ s/"//g;
|
|
2649 |
$author = reformat_email($author);
|
2606 | 2650 |
}
|
2607 | 2651 |
|
2608 | 2652 |
# Check the patch for a signoff:
|
2609 | |
if ($line =~ /^\s*signed-off-by:/i) {
|
|
2653 |
if ($line =~ /^\s*signed-off-by:\s*(.*)/i) {
|
2610 | 2654 |
$signoff++;
|
2611 | 2655 |
$in_commit_log = 0;
|
2612 | 2656 |
if ($author ne '') {
|
2613 | |
my $l = $line;
|
2614 | |
$l =~ s/"//g;
|
2615 | |
if ($l =~ /^\s*signed-off-by:\s*\Q$author\E/i) {
|
2616 | |
$authorsignoff = 1;
|
2617 | |
}
|
2618 | |
}
|
|
2657 |
if (same_email_addresses($1, $author)) {
|
|
2658 |
$authorsignoff = 1;
|
|
2659 |
}
|
|
2660 |
}
|
|
2661 |
}
|
|
2662 |
|
|
2663 |
# Check for patch separator
|
|
2664 |
if ($line =~ /^---$/) {
|
|
2665 |
$has_patch_separator = 1;
|
|
2666 |
$in_commit_log = 0;
|
2619 | 2667 |
}
|
2620 | 2668 |
|
2621 | 2669 |
# Check if MAINTAINERS is being updated. If so, there's probably no need to
|
|
2663 | 2711 |
}
|
2664 | 2712 |
}
|
2665 | 2713 |
|
2666 | |
my ($email_name, $email_address, $comment) = parse_email($email);
|
|
2714 |
my ($email_name, $name_comment, $email_address, $comment) = parse_email($email);
|
2667 | 2715 |
my $suggested_email = format_email(($email_name, $email_address));
|
2668 | 2716 |
if ($suggested_email eq "") {
|
2669 | 2717 |
ERROR("BAD_SIGN_OFF",
|
|
2674 | 2722 |
$dequoted =~ s/" </ </;
|
2675 | 2723 |
# Don't force email to have quotes
|
2676 | 2724 |
# Allow just an angle bracketed address
|
2677 | |
if ("$dequoted$comment" ne $email &&
|
2678 | |
"<$email_address>$comment" ne $email &&
|
2679 | |
"$suggested_email$comment" ne $email) {
|
|
2725 |
if (!same_email_addresses($email, $suggested_email)) {
|
2680 | 2726 |
WARN("BAD_SIGN_OFF",
|
2681 | 2727 |
"email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
|
2682 | 2728 |
}
|
|
2719 | 2765 |
"A patch subject line should describe the change not the tool that found it\n" . $herecurr);
|
2720 | 2766 |
}
|
2721 | 2767 |
|
2722 | |
# Check for unwanted Gerrit info
|
2723 | |
if ($in_commit_log && $line =~ /^\s*change-id:/i) {
|
|
2768 |
# Check for Gerrit Change-Ids not in any patch context
|
|
2769 |
if ($realfile eq '' && !$has_patch_separator && $line =~ /^\s*change-id:/i) {
|
2724 | 2770 |
ERROR("GERRIT_CHANGE_ID",
|
2725 | |
"Remove Gerrit Change-Id's before submitting upstream.\n" . $herecurr);
|
|
2771 |
"Remove Gerrit Change-Id's before submitting upstream\n" . $herecurr);
|
2726 | 2772 |
}
|
2727 | 2773 |
|
2728 | 2774 |
# Check if the commit log is in a possible stack dump
|
|
2760 | 2806 |
|
2761 | 2807 |
# Check for git id commit length and improperly formed commit descriptions
|
2762 | 2808 |
if ($in_commit_log && !$commit_log_possible_stack_dump &&
|
2763 | |
$line !~ /^\s*(?:Link|Patchwork|http|https|BugLink):/i &&
|
|
2809 |
$line !~ /^\s*(?:Link|Patchwork|http|https|BugLink|base-commit):/i &&
|
2764 | 2810 |
$line !~ /^This reverts commit [0-9a-f]{7,40}/ &&
|
2765 | 2811 |
($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||
|
2766 | 2812 |
($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i &&
|
|
3086 | 3132 |
$comment = '/*';
|
3087 | 3133 |
} elsif ($realfile =~ /\.(c|dts|dtsi)$/) {
|
3088 | 3134 |
$comment = '//';
|
3089 | |
} elsif (($checklicenseline == 2) || $realfile =~ /\.(sh|pl|py|awk|tc)$/) {
|
|
3135 |
} elsif (($checklicenseline == 2) || $realfile =~ /\.(sh|pl|py|awk|tc|yaml)$/) {
|
3090 | 3136 |
$comment = '#';
|
3091 | 3137 |
} elsif ($realfile =~ /\.rst$/) {
|
3092 | 3138 |
$comment = '..';
|
|
3109 | 3155 |
if (!is_SPDX_License_valid($spdx_license)) {
|
3110 | 3156 |
WARN("SPDX_LICENSE_TAG",
|
3111 | 3157 |
"'$spdx_license' is not supported in LICENSES/...\n" . $herecurr);
|
|
3158 |
}
|
|
3159 |
if ($realfile =~ m@^Documentation/devicetree/bindings/@ &&
|
|
3160 |
not $spdx_license =~ /GPL-2\.0.*BSD-2-Clause/) {
|
|
3161 |
my $msg_level = \&WARN;
|
|
3162 |
$msg_level = \&CHK if ($file);
|
|
3163 |
if (&{$msg_level}("SPDX_LICENSE_TAG",
|
|
3164 |
|
|
3165 |
"DT binding documents should be licensed (GPL-2.0-only OR BSD-2-Clause)\n" . $herecurr) &&
|
|
3166 |
$fix) {
|
|
3167 |
$fixed[$fixlinenr] =~ s/SPDX-License-Identifier: .*/SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)/;
|
|
3168 |
}
|
3112 | 3169 |
}
|
3113 | 3170 |
}
|
3114 | 3171 |
}
|
|
3197 | 3254 |
next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
|
3198 | 3255 |
|
3199 | 3256 |
# at the beginning of a line any tabs must come first and anything
|
3200 | |
# more than 8 must use tabs.
|
|
3257 |
# more than $tabsize must use tabs.
|
3201 | 3258 |
if ($rawline =~ /^\+\s* \t\s*\S/ ||
|
3202 | 3259 |
$rawline =~ /^\+\s* \s*/) {
|
3203 | 3260 |
my $herevet = "$here\n" . cat_vet($rawline) . "\n";
|
|
3216 | 3273 |
"please, no space before tabs\n" . $herevet) &&
|
3217 | 3274 |
$fix) {
|
3218 | 3275 |
while ($fixed[$fixlinenr] =~
|
3219 | |
s/(^\+.*) {8,8}\t/$1\t\t/) {}
|
|
3276 |
s/(^\+.*) {$tabsize,$tabsize}\t/$1\t\t/) {}
|
3220 | 3277 |
while ($fixed[$fixlinenr] =~
|
3221 | 3278 |
s/(^\+.*) +\t/$1\t/) {}
|
3222 | 3279 |
}
|
|
3238 | 3295 |
if ($perl_version_ok &&
|
3239 | 3296 |
$sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) {
|
3240 | 3297 |
my $indent = length($1);
|
3241 | |
if ($indent % 8) {
|
|
3298 |
if ($indent % $tabsize) {
|
3242 | 3299 |
if (WARN("TABSTOP",
|
3243 | 3300 |
"Statements should start on a tabstop\n" . $herecurr) &&
|
3244 | 3301 |
$fix) {
|
3245 | |
$fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/8)@e;
|
|
3302 |
$fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/$tabsize)@e;
|
3246 | 3303 |
}
|
3247 | 3304 |
}
|
3248 | 3305 |
}
|
|
3260 | 3317 |
my $newindent = $2;
|
3261 | 3318 |
|
3262 | 3319 |
my $goodtabindent = $oldindent .
|
3263 | |
"\t" x ($pos / 8) .
|
3264 | |
" " x ($pos % 8);
|
|
3320 |
"\t" x ($pos / $tabsize) .
|
|
3321 |
" " x ($pos % $tabsize);
|
3265 | 3322 |
my $goodspaceindent = $oldindent . " " x $pos;
|
3266 | 3323 |
|
3267 | 3324 |
if ($newindent ne $goodtabindent &&
|
|
3732 | 3789 |
#print "line<$line> prevline<$prevline> indent<$indent> sindent<$sindent> check<$check> continuation<$continuation> s<$s> cond_lines<$cond_lines> stat_real<$stat_real> stat<$stat>\n";
|
3733 | 3790 |
|
3734 | 3791 |
if ($check && $s ne '' &&
|
3735 | |
(($sindent % 8) != 0 ||
|
|
3792 |
(($sindent % $tabsize) != 0 ||
|
3736 | 3793 |
($sindent < $indent) ||
|
3737 | 3794 |
($sindent == $indent &&
|
3738 | 3795 |
($s !~ /^\s*(?:\}|\{|else\b)/)) ||
|
3739 | |
($sindent > $indent + 8))) {
|
|
3796 |
($sindent > $indent + $tabsize))) {
|
3740 | 3797 |
WARN("SUSPECT_CODE_INDENT",
|
3741 | 3798 |
"suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
|
3742 | 3799 |
}
|
|
4013 | 4070 |
}
|
4014 | 4071 |
|
4015 | 4072 |
# check for function declarations without arguments like "int foo()"
|
4016 | |
if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
|
|
4073 |
if ($line =~ /(\b$Type\s*$Ident)\s*\(\s*\)/) {
|
4017 | 4074 |
if (ERROR("FUNCTION_WITHOUT_ARGS",
|
4018 | 4075 |
"Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
|
4019 | 4076 |
$fix) {
|
|
4581 | 4638 |
($op eq '>' &&
|
4582 | 4639 |
$ca =~ /<\S+\@\S+$/))
|
4583 | 4640 |
{
|
4584 | |
$ok = 1;
|
|
4641 |
$ok = 1;
|
4585 | 4642 |
}
|
4586 | 4643 |
|
4587 | 4644 |
# for asm volatile statements
|
|
4916 | 4973 |
# conditional.
|
4917 | 4974 |
substr($s, 0, length($c), '');
|
4918 | 4975 |
$s =~ s/\n.*//g;
|
4919 | |
$s =~ s/$;//g; # Remove any comments
|
|
4976 |
$s =~ s/$;//g; # Remove any comments
|
4920 | 4977 |
if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
|
4921 | 4978 |
$c !~ /}\s*while\s*/)
|
4922 | 4979 |
{
|
|
4955 | 5012 |
# if and else should not have general statements after it
|
4956 | 5013 |
if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
|
4957 | 5014 |
my $s = $1;
|
4958 | |
$s =~ s/$;//g; # Remove any comments
|
|
5015 |
$s =~ s/$;//g; # Remove any comments
|
4959 | 5016 |
if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
|
4960 | 5017 |
ERROR("TRAILING_STATEMENTS",
|
4961 | 5018 |
"trailing statements should be on next line\n" . $herecurr);
|
|
5131 | 5188 |
{
|
5132 | 5189 |
}
|
5133 | 5190 |
|
5134 | |
# Flatten any obvious string concatentation.
|
|
5191 |
# Flatten any obvious string concatenation.
|
5135 | 5192 |
while ($dstat =~ s/($String)\s*$Ident/$1/ ||
|
5136 | 5193 |
$dstat =~ s/$Ident\s*($String)/$1/)
|
5137 | 5194 |
{
|
|
6229 | 6286 |
}
|
6230 | 6287 |
|
6231 | 6288 |
# check for function declarations that have arguments without identifier names
|
|
6289 |
# while avoiding uninitialized_var(x)
|
6232 | 6290 |
if (defined $stat &&
|
6233 | |
$stat =~ /^.\s*(?:extern\s+)?$Type\s*(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*\(\s*([^{]+)\s*\)\s*;/s &&
|
6234 | |
$1 ne "void") {
|
6235 | |
my $args = trim($1);
|
|
6291 |
$stat =~ /^.\s*(?:extern\s+)?$Type\s*(?:($Ident)|\(\s*\*\s*$Ident\s*\))\s*\(\s*([^{]+)\s*\)\s*;/s &&
|
|
6292 |
(!defined($1) ||
|
|
6293 |
(defined($1) && $1 ne "uninitialized_var")) &&
|
|
6294 |
$2 ne "void") {
|
|
6295 |
my $args = trim($2);
|
6236 | 6296 |
while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) {
|
6237 | 6297 |
my $arg = trim($1);
|
6238 | |
if ($arg =~ /^$Type$/ && $arg !~ /enum\s+$Ident$/) {
|
|
6298 |
if ($arg =~ /^$Type$/ &&
|
|
6299 |
$arg !~ /enum\s+$Ident$/) {
|
6239 | 6300 |
WARN("FUNCTION_ARGUMENTS",
|
6240 | 6301 |
"function definition argument '$arg' should also have an identifier name\n" . $herecurr);
|
6241 | 6302 |
}
|
|
6388 | 6449 |
}
|
6389 | 6450 |
}
|
6390 | 6451 |
|
|
6452 |
# check for /* fallthrough */ like comment, prefer fallthrough;
|
|
6453 |
my @fallthroughs = (
|
|
6454 |
'fallthrough',
|
|
6455 |
'@fallthrough@',
|
|
6456 |
'lint -fallthrough[ \t]*',
|
|
6457 |
'intentional(?:ly)?[ \t]*fall(?:(?:s | |-)[Tt]|t)hr(?:ough|u|ew)',
|
|
6458 |
'(?:else,?\s*)?FALL(?:S | |-)?THR(?:OUGH|U|EW)[ \t.!]*(?:-[^\n\r]*)?',
|
|
6459 |
'Fall(?:(?:s | |-)[Tt]|t)hr(?:ough|u|ew)[ \t.!]*(?:-[^\n\r]*)?',
|
|
6460 |
'fall(?:s | |-)?thr(?:ough|u|ew)[ \t.!]*(?:-[^\n\r]*)?',
|
|
6461 |
);
|
|
6462 |
if ($raw_comment ne '') {
|
|
6463 |
foreach my $ft (@fallthroughs) {
|
|
6464 |
if ($raw_comment =~ /$ft/) {
|
|
6465 |
my $msg_level = \&WARN;
|
|
6466 |
$msg_level = \&CHK if ($file);
|
|
6467 |
&{$msg_level}("PREFER_FALLTHROUGH",
|
|
6468 |
"Prefer 'fallthrough;' over fallthrough comment\n" . $herecurr);
|
|
6469 |
last;
|
|
6470 |
}
|
|
6471 |
}
|
|
6472 |
}
|
|
6473 |
|
6391 | 6474 |
# check for switch/default statements without a break;
|
6392 | 6475 |
if ($perl_version_ok &&
|
6393 | 6476 |
defined $stat &&
|