#include <filesystem> int main() { std::filesystem::path p = "foo"; } g++ -g --std=c++17 path.cpp ./a.out Segmentation fault (core dumped) g++ --version g++ (Ubuntu 8.3.0-6ubuntu1) 8.3.0 uname -a Linux x2 5.0.6-050006-generic #201904030534 SMP Wed Apr 3 05:36:14 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux Ubuntu 19.04. Core was generated by `./a.out'. Program terminated with signal SIGSEGV, Segmentation fault. #0 0x000055c2ac25149b in std::vector<std::filesystem::__cxx11::path::_Cmpt, std::allocator<std::filesystem::__cxx11::path::_Cmpt> >::~vector (this=0x23, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/stl_vector.h:567 567 std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish, (gdb) bt #0 0x000055c2ac25149b in std::vector<std::filesystem::__cxx11::path::_Cmpt, std::allocator<std::filesystem::__cxx11::path::_Cmpt> >::~vector (this=0x23, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/stl_vector.h:567 #1 0x000055c2ac251314 in std::filesystem::__cxx11::path::~path (this=0x3, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/fs_path.h:208 #2 0x000055c2ac251f5c in std::filesystem::__cxx11::path::_Cmpt::~_Cmpt (this=0x3, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/fs_path.h:643 #3 0x000055c2ac251f77 in std::_Destroy<std::filesystem::__cxx11::path::_Cmpt> (__pointer=0x3) at /usr/include/c++/8/bits/stl_construct.h:98 #4 0x000055c2ac251e27 in std::_Destroy_aux<false>::__destroy<std::filesystem::__cxx11::path::_Cmpt*> (__first=0x3, __last=0x0) at /usr/include/c++/8/bits/stl_construct.h:108 #5 0x000055c2ac251a98 in std::_Destroy<std::filesystem::__cxx11::path::_Cmpt*> (__first=0x3, __last=0x0) at /usr/include/c++/8/bits/stl_construct.h:137 #6 0x000055c2ac2517a9 in std::_Destroy<std::filesystem::__cxx11::path::_Cmpt*, std::filesystem::__cxx11::path::_Cmpt> (__first=0x3, __last=0x0) at /usr/include/c++/8/bits/stl_construct.h:206 #7 0x000055c2ac2514b1 in std::vector<std::filesystem::__cxx11::path::_Cmpt, std::allocator<std::filesystem::__cxx11::path::_Cmpt> >::~vector (this=0x7ffe3ad201d0, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/stl_vector.h:567 #8 0x000055c2ac251314 in std::filesystem::__cxx11::path::~path (this=0x7ffe3ad201b0, __in_chrg=<optimized out>) at /usr/include/c++/8/bits/fs_path.h:208 #9 0x000055c2ac251230 in main () at path.cpp:4
I would hope somebody would take a look and reject this issues as invalid for some reason, because otherwise it's rather severe.
Adding -lstdc++fs fixes the problem with g++ 8.3 g++-9 does not segfault even without -lstdc++fs g++-9 --version g++-9 (Ubuntu 9-20190402-1ubuntu1) 9.0.1 20190402 (experimental) [trunk revision 270074]
I just tried with g++ (GCC) 8.3.1 20190223 (Red Hat 8.3.1-2) on Fedora and it works well. But to be able to link, I had to add -lstdc++fs.
The -lstdc++fs requirement for std::filesystem in GCC 8 is documented in several places: https://gcc.gnu.org/onlinedocs/gcc-8.3.0/libstdc++/manual/manual/using.html#manual.intro.using.flags https://gcc.gnu.org/onlinedocs/gcc-8.3.0/libstdc++/manual/manual/status.html#status.iso.2017 https://gcc.gnu.org/onlinedocs/gcc-8.3.0/libstdc++/manual/manual/using_dynamic_or_shared.html#manual.intro.using.linkage.experimental I don't know why it crashes with Ubuntu, it should be a linker error. I suspect Ubuntu is doing something silly like providing libstdc++.so from GCC 9, which defines std::filesystem::path differently, and so is not compatible with C++17 code compiled using GCC 8.
Although if you link with -lstdc++fs then it should work OK, because the incompatible std::filesystem symbols in libstdc++.so.6.0.26 won't be used.
OK, thanks. So if on Ubuntu 19.04, the default compiler produces without errors/warnings, from valid source code, an executable that crashes, that's programmer error?! I understand the explanation, but there is a problem. Maybe the bug is not with gcc but with Ubuntu, but a bug there is.
See https://bugs.launchpad.net/ubuntu/+source/gcc-8/+bug/1824721 where I said: "for now the short answer is "C++17 support in GCC 8 is experimental, the onus is on you to link correctly"
that's now mitigated by a local patch, always linking with -lstdc++fs. https://salsa.debian.org/toolchain-team/gcc/blob/gcc-8-debian/debian/patches/pr90050.diff