On Fri, 29 Mar 2024, Nathaniel Shead wrote:

> Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk?

LGTM

> 
> -- >8 --
> 
> A template instantiation still needs to have its DECL_SAVED_TREE so that
> its definition is emitted into the CMI. This way it can be emitted in
> the object file of any importers that use it, in case it doesn't end up
> getting emitted in this TU.
> 
>       PR c++/104040
> 
> gcc/cp/ChangeLog:
> 
>       * semantics.cc (expand_or_defer_fn_1): Also keep DECL_SAVED_TREE
>       for template instantiations.
> 
> gcc/testsuite/ChangeLog:
> 
>       * g++.dg/modules/pr104040_a.C: New test.
>       * g++.dg/modules/pr104040_b.C: New test.
> 
> Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com>
> ---
>  gcc/cp/semantics.cc                       |  7 +++++--
>  gcc/testsuite/g++.dg/modules/pr104040_a.C | 14 ++++++++++++++
>  gcc/testsuite/g++.dg/modules/pr104040_b.C |  8 ++++++++
>  3 files changed, 27 insertions(+), 2 deletions(-)
>  create mode 100644 gcc/testsuite/g++.dg/modules/pr104040_a.C
>  create mode 100644 gcc/testsuite/g++.dg/modules/pr104040_b.C
> 
> diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc
> index adb1ba48d29..84e9901509a 100644
> --- a/gcc/cp/semantics.cc
> +++ b/gcc/cp/semantics.cc
> @@ -5033,9 +5033,12 @@ expand_or_defer_fn_1 (tree fn)
>        /* We don't want to process FN again, so pretend we've written
>        it out, even though we haven't.  */
>        TREE_ASM_WRITTEN (fn) = 1;
> -      /* If this is a constexpr function, keep DECL_SAVED_TREE.  */
> +      /* If this is a constexpr function, or the body might need to be
> +      exported from a module CMI, keep DECL_SAVED_TREE.  */
>        if (!DECL_DECLARED_CONSTEXPR_P (fn)
> -       && !(modules_p () && DECL_DECLARED_INLINE_P (fn)))
> +       && !(modules_p ()
> +            && (DECL_DECLARED_INLINE_P (fn)
> +                || DECL_TEMPLATE_INSTANTIATION (fn))))
>       DECL_SAVED_TREE (fn) = NULL_TREE;
>        return false;
>      }
> diff --git a/gcc/testsuite/g++.dg/modules/pr104040_a.C 
> b/gcc/testsuite/g++.dg/modules/pr104040_a.C
> new file mode 100644
> index 00000000000..ea36ce0a798
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/modules/pr104040_a.C
> @@ -0,0 +1,14 @@
> +// PR c++/104040
> +// { dg-additional-options "-fmodules-ts" }
> +// { dg-module-cmi test }
> +
> +export module test;
> +
> +export template <typename T>
> +struct test {
> +  ~test() {}
> +};
> +
> +test<bool> use() {
> +  return {};
> +}
> diff --git a/gcc/testsuite/g++.dg/modules/pr104040_b.C 
> b/gcc/testsuite/g++.dg/modules/pr104040_b.C
> new file mode 100644
> index 00000000000..efe014673fb
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/modules/pr104040_b.C
> @@ -0,0 +1,8 @@
> +// PR c++/104040
> +// { dg-additional-options "-fmodules-ts" }
> +
> +import test;
> +
> +int main() {
> +  test<bool> t{};
> +}
> -- 
> 2.43.2
> 
> 

Reply via email to