When allocating an array of a trivial type with new (nothrow),
build_new_1() may emit a compiler-generated COND_EXPR of the form
(alloc_node != nullptr) ? rval : alloc_node
For trivial arrays without constructors, destructors, or array cookies,
rval remains equal to data_addr and is therefore equivalent to
alloc_node. This causes both branches of the generated COND_EXPR to be
identical, triggering -Wduplicated-branches on user code.
Avoid building the null-check COND_EXPR when rval == data_addr.
gcc/cp/ChangeLog:
PR c++/125422
* init.cc (build_new_1): Avoid building a null-check
COND_EXPR when rval == data_addr.
gcc/testsuite/ChangeLog:
PR c++/125422
* g++.dg/warn/Wduplicated-branches10.C: New test.
Signed-off-by: Joe Natter <johannes.natter@outlook.at>
Reviewed-by: Jason Merrill <jason@redhat.com>
rval = TARGET_EXPR_INITIAL (alloc_expr);
else
{
+ /* Skip the null-check when rval == data_addr: the resulting conditional
+ would be "alloc_node != nullptr ? alloc_node : alloc_node", triggering
+ -Wduplicated-branches (PR125422). */
+ if (rval == data_addr)
+ check_new = 0;
+
if (check_new)
{
tree ifexp = cp_build_binary_op (input_location,
--- /dev/null
+// PR c++/125422
+// { dg-do compile }
+// { dg-options "-Wduplicated-branches" }
+
+// new (nothrow) T[n] with a runtime variable must not trigger
+// -Wduplicated-branches (false positive from compiler-generated COND_EXPR).
+
+#include <new>
+
+void
+test_nothrow (int sz)
+{
+ char *p = new (std::nothrow) char[sz];
+ delete[] p;
+}