From: Nathaniel Shead Date: Tue, 9 Dec 2025 12:33:41 +0000 (+1100) Subject: Revert "c++: Non-inline temploid friends should still be COMDAT [PR122819]" X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=49c4b7328379df066a414535166916bb017033cf;p=thirdparty%2Fgcc.git Revert "c++: Non-inline temploid friends should still be COMDAT [PR122819]" This reverts commit cf22e30f0cfae65dd012966cab657583e2be667e. --- diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc index 31081b390fa..74c862ec1c7 100644 --- a/gcc/cp/decl.cc +++ b/gcc/cp/decl.cc @@ -19750,7 +19750,7 @@ start_preparsed_function (tree decl1, tree attrs, int flags) } } - bool honor_interface = (!DECL_TEMPLOID_INSTANTIATION (decl1) + bool honor_interface = (!DECL_TEMPLATE_INSTANTIATION (decl1) /* Implicitly-defined methods (like the destructor for a class in which no destructor is explicitly declared) must not be defined @@ -19781,7 +19781,7 @@ start_preparsed_function (tree decl1, tree attrs, int flags) else if (!finfo->interface_unknown && honor_interface) { if (DECL_DECLARED_INLINE_P (decl1) - || DECL_TEMPLOID_INSTANTIATION (decl1)) + || DECL_TEMPLATE_INSTANTIATION (decl1)) { DECL_EXTERNAL (decl1) = (finfo->interface_only @@ -19823,7 +19823,7 @@ start_preparsed_function (tree decl1, tree attrs, int flags) DECL_EXTERNAL (decl1) = 0; if ((DECL_DECLARED_INLINE_P (decl1) - || DECL_TEMPLOID_INSTANTIATION (decl1)) + || DECL_TEMPLATE_INSTANTIATION (decl1)) && ! DECL_INTERFACE_KNOWN (decl1)) DECL_DEFER_OUTPUT (decl1) = 1; else diff --git a/gcc/cp/decl2.cc b/gcc/cp/decl2.cc index 01bf26b1e4f..8ec9740c8a9 100644 --- a/gcc/cp/decl2.cc +++ b/gcc/cp/decl2.cc @@ -2510,7 +2510,7 @@ vague_linkage_p (tree decl) || (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl)) || (DECL_LANG_SPECIFIC (decl) - && DECL_TEMPLOID_INSTANTIATION (decl)) + && DECL_TEMPLATE_INSTANTIATION (decl)) || (VAR_P (decl) && DECL_INLINE_VAR_P (decl))) return true; else if (DECL_FUNCTION_SCOPE_P (decl)) @@ -5850,7 +5850,8 @@ c_parse_final_cleanups (void) && !(header_module_p () && (DECL_DEFAULTED_FN (decl) || decl_tls_wrapper_p (decl))) /* Don't complain if the template was defined. */ - && !(DECL_TEMPLOID_INSTANTIATION (decl) + && !((DECL_TEMPLATE_INSTANTIATION (decl) + || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (decl)) && DECL_INITIAL (DECL_TEMPLATE_RESULT (template_for_substitution (decl)))) && warning_at (DECL_SOURCE_LOCATION (decl), 0, diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc index b32ab2f0d2b..331db16f76d 100644 --- a/gcc/cp/semantics.cc +++ b/gcc/cp/semantics.cc @@ -5537,9 +5537,7 @@ expand_or_defer_fn_1 (tree fn) of the compilation. Until that point, we do not want the back end to output them -- but we do want it to see the bodies of these functions so that it can inline them as appropriate. */ - if (DECL_DECLARED_INLINE_P (fn) - || DECL_IMPLICIT_INSTANTIATION (fn) - || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (fn)) + if (DECL_DECLARED_INLINE_P (fn) || DECL_IMPLICIT_INSTANTIATION (fn)) { if (DECL_INTERFACE_KNOWN (fn)) /* We've already made a decision as to how this function will diff --git a/gcc/testsuite/g++.dg/modules/tpl-friend-22.C b/gcc/testsuite/g++.dg/modules/tpl-friend-22.C deleted file mode 100644 index a77d1cbecad..00000000000 --- a/gcc/testsuite/g++.dg/modules/tpl-friend-22.C +++ /dev/null @@ -1,24 +0,0 @@ -// PR c++/122819 -// { dg-do compile { target *-*-*gnu* } } -// { dg-additional-options "-fmodules" } - -export module M; - -template struct S; -void foo(S); - -template struct S { - friend void foo(S) {} -}; - -void foo(S); - -void use() { - foo(S{}); - foo(S{}); - foo(S{}); -} - -// { dg-final { scan-assembler "_ZW1M3fooS_1SIiE,comdat" } } -// { dg-final { scan-assembler "_ZW1M3fooS_1SIfE,comdat" } } -// { dg-final { scan-assembler "_ZW1M3fooS_1SIdE,comdat" } }