public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/113814] New: [modules] ICE with imported partial specialization matching existing template-id
@ 2024-02-07 19:15 ppalka at gcc dot gnu.org
  2024-02-07 19:25 ` [Bug c++/113814] [modules] canonical types " cvs-commit at gcc dot gnu.org
  2024-02-07 19:46 ` mpolacek at gcc dot gnu.org
  0 siblings, 2 replies; 3+ messages in thread
From: ppalka at gcc dot gnu.org @ 2024-02-07 19:15 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113814

            Bug ID: 113814
           Summary: [modules] ICE with imported partial specialization
                    matching existing template-id
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ppalka at gcc dot gnu.org
  Target Milestone: ---

Reduced from the hello-1 ICE tracked by PR113710:

$ cat header.h
template<int __i, typename _Tp>
struct tuple_element;

template<typename...>
struct tuple { };

template<int __i, typename... _Elements>
tuple_element<__i, tuple<_Elements...>>
get(tuple<_Elements...>);

$ cat testcase.H
#include "header.h"

template<int __i, typename... _Elements>
struct tuple_element<__i, tuple<_Elements...>> { };

$ cat testcase.C
#include "header.h"
import "testcase.H"

int main() {
  get<0>(tuple<int, int>{});
}

$ g++ -fmodules-ts testcase.H testcase.C
testcase.C: In function ‘int main()’:
testcase.C:5:3: internal compiler error: canonical types differ for identical
types ‘tuple_element<__i, tuple<_Elements ...> >’ and ‘tuple_element<__i,
tuple<_Elements ...> >’
    5 |   get<0>(tuple<int, int>{});
      |   ^~~

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Bug c++/113814] [modules] canonical types ICE with imported partial specialization matching existing template-id
  2024-02-07 19:15 [Bug c++/113814] New: [modules] ICE with imported partial specialization matching existing template-id ppalka at gcc dot gnu.org
@ 2024-02-07 19:25 ` cvs-commit at gcc dot gnu.org
  2024-02-07 19:46 ` mpolacek at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2024-02-07 19:25 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113814

--- Comment #1 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Patrick Palka <ppalka@gcc.gnu.org>:

https://gcc.gnu.org/g:ff41862357ca2ea56177209a2e3b7d9c64bcfa8c

commit r14-8870-gff41862357ca2ea56177209a2e3b7d9c64bcfa8c
Author: Patrick Palka <ppalka@redhat.com>
Date:   Wed Feb 7 14:24:51 2024 -0500

    libstdc++: Work around modules issue causing hello-1 ICE [PR113710]

    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's 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
    the signatures of 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 merge it with 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 testsuite/113710
            PR c++/113814

    libstdc++-v3/ChangeLog:

            * include/bits/stl_pair.h (tuple_element): Add forward
            declaration of the partial specialization for tuple.

    Reviewed-by: Jonathan Wakely <jwakely@redhat.com>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Bug c++/113814] [modules] canonical types ICE with imported partial specialization matching existing template-id
  2024-02-07 19:15 [Bug c++/113814] New: [modules] ICE with imported partial specialization matching existing template-id ppalka at gcc dot gnu.org
  2024-02-07 19:25 ` [Bug c++/113814] [modules] canonical types " cvs-commit at gcc dot gnu.org
@ 2024-02-07 19:46 ` mpolacek at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: mpolacek at gcc dot gnu.org @ 2024-02-07 19:46 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113814

Marek Polacek <mpolacek at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |NEW
                 CC|                            |mpolacek at gcc dot gnu.org
   Last reconfirmed|                            |2024-02-07

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2024-02-07 19:46 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-02-07 19:15 [Bug c++/113814] New: [modules] ICE with imported partial specialization matching existing template-id ppalka at gcc dot gnu.org
2024-02-07 19:25 ` [Bug c++/113814] [modules] canonical types " cvs-commit at gcc dot gnu.org
2024-02-07 19:46 ` mpolacek at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).