On Wed, 7 Feb 2024 at 17:29, Patrick Palka <ppa...@redhat.com> wrote:

> Tested on x86_64-pc-linux-gnu, does this look OK for trunk?
>

OK.

Do we have a reduced testcase to track the modules bug that will still
exist in the FE?



>
> -- >8 --
>
> The forward declarations of std::get in <bits/stl_pair.h> added in
> r14-8710-g65b4cba9d6a9ff are causing an ICE in the test modules/hello-1
> due to what seems to be a declaration merging issue in modules.
>
> What seems to be happening is that in hello-1_b.C we first include
> <string_view>, which indirectly includes <bits/stl_pair.h> which forms
> the dependent specialization tuple_element<__i, tuple<_Elements...>>
> (appearing in some of the std::get overloads) and adds it to the
> specializations table.
>
> We then import hello which indirectly includes <tuple> (in the GMF),
> within which we define a partial specialization of tuple_element with
> that same template-id.  So importing hello in turn streams in this
> partial specialization, but we don't notice it matches the previously
> created dependent specialization, and we end up with two equivalent
> types for this template-id with different TYPE_CANONICAL.
>
> This patch works around this issue by adding a forward declaration of
> the tuple_element partial specialization from <tuple> to <bits/stl_pair.h>
> so that it appears alongside the dependent specialization of the same
> template-id.  So when including <bits/stl_pair.h> we immediately register
> the template-id as a partial specialization, and if we later stream in the
> partial specialization the MK_partial case of trees_in::key_mergeable will
> match them up.  (So perhaps a proper modules fix for this might be to make
> key_mergeable try to match up a streamed in partial specialization with an
> existing specialization from the table via match_mergeable_specialization.)
>
>         PR c++/113710
>
> libstdc++-v3/ChangeLog:
>
>         * include/bits/stl_pair.h (tuple_element): Add forward
>         declaration of the partial specialization for tuple.
> ---
>  libstdc++-v3/include/bits/stl_pair.h | 5 +++++
>  1 file changed, 5 insertions(+)
>
> diff --git a/libstdc++-v3/include/bits/stl_pair.h
> b/libstdc++-v3/include/bits/stl_pair.h
> index 00ec53ebc33..8c71b1350e5 100644
> --- a/libstdc++-v3/include/bits/stl_pair.h
> +++ b/libstdc++-v3/include/bits/stl_pair.h
> @@ -1153,6 +1153,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>      struct tuple_element<1, pair<_Tp1, _Tp2>>
>      { typedef _Tp2 type; };
>
> +  // Forward declare the partial specialization for std::tuple
> +  // to work around modules bug PR c++/113710.
> +  template<size_t __i, typename... _Types>
> +    struct tuple_element<__i, tuple<_Types...>>;
> +
>  #if __cplusplus >= 201703L
>    template<typename _Tp1, typename _Tp2>
>      inline constexpr size_t tuple_size_v<pair<_Tp1, _Tp2>> = 2;
> --
> 2.43.0.561.g235986be82
>
>

Reply via email to