Commit 637f1455 by Shujing Zhao Committed by Shujing Zhao

re PR c/32207 (missing warnings about address of 'x'.)

gcc/
2010-04-27  Shujing Zhao  <pearly.zhao@oracle.com>

        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  <pearly.zhao@oracle.com>

        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
parent f0423078
2010-04-27 Shujing Zhao <pearly.zhao@oracle.com>
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 <dave.korn.cygwin@gmail.com> 2010-04-27 Dave Korn <dave.korn.cygwin@gmail.com>
PR lto/42776 PR lto/42776
......
...@@ -9503,6 +9503,46 @@ build_binary_op (location_t location, enum tree_code code, ...@@ -9503,6 +9503,46 @@ build_binary_op (location_t location, enum tree_code code,
&& (code1 == INTEGER_TYPE || code1 == REAL_TYPE && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
|| code1 == FIXED_POINT_TYPE || code1 == COMPLEX_TYPE)) || code1 == FIXED_POINT_TYPE || code1 == COMPLEX_TYPE))
short_compare = 1; 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 %<false%> "
"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 %<true%> "
"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 %<false%> "
"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 %<true%> "
"for the address of %qD will never be NULL",
TREE_OPERAND (op1, 0));
}
result_type = type1;
}
else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE) else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
{ {
tree tt0 = TREE_TYPE (type0); tree tt0 = TREE_TYPE (type0);
...@@ -9516,10 +9556,6 @@ build_binary_op (location_t location, enum tree_code code, ...@@ -9516,10 +9556,6 @@ build_binary_op (location_t location, enum tree_code code,
and both must be object or both incomplete. */ and both must be object or both incomplete. */
if (comp_target_types (location, type0, type1)) if (comp_target_types (location, type0, type1))
result_type = common_pointer_type (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)) else if (!addr_space_superset (as0, as1, &as_common))
{ {
error_at (location, "comparison of pointers to " error_at (location, "comparison of pointers to "
...@@ -9551,24 +9587,6 @@ build_binary_op (location_t location, enum tree_code code, ...@@ -9551,24 +9587,6 @@ build_binary_op (location_t location, enum tree_code code,
(build_qualified_type (void_type_node, qual)); (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) else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
{ {
result_type = type0; result_type = type0;
......
2010-04-27 Shujing Zhao <pearly.zhao@oracle.com>
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 <dave.korn.cygwin@gmail.com> 2010-04-27 Dave Korn <dave.korn.cygwin@gmail.com>
PR lto/42776 PR lto/42776
......
...@@ -26,32 +26,32 @@ bar (int a) ...@@ -26,32 +26,32 @@ bar (int a)
foo (5); foo (5);
if (&&lab) /* { dg-warning "7:always evaluate as" "correct warning" } */ if (&&lab) /* { dg-warning "7:always evaluate as" "correct warning" } */
foo (6); 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); foo (7);
if (foo (1) == 0) if (foo (1) == 0)
foo (8); 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); foo (9);
if (i == 0) if (i == 0)
foo (10); 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); foo (11);
if (a == 0) if (a == 0)
foo (12); 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); 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); foo (14);
if (0 == foo (1)) if (0 == foo (1))
foo (15); 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); foo (16);
if (0 == i) if (0 == i)
foo (17); 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); foo (18);
if (0 == a) if (0 == a)
foo (19); 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); foo (20);
} }
...@@ -37,11 +37,11 @@ bar (int a) ...@@ -37,11 +37,11 @@ bar (int a)
foo (9); foo (9);
if (i == 0) if (i == 0)
foo (10); 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); foo (11);
if (a == 0) if (a == 0)
foo (12); 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); foo (13);
if (0 == foo) if (0 == foo)
foo (14); foo (14);
...@@ -51,10 +51,10 @@ bar (int a) ...@@ -51,10 +51,10 @@ bar (int a)
foo (16); foo (16);
if (0 == i) if (0 == i)
foo (17); 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); foo (18);
if (0 == a) if (0 == a)
foo (19); 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); foo (20);
} }
...@@ -19,7 +19,7 @@ void foo (void) ...@@ -19,7 +19,7 @@ void foo (void)
if (p < q) /* { dg-warning "9:comparison of distinct pointer types" } */ if (p < q) /* { dg-warning "9:comparison of distinct pointer types" } */
bar (); bar ();
if (&p == 0) /* { dg-warning "10:will never be NULL" } */ if (&p == 0) /* { dg-warning "10:comparison will always evaluate to 'false'" } */
bar(); bar();
if (p == 4) /* { dg-warning "9:comparison between pointer and integer" } */ if (p == 4) /* { dg-warning "9:comparison between pointer and integer" } */
......
/* Test warning for comparison non-null address with null pointer constant. */
/* Origin: Pawel Sikora <pluto@agmk.net> */
/* { 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'" } */
...@@ -36,13 +36,13 @@ test_func_cmp (void) ...@@ -36,13 +36,13 @@ test_func_cmp (void)
int int
test_func_cmp_rhs_zero (void) 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; 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; 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; 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; return 1;
if (weak_func == 0) if (weak_func == 0)
return 1; return 1;
...@@ -59,13 +59,13 @@ test_func_cmp_rhs_zero (void) ...@@ -59,13 +59,13 @@ test_func_cmp_rhs_zero (void)
int int
test_func_cmp_lhs_zero (void) 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; 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; 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; 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; return 1;
if (0 == weak_func) if (0 == weak_func)
return 1; return 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