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;
+}

Reply via email to