https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99072
Bug ID: 99072 Summary: [modules] Compiling header unit with partial preprocessing (-E -fdirectives-only) twice causes CRC mismatch Product: gcc Version: 11.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: boris at kolpackov dot net Target Milestone: --- With partial preprocessing (-E -fdirectives-only) compiling the same header with the same options twice results in two CRC-incompatible .gcm files: cat <<EOF >string.hxx #include <string> EOF cat <<EOF >hello.mxx export module hello; import "string.hxx"; export std::string format_hello (const char* n) { return "Hello, " + std::string (n) + '!'; } EOF cat <<EOF >main.cxx #include <cassert> import "string.hxx"; import hello; int main () { assert (format_hello ("World") == "Hello, World!"); } EOF cat <<EOF >hello.txt ./string.hxx string.so.gcm hello hello.so.gcm EOF cat <<EOF >main.txt ./string.hxx string.gcm hello hello.so.gcm EOF g++ -std=c++2a -fmodules-ts -fmodule-mapper=hello.txt -E -fdirectives-only -fmodule-header -x c++-header -o string.so.ii string.hxx g++ -std=c++2a -fmodules-ts -fmodule-mapper=hello.txt -fpreprocessed -fdirectives-only -fmodule-header -x c++-header string.so.ii g++ -std=c++2a -fmodules-ts -fmodule-mapper=hello.txt -x c++ -c hello.mxx g++ -std=c++2a -fmodules-ts -fmodule-mapper=main.txt -E -fdirectives-only -fmodule-header -x c++-header -o string.ii string.hxx g++ -std=c++2a -fmodules-ts -fmodule-mapper=main.txt -fpreprocessed -fdirectives-only -fmodule-header -x c++-header string.ii g++ -std=c++2a -fmodules-ts -fmodule-mapper=main.txt -x c++ -c main.cxx In module imported at main.cxx:5:1: hello: error: import ‘./string.hxx’ has CRC mismatch The really strange thing is that the .ii files are identical: diff string.ii string.so.ii && echo same same Also, there is no error if to compile string.hxx without -E -fdirectives-only: g++ -std=c++2a -fmodules-ts -fmodule-mapper=hello.txt -fmodule-header -x c++-header string.hxx g++ -std=c++2a -fmodules-ts -fmodule-mapper=main.txt -fmodule-header -x c++-header string.hxx