checkpatch: types: some types may also be identifiers
authorAndy Whitcroft <apw@shadowen.org>
Thu, 24 Jul 2008 04:28:57 +0000 (21:28 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 24 Jul 2008 17:47:25 +0000 (10:47 -0700)
Some types such as typedefs may overlap real identifiers.  Be more
targetted about when a type can really exist.  Where it cannot let it be
an identifier.  This prevents false reporting of the minus '-' in unary
context in the following:

foo[bar->bool - 1];

Signed-off-by: Andy Whitcroft <apw@shadowen.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
scripts/checkpatch.pl

index 83ae37b..5420db6 100755 (executable)
@@ -171,6 +171,7 @@ our @modifierList = (
 sub build_types {
        my $mods = "(?:  \n" . join("|\n  ", @modifierList) . "\n)";
        my $all = "(?:  \n" . join("|\n  ", @typeList) . "\n)";
+       $Modifier       = qr{(?:$Attribute|$Sparse|$mods)};
        $NonptrType     = qr{
                        (?:const\s+)?
                        (?:$mods\s+)?
@@ -178,15 +179,14 @@ sub build_types {
                                (?:typeof|__typeof__)\s*\(\s*\**\s*$Ident\s*\)|
                                (?:${all}\b)
                        )
-                       (?:\s+$Sparse|\s+const)*
+                       (?:\s+$Modifier|\s+const)*
                  }x;
        $Type   = qr{
                        $NonptrType
                        (?:\s*\*+\s*const|\s*\*+|(?:\s*\[\s*\])+)?
-                       (?:\s+$Inline|\s+$Sparse|\s+$Attribute|\s+$mods)*
+                       (?:\s+$Inline|\s+$Modifier)*
                  }x;
        $Declare        = qr{(?:$Storage\s+)?$Type};
-       $Modifier       = qr{(?:$Attribute|$Sparse|$mods)};
 }
 build_types();
 
@@ -715,7 +715,7 @@ sub annotate_values {
                                $av_preprocessor = 0;
                        }
 
-               } elsif ($cur =~ /^($Type)/) {
+               } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\))/) {
                        print "DECLARE($1)\n" if ($dbg_values > 1);
                        $type = 'T';
 
@@ -800,8 +800,9 @@ sub annotate_values {
                                print "PAREN('$1')\n" if ($dbg_values > 1);
                        }
 
-               } elsif ($cur =~ /^($Ident)\(/o) {
+               } elsif ($cur =~ /^($Ident)\s*\(/o) {
                        print "FUNC($1)\n" if ($dbg_values > 1);
+                       $type = 'V';
                        $av_pending = 'V';
 
                } elsif ($cur =~ /^($Ident|$Constant)/o) {