Skip to content

Lack of automatic __cpp_lib_modules definition with C++Module #2301

@M2-TE

Description

@M2-TE

As previously discussed @sharadhr, there seems to be a specific issue with Clang, where __cpp_lib_modules does not automatically get defined. It would be great to figure out why, so we could remove the manual guards currently present for import std. Given the minimal example:

CMakeLists.txt

cmake_minimum_required(VERSION 4.1)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_MODULE_STD ON)
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD d0edc3af-4c50-42ea-a356-e2862fe7a444)
project(example LANGUAGES CXX)
add_executable(${PROJECT_NAME} "main.cpp")

main.cpp

#include <version>
#ifdef __cpp_lib_modules
#   error "sugondese"
#endif
import std;

int main() {
    std::println("goodbye world");
}

On my system (arch linux, packaged Clang 20.1.8), the symbol is never defined, so this compiles just fine:

[main] Configuring project: vulkan-testing 
[proc] Executing command: /usr/bin/cmake -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_C_COMPILER:FILEPATH=/usr/bin/clang -DCMAKE_CXX_COMPILER:FILEPATH=/usr/bin/clang++ --no-warn-unused-cli -S /home/jan/repos/vulkan-testing -B /home/jan/repos/vulkan-testing/build -G Ninja
[cmake] Not searching for unused variables given on the command line.
[cmake] -- The CXX compiler identification is Clang 20.1.8
[cmake] -- Detecting CXX compiler ABI info
[cmake] -- Detecting CXX compiler ABI info - done
[cmake] -- Check for working CXX compiler: /usr/bin/clang++ - skipped
[cmake] -- Detecting CXX compile features
[cmake] CMake Warning (dev) at /usr/share/cmake/Modules/Compiler/CMakeCommonCompilerMacros.cmake:248 (cmake_language):
[cmake]   CMake's support for `import std;` in C++23 and newer is experimental.  It
[cmake]   is meant only for experimentation and feedback to CMake developers.
[cmake] Call Stack (most recent call first):
[cmake]   /usr/share/cmake/Modules/CMakeDetermineCompilerSupport.cmake:113 (cmake_create_cxx_import_std)
[cmake]   /usr/share/cmake/Modules/CMakeTestCXXCompiler.cmake:83 (CMAKE_DETERMINE_COMPILER_SUPPORT)
[cmake]   CMakeLists.txt:5 (project)
[cmake] This warning is for project developers.  Use -Wno-dev to suppress it.
[cmake] 
[cmake] -- Detecting CXX compile features - done
[cmake] -- Configuring done (0.2s)
[cmake] -- Generating done (0.0s)
[cmake] -- Build files have been written to: /home/jan/repos/vulkan-testing/build

Workspace is /home/jan/repos/vulkan-testing
build task started....
/usr/bin/cmake --build /home/jan/repos/vulkan-testing/build --config Debug --target all --
[3/10  10% :: 0.013] Scanning /usr/include/c++/15.2.1/bits/std.compat.cc for CXX dependencies
[3/10  20% :: 0.014] Scanning /home/jan/repos/vulkan-testing/main.cpp for CXX dependencies
[3/10  30% :: 0.054] Scanning /usr/include/c++/15.2.1/bits/std.cc for CXX dependencies
[4/10  40% :: 0.059] Generating CXX dyndep file CMakeFiles/__cmake_cxx23.dir/CXX.dd
[6/10  50% :: 0.064] Generating CXX dyndep file CMakeFiles/example.dir/CXX.dd
[6/10  60% :: 1.393] Building CXX object CMakeFiles/__cmake_cxx23.dir/usr/include/c++/15.2.1/bits/std.cc.o
[8/10  70% :: 1.429] Building CXX object CMakeFiles/__cmake_cxx23.dir/usr/include/c++/15.2.1/bits/std.compat.cc.o
[9/10  80% :: 1.443] Linking CXX static library lib__cmake_cxx23.a
[9/10  90% :: 1.618] Building CXX object CMakeFiles/example.dir/main.cpp.o
[10/10 100% :: 1.661] Linking CXX executable example
build finished successfully.

The same version packaged for Windows (LLVM-MingW) seems to differ in that respect (changed error to warning):

> cmake -S . -B build "-DCMAKE_CXX_COMPILER=$( Resolve-Path ..\llvm-mingw-20250709-ucrt-x86_64\bin\x86_64-w64-mingw32-clang++.exe)" --fresh -G Ninja -Wno-dev && cmake --build build --clean-first -v && .\build\example.exe
-- The CXX compiler identification is Clang 20.1.8
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/bin/x86_64-w64-mingw32-clang++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (0.6s)
-- Generating done (0.0s)
-- Build files have been written to: D:/Libraries/Desktop/clang++21/build
Change Dir: 'D:/Libraries/Desktop/clang++21/build'

Run Clean Command: C:/PROGRA~1/MIB055~1/2022/ENTERP~1/Common7/IDE/COMMON~1/MICROS~1/CMake/Ninja/ninja.exe -v clean
[1/1] C:\PROGRA~1\MIB055~1\2022\ENTERP~1\Common7\IDE\COMMON~1\MICROS~1\CMake\Ninja\ninja.exe  -t clean
Cleaning... 2 files.

Run Build Command(s): C:/PROGRA~1/MIB055~1/2022/ENTERP~1/Common7/IDE/COMMON~1/MICROS~1/CMake/Ninja/ninja.exe -v
[1/10] C:\WINDOWS\system32\cmd.exe /C ""D:/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/bin/x86_64-w64-mingw32-clang-scan-deps.exe" -format=p1689 -- D:\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\bin\x86_64-w64-mingw32-clang++.exe   -std=gnu++23 -x c++ D:/Libraries/Desktop/clang++21/main.cpp -c -o CMakeFiles\example.dir\main.cpp.obj -resource-dir "D:/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/lib/clang/20" -MT CMakeFiles\example.dir\main.cpp.obj.ddi -MD -MF CMakeFiles\example.dir\main.cpp.obj.ddi.d > CMakeFiles\example.dir\main.cpp.obj.ddi.tmp && "C:/Program Files/CMake/bin/cmake.exe" -E rename CMakeFiles\example.dir\main.cpp.obj.ddi.tmp CMakeFiles\example.dir\main.cpp.obj.ddi"
[2/10] C:\WINDOWS\system32\cmd.exe /C ""D:/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/bin/x86_64-w64-mingw32-clang-scan-deps.exe" -format=p1689 -- D:\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\bin\x86_64-w64-mingw32-clang++.exe  -ID:/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/x86_64-w64-mingw32/lib/../../share/libc++/v1 -std=gnu++23 -Wno-reserved-module-identifier -x c++ D:/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/share/libc++/v1/std.compat.cppm -c -o CMakeFiles\__cmake_cxx23.dir\D_\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\share\libc++\v1\std.compat.cppm.obj -resource-dir "D:/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/lib/clang/20" -MT CMakeFiles\__cmake_cxx23.dir\D_\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\share\libc++\v1\std.compat.cppm.obj.ddi -MD -MF CMakeFiles\__cmake_cxx23.dir\D_\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\share\libc++\v1\std.compat.cppm.obj.ddi.d > CMakeFiles\__cmake_cxx23.dir\D_\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\share\libc++\v1\std.compat.cppm.obj.ddi.tmp && "C:/Program Files/CMake/bin/cmake.exe" -E rename CMakeFiles\__cmake_cxx23.dir\D_\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\share\libc++\v1\std.compat.cppm.obj.ddi.tmp CMakeFiles\__cmake_cxx23.dir\D_\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\share\libc++\v1\std.compat.cppm.obj.ddi"
[3/10] C:\WINDOWS\system32\cmd.exe /C ""D:/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/bin/x86_64-w64-mingw32-clang-scan-deps.exe" -format=p1689 -- D:\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\bin\x86_64-w64-mingw32-clang++.exe  -ID:/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/x86_64-w64-mingw32/lib/../../share/libc++/v1 -std=gnu++23 -Wno-reserved-module-identifier -x c++ D:/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/share/libc++/v1/std.cppm -c -o CMakeFiles\__cmake_cxx23.dir\D_\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\share\libc++\v1\std.cppm.obj -resource-dir "D:/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/lib/clang/20" -MT CMakeFiles\__cmake_cxx23.dir\D_\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\share\libc++\v1\std.cppm.obj.ddi -MD -MF CMakeFiles\__cmake_cxx23.dir\D_\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\share\libc++\v1\std.cppm.obj.ddi.d > CMakeFiles\__cmake_cxx23.dir\D_\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\share\libc++\v1\std.cppm.obj.ddi.tmp && "C:/Program Files/CMake/bin/cmake.exe" -E rename CMakeFiles\__cmake_cxx23.dir\D_\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\share\libc++\v1\std.cppm.obj.ddi.tmp CMakeFiles\__cmake_cxx23.dir\D_\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\share\libc++\v1\std.cppm.obj.ddi"
[4/10] "C:\Program Files\CMake\bin\cmake.exe" -E cmake_ninja_dyndep --tdi=CMakeFiles\__cmake_cxx23.dir\CXXDependInfo.json --lang=CXX --modmapfmt=clang --dd=CMakeFiles/__cmake_cxx23.dir/CXX.dd @CMakeFiles/__cmake_cxx23.dir/CXX.dd.rsp
[5/10] "C:\Program Files\CMake\bin\cmake.exe" -E cmake_ninja_dyndep --tdi=CMakeFiles\example.dir\CXXDependInfo.json --lang=CXX --modmapfmt=clang --dd=CMakeFiles/example.dir/CXX.dd @CMakeFiles/example.dir/CXX.dd.rsp
[6/10] D:\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\bin\x86_64-w64-mingw32-clang++.exe  -ID:/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/x86_64-w64-mingw32/lib/../../share/libc++/v1 -std=gnu++23 -Wno-reserved-module-identifier -MD -MT CMakeFiles/__cmake_cxx23.dir/D_/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/share/libc++/v1/std.cppm.obj -MF CMakeFiles\__cmake_cxx23.dir\D_\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\share\libc++\v1\std.cppm.obj.d @CMakeFiles\__cmake_cxx23.dir\D_\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\share\libc++\v1\std.cppm.obj.modmap -o CMakeFiles/__cmake_cxx23.dir/D_/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/share/libc++/v1/std.cppm.obj -c D:/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/share/libc++/v1/std.cppm
[7/10] D:\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\bin\x86_64-w64-mingw32-clang++.exe  -ID:/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/x86_64-w64-mingw32/lib/../../share/libc++/v1 -std=gnu++23 -Wno-reserved-module-identifier -MD -MT CMakeFiles/__cmake_cxx23.dir/D_/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/share/libc++/v1/std.compat.cppm.obj -MF CMakeFiles\__cmake_cxx23.dir\D_\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\share\libc++\v1\std.compat.cppm.obj.d @CMakeFiles\__cmake_cxx23.dir\D_\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\share\libc++\v1\std.compat.cppm.obj.modmap -o CMakeFiles/__cmake_cxx23.dir/D_/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/share/libc++/v1/std.compat.cppm.obj -c D:/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/share/libc++/v1/std.compat.cppm
[8/10] C:\WINDOWS\system32\cmd.exe /C "cd . && "C:\Program Files\CMake\bin\cmake.exe" -E rm -f lib__cmake_cxx23.a && D:\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\bin\x86_64-w64-mingw32-llvm-ar.exe qc lib__cmake_cxx23.a  CMakeFiles/__cmake_cxx23.dir/D_/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/share/libc++/v1/std.cppm.obj CMakeFiles/__cmake_cxx23.dir/D_/Libraries/Desktop/llvm-mingw-20250709-ucrt-x86_64/share/libc++/v1/std.compat.cppm.obj && D:\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\bin\x86_64-w64-mingw32-llvm-ranlib.exe lib__cmake_cxx23.a && cd ."
[9/10] D:\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\bin\x86_64-w64-mingw32-clang++.exe   -std=gnu++23 -MD -MT CMakeFiles/example.dir/main.cpp.obj -MF CMakeFiles\example.dir\main.cpp.obj.d @CMakeFiles\example.dir\main.cpp.obj.modmap -o CMakeFiles/example.dir/main.cpp.obj -c D:/Libraries/Desktop/clang++21/main.cpp
D:/Libraries/Desktop/clang++21/main.cpp:3:5: warning: "sugondese" [-W#warnings]
    3 | #   warning "sugondese"
      |     ^
1 warning generated.
[10/10] C:\WINDOWS\system32\cmd.exe /C "cd . && D:\Libraries\Desktop\llvm-mingw-20250709-ucrt-x86_64\bin\x86_64-w64-mingw32-clang++.exe   CMakeFiles/example.dir/main.cpp.obj -o example.exe -Wl,--out-implib,libexample.dll.a -Wl,--major-image-version,0,--minor-image-version,0  lib__cmake_cxx23.a  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."

goodbye world

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions