Index: cp/typeck.c =================================================================== --- cp/typeck.c (revision 213573) +++ cp/typeck.c (working copy) @@ -4353,12 +4353,11 @@ cp_build_binary_op (location_t location, && (code1 == INTEGER_TYPE || code1 == REAL_TYPE || code1 == COMPLEX_TYPE || code1 == ENUMERAL_TYPE)) short_compare = 1; - else if ((code0 == POINTER_TYPE && code1 == POINTER_TYPE) - || (TYPE_PTRDATAMEM_P (type0) && TYPE_PTRDATAMEM_P (type1))) - result_type = composite_pointer_type (type0, type1, op0, op1, - CPO_COMPARISON, complain); else if ((code0 == POINTER_TYPE || TYPE_PTRDATAMEM_P (type0)) - && null_ptr_cst_p (op1)) + && (null_ptr_cst_p (op1) + /* Handle (void*)0 too. */ + || (TYPE_PTR_P (type1) && VOID_TYPE_P (TREE_TYPE (type1)) + && integer_zerop (op1)))) { if (TREE_CODE (op0) == ADDR_EXPR && decl_with_nonnull_addr_p (TREE_OPERAND (op0, 0))) @@ -4371,7 +4370,10 @@ cp_build_binary_op (location_t location, result_type = type0; } else if ((code1 == POINTER_TYPE || TYPE_PTRDATAMEM_P (type1)) - && null_ptr_cst_p (op0)) + && (null_ptr_cst_p (op0) + /* Handle (void*)0 too. */ + || (TYPE_PTR_P (type0) && VOID_TYPE_P (TREE_TYPE (type0)) + && integer_zerop (op0)))) { if (TREE_CODE (op1) == ADDR_EXPR && decl_with_nonnull_addr_p (TREE_OPERAND (op1, 0))) @@ -4383,6 +4385,10 @@ cp_build_binary_op (location_t location, } result_type = type1; } + else if ((code0 == POINTER_TYPE && code1 == POINTER_TYPE) + || (TYPE_PTRDATAMEM_P (type0) && TYPE_PTRDATAMEM_P (type1))) + result_type = composite_pointer_type (type0, type1, op0, op1, + CPO_COMPARISON, complain); else if (null_ptr_cst_p (op0) && null_ptr_cst_p (op1)) /* One of the operands must be of nullptr_t type. */ result_type = TREE_TYPE (nullptr_node); Index: testsuite/g++.dg/warn/Waddress-1.C =================================================================== --- testsuite/g++.dg/warn/Waddress-1.C (revision 0) +++ testsuite/g++.dg/warn/Waddress-1.C (working copy) @@ -0,0 +1,7 @@ +// PR c++/43906 +// { dg-options "-Waddress" } + +extern void z(); +void f() { if ( z ) z(); } // { dg-warning "address" } +void g() { if ( z != 0 ) z(); } // { dg-warning "address" } +void h() { if ( z != (void*)0 ) z(); } // { dg-warning "address" }