| // Feature test macro definitions -*- C++ -*- | |
| // Copyright (C) 2023-2025 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;] | |
| // [no_stdname = true;] | |
| // 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}. If no_stdname exists (with any value), the stdname | |
| // define is not emitted. | |
| // 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; | |
| }; | |
| }; | |
| 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 = 202306; | |
| cxxmin = 26; | |
| extra_cond = "__cpp_concepts >= 202002L && __cpp_constexpr >= 201811L && __cpp_explicit_this_parameter"; | |
| }; | |
| 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 = 202411; | |
| cxxmin = 26; | |
| extra_cond = "__cpp_constexpr >= 202406L"; | |
| }; | |
| 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; | |
| cxx11abi = yes; // std::chrono::tzdb requires cxx11 std::string | |
| }; | |
| 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; | |
| }; | |
| }; | |
| 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 = 202403; | |
| cxxmin = 26; | |
| hosted = yes; | |
| }; | |
| 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; | |
| extra_cond = "__cpp_concepts >= 201907L"; | |
| }; | |
| }; | |
| 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 = 202406; | |
| cxxmin = 26; | |
| extra_cond = "__glibcxx_concepts"; | |
| }; | |
| values = { | |
| v = 202302; | |
| 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 = 202306; | |
| cxxmin = 26; | |
| }; | |
| 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 = { | |
| name = format; | |
| // 202305 P2757R3 Type checking format args | |
| // 202306 P2637R3 Member visit | |
| // 202311 P2918R2 Runtime format strings II | |
| values = { | |
| v = 202311; | |
| cxxmin = 26; | |
| hosted = yes; | |
| }; | |
| // 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. | |
| // 202304 P2510R3 Formatting pointers | |
| values = { | |
| v = 202304; | |
| 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 = constrained_equality; | |
| values = { | |
| v = 202411; | |
| cxxmin = 23; | |
| extra_cond = "__glibcxx_three_way_comparison"; | |
| }; | |
| values = { | |
| v = 202403; | |
| cxxmin = 20; | |
| extra_cond = "__glibcxx_three_way_comparison"; | |
| }; | |
| }; | |
| 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 = format_ranges; | |
| // 202207 P2286R8 Formatting Ranges | |
| // 202207 P2585R1 Improving default container formatting | |
| // LWG3750 Too many papers bump __cpp_lib_format | |
| values = { | |
| v = 202207; | |
| cxxmin = 23; | |
| hosted = yes; | |
| }; | |
| }; | |
| 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 = flat_map; | |
| values = { | |
| v = 202207; | |
| cxxmin = 23; | |
| }; | |
| }; | |
| ftms = { | |
| name = flat_set; | |
| values = { | |
| v = 202207; | |
| cxxmin = 23; | |
| }; | |
| }; | |
| ftms = { | |
| name = common_reference; | |
| values = { | |
| v = 202302; | |
| cxxmin = 20; // We treat P2655R3 as a DR against C++20. | |
| }; | |
| }; | |
| 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 = 202311; | |
| cxxmin = 26; | |
| extra_cond = "__cpp_explicit_this_parameter >= 202110L"; | |
| }; | |
| values = { | |
| v = 202207; | |
| cxxmin = 23; | |
| }; | |
| }; | |
| ftms = { | |
| name = unreachable; | |
| values = { | |
| v = 202202; | |
| cxxmin = 23; | |
| }; | |
| }; | |
| ftms = { | |
| name = algorithm_default_value_type; | |
| values = { | |
| v = 202403; | |
| cxxmin = 26; | |
| }; | |
| }; | |
| ftms = { | |
| name = constexpr_new; | |
| values = { | |
| v = 202406; | |
| cxxmin = 26; | |
| extra_cond = "__cpp_constexpr >= 202406L"; | |
| }; | |
| }; | |
| ftms = { | |
| name = fstream_native_handle; | |
| values = { | |
| v = 202306; | |
| cxxmin = 26; | |
| hosted = yes; | |
| }; | |
| }; | |
| ftms = { | |
| name = is_virtual_base_of; | |
| values = { | |
| v = 202406; | |
| cxxmin = 26; | |
| extra_cond = "__has_builtin(__builtin_is_virtual_base_of)"; | |
| }; | |
| }; | |
| ftms = { | |
| name = ranges_cache_latest; | |
| values = { | |
| v = 202411; | |
| cxxmin = 26; | |
| }; | |
| }; | |
| ftms = { | |
| name = ranges_concat; | |
| values = { | |
| v = 202403; | |
| cxxmin = 26; | |
| extra_cond = "__cpp_pack_indexing"; | |
| }; | |
| }; | |
| 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 = span_initializer_list; | |
| 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 = ranges_to_input; | |
| values = { | |
| v = 202502; | |
| cxxmin = 26; | |
| }; | |
| }; | |
| ftms = { | |
| name = to_string; | |
| values = { | |
| v = 202306; | |
| cxxmin = 26; | |
| hosted = yes; | |
| extra_cond = "__glibcxx_to_chars"; | |
| }; | |
| }; | |
| ftms = { | |
| name = modules; | |
| values = { | |
| v = 202207; | |
| cxxmin = 20; | |
| extra_cond = "__cpp_modules"; | |
| }; | |
| }; | |
| // 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: |