libstdc++: Fix incorrect test for std::error_code comparisons
authorJonathan Wakely <jwakely@redhat.com>
Wed, 3 Feb 2021 15:49:36 +0000 (15:49 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 3 Feb 2021 15:49:36 +0000 (15:49 +0000)
The tests for std::error_code comparisons assumed that a default
constructed object uses std::generic_category(). That's true for a
default constructed std::error_condition, but not std::error_code.

Fix the three-way comparisons to correctly depend on the result of
comparing the categories, and add another test for comparing two objects
with the same category and different values.

libstdc++-v3/ChangeLog:

* testsuite/19_diagnostics/error_code/operators/not_equal.cc:
Add comparison with same category and different values.
* testsuite/19_diagnostics/error_code/operators/less.cc:
Likewise. Fix comparison involving different categories.
* testsuite/19_diagnostics/error_code/operators/three_way.cc:
Likewise.
* testsuite/19_diagnostics/error_condition/operators/less.cc:
Add comment.
* testsuite/19_diagnostics/error_condition/operators/three_way.cc:
Likewise.

libstdc++-v3/testsuite/19_diagnostics/error_code/operators/less.cc
libstdc++-v3/testsuite/19_diagnostics/error_code/operators/not_equal.cc
libstdc++-v3/testsuite/19_diagnostics/error_code/operators/three_way.cc
libstdc++-v3/testsuite/19_diagnostics/error_condition/operators/less.cc
libstdc++-v3/testsuite/19_diagnostics/error_condition/operators/three_way.cc

index 655515c4988147444cf3359f4540ed920c36a68f..abb754136eac68cb633f69eda36a4901a2903186 100644 (file)
@@ -29,10 +29,13 @@ int main()
   VERIFY( !(e1 < e1) );
   VERIFY( !(e2 < e2) );
 
-  VERIFY( (e1 < e2) == (e1.value() < e2.value()) );
+  VERIFY( (e1 < e2) == (e1.category() < e2.category()) );
 
   const __gnu_test::test_category cat;
   std::error_code e3(e2.value(), cat);
   VERIFY( !(e3 < e3) );
   VERIFY( (e2 < e3) == (e2.category() < e3.category()) );
+
+  std::error_code e4(std::make_error_code(std::errc::invalid_argument));
+  VERIFY( (e4 < e2) == (e4.value() < e2.value()) );
 }
index a8dfa505dc2340c7e60e7e11df1af58b9bb29fa1..543ffceb832815aa3dfe2e1b378411fdec2dd154 100644 (file)
@@ -34,5 +34,6 @@ int main()
   std::error_code e3(e2.value(), cat);
   VERIFY( e2 != e3 );
 
-  return 0;
+  std::error_code e4(std::make_error_code(std::errc::invalid_argument));
+  VERIFY( e4 != e2 );
 }
index 448f51d1d7377e054fb553803b1b0da4f9c9ee65..50c54bea94f27b082ac1ae8d62f43976270e63c4 100644 (file)
@@ -33,7 +33,7 @@ test01()
 
   VERIFY( std::is_neq(e1 <=> e2) );
   VERIFY( std::is_lt(e1 <=> e2) || std::is_gt(e1 <=> e2) );
-  VERIFY( (e1 <=> e2) == (e1.value() <=> e2.value()) );
+  VERIFY( (e1 <=> e2) == (e1.category() <=> e2.category()) );
 
   VERIFY( e1 == e1 );
   VERIFY( !(e1 == e2) );
@@ -52,6 +52,12 @@ test01()
 
   VERIFY( !(e3 < e3) );
   VERIFY( (e2 < e3) == (e2.category() < e3.category()) );
+
+  std::error_code e4(std::make_error_code(std::errc::invalid_argument));
+
+  VERIFY( std::is_neq(e4 <=> e2) );
+  VERIFY( std::is_lt(e4 <=> e2) || std::is_gt(e4 <=> e2) );
+  VERIFY( (e4 <=> e2) == (e4.value() <=> e2.value()) );
 }
 
 int main()
index 96f8b6868af2ce1d20c448d7c65f142d1489289e..8a6b71fdc3502cebe4d5e5825c22a1ff3c3a4daf 100644 (file)
@@ -29,6 +29,7 @@ int main()
   VERIFY( !(e1 < e1) );
   VERIFY( !(e2 < e2) );
 
+  // e1.category() == e2.category(), so comparison depends on values:
   VERIFY( (e1 < e2) == (e1.value() < e2.value()) );
 
   const __gnu_test::test_category cat;
index 189889706ce18781dbaffef5e16718ffdd668ebd..e26afe57366d14e840efb0dd1154bb122247c97e 100644 (file)
@@ -33,6 +33,7 @@ test01()
 
   VERIFY( std::is_neq(e1 <=> e2) );
   VERIFY( std::is_lt(e1 <=> e2) || std::is_gt(e1 <=> e2) );
+  // e1.category() == e2.category(), so comparison depends on values:
   VERIFY( (e1 <=> e2) == (e1.value() <=> e2.value()) );
 
   VERIFY( e1 == e1 );