https://gcc.gnu.org/g:68da968e46e7603a4c11099a6c8dd5ad24e4f43e

commit r15-6701-g68da968e46e7603a4c11099a6c8dd5ad24e4f43e
Author: Marek Polacek <pola...@redhat.com>
Date:   Tue Jan 7 10:15:42 2025 -0500

    c++: ICE with MODIFY_EXPR in constexpr [PR118169]
    
    Here, cxx_eval_outermost_expression gets a sequence of initialization
    statements:
    
      D.2912.t = TARGET_EXPR <...>;
      TARGET_EXPR <D.2922, 1>;
      D.2922 = 0;
    
    the last of which wasn't converted to void and so we, since r15-6369,
    do not take the "if (VOID_TYPE_P (type))" path, and try to set
    D.2912 to false.
    
    The last statement comes from build_disable_temp_cleanup.
    convert_to_void is typically called from finish_expr_stmt, but we are
    adding the cleanup statement via add_stmt which doesn't convert to void.
    So I think we can use finish_expr_stmt instead.
    
            PR c++/118169
    
    gcc/cp/ChangeLog:
    
            * typeck2.cc (split_nonconstant_init): Call finish_expr_stmt instead
            of add_stmt.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/cpp1y/constexpr-prvalue2.C: New test.
    
    Reviewed-by: Jason Merrill <ja...@redhat.com>

Diff:
---
 gcc/cp/typeck2.cc                               |  2 +-
 gcc/testsuite/g++.dg/cpp1y/constexpr-prvalue2.C | 13 +++++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/typeck2.cc b/gcc/cp/typeck2.cc
index 381f198d0fe6..5dae7fccf199 100644
--- a/gcc/cp/typeck2.cc
+++ b/gcc/cp/typeck2.cc
@@ -757,7 +757,7 @@ split_nonconstant_init (tree dest, tree init)
        init = NULL_TREE;
 
       for (tree f : flags)
-       add_stmt (build_disable_temp_cleanup (f));
+       finish_expr_stmt (build_disable_temp_cleanup (f));
       release_tree_vector (flags);
 
       code = pop_stmt_list (code);
diff --git a/gcc/testsuite/g++.dg/cpp1y/constexpr-prvalue2.C 
b/gcc/testsuite/g++.dg/cpp1y/constexpr-prvalue2.C
new file mode 100644
index 000000000000..7076c65b96ab
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/constexpr-prvalue2.C
@@ -0,0 +1,13 @@
+// PR c++/118169
+// { dg-do compile { target c++14 } }
+// { dg-options "-O" }
+
+struct A { constexpr A (int *x) : s(x) {} ~A (); int *s; };
+struct B { A t; int u = 0; };
+void foo (B &&);
+
+void
+bar (int &x)
+{
+  foo ({ &x });
+}

Reply via email to