|| TREE_CODE (op1) != INTEGER_CST))
goto out;
- if (op0 != orig_op0 || op1 != orig_op1 || in_init)
+ if (TREE_CODE_CLASS (code) == tcc_comparison
+ && TREE_CODE (TREE_TYPE (op0)) == NULLPTR_TYPE
+ && TREE_CODE (TREE_TYPE (op1)) == NULLPTR_TYPE)
+ {
+ switch (code)
+ {
+ case EQ_EXPR:
+ ret = constant_boolean_node (true, TREE_TYPE (expr));
+ break;
+ case NE_EXPR:
+ ret = constant_boolean_node (false, TREE_TYPE (expr));
+ break;
+ default:
+ gcc_unreachable ();
+ }
+ ret = omit_two_operands_loc (loc, TREE_TYPE (expr), ret,
+ op0, op1);
+ }
+ else if (op0 != orig_op0 || op1 != orig_op1 || in_init)
ret = in_init
? fold_build2_initializer_loc (loc, code, TREE_TYPE (expr), op0, op1)
: fold_build2_loc (loc, code, TREE_TYPE (expr), op0, op1);
val, valtype, npc, rname, parmnum, argnum,
excess_precision, 0);
}
+ /* A NULLPTR type is just a nullptr always. */
+ else if (TREE_CODE (TREE_TYPE (val)) == NULLPTR_TYPE)
+ parmval = omit_one_operand_loc (ploc, TREE_TYPE (val), nullptr_node, val);
else if (promote_float_arg)
{
if (type_generic)
&& coder == INTEGER_TYPE)
warning_at (location, OPT_Wzero_as_null_pointer_constant,
"zero as null pointer constant");
-
+ /* A NULLPTR type is just a nullptr always. */
+ if (coder == NULLPTR_TYPE)
+ return omit_one_operand_loc (expr_loc, type, nullptr_node, rhs);
/* An explicit constant 0 or type nullptr_t can convert to a pointer,
or one that results from arithmetic, even including a cast to
integer type. */
- if (!null_pointer_constant && coder != NULLPTR_TYPE)
+ else if (!null_pointer_constant)
switch (errtype)
{
case ic_argpass:
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-std=gnu23" } */
+
+#include <stddef.h>
+#include <stdlib.h>
+typedef struct {
+ int data[5];
+ nullptr_t np;
+} container_t;
+void process_array(int *arr, size_t len, nullptr_t nullp) {
+ for (size_t i = 0; i < len; ++i) {
+ switch (arr[i] % 4) {
+ case 1:
+ if (nullp == nullptr) {
+ arr[i] *= -1;
+ [[fallthrough]];
+ }
+ case 2:
+ arr[i] = abs(arr[i]);
+ break;
+ default:
+ arr[i] = 0;
+ }
+ }
+}
+int main(void) {
+ container_t c = {
+ .data = { -3, 1, 4, 2, 7 },
+ .np = nullptr
+ };
+ process_array(c.data, 5, c.np);
+}