From a2c2eec183acf25c9b214fa0827718e4d2fdfc93 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Tue, 15 Dec 2020 20:28:11 +0000 Subject: [PATCH] libstdc++: Test errno macros directly, not via autoconf [PR 93151] This fixes a bug caused by a mismatch between the macros defined by when GCC is built and the macros defined by when users include . If the user code is compiled with _XOPEN_SOURCE defined to 500 or 600, Darwin suppresses the ENOTRECOVERABLE and EOWNERDEAD macros, which are not defined by SUSv3 (aka POSIX.1-2001). Since POSIX requires the errno macros to be macros (and not variables or enumerators) we can just test for them directly using the preprocessor. That means that will match what is actuallydefined when it's included, not what was defined when GCC was built. With that change there is no need for the GLIBCXX_CHECK_SYSTEM_ERROR configure checks and they can be removed. libstdc++-v3/ChangeLog: PR libstdc++/93151 * acinclude.m4 (GLIBCXX_CHECK_SYSTEM_ERROR): Remove. * configure.ac: Regenerate. * config/os/generic/error_constants.h: Test POSIX errno macros directly, instead of corresponding _GLIBCXX_HAVE_EXXX macros. * testsuite/19_diagnostics/headers/system_error/errc_std_c++0x.cc: Likewise. * testsuite/19_diagnostics/headers/system_error/93151.cc: New test. --- libstdc++-v3/acinclude.m4 | 29 ----------------- .../config/os/generic/error_constants.h | 28 ++++++++-------- libstdc++-v3/configure.ac | 1 - .../headers/system_error/93151.cc | 23 +++++++++++++ .../headers/system_error/errc_std_c++0x.cc | 32 +++++++++---------- 5 files changed, 53 insertions(+), 60 deletions(-) create mode 100644 libstdc++-v3/testsuite/19_diagnostics/headers/system_error/93151.cc diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index df8be3bf805..e4175ea3e64 100644 --- a/libstdc++-v3/acinclude.m4 +++ b/libstdc++-v3/acinclude.m4 @@ -2372,35 +2372,6 @@ AC_DEFUN([GLIBCXX_CHECK_MATH11_PROTO], [ AC_LANG_RESTORE ]) -dnl -dnl Check whether macros, etc are present for -dnl -AC_DEFUN([GLIBCXX_CHECK_SYSTEM_ERROR], [ - -m4_pushdef([n_syserr], [1])dnl -m4_foreach([syserr], [EOWNERDEAD, ENOTRECOVERABLE, ENOLINK, EPROTO, ENODATA, - ENOSR, ENOSTR, ETIME, EBADMSG, ECANCELED, - EOVERFLOW, ENOTSUP, EIDRM, ETXTBSY, - ECHILD, ENOSPC, EPERM, - ETIMEDOUT, EWOULDBLOCK], -[m4_pushdef([SYSERR], m4_toupper(syserr))dnl -AC_MSG_CHECKING([for syserr]) -AC_CACHE_VAL([glibcxx_cv_system_error[]n_syserr], [ -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], - [int i = syserr;])], - [glibcxx_cv_system_error[]n_syserr=yes], - [glibcxx_cv_system_error[]n_syserr=no]) -]) -AC_MSG_RESULT([$glibcxx_cv_system_error[]n_syserr]) -if test x"$glibcxx_cv_system_error[]n_syserr" = x"yes"; then - AC_DEFINE([HAVE_]SYSERR, 1, [Define if ]syserr[ exists.]) -fi -m4_define([n_syserr], m4_incr(n_syserr))dnl -m4_popdef([SYSERR])dnl -]) -m4_popdef([n_syserr])dnl -]) - dnl dnl Check for what type of C headers to use. dnl diff --git a/libstdc++-v3/config/os/generic/error_constants.h b/libstdc++-v3/config/os/generic/error_constants.h index b5b0ea6b9ad..0d34f7179b6 100644 --- a/libstdc++-v3/config/os/generic/error_constants.h +++ b/libstdc++-v3/config/os/generic/error_constants.h @@ -48,7 +48,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION bad_address = EFAULT, bad_file_descriptor = EBADF, -#ifdef _GLIBCXX_HAVE_EBADMSG +#ifdef EBADMSG bad_message = EBADMSG, #endif @@ -68,7 +68,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION function_not_supported = ENOSYS, host_unreachable = EHOSTUNREACH, -#ifdef _GLIBCXX_HAVE_EIDRM +#ifdef EIDRM identifier_removed = EIDRM, #endif @@ -86,13 +86,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION no_buffer_space = ENOBUFS, no_child_process = ECHILD, -#ifdef _GLIBCXX_HAVE_ENOLINK +#ifdef ENOLINK no_link = ENOLINK, #endif no_lock_available = ENOLCK, -#ifdef _GLIBCXX_HAVE_ENODATA +#ifdef ENODATA no_message_available = ENODATA, #endif @@ -100,7 +100,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION no_protocol_option = ENOPROTOOPT, no_space_on_device = ENOSPC, -#ifdef _GLIBCXX_HAVE_ENOSR +#ifdef ENOSR no_stream_resources = ENOSR, #endif @@ -111,18 +111,18 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION not_a_directory = ENOTDIR, not_a_socket = ENOTSOCK, -#ifdef _GLIBCXX_HAVE_ENOSTR +#ifdef ENOSTR not_a_stream = ENOSTR, #endif not_connected = ENOTCONN, not_enough_memory = ENOMEM, -#ifdef _GLIBCXX_HAVE_ENOTSUP +#ifdef ENOTSUP not_supported = ENOTSUP, #endif -#ifdef _GLIBCXX_HAVE_ECANCELED +#ifdef ECANCELED operation_canceled = ECANCELED, #endif @@ -131,13 +131,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operation_not_supported = EOPNOTSUPP, operation_would_block = EWOULDBLOCK, -#ifdef _GLIBCXX_HAVE_EOWNERDEAD +#ifdef EOWNERDEAD owner_dead = EOWNERDEAD, #endif permission_denied = EACCES, -#ifdef _GLIBCXX_HAVE_EPROTO +#ifdef EPROTO protocol_error = EPROTO, #endif @@ -147,15 +147,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION resource_unavailable_try_again = EAGAIN, result_out_of_range = ERANGE, -#ifdef _GLIBCXX_HAVE_ENOTRECOVERABLE +#ifdef ENOTRECOVERABLE state_not_recoverable = ENOTRECOVERABLE, #endif -#ifdef _GLIBCXX_HAVE_ETIME +#ifdef ETIME stream_timeout = ETIME, #endif -#ifdef _GLIBCXX_HAVE_ETXTBSY +#ifdef ETXTBSY text_file_busy = ETXTBSY, #endif @@ -165,7 +165,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION too_many_links = EMLINK, too_many_symbolic_link_levels = ELOOP, -#ifdef _GLIBCXX_HAVE_EOVERFLOW +#ifdef EOVERFLOW value_too_large = EOVERFLOW, #endif diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac index 771814110a1..9138ba22588 100644 --- a/libstdc++-v3/configure.ac +++ b/libstdc++-v3/configure.ac @@ -183,7 +183,6 @@ GLIBCXX_ENABLE_VTABLE_VERIFY([no]) # Checks for operating systems support that doesn't require linking. GLIBCXX_CHECK_STDIO_PROTO GLIBCXX_CHECK_MATH11_PROTO -GLIBCXX_CHECK_SYSTEM_ERROR GLIBCXX_CHECK_UCHAR_H # For the streamoff typedef. diff --git a/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/93151.cc b/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/93151.cc new file mode 100644 index 00000000000..2d8efc76deb --- /dev/null +++ b/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/93151.cc @@ -0,0 +1,23 @@ +// { dg-do compile { target c++11 } } + +// Copyright (C) 2020 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// PR libstdc++/93151 +#undef _XOPEN_SOURCE +#define _XOPEN_SOURCE 600 +#include diff --git a/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/errc_std_c++0x.cc b/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/errc_std_c++0x.cc index 0f006ae47d9..72c4b53124d 100644 --- a/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/errc_std_c++0x.cc +++ b/libstdc++-v3/testsuite/19_diagnostics/headers/system_error/errc_std_c++0x.cc @@ -34,7 +34,7 @@ void test01() TEST_ERRC(bad_address); TEST_ERRC(bad_file_descriptor); -#ifdef _GLIBCXX_HAVE_EBADMSG +#ifdef EBADMSG TEST_ERRC(bad_message); #endif @@ -54,7 +54,7 @@ void test01() TEST_ERRC(function_not_supported); TEST_ERRC(host_unreachable); -#ifdef _GLIBCXX_HAVE_EIDRM +#ifdef EIDRM TEST_ERRC(identifier_removed); #endif @@ -72,23 +72,23 @@ void test01() TEST_ERRC(no_buffer_space); TEST_ERRC(no_child_process); -#ifdef _GLIBCXX_HAVE_ENOLINK +#ifdef ENOLINK TEST_ERRC(no_link); #endif TEST_ERRC(no_lock_available); -#ifdef _GLIBCXX_HAVE_ENODATA +#ifdef ENODATA TEST_ERRC(no_message_available); #endif -#ifdef _GLIBCXX_HAVE_ENOMSG +#ifdef ENOMSG TEST_ERRC(no_message); #endif TEST_ERRC(no_protocol_option); TEST_ERRC(no_space_on_device); -#ifdef _GLIBCXX_HAVE_ENOSR +#ifdef ENOSR TEST_ERRC(no_stream_resources); #endif @@ -99,15 +99,15 @@ void test01() TEST_ERRC(not_a_directory); TEST_ERRC(not_a_socket); -#ifdef _GLIBCXX_HAVE_ENOSTR +#ifdef ENOSTR TEST_ERRC(not_a_stream); #endif - TEST_ERRC(not_connected); + TEST_ERRC(not_connected); TEST_ERRC(not_enough_memory); TEST_ERRC(not_supported); -#ifdef _GLIBCXX_HAVE_ECANCELED +#ifdef ECANCELED TEST_ERRC(operation_canceled); #endif @@ -116,31 +116,31 @@ void test01() TEST_ERRC(operation_not_supported); TEST_ERRC(operation_would_block); -#ifdef _GLIBCXX_HAVE_EOWNERDEAD +#ifdef EOWNERDEAD TEST_ERRC(owner_dead); #endif TEST_ERRC(permission_denied); -#ifdef _GLIBCXX_HAVE_EPROTO +#ifdef EPROTO TEST_ERRC(protocol_error); #endif TEST_ERRC(protocol_not_supported); TEST_ERRC(read_only_file_system); TEST_ERRC(resource_deadlock_would_occur); - TEST_ERRC(resource_unavailable_try_again); + TEST_ERRC(resource_unavailable_try_again); TEST_ERRC(result_out_of_range); -#ifdef _GLIBCXX_HAVE_ENOTRECOVERABLE +#ifdef ENOTRECOVERABLE TEST_ERRC(state_not_recoverable); #endif -#ifdef _GLIBCXX_HAVE_ETIME +#ifdef ETIME TEST_ERRC(stream_timeout); #endif -#ifdef _GLIBCXX_HAVE_ETXTBSY +#ifdef ETXTBSY TEST_ERRC(text_file_busy); #endif @@ -150,7 +150,7 @@ void test01() TEST_ERRC(too_many_links); TEST_ERRC(too_many_symbolic_link_levels); -#ifdef _GLIBCXX_HAVE_EOVERFLOW +#ifdef EOVERFLOW TEST_ERRC(value_too_large); #endif -- 2.30.2