libstdc++: Implement LWG 3150 for std::uniform_random_bit_generator
authorJonathan Wakely <jwakely@redhat.com>
Sat, 15 Feb 2020 08:58:43 +0000 (08:58 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Sat, 15 Feb 2020 10:24:57 +0000 (10:24 +0000)
* include/bits/random.h (uniform_random_bit_generator): Require min()
and max() to be constant expressions and min() to be less than max().
* testsuite/26_numerics/random/concept.cc: Check additional cases.
* testsuite/26_numerics/random/pr60037-neg.cc: Adjust dg-error lineno.

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/random.h
libstdc++-v3/testsuite/26_numerics/random/concept.cc
libstdc++-v3/testsuite/26_numerics/random/pr60037-neg.cc

index d1e5aad1b68cdb9438ee6e39bb0f7779a642e195..8e248703430a02d04aec8408ab453e76e62a66d9 100644 (file)
@@ -1,3 +1,10 @@
+2020-02-15  Jonathan Wakely  <jwakely@redhat.com>
+
+       * include/bits/random.h (uniform_random_bit_generator): Require min()
+       and max() to be constant expressions and min() to be less than max().
+       * testsuite/26_numerics/random/concept.cc: Check additional cases.
+       * testsuite/26_numerics/random/pr60037-neg.cc: Adjust dg-error lineno.
+
 2020-02-13  Patrick Palka  <ppalka@redhat.com>
 
        * include/Makefile.am: Add <bits/ranges_uninitialized.h>.
index 3eefdefc96f9ccc9aefe5a849f5c53b2a24fc9d4..d4aebf45af00ed6b624ff367a94945f7a52f5fcc 100644 (file)
@@ -60,6 +60,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       {
        { _Gen::min() } -> same_as<invoke_result_t<_Gen&>>;
        { _Gen::max() } -> same_as<invoke_result_t<_Gen&>>;
+       requires bool_constant<(_Gen::min() < _Gen::max())>::value;
       };
 #endif
 
index 69a7fc1e67407606d75e8c9324ef85113a2b5139..cb1ea882e166abf33a2ce4cfbcf37e71a70b2f8d 100644 (file)
@@ -219,3 +219,30 @@ struct N11
 };
 
 static_assert( ! std::uniform_random_bit_generator<N11> );
+
+struct N12
+{
+  unsigned operator()();
+  static unsigned min() { return 0; } // not constexpr
+  static constexpr unsigned max() { return 1; }
+};
+
+static_assert( ! std::uniform_random_bit_generator<N12> ); // LWG 3150
+
+struct N13
+{
+  unsigned operator()();
+  static constexpr unsigned min() { return 0; }
+  static unsigned max() { return 1; } // not constexpr
+};
+
+static_assert( ! std::uniform_random_bit_generator<N13> ); // LWG 3150
+
+struct N14
+{
+  unsigned operator()();
+  static constexpr unsigned min() { return 1; }
+  static constexpr unsigned max() { return 0; } // max not greater than min
+};
+
+static_assert( ! std::uniform_random_bit_generator<N14> ); // LWG 3150
index 201b87e9c52b5d2e9c68cb6a60a9acabde5659a7..91e5566c54ae3176d8d17ce11b409c0246a4dc18 100644 (file)
@@ -10,6 +10,6 @@ std::__detail::_Adaptor<std::mt19937, unsigned long> aurng(urng);
 auto x = std::generate_canonical<std::size_t,
                        std::numeric_limits<std::size_t>::digits>(urng);
 
-// { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 171 }
+// { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 172 }
 
 // { dg-error "static assertion failed: template argument must be a floating point type" "" { target *-*-* } 3281 }