Skip to content

C++ Module build failed with GCC 15.2.0 #281

@Pecco-314

Description

@Pecco-314

Environment

toml++ version and/or commit hash:

bf869b0

Compiler:

GCC 15.2.0

C++ standard mode:

C++23

Target arch:

x86_64-pc-linux-gnu

Library configuration overrides:

TOMLPLUSPLUS_BUILD_MODULES=ON

Relevant compilation flags:

Describe the bug

cmake -G Ninja .. output:

-- The C compiler identification is GNU 15.2.0
-- The CXX compiler identification is GNU 15.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
CMake Warning (dev) at /usr/local/share/cmake-4.0/Modules/Compiler/CMakeCommonCompilerMacros.cmake:248 (cmake_language):
  CMake's support for `import std;` in C++23 and newer is experimental.  It
  is meant only for experimentation and feedback to CMake developers.
Call Stack (most recent call first):
  /usr/local/share/cmake-4.0/Modules/CMakeDetermineCompilerSupport.cmake:113 (cmake_create_cxx_import_std)
  /usr/local/share/cmake-4.0/Modules/CMakeTestCXXCompiler.cmake:83 (CMAKE_DETERMINE_COMPILER_SUPPORT)
  CMakeLists.txt:8 (project)
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Detecting CXX compile features - done
-- Building C++ modules (CMake 4.0.0 supports modules)
-- Configuring done (1.0s)
CMake Warning (dev) in tomlplusplus/src/modules/CMakeLists.txt:
  Target "tomlplusplus_modules" has source file

    /root/demo/tomlplusplus/src/modules/tomlplusplus.cppm

  in a "FILE_SET TYPE CXX_MODULES" multiple times.
This warning is for project developers.  Use -Wno-dev to suppress it.

-- Generating done (0.1s)
-- Build files have been written to: /root/demo/build

ninja -v output:

[1/11] /usr/bin/c++   -std=gnu++23 -fmodule-only -E -x c++ /usr/include/c++/15.2.0/bits/std.compat.cc -MT CMakeFiles/__CMAKE__CXX23@synth_a252cf90f7bd.dir/906157ab5ab1.bmi.ddi -MD -MF CMakeFiles/__CMAKE__CXX23@synth_a252cf90f7bd.dir/906157ab5ab1.bmi.ddi.d -fmodules-ts -fdeps-file=CMakeFiles/__CMAKE__CXX23@synth_a252cf90f7bd.dir/906157ab5ab1.bmi.ddi -fdeps-target=CMakeFiles/__CMAKE__CXX23@synth_a252cf90f7bd.dir/906157ab5ab1.bmi -fdeps-format=p1689r5 -o CMakeFiles/__CMAKE__CXX23@synth_a252cf90f7bd.dir/906157ab5ab1.bmi.ddi.i
[2/11] /usr/bin/c++   -std=gnu++23 -fmodule-only -E -x c++ /usr/include/c++/15.2.0/bits/std.cc -MT CMakeFiles/__CMAKE__CXX23@synth_a252cf90f7bd.dir/c80ddc02f13e.bmi.ddi -MD -MF CMakeFiles/__CMAKE__CXX23@synth_a252cf90f7bd.dir/c80ddc02f13e.bmi.ddi.d -fmodules-ts -fdeps-file=CMakeFiles/__CMAKE__CXX23@synth_a252cf90f7bd.dir/c80ddc02f13e.bmi.ddi -fdeps-target=CMakeFiles/__CMAKE__CXX23@synth_a252cf90f7bd.dir/c80ddc02f13e.bmi -fdeps-format=p1689r5 -o CMakeFiles/__CMAKE__CXX23@synth_a252cf90f7bd.dir/c80ddc02f13e.bmi.ddi.i
[3/11] /usr/local/bin/cmake -E cmake_ninja_dyndep --tdi=CMakeFiles/__CMAKE__CXX23@synth_a252cf90f7bd.dir/CXXDependInfo.json --lang=CXX --modmapfmt=gcc --dd='CMakeFiles/__CMAKE__CXX23@synth_a252cf90f7bd.dir/CXX.dd' @'CMakeFiles/__CMAKE__CXX23@synth_a252cf90f7bd.dir/CXX.dd'.rsp
[4/11] /usr/bin/c++  -isystem /root/demo/tomlplusplus/include -std=gnu++23 -E -x c++ /root/demo/main.cpp -MT CMakeFiles/mytest.dir/main.cpp.o.ddi -MD -MF CMakeFiles/mytest.dir/main.cpp.o.ddi.d -fmodules-ts -fdeps-file=CMakeFiles/mytest.dir/main.cpp.o.ddi -fdeps-target=CMakeFiles/mytest.dir/main.cpp.o -fdeps-format=p1689r5 -o CMakeFiles/mytest.dir/main.cpp.o.ddi.i
[5/11] /usr/bin/c++  -isystem /root/demo/tomlplusplus/include -std=gnu++23 -E -x c++ /root/demo/tomlplusplus/src/modules/tomlplusplus.cppm -MT tomlplusplus/src/modules/CMakeFiles/tomlplusplus_modules.dir/tomlplusplus.cppm.o.ddi -MD -MF tomlplusplus/src/modules/CMakeFiles/tomlplusplus_modules.dir/tomlplusplus.cppm.o.ddi.d -fmodules-ts -fdeps-file=tomlplusplus/src/modules/CMakeFiles/tomlplusplus_modules.dir/tomlplusplus.cppm.o.ddi -fdeps-target=tomlplusplus/src/modules/CMakeFiles/tomlplusplus_modules.dir/tomlplusplus.cppm.o -fdeps-format=p1689r5 -o tomlplusplus/src/modules/CMakeFiles/tomlplusplus_modules.dir/tomlplusplus.cppm.o.ddi.i
[6/11] /usr/local/bin/cmake -E cmake_ninja_dyndep --tdi=tomlplusplus/src/modules/CMakeFiles/tomlplusplus_modules.dir/CXXDependInfo.json --lang=CXX --modmapfmt=gcc --dd=tomlplusplus/src/modules/CMakeFiles/tomlplusplus_modules.dir/CXX.dd @tomlplusplus/src/modules/CMakeFiles/tomlplusplus_modules.dir/CXX.dd.rsp
[7/11] /usr/local/bin/cmake -E cmake_ninja_dyndep --tdi=CMakeFiles/mytest.dir/CXXDependInfo.json --lang=CXX --modmapfmt=gcc --dd=CMakeFiles/mytest.dir/CXX.dd @CMakeFiles/mytest.dir/CXX.dd.rsp
[8/11] /usr/bin/c++  -isystem /root/demo/tomlplusplus/include -std=gnu++23 -MD -MT tomlplusplus/src/modules/CMakeFiles/tomlplusplus_modules.dir/tomlplusplus.cppm.o -MF tomlplusplus/src/modules/CMakeFiles/tomlplusplus_modules.dir/tomlplusplus.cppm.o.d -fmodules-ts -fmodule-mapper=tomlplusplus/src/modules/CMakeFiles/tomlplusplus_modules.dir/tomlplusplus.cppm.o.modmap -MD -fdeps-format=p1689r5 -x c++ -o tomlplusplus/src/modules/CMakeFiles/tomlplusplus_modules.dir/tomlplusplus.cppm.o -c /root/demo/tomlplusplus/src/modules/tomlplusplus.cppm
[9/11] /usr/bin/c++  -isystem /root/demo/tomlplusplus/include -std=gnu++23 -MD -MT CMakeFiles/mytest.dir/main.cpp.o -MF CMakeFiles/mytest.dir/main.cpp.o.d -fmodules-ts -fmodule-mapper=CMakeFiles/mytest.dir/main.cpp.o.modmap -MD -fdeps-format=p1689r5 -x c++ -o CMakeFiles/mytest.dir/main.cpp.o -c /root/demo/main.cpp
FAILED: CMakeFiles/mytest.dir/main.cpp.o 
/usr/bin/c++  -isystem /root/demo/tomlplusplus/include -std=gnu++23 -MD -MT CMakeFiles/mytest.dir/main.cpp.o -MF CMakeFiles/mytest.dir/main.cpp.o.d -fmodules-ts -fmodule-mapper=CMakeFiles/mytest.dir/main.cpp.o.modmap -MD -fdeps-format=p1689r5 -x c++ -o CMakeFiles/mytest.dir/main.cpp.o -c /root/demo/main.cpp
In module imported at /root/demo/main.cpp:1:1:
tomlplusplus: error: failed to read compiled module: Bad file data
tomlplusplus: note: compiled module file is ‘tomlplusplus/src/modules/CMakeFiles/tomlplusplus_modules.dir/tomlplusplus.gcm’
tomlplusplus: fatal error: returning to the gate for a mechanical issue
compilation terminated.
[10/11] : && /usr/local/bin/cmake -E rm -f tomlplusplus/src/modules/libtomlplusplus_modules.a && /usr/bin/ar qc tomlplusplus/src/modules/libtomlplusplus_modules.a  tomlplusplus/src/modules/CMakeFiles/tomlplusplus_modules.dir/tomlplusplus.cppm.o && /usr/bin/ranlib tomlplusplus/src/modules/libtomlplusplus_modules.a && :
ninja: build stopped: subcommand failed.

Steps to reproduce (or a small repro code sample)

Tree:

mytest
├── build
├── CMakeLists.txt
├── main.cpp
└── tomlplusplus

CMakeLists.txt:

cmake_minimum_required(VERSION 4.0.0)
project(mytest)
set(CMAKE_CXX_STANDARD 23)
set(TOMLPLUSPLUS_BUILD_MODULES ON)
add_subdirectory(tomlplusplus)
add_executable(mytest main.cpp)
target_link_libraries(mytest PRIVATE tomlplusplus_modules)

main.cpp:

import tomlplusplus;

int main() {
    return 0;
}

Additional information

The "bad data" error occurs during the reading of .gcm files, specifically when processing namespace metadata. I traced the issue to the module_state::read_namespaces() function, which triggers an overrun condition when it encounters a namespace with a specific flag combination: export=1 but purview=0.

I'm not certain whether this represents a bug in GCC, or something else. But I successfully resolved the compilation issue by removing the inline namespace:

    // inline namespace literals {
        using TOML_NAMESPACE::literals::operator""_toml;
        using TOML_NAMESPACE::literals::operator""_tpath;
    // }

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions