On Thu, 11 Jul 2024 at 14:23, Alexandre Oliva <[email protected]> wrote:
>
>
> Passing an arbitrary error number to strerror* functions doesn't seem
> to be portable; 19_diagnostics/system_error/cons-1.cc is hitting
> runtime errors in the block that attempts to instantiate a
> std:;system_error for error number 95. The range of errno macros
> defined on this target doesn't reach 95.
The C standard is clear:
"Typically, the values for errnum come from errno, but strerror shall
map any value of type int to a message. "
And std::system_error doesn't limit the values that can be passed to
it either. So I'd prefer to keep testing with arbitrary int values,
because that *should* work.
>
> I'm changing the test to try to use a couple of select error codes,
> falling back to a lower error number if neither are present.
> Hopefully this doesn't change the nature of what is being tested for.
I think it does.
>
> Regstrapped on x86_64-linux-gnu, also tested with gcc-13 targeting
> aarch64. Ok to install?
>
>
> for libstdc++-v3/ChangeLog
>
> * testsuite/19_diagnostics/system_error/cons-1.cc: Use lower
> error numbers, preferring some macro-defined ones.
> ---
> .../19_diagnostics/system_error/cons-1.cc | 14 ++++++++++++--
> 1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/libstdc++-v3/testsuite/19_diagnostics/system_error/cons-1.cc
> b/libstdc++-v3/testsuite/19_diagnostics/system_error/cons-1.cc
> index 16aa960b2ee28..e227c67542411 100644
> --- a/libstdc++-v3/testsuite/19_diagnostics/system_error/cons-1.cc
> +++ b/libstdc++-v3/testsuite/19_diagnostics/system_error/cons-1.cc
> @@ -37,8 +37,18 @@ int main()
>
> // 2
> {
> - std::system_error err2(95, std::system_category(), s);
> - VERIFY( err2.code() == std::error_code(95, std::system_category()) );
> + int eno;
> +#if defined EOPNOTSUPP
> + eno = EOPNOTSUPP;
> +#elif defined ENOSYS
> + eno = ENOSYS;
> +#else
> + // strerror (used to combine with the given message) may fail if
> + // the error number is out of range for the system.
> + eno = 42;
> +#endif
> + std::system_error err2(eno, std::system_category(), s);
> + VERIFY( err2.code() == std::error_code(eno, std::system_category()) );
> VERIFY( std::string((err2.what(), s)).find(s) != std::string::npos );
> }
>
>
> --
> Alexandre Oliva, happy hacker https://FSFLA.org/blogs/lxo/
> Free Software Activist GNU Toolchain Engineer
> More tolerance and less prejudice are key for inclusion and diversity
> Excluding neuro-others for not behaving ""normal"" is *not* inclusive
>