https://gcc.gnu.org/g:bfecb8bf5de888710a79ffff31370f48d511f18c
commit r17-1147-gbfecb8bf5de888710a79ffff31370f48d511f18c Author: Joe Natter <[email protected]> Date: Thu May 21 20:20:16 2026 +0200 c++: Fix spurious -Wduplicated-branches for new (nothrow) T[n] [PR125422] 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 <[email protected]> Reviewed-by: Jason Merrill <[email protected]> Diff: --- gcc/cp/init.cc | 6 ++++++ gcc/testsuite/g++.dg/warn/Wduplicated-branches10.C | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/gcc/cp/init.cc b/gcc/cp/init.cc index 14ceafa68284..8d0018a31cc0 100644 --- a/gcc/cp/init.cc +++ b/gcc/cp/init.cc @@ -3970,6 +3970,12 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts, 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, diff --git a/gcc/testsuite/g++.dg/warn/Wduplicated-branches10.C b/gcc/testsuite/g++.dg/warn/Wduplicated-branches10.C new file mode 100644 index 000000000000..0ebccd7d6fe7 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wduplicated-branches10.C @@ -0,0 +1,15 @@ +// 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; +}
