[kaffe] CVS kaffe (doogie): Rewrote again,
moving the warning/description definitions themselves into
Kaffe CVS
cvs-commits at kaffe.org
Fri Dec 10 12:52:17 PST 2004
PatchSet 5593
Date: 2004/12/10 20:47:47
Author: doogie
Branch: HEAD
Tag: (none)
Log:
Rewrote again, moving the warning/description definitions themselves into
their respective files.
Members:
ChangeLog:1.3138->1.3139
scripts/GCCWarning.pm:1.1->1.2
scripts/JikesWarning.pm:1.1->1.2
scripts/LogWarning.pm:1.2->1.3
scripts/Registry.pm:INITIAL->1.1
scripts/sort-warnings.pl:1.9->1.10
Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.3138 kaffe/ChangeLog:1.3139
--- kaffe/ChangeLog:1.3138 Fri Dec 10 06:20:16 2004
+++ kaffe/ChangeLog Fri Dec 10 20:47:47 2004
@@ -1,7 +1,15 @@
2004-12-10 Adam Heath <doogie at brainfood.com>
- * scripts/sort-warnings.pl, scripts/LogWarning.pl,
- scripts/WarningDescription.pl:
+ * scripts/sort-warnings.pl, scripts/LogWarning.pm,
+ scripts/WarningDescription.pm, scripts/JikesWarning.pm,
+ scripts/GCCWarning.pm, scripts/Registry.pm:
+ Rewrote again, moving the warning/description definitions themselves
+ into their respective files.
+
+2004-12-10 Adam Heath <doogie at brainfood.com>
+
+ * scripts/sort-warnings.pl, scripts/LogWarning.pm,
+ scripts/WarningDescription.pm:
Start adding description support to the various detected
warnings. Currently, only -Wmissing-braces has a description;
this was copied from the gcc info docs.
Index: kaffe/scripts/GCCWarning.pm
diff -u kaffe/scripts/GCCWarning.pm:1.1 kaffe/scripts/GCCWarning.pm:1.2
--- kaffe/scripts/GCCWarning.pm:1.1 Fri Dec 10 05:07:03 2004
+++ kaffe/scripts/GCCWarning.pm Fri Dec 10 20:47:51 2004
@@ -4,16 +4,133 @@
use strict;
use warnings;
-use base qw( LogWarning );
-use vars qw( $prefix_regex $prefix_regex_noparam $prefix_regex2 );
+use LogWarning;
+use Registry;
-$prefix_regex = qr/^([^:\n]+):(\d+):(?:\d+:)? warning: /m;
-$prefix_regex_noparam = qr/^(?:[^:\n]+):(?:\d+): warning: /m;
+use vars qw( @ISA $prefix_regex $prefix_regex_noparam $prefix_regex2 );
+BEGIN {
+ @ISA = qw( LogWarning );
+ $prefix_regex = qr/^([^:\n]+):(\d+):(?:\d+:)? warning: /m;
+ $prefix_regex_noparam = qr/^(?:[^:\n]+):(?:\d+): warning: /m;
+}
sub new {
my $class = shift;
my ( $name, $regex, $description ) = @_;
- return $class->SUPER::new( 'gcc', $name, qr/${prefix_regex}$regex/, $description );
+ my $warning = $class->SUPER::new( 'gcc', $name, qr/${prefix_regex}$regex/, $description );
+ Registry::add_warning($warning);
+ return $warning;
+}
+
+sub register_description {
+ Registry::register_description( 'gcc', @_ );
}
+sub register_warning {
+ GCCWarning->new( @_ );
+}
+
+BEGIN {
+ #--
+ register_description( '-Wmissing-braces', "Warn if an aggregate or union initializer is not fully bracketed.
+In the following example, the initializer for `a' is not fully
+bracketed, but that for `b' is fully bracketed.
+
+int a[2][2] = { 0, 1, 2, 3 };
+int b[2][2] = { { 0, 1 }, { 2, 3 } };" );
+ register_warning( '-Wmissing-braces', qr/missing initializer\n${GCCWarning::prefix_regex_noparam}\(near initialization for `([^']+)'\)$/m ),
+ #--
+ register_description( '-Wfloat-equal', "Warn if floating point values are used in equality comparisons.
+
+The idea behind this is that sometimes it is convenient (for the
+programmer) to consider floating-point values as approximations to
+infinitely precise real numbers. If you are doing this, then you
+need to compute (by analysing the code, or in some other way) the
+maximum or likely maximum error that the computation introduces,
+and allow for it when performing comparisons (and when producing
+output, but that's a different problem). In particular, instead
+of testing for equality, you would check to see whether the two
+values have ranges that overlap; and this is done with the
+relational operators, so equality comparisons are probably
+mistaken." ),
+ register_warning( '-Wfloat-equal', qr/comparing floating point with == or != is unsafe$/m ),
+ #--
+ register_description( '-Wbad-function-cast', "Warn whenever a function call is cast to a non-matching type. For
+example, warn if `int malloc()' is cast to `anything *'" );
+ register_warning( '-Wbad-function-cast', qr/cast does not match function type$/m ),
+ #--
+ register_description( '-Wmissing-prototypes', "Warn if a global function is defined without a previous prototype
+declaration. This warning is issued even if the definition itself
+provides a prototype. The aim is to detect global functions that
+fail to be declared in header files." );
+ register_warning( '-Wmissing-prototypes', qr/no previous prototype for `([^']+)'$/m ),
+ #--
+ register_description( '-Wredundant-decls', "Warn if anything is declared more than once in the same scope,
+even in cases where multiple declaration is valid and changes
+nothing." );
+ register_warning( '-Wredundant-decls', qr/redundant redeclaration of `([^']+)' in same scope\n${GCCWarning::prefix_regex}previous declaration of `[^']+'$/m ),
+ #--
+ register_description( '-Winline', "Warn if a function can not be inlined and it was declared as
+inline." );
+ register_warning( '-Winline', qr/inlining failed in call to `([^']+)'\n${GCCWarning::prefix_regex}called from here$/m ),
+ #--
+ register_warning( 'missing-prototypes-mismatch', qr/no previous prototype for `([^']+)'\n${GCCWarning::prefix_regex_noparam}type mismatch with previous implicit declaration\n${GCCWarning::prefix_regex}previous implicit declaration of `[^']+'\n${GCCWarning::prefix_regex_noparam}`[^']+' was previously implicitly declared to return `([^']+)'$/m ),
+
+ register_warning( '-Wformat-nonliteral', qr/format not a string literal, argument types not checked$/m ),
+ register_warning( '-Wformat-nonliteral', qr/format not a string literal and no format arguments$/m ),
+ register_warning( '-Wimplicit-func-decl', qr/implicit declaration of function `([^']+)'$/m ),
+ register_warning( '-Wunused-parameter', qr/unused parameter `([^']+)'$/m ),
+ register_warning( '-Wunused-variable', qr/unused variable `([^']+)'$/m ),
+
+
+ register_warning( '-Wshadow', qr/declaration of `([^']+)' shadows a global declaration\n${GCCWarning::prefix_regex}shadowed declaration is here$/m ),
+ register_warning( '-Wshadow', qr/declaration of `([^']+)' shadows a previous local\n${GCCWarning::prefix_regex}shadowed declaration is here$/m ),
+ register_warning( '-Wpointer-arith', qr/pointer of type `([^']+)' used in arithmetic$/m ),
+
+ register_warning( '-Wpointer-arith', qr/pointer of type `([^']+)' used in subtraction$/m ),
+ register_warning( '-Wcast-qual', qr/cast discards qualifiers from pointer target type$/m ),
+ register_warning( '-Wcast-qual', qr/initialization discards qualifiers from pointer target type$/m ),
+ register_warning( '-Wcast-qual', qr/passing arg (\d+) of `([^']+)' discards qualifiers from pointer target type$/m ),
+ register_warning( '-Wcast-qual', qr/return discards qualifiers from pointer target type$/m ),
+ register_warning( '-Wcast-qual', qr/assignment discards qualifiers from pointer target type$/m ),
+ register_warning( '-Wcast-qual', qr/assignment makes qualified function pointer from unqualified$/m ),
+ register_warning( '-Wcast-align', qr/padding struct size to alignment boundary$/m ),
+ register_warning( '-Wconversion', qr/negative integer implicitly converted to unsigned type$/m ),
+ register_warning( '-Wconversion', qr/passing arg (\d+) of `([^']+)' makes (integer|pointer) from (integer|pointer) without a cast$/m ),
+ register_warning( '-Wsign-compare', qr/comparison of unsigned expression < 0 is always false$/m ),
+ register_warning( '-Wsign-compare', qr/comparison between signed and unsigned$/m ),
+ register_warning( '-Wsign-compare', qr/signed and unsigned type in conditional expression$/m ),
+ register_warning( '-Waggregate-return', qr/function call has aggregate value$/m ),
+ register_warning( '-Waggregate-return', qr/function returns an aggregate$/m ),
+ register_warning( '-Wstrict-prototypes', qr/non-static declaration for `([^']+)' follows static$/m ),
+ register_warning( '-Wstrict-prototypes', qr/function declaration isn't a prototype$/m ),
+ register_warning( '-Wmissing-declarations' => qr/"([^"]+)" is not defined\s*$/m ),
+ register_warning( '-Wmissing-declarations' => qr/`([^']+)' is not defined\s*$/m ),
+ register_warning( '-Wmissing-noreturn', qr/function might be possible candidate for attribute `(noreturn)'$/m ),
+ register_warning( '-Wmissing-noreturn', qr/`([^']+)' function does return$/m ),
+ register_warning( '-Wmissing-format-attribute', qr/function might be possible candidate for `printf' format attribute$/m ),
+ register_warning( '-Wpadded', qr/padding struct to align `([^']+)'$/m ),
+ register_warning( '-Wnested-externs', qr/nested extern declaration of `([^']+)'$/m ),
+ register_warning( '-Wunreachable-code', qr/will never be executed$/m ),
+
+
+
+
+
+ register_warning( 'traditional', qr/passing arg (\d+) of (?:`([^']+)'|(pointer to function)) with different width due to prototype$/m ),
+ register_warning( 'traditional', qr/passing arg (\d+) of (?:`([^']+)'|(pointer to function)) as (unsigned|signed) due to prototype$/m ),
+ register_warning( 'traditional', qr/passing arg (\d+) of `([^']+)' as `([^']+)' rather than `([^']+)' due to prototype$/m ),
+ register_warning( 'traditional', qr/macro arg `([^']+)' would be stringified with -traditional\.$/m ),
+ register_warning( 'traditional', qr/passing arg (\d+) of `([^']+)' as (floating|integer) rather than (floating|integer) due to prototype$/m ),
+ register_warning( 'traditional', qr/passing arg (\d+) of (?:`([^']+)'|(pointer to function)) as `([^']+)' rather than `([^']+)' due to prototype$/m ),
+ register_warning( 'traditional', qr/passing arg (\d+) of (?:`([^']+)'|(pointer to function)) from incompatible pointer type$/m ),
+
+
+ register_warning( 'deprecated-lvalue', qr/use of (compound|conditional|cast) expressions as lvalues is deprecated$/m ),
+
+ register_warning( 'foo', qr/`([^']+)' declared inside parameter list$/m ),
+ register_warning( 'foo', qr/(assignment|initialization) from incompatible pointer type$/m ),
+ register_warning( 'foo', qr/integer constant is too large for "([^"]+)" type$/m ),
+
+}
1;
Index: kaffe/scripts/JikesWarning.pm
diff -u kaffe/scripts/JikesWarning.pm:1.1 kaffe/scripts/JikesWarning.pm:1.2
--- kaffe/scripts/JikesWarning.pm:1.1 Fri Dec 10 05:07:03 2004
+++ kaffe/scripts/JikesWarning.pm Fri Dec 10 20:47:51 2004
@@ -5,14 +5,48 @@
use strict;
use warnings;
-use base qw( LogWarning );
-use vars qw( $jikes_prefix );
-$jikes_prefix = qr/([^:\n]+):(\d+):\d+:\d+:\d+: (?:Lexical|Semantic) (?:Caution|Warning): /m;
+use LogWarning;
+use Registry;
+use vars qw( @ISA $jikes_prefix );
+
+BEGIN {
+ @ISA = qw( LogWarning );
+ $jikes_prefix = qr/([^:\n]+):(\d+):\d+:\d+:\d+: (?:Lexical|Semantic) (?:Caution|Warning): /m;
+}
sub new {
my $class = shift;
my ( $name, $regex, $description ) = @_;
- return $class->SUPER::new( 'jikes', $name, qr/${jikes_prefix}$regex/, $description );
+ my $warning = $class->SUPER::new( 'jikes', $name, qr/${jikes_prefix}$regex/, $description );
+ Registry::add_warning($warning);
+ return $warning;
+}
+
+sub register_description {
+ Registry::register_description( 'jikes', @_ );
+}
+
+sub register_warning {
+ JikesWarning->new( @_ );
+}
+
+BEGIN {
+ register_warning( 'throws-uncheck', qr/Since type "([^"]+)" is an unchecked exception, it does not need to be listed in the throws clause.$/m, '' ),
+ register_warning( 'throws-unchecked', qr/Since type "([^"]+)" is an unchecked exception, it does not need to be listed in the throws clause.$/m ),
+ register_warning( 'modifier-order', qr/The modifier "([^"]+)" did not appear in the recommended order public\/protected\/private, abstract, static, final, synchronized, transient, volatile, strictfp.$/m ),
+ register_warning( 'public-in-interface', qr/The use of the "([^"]+)" modifier in this context is redundant and strongly discouraged as a matter of style.$/m ),
+ register_warning( 'exception-superclass', qr/The listing of type "([^"]+)" in the throws clause is not necessary, since its superclass, "([^"]+)", is also listed.$/m ),
+ register_warning( 'override-default', qr/Method "([^"]+)" in class "([^"]+)" does not override or hide the corresponding method with default access in class "([^"]+)".$/m ),
+ register_warning( 'invalid-zip', qr/The file "([^"]+)" does not exist or else is not a valid zip file.$/m ),
+ register_warning( 'invalid-zip', qr/I\/O warning: "No such file or directory" while trying to open (.*)\.$/m ),
+ register_warning( 'negative-shift-count', qr/The shift count (-\d+) is negative; it will be masked to the appropriate width and behave as a positive shift count.$/m ),
+ register_warning( 'large-shift-count', qr/The shift count of (\d+) is >= the (\d+-bit) width of the type.$/m ),
+ register_warning( 'method-is-constructor', qr/The name of this method "([^"]+)" matches the name of the containing class. However, the method is not a constructor since its declarator is qualified with a type.$/m ),
+ register_warning( 'use-parens', qr/Suggest parentheses around assignment used as truth value.$/m ),
+ register_warning( 'instance-static-access', qr/Invoking the class method "([^"]+)" via an instance is discouraged because the method invoked will be the one in the variable's declared type, not the instance's dynamic type.$/m ),
+ register_warning( 'instance-static-access', qr/Accessing the class field "([^"]+)" via an instance is discouraged because the field accessed will be the one in the variable's declared type, not the instance's dynamic type.$/m ),
+ register_warning( 'static-variable-init', qr/Final field "([^"]+)" is initialized with a constant expression and could be made static to save space.$/m ),
+ register_warning( 'lexical:invalid-char', qr/The use of "([^"]+)" in an identifier, while legal, is strongly discouraged, since it can conflict with compiler-generated names. If you are trying to access a nested type, use "([^"]+)" instead of "(?:[^"]+)".$/m ),
}
1;
Index: kaffe/scripts/LogWarning.pm
diff -u kaffe/scripts/LogWarning.pm:1.2 kaffe/scripts/LogWarning.pm:1.3
--- kaffe/scripts/LogWarning.pm:1.2 Fri Dec 10 06:20:18 2004
+++ kaffe/scripts/LogWarning.pm Fri Dec 10 20:47:51 2004
@@ -59,4 +59,13 @@
return $self->{ 'description' }->description();
}
+sub get_description {
+ my $self = shift;
+ my $description = $self->description_text();
+ if ( !$description ) {
+ $description = Registry::lookup_description( $self->compiler(), $self->shortName() );
+ $description = $description->description() if ( $description );
+ }
+ return $description;
+}
1;
===================================================================
Checking out kaffe/scripts/Registry.pm
RCS: /home/cvs/kaffe/kaffe/scripts/Registry.pm,v
VERS: 1.1
***************
--- /dev/null Sun Aug 4 19:57:58 2002
+++ kaffe/scripts/Registry.pm Fri Dec 10 20:52:16 2004
@@ -0,0 +1,60 @@
+#!/usr/bin/perl -w
+package Registry;
+
+use strict;
+use warnings;
+
+use Data::Dumper;
+use vars qw( %description_registry @warnings %warning_map );
+
+sub register_description {
+ my ( $compiler, $shortName, $description );
+ if ( ref( $_[ 0 ] ) ) {
+ my $compiler = $_[ 0 ]->compiler();
+ my $shortName = $_[ 0 ]->shortName();
+ } else {
+ $compiler = shift;
+ $shortName = shift;
+ $description = shift;
+ }
+ my $existing = $description_registry{ $compiler }{ $shortName };
+ print STDERR "Duplicate description for: compiler[$compiler] name[$shortName]!\n" if ( $existing );
+ $description_registry{ $compiler }{ $shortName } = $description;
+}
+
+sub lookup_description($$) {
+ return $description_registry{ $_[ 0 ] }{ $_[ 0 ] };
+}
+
+sub add_warning {
+ push( @warnings, @_ );
+}
+
+sub analyze_warnings {
+ my %duplicated_warnings;
+ for ( my $i = 0; $i < @warnings; $i++ ) {
+ my $warning = $warnings[ $i ];
+ my $warning_group = $duplicated_warnings{ $warning->compiler() } ||= {};
+ my $warning_name = $warning->name();
+ if ( !$warning_group->{ $warning_name } ) {
+ $warning_group->{ $warning_name } = $warning;
+ } else {
+ if ( ref( $warning_group->{ $warning_name } ) ) {
+ $warning_group->{ $warning_name }->index( 1 );
+ $warning_group->{ $warning_name } = 2;
+ }
+ $warning->index( $warning_group->{ $warning_name }++ );
+ }
+ }
+
+ for ( my $i = 0; $i < @warnings; $i++ ) {
+ $warning_map{ $warnings[ $i ]->name() } = $warnings[ $i ];
+ }
+}
+
+sub get_warning {
+ return $warning_map{ $_[ 0 ] };
+}
+
+1;
+
Index: kaffe/scripts/sort-warnings.pl
diff -u kaffe/scripts/sort-warnings.pl:1.9 kaffe/scripts/sort-warnings.pl:1.10
--- kaffe/scripts/sort-warnings.pl:1.9 Fri Dec 10 06:20:18 2004
+++ kaffe/scripts/sort-warnings.pl Fri Dec 10 20:47:51 2004
@@ -11,6 +11,8 @@
use LogWarning;
use JikesWarning;
use GCCWarning;
+use Registry;
+Registry::analyze_warnings();
#<robilad> guilhem: ~3000 unique ones with -Wall -W -Wtraditional -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual
# -Wcast-align -Wwrite-strings -Wconversion -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes
@@ -50,136 +52,12 @@
),x;
-my @descriptions = (
- new WarningDescription( 'gcc', '-Wmissing-braces', "Warn if an aggregate or union initializer is not fully bracketed.
-In the following example, the initializer for `a' is not fully
-bracketed, but that for `b' is fully bracketed.
-
-int a[2][2] = { 0, 1, 2, 3 };
-int b[2][2] = { { 0, 1 }, { 2, 3 } };" ),
-);
-
-my @warning_types = (
- new JikesWarning( 'throws-uncheck', qr/Since type "([^"]+)" is an unchecked exception, it does not need to be listed in the throws clause.$/m, '' ),
- new JikesWarning( 'throws-unchecked', qr/Since type "([^"]+)" is an unchecked exception, it does not need to be listed in the throws clause.$/m ),
- new JikesWarning( 'modifier-order', qr/The modifier "([^"]+)" did not appear in the recommended order public\/protected\/private, abstract, static, final, synchronized, transient, volatile, strictfp.$/m ),
- new JikesWarning( 'public-in-interface', qr/The use of the "([^"]+)" modifier in this context is redundant and strongly discouraged as a matter of style.$/m ),
- new JikesWarning( 'exception-superclass', qr/The listing of type "([^"]+)" in the throws clause is not necessary, since its superclass, "([^"]+)", is also listed.$/m ),
- new JikesWarning( 'override-default', qr/Method "([^"]+)" in class "([^"]+)" does not override or hide the corresponding method with default access in class "([^"]+)".$/m ),
- new JikesWarning( 'invalid-zip', qr/The file "([^"]+)" does not exist or else is not a valid zip file.$/m ),
- new JikesWarning( 'invalid-zip', qr/I\/O warning: "No such file or directory" while trying to open (.*)\.$/m ),
- new JikesWarning( 'negative-shift-count', qr/The shift count (-\d+) is negative; it will be masked to the appropriate width and behave as a positive shift count.$/m ),
- new JikesWarning( 'large-shift-count', qr/The shift count of (\d+) is >= the (\d+-bit) width of the type.$/m ),
- new JikesWarning( 'method-is-constructor', qr/The name of this method "([^"]+)" matches the name of the containing class. However, the method is not a constructor since its declarator is qualified with a type.$/m ),
- new JikesWarning( 'use-parens', qr/Suggest parentheses around assignment used as truth value.$/m ),
- new JikesWarning( 'instance-static-access', qr/Invoking the class method "([^"]+)" via an instance is discouraged because the method invoked will be the one in the variable's declared type, not the instance's dynamic type.$/m ),
- new JikesWarning( 'instance-static-access', qr/Accessing the class field "([^"]+)" via an instance is discouraged because the field accessed will be the one in the variable's declared type, not the instance's dynamic type.$/m ),
- new JikesWarning( 'static-variable-init', qr/Final field "([^"]+)" is initialized with a constant expression and could be made static to save space.$/m ),
- new JikesWarning( 'lexical:invalid-char', qr/The use of "([^"]+)" in an identifier, while legal, is strongly discouraged, since it can conflict with compiler-generated names. If you are trying to access a nested type, use "([^"]+)" instead of "(?:[^"]+)".$/m ),
-
- new GCCWarning( 'missing-prototypes-mismatch', qr/no previous prototype for `([^']+)'\n${GCCWarning::prefix_regex_noparam}type mismatch with previous implicit declaration\n${GCCWarning::prefix_regex}previous implicit declaration of `[^']+'\n${GCCWarning::prefix_regex_noparam}`[^']+' was previously implicitly declared to return `([^']+)'$/m ),
-
- new GCCWarning( '-Wformat-nonliteral', qr/format not a string literal, argument types not checked$/m ),
- new GCCWarning( '-Wformat-nonliteral', qr/format not a string literal and no format arguments$/m ),
- new GCCWarning( '-Wimplicit-func-decl', qr/implicit declaration of function `([^']+)'$/m ),
- new GCCWarning( '-Wmissing-braces', qr/missing initializer\n${GCCWarning::prefix_regex_noparam}\(near initialization for `([^']+)'\)$/m ),
- new GCCWarning( '-Wunused-parameter', qr/unused parameter `([^']+)'$/m ),
- new GCCWarning( '-Wunused-variable', qr/unused variable `([^']+)'$/m ),
-
- new GCCWarning( '-Wfloat-equal', qr/comparing floating point with == or != is unsafe$/m ),
-
- new GCCWarning( '-Wshadow', qr/declaration of `([^']+)' shadows a global declaration\n${GCCWarning::prefix_regex}shadowed declaration is here$/m ),
- new GCCWarning( '-Wshadow', qr/declaration of `([^']+)' shadows a previous local\n${GCCWarning::prefix_regex}shadowed declaration is here$/m ),
- new GCCWarning( '-Wpointer-arith', qr/pointer of type `([^']+)' used in arithmetic$/m ),
- new GCCWarning( '-Wpointer-arith', qr/pointer of type `([^']+)' used in subtraction$/m ),
- new GCCWarning( '-Wbad-function-cast', qr/cast does not match function type$/m ),
- new GCCWarning( '-Wcast-qual', qr/cast discards qualifiers from pointer target type$/m ),
- new GCCWarning( '-Wcast-qual', qr/initialization discards qualifiers from pointer target type$/m ),
- new GCCWarning( '-Wcast-qual', qr/passing arg (\d+) of `([^']+)' discards qualifiers from pointer target type$/m ),
- new GCCWarning( '-Wcast-qual', qr/return discards qualifiers from pointer target type$/m ),
- new GCCWarning( '-Wcast-qual', qr/assignment discards qualifiers from pointer target type$/m ),
- new GCCWarning( '-Wcast-qual', qr/assignment makes qualified function pointer from unqualified$/m ),
- new GCCWarning( '-Wcast-align', qr/padding struct size to alignment boundary$/m ),
- new GCCWarning( '-Wconversion', qr/negative integer implicitly converted to unsigned type$/m ),
- new GCCWarning( '-Wconversion', qr/passing arg (\d+) of `([^']+)' makes (integer|pointer) from (integer|pointer) without a cast$/m ),
- new GCCWarning( '-Wsign-compare', qr/comparison of unsigned expression < 0 is always false$/m ),
- new GCCWarning( '-Wsign-compare', qr/comparison between signed and unsigned$/m ),
- new GCCWarning( '-Wsign-compare', qr/signed and unsigned type in conditional expression$/m ),
- new GCCWarning( '-Waggregate-return', qr/function call has aggregate value$/m ),
- new GCCWarning( '-Waggregate-return', qr/function returns an aggregate$/m ),
- new GCCWarning( '-Wstrict-prototypes', qr/non-static declaration for `([^']+)' follows static$/m ),
- new GCCWarning( '-Wstrict-prototypes', qr/function declaration isn't a prototype$/m ),
- new GCCWarning( '-Wmissing-prototypes', qr/no previous prototype for `([^']+)'$/m ),
- new GCCWarning( '-Wmissing-declarations' => qr/"([^"]+)" is not defined\s*$/m ),
- new GCCWarning( '-Wmissing-declarations' => qr/`([^']+)' is not defined\s*$/m ),
- new GCCWarning( '-Wmissing-noreturn', qr/function might be possible candidate for attribute `(noreturn)'$/m ),
- new GCCWarning( '-Wmissing-noreturn', qr/`([^']+)' function does return$/m ),
- new GCCWarning( '-Wmissing-format-attribute', qr/function might be possible candidate for `printf' format attribute$/m ),
- new GCCWarning( '-Wpadded', qr/padding struct to align `([^']+)'$/m ),
- new GCCWarning( '-Wredundant-decls', qr/redundant redeclaration of `([^']+)' in same scope\n${GCCWarning::prefix_regex}previous declaration of `[^']+'$/m ),
- new GCCWarning( '-Wnested-externs', qr/nested extern declaration of `([^']+)'$/m ),
- new GCCWarning( '-Wunreachable-code', qr/will never be executed$/m ),
- new GCCWarning( '-Winline', qr/inlining failed in call to `([^']+)'\n${GCCWarning::prefix_regex}called from here$/m ),
-
-
-
-
-
- new GCCWarning( 'traditional', qr/passing arg (\d+) of (?:`([^']+)'|(pointer to function)) with different width due to prototype$/m ),
- new GCCWarning( 'traditional', qr/passing arg (\d+) of (?:`([^']+)'|(pointer to function)) as (unsigned|signed) due to prototype$/m ),
- new GCCWarning( 'traditional', qr/passing arg (\d+) of `([^']+)' as `([^']+)' rather than `([^']+)' due to prototype$/m ),
- new GCCWarning( 'traditional', qr/macro arg `([^']+)' would be stringified with -traditional\.$/m ),
- new GCCWarning( 'traditional', qr/passing arg (\d+) of `([^']+)' as (floating|integer) rather than (floating|integer) due to prototype$/m ),
- new GCCWarning( 'traditional', qr/passing arg (\d+) of (?:`([^']+)'|(pointer to function)) as `([^']+)' rather than `([^']+)' due to prototype$/m ),
- new GCCWarning( 'traditional', qr/passing arg (\d+) of (?:`([^']+)'|(pointer to function)) from incompatible pointer type$/m ),
-
-
- new GCCWarning( 'deprecated-lvalue', qr/use of (compound|conditional|cast) expressions as lvalues is deprecated$/m ),
-
- new GCCWarning( 'foo', qr/`([^']+)' declared inside parameter list$/m ),
- new GCCWarning( 'foo', qr/(assignment|initialization) from incompatible pointer type$/m ),
- new GCCWarning( 'foo', qr/integer constant is too large for "([^"]+)" type$/m ),
-
-);
-
# No User Servicable Parts Below
my %disabled;
-# <auto-number duplicate entries>
-my %duplicated_warnings;
-for ( my $i = 0; $i < @warning_types; $i++ ) {
- my $warning = $warning_types[ $i ];
- my $warning_group = $duplicated_warnings{ $warning->compiler() } ||= {};
- my $warning_name = $warning->name();
- if ( !$warning_group->{ $warning_name } ) {
- $warning_group->{ $warning_name } = $warning;
- } else {
- if ( ref( $warning_group->{ $warning_name } ) ) {
- $warning_group->{ $warning_name }->index( 1 );
- $warning_group->{ $warning_name } = 2;
- }
- $warning->index( $warning_group->{ $warning_name }++ );
- }
-}
-# </auto-number duplicate entries>
-
-# <create name warning map>
-my %warning_map;
-for ( my $i = 0; $i < @warning_types; $i++ ) {
- $warning_map{ $warning_types[ $i ]->name() } = $warning_types[ $i ];
-}
-# </create name warning map>
-
-# <create description name map>
-my %description_map;
-for ( my $i = 0; $i < @descriptions; $i++ ) {
- $description_map{ $descriptions[ $i ]->name() } = $descriptions[ $i ];
-}
-# </create description name map>
-print STDERR Dumper( \%description_map );
-
#print( STDERR join(',', keys( %warning_types ) )."\n" );
+# <read lines into a single text var>
my $text;
my $removeNext = 0;
while (<>) {
@@ -199,19 +77,24 @@
$text .= $_;
}
print( STDERR "done loading: " . length( $text ) . "\n" );
+# </read lines into a single text var>
my %file_errors;
my %error_counts;
my %errors;
my $total_errors = 0;
-for ( my $i = 0; $i < @warning_types; $i++ ) {
- my $warning = $warning_types[ $i ];
+for ( my $i = 0; $i < @Registry::warnings; $i++ ) {
+ my $warning = $Registry::warnings[ $i ];
my $compiler = $warning->compiler();
my $type = $warning->name();
my $regex = $warning->regex();
-print( STDERR "\t$type\t\t" ) if ( !$disabled{ $compiler } );
+ if ( !$disabled{ $compiler } ) {
+ print( STDERR "\t$type" );
+ print( STDERR '*' ) if ( $warning->get_description() );
+ print( STDERR "\t\t" );
+ }
my @matches;
my $scanned = '';
my $count = 0;
@@ -245,13 +128,9 @@
print( "\n" );
foreach my $type ( sort( { $error_counts{ $b } <=> $error_counts{ $a } } keys( %errors ) ) ) {
my $h1 = $errors{ $type };
- my $warning = $warning_map{ $type };
+ my $warning = Registry::get_warning( $type );
print( "Type: $type\n" );
- my $description = $warning->description_text();
- if ( !$description ) {
- $description = $description_map{ $warning->shortName() };
- $description = $description->description() if ( $description );
- }
+ my $description = $warning->get_description();
print( "Description:\n" . join( "", map( { "\t$_\n" } split( "\n", $description ) ) ) ) if ( $description );
print( "Count: $error_counts{ $type }\n" );
foreach my $file ( sort( keys( %$h1 ) ) ) {
More information about the kaffe
mailing list