<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/60634>60634</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            libc++ : std::filesystem::create_directories report failure when working for path with trailing '/'
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Keenuts
      </td>
    </tr>
</table>

<pre>
    Hello! Hope this is the correct process to report a libc++ issue ðŸ˜Š

Issue:
`std::filesystem::create_directories("/tmp/toto/")` returns a failure, even when succeeding.
>From strace, I can see the lib implem considers `/tmp/toto` to be different than `/tmp/toto/` (2 mkdir, 2 stat).

It does `mkdir("/tmp/toto/")`, which passes, then `mkdir("/tmp/toto")` which failed (directory exists).

Behavior observed at head (58927e9931219387895b4ef67ebb50eafa2d9056) on linux.

test code:
```cpp
#include <iostream>
#include <filesystem>

int main() {
  std::filesystem::path path("/tmp/toto/");
  if (std::filesystem::exists(path)) {
    std::cout << "folder exists, cannot reproduce bug. remove /tmp/toto" << std::endl;
    return 0;
  }

  std::cout << "reproducing..." << std::endl;
  if (std::filesystem::create_directories(path)) {
    std::cout << "folder was created, no bug." << std::endl;
    return 0;
  }

  std::cout << "folder was created, but failed to create it, bug." << std::endl;
  return -1;
}
```

- clone llvm-project
- configure:
```
cmake ./llvm -Bbuild -GNinja -DCMAKE_BUILD_TYPE=Debug -DLLVM_ENABLE_PROJECTS='clang' -DLLVM_TARGETS_TO_BUILD='X86;AMDGPU' -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD='DirectX;SPIRV' -DLLVM_OPTIMIZED_TABLEGEN=1 -DLLVM_ENABLE_LLD=1 -DLLVM_USE_SPLIT_DWARF=1 -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DCMAKE_INSTALL_PREFIX=run -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind"
```
- build
```
ninja -C build
```

- run
```
llvm-project/build/bin/clang-17 -std=c++20 test.cc -o test -stdlib=libc++ -Lllvm-project/build/lib/x86_64-unknown-linux-gnu/ -lc++ -lc++abi -lunwind -static
```

Expected output:
```
./test-bugfree
reproducing...
folder was created, no bug.
```

Observed output:
```
./test
reproducing...
folder was created, but failed to create it, bug.
```


The bug-free version is using GCC's standard lib.
This might be a known behavior difference between both libs, but this behavior clearly feels wrong from an user point of view:
```
exists("/tmp/toto/") -> false
create_directories("/tmp/toto/") -> false
exists("/tmp/toto/") -> true
```

Thanks!
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0V11v6jwS_jXmZhQUHCDkggsgSV_2hRZRera7N8hJJsSnwUa2U9p_v3JCOPSDnp6VXgmFZDwfzzz22GOmNd8JxDEZTMkg7LDKFFKN_0YUldGdRGav47-wLCWhPfhLHhBMwTVwDaZASKVSmBo4KJmi1mAkKDxIZYBByZOU0CmhU-BaVwgkdkkQk2BERhPihsQ9Ped2lHitbOhqk9lPb5LzEvWrNrhvvlOFzOA24zaoVBw1oSNCKaGx2R_sUxpJaFyLAjJ0QaGplNDAIGe8rBQSOgN8RgHHAgXoKk0RMy523SZ6rOQetFEsrTXnkDIBGrHOtuQJ8P2hxD2kUmieodJAhu7b8EPX0pAgZDzPUaEwYAomPirS2OoSOqKwf8q4sgEpaMMMoUH3DUMGMol1rJPml1lbR8eCpwUcmNaWpJnFL762bylrLC1dmFl0LduvgC9cG_0e3BQL9sylAploVM-YATNQIKuNB6OA-hgEXo_2Am_kj4JB0sd86GOSDFxkOaNZ4A6GhAYgBZRcVC9vvBvUBlKZvVkgzS89HE4S6nGRllWGQLwZl9ooZHviRZ8NX66p6DISFwb2jIuanACIP23kAFfX44EZy7EpvpwQ7-yI55aTq-5afkeNy-AdjAsgqayMTYZ4MyCU5rLMUJ3nZ2ZXrZDG1qKSWZUiJNWuCwr38hnh_by3js7eUWTlBWo4VRG4F0Lih5fkXcfWYrA11u1-I9xvSPp0D_g_CTsyDY2_zLImZM3TP07J59GTyrRVZ-RpALhphr6F6oTJ6Z1lvyC1RXOJ0IG0lAKhLJ_3zkHJn5ia84gUOd_ZDfND3TWf6Z49IXQJja05ONOk4mUGzs0tFz8ZOOFsOfk72k4f5otwu_nPKiJeGGJS7cAJF4sfy210O5kuou1qffevaLa5J15IqJ-WTOwI9VulzWR9E23ut5u7xlOj9TgaEm86WYY3q4cL5ehxFa3ny-h2M1lcsQzrZfNIvOn9ar7-cWF8t9rMl_P_RuF2Y3HdRLfEC3vvwC5qP2fpw320vV8t5ptt-O_JOj4NNYnPHh-3s7vlar6I1sQLT4nVx-FZ5YPCeSh6XN2tN-24_V9ObsP7NxHmt_ebyWKxXa2jeP5IvFBV4h3e9cPtZr6MGnKpPZFfXog3bV5Ywpv3Shy5yOxu9dlEO1DP7Kdjopnr2RcqrRNViU_H3yw-GjeOaJzYjTiuSXF6Pjj1mg9PDQV1wZ4L3TQFR9avtULJE-KFF32Hs7ji3WrS-GU03A77TiWehDwKpz58nJ2oCI3BKc9O2jeWcHDKhiwbjxmefpFy9HLA1GAGsjKHylyrI1tBNgMnqXa5Qmyk73bNWvb1pnUdyF17Ln8PyJ8C-N2-dR1Y89wU9fHk2OThGZXmUtj-stJc7OBmNiPU17YtEhlTmW3Cuq0h17Dnu8LYbotBPYuQtO1I237Z0w_NEVFAIk1hHegWd93Lni3SEpkqXyFHLDUclRQ7yG1DyARUGhUcpG0SZA7PHI_XeDyf4lc7AnCIF0HOSn2a7T_raz-YfzeiURV-MR2bgoknTWivk429LPAC1sFxb-gPgn4QBP1OMU4Gfs4G7hBZktEk8ILcp0GaDTEdsd5g5Hf4mLrUc6kb9DwvGPS7A3c4GPh9SnPadyn1SN_FPeNl1xZmV6pdp74bjIfu0Ot3SpZgqduriBrX1ZtUO036bmlz_GVmuClxfFHrxJtcb9Q-EtzeU07XguY6cJTqyS66XKq6rYMjNwUYxXhpxYT6NaN-p1LluDDmoK17K4p33BRV0k3l_nQinv4uNp86U01oXCf7vwAAAP__par1OA">