xref: /llvm-project/libcxx/test/std/numerics/rand/rand.util/rand.util.seedseq/generate.mandates.verify.cpp (revision 09e3a360581dc36d0820d3fb6da9bd7cfed87b5d)
1ca48d4dfSLouis Dionne //===----------------------------------------------------------------------===//
2ca48d4dfSLouis Dionne //
3ca48d4dfSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ca48d4dfSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5ca48d4dfSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ca48d4dfSLouis Dionne //
7ca48d4dfSLouis Dionne //===----------------------------------------------------------------------===//
8ca48d4dfSLouis Dionne 
9ca48d4dfSLouis Dionne // <random>
10ca48d4dfSLouis Dionne 
11ca48d4dfSLouis Dionne // class seed_seq;
12ca48d4dfSLouis Dionne 
13ca48d4dfSLouis Dionne // template<class RandomAccessIterator>
14ca48d4dfSLouis Dionne //     void generate(RandomAccessIterator begin, RandomAccessIterator end);
15ca48d4dfSLouis Dionne 
16ca48d4dfSLouis Dionne // Check the following requirement: https://eel.is/c++draft/rand.util.seedseq#7
17ca48d4dfSLouis Dionne //
18ca48d4dfSLouis Dionne //  Mandates: iterator_traits<RandomAccessIterator>::value_type is an unsigned integer
19ca48d4dfSLouis Dionne //            type capable of accommodating 32-bit quantities.
20ca48d4dfSLouis Dionne 
21ca48d4dfSLouis Dionne // UNSUPPORTED: c++03
22ca48d4dfSLouis Dionne // REQUIRES: stdlib=libc++
23ca48d4dfSLouis Dionne 
24ca48d4dfSLouis Dionne #include <random>
25ca48d4dfSLouis Dionne #include <climits>
26*09e3a360SLouis Dionne #include <cstdint>
27ca48d4dfSLouis Dionne 
28ca48d4dfSLouis Dionne #include "test_macros.h"
29ca48d4dfSLouis Dionne 
30ca48d4dfSLouis Dionne void f() {
31ca48d4dfSLouis Dionne   std::seed_seq seq;
32ca48d4dfSLouis Dionne 
33ca48d4dfSLouis Dionne   // Not an integral type
34ca48d4dfSLouis Dionne   {
35ca48d4dfSLouis Dionne     double* p = nullptr;
36ca48d4dfSLouis Dionne     seq.generate(p, p); // expected-error-re@*:* {{static assertion failed{{.+}}: [rand.util.seedseq]/7 requires{{.+}}}}
37ca48d4dfSLouis Dionne     // expected-error@*:* 0+ {{invalid operands to}}
38ca48d4dfSLouis Dionne   }
39ca48d4dfSLouis Dionne 
40ca48d4dfSLouis Dionne   // Not an unsigned type
41ca48d4dfSLouis Dionne   {
42ca48d4dfSLouis Dionne     long long* p = nullptr;
43ca48d4dfSLouis Dionne     seq.generate(p, p); // expected-error-re@*:* {{static assertion failed{{.+}}: [rand.util.seedseq]/7 requires{{.+}}}}
44ca48d4dfSLouis Dionne   }
45ca48d4dfSLouis Dionne 
46ca48d4dfSLouis Dionne   // Not a 32-bit type
47ca48d4dfSLouis Dionne   {
48ca48d4dfSLouis Dionne #if UCHAR_MAX < UINT32_MAX
49ca48d4dfSLouis Dionne     unsigned char* p = nullptr;
50ca48d4dfSLouis Dionne     seq.generate(p, p); // expected-error-re@*:* {{static assertion failed{{.+}}: [rand.util.seedseq]/7 requires{{.+}}}}
51ca48d4dfSLouis Dionne #endif
52ca48d4dfSLouis Dionne   }
53ca48d4dfSLouis Dionne 
54ca48d4dfSLouis Dionne   // Everything satisfied
55ca48d4dfSLouis Dionne   {
56ca48d4dfSLouis Dionne     unsigned long* p = nullptr;
57ca48d4dfSLouis Dionne     seq.generate(p, p); // no diagnostic
58ca48d4dfSLouis Dionne   }
59ca48d4dfSLouis Dionne }
60