+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>
PR lto/42776
&& (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 %<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)
{
tree tt0 = TREE_TYPE (type0);
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 "
(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;
+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>
PR lto/42776
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);
}
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);
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);
}
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" } */
--- /dev/null
+/* 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'" } */
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;
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;