https://gcc.gnu.org/g:45c949fb697d4602fa8ce8e87213cf17e1acf60b

commit r14-11596-g45c949fb697d4602fa8ce8e87213cf17e1acf60b
Author: Jason Merrill <ja...@redhat.com>
Date:   Thu Apr 10 18:16:37 2025 -0400

    c++: avoid ARM -Wunused-value [PR114970]
    
    Because of the __builtin_is_constant_evaluated, maybe_constant_init in
    expand_default_init fails, so the constexpr constructor isn't folded until
    cp_fold, which builds a COMPOUND_EXPR in case the enclosing expression is
    relying on the ARM behavior of returning 'this'.
    
    As in other places, avoid -Wunused-value on artificial COMPOUND_EXPR.
    
            PR c++/114970
    
    gcc/cp/ChangeLog:
    
            * cp-gimplify.cc (cp_fold): Suppress warnings on
            return_this COMPOUND_EXPR.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/opt/is_constant_evaluated4.C: New test.
    
    (cherry picked from commit 4acdfb71d4fdaa43c2707ad7b2fb7b2b7bddfc42)

Diff:
---
 gcc/cp/cp-gimplify.cc                             |  7 +++++--
 gcc/testsuite/g++.dg/opt/is_constant_evaluated4.C | 20 ++++++++++++++++++++
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/gcc/cp/cp-gimplify.cc b/gcc/cp/cp-gimplify.cc
index 7b52fc301d61..37dc4a286a0a 100644
--- a/gcc/cp/cp-gimplify.cc
+++ b/gcc/cp/cp-gimplify.cc
@@ -3437,8 +3437,11 @@ cp_fold (tree x, fold_flags_t flags)
                tree s = build_fold_indirect_ref_loc (loc, a);
                r = cp_build_init_expr (s, r);
                if (return_this)
-                 r = build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (x), r,
-                                 fold_convert_loc (loc, TREE_TYPE (x), a));
+                 {
+                   r = build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (x), r,
+                                   fold_convert_loc (loc, TREE_TYPE (x), a));
+                   suppress_warning (r);
+                 }
              }
            x = r;
            break;
diff --git a/gcc/testsuite/g++.dg/opt/is_constant_evaluated4.C 
b/gcc/testsuite/g++.dg/opt/is_constant_evaluated4.C
new file mode 100644
index 000000000000..9650004ced1e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/is_constant_evaluated4.C
@@ -0,0 +1,20 @@
+// PR c++/114970
+// { dg-do compile { target c++17 } }
+// { dg-additional-options "-O -Wunused-value" }
+
+struct sv
+{
+  const char* str;
+  unsigned len;
+
+  constexpr sv(const char *p): str(p), len(0)
+  {
+    if (__builtin_is_constant_evaluated ()) { len = 42; }
+  }
+};
+
+int main()
+{
+  sv s ("foo");
+  return s.len;
+}

Reply via email to