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

            Bug ID: 118920
           Summary: ICE when importing memory and filesystem and a
                    module-compiled system header importing memory
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: f.b.brokken at rug dot nl
  Target Milestone: ---

Created attachment 60521
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=60521&action=edit
The compiler's output resulting in the internal compiler error

The bug I report somewhat resembles #104433, but it looks different, hence the
report. The code snippets below were reduced to their bare essentials to make
the bug stand out clearly.

First, the directory /usr/include/demo was defined, and in there the header
'demo':

  #ifndef INCLUDED_DEMO_HDR_
  #define INCLUDED_DEMO_HDR_
  #include <memory>
  #endif

Then in /usr/include demo/demo was module compiled using
   g++ --std=c++26 -fmodules-ts -x c++-system-header demo/demo
and demo.gcm was moved from gcm.cache/usr/include/demo to ./ 
/usr/include/demo now contains 'demo' and 'demo.gcm'

Likewise, in /usr/include/c++/15 the headers 'memory' and 'filesystem' were
module compiled and installed in /usr/include/c++/15

Next, in a working directory (say: /tmp/demo) the directory ./gcm.cache/ was
defined and in there a softlink to /usr (gcm.cache/usr -> /usr) 
and 'modbase.cc' was written in /tmp/demo:
  export module Base;
  export import <memory>;
  export
  {
      class Base
      {
          std::shared_ptr<double> d_out;
          public:
              void resetValue(double value);
      };
  }
It was compiled using g++ -c --std=c++26 -fmodules-ts modbase.cc producing the
file gcm.cache/Base.gcm

Then the file bug.cc was written in /tmp/demo:
  module Base;
  import <filesystem>;
  import <demo/demo>;

  void Base::resetValue(double value)
  {
      d_out.reset(new double(value));
  }
and compiled using the command
  g++ -c --std=c++26 -freport-bug -fmodules-ts bug.cc
resulting in an internal compiler error:
  /usr/include/c++/15/format:1368:15: internal compiler error: canonical types 
                                      differ for identical types ...
(the full report is attached)

When 'import <filesystem>;' is removed from bug.cc no errors are reported.
Likewise, when it is kept, but 'import <memory>;' replaces 'import
<demo/demo>;' there's also no compiler error: in both cases compilation
successfully completes.

As an aside: the other day I upgraded g++-14 to g++15.0.1 on my computer
(running Debian's testing (trixie) distribution) and I'm impressed by the
module-related improvements that were realized. Chapeau! In fact yesterday I
could completely convert a non-trivial program to a version merely using
modules. Nice, and this report doesn't reduce -in no way- the confidence I have
in your work. 

Please contact me if you need additional information.
Thanks!!

Reply via email to