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