aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
-rwxr-xr-xcgcc2
-rw-r--r--lib.c49
-rw-r--r--lib.h1
-rw-r--r--sparse.13
-rw-r--r--sparse.c3
-rwxr-xr-xvalidation/test-suite18
6 files changed, 49 insertions, 27 deletions
diff --git a/cgcc b/cgcc
index c075e5f1..204bda35 100755
--- a/cgcc
+++ b/cgcc
@@ -70,7 +70,7 @@ if ($do_check) {
print "$check\n" if $verbose;
if ($do_compile) {
- system ($check);
+ system ($check) == 0 or die;
} else {
exec ($check);
}
diff --git a/lib.c b/lib.c
index 4e6fc81c..83956623 100644
--- a/lib.c
+++ b/lib.c
@@ -126,25 +126,6 @@ void info(struct position pos, const char * fmt, ...)
va_end(args);
}
-void warning(struct position pos, const char * fmt, ...)
-{
- va_list args;
-
- if (!max_warnings) {
- show_info = 0;
- return;
- }
-
- if (!--max_warnings) {
- show_info = 0;
- fmt = "too many warnings";
- }
-
- va_start(args, fmt);
- do_warn("warning: ", pos, fmt, args);
- va_end(args);
-}
-
static void do_error(struct position pos, const char * fmt, va_list args)
{
static int errors = 0;
@@ -165,6 +146,32 @@ static void do_error(struct position pos, const char * fmt, va_list args)
errors++;
}
+void warning(struct position pos, const char * fmt, ...)
+{
+ va_list args;
+
+ if (Werror) {
+ va_start(args, fmt);
+ do_error(pos, fmt, args);
+ va_end(args);
+ return;
+ }
+
+ if (!max_warnings) {
+ show_info = 0;
+ return;
+ }
+
+ if (!--max_warnings) {
+ show_info = 0;
+ fmt = "too many warnings";
+ }
+
+ va_start(args, fmt);
+ do_warn("warning: ", pos, fmt, args);
+ va_end(args);
+}
+
void sparse_error(struct position pos, const char * fmt, ...)
{
va_list args;
@@ -219,6 +226,7 @@ int Wdesignated_init = 1;
int Wdo_while = 0;
int Winit_cstring = 0;
int Wenum_mismatch = 1;
+int Werror = 0;
int Wnon_pointer_null = 1;
int Wold_initializer = 1;
int Wone_bit_signed_bitfield = 1;
@@ -431,6 +439,7 @@ static const struct warning {
{ "designated-init", &Wdesignated_init },
{ "do-while", &Wdo_while },
{ "enum-mismatch", &Wenum_mismatch },
+ { "error", &Werror },
{ "init-cstring", &Winit_cstring },
{ "non-pointer-null", &Wnon_pointer_null },
{ "old-initializer", &Wold_initializer },
@@ -462,7 +471,7 @@ static char **handle_onoff_switch(char *arg, char **next, const struct warning w
if (!strcmp(p, "sparse-all")) {
for (i = 0; i < n; i++) {
- if (*warnings[i].flag != WARNING_FORCE_OFF)
+ if (*warnings[i].flag != WARNING_FORCE_OFF && warnings[i].flag != &Werror)
*warnings[i].flag = WARNING_ON;
}
}
diff --git a/lib.h b/lib.h
index f6cd9b4d..dc016840 100644
--- a/lib.h
+++ b/lib.h
@@ -112,6 +112,7 @@ extern int Wdefault_bitfield_sign;
extern int Wdesignated_init;
extern int Wdo_while;
extern int Wenum_mismatch;
+extern int Werror;
extern int Winit_cstring;
extern int Wnon_pointer_null;
extern int Wold_initializer;
diff --git a/sparse.1 b/sparse.1
index 54da09b5..acdce531 100644
--- a/sparse.1
+++ b/sparse.1
@@ -24,6 +24,9 @@ off those warnings, pass the negation of the associated warning option,
Turn on all sparse warnings, except for those explicitly disabled via
\fB\-Wno\-something\fR.
.TP
+.B \-Werror
+Turn all sparse warnings into errors.
+.TP
.B \-Waddress\-space
Warn about code which mixes pointers to different address spaces.
diff --git a/sparse.c b/sparse.c
index 233585b3..7d389b1e 100644
--- a/sparse.c
+++ b/sparse.c
@@ -287,6 +287,9 @@ static void check_symbols(struct symbol_list *list)
check_context(ep);
}
} END_FOR_EACH_PTR(sym);
+
+ if (die_if_error)
+ exit(1);
}
int main(int argc, char **argv)
diff --git a/validation/test-suite b/validation/test-suite
index 3c011c6a..61667a56 100755
--- a/validation/test-suite
+++ b/validation/test-suite
@@ -106,20 +106,26 @@ do_test()
fi
verbose "Using command : $cmd"
+ # grab the expected output
+ sed -n '/check-output-start/,/check-output-end/p' $file \
+ | grep -v check-output > "$file".output.expected
+ sed -n '/check-error-start/,/check-error-end/p' $file \
+ | grep -v check-error > "$file".error.expected
+
# grab the expected exit value
get_value "check-exit-value" $file
if [ "$?" -eq "0" ]; then
expected_exit_value=`echo $last_result | tr -d ' '`
else
- expected_exit_value=0
+ grep -q -E "^[^:]+:[[:digit:]]+:[[:digit:]]+: error:" "$file".error.expected
+ if [ "$?" -eq "0" ]; then
+ expected_exit_value=1
+ else
+ expected_exit_value=0
+ fi
fi
verbose "Expecting exit value: $expected_exit_value"
- # grab the expected output
- sed -n '/check-output-start/,/check-output-end/p' $file \
- | grep -v check-output > "$file".output.expected
- sed -n '/check-error-start/,/check-error-end/p' $file \
- | grep -v check-error > "$file".error.expected
# grab the actual output & exit value
$cmd 1> $file.output.got 2> $file.error.got