The following testcase is incorrectly rejected, because since r15-6744
it adds build_nop to preserve the exact typedef type and
cxx_eval_constant_expression can't fold NOP_EXPR from integer_zerop of one
NULLPTR_TYPE to another NULLPTR_TYPE, while cxx_eval_constant_expression
relies on fold to do such folding.
I see 3 options to fix that, one is deal with this in the r15-6744 spot
and special case NULLPTR_TYPE there and build_zero_cst instead of build_nop
(with similar condition like in the patch below), another possibility is
special case this in cxx_eval_constant_expression, and
another one (done in this patch) is to handle this in fold-const.cc -
fold_convert_loc and also in fold_convert_const.
2026-01-30 Jakub Jelinek <jakub@redhat.com>
PR c++/123790
* fold-const.cc (fold_convert_const): Handle conversion of
integer_zerop to NULLPTR_TYPE.
(fold_convert_loc): Likewise.
* g++.dg/cpp0x/nullptr47.C: New test.
return v.build ();
}
}
+ else if (TREE_CODE (type) == NULLPTR_TYPE && integer_zerop (arg1))
+ return build_zero_cst (type);
return NULL_TREE;
}
tem = fold_ignored_result (arg);
return fold_build1_loc (loc, NOP_EXPR, type, tem);
+ case NULLPTR_TYPE:
+ if (integer_zerop (arg))
+ return build_zero_cst (type);
+ /* FALLTHRU */
default:
if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (orig))
return fold_build1_loc (loc, NOP_EXPR, type, arg);
--- /dev/null
+// PR c++/123790
+// { dg-do compile { target c++11 } }
+
+int
+main ()
+{
+ using nullptr_t = decltype (nullptr);
+ constexpr nullptr_t zero = nullptr;
+ constexpr nullptr_t other_zero = zero;
+}