From: Jakub Jelinek Date: Sat, 16 Mar 2013 19:35:41 +0000 (+0100) Subject: re PR c++/56607 (GCC fails to warn on division by zero) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=87eb16a1bc6cb76e3078d93ba068a35aaa487279;p=gcc.git re PR c++/56607 (GCC fails to warn on division by zero) PR c++/56607 * typeck.c (cp_build_binary_op): When calling warn_for_div_by_zero, pass op1 through maybe_constant_value first. * g++.dg/warn/Wdiv-by-zero-2.C: New test. * c-c++-common/pr56607.c: New test. From-SVN: r196704 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3f05f291ea6..dc61d9b26b6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-03-16 Jakub Jelinek + + PR c++/56607 + * typeck.c (cp_build_binary_op): When calling warn_for_div_by_zero, + pass op1 through maybe_constant_value first. + 2013-03-16 Paolo Carlini PR c++/56582 diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 58ebcc0ab2d..96e0ad8de9a 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -4015,7 +4015,7 @@ cp_build_binary_op (location_t location, { enum tree_code tcode0 = code0, tcode1 = code1; - warn_for_div_by_zero (location, op1); + warn_for_div_by_zero (location, maybe_constant_value (op1)); if (tcode0 == COMPLEX_TYPE || tcode0 == VECTOR_TYPE) tcode0 = TREE_CODE (TREE_TYPE (TREE_TYPE (op0))); @@ -4051,7 +4051,7 @@ cp_build_binary_op (location_t location, case TRUNC_MOD_EXPR: case FLOOR_MOD_EXPR: - warn_for_div_by_zero (location, op1); + warn_for_div_by_zero (location, maybe_constant_value (op1)); if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE && TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f9fb7f63e6a..db0f92ec463 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-03-16 Jakub Jelinek + + PR c++/56607 + * g++.dg/warn/Wdiv-by-zero-2.C: New test. + * c-c++-common/pr56607.c: New test. + 2013-03-16 Paolo Carlini PR c++/56582 diff --git a/gcc/testsuite/c-c++-common/pr56607.c b/gcc/testsuite/c-c++-common/pr56607.c new file mode 100644 index 00000000000..d7faa81151a --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr56607.c @@ -0,0 +1,29 @@ +/* PR c++/56607 */ +/* { dg-do compile { target { { lp64 || ilp32 } || llp64 } } } */ +/* { dg-options "-O2 -Wdiv-by-zero" } */ + +int +f1 (void) +{ + return 1 / (sizeof (char) - 1); /* { dg-warning "division by zero" } */ +} + +int +f2 (void) +{ + const int x = sizeof (char) - 1; + return 1 / x; /* { dg-warning "division by zero" "" { target c++ } } */ +} + +int +f3 (void) +{ + return 1 / (sizeof (int) / 3 - 1); /* { dg-warning "division by zero" } */ +} + +int +f4 (void) +{ + const int x = sizeof (int) / 3 - 1; + return 1 / x; /* { dg-warning "division by zero" "" { target c++ } } */ +} diff --git a/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-2.C b/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-2.C new file mode 100644 index 00000000000..d7e226ce0a5 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wdiv-by-zero-2.C @@ -0,0 +1,34 @@ +// PR c++/56607 +// { dg-do compile { target { { lp64 || ilp32 } || llp64 } } } +// { dg-options "-O2 -Wdiv-by-zero -std=c++11" } + +constexpr int sc () { return sizeof (char); } +constexpr int si () { return sizeof (int); } +constexpr int zc () { return sc () - 1; } +constexpr int zi (int d) { return si () / d - 1; } + +int +f1 (void) +{ + return 1 / zc (); // { dg-warning "division by zero" } +} + +int +f2 (void) +{ + constexpr int x = zc (); + return 1 / x; // { dg-warning "division by zero" } +} + +int +f3 (void) +{ + return 1 / zi (3); // { dg-warning "division by zero" } +} + +int +f4 (void) +{ + constexpr int x = zi (3); + return 1 / x; // { dg-warning "division by zero" } +}