On 7/2/26 3:32 AM, Jakub Jelinek wrote:
Hi!
The following testcase ICEs during error recovery. We try to
mangle a structured binding base variable, but because it has
been erroneous, the mangling ICEs as it can't find the corresponding
structured bindings.
Now, we already have a hack in cp_finish_decomp when things are erroneous,
we set assembler name to <decomp> so that mangling isn't done.
But we do that only for DECL_NAMESPACE_SCOPE_P bases and
block scope static structured bindings can be mangled too,
and during instantiation, if tsubst_decomp_names fails, we don't
call cp_finish_decomp at all, so in that case we need to also
avoid the mangling of the structured binding base.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2026-07-02 Jakub Jelinek <[email protected]>
PR c++/126057
* decl.cc (cp_finish_decomp): Set assembler name to
<decomp> during error recovery whenever TREE_STATIC
rather than just DECL_NAMESPACE_SCOPE_P.
* pt.cc (tsubst_stmt): If tsubst_decomp_names fails,
set assembler name to <decomp>.
* g++.dg/cpp2a/decomp11.C: New test.
--- gcc/cp/decl.cc.jj 2026-07-01 11:54:35.402958896 +0200
+++ gcc/cp/decl.cc 2026-07-01 19:19:33.763975576 +0200
@@ -10708,7 +10708,7 @@ cp_finish_decomp (tree decl, cp_decomp *
}
first = DECL_CHAIN (first);
}
- if (DECL_P (decl) && DECL_NAMESPACE_SCOPE_P (decl))
+ if (DECL_P (decl) && TREE_STATIC (decl))
SET_DECL_ASSEMBLER_NAME (decl, get_identifier ("<decomp>"));
return false;
}
--- gcc/cp/pt.cc.jj 2026-06-25 10:03:50.817436390 +0200
+++ gcc/cp/pt.cc 2026-07-01 19:25:16.135679755 +0200
@@ -19917,7 +19917,14 @@ tsubst_stmt (tree t, tree args, tsubst_f
if (tsubst_decomp_names (decl, pattern_decl, args,
complain, in_decl, decomp)
== error_mark_node)
- decomp = NULL;
+ {
+ decomp = NULL;
+ if (TREE_STATIC (decl))
+ {
+ tree id = get_identifier ("<decomp>");
+ SET_DECL_ASSEMBLER_NAME (decl, id);
How about doing this in tsubst_decomp_names?
+ }
+ }
}
init = tsubst_init (init, decl, args, complain, in_decl);
--- gcc/testsuite/g++.dg/cpp2a/decomp11.C.jj 2026-07-01 19:28:37.892148276
+0200
+++ gcc/testsuite/g++.dg/cpp2a/decomp11.C 2026-07-01 19:28:18.524391284
+0200
@@ -0,0 +1,12 @@
+// PR c++/126057
+// { dg-do compile { target c++20 } }
+
+template <typename T>
+int
+foo ()
+{
+ static auto [a] = 0; // { dg-error "cannot decompose non-array non-class type
'int'" }
+ return 0;
+}
+
+int a = foo <int> ();
Jakub