]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/include/bits/version.def
libstdc++: Constrain std::swap using concepts in C++20
[thirdparty/gcc.git] / libstdc++-v3 / include / bits / version.def
1 // Feature test macro definitions -*- C++ -*-
2 // Copyright (C) 2023-2025 Free Software Foundation, Inc.
3
4 // This file is part of the GNU ISO C++ Library. This library is free
5 // software; you can redistribute it and/or modify it under the
6 // terms of the GNU General Public License as published by the
7 // Free Software Foundation; either version 3, or (at your option)
8 // any later version.
9
10 // This library is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14
15 // Under Section 7 of GPL version 3, you are granted additional
16 // permissions described in the GCC Runtime Library Exception, version
17 // 3.1, as published by the Free Software Foundation.
18
19 // You should have received a copy of the GNU General Public License and
20 // a copy of the GCC Runtime Library Exception along with this program;
21 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
22 // <http://www.gnu.org/licenses/>.
23
24 AutoGen Definitions version.tpl;
25
26 // The top level variable ftms is an array of feature test macros. Each entry
27 // consists of a structure like following:
28
29 // Schema:
30 // ftms = {
31 // name = FTM NAME;
32 // [stdname = FTM STANDARD MACRO NAME;]
33 // [no_stdname = true;]
34 // values = {
35 // v = VALUE FOR FTM IF MATCHING;
36 // [extra_cond = STRING;]
37 // [cxxmin = NUMBER;]
38 // [gnuxxmin = NUMBER;]
39 // [gthread = yes|no;]
40 // [hosted = yes|no;]
41 // [cxx11abi = yes|no;]
42 // }; ...
43 // };
44
45 // The elements in square brackets are optional. These are formulated into a
46 // logical expression like:
47 // ((strict && c++ >= cxxmin) || (!strict && c++ >= gnuxxmin))
48 // && (gthr <=> gthread)
49 // && (host <=> hosted)
50 // && (cxx11 <=> cxx11abi)
51 // && (extra_cond)
52 // Where gthr, cxx11 and host are _GLIBCXX_HAS_GTHREADS, _GLIBCXX_USE_CXX11_ABI
53 // and _GLIBCXX_HOSTED respectively. If any of these are omitted, their
54 // sub-expressions are equivalent to the identity. Specially, if gnuxxmin is
55 // omitted, it is taken to be the value of cxxmin, and so, only if both are
56 // omitted, the clause is omitted.
57
58 // stdname configures the name of the *standard* macro emitted, i.e. it
59 // replaces only the __cpp_lib_ macro in the emitted definition. Defaults to
60 // __cpp_lib_${name}. If no_stdname exists (with any value), the stdname
61 // define is not emitted.
62
63 // N.B This list needs to be in topological sort order, as later entries in
64 // this list can and do use the earlier entries.
65
66 ftms = {
67 name = incomplete_container_elements;
68 values = {
69 v = 201505;
70 hosted = yes;
71 };
72 };
73
74 ftms = {
75 name = uncaught_exceptions;
76 values = {
77 v = 201411;
78 cxxmin = 17;
79 gnuxxmin = 03;
80 };
81 };
82
83 ftms = {
84 name = allocator_traits_is_always_equal;
85 values = {
86 v = 201411;
87 cxxmin = 11;
88 };
89 };
90
91 ftms = {
92 name = is_null_pointer;
93 values = {
94 v = 201309;
95 cxxmin = 11;
96 };
97 };
98
99 ftms = {
100 name = result_of_sfinae;
101 values = {
102 v = 201210;
103 cxxmin = 11;
104 };
105 };
106
107 ftms = {
108 name = shared_ptr_arrays;
109 values = {
110 v = 201707;
111 cxxmin = 20;
112 hosted = yes;
113 };
114 values = {
115 v = 201611;
116 cxxmin = 11;
117 hosted = yes;
118 };
119 };
120
121 ftms = {
122 name = is_swappable;
123 values = {
124 v = 201603;
125 cxxmin = 17;
126 gnuxxmin = 11;
127 };
128 };
129
130 ftms = {
131 name = void_t;
132 values = {
133 v = 201411;
134 cxxmin = 17;
135 gnuxxmin = 11;
136 };
137 };
138
139 ftms = {
140 name = enable_shared_from_this;
141 values = {
142 v = 201603;
143 cxxmin = 17;
144 gnuxxmin = 11;
145 hosted = yes;
146 };
147 };
148
149 ftms = {
150 name = math_spec_funcs;
151 stdname = "__STDCPP_MATH_SPEC_FUNCS__";
152 values = {
153 v = 201003;
154 cxxmin = 11;
155 };
156 };
157
158 ftms = {
159 name = coroutine;
160 values = {
161 v = 201902;
162 // It is very likely that earlier versions would work, but they are
163 // untested.
164 cxxmin = 14;
165 extra_cond = "__cpp_impl_coroutine";
166 };
167 };
168
169 ftms = {
170 name = exchange_function;
171 values = {
172 v = 201304;
173 cxxmin = 14;
174 };
175 };
176
177 ftms = {
178 name = integer_sequence;
179 values = {
180 v = 201304;
181 cxxmin = 14;
182 };
183 };
184
185 ftms = {
186 name = integral_constant_callable;
187 values = {
188 v = 201304;
189 cxxmin = 14;
190 };
191 };
192
193 ftms = {
194 name = is_final;
195 values = {
196 v = 201402;
197 cxxmin = 14;
198 };
199 };
200
201 ftms = {
202 name = make_reverse_iterator;
203 values = {
204 v = 201402;
205 cxxmin = 14;
206 };
207 };
208
209 ftms = {
210 name = null_iterators;
211 values = {
212 v = 201304;
213 cxxmin = 14;
214 };
215 };
216
217 ftms = {
218 name = transformation_trait_aliases;
219 values = {
220 v = 201304;
221 cxxmin = 14;
222 };
223 };
224
225 ftms = {
226 name = transparent_operators;
227 values = {
228 v = 201510;
229 cxxmin = 14;
230 };
231 };
232
233 ftms = {
234 name = tuple_element_t;
235 values = {
236 v = 201402;
237 cxxmin = 14;
238 };
239 };
240
241 ftms = {
242 name = tuples_by_type;
243 values = {
244 v = 201304;
245 cxxmin = 14;
246 };
247 };
248
249 ftms = {
250 name = robust_nonmodifying_seq_ops;
251 values = {
252 v = 201304;
253 cxxmin = 14;
254 };
255 };
256
257 ftms = {
258 name = to_chars;
259 values = {
260 v = 202306;
261 cxxmin = 26;
262 extra_cond = "_GLIBCXX_FLOAT_IS_IEEE_BINARY32 "
263 "&& _GLIBCXX_DOUBLE_IS_IEEE_BINARY64 "
264 "&& __SIZE_WIDTH__ >= 32";
265 };
266 values = {
267 v = 201611;
268 cxxmin = 14;
269 extra_cond = "_GLIBCXX_FLOAT_IS_IEEE_BINARY32 "
270 "&& _GLIBCXX_DOUBLE_IS_IEEE_BINARY64 "
271 "&& __SIZE_WIDTH__ >= 32";
272 };
273 };
274
275 ftms = {
276 name = chrono_udls;
277 values = {
278 v = 201304;
279 cxxmin = 14;
280 };
281 };
282
283 ftms = {
284 name = complex_udls;
285 values = {
286 v = 201309;
287 cxxmin = 14;
288 hosted = yes;
289 };
290 };
291
292 ftms = {
293 name = generic_associative_lookup;
294 values = {
295 v = 201304;
296 cxxmin = 14;
297 hosted = yes;
298 };
299 };
300
301 ftms = {
302 name = make_unique;
303 values = {
304 v = 201304;
305 cxxmin = 14;
306 hosted = yes;
307 };
308 };
309
310 ftms = {
311 name = quoted_string_io;
312 values = {
313 v = 201304;
314 cxxmin = 14;
315 hosted = yes;
316 };
317 };
318
319 ftms = {
320 name = shared_timed_mutex;
321 values = {
322 v = 201402;
323 cxxmin = 14;
324 hosted = yes;
325 gthread = yes;
326 };
327 };
328
329 ftms = {
330 name = string_udls;
331 values = {
332 v = 201304;
333 cxxmin = 14;
334 hosted = yes;
335 };
336 };
337
338 ftms = {
339 name = addressof_constexpr;
340 values = {
341 // _GLIBCXX_RESOLVE_LIB_DEFECTS
342 // 2296. std::addressof should be constexpr
343 v = 201603;
344 cxxmin = 17;
345 };
346 };
347
348 ftms = {
349 name = any;
350 values = {
351 v = 201606;
352 cxxmin = 17;
353 };
354 };
355
356 ftms = {
357 name = apply;
358 values = {
359 v = 201603;
360 cxxmin = 17;
361 };
362 };
363
364 ftms = {
365 name = as_const;
366 values = {
367 v = 201510;
368 cxxmin = 17;
369 };
370 };
371
372 ftms = {
373 name = atomic_is_always_lock_free;
374 values = {
375 v = 201603;
376 cxxmin = 17;
377 };
378 };
379
380 ftms = {
381 name = bool_constant;
382 values = {
383 v = 201505;
384 cxxmin = 17;
385 };
386 };
387
388 ftms = {
389 name = byte;
390 values = {
391 v = 201603;
392 cxxmin = 17;
393 };
394 };
395
396 ftms = {
397 name = has_unique_object_representations;
398 values = {
399 v = 201606;
400 cxxmin = 17;
401 extra_cond = "defined(_GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP)";
402 };
403 };
404
405 ftms = {
406 name = hardware_interference_size;
407 values = {
408 v = 201703;
409 cxxmin = 17;
410 extra_cond = "defined(__GCC_DESTRUCTIVE_SIZE)";
411 };
412 };
413
414 ftms = {
415 name = invoke;
416 values = {
417 v = 201411;
418 cxxmin = 17;
419 };
420 };
421
422 ftms = {
423 name = is_aggregate;
424 values = {
425 v = 201703;
426 cxxmin = 17;
427 extra_cond = "defined(_GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE)";
428 };
429 };
430
431 ftms = {
432 name = is_invocable;
433 values = {
434 v = 201703;
435 cxxmin = 17;
436 };
437 };
438
439 ftms = {
440 name = launder;
441 values = {
442 v = 201606;
443 cxxmin = 17;
444 extra_cond = "defined(_GLIBCXX_HAVE_BUILTIN_LAUNDER)";
445 };
446 };
447
448 ftms = {
449 name = logical_traits;
450 values = {
451 v = 201510;
452 cxxmin = 17;
453 };
454 };
455
456 ftms = {
457 name = make_from_tuple;
458 values = {
459 v = 201606;
460 cxxmin = 17;
461 };
462 };
463
464 ftms = {
465 name = not_fn;
466 values = {
467 v = 201603;
468 cxxmin = 17;
469 };
470 };
471
472 ftms = {
473 name = type_trait_variable_templates;
474 values = {
475 v = 201510;
476 cxxmin = 17;
477 };
478 };
479
480 ftms = {
481 name = variant;
482 values = {
483 v = 202306;
484 cxxmin = 26;
485 extra_cond = "__cpp_concepts >= 202002L && __cpp_constexpr >= 201811L && __cpp_explicit_this_parameter";
486 };
487 values = {
488 v = 202106;
489 cxxmin = 20;
490 extra_cond = "__cpp_concepts >= 202002L && __cpp_constexpr >= 201811L";
491 };
492 values = {
493 v = 202102;
494 cxxmin = 17;
495 };
496 };
497
498 ftms = {
499 // Used in earlier draft of SD6.
500 name = lcm;
501 values = {
502 v = 201606;
503 cxxmin = 17;
504 };
505 };
506
507 ftms = {
508 // Used in earlier draft of SD6.
509 name = gcd;
510 values = {
511 v = 201606;
512 cxxmin = 17;
513 };
514 };
515
516 ftms = {
517 name = gcd_lcm;
518 values = {
519 v = 201606;
520 cxxmin = 17;
521 };
522 };
523
524 ftms = {
525 name = raw_memory_algorithms;
526 values = {
527 v = 202411;
528 cxxmin = 26;
529 extra_cond = "__cpp_constexpr >= 202406L";
530 };
531 values = {
532 v = 201606;
533 cxxmin = 17;
534 };
535 };
536
537 ftms = {
538 name = array_constexpr;
539 values = {
540 v = 201811;
541 cxxmin = 20;
542 };
543 values = {
544 v = 201803;
545 cxxmin = 17;
546 };
547 };
548
549 ftms = {
550 name = nonmember_container_access;
551 values = {
552 v = 201411;
553 cxxmin = 17;
554 };
555 };
556
557 ftms = {
558 name = clamp;
559 values = {
560 v = 201603;
561 cxxmin = 17;
562 };
563 };
564
565 ftms = {
566 name = sample;
567 values = {
568 v = 201603;
569 cxxmin = 17;
570 };
571 };
572
573 ftms = {
574 name = boyer_moore_searcher;
575 values = {
576 v = 201603;
577 cxxmin = 17;
578 hosted = yes;
579 };
580 };
581
582 ftms = {
583 name = chrono;
584 values = {
585 v = 201907;
586 cxxmin = 20;
587 hosted = yes;
588 cxx11abi = yes; // std::chrono::tzdb requires cxx11 std::string
589 };
590 values = {
591 v = 201611;
592 cxxmin = 17;
593 hosted = yes;
594 };
595 };
596
597 ftms = {
598 name = execution;
599 values = {
600 v = 201902; // FIXME: should be 201603L
601 cxxmin = 17;
602 hosted = yes;
603 };
604 };
605
606 ftms = {
607 name = filesystem;
608 values = {
609 v = 201703;
610 cxxmin = 17;
611 hosted = yes;
612 };
613 };
614
615 ftms = {
616 name = hypot;
617 values = {
618 v = 201603;
619 cxxmin = 17;
620 hosted = yes;
621 };
622 };
623
624 ftms = {
625 name = map_try_emplace;
626 values = {
627 v = 201411;
628 cxxmin = 17;
629 hosted = yes;
630 };
631 };
632
633 ftms = {
634 name = math_special_functions;
635 values = {
636 v = 201603;
637 cxxmin = 17;
638 hosted = yes;
639 };
640 };
641
642 ftms = {
643 name = memory_resource;
644 values = {
645 v = 201603;
646 cxxmin = 17;
647 hosted = yes;
648 gthread = yes;
649 };
650 values = {
651 v = 1;
652 // For when there is no gthread.
653 cxxmin = 17;
654 hosted = yes;
655 gthread = no;
656 };
657 };
658
659 ftms = {
660 name = node_extract;
661 values = {
662 v = 201606;
663 cxxmin = 17;
664 hosted = yes;
665 };
666 };
667
668 ftms = {
669 name = parallel_algorithm;
670 values = {
671 v = 201603;
672 cxxmin = 17;
673 hosted = yes;
674 };
675 };
676
677 ftms = {
678 name = scoped_lock;
679 values = {
680 v = 201703;
681 cxxmin = 17;
682 };
683 };
684
685 ftms = {
686 name = shared_mutex;
687 values = {
688 v = 201505;
689 cxxmin = 17;
690 hosted = yes;
691 gthread = yes;
692 };
693 };
694
695 ftms = {
696 name = shared_ptr_weak_type;
697 values = {
698 v = 201606;
699 cxxmin = 17;
700 hosted = yes;
701 };
702 };
703
704 ftms = {
705 name = string_view;
706 values = {
707 v = 202403;
708 cxxmin = 26;
709 hosted = yes;
710 };
711 values = {
712 v = 201803;
713 cxxmin = 17;
714 hosted = yes;
715 };
716 };
717
718 ftms = {
719 name = unordered_map_try_emplace;
720 values = {
721 v = 201411;
722 cxxmin = 17;
723 hosted = yes;
724 };
725 };
726
727 ftms = {
728 name = assume_aligned;
729 values = {
730 v = 201811;
731 cxxmin = 20;
732 };
733 };
734
735 ftms = {
736 name = atomic_flag_test;
737 values = {
738 v = 201907;
739 cxxmin = 20;
740 };
741 };
742
743 ftms = {
744 name = atomic_float;
745 values = {
746 v = 201711;
747 cxxmin = 20;
748 };
749 };
750
751 ftms = {
752 name = atomic_lock_free_type_aliases;
753 values = {
754 v = 201907;
755 cxxmin = 20;
756 extra_cond = "(__GCC_ATOMIC_INT_LOCK_FREE | __GCC_ATOMIC_LONG_LOCK_FREE | __GCC_ATOMIC_CHAR_LOCK_FREE) & 2";
757 };
758 };
759
760 ftms = {
761 name = atomic_ref;
762 values = {
763 v = 201806;
764 cxxmin = 20;
765 };
766 };
767
768 ftms = {
769 name = atomic_value_initialization;
770 values = {
771 v = 201911;
772 cxxmin = 20;
773 extra_cond = "__cpp_concepts >= 201907L";
774 };
775 };
776
777 ftms = {
778 name = bind_front;
779 values = {
780 v = 201907;
781 cxxmin = 20;
782 };
783 };
784
785 ftms = {
786 name = bind_back;
787 values = {
788 v = 202202;
789 cxxmin = 23;
790 extra_cond = "__cpp_explicit_this_parameter";
791 };
792 };
793
794 ftms = {
795 name = starts_ends_with;
796 values = {
797 v = 201711;
798 cxxmin = 20;
799 };
800 };
801
802 ftms = {
803 name = bit_cast;
804 values = {
805 v = 201806;
806 cxxmin = 20;
807 extra_cond = "__has_builtin(__builtin_bit_cast)";
808 };
809 };
810
811 ftms = {
812 name = bitops;
813 values = {
814 v = 201907;
815 cxxmin = 20;
816 };
817 };
818
819 ftms = {
820 name = bounded_array_traits;
821 values = {
822 v = 201902;
823 cxxmin = 20;
824 };
825 };
826
827 ftms = {
828 name = concepts;
829 values = {
830 v = 202002;
831 cxxmin = 20;
832 extra_cond = "__cpp_concepts >= 201907L";
833 };
834 };
835
836 // Moved down here (after concepts) by topological sort.
837 ftms = {
838 name = optional;
839 values = {
840 v = 202110;
841 cxxmin = 23;
842 extra_cond = "__glibcxx_concepts";
843 };
844 values = {
845 v = 202106;
846 cxxmin = 20;
847 };
848 values = {
849 v = 201606;
850 cxxmin = 17;
851 };
852 };
853
854 ftms = {
855 name = optional_range_support;
856 values = {
857 v = 202406;
858 cxxmin = 26;
859 };
860 };
861
862 ftms = {
863 name = destroying_delete;
864 values = {
865 v = 201806;
866 cxxmin = 20;
867 extra_cond = "__cpp_impl_destroying_delete";
868 };
869 };
870
871 ftms = {
872 name = constexpr_string_view;
873 values = {
874 v = 201811;
875 cxxmin = 20;
876 };
877 };
878
879 ftms = {
880 name = endian;
881 values = {
882 v = 201907;
883 cxxmin = 20;
884 };
885 };
886
887 ftms = {
888 name = int_pow2;
889 values = {
890 v = 202002;
891 cxxmin = 20;
892 };
893 };
894
895 ftms = {
896 name = integer_comparison_functions;
897 values = {
898 v = 202002;
899 cxxmin = 20;
900 };
901 };
902
903 ftms = {
904 name = is_constant_evaluated;
905 values = {
906 v = 201811;
907 cxxmin = 20;
908 extra_cond = "defined(_GLIBCXX_HAVE_IS_CONSTANT_EVALUATED)";
909 };
910 };
911
912 // Moved down here (after is_constant_evaluated) by topological sort.
913 ftms = {
914 name = constexpr_char_traits;
915 values = {
916 // Unofficial macro indicating P1032R1 support in C++20
917 v = 201811;
918 cxxmin = 20;
919 extra_cond = "defined(__glibcxx_is_constant_evaluated)";
920 };
921 values = {
922 // Unofficial macro indicating P0426R1 support in C++17
923 v = 201611;
924 cxxmin = 17;
925 extra_cond = "_GLIBCXX_HAVE_IS_CONSTANT_EVALUATED";
926 };
927 };
928
929 ftms = {
930 name = is_layout_compatible;
931 values = {
932 v = 201907;
933 cxxmin = 20;
934 extra_cond = "__has_builtin(__is_layout_compatible) "
935 "&& __has_builtin(__builtin_is_corresponding_member)";
936 };
937 };
938
939 ftms = {
940 name = is_nothrow_convertible;
941 values = {
942 v = 201806;
943 cxxmin = 20;
944 };
945 };
946
947 ftms = {
948 name = is_pointer_interconvertible;
949 values = {
950 v = 201907;
951 cxxmin = 20;
952 extra_cond =
953 "__has_builtin(__is_pointer_interconvertible_base_of) "
954 "&& __has_builtin(__builtin_is_pointer_interconvertible_with_class)";
955 };
956 };
957
958 ftms = {
959 name = math_constants;
960 values = {
961 v = 201907;
962 cxxmin = 20;
963 };
964 };
965
966 ftms = {
967 name = make_obj_using_allocator;
968 no_stdname = true;
969 values = {
970 // Not specified by C++20, used internally
971 v = 201811;
972 cxxmin = 20;
973 extra_cond = "__cpp_concepts";
974 };
975 };
976
977 ftms = {
978 name = remove_cvref;
979 values = {
980 v = 201711;
981 cxxmin = 20;
982 };
983 };
984
985 ftms = {
986 name = source_location;
987 values = {
988 v = 201907;
989 cxxmin = 20;
990 extra_cond = "__has_builtin(__builtin_source_location)";
991 };
992 };
993
994 ftms = {
995 name = span;
996 values = {
997 v = 202311;
998 cxxmin = 26;
999 extra_cond = "__glibcxx_concepts";
1000 };
1001 values = {
1002 v = 202002;
1003 cxxmin = 20;
1004 extra_cond = "__glibcxx_concepts";
1005 };
1006 };
1007
1008 ftms = {
1009 name = mdspan;
1010 values = {
1011 v = 202207;
1012 cxxmin = 23;
1013 };
1014 };
1015
1016 ftms = {
1017 name = ssize;
1018 values = {
1019 v = 201902;
1020 cxxmin = 20;
1021 };
1022 };
1023
1024 ftms = {
1025 name = three_way_comparison;
1026 values = {
1027 v = 201907;
1028 cxxmin = 20;
1029 extra_cond = "__cpp_impl_three_way_comparison >= 201907L "
1030 "&& __glibcxx_concepts";
1031 };
1032 };
1033
1034 ftms = {
1035 name = to_address;
1036 values = {
1037 v = 201711;
1038 cxxmin = 20;
1039 };
1040 };
1041
1042 ftms = {
1043 name = to_array;
1044 values = {
1045 v = 201907;
1046 cxxmin = 20;
1047 extra_cond = "__cpp_generic_lambdas >= 201707L";
1048 };
1049 };
1050
1051 ftms = {
1052 name = type_identity;
1053 values = {
1054 v = 201806;
1055 cxxmin = 20;
1056 };
1057 };
1058
1059 ftms = {
1060 name = unwrap_ref;
1061 values = {
1062 v = 201811;
1063 cxxmin = 20;
1064 };
1065 };
1066
1067 ftms = {
1068 name = constexpr_iterator;
1069 values = {
1070 v = 201811;
1071 cxxmin = 20;
1072 };
1073 };
1074
1075 ftms = {
1076 name = interpolate;
1077 values = {
1078 v = 201902;
1079 cxxmin = 20;
1080 };
1081 };
1082
1083 ftms = {
1084 name = constexpr_utility;
1085 values = {
1086 v = 201811;
1087 cxxmin = 20;
1088 };
1089 };
1090
1091 ftms = {
1092 name = shift;
1093 values = {
1094 v = 202202;
1095 cxxmin = 23;
1096 };
1097 values = {
1098 v = 201806;
1099 cxxmin = 20;
1100 };
1101 };
1102
1103 ftms = {
1104 name = ranges;
1105 values = {
1106 v = 202406;
1107 cxxmin = 26;
1108 extra_cond = "__glibcxx_concepts";
1109 };
1110 values = {
1111 v = 202302;
1112 cxxmin = 23;
1113 extra_cond = "__glibcxx_concepts";
1114 };
1115 values = {
1116 v = 202110;
1117 cxxmin = 20;
1118 extra_cond = "__glibcxx_concepts";
1119 };
1120 };
1121
1122 ftms = {
1123 name = constexpr_numeric;
1124 values = {
1125 v = 201911;
1126 cxxmin = 20;
1127 };
1128 };
1129
1130 ftms = {
1131 name = constexpr_functional;
1132 values = {
1133 v = 201907;
1134 cxxmin = 20;
1135 };
1136 };
1137
1138 ftms = {
1139 name = constexpr_algorithms;
1140 values = {
1141 v = 202306;
1142 cxxmin = 26;
1143 };
1144 values = {
1145 v = 201806;
1146 cxxmin = 20;
1147 };
1148 };
1149
1150 ftms = {
1151 name = constexpr_tuple;
1152 values = {
1153 v = 201811;
1154 cxxmin = 20;
1155 };
1156 };
1157
1158 ftms = {
1159 name = constexpr_memory;
1160 values = {
1161 v = 202202;
1162 cxxmin = 23;
1163 extra_cond = "__cpp_constexpr_dynamic_alloc";
1164 };
1165 values = {
1166 v = 201811;
1167 cxxmin = 20;
1168 };
1169 };
1170
1171 ftms = {
1172 name = atomic_shared_ptr;
1173 values = {
1174 v = 201711;
1175 cxxmin = 20;
1176 hosted = yes;
1177 };
1178 };
1179
1180 ftms = {
1181 name = atomic_wait;
1182 // atomic_wait is available if either futexes or gthread are.
1183 values = {
1184 v = 201907;
1185 cxxmin = 20;
1186 hosted = yes;
1187 gthread = yes;
1188 };
1189 values = {
1190 v = 201907;
1191 cxxmin = 20;
1192 hosted = yes;
1193 gthread = no;
1194 extra_cond = "defined(_GLIBCXX_HAVE_LINUX_FUTEX)";
1195 };
1196 };
1197
1198 ftms = {
1199 name = barrier;
1200 values = {
1201 v = 201907;
1202 cxxmin = 20;
1203 // This condition carries in the hosted&&(futex||gthread) logic from above.
1204 extra_cond = "__cpp_aligned_new && __glibcxx_atomic_wait";
1205 };
1206 };
1207
1208 ftms = {
1209 name = format;
1210 // 202305 P2757R3 Type checking format args
1211 // 202306 P2637R3 Member visit
1212 // 202311 P2918R2 Runtime format strings II
1213 values = {
1214 v = 202311;
1215 cxxmin = 26;
1216 hosted = yes;
1217 };
1218 // 201907 Text Formatting, Integration of chrono, printf corner cases.
1219 // 202106 std::format improvements.
1220 // 202110 Fixing locale handling in chrono formatters, generator-like types.
1221 // 202207 Encodings in localized formatting of chrono, basic-format-string.
1222 // 202304 P2510R3 Formatting pointers
1223 values = {
1224 v = 202304;
1225 cxxmin = 20;
1226 hosted = yes;
1227 };
1228 };
1229
1230 ftms = {
1231 name = format_uchar;
1232 values = {
1233 v = 202311;
1234 cxxmin = 20;
1235 hosted = yes;
1236 };
1237 };
1238
1239 // FIXME: #define __glibcxx_execution 201902L
1240
1241 ftms = {
1242 name = constexpr_complex;
1243 values = {
1244 v = 201711;
1245 cxxmin = 20;
1246 hosted = yes;
1247 };
1248 };
1249
1250 ftms = {
1251 name = constexpr_dynamic_alloc;
1252 values = {
1253 v = 201907;
1254 cxxmin = 20;
1255 hosted = yes;
1256 };
1257 };
1258
1259 ftms = {
1260 name = constexpr_string;
1261 values = {
1262 v = 201907;
1263 cxxmin = 20;
1264 hosted = yes;
1265 cxx11abi = yes;
1266 extra_cond = "defined(__glibcxx_is_constant_evaluated)";
1267 };
1268 values = {
1269 v = 201811;
1270 cxxmin = 20;
1271 hosted = yes;
1272 cxx11abi = no;
1273 extra_cond = "defined(__glibcxx_is_constant_evaluated)";
1274 };
1275 values = {
1276 v = 201611;
1277 cxxmin = 17;
1278 hosted = yes;
1279 extra_cond = "_GLIBCXX_HAVE_IS_CONSTANT_EVALUATED";
1280 };
1281 };
1282
1283 ftms = {
1284 name = constexpr_vector;
1285 values = {
1286 v = 201907;
1287 cxxmin = 20;
1288 hosted = yes;
1289 };
1290 };
1291
1292 ftms = {
1293 name = constrained_equality;
1294 values = {
1295 v = 202411;
1296 cxxmin = 23;
1297 extra_cond = "__glibcxx_three_way_comparison";
1298 };
1299 values = {
1300 v = 202403;
1301 cxxmin = 20;
1302 extra_cond = "__glibcxx_three_way_comparison";
1303 };
1304 };
1305
1306 ftms = {
1307 name = erase_if;
1308 values = {
1309 v = 202002;
1310 cxxmin = 20;
1311 hosted = yes;
1312 };
1313 };
1314
1315 ftms = {
1316 name = generic_unordered_lookup;
1317 values = {
1318 v = 201811;
1319 cxxmin = 20;
1320 hosted = yes;
1321 };
1322 };
1323
1324 ftms = {
1325 name = jthread;
1326 values = {
1327 v = 201911;
1328 gthread = yes;
1329 hosted = yes;
1330 cxxmin = 20;
1331 };
1332 };
1333
1334 ftms = {
1335 name = latch;
1336 values = {
1337 v = 201907;
1338 cxxmin = 20;
1339 extra_cond = "__glibcxx_atomic_wait";
1340 };
1341 };
1342
1343 ftms = {
1344 name = list_remove_return_type;
1345 values = {
1346 v = 201806;
1347 cxxmin = 20;
1348 hosted = yes;
1349 };
1350 };
1351
1352 ftms = {
1353 name = polymorphic_allocator;
1354 values = {
1355 v = 201902;
1356 cxxmin = 20;
1357 hosted = yes;
1358 };
1359 };
1360
1361 ftms = {
1362 name = move_iterator_concept;
1363 values = {
1364 v = 202207;
1365 // This is P2520R0, a C++23 change, but we treat it as a DR against C++20.
1366 cxxmin = 20;
1367 extra_cond = "__glibcxx_concepts";
1368 };
1369 };
1370
1371 ftms = {
1372 name = semaphore;
1373 values = {
1374 v = 201907;
1375 cxxmin = 20;
1376 hosted = yes;
1377 extra_cond = "__glibcxx_atomic_wait";
1378 };
1379 };
1380
1381 ftms = {
1382 name = smart_ptr_for_overwrite;
1383 values = {
1384 v = 202002;
1385 cxxmin = 20;
1386 hosted = yes;
1387 };
1388 };
1389
1390 ftms = {
1391 name = syncbuf;
1392 values = {
1393 v = 201803;
1394 cxxmin = 20;
1395 hosted = yes;
1396 cxx11abi = yes;
1397 };
1398 };
1399
1400 ftms = {
1401 name = byteswap;
1402 values = {
1403 v = 202110;
1404 cxxmin = 23;
1405 };
1406 };
1407
1408 ftms = {
1409 name = constexpr_charconv;
1410 values = {
1411 v = 202207;
1412 cxxmin = 23;
1413 };
1414 };
1415
1416 ftms = {
1417 name = constexpr_typeinfo;
1418 values = {
1419 v = 202106;
1420 cxxmin = 23;
1421 };
1422 };
1423
1424 ftms = {
1425 name = expected;
1426 values = {
1427 v = 202211;
1428 cxxmin = 23;
1429 extra_cond = "__cpp_concepts >= 202002L";
1430 };
1431 };
1432
1433 ftms = {
1434 name = format_ranges;
1435 // 202207 P2286R8 Formatting Ranges
1436 // 202207 P2585R1 Improving default container formatting
1437 // LWG3750 Too many papers bump __cpp_lib_format
1438 values = {
1439 v = 202207;
1440 cxxmin = 23;
1441 hosted = yes;
1442 };
1443 };
1444
1445 ftms = {
1446 name = freestanding_algorithm;
1447 values = {
1448 v = 202311;
1449 // This is a C++26 feature, but we support it in C++23.
1450 cxxmin = 23;
1451 };
1452 };
1453
1454 ftms = {
1455 name = freestanding_array;
1456 values = {
1457 v = 202311;
1458 // This is a C++26 feature, but we support it in C++23.
1459 cxxmin = 23;
1460 };
1461 };
1462
1463 ftms = {
1464 name = freestanding_cstring;
1465 values = {
1466 v = 202311;
1467 // This is a C++26 feature, but we support it in C++23.
1468 cxxmin = 23;
1469 };
1470 };
1471
1472 ftms = {
1473 name = freestanding_expected;
1474 values = {
1475 v = 202311;
1476 cxxmin = 23;
1477 // This is a C++26 feature, but we support it in C++23.
1478 extra_cond = "__cpp_lib_expected";
1479 };
1480 };
1481
1482 ftms = {
1483 name = freestanding_optional;
1484 values = {
1485 v = 202311;
1486 // This is a C++26 feature, but we support it in C++23.
1487 cxxmin = 23;
1488 };
1489 };
1490
1491 ftms = {
1492 name = freestanding_string_view;
1493 values = {
1494 v = 202311;
1495 // This is a C++26 feature, but we support it in C++23.
1496 cxxmin = 23;
1497 };
1498 };
1499
1500 ftms = {
1501 name = freestanding_variant;
1502 values = {
1503 v = 202311;
1504 // This is a C++26 feature, but we support it in C++23.
1505 cxxmin = 23;
1506 };
1507 };
1508
1509 ftms = {
1510 name = invoke_r;
1511 values = {
1512 v = 202106;
1513 cxxmin = 23;
1514 };
1515 };
1516
1517 ftms = {
1518 name = is_scoped_enum;
1519 values = {
1520 v = 202011;
1521 cxxmin = 23;
1522 };
1523 };
1524
1525 ftms = {
1526 name = reference_from_temporary;
1527 values = {
1528 v = 202202;
1529 extra_cond =
1530 "__has_builtin(__reference_constructs_from_temporary) "
1531 "&& __has_builtin(__reference_converts_from_temporary)";
1532 cxxmin = 23;
1533 };
1534 };
1535
1536 ftms = {
1537 name = containers_ranges;
1538 values = {
1539 v = 202202;
1540 cxxmin = 23;
1541 hosted = yes;
1542 };
1543 };
1544
1545 ftms = {
1546 name = ranges_to_container;
1547 values = {
1548 v = 202202;
1549 cxxmin = 23;
1550 hosted = yes;
1551 };
1552 };
1553
1554 ftms = {
1555 name = ranges_zip;
1556 values = {
1557 v = 202110;
1558 cxxmin = 23;
1559 };
1560 };
1561
1562 ftms = {
1563 name = ranges_chunk;
1564 values = {
1565 v = 202202;
1566 cxxmin = 23;
1567 };
1568 };
1569
1570 ftms = {
1571 name = ranges_slide;
1572 values = {
1573 v = 202202;
1574 cxxmin = 23;
1575 };
1576 };
1577
1578 ftms = {
1579 name = ranges_chunk_by;
1580 values = {
1581 v = 202202;
1582 cxxmin = 23;
1583 };
1584 };
1585
1586 ftms = {
1587 name = ranges_join_with;
1588 values = {
1589 v = 202202;
1590 cxxmin = 23;
1591 };
1592 };
1593
1594 ftms = {
1595 name = ranges_repeat;
1596 values = {
1597 v = 202207;
1598 cxxmin = 23;
1599 };
1600 };
1601
1602 ftms = {
1603 name = ranges_stride;
1604 values = {
1605 v = 202207;
1606 cxxmin = 23;
1607 };
1608 };
1609
1610 ftms = {
1611 name = ranges_cartesian_product;
1612 values = {
1613 v = 202207;
1614 cxxmin = 23;
1615 };
1616 };
1617
1618 ftms = {
1619 name = ranges_as_rvalue;
1620 values = {
1621 v = 202207;
1622 cxxmin = 23;
1623 };
1624 };
1625
1626 ftms = {
1627 name = ranges_as_const;
1628 values = {
1629 v = 202311;
1630 cxxmin = 23;
1631 };
1632 };
1633
1634 ftms = {
1635 name = ranges_enumerate;
1636 values = {
1637 v = 202302;
1638 cxxmin = 23;
1639 };
1640 };
1641
1642 ftms = {
1643 name = ranges_fold;
1644 values = {
1645 v = 202207;
1646 cxxmin = 23;
1647 };
1648 };
1649
1650 ftms = {
1651 name = ranges_contains;
1652 values = {
1653 v = 202207;
1654 cxxmin = 23;
1655 };
1656 };
1657
1658 ftms = {
1659 name = ranges_iota;
1660 values = {
1661 v = 202202;
1662 cxxmin = 23;
1663 };
1664 };
1665
1666 ftms = {
1667 name = ranges_find_last;
1668 values = {
1669 v = 202207;
1670 cxxmin = 23;
1671 };
1672 };
1673
1674 ftms = {
1675 name = ranges_starts_ends_with;
1676 values = {
1677 v = 202106;
1678 cxxmin = 23;
1679 };
1680 };
1681
1682 ftms = {
1683 name = constexpr_bitset;
1684 values = {
1685 v = 202202;
1686 cxxmin = 23;
1687 hosted = yes;
1688 extra_cond = "__cpp_constexpr_dynamic_alloc";
1689 };
1690 };
1691
1692 ftms = {
1693 name = stdatomic_h;
1694 values = {
1695 v = 202011;
1696 cxxmin = 23;
1697 };
1698 };
1699
1700 ftms = {
1701 name = adaptor_iterator_pair_constructor;
1702 values = {
1703 v = 202106;
1704 cxxmin = 23;
1705 hosted = yes;
1706 };
1707 };
1708
1709 ftms = {
1710 name = flat_map;
1711 values = {
1712 v = 202207;
1713 cxxmin = 23;
1714 };
1715 };
1716
1717 ftms = {
1718 name = flat_set;
1719 values = {
1720 v = 202207;
1721 cxxmin = 23;
1722 };
1723 };
1724
1725 ftms = {
1726 name = formatters;
1727 values = {
1728 v = 202302;
1729 cxxmin = 23;
1730 hosted = yes;
1731 };
1732 };
1733
1734 ftms = {
1735 name = forward_like;
1736 values = {
1737 v = 202207;
1738 cxxmin = 23;
1739 };
1740 };
1741
1742 ftms = {
1743 name = generator;
1744 values = {
1745 v = 202207;
1746 cxxmin = 23;
1747 extra_cond = "__glibcxx_coroutine && __cpp_sized_deallocation";
1748 };
1749 };
1750
1751 ftms = {
1752 name = ios_noreplace;
1753 values = {
1754 v = 202207;
1755 cxxmin = 23;
1756 hosted = yes;
1757 };
1758 };
1759
1760 ftms = {
1761 name = move_only_function;
1762 values = {
1763 v = 202110;
1764 cxxmin = 23;
1765 hosted = yes;
1766 };
1767 };
1768
1769 ftms = {
1770 name = copyable_function;
1771 values = {
1772 v = 202306;
1773 cxxmin = 26;
1774 hosted = yes;
1775 };
1776 };
1777
1778 ftms = {
1779 name = function_ref;
1780 values = {
1781 v = 202306;
1782 cxxmin = 26;
1783 };
1784 };
1785
1786 ftms = {
1787 name = out_ptr;
1788 values = {
1789 v = 202311;
1790 cxxmin = 23;
1791 };
1792 };
1793
1794 ftms = {
1795 name = print;
1796 values = {
1797 v = 202211;
1798 cxxmin = 23;
1799 hosted = yes;
1800 };
1801 };
1802
1803 ftms = {
1804 name = spanstream;
1805 values = {
1806 v = 202106;
1807 cxxmin = 23;
1808 hosted = yes;
1809 extra_cond = "__glibcxx_span";
1810 };
1811 };
1812
1813 ftms = {
1814 name = stacktrace;
1815 values = {
1816 v = 202011;
1817 cxxmin = 23;
1818 hosted = yes;
1819 extra_cond = "_GLIBCXX_HAVE_STACKTRACE";
1820 };
1821 };
1822
1823 ftms = {
1824 name = string_contains;
1825 values = {
1826 v = 202011;
1827 cxxmin = 23;
1828 hosted = yes;
1829 };
1830 };
1831
1832 ftms = {
1833 name = string_resize_and_overwrite;
1834 values = {
1835 v = 202110;
1836 cxxmin = 23;
1837 hosted = yes;
1838 };
1839 };
1840
1841 ftms = {
1842 name = to_underlying;
1843 values = {
1844 v = 202102;
1845 cxxmin = 23;
1846 };
1847 };
1848
1849 ftms = {
1850 name = tuple_like;
1851 values = {
1852 v = 202311;
1853 cxxmin = 26;
1854 extra_cond = "__cpp_explicit_this_parameter >= 202110L";
1855 };
1856 values = {
1857 v = 202207;
1858 cxxmin = 23;
1859 };
1860 };
1861
1862 ftms = {
1863 name = unreachable;
1864 values = {
1865 v = 202202;
1866 cxxmin = 23;
1867 };
1868 };
1869
1870 ftms = {
1871 name = algorithm_default_value_type;
1872 values = {
1873 v = 202403;
1874 cxxmin = 26;
1875 };
1876 };
1877
1878 ftms = {
1879 name = constexpr_new;
1880 values = {
1881 v = 202406;
1882 cxxmin = 26;
1883 extra_cond = "__cpp_constexpr >= 202406L";
1884 };
1885 };
1886
1887 ftms = {
1888 name = fstream_native_handle;
1889 values = {
1890 v = 202306;
1891 cxxmin = 26;
1892 hosted = yes;
1893 };
1894 };
1895
1896 ftms = {
1897 name = is_virtual_base_of;
1898 values = {
1899 v = 202406;
1900 cxxmin = 26;
1901 extra_cond = "__has_builtin(__builtin_is_virtual_base_of)";
1902 };
1903 };
1904
1905 ftms = {
1906 name = ranges_cache_latest;
1907 values = {
1908 v = 202411;
1909 cxxmin = 26;
1910 };
1911 };
1912
1913 ftms = {
1914 name = ranges_concat;
1915 values = {
1916 v = 202403;
1917 cxxmin = 26;
1918 extra_cond = "__cpp_pack_indexing";
1919 };
1920 };
1921
1922 ftms = {
1923 name = ratio;
1924 values = {
1925 v = 202306;
1926 cxxmin = 26;
1927 };
1928 };
1929
1930 ftms = {
1931 name = reference_wrapper;
1932 values = {
1933 v = 202403;
1934 cxxmin = 26;
1935 };
1936 };
1937
1938 ftms = {
1939 name = saturation_arithmetic;
1940 values = {
1941 v = 202311;
1942 cxxmin = 26;
1943 };
1944 };
1945
1946 ftms = {
1947 name = span_initializer_list;
1948 values = {
1949 v = 202311;
1950 cxxmin = 26;
1951 };
1952 };
1953
1954 ftms = {
1955 name = text_encoding;
1956 values = {
1957 v = 202306;
1958 cxxmin = 26;
1959 hosted = yes;
1960 extra_cond = "_GLIBCXX_USE_NL_LANGINFO_L";
1961 };
1962 };
1963
1964 ftms = {
1965 name = ranges_to_input;
1966 values = {
1967 v = 202502;
1968 cxxmin = 26;
1969 };
1970 };
1971
1972 ftms = {
1973 name = to_string;
1974 values = {
1975 v = 202306;
1976 cxxmin = 26;
1977 hosted = yes;
1978 extra_cond = "__glibcxx_to_chars";
1979 };
1980 };
1981
1982 ftms = {
1983 name = modules;
1984 values = {
1985 v = 202207;
1986 cxxmin = 20;
1987 extra_cond = "__cpp_modules";
1988 };
1989 };
1990
1991 ftms = {
1992 name = indirect;
1993 values = {
1994 v = 202502;
1995 cxxmin = 26;
1996 hosted = yes;
1997 };
1998 };
1999
2000 ftms = {
2001 name = polymorphic;
2002 values = {
2003 v = 202502;
2004 cxxmin = 26;
2005 hosted = yes;
2006 };
2007 };
2008
2009 ftms = {
2010 name = smart_ptr_owner_equality;
2011 values = {
2012 v = 202306;
2013 cxxmin = 26;
2014 hosted = yes;
2015 };
2016 };
2017
2018 ftms = {
2019 name = sstream_from_string_view;
2020 values = {
2021 v = 202306;
2022 cxxmin = 26;
2023 hosted = yes;
2024 };
2025 };
2026
2027 ftms = {
2028 name = type_order;
2029 values = {
2030 v = 202506;
2031 cxxmin = 26;
2032 extra_cond = "__has_builtin(__builtin_type_order) "
2033 "&& __cpp_lib_three_way_comparison >= 201907L";
2034 };
2035 };
2036
2037 ftms = {
2038 name = exception_ptr_cast;
2039 values = {
2040 v = 202506;
2041 cxxmin = 26;
2042 };
2043 };
2044
2045 ftms = {
2046 name = bitset; // ...construct from string_view
2047 values = {
2048 v = 202306;
2049 cxxmin = 26;
2050 };
2051 };
2052
2053 ftms = {
2054 name = constexpr_exceptions;
2055 values = {
2056 v = 202411;
2057 cxxmin = 26;
2058 extra_cond = "__cpp_constexpr_exceptions >= 202411L";
2059 };
2060 };
2061
2062 // Standard test specifications.
2063 stds[97] = ">= 199711L";
2064 stds[03] = ">= 199711L";
2065 stds[11] = ">= 201103L";
2066 stds[14] = ">= 201402L";
2067 stds[17] = ">= 201703L";
2068 stds[20] = ">= 202002L";
2069 stds[23] = ">= 202100L"; // Should be 202302L but Clang 16 uses 202101L
2070 stds[26] = "> 202302L"; // TODO: update when finalized
2071
2072 // Local Variables:
2073 // compile-command: "autogen version.def"
2074 // End: