Describe the bug
I use the class filesystem::directory_entry and I am checking some attributes using the methods is_regular_file(), is_directory(), and exists(std::error_code &). For the later, I also check the content of the error_code object. In case, I reuse the same std::error_code object and one of the previous path is not valid, then the content of the reused std::error_code object is always false (i.e. the value() is not equal to 0) for the other paths even if the method exists returns true. Based on C++ reference, the implementation proposed by Visual Studio, or the one included in XCode 11 with macOS 10.15, the error_code object should be cleared. I also checked the document N4687 but it is not mentioned what to do in this case (see 30.10.12.3).
To Reproduce
std::error_code ec;
auto d1 = std::filesystem::directory_entry();
std::cout << d1.exists(ec) << std::endl; // should be false
std::cout << ec.value() << std::end; // should not be equal to 0
auto d2 = std::filesystem::directory_entry(std::filesystem::current_path());
std::cout << d2.exists(ec) << std::endl; // should be true
std::cout << ec.value() << std::end; // expected to be equal to 0 but this is not!
Expected behavior
The std::error_code object should be cleared if the directory entry exists
Additional context
From my comprehension of the source code, the problem is in the method directory_entry::status(std::error_code &) (see line 4699).
In case, the status' type is not none, then the std::error_code object should be cleared. I proposed the following implementation to fix the issue.
GHC_INLINE file_status directory_entry::status(std::error_code& ec) const noexcept
{
if (_status.type() != file_type::none) {
ec.clear();
return _status;
}
return filesystem::status(path(), ec);
}
Describe the bug
I use the class
filesystem::directory_entryand I am checking some attributes using the methodsis_regular_file(),is_directory(), andexists(std::error_code &). For the later, I also check the content of the error_code object. In case, I reuse the samestd::error_codeobject and one of the previous path is not valid, then the content of the reusedstd::error_codeobject is always false (i.e. thevalue()is not equal to 0) for the other paths even if the methodexistsreturns true. Based on C++ reference, the implementation proposed by Visual Studio, or the one included in XCode 11 with macOS 10.15, theerror_codeobject should be cleared. I also checked the document N4687 but it is not mentioned what to do in this case (see 30.10.12.3).To Reproduce
std::error_code ec; auto d1 = std::filesystem::directory_entry(); std::cout << d1.exists(ec) << std::endl; // should be false std::cout << ec.value() << std::end; // should not be equal to 0 auto d2 = std::filesystem::directory_entry(std::filesystem::current_path()); std::cout << d2.exists(ec) << std::endl; // should be true std::cout << ec.value() << std::end; // expected to be equal to 0 but this is not!Expected behavior
The
std::error_codeobject should be cleared if the directory entry existsAdditional context
From my comprehension of the source code, the problem is in the method
directory_entry::status(std::error_code &)(see line 4699).In case, the status' type is not
none, then thestd::error_codeobject should be cleared. I proposed the following implementation to fix the issue.