Hi!

My C++26 P2686R4 PR117784 caused ICE on the following testcase.
While the earlier conditions guarantee decl2 is not error_mark_node,
decl can be (that is used when something erroneous has been seen earlier
and the whole structured bindings will be ignored after parsing).

So, the following patch avoids the copying of constexpr/constinit flags
if decl is error_mark_node.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2025-08-07  Jakub Jelinek  <ja...@redhat.com>

        PR c++/121442
        * parser.cc (cp_parser_decomposition_declaration): Don't copy
        DECL_DECLARED_CONST{EXPR,INIT}_P bits from decl to decl2 if
        decl is error_mark_node.

        * g++.dg/cpp1z/decomp65.C: New test.

--- gcc/cp/parser.cc.jj 2025-08-07 09:17:51.144006515 +0200
+++ gcc/cp/parser.cc    2025-08-07 10:36:25.662802885 +0200
@@ -17002,8 +17002,13 @@ cp_parser_decomposition_declaration (cp_
       else
        {
          prev = decl2;
-         DECL_DECLARED_CONSTEXPR_P (decl2) = DECL_DECLARED_CONSTEXPR_P (decl);
-         DECL_DECLARED_CONSTINIT_P (decl2) = DECL_DECLARED_CONSTINIT_P (decl);
+         if (decl != error_mark_node)
+           {
+             DECL_DECLARED_CONSTEXPR_P (decl2)
+               = DECL_DECLARED_CONSTEXPR_P (decl);
+             DECL_DECLARED_CONSTINIT_P (decl2)
+               = DECL_DECLARED_CONSTINIT_P (decl);
+           }
          if (j == (unsigned) pack)
            {
              tree dtype = cxx_make_type (DECLTYPE_TYPE);
--- gcc/testsuite/g++.dg/cpp1z/decomp65.C.jj    2025-08-07 10:44:26.257337639 
+0200
+++ gcc/testsuite/g++.dg/cpp1z/decomp65.C       2025-08-07 10:51:12.921863887 
+0200
@@ -0,0 +1,13 @@
+// PR c++/121442
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+struct S { int a, b, c, d, e; };
+
+void
+foo ()
+{
+  auto [a, b, b, b, c ] = S {};                // { dg-warning "structured 
bindings only available with" "" { target c++14_down } }
+                                       // { dg-error "redeclaration of 'auto 
b'" "" { target *-*-* } .-1 }
+                                       // { dg-message "'auto b' previously 
declared here" "" { target *-*-* } .-2 }
+}

        Jakub

Reply via email to