Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

std::uniform_int_distribution<__int128_t>{INT64_MIN, INT64_MAX} produces out-of-range values #50862

llvmbot opened this issue Aug 18, 2021 · 1 comment
bugzilla libc++


Copy link

@llvmbot llvmbot commented Aug 18, 2021

Bugzilla Link 51520
Version 12.0
OS Linux
Reporter LLVM Bugzilla Contributor
CC @mclow

Extended Description

The specific std::uniform_int_distribution<__int128_t>{INT64_MIN, INT64_MAX} produces values that are not in range. Changing any of the parameters -- e.g. using std::int64_t as type or making either of the limits smaller or larger -- causes the problem to go away. The incorrect values are completely out-of-range, not marginal off-by-one errors.

I have created the following test program and could reproduce the issue with every version of libc++ and set of compiler options I've tried; the problem never occurs with -stdlib=libstdc++ so it seems to me to be a library rather than a compiler issue.

This is a minimal version (with no output) of the demo linked above to reproduce the problem:

#include <cstdint>
#include <cstdlib>
#include <random>

int main()
    auto engine = std::default_random_engine{};
    auto distro = std::uniform_int_distribution<__int128_t>{INT64_MIN, INT64_MAX};
    for (auto i = 0; i < 1000; ++i) {
        const auto n = distro(engine);
        if ((n < distro.min()) || (n > distro.max())) {
            return EXIT_FAILURE;
    return EXIT_SUCCESS;
@llvmbot llvmbot transferred this issue from llvm/llvm-bugzilla-archive Dec 11, 2021
Copy link

@ldionne ldionne commented Dec 13, 2021

Fixed by b254c2e.

@ldionne ldionne closed this as completed Dec 13, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
bugzilla libc++
None yet

No branches or pull requests

2 participants