diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2023-06-30 14:37:59 +0100 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2023-06-30 15:09:17 +0100 |
commit | d6a6a4ea086d6af97bd7fbd482f51df41c265b79 (patch) | |
tree | 8d9e1c491c529bccc7a813d48c5930ec858cda7c | |
parent | ca15abc0ff7cb5e821a8c1d69e9b37416d5390c5 (diff) | |
download | gcc-d6a6a4ea086d6af97bd7fbd482f51df41c265b79.zip gcc-d6a6a4ea086d6af97bd7fbd482f51df41c265b79.tar.gz gcc-d6a6a4ea086d6af97bd7fbd482f51df41c265b79.tar.bz2 |
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.
-rw-r--r-- | libstdc++-v3/src/c++11/random.cc | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/libstdc++-v3/src/c++11/random.cc b/libstdc++-v3/src/c++11/random.cc index 6ecdc71..cece6ed 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 } |