From: Joe Natter Date: Thu, 21 May 2026 18:20:16 +0000 (+0200) Subject: c++: Fix spurious -Wduplicated-branches for new (nothrow) T[n] [PR125422] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bfecb8bf5de888710a79ffff31370f48d511f18c;p=thirdparty%2Fgcc.git 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 Reviewed-by: Jason Merrill --- diff --git a/gcc/cp/init.cc b/gcc/cp/init.cc index 14ceafa6828..8d0018a31cc 100644 --- a/gcc/cp/init.cc +++ b/gcc/cp/init.cc @@ -3970,6 +3970,12 @@ build_new_1 (vec **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 00000000000..0ebccd7d6fe --- /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 + +void +test_nothrow (int sz) +{ + char *p = new (std::nothrow) char[sz]; + delete[] p; +}