From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id 5A9263882005; Fri, 30 Jun 2023 14:09:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5A9263882005 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1688134163; bh=sbtxmkcw2cVEC980r4GpxlSq8Y9yEJEXZIOdqvjCWD4=; h=From:To:Subject:Date:From; b=QpHOYE83z6pcEOIRI/6pgkOLn74+B6MVs0czogwQ6K196nytnvld6j6pR7T5HyzBc 4SF7P0unj1GYJP0haekBgfWod106tMoZOyFrwRkUiitPd9/hwexKUkYWiDP0RpL3qJ tnOw4xrrKS341S2NnDirqkU1oxkwPGD0uv4ctipw= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jonathan Wakely To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r14-2217] libstdc++: Make std::random_device throw more std::system_error [PR105081] X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/master X-Git-Oldrev: ca15abc0ff7cb5e821a8c1d69e9b37416d5390c5 X-Git-Newrev: d6a6a4ea086d6af97bd7fbd482f51df41c265b79 Message-Id: <20230630140923.5A9263882005@sourceware.org> Date: Fri, 30 Jun 2023 14:09:23 +0000 (GMT) List-Id: https://gcc.gnu.org/g:d6a6a4ea086d6af97bd7fbd482f51df41c265b79 commit r14-2217-gd6a6a4ea086d6af97bd7fbd482f51df41c265b79 Author: Jonathan Wakely Date: Fri Jun 30 14:37:59 2023 +0100 libstdc++: Make std::random_device throw more std::system_error [PR105081] In r14-289-gf9412cedd6c0e7 I made the std::random_device constructor throw std::system_error for unrecognized tokens. But it still throws std::runtime_error for a token such as "rdseed" that is recognized but not supported at runtime by the CPU the program is running on. With this change we throw std::system_error for those cases too. This fixes the following failures on Intel CPUs withour rdseed support: FAIL: 26_numerics/random/random_device/94087.cc execution test FAIL: 26_numerics/random/random_device/cons/token.cc execution test FAIL: 26_numerics/random/random_device/entropy.cc execution test libstdc++-v3/ChangeLog: PR libstdc++/105081 * src/c++11/random.cc (random_device::_M_init): Throw std::system_error when the requested device is a valid token but not available at runtime. Diff: --- libstdc++-v3/src/c++11/random.cc | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/libstdc++-v3/src/c++11/random.cc b/libstdc++-v3/src/c++11/random.cc index 6ecdc7169ab..cece6edbfc7 100644 --- a/libstdc++-v3/src/c++11/random.cc +++ b/libstdc++-v3/src/c++11/random.cc @@ -373,6 +373,15 @@ namespace std _GLIBCXX_VISIBILITY(default) "(const std::string&):" " unsupported token")); +#if defined ENOSYS + const int unsupported = ENOSYS; +#elif defined ENOTSUP + const int unsupported = ENOTSUP; +#else + const int unsupported = 0; +#endif + int err = 0; + #ifdef _GLIBCXX_USE_CRT_RAND_S if (which & rand_s) { @@ -407,6 +416,7 @@ namespace std _GLIBCXX_VISIBILITY(default) return; } } + err = unsupported; } #endif // USE_RDSEED @@ -427,6 +437,7 @@ namespace std _GLIBCXX_VISIBILITY(default) return; } } + err = unsupported; } #endif // USE_RDRAND @@ -438,6 +449,7 @@ namespace std _GLIBCXX_VISIBILITY(default) _M_func = &__ppc_darn; return; } + err = unsupported; } #endif // USE_DARN @@ -458,6 +470,7 @@ namespace std _GLIBCXX_VISIBILITY(default) _M_func = &__libc_getentropy; return; } + err = unsupported; } #endif // _GLIBCXX_HAVE_GETENTROPY @@ -477,6 +490,7 @@ namespace std _GLIBCXX_VISIBILITY(default) if (_M_file) return; #endif // USE_POSIX_FILE_IO + err = errno; } #endif // _GLIBCXX_USE_DEV_RANDOM @@ -493,9 +507,12 @@ namespace std _GLIBCXX_VISIBILITY(default) } #endif - std::__throw_runtime_error( - __N("random_device::random_device(const std::string&):" - " device not available")); + auto msg = __N("random_device::random_device(const std::string&):" + " device not available"); + if (err) + std::__throw_syserr(err, msg); + else + std::__throw_runtime_error(msg); #endif // USE_MT19937 }