https://bugs.llvm.org/show_bug.cgi?id=51520

            Bug ID: 51520
           Summary: std::uniform_int_distribution<__int128_t>{INT64_MIN,
                    INT64_MAX} produces out-of-range values
           Product: libc++
           Version: 12.0
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: All Bugs
          Assignee: [email protected]
          Reporter: [email protected]
                CC: [email protected], [email protected]

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.

https://godbolt.org/z/z5WYsKEv6

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;
}

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to