free-lang-data: Remove C++ annotations [PR123837]

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.

2026-01-28  Jakub Jelinek  <jakub@redhat.com>

	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.
This commit is contained in:
Jakub Jelinek
2026-01-28 09:48:10 +01:00
committed by Jakub Jelinek
parent 5957ce932f
commit 5c2a5bfcd4
2 changed files with 22 additions and 0 deletions

View File

@@ -730,6 +730,10 @@ find_decls_types_r (tree *tp, int *ws, void *data)
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, void *data)
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);

View File

@@ -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 ()
{
}