Clang 拒绝编译 libstdc++ 的 <filesystem> header

Clang refuses to compile libstdc++'s <filesystem> header

考虑这个最小的例子:

#include <filesystem>
#include <iostream>

int main()
{
    std::cout << std::filesystem::current_path() << '\n';
}

它在 GCC 9.2 中按预期工作,但 Clang 8.0.1 拒绝编译 <filesystem> header(来自 GCC 9.2 的 libstdc++):

# clang++ 1.cpp -std=c++17
In file included from 1.cpp:1:
In file included from Z:\Lander\msys2\mingw64\include\c++.2.0\filesystem:37:
Z:\Lander\msys2\mingw64\include\c++.2.0\bits/fs_path.h:636:31: error: invalid use of incomplete
      type 'std::filesystem::__cxx11::filesystem_error'
      _GLIBCXX_THROW_OR_ABORT(filesystem_error(
                              ^~~~~~~~~~~~~~~~~
Z:\Lander\msys2\mingw64\include\c++.2.0\x86_64-w64-mingw32\bits/c++config.h:177:49: note: expanded
      from macro '_GLIBCXX_THROW_OR_ABORT'
#  define _GLIBCXX_THROW_OR_ABORT(_EXC) (throw (_EXC))
                                                ^~~~
Z:\Lander\msys2\mingw64\include\c++.2.0\bits/fs_fwd.h:61:9: note: forward declaration of
      'std::filesystem::__cxx11::filesystem_error'
  class filesystem_error;
        ^
1 error generated.

这是 Clang 错误还是 libstdc++ 错误?

我在 MSYS2 bug tracker 上找到了 this bug report,但是里面没有有用的信息。

在我们等待官方修复的同时,有没有办法修补 <filesystem> header 来消除这个错误?


我在 Windows。我正在使用 MSYS2 软件包中可用的最新 GCC 和 Clang。

GCC 标识为:

# g++ --version
g++.exe (Rev2, Built by MSYS2 project) 9.2.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Clang 标识为:

# clang++ --version
clang version 8.0.1 (tags/RELEASE_801/final)
Target: x86_64-w64-windows-gnu
Thread model: posix
InstalledDir: Z:\Lander\msys2\mingw64\bin

Clang 使用此 GCC 附带的 libstdc++。

可以通过修补 <msys2_path>/mingw64/include/c++/9.2.0/bits/fs_path.h.

来解决该问题

在第666-692行,有class filesystem_error的定义。它必须向上移动到第 614 行,正好在 u8path().

的定义之上

我认为这是一个 libstdc++ 错误。我已经举报了 here.

class filesystem_errorbits/fs_path.h中被多次使用,每次使用都低于定义,除了有问题的第636行。

该行包含在 #ifdef _GLIBCXX_FILESYSTEM_IS_WINDOWS 中,所以我猜 Clang 开发人员不会 运行 在 Windows.

上进行 libstdc++ 兼容性测试

UPD: 这在 GCC 9.3 中已修复。