From b9fde0219f35cd5244f647c20c7b31b0395dbc5a Mon Sep 17 00:00:00 2001 From: Nathaniel Shead Date: Wed, 10 Sep 2025 14:25:22 +1000 Subject: [PATCH] ipa-free-lang-data: Don't walk into DECL_CHAIN when finding decls/types [PR121865] On a DECL, TREE_CHAIN will find any other declarations in the same binding level. This caused an ICE in PR121865 because the next entity in the binding level was the uninstantiated unique friend 'foo', for which after being found the compiler tries to generate a mangled name for it and crashes. This didn't happen in non-modules testcases only because normally the unique friend function would have been chained after its template_decl, and find_decl_types_r bails on lang-specific nodes so it never saw the uninstantiated decl. With modules however the order of chaining changed, causing the error. I don't think it's ever necessary to walk into the DECL_CHAIN, from what I can see; other cases where it might be useful (block vars or type fields) are already handled explicitly elsewhere, and only one test fails because of the change, due to accidentally relying on this "walk into the next in-scope declaration" behaviour. PR c++/121865 gcc/ChangeLog: * ipa-free-lang-data.cc (find_decls_types_r): Don't walk into DECL_CHAIN for any DECL. gcc/testsuite/ChangeLog: * g++.dg/lto/pr101396_0.C: Ensure A will be walked into (and isn't constant-folded out of the GIMPLE for the function). * g++.dg/lto/pr101396_1.C: Add message. * g++.dg/modules/lto-4_a.C: New test. * g++.dg/modules/lto-4_b.C: New test. Signed-off-by: Nathaniel Shead Reviewed-by: Richard Biener --- gcc/ipa-free-lang-data.cc | 3 --- gcc/testsuite/g++.dg/lto/pr101396_0.C | 6 ++++-- gcc/testsuite/g++.dg/lto/pr101396_1.C | 1 + gcc/testsuite/g++.dg/modules/lto-4_a.C | 10 ++++++++++ gcc/testsuite/g++.dg/modules/lto-4_b.C | 8 ++++++++ 5 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/modules/lto-4_a.C create mode 100644 gcc/testsuite/g++.dg/modules/lto-4_b.C diff --git a/gcc/ipa-free-lang-data.cc b/gcc/ipa-free-lang-data.cc index 8c4fb3c6b643..41afc6ec82fc 100644 --- a/gcc/ipa-free-lang-data.cc +++ b/gcc/ipa-free-lang-data.cc @@ -750,9 +750,6 @@ find_decls_types_r (tree *tp, int *ws, void *data) && DECL_HAS_VALUE_EXPR_P (t)) fld_worklist_push (DECL_VALUE_EXPR (t), fld); - if (TREE_CODE (t) != FIELD_DECL - && TREE_CODE (t) != TYPE_DECL) - fld_worklist_push (TREE_CHAIN (t), fld); *ws = 0; } else if (TYPE_P (t)) diff --git a/gcc/testsuite/g++.dg/lto/pr101396_0.C b/gcc/testsuite/g++.dg/lto/pr101396_0.C index b7a2947a8809..f195b270b640 100644 --- a/gcc/testsuite/g++.dg/lto/pr101396_0.C +++ b/gcc/testsuite/g++.dg/lto/pr101396_0.C @@ -6,7 +6,9 @@ enum A : __UINT32_TYPE__ { // { dg-lto-warning "6: type 'A' violates the C\\+\\+ c }; -int main() +int g(enum A x) { - return (int) A::a; + return (int) x; } + +int main() {} diff --git a/gcc/testsuite/g++.dg/lto/pr101396_1.C b/gcc/testsuite/g++.dg/lto/pr101396_1.C index a6d032d694d9..782026e03ba5 100644 --- a/gcc/testsuite/g++.dg/lto/pr101396_1.C +++ b/gcc/testsuite/g++.dg/lto/pr101396_1.C @@ -1,4 +1,5 @@ enum A : __UINT64_TYPE__ { // { dg-lto-note "6: an enum with different value name is defined in another translation unit" } + // { dg-lto-note "6: a type with different precision is defined in another translation unit" "" { target *-*-* } .-1 } a, // { dg-lto-note "3: mismatching definition" } b, c diff --git a/gcc/testsuite/g++.dg/modules/lto-4_a.C b/gcc/testsuite/g++.dg/modules/lto-4_a.C new file mode 100644 index 000000000000..16629158dc23 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/lto-4_a.C @@ -0,0 +1,10 @@ +// PR c++/121865 +// { dg-require-effective-target lto } +// { dg-additional-options "-fmodules -flto" } + +export module M; +export template struct S; +export template void foo(S) {} +template struct S { + friend void foo<>(S); +}; diff --git a/gcc/testsuite/g++.dg/modules/lto-4_b.C b/gcc/testsuite/g++.dg/modules/lto-4_b.C new file mode 100644 index 000000000000..0322855caf42 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/lto-4_b.C @@ -0,0 +1,8 @@ +// PR c++/121865 +// { dg-module-do link } +// { dg-require-effective-target lto } +// { dg-additional-options "-fmodules -flto" } + +import M; +template struct S; +int main() {} -- 2.47.3