https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87226
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |RESOLVED Resolution|--- |INVALID --- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> --- (In reply to Akira Takahashi from comment #0) > #include <iostream> > #include <filesystem> > #include <fstream> > > namespace fs = std::filesystem; > > int main() > { > fs::create_directory("dir_a"); > std::ofstream{"dir_a/a.txt"}; > > fs::create_directory("dir_b"); > std::ofstream{"dir_b/b.txt"}; > fs::create_directory_symlink("dir_a", "dir_b/dir_a"); This creates a symlink in dir_b that points to itself. > for (const fs::directory_entry& x : fs::recursive_directory_iterator( > "dir_b", > > fs::directory_options::follow_directory_symlink)) { > std::cout << x.path() << std::endl; > } > } > > expected result: > "dir_b/b.txt" > "dir_b/dir_a" > "dir_b/dir_a/a.txt" No, because you've created a broken symlink. dir_b/dir_a cannot be followed. You can confirm that with /bin/ls $ /bin/ls -R -1 dir_b dir_b: b.txt dir_a Which matches your results: > > actual result: > "dir_b/b.txt" > "dir_b/dir_a" You probably meant to do: fs::create_directory_symlink("../dir_a", "dir_b/dir_a"); Then the result is: "dir_b/dir_a" "dir_b/dir_a/a.txt" "dir_b/b.txt"