From 637f14555ef13026fa5ea1c48a19bf4ec69757db Mon Sep 17 00:00:00 2001 From: Shujing Zhao Date: Tue, 27 Apr 2010 02:40:19 +0000 Subject: [PATCH] re PR c/32207 (missing warnings about address of 'x'.) gcc/ 2010-04-27 Shujing Zhao PR c/32207 * c-typeck.c (build_binary_op): Move forward check for comparison pointer with null pointer constant and adjust the diagnostic message. gcc/testsuite/ 2010-04-27 Shujing Zhao PR c/32207 * gcc.dg/pr32207.c: New test. * gcc.dg/misc-column.c: Adjust expected warning. * gcc.dg/Walways-true-1.c: Likewise. * gcc.dg/Walways-true-2.c: Likewise. * gcc.dg/warn-addr-cmp.c: Likewise. From-SVN: r158765 --- gcc/ChangeLog | 6 ++++ gcc/c-typeck.c | 62 ++++++++++++++++++++++------------- gcc/testsuite/ChangeLog | 9 +++++ gcc/testsuite/gcc.dg/Walways-true-1.c | 16 ++++----- gcc/testsuite/gcc.dg/Walways-true-2.c | 8 ++--- gcc/testsuite/gcc.dg/misc-column.c | 2 +- gcc/testsuite/gcc.dg/pr32207.c | 9 +++++ gcc/testsuite/gcc.dg/warn-addr-cmp.c | 16 ++++----- 8 files changed, 85 insertions(+), 43 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr32207.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e5f963d..26b5d22 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-04-27 Shujing Zhao + + PR c/32207 + * c-typeck.c (build_binary_op): Move forward check for comparison + pointer with null pointer constant and adjust the diagnostic message. + 2010-04-27 Dave Korn PR lto/42776 diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index df02975..96b2ab1 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -9503,6 +9503,46 @@ build_binary_op (location_t location, enum tree_code code, && (code1 == INTEGER_TYPE || code1 == REAL_TYPE || code1 == FIXED_POINT_TYPE || code1 == COMPLEX_TYPE)) short_compare = 1; + else if (code0 == POINTER_TYPE && null_pointer_constant_p (orig_op1)) + { + if (TREE_CODE (op0) == ADDR_EXPR + && decl_with_nonnull_addr_p (TREE_OPERAND (op0, 0))) + { + if (code == EQ_EXPR) + warning_at (location, + OPT_Waddress, + "the comparison will always evaluate as % " + "for the address of %qD will never be NULL", + TREE_OPERAND (op0, 0)); + else + warning_at (location, + OPT_Waddress, + "the comparison will always evaluate as % " + "for the address of %qD will never be NULL", + TREE_OPERAND (op0, 0)); + } + result_type = type0; + } + else if (code1 == POINTER_TYPE && null_pointer_constant_p (orig_op0)) + { + if (TREE_CODE (op1) == ADDR_EXPR + && decl_with_nonnull_addr_p (TREE_OPERAND (op1, 0))) + { + if (code == EQ_EXPR) + warning_at (location, + OPT_Waddress, + "the comparison will always evaluate as % " + "for the address of %qD will never be NULL", + TREE_OPERAND (op1, 0)); + else + warning_at (location, + OPT_Waddress, + "the comparison will always evaluate as % " + "for the address of %qD will never be NULL", + TREE_OPERAND (op1, 0)); + } + result_type = type1; + } else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE) { tree tt0 = TREE_TYPE (type0); @@ -9516,10 +9556,6 @@ build_binary_op (location_t location, enum tree_code code, and both must be object or both incomplete. */ if (comp_target_types (location, type0, type1)) result_type = common_pointer_type (type0, type1); - else if (null_pointer_constant_p (orig_op0)) - result_type = type1; - else if (null_pointer_constant_p (orig_op1)) - result_type = type0; else if (!addr_space_superset (as0, as1, &as_common)) { error_at (location, "comparison of pointers to " @@ -9551,24 +9587,6 @@ build_binary_op (location_t location, enum tree_code code, (build_qualified_type (void_type_node, qual)); } } - else if (code0 == POINTER_TYPE && null_pointer_constant_p (orig_op1)) - { - if (TREE_CODE (op0) == ADDR_EXPR - && decl_with_nonnull_addr_p (TREE_OPERAND (op0, 0))) - warning_at (location, - OPT_Waddress, "the address of %qD will never be NULL", - TREE_OPERAND (op0, 0)); - result_type = type0; - } - else if (code1 == POINTER_TYPE && null_pointer_constant_p (orig_op0)) - { - if (TREE_CODE (op1) == ADDR_EXPR - && decl_with_nonnull_addr_p (TREE_OPERAND (op1, 0))) - warning_at (location, - OPT_Waddress, "the address of %qD will never be NULL", - TREE_OPERAND (op1, 0)); - result_type = type1; - } else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE) { result_type = type0; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a025895..e94e8e7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2010-04-27 Shujing Zhao + + PR c/32207 + * gcc.dg/pr32207.c: New test. + * gcc.dg/misc-column.c: Adjust expected warning. + * gcc.dg/Walways-true-1.c: Likewise. + * gcc.dg/Walways-true-2.c: Likewise. + * gcc.dg/warn-addr-cmp.c: Likewise. + 2010-04-27 Dave Korn PR lto/42776 diff --git a/gcc/testsuite/gcc.dg/Walways-true-1.c b/gcc/testsuite/gcc.dg/Walways-true-1.c index 32b921c..274ec32 100644 --- a/gcc/testsuite/gcc.dg/Walways-true-1.c +++ b/gcc/testsuite/gcc.dg/Walways-true-1.c @@ -26,32 +26,32 @@ bar (int a) foo (5); if (&&lab) /* { dg-warning "7:always evaluate as" "correct warning" } */ foo (6); - if (foo == 0) /* { dg-warning "11:never be NULL" "correct warning" } */ + if (foo == 0) /* { dg-warning "11:the comparison will always evaluate to 'false'" "correct warning" } */ foo (7); if (foo (1) == 0) foo (8); - if (&i == 0) /* { dg-warning "10:never be NULL" "correct warning" } */ + if (&i == 0) /* { dg-warning "10:the comparison will always evaluate to 'false'" "correct warning" } */ foo (9); if (i == 0) foo (10); - if (&a == 0) /* { dg-warning "10:never be NULL" "correct warning" } */ + if (&a == 0) /* { dg-warning "10:the comparison will always evaluate to 'false'" "correct warning" } */ foo (11); if (a == 0) foo (12); - if (&&lab == 0) /* { dg-warning "13:never be NULL" "correct warning" } */ + if (&&lab == 0) /* { dg-warning "13:the comparison will always evaluate to 'false'" "correct warning" } */ foo (13); - if (0 == foo) /* { dg-warning "9:never be NULL" "correct warning" } */ + if (0 == foo) /* { dg-warning "9:the comparison will always evaluate to 'false'" "correct warning" } */ foo (14); if (0 == foo (1)) foo (15); - if (0 == &i) /* { dg-warning "9:never be NULL" "correct warning" } */ + if (0 == &i) /* { dg-warning "9:the comparison will always evaluate to 'false'" "correct warning" } */ foo (16); if (0 == i) foo (17); - if (0 == &a) /* { dg-warning "9:never be NULL" "correct warning" } */ + if (0 == &a) /* { dg-warning "9:the comparison will always evaluate to 'false'" "correct warning" } */ foo (18); if (0 == a) foo (19); - if (0 == &&lab) /* { dg-warning "9:never be NULL" "correct warning" } */ + if (0 == &&lab) /* { dg-warning "9:the comparison will always evaluate to 'false'" "correct warning" } */ foo (20); } diff --git a/gcc/testsuite/gcc.dg/Walways-true-2.c b/gcc/testsuite/gcc.dg/Walways-true-2.c index c14857e..3978a44 100644 --- a/gcc/testsuite/gcc.dg/Walways-true-2.c +++ b/gcc/testsuite/gcc.dg/Walways-true-2.c @@ -37,11 +37,11 @@ bar (int a) foo (9); if (i == 0) foo (10); - if (&a == 0) /* { dg-warning "never be NULL" "correct warning" } */ + if (&a == 0) /* { dg-warning "the comparison will always evaluate to 'false'" "correct warning" } */ foo (11); if (a == 0) foo (12); - if (&&lab == 0) /* { dg-warning "never be NULL" "correct warning" } */ + if (&&lab == 0) /* { dg-warning "the comparison will always evaluate to 'false'" "correct warning" } */ foo (13); if (0 == foo) foo (14); @@ -51,10 +51,10 @@ bar (int a) foo (16); if (0 == i) foo (17); - if (0 == &a) /* { dg-warning "never be NULL" "correct warning" } */ + if (0 == &a) /* { dg-warning "the comparison will always evaluate to 'false'" "correct warning" } */ foo (18); if (0 == a) foo (19); - if (0 == &&lab) /* { dg-warning "never be NULL" "correct warning" } */ + if (0 == &&lab) /* { dg-warning "the comparison will always evaluate to 'false'" "correct warning" } */ foo (20); } diff --git a/gcc/testsuite/gcc.dg/misc-column.c b/gcc/testsuite/gcc.dg/misc-column.c index a24427e..f69f988 100644 --- a/gcc/testsuite/gcc.dg/misc-column.c +++ b/gcc/testsuite/gcc.dg/misc-column.c @@ -19,7 +19,7 @@ void foo (void) if (p < q) /* { dg-warning "9:comparison of distinct pointer types" } */ bar (); - if (&p == 0) /* { dg-warning "10:will never be NULL" } */ + if (&p == 0) /* { dg-warning "10:comparison will always evaluate to 'false'" } */ bar(); if (p == 4) /* { dg-warning "9:comparison between pointer and integer" } */ diff --git a/gcc/testsuite/gcc.dg/pr32207.c b/gcc/testsuite/gcc.dg/pr32207.c new file mode 100644 index 0000000..549d51a --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr32207.c @@ -0,0 +1,9 @@ +/* Test warning for comparison non-null address with null pointer constant. */ +/* Origin: Pawel Sikora */ +/* { dg-do compile } */ +/* { dg-options "-Waddress" } */ +extern void z(); + +void f() { if ( z ) z(); } /* { dg-warning "always evaluate as" } */ +void g() { if ( z != 0 ) z(); } /* { dg-warning "the comparison will always evaluate to 'true'" } */ +void h() { if ( z != (void*)0 ) z(); } /* { dg-warning "the comparison will always evaluate to 'true'" } */ diff --git a/gcc/testsuite/gcc.dg/warn-addr-cmp.c b/gcc/testsuite/gcc.dg/warn-addr-cmp.c index 6ad9473..c1e68f5 100644 --- a/gcc/testsuite/gcc.dg/warn-addr-cmp.c +++ b/gcc/testsuite/gcc.dg/warn-addr-cmp.c @@ -36,13 +36,13 @@ test_func_cmp (void) int test_func_cmp_rhs_zero (void) { - if (func == 0) /* { dg-warning "the address of 'func'" } */ + if (func == 0) /* { dg-warning "the comparison will always evaluate to 'false'" } */ return 1; - if (func != 0) /* { dg-warning "the address of 'func'" } */ + if (func != 0) /* { dg-warning "the comparison will always evaluate to 'true'" } */ return 1; - if (&var == 0) /* { dg-warning "the address of 'var'" } */ + if (&var == 0) /* { dg-warning "the comparison will always evaluate to 'false'" } */ return 1; - if (&var != 0) /* { dg-warning "the address of 'var'" } */ + if (&var != 0) /* { dg-warning "the comparison will always evaluate to 'true'" } */ return 1; if (weak_func == 0) return 1; @@ -59,13 +59,13 @@ test_func_cmp_rhs_zero (void) int test_func_cmp_lhs_zero (void) { - if (0 == func) /* { dg-warning "the address of 'func'" } */ + if (0 == func) /* { dg-warning "the comparison will always evaluate to 'false'" } */ return 1; - if (0 != func) /* { dg-warning "the address of 'func'" } */ + if (0 != func) /* { dg-warning "the comparison will always evaluate to 'true'" } */ return 1; - if (0 == &var) /* { dg-warning "the address of 'var'" } */ + if (0 == &var) /* { dg-warning "the comparison will always evaluate to 'false'" } */ return 1; - if (0 != &var) /* { dg-warning "the address of 'var'" } */ + if (0 != &var) /* { dg-warning "the comparison will always evaluate to 'true'" } */ return 1; if (0 == weak_func) return 1; -- 2.7.4