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"

Reply via email to