C++20 adds a <version> header, which should define all the library feature test macros, as well as implementation-specific macros like _GLIBCXX_RELEASE and __GLIBCXX__.
We should decide whether to implement <version> by simply including <bits/c++config.h> and then adding the feature test macros, or if we should keep it minimal and *only* define _GLIBCXX_RELEASE and __GLIBCXX__ and the feature tests (and then have <bits/c++config.h> include <version>?) I think I prefer to make <version> just include <bits/c++config.h>. I think we should define the feature-test macros in both <version> and the relevant header (e.g. __cpp_string_view in <string_view>). We could make everything include <version> and then every header would define every feature test macro, but I don't think that's good for portability. My preference is implemented by the attached patch. While on the subject, should we just delete some of this autoconf-junk from our c++config.h headers? /* Name of package */ /* #undef _GLIBCXX_PACKAGE */ /* Define to the address where bug reports for this package should be sent. */ #define _GLIBCXX_PACKAGE_BUGREPORT "" /* Define to the full name of this package. */ #define _GLIBCXX_PACKAGE_NAME "package-unused" /* Define to the full name and version of this package. */ #define _GLIBCXX_PACKAGE_STRING "package-unused version-unused" /* Define to the one symbol short name of this package. */ #define _GLIBCXX_PACKAGE_TARNAME "libstdc++" /* Define to the home page for this package. */ #define _GLIBCXX_PACKAGE_URL "" /* Define to the version of this package. */ #define _GLIBCXX_PACKAGE__GLIBCXX_VERSION "version-unused"
commit f432c0d29f9db3b0f40d34f52f32936a2d24fbb8 Author: Jonathan Wakely <jwak...@redhat.com> Date: Fri Jun 15 15:35:38 2018 +0100 P0754R2 <version> header * include/Makefile.am: Add new header. * include/Makefile.in: Regenerate. * include/bits/c++config: Change doxygen comment to suggest <version> instead of <iosfwd>. * include/std/version: New header. diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am index 77e6dc2f6be..f91907df325 100644 --- a/libstdc++-v3/include/Makefile.am +++ b/libstdc++-v3/include/Makefile.am @@ -80,7 +80,8 @@ std_headers = \ ${std_srcdir}/utility \ ${std_srcdir}/valarray \ ${std_srcdir}/variant \ - ${std_srcdir}/vector + ${std_srcdir}/vector \ + ${std_srcdir}/version bits_srcdir = ${glibcxx_srcdir}/include/bits bits_builddir = ./bits diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config index 838afc59dfb..a9243888e60 100644 --- a/libstdc++-v3/include/bits/c++config +++ b/libstdc++-v3/include/bits/c++config @@ -24,7 +24,7 @@ /** @file bits/c++config.h * This is an internal header file, included by other library headers. - * Do not attempt to use it directly. @headername{iosfwd} + * Do not attempt to use it directly. @headername{version} */ #ifndef _GLIBCXX_CXX_CONFIG_H diff --git a/libstdc++-v3/include/std/version b/libstdc++-v3/include/std/version new file mode 100644 index 00000000000..61d85b7b80f --- /dev/null +++ b/libstdc++-v3/include/std/version @@ -0,0 +1,131 @@ +// -*- C++ -*- Libstdc++ version details header. + +// Copyright (C) 2018 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. + +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. + +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// <http://www.gnu.org/licenses/>. + +/** @file version + * This is a Standard C++ Library file. You should @c \#include this file + * in your programs, rather than any of the @a *.h implementation files. + */ + +#ifndef _GLIBCXX_VERSION_INCLUDED +#define _GLIBCXX_VERSION_INCLUDED + +#pragma GCC system_header + +#include <bits/c++config.h> + +// c++03 +#define __cpp_lib_incomplete_container_elements 201505 + +#if !defined(__STRICT_ANSI__) +// gnu++03 +# define __cpp_lib_uncaught_exceptions 201411 +#endif + +#if __cplusplus >= 201103L +// c++11 +#define __cpp_lib_allocator_is_always_equal 201411 +#define __cpp_lib_allocator_traits_is_always_equal 201411 +#define __cpp_lib_is_null_pointer 201309 +#define __cpp_lib_result_of_sfinae 201210 +#define __cpp_lib_shared_ptr_arrays 201603 + +#if !defined(__STRICT_ANSI__) +// gnu++11 +# define __cpp_lib_enable_shared_from_this 201603 +# define __cpp_lib_is_swappable 201603 +# define __cpp_lib_void_t 201411 +#endif + +#if __cplusplus >= 201402L +// c++14 +#define __cpp_lib_chrono_udls 201304 +#define __cpp_lib_complex_udls 201309 +#define __cpp_lib_exchange_function 201304 +#define __cpp_lib_generic_associative_lookup 201304 +#define __cpp_lib_integer_sequence 201304 +#define __cpp_lib_integral_constant_callable 201304 +#define __cpp_lib_is_final 201402L +#define __cpp_lib_make_reverse_iterator 201402 +#define __cpp_lib_make_unique 201304 +#define __cpp_lib_quoted_string_io 201304 +#define __cpp_lib_robust_nonmodifying_seq_ops 201304 +#define __cpp_lib_shared_timed_mutex 201402 +#define __cpp_lib_string_udls 201304 +#define __cpp_lib_transformation_trait_aliases 201304 +#define __cpp_lib_transparent_operators 201510 +#define __cpp_lib_tuple_element_t 201402L +#define __cpp_lib_tuples_by_type 201304 + +#if __cplusplus >= 201703L +// c++17 +#define __cpp_lib_addressof_constexpr 201603 +#define __cpp_lib_apply 201603 +#define __cpp_lib_array_constexpr 201603 +#define __cpp_lib_as_const 201510 +#define __cpp_lib_atomic_is_always_lock_free 201603 +#define __cpp_lib_bool_constant 201505 +#define __cpp_lib_boyer_moore_searcher 201603 +#define __cpp_lib_byte 201603 +#define __cpp_lib_chrono 201611 +#define __cpp_lib_clamp 201603 +#define __cpp_lib_constexpr_char_traits 201611 +#define __cpp_lib_enable_shared_from_this 201603 +#define __cpp_lib_filesystem 201703 +#define __cpp_lib_gcd 201606 +#define __cpp_lib_gcd_lcm 201606 +#define __cpp_lib_has_unique_object_representations 201606 +#define __cpp_lib_hypot 201603 +#define __cpp_lib_invoke 201411 +#define __cpp_lib_is_aggregate 201703 +#define __cpp_lib_is_invocable 201703 +#define __cpp_lib_is_swappable 201603 +#define __cpp_lib_launder 201606 +#define __cpp_lib_lcm 201606 +#define __cpp_lib_logical_traits 201510 +#define __cpp_lib_make_from_tuple 201606 +#define __cpp_lib_map_insertion 201411 +#define __cpp_lib_map_try_emplace 201411 +#define __cpp_lib_math_special_functions 201603L +#define __cpp_lib_node_extract 201606 +#define __cpp_lib_nonmember_container_access 201411 +#define __cpp_lib_not_fn 201603 +#define __cpp_lib_optional 201603 +#define __cpp_lib_sample 201603 +#define __cpp_lib_scoped_lock 201703 +#define __cpp_lib_shared_mutex 201505 +#define __cpp_lib_shared_ptr_weak_type 201606 +#define __cpp_lib_string_view 201603 +#define __cpp_lib_type_trait_variable_templates 201510L +#define __cpp_lib_unordered_map_insertion 201411 +#define __cpp_lib_unordered_map_try_emplace 201411 +#define __cpp_lib_void_t 201411 + +#if __cplusplus > 201703L +// c++2a +#endif // C++2a +#endif // C++17 +#endif // C++14 +#endif // C++11 + +#endif // _GLIBCXX_VERSION_INCLUDED