libstdc++: std::system_category should know meaning of zero [PR102425]

Although 0 is not an errno value, it should still be recognized as
corresponding to a value belonging to the generic_category().

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>

libstdc++-v3/ChangeLog:

	PR libstdc++/102425
	* src/c++11/system_error.cc
	(system_error_category::default_error_condition): Add 0 to
	switch.
	* testsuite/19_diagnostics/error_category/102425.cc: New test.
This commit is contained in:
Jonathan Wakely 2021-09-22 11:58:20 +01:00
parent f6a05b23cc
commit ce01e2e64c
2 changed files with 21 additions and 0 deletions

View File

@ -70,6 +70,8 @@ namespace
virtual std::error_condition
default_error_condition(int ev) const noexcept
{
// Use generic category for all known POSIX errno values (including zero)
// and system category otherwise.
switch (ev)
{
// List of errno macros from [cerrno.syn].
@ -310,6 +312,7 @@ namespace
#ifdef EXDEV
case EXDEV:
#endif
case 0:
return std::error_condition(ev, std::generic_category());
/* Additional system-dependent mappings from non-standard error codes

View File

@ -0,0 +1,18 @@
// { dg-do run { target c++11 } }
#include <system_error>
#include <testsuite_hooks.h>
void test01()
{
// PR libstdc++/102425
VERIFY( std::error_code() == std::error_condition() );
auto zero = std::system_category().default_error_condition(0);
// This is the condition that the equality above relies on:
VERIFY( zero.category() == std::generic_category() );
}
int main()
{
test01();
}