gcc/libstdc++-v3/include/bits/version.def
Jonathan Wakely 89dff1488e libstdc++: Guard use of sized deallocation [PR114940]
Clang does not enable -fsized-deallocation by default, which means it
can't compile our <stacktrace> and <generator> headers.

Make the __cpp_lib_generator macro depend on the compiler-defined
__cpp_sized_deallocation macro, and change <stacktrace> to use unsized
deallocation when __cpp_sized_deallocation isn't defined.

libstdc++-v3/ChangeLog:

	PR libstdc++/114940
	* include/bits/version.def (generator): Depend on
	__cpp_sized_deallocation.
	* include/bits/version.h: Regenerate.
	* include/std/stacktrace (_GLIBCXX_SIZED_DELETE): New macro.
	(basic_stacktrace::_Impl::_M_deallocate): Use it.

(cherry picked from commit b2fdd508d7e63158e9d2a6dd04f901d02900def3)
2024-05-28 10:19:44 +01:00

1811 lines
26 KiB
C++

// Feature test macro definitions -*- C++ -*-
// Copyright (C) 2023-2024 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/>.
AutoGen Definitions version.tpl;
// The top level variable ftms is an array of feature test macros. Each entry
// consists of a structure like following:
// Schema:
// ftms = {
// name = FTM NAME;
// [stdname = FTM STANDARD MACRO NAME;]
// values = {
// v = VALUE FOR FTM IF MATCHING;
// [extra_cond = STRING;]
// [cxxmin = NUMBER;]
// [gnuxxmin = NUMBER;]
// [gthread = yes|no;]
// [hosted = yes|no;]
// [cxx11abi = yes|no;]
// }; ...
// };
// The elements in square brackets are optional. These are formulated into a
// logical expression like:
// ((strict && c++ >= cxxmin) || (!strict && c++ >= gnuxxmin))
// && (gthr <=> gthread)
// && (host <=> hosted)
// && (cxx11 <=> cxx11abi)
// && (extra_cond)
// Where gthr, cxx11 and host are _GLIBCXX_HAS_GTHREADS, _GLIBCXX_USE_CXX11_ABI
// and _GLIBCXX_HOSTED respectively. If any of these are omitted, their
// sub-expressions are equivalent to the identity. Specially, if gnuxxmin is
// omitted, it is taken to be the value of cxxmin, and so, only if both are
// omitted, the clause is omitted.
// stdname configures the name of the *standard* macro emitted, i.e. it
// replaces only the __cpp_lib_ macro in the emitted definition. Defaults to
// __cpp_lib_${name}
// N.B This list needs to be in topological sort order, as later entries in
// this list can and do use the earlier entries.
ftms = {
name = incomplete_container_elements;
values = {
v = 201505;
hosted = yes;
};
};
ftms = {
name = uncaught_exceptions;
values = {
v = 201411;
cxxmin = 17;
gnuxxmin = 03;
};
};
ftms = {
name = allocator_traits_is_always_equal;
values = {
v = 201411;
cxxmin = 11;
};
};
ftms = {
name = is_null_pointer;
values = {
v = 201309;
cxxmin = 11;
};
};
ftms = {
name = result_of_sfinae;
values = {
v = 201210;
cxxmin = 11;
};
};
ftms = {
name = shared_ptr_arrays;
values = {
v = 201707;
cxxmin = 20;
hosted = yes;
};
values = {
v = 201611;
cxxmin = 11;
hosted = yes;
};
};
ftms = {
name = is_swappable;
values = {
v = 201603;
cxxmin = 17;
gnuxxmin = 11;
};
};
ftms = {
name = void_t;
values = {
v = 201411;
cxxmin = 17;
gnuxxmin = 11;
};
};
ftms = {
name = enable_shared_from_this;
values = {
v = 201603;
cxxmin = 17;
gnuxxmin = 11;
hosted = yes;
};
};
ftms = {
name = math_spec_funcs;
stdname = "__STDCPP_MATH_SPEC_FUNCS__";
values = {
v = 201003;
cxxmin = 11;
};
};
ftms = {
name = coroutine;
values = {
v = 201902;
// It is very likely that earlier versions would work, but they are
// untested.
cxxmin = 14;
extra_cond = "__cpp_impl_coroutine";
};
};
ftms = {
name = exchange_function;
values = {
v = 201304;
cxxmin = 14;
};
};
ftms = {
name = integer_sequence;
values = {
v = 201304;
cxxmin = 14;
};
};
ftms = {
name = integral_constant_callable;
values = {
v = 201304;
cxxmin = 14;
};
};
ftms = {
name = is_final;
values = {
v = 201402;
cxxmin = 14;
};
};
ftms = {
name = make_reverse_iterator;
values = {
v = 201402;
cxxmin = 14;
};
};
ftms = {
name = null_iterators;
values = {
v = 201304;
cxxmin = 14;
};
};
ftms = {
name = transformation_trait_aliases;
values = {
v = 201304;
cxxmin = 14;
};
};
ftms = {
name = transparent_operators;
values = {
v = 201510;
cxxmin = 14;
};
};
ftms = {
name = tuple_element_t;
values = {
v = 201402;
cxxmin = 14;
};
};
ftms = {
name = tuples_by_type;
values = {
v = 201304;
cxxmin = 14;
};
};
ftms = {
name = robust_nonmodifying_seq_ops;
values = {
v = 201304;
cxxmin = 14;
};
};
ftms = {
name = to_chars;
values = {
v = 202306;
cxxmin = 26;
extra_cond = "_GLIBCXX_FLOAT_IS_IEEE_BINARY32 "
"&& _GLIBCXX_DOUBLE_IS_IEEE_BINARY64 "
"&& __SIZE_WIDTH__ >= 32";
};
values = {
v = 201611;
cxxmin = 14;
extra_cond = "_GLIBCXX_FLOAT_IS_IEEE_BINARY32 "
"&& _GLIBCXX_DOUBLE_IS_IEEE_BINARY64 "
"&& __SIZE_WIDTH__ >= 32";
};
};
ftms = {
name = chrono_udls;
values = {
v = 201304;
cxxmin = 14;
hosted = yes;
};
};
ftms = {
name = complex_udls;
values = {
v = 201309;
cxxmin = 14;
hosted = yes;
};
};
ftms = {
name = generic_associative_lookup;
values = {
v = 201304;
cxxmin = 14;
hosted = yes;
};
};
ftms = {
name = make_unique;
values = {
v = 201304;
cxxmin = 14;
hosted = yes;
};
};
ftms = {
name = quoted_string_io;
values = {
v = 201304;
cxxmin = 14;
hosted = yes;
};
};
ftms = {
name = shared_timed_mutex;
values = {
v = 201402;
cxxmin = 14;
hosted = yes;
gthread = yes;
};
};
ftms = {
name = string_udls;
values = {
v = 201304;
cxxmin = 14;
hosted = yes;
};
};
ftms = {
name = addressof_constexpr;
values = {
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 2296. std::addressof should be constexpr
v = 201603;
cxxmin = 17;
};
};
ftms = {
name = any;
values = {
v = 201606;
cxxmin = 17;
};
};
ftms = {
name = apply;
values = {
v = 201603;
cxxmin = 17;
};
};
ftms = {
name = as_const;
values = {
v = 201510;
cxxmin = 17;
};
};
ftms = {
name = atomic_is_always_lock_free;
values = {
v = 201603;
cxxmin = 17;
};
};
ftms = {
name = bool_constant;
values = {
v = 201505;
cxxmin = 17;
};
};
ftms = {
name = byte;
values = {
v = 201603;
cxxmin = 17;
};
};
ftms = {
name = has_unique_object_representations;
values = {
v = 201606;
cxxmin = 17;
extra_cond = "defined(_GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP)";
};
};
ftms = {
name = hardware_interference_size;
values = {
v = 201703;
cxxmin = 17;
extra_cond = "defined(__GCC_DESTRUCTIVE_SIZE)";
};
};
ftms = {
name = invoke;
values = {
v = 201411;
cxxmin = 17;
};
};
ftms = {
name = is_aggregate;
values = {
v = 201703;
cxxmin = 17;
extra_cond = "defined(_GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE)";
};
};
ftms = {
name = is_invocable;
values = {
v = 201703;
cxxmin = 17;
};
};
ftms = {
name = launder;
values = {
v = 201606;
cxxmin = 17;
extra_cond = "defined(_GLIBCXX_HAVE_BUILTIN_LAUNDER)";
};
};
ftms = {
name = logical_traits;
values = {
v = 201510;
cxxmin = 17;
};
};
ftms = {
name = make_from_tuple;
values = {
v = 201606;
cxxmin = 17;
};
};
ftms = {
name = not_fn;
values = {
v = 201603;
cxxmin = 17;
};
};
ftms = {
name = type_trait_variable_templates;
values = {
v = 201510;
cxxmin = 17;
};
};
ftms = {
name = variant;
values = {
v = 202106;
cxxmin = 20;
extra_cond = "__cpp_concepts >= 202002L && __cpp_constexpr >= 201811L";
};
values = {
v = 202102;
cxxmin = 17;
};
};
ftms = {
// Used in earlier draft of SD6.
name = lcm;
values = {
v = 201606;
cxxmin = 17;
};
};
ftms = {
// Used in earlier draft of SD6.
name = gcd;
values = {
v = 201606;
cxxmin = 17;
};
};
ftms = {
name = gcd_lcm;
values = {
v = 201606;
cxxmin = 17;
};
};
ftms = {
name = raw_memory_algorithms;
values = {
v = 201606;
cxxmin = 17;
};
};
ftms = {
name = array_constexpr;
values = {
v = 201811;
cxxmin = 20;
};
values = {
v = 201803;
cxxmin = 17;
};
};
ftms = {
name = nonmember_container_access;
values = {
v = 201411;
cxxmin = 17;
};
};
ftms = {
name = clamp;
values = {
v = 201603;
cxxmin = 17;
};
};
ftms = {
name = sample;
values = {
v = 201603;
cxxmin = 17;
};
};
ftms = {
name = boyer_moore_searcher;
values = {
v = 201603;
cxxmin = 17;
hosted = yes;
};
};
ftms = {
name = chrono;
values = {
v = 201907;
cxxmin = 20;
hosted = yes;
};
values = {
v = 201611;
cxxmin = 17;
hosted = yes;
};
};
ftms = {
name = execution;
values = {
v = 201902; // FIXME: should be 201603L
cxxmin = 17;
hosted = yes;
};
};
ftms = {
name = filesystem;
values = {
v = 201703;
cxxmin = 17;
hosted = yes;
};
};
ftms = {
name = hypot;
values = {
v = 201603;
cxxmin = 17;
hosted = yes;
};
};
ftms = {
name = map_try_emplace;
values = {
v = 201411;
cxxmin = 17;
hosted = yes;
};
};
ftms = {
name = math_special_functions;
values = {
v = 201603;
cxxmin = 17;
hosted = yes;
};
};
ftms = {
name = memory_resource;
values = {
v = 201603;
cxxmin = 17;
hosted = yes;
gthread = yes;
};
values = {
v = 1;
/* For when there's no gthread. */
cxxmin = 17;
hosted = yes;
gthread = no;
};
};
ftms = {
name = node_extract;
values = {
v = 201606;
cxxmin = 17;
hosted = yes;
};
};
ftms = {
name = parallel_algorithm;
values = {
v = 201603;
cxxmin = 17;
hosted = yes;
};
};
ftms = {
name = scoped_lock;
values = {
v = 201703;
cxxmin = 17;
hosted = yes;
gthread = yes;
};
};
ftms = {
name = shared_mutex;
values = {
v = 201505;
cxxmin = 17;
hosted = yes;
gthread = yes;
};
};
ftms = {
name = shared_ptr_weak_type;
values = {
v = 201606;
cxxmin = 17;
hosted = yes;
};
};
ftms = {
name = string_view;
values = {
v = 201803;
cxxmin = 17;
hosted = yes;
};
};
ftms = {
name = unordered_map_try_emplace;
values = {
v = 201411;
cxxmin = 17;
hosted = yes;
};
};
ftms = {
name = assume_aligned;
values = {
v = 201811;
cxxmin = 20;
};
};
ftms = {
name = atomic_flag_test;
values = {
v = 201907;
cxxmin = 20;
};
};
ftms = {
name = atomic_float;
values = {
v = 201711;
cxxmin = 20;
};
};
ftms = {
name = atomic_lock_free_type_aliases;
values = {
v = 201907;
cxxmin = 20;
extra_cond = "(__GCC_ATOMIC_INT_LOCK_FREE | __GCC_ATOMIC_LONG_LOCK_FREE | __GCC_ATOMIC_CHAR_LOCK_FREE) & 2";
};
};
ftms = {
name = atomic_ref;
values = {
v = 201806;
cxxmin = 20;
};
};
ftms = {
name = atomic_value_initialization;
values = {
v = 201911;
cxxmin = 20;
};
};
ftms = {
name = bind_front;
values = {
v = 201907;
cxxmin = 20;
};
};
ftms = {
name = bind_back;
values = {
v = 202202;
cxxmin = 23;
extra_cond = "__cpp_explicit_this_parameter";
};
};
ftms = {
name = starts_ends_with;
values = {
v = 201711;
cxxmin = 20;
};
};
ftms = {
name = bit_cast;
values = {
v = 201806;
cxxmin = 20;
extra_cond = "__has_builtin(__builtin_bit_cast)";
};
};
ftms = {
name = bitops;
values = {
v = 201907;
cxxmin = 20;
};
};
ftms = {
name = bounded_array_traits;
values = {
v = 201902;
cxxmin = 20;
};
};
ftms = {
name = concepts;
values = {
v = 202002;
cxxmin = 20;
extra_cond = "__cpp_concepts >= 201907L";
};
};
// Moved down here (after concepts) by topological sort.
ftms = {
name = optional;
values = {
v = 202110;
cxxmin = 23;
extra_cond = "__glibcxx_concepts";
};
values = {
v = 202106;
cxxmin = 20;
};
values = {
v = 201606;
cxxmin = 17;
};
};
ftms = {
name = destroying_delete;
values = {
v = 201806;
cxxmin = 20;
extra_cond = "__cpp_impl_destroying_delete";
};
};
ftms = {
name = constexpr_string_view;
values = {
v = 201811;
cxxmin = 20;
};
};
ftms = {
name = endian;
values = {
v = 201907;
cxxmin = 20;
};
};
ftms = {
name = int_pow2;
values = {
v = 202002;
cxxmin = 20;
};
};
ftms = {
name = integer_comparison_functions;
values = {
v = 202002;
cxxmin = 20;
};
};
ftms = {
name = is_constant_evaluated;
values = {
v = 201811;
cxxmin = 20;
extra_cond = "defined(_GLIBCXX_HAVE_IS_CONSTANT_EVALUATED)";
};
};
// Moved down here (after is_constant_evaluated) by topological sort.
ftms = {
name = constexpr_char_traits;
values = {
// Unofficial macro indicating P1032R1 support in C++20
v = 201811;
cxxmin = 20;
extra_cond = "defined(__glibcxx_is_constant_evaluated)";
};
values = {
// Unofficial macro indicating P0426R1 support in C++17
v = 201611;
cxxmin = 17;
extra_cond = "_GLIBCXX_HAVE_IS_CONSTANT_EVALUATED";
};
};
ftms = {
name = is_layout_compatible;
values = {
v = 201907;
cxxmin = 20;
extra_cond = "__has_builtin(__is_layout_compatible) "
"&& __has_builtin(__builtin_is_corresponding_member)";
};
};
ftms = {
name = is_nothrow_convertible;
values = {
v = 201806;
cxxmin = 20;
};
};
ftms = {
name = is_pointer_interconvertible;
values = {
v = 201907;
cxxmin = 20;
extra_cond =
"__has_builtin(__is_pointer_interconvertible_base_of) "
"&& __has_builtin(__builtin_is_pointer_interconvertible_with_class)";
};
};
ftms = {
name = math_constants;
values = {
v = 201907;
cxxmin = 20;
};
};
ftms = {
name = make_obj_using_allocator;
values = {
// Not specified by C++20, used internally
v = 201811;
cxxmin = 20;
extra_cond = "__cpp_concepts";
};
};
ftms = {
name = remove_cvref;
values = {
v = 201711;
cxxmin = 20;
};
};
ftms = {
name = source_location;
values = {
v = 201907;
cxxmin = 20;
extra_cond = "__has_builtin(__builtin_source_location)";
};
};
ftms = {
name = span;
values = {
v = 202311;
cxxmin = 26;
extra_cond = "__glibcxx_concepts";
};
values = {
v = 202002;
cxxmin = 20;
extra_cond = "__glibcxx_concepts";
};
};
ftms = {
name = ssize;
values = {
v = 201902;
cxxmin = 20;
};
};
ftms = {
name = three_way_comparison;
values = {
v = 201907;
cxxmin = 20;
extra_cond = "__cpp_impl_three_way_comparison >= 201907L "
"&& __glibcxx_concepts";
};
};
ftms = {
name = to_address;
values = {
v = 201711;
cxxmin = 20;
};
};
ftms = {
name = to_array;
values = {
v = 201907;
cxxmin = 20;
extra_cond = "__cpp_generic_lambdas >= 201707L";
};
};
ftms = {
name = type_identity;
values = {
v = 201806;
cxxmin = 20;
};
};
ftms = {
name = unwrap_ref;
values = {
v = 201811;
cxxmin = 20;
};
};
ftms = {
name = constexpr_iterator;
values = {
v = 201811;
cxxmin = 20;
};
};
ftms = {
name = interpolate;
values = {
v = 201902;
cxxmin = 20;
};
};
ftms = {
name = constexpr_utility;
values = {
v = 201811;
cxxmin = 20;
};
};
ftms = {
name = shift;
values = {
v = 201806;
cxxmin = 20;
};
};
ftms = {
name = ranges;
values = {
v = 202211;
cxxmin = 23;
extra_cond = "__glibcxx_concepts";
};
values = {
v = 202110;
cxxmin = 20;
extra_cond = "__glibcxx_concepts";
};
};
ftms = {
name = constexpr_numeric;
values = {
v = 201911;
cxxmin = 20;
};
};
ftms = {
name = constexpr_functional;
values = {
v = 201907;
cxxmin = 20;
};
};
ftms = {
name = constexpr_algorithms;
values = {
v = 201806;
cxxmin = 20;
};
};
ftms = {
name = constexpr_tuple;
values = {
v = 201811;
cxxmin = 20;
};
};
ftms = {
name = constexpr_memory;
values = {
v = 202202;
cxxmin = 23;
extra_cond = "__cpp_constexpr_dynamic_alloc";
};
values = {
v = 201811;
cxxmin = 20;
};
};
ftms = {
name = atomic_shared_ptr;
values = {
v = 201711;
cxxmin = 20;
hosted = yes;
};
};
ftms = {
name = atomic_wait;
// atomic_wait is available if either futexes or gthread are.
values = {
v = 201907;
cxxmin = 20;
hosted = yes;
gthread = yes;
};
values = {
v = 201907;
cxxmin = 20;
hosted = yes;
gthread = no;
extra_cond = "defined(_GLIBCXX_HAVE_LINUX_FUTEX)";
};
};
ftms = {
name = barrier;
values = {
v = 201907;
cxxmin = 20;
// This condition carries in the hosted&&(futex||gthread) logic from above.
extra_cond = "__cpp_aligned_new && __glibcxx_atomic_wait";
};
};
ftms = {
// 201907 Text Formatting, Integration of chrono, printf corner cases.
// 202106 std::format improvements.
// 202110 Fixing locale handling in chrono formatters, generator-like types.
// 202207 Encodings in localized formatting of chrono, basic-format-string.
// 202207 P2286R8 Formatting Ranges
// 202207 P2585R1 Improving default container formatting
// TODO: #define __cpp_lib_format_ranges 202207L
name = format;
values = {
v = 202110;
cxxmin = 20;
hosted = yes;
};
};
ftms = {
name = format_uchar;
values = {
v = 202311;
cxxmin = 20;
hosted = yes;
};
};
// FIXME: #define __glibcxx_execution 201902L
ftms = {
name = constexpr_complex;
values = {
v = 201711;
cxxmin = 20;
hosted = yes;
};
};
ftms = {
name = constexpr_dynamic_alloc;
values = {
v = 201907;
cxxmin = 20;
hosted = yes;
};
};
ftms = {
name = constexpr_string;
values = {
v = 201907;
cxxmin = 20;
hosted = yes;
cxx11abi = yes;
extra_cond = "defined(__glibcxx_is_constant_evaluated)";
};
values = {
v = 201811;
cxxmin = 20;
hosted = yes;
cxx11abi = no;
extra_cond = "defined(__glibcxx_is_constant_evaluated)";
};
values = {
v = 201611;
cxxmin = 17;
hosted = yes;
extra_cond = "_GLIBCXX_HAVE_IS_CONSTANT_EVALUATED";
};
};
ftms = {
name = constexpr_vector;
values = {
v = 201907;
cxxmin = 20;
hosted = yes;
};
};
ftms = {
name = erase_if;
values = {
v = 202002;
cxxmin = 20;
hosted = yes;
};
};
ftms = {
name = generic_unordered_lookup;
values = {
v = 201811;
cxxmin = 20;
hosted = yes;
};
};
ftms = {
name = jthread;
values = {
v = 201911;
gthread = yes;
hosted = yes;
cxxmin = 20;
};
};
ftms = {
name = latch;
values = {
v = 201907;
cxxmin = 20;
extra_cond = "__glibcxx_atomic_wait";
};
};
ftms = {
name = list_remove_return_type;
values = {
v = 201806;
cxxmin = 20;
hosted = yes;
};
};
ftms = {
name = polymorphic_allocator;
values = {
v = 201902;
cxxmin = 20;
hosted = yes;
};
};
ftms = {
name = move_iterator_concept;
values = {
v = 202207;
// This is P2520R0, a C++23 change, but we treat it as a DR against C++20.
cxxmin = 20;
extra_cond = "__glibcxx_concepts";
};
};
ftms = {
name = semaphore;
values = {
v = 201907;
cxxmin = 20;
hosted = yes;
extra_cond = "__glibcxx_atomic_wait || _GLIBCXX_HAVE_POSIX_SEMAPHORE";
};
};
ftms = {
name = smart_ptr_for_overwrite;
values = {
v = 202002;
cxxmin = 20;
hosted = yes;
};
};
ftms = {
name = syncbuf;
values = {
v = 201803;
cxxmin = 20;
hosted = yes;
cxx11abi = yes;
};
};
ftms = {
name = byteswap;
values = {
v = 202110;
cxxmin = 23;
};
};
ftms = {
name = constexpr_charconv;
values = {
v = 202207;
cxxmin = 23;
};
};
ftms = {
name = constexpr_typeinfo;
values = {
v = 202106;
cxxmin = 23;
};
};
ftms = {
name = expected;
values = {
v = 202211;
cxxmin = 23;
extra_cond = "__cpp_concepts >= 202002L";
};
};
ftms = {
name = freestanding_algorithm;
values = {
v = 202311;
// This is a C++26 feature, but we support it in C++23.
cxxmin = 23;
};
};
ftms = {
name = freestanding_array;
values = {
v = 202311;
// This is a C++26 feature, but we support it in C++23.
cxxmin = 23;
};
};
ftms = {
name = freestanding_cstring;
values = {
v = 202311;
// This is a C++26 feature, but we support it in C++23.
cxxmin = 23;
};
};
ftms = {
name = freestanding_expected;
values = {
v = 202311;
cxxmin = 23;
// This is a C++26 feature, but we support it in C++23.
extra_cond = "__cpp_lib_expected";
};
};
ftms = {
name = freestanding_optional;
values = {
v = 202311;
// This is a C++26 feature, but we support it in C++23.
cxxmin = 23;
};
};
ftms = {
name = freestanding_string_view;
values = {
v = 202311;
// This is a C++26 feature, but we support it in C++23.
cxxmin = 23;
};
};
ftms = {
name = freestanding_variant;
values = {
v = 202311;
// This is a C++26 feature, but we support it in C++23.
cxxmin = 23;
};
};
ftms = {
name = invoke_r;
values = {
v = 202106;
cxxmin = 23;
};
};
ftms = {
name = is_scoped_enum;
values = {
v = 202011;
cxxmin = 23;
};
};
ftms = {
name = reference_from_temporary;
values = {
v = 202202;
extra_cond =
"__has_builtin(__reference_constructs_from_temporary) "
"&& __has_builtin(__reference_converts_from_temporary)";
cxxmin = 23;
};
};
//ftms = {
// name = containers_ranges;
// values = {
// v = 202202;
// cxxmin = 23;
// hosted = yes;
// };
//};
ftms = {
name = ranges_to_container;
values = {
v = 202202;
cxxmin = 23;
hosted = yes;
};
};
ftms = {
name = ranges_zip;
values = {
v = 202110;
cxxmin = 23;
};
};
ftms = {
name = ranges_chunk;
values = {
v = 202202;
cxxmin = 23;
};
};
ftms = {
name = ranges_slide;
values = {
v = 202202;
cxxmin = 23;
};
};
ftms = {
name = ranges_chunk_by;
values = {
v = 202202;
cxxmin = 23;
};
};
ftms = {
name = ranges_join_with;
values = {
v = 202202;
cxxmin = 23;
};
};
ftms = {
name = ranges_repeat;
values = {
v = 202207;
cxxmin = 23;
};
};
ftms = {
name = ranges_stride;
values = {
v = 202207;
cxxmin = 23;
};
};
ftms = {
name = ranges_cartesian_product;
values = {
v = 202207;
cxxmin = 23;
};
};
ftms = {
name = ranges_as_rvalue;
values = {
v = 202207;
cxxmin = 23;
};
};
ftms = {
name = ranges_as_const;
values = {
v = 202311;
cxxmin = 23;
};
};
ftms = {
name = ranges_enumerate;
values = {
v = 202302;
cxxmin = 23;
};
};
ftms = {
name = ranges_fold;
values = {
v = 202207;
cxxmin = 23;
};
};
ftms = {
name = ranges_contains;
values = {
v = 202207;
cxxmin = 23;
};
};
ftms = {
name = ranges_iota;
values = {
v = 202202;
cxxmin = 23;
};
};
ftms = {
name = ranges_find_last;
values = {
v = 202207;
cxxmin = 23;
};
};
ftms = {
name = constexpr_bitset;
values = {
v = 202202;
cxxmin = 23;
hosted = yes;
extra_cond = "__cpp_constexpr_dynamic_alloc";
};
};
ftms = {
name = stdatomic_h;
values = {
v = 202011;
cxxmin = 23;
};
};
ftms = {
name = adaptor_iterator_pair_constructor;
values = {
v = 202106;
cxxmin = 23;
hosted = yes;
};
};
ftms = {
name = formatters;
values = {
v = 202302;
cxxmin = 23;
hosted = yes;
};
};
ftms = {
name = forward_like;
values = {
v = 202207;
cxxmin = 23;
};
};
ftms = {
name = generator;
values = {
v = 202207;
cxxmin = 23;
extra_cond = "__glibcxx_coroutine && __cpp_sized_deallocation";
};
};
ftms = {
name = ios_noreplace;
values = {
v = 202207;
cxxmin = 23;
hosted = yes;
};
};
ftms = {
name = move_only_function;
values = {
v = 202110;
cxxmin = 23;
hosted = yes;
};
};
ftms = {
name = out_ptr;
values = {
v = 202311;
cxxmin = 23;
};
};
ftms = {
name = print;
values = {
v = 202211;
cxxmin = 23;
hosted = yes;
};
};
ftms = {
name = spanstream;
values = {
v = 202106;
cxxmin = 23;
hosted = yes;
extra_cond = "__glibcxx_span";
};
};
ftms = {
name = stacktrace;
values = {
v = 202011;
cxxmin = 23;
hosted = yes;
extra_cond = "_GLIBCXX_HAVE_STACKTRACE";
};
};
ftms = {
name = string_contains;
values = {
v = 202011;
cxxmin = 23;
hosted = yes;
};
};
ftms = {
name = string_resize_and_overwrite;
values = {
v = 202110;
cxxmin = 23;
hosted = yes;
};
};
ftms = {
name = to_underlying;
values = {
v = 202102;
cxxmin = 23;
};
};
ftms = {
name = tuple_like;
values = {
v = 202207;
cxxmin = 23;
};
};
ftms = {
name = unreachable;
values = {
v = 202202;
cxxmin = 23;
};
};
ftms = {
name = fstream_native_handle;
values = {
v = 202306;
cxxmin = 26;
hosted = yes;
};
};
ftms = {
name = ratio;
values = {
v = 202306;
cxxmin = 26;
};
};
ftms = {
name = reference_wrapper;
values = {
v = 202403;
cxxmin = 26;
};
};
ftms = {
name = saturation_arithmetic;
values = {
v = 202311;
cxxmin = 26;
};
};
ftms = {
name = text_encoding;
values = {
v = 202306;
cxxmin = 26;
hosted = yes;
extra_cond = "_GLIBCXX_USE_NL_LANGINFO_L";
};
};
ftms = {
name = to_string;
values = {
v = 202306;
cxxmin = 26;
hosted = yes;
extra_cond = "__glibcxx_to_chars";
};
};
// Standard test specifications.
stds[97] = ">= 199711L";
stds[03] = ">= 199711L";
stds[11] = ">= 201103L";
stds[14] = ">= 201402L";
stds[17] = ">= 201703L";
stds[20] = ">= 202002L";
stds[23] = ">= 202100L"; // Should be 202302L but Clang 16 uses 202101L
stds[26] = "> 202302L"; // TODO: update when finalized
// Local Variables:
// compile-command: "autogen version.def"
// End: