Commit 6c36d76b by Neil Booth Committed by Neil Booth

c-common.c (warn_div_by_zero): New.

	* c-common.c (warn_div_by_zero): New.
	* c-common.h (warn_div_by_zero): New.
	* c-decl.c (c_decode_option): Take it on the command line.
 	* c-typeck.c (build_binary_op): Warn about division by zero.
	* doc/invoke.texi: Document the new command line option, fix
	documentation of -Wmultichar.
 	* testsuite/gcc.dg/divbyzero.c: New tests.
 	* testsuite/gcc.dg/noncompile/20010524-1.c: Update.

From-SVN: r46439
parent 28a8851e
2001-10-22 Neil Booth <neil@daikokuya.demon.co.uk>
* c-common.c (warn_div_by_zero): New.
* c-common.h (warn_div_by_zero): New.
* c-decl.c (c_decode_option): Take it on the command line.
* c-typeck.c (build_binary_op): Warn about division by zero.
* doc/invoke.texi: Document the new command line option, fix
documentation of -Wmultichar.
* testsuite/gcc.dg/divbyzero.c: New tests.
* testsuite/gcc.dg/noncompile/20010524-1.c: Update.
Tue Oct 23 15:30:23 CEST 2001 Jan Hubicka <jh@suse.cz> Tue Oct 23 15:30:23 CEST 2001 Jan Hubicka <jh@suse.cz>
* i386.c (ix86_expand_int_movcc): Cleanup; use expand_simple_*op. * i386.c (ix86_expand_int_movcc): Cleanup; use expand_simple_*op.
......
...@@ -194,6 +194,9 @@ int flag_short_wchar; ...@@ -194,6 +194,9 @@ int flag_short_wchar;
int warn_sequence_point; int warn_sequence_point;
/* Nonzero means to warn about compile-time division by zero. */
int warn_div_by_zero = 1;
/* The elements of `ridpointers' are identifier nodes for the reserved /* The elements of `ridpointers' are identifier nodes for the reserved
type names and storage classes. It is indexed by a RID_... value. */ type names and storage classes. It is indexed by a RID_... value. */
tree *ridpointers; tree *ridpointers;
......
...@@ -401,6 +401,9 @@ extern int warn_missing_format_attribute; ...@@ -401,6 +401,9 @@ extern int warn_missing_format_attribute;
extern int warn_pointer_arith; extern int warn_pointer_arith;
/* Nonzero means to warn about compile-time division by zero. */
extern int warn_div_by_zero;
/* Nonzero means do some things the same way PCC does. */ /* Nonzero means do some things the same way PCC does. */
extern int flag_traditional; extern int flag_traditional;
......
...@@ -750,6 +750,10 @@ c_decode_option (argc, argv) ...@@ -750,6 +750,10 @@ c_decode_option (argc, argv)
warn_multichar = 1; warn_multichar = 1;
else if (!strcmp (p, "-Wno-multichar")) else if (!strcmp (p, "-Wno-multichar"))
warn_multichar = 0; warn_multichar = 0;
else if (!strcmp (p, "-Wdiv-by-zero"))
warn_div_by_zero = 1;
else if (!strcmp (p, "-Wno-div-by-zero"))
warn_div_by_zero = 0;
else if (!strcmp (p, "-Wunknown-pragmas")) else if (!strcmp (p, "-Wunknown-pragmas"))
/* Set to greater than 1, so that even unknown pragmas in system /* Set to greater than 1, so that even unknown pragmas in system
headers will be warned about. */ headers will be warned about. */
......
...@@ -1973,6 +1973,11 @@ build_binary_op (code, orig_op0, orig_op1, convert_p) ...@@ -1973,6 +1973,11 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
case FLOOR_DIV_EXPR: case FLOOR_DIV_EXPR:
case ROUND_DIV_EXPR: case ROUND_DIV_EXPR:
case EXACT_DIV_EXPR: case EXACT_DIV_EXPR:
/* Floating point division by zero is a legitimate way to obtain
infinities and NaNs. */
if (warn_div_by_zero && skip_evaluation == 0 && integer_zerop (op1))
warning ("division by zero");
if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
|| code0 == COMPLEX_TYPE) || code0 == COMPLEX_TYPE)
&& (code1 == INTEGER_TYPE || code1 == REAL_TYPE && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
...@@ -2026,6 +2031,9 @@ build_binary_op (code, orig_op0, orig_op1, convert_p) ...@@ -2026,6 +2031,9 @@ build_binary_op (code, orig_op0, orig_op1, convert_p)
case TRUNC_MOD_EXPR: case TRUNC_MOD_EXPR:
case FLOOR_MOD_EXPR: case FLOOR_MOD_EXPR:
if (warn_div_by_zero && skip_evaluation == 0 && integer_zerop (op1))
warning ("division by zero");
if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE) if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
{ {
/* Although it would be tempting to shorten always here, that loses /* Although it would be tempting to shorten always here, that loses
......
...@@ -208,7 +208,7 @@ in the following sections. ...@@ -208,7 +208,7 @@ in the following sections.
-fsyntax-only -pedantic -pedantic-errors @gol -fsyntax-only -pedantic -pedantic-errors @gol
-w -W -Wall -Waggregate-return @gol -w -W -Wall -Waggregate-return @gol
-Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment @gol -Wcast-align -Wcast-qual -Wchar-subscripts -Wcomment @gol
-Wconversion -Wdisabled-optimization -Werror @gol -Wconversion -Wdisabled-optimization -Wdiv-by-zero -Werror @gol
-Wfloat-equal -Wformat -Wformat=2 @gol -Wfloat-equal -Wformat -Wformat=2 @gol
-Wformat-nonliteral -Wformat-security @gol -Wformat-nonliteral -Wformat-security @gol
-Wimplicit -Wimplicit-int @gol -Wimplicit -Wimplicit-int @gol
...@@ -1868,12 +1868,6 @@ int a[2][2] = @{ 0, 1, 2, 3 @}; ...@@ -1868,12 +1868,6 @@ int a[2][2] = @{ 0, 1, 2, 3 @};
int b[2][2] = @{ @{ 0, 1 @}, @{ 2, 3 @} @}; int b[2][2] = @{ @{ 0, 1 @}, @{ 2, 3 @} @};
@end smallexample @end smallexample
@item -Wmultichar
@opindex Wmultichar
Warn if a multicharacter constant (@samp{'FOOF'}) is used. Usually they
indicate a typo in the user's code, as they have implementation-defined
values, and should not be used in portable code.
@item -Wparentheses @item -Wparentheses
@opindex Wparentheses @opindex Wparentheses
Warn if parentheses are omitted in certain contexts, such Warn if parentheses are omitted in certain contexts, such
...@@ -2129,6 +2123,22 @@ warnings about constructions that some users consider questionable, and ...@@ -2129,6 +2123,22 @@ warnings about constructions that some users consider questionable, and
that are easy to avoid (or modify to prevent the warning), even in that are easy to avoid (or modify to prevent the warning), even in
conjunction with macros. conjunction with macros.
@item -Wdiv-by-zero
@opindex Wno-div-by-zero
@opindex Wdiv-by-zero
Warn about compile-time integer division by zero. This is default. To
inhibit the warning messages, use @option{-Wno-div-by-zero}. Floating
point division by zero is not warned about, as it can be a legitimate
way of obtaining infinities and NaNs.
@item -Wmultichar
@opindex Wno-multichar
@opindex Wmultichar
Warn if a multicharacter constant (@samp{'FOOF'}) is used. This is
default. To inhibit the warning messages, use @option{-Wno-multichar}.
Usually they indicate a typo in the user's code, as they have
implementation-defined values, and should not be used in portable code.
@item -Wsystem-headers @item -Wsystem-headers
@opindex Wsystem-headers @opindex Wsystem-headers
@cindex warnings from system headers @cindex warnings from system headers
......
/* Copyright (C) 2001 Free Software Foundation, Inc. */
/* { dg-do compile } */
/* Source: Neil Booth, Oct 22 2001. PR 150 - warn about division by
zero. */
#define ZERO (4 - 6 + 2)
int main (int argc, char *argv[])
{
int w = argc % ZERO; /* { dg-warning "division by zero" } */
int x = argc / 0; /* { dg-warning "division by zero" } */
int y = argc / ZERO; /* { dg-warning "division by zero" } */
double z = 0.0 / 0.0 ; /* { dg-bogus "division by zero" } */
w = (ZERO ? y / ZERO : x); /* { dg-bogus "division by zero" } */
x = (ZERO ? argc % ZERO: x); /* { dg-bogus "division by zero" } */
return 0;
}
int i = 7 / 0; /* { dg-error "not constant" } */ int i = 7 / 0; /* { dg-error "not constant" } */
/* { dg-warning "division by zero" "div by zero" { target *-*-* } 1 } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment