|| code1 == COMPLEX_TYPE || code1 == ENUMERAL_TYPE))
short_compare = 1;
else if (((code0 == POINTER_TYPE || TYPE_PTRDATAMEM_P (type0))
- && null_ptr_cst_p (op1))
+ && null_ptr_cst_p (orig_op1))
/* Handle, eg, (void*)0 (c++/43906), and more. */
|| (code0 == POINTER_TYPE
&& TYPE_PTR_P (type1) && integer_zerop (op1)))
warn_for_null_address (location, op0, complain);
}
else if (((code1 == POINTER_TYPE || TYPE_PTRDATAMEM_P (type1))
- && null_ptr_cst_p (op0))
+ && null_ptr_cst_p (orig_op0))
/* Handle, eg, (void*)0 (c++/43906), and more. */
|| (code1 == POINTER_TYPE
&& TYPE_PTR_P (type0) && integer_zerop (op0)))
|| (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))
+ else if (null_ptr_cst_p (orig_op0) && null_ptr_cst_p (orig_op1))
/* One of the operands must be of nullptr_t type. */
result_type = TREE_TYPE (nullptr_node);
else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
else
return error_mark_node;
}
- else if (TYPE_PTRMEMFUNC_P (type0) && null_ptr_cst_p (op1))
+ else if (TYPE_PTRMEMFUNC_P (type0) && null_ptr_cst_p (orig_op1))
{
if (TARGET_PTRMEMFUNC_VBIT_LOCATION
== ptrmemfunc_vbit_in_delta)
}
result_type = TREE_TYPE (op0);
}
- else if (TYPE_PTRMEMFUNC_P (type1) && null_ptr_cst_p (op0))
+ else if (TYPE_PTRMEMFUNC_P (type1) && null_ptr_cst_p (orig_op0))
return cp_build_binary_op (location, code, op1, op0, complain);
else if (TYPE_PTRMEMFUNC_P (type0) && TYPE_PTRMEMFUNC_P (type1))
{
else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
result_type = composite_pointer_type (type0, type1, op0, op1,
CPO_COMPARISON, complain);
- else if (code0 == POINTER_TYPE && null_ptr_cst_p (op1))
+ else if (code0 == POINTER_TYPE && null_ptr_cst_p (orig_op1))
{
result_type = type0;
if (extra_warnings && (complain & tf_warning))
warning (OPT_Wextra,
"ordered comparison of pointer with integer zero");
}
- else if (code1 == POINTER_TYPE && null_ptr_cst_p (op0))
+ else if (code1 == POINTER_TYPE && null_ptr_cst_p (orig_op0))
{
result_type = type1;
if (extra_warnings && (complain & tf_warning))
warning (OPT_Wextra,
"ordered comparison of pointer with integer zero");
}
- else if (null_ptr_cst_p (op0) && null_ptr_cst_p (op1))
+ else if (null_ptr_cst_p (orig_op0) && null_ptr_cst_p (orig_op1))
/* One of the operands must be of nullptr_t type. */
result_type = TREE_TYPE (nullptr_node);
else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
--- /dev/null
+/* PR c++/64767 */
+// { dg-do compile { target c++11 } }
+
+int
+f1 (int *p, int **q)
+{
+ int r = 0;
+
+ r += p == '\0'; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += p == L'\0'; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += p == u'\0'; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += p == U'\0'; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += p != '\0'; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += p != L'\0'; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += p != u'\0'; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += p != U'\0'; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+
+ r += '\0' == p; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += L'\0' == p; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += u'\0' == p; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += U'\0' == p; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += '\0' != p; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += L'\0' != p; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += u'\0' != p; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += U'\0' != p; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+
+ r += q == '\0'; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += q == L'\0'; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += q == u'\0'; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += q == U'\0'; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += q != '\0'; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += q != L'\0'; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += q != u'\0'; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += q != U'\0'; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+
+ r += '\0' == q; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += L'\0' == q; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += u'\0' == q; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += U'\0' == q; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += '\0' != q; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += L'\0' != q; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += u'\0' != q; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += U'\0' != q; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+
+ return r;
+}
+
+int
+f2 (int *p)
+{
+ int r = 0;
+
+ r += p == (void *) 0;
+ r += p != (void *) 0;
+ r += (void *) 0 == p;
+ r += (void *) 0 != p;
+
+ r += p == 0;
+ r += p != 0;
+ r += 0 == p;
+ r += 0 != p;
+
+ return r;
+}
+
+int
+f3 (int *p)
+{
+ int r = 0;
+
+ r += p == (char) 0; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += p != (char) 0; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+
+ r += (char) 0 == p; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+ r += (char) 0 != p; // { dg-error "ISO C\\+\\+ forbids comparison between pointer and integer" }
+
+ return r;
+}