https://gcc.gnu.org/g:b6d3c21d1f7119d0b4f3b9a42a79f59bef4e543b

commit r15-11219-gb6d3c21d1f7119d0b4f3b9a42a79f59bef4e543b
Author: Jakub Jelinek <[email protected]>
Date:   Wed Apr 15 08:55:48 2026 +0200

    c++: Mark in cxx_mark_addressable DECL_VALUE_EXPR of DECL_ANON_UNION_VAR_P 
too [PR124850]
    
    The following testcase ICEs since my PR53932 change in checking,
    because it sees address of the unnamed anon union VAR_DECL taken
    but without having TREE_ADDRESSABLE set.
    
    The following patch sets it during cxx_mark_addressable.  I'm wondering
    how we can get away with not marking other DECL_VALUE_EXPR cases,
    but couldn't come up with a testcase where it would be needed (e.g. for
    structured bindings, etc.).  So just doing it for anon union vars seems
    safer to me at least for now.
    
    2026-04-15  Jakub Jelinek  <[email protected]>
    
            PR c++/124850
            * typeck.cc (cxx_mark_addressable): For DECL_ANON_UNION_VAR_P vars
            also mark their DECL_VALUE_EXPR.
    
            * g++.dg/other/anon-union8.C: New test.
    
    Reviewed-by: Jason Merrill <[email protected]>
    (cherry picked from commit 8315b21457d740336295b58d04f0497329e94a67)

Diff:
---
 gcc/cp/typeck.cc                         |  4 ++++
 gcc/testsuite/g++.dg/other/anon-union8.C | 11 +++++++++++
 2 files changed, 15 insertions(+)

diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc
index 012458a3bd4a..54ff9f37d07e 100644
--- a/gcc/cp/typeck.cc
+++ b/gcc/cp/typeck.cc
@@ -8137,6 +8137,10 @@ cxx_mark_addressable (tree exp, bool array_ref_p)
                    || DECL_IN_AGGR_P (x) == 0
                    || TREE_STATIC (x)
                    || DECL_EXTERNAL (x));
+       if (VAR_P (x)
+           && DECL_ANON_UNION_VAR_P (x)
+           && !TREE_ADDRESSABLE (x))
+         cxx_mark_addressable (DECL_VALUE_EXPR (x));
        /* Fall through.  */
 
       case RESULT_DECL:
diff --git a/gcc/testsuite/g++.dg/other/anon-union8.C 
b/gcc/testsuite/g++.dg/other/anon-union8.C
new file mode 100644
index 000000000000..d6a782691c5b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/anon-union8.C
@@ -0,0 +1,11 @@
+// PR c++/124850
+// { dg-do compile }
+
+static union { int i; };
+int &r = i;
+
+int
+foo ()
+{
+  return r;
+}

Reply via email to