Hi!

As mentioned in the PR and reproduced on the testcase, we ICE during
LTO streaming because C++ annotation arguments can contain trees LTO
streaming doesn't handle.
We don't really need annotations when the FE is done with the whole
TU, annotations are always TU local and not exposed to the rest and
used in consteval only stuff, so the following patch just removes
all annotations at free-lang-data time.

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

2026-01-28  Jakub Jelinek  <[email protected]>

        PR c++/123837
        * ipa-free-lang-data.cc (find_decls_types_r): Remove C++ annotations
        from {DECL,TYPE}_ATRIBUTES.

        * g++.dg/reflect/annotations9.C: New test.

--- gcc/ipa-free-lang-data.cc.jj        2026-01-12 09:58:18.735429290 +0100
+++ gcc/ipa-free-lang-data.cc   2026-01-27 19:24:15.046503575 +0100
@@ -730,6 +730,10 @@ find_decls_types_r (tree *tp, int *ws, v
       if (TREE_CODE (t) != TYPE_DECL)
        fld_worklist_push (DECL_INITIAL (t), fld);
 
+      /* Remove C++ annotations, those aren't needed for LTO and contain
+        trees we sometimes can't stream.  */
+      DECL_ATTRIBUTES (t)
+       = remove_attribute ("annotation ", DECL_ATTRIBUTES (t));
       fld_worklist_push (DECL_ATTRIBUTES (t), fld);
       fld_worklist_push (DECL_ABSTRACT_ORIGIN (t), fld);
 
@@ -763,6 +767,10 @@ find_decls_types_r (tree *tp, int *ws, v
        fld_worklist_push (TYPE_CACHED_VALUES (t), fld);
       fld_worklist_push (TYPE_SIZE (t), fld);
       fld_worklist_push (TYPE_SIZE_UNIT (t), fld);
+      /* Remove C++ annotations, those aren't needed for LTO and contain
+        trees we sometimes can't stream.  */
+      TYPE_ATTRIBUTES (t)
+       = remove_attribute ("annotation ", TYPE_ATTRIBUTES (t));
       fld_worklist_push (TYPE_ATTRIBUTES (t), fld);
       fld_worklist_push (TYPE_POINTER_TO (t), fld);
       fld_worklist_push (TYPE_REFERENCE_TO (t), fld);
--- gcc/testsuite/g++.dg/reflect/annotations9.C.jj      2026-01-27 
19:32:44.626859348 +0100
+++ gcc/testsuite/g++.dg/reflect/annotations9.C 2026-01-27 19:32:14.907363491 
+0100
@@ -0,0 +1,14 @@
+// PR c++/123837
+// { dg-do compile { target c++26 } }
+// { dg-additional-options "-freflection" }
+// { dg-additional-options "-flto" { target lto } }
+
+struct A {};
+[[=A {}]] int a {};
+struct [[=A {}]] B { int b; };
+B b {};
+
+int
+main ()
+{
+}

        Jakub

Reply via email to