blob: dea4ab53d20306544087eb997f1efab74e3bf1b2 [file] [log] [blame]
Louis Dionne2ce0df42021-07-06 14:39:011.. _using-libcxx:
2
Eric Fiselierb17bb062015-08-22 19:40:493============
4Using libc++
5============
6
7.. contents::
8 :local:
9
Louis Dionne2ce0df42021-07-06 14:39:0110Usually, libc++ is packaged and shipped by a vendor through some delivery vehicle
11(operating system distribution, SDK, toolchain, etc) and users don't need to do
12anything special in order to use the library.
Eric Fiselierb17bb062015-08-22 19:40:4913
Louis Dionne2ce0df42021-07-06 14:39:0114This page contains information about configuration knobs that can be used by
15users when they know libc++ is used by their toolchain, and how to use libc++
16when it is not the default library used by their toolchain.
17
18
19Using a different version of the C++ Standard
20=============================================
21
22Libc++ implements the various versions of the C++ Standard. Changing the version of
23the standard can be done by passing ``-std=c++XY`` to the compiler. Libc++ will
24automatically detect what Standard is being used and will provide functionality that
25matches that Standard in the library.
Eric Fiselierb17bb062015-08-22 19:40:4926
27.. code-block:: bash
28
Louis Dionne2ce0df42021-07-06 14:39:0129 $ clang++ -std=c++17 test.cpp
Eric Fiselierb17bb062015-08-22 19:40:4930
Louis Dionne2ce0df42021-07-06 14:39:0131.. warning::
32 Using ``-std=c++XY`` with a version of the Standard that has not been ratified yet
33 is considered unstable. Libc++ reserves the right to make breaking changes to the
34 library until the standard has been ratified.
Eric Fiselierb17bb062015-08-22 19:40:4935
Eric Fiselier998a5c82018-07-27 03:07:0936
Louis Dionne7300a652022-07-19 14:44:0637Enabling experimental C++ Library features
38==========================================
Eric Fiselierb17bb062015-08-22 19:40:4939
Louis Dionne7300a652022-07-19 14:44:0640Libc++ provides implementations of some experimental features. Experimental features
41are either Technical Specifications (TSes) or official features that were voted to
42the Standard but whose implementation is not complete or stable yet in libc++. Those
43are disabled by default because they are neither API nor ABI stable. However, the
Louis Dionnedeb3b552022-07-20 14:42:0444``-fexperimental-library`` compiler flag can be defined to turn those features on.
Eric Fiselier539cd672016-05-03 22:32:0845
46.. warning::
Louis Dionnedeb3b552022-07-20 14:42:0447 Experimental libraries are experimental.
Louis Dionne7300a652022-07-19 14:44:0648 * The contents of the ``<experimental/...>`` headers and the associated static
Eric Fiselier539cd672016-05-03 22:32:0849 library will not remain compatible between versions.
50 * No guarantees of API or ABI stability are provided.
Louis Dionne2ce0df42021-07-06 14:39:0151 * When the standardized version of an experimental feature is implemented,
Louis Dionne776acf22019-06-11 14:48:4052 the experimental feature is removed two releases after the non-experimental
53 version has shipped. The full policy is explained :ref:`here <experimental features>`.
Eric Fiselierb17bb062015-08-22 19:40:4954
Louis Dionnedeb3b552022-07-20 14:42:0455.. note::
56 On compilers that do not support the ``-fexperimental-library`` flag, users can
57 define the ``_LIBCPP_ENABLE_EXPERIMENTAL`` macro and manually link against the
58 appropriate static library (usually shipped as ``libc++experimental.a``) to get
59 access to experimental library features.
60
Eric Fiselierb17bb062015-08-22 19:40:4961
Louis Dionne2ce0df42021-07-06 14:39:0162Using libc++ when it is not the system default
63==============================================
64
65On systems where libc++ is provided but is not the default, Clang provides a flag
66called ``-stdlib=`` that can be used to decide which standard library is used.
67Using ``-stdlib=libc++`` will select libc++:
Eric Fiselierb17bb062015-08-22 19:40:4968
69.. code-block:: bash
70
Louis Dionne2ce0df42021-07-06 14:39:0171 $ clang++ -stdlib=libc++ test.cpp
Eric Fiselierb17bb062015-08-22 19:40:4972
Louis Dionneff7a3322021-09-07 16:55:4873On systems where libc++ is the library in use by default such as macOS and FreeBSD,
74this flag is not required.
Louis Dionne2ce0df42021-07-06 14:39:0175
76
77.. _alternate libcxx:
78
79Using a custom built libc++
80===========================
81
82Most compilers provide a way to disable the default behavior for finding the
83standard library and to override it with custom paths. With Clang, this can
84be done with:
Eric Fiselierb17bb062015-08-22 19:40:4985
86.. code-block:: bash
87
Louis Dionne2ce0df42021-07-06 14:39:0188 $ clang++ -nostdinc++ -nostdlib++ \
89 -isystem <install>/include/c++/v1 \
90 -L <install>/lib \
91 -Wl,-rpath,<install>/lib \
92 -lc++ \
93 test.cpp
Eric Fiselierb17bb062015-08-22 19:40:4994
Louis Dionne2ce0df42021-07-06 14:39:0195The option ``-Wl,-rpath,<install>/lib`` adds a runtime library search path,
96which causes the system's dynamic linker to look for libc++ in ``<install>/lib``
97whenever the program is loaded.
Eric Fiselierb17bb062015-08-22 19:40:4998
Louis Dionne2ce0df42021-07-06 14:39:0199GCC does not support the ``-nostdlib++`` flag, so one must use ``-nodefaultlibs``
100instead. Since that removes all the standard system libraries and not just libc++,
101the system libraries must be re-added manually. For example:
Eric Fiselierb17bb062015-08-22 19:40:49102
103.. code-block:: bash
104
Louis Dionne2ce0df42021-07-06 14:39:01105 $ g++ -nostdinc++ -nodefaultlibs \
106 -isystem <install>/include/c++/v1 \
107 -L <install>/lib \
108 -Wl,-rpath,<install>/lib \
109 -lc++ -lc++abi -lm -lc -lgcc_s -lgcc \
110 test.cpp
Eric Fiselier19352b12016-01-20 01:26:30111
112
113GDB Pretty printers for libc++
Louis Dionne2ce0df42021-07-06 14:39:01114==============================
Eric Fiselier19352b12016-01-20 01:26:30115
Louis Dionne2ce0df42021-07-06 14:39:01116GDB does not support pretty-printing of libc++ symbols by default. However, libc++ does
117provide pretty-printers itself. Those can be used as:
Eric Fiselier19352b12016-01-20 01:26:30118
Louis Dionne2ce0df42021-07-06 14:39:01119.. code-block:: bash
Eric Fiselier19352b12016-01-20 01:26:30120
Louis Dionne2ce0df42021-07-06 14:39:01121 $ gdb -ex "source <libcxx>/utils/gdb/libcxx/printers.py" \
122 -ex "python register_libcxx_printer_loader()" \
123 <args>
Eric Fiselierefd48ca2016-11-13 23:00:30124
Christopher Di Bellaab466482022-11-17 07:36:37125.. _include-what-you-use:
126
127include-what-you-use (IWYU)
128===========================
129
130libc++ provides an IWYU `mapping file <https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/IWYUMappings.md>`,
131which drastically improves the accuracy of the tool when using libc++. To use the mapping file with
132IWYU, you should run the tool like so:
133
134.. code-block:: bash
135
136 $ include-what-you-use -Xiwyu /path/to/libcxx/include/libcxx.imp file.cpp
137
138If you would prefer to not use that flag, then you can replace ``/path/to/include-what-you-use/share/libcxx.imp```
139file with the libc++-provided ``libcxx.imp`` file.
Eric Fiselierefd48ca2016-11-13 23:00:30140
varconstf0dfe682023-07-14 23:58:15141.. _termination-handler:
Louis Dionneb0fd9492022-03-03 22:37:03142
varconstf0dfe682023-07-14 23:58:15143Overriding the default termination handler
144==========================================
Louis Dionneb0fd9492022-03-03 22:37:03145
varconstf0dfe682023-07-14 23:58:15146When the library wants to terminate due to an unforeseen condition (such as a hardening assertion
147failure), the program is aborted through a special verbose termination function. The library provides
148a default function that prints an error message and calls ``std::abort()``. Note that this function is
149provided by the static or shared library, so it is only available when deploying to a platform where
150the compiled library is sufficiently recent. On older platforms, the program will terminate in an
151unspecified unsuccessful manner, but the quality of diagnostics won't be great.
Louis Dionneb0fd9492022-03-03 22:37:03152
Louis Dionne17c05a42023-01-09 21:59:59153However, users can also override that mechanism at two different levels. First, the mechanism can be
varconstf0dfe682023-07-14 23:58:15154overridden at compile time by defining the ``_LIBCPP_VERBOSE_ABORT(format, args...)`` variadic macro.
Louis Dionne17c05a42023-01-09 21:59:59155When that macro is defined, it will be called with a format string as the first argument, followed by
156a series of arguments to format using printf-style formatting. Compile-time customization may be
varconstf0dfe682023-07-14 23:58:15157useful to get precise control over code generation, however it is also inconvenient to use in
Louis Dionne17c05a42023-01-09 21:59:59158some cases. Indeed, compile-time customization of the verbose termination function requires that all
159translation units be compiled with a consistent definition for ``_LIBCPP_VERBOSE_ABORT`` to avoid ODR
160violations, which can add complexity in the build system of users.
Louis Dionneb0fd9492022-03-03 22:37:03161
Louis Dionne17c05a42023-01-09 21:59:59162Otherwise, if compile-time customization is not necessary, link-time customization of the handler is also
163possible, similarly to how replacing ``operator new`` works. This mechanism trades off fine-grained control
varconstf0dfe682023-07-14 23:58:15164over the call site where the termination is initiated in exchange for better ergonomics. Link-time
165customization is done by simply defining the following function in exactly one translation unit of your
166program:
Louis Dionneb0fd9492022-03-03 22:37:03167
168.. code-block:: cpp
169
Louis Dionne507125a2022-07-25 17:43:47170 void __libcpp_verbose_abort(char const* format, ...)
Louis Dionneb0fd9492022-03-03 22:37:03171
172This mechanism is similar to how one can replace the default definition of ``operator new``
173and ``operator delete``. For example:
174
175.. code-block:: cpp
176
177 // In HelloWorldHandler.cpp
Louis Dionne507125a2022-07-25 17:43:47178 #include <version> // must include any libc++ header before defining the function (C compatibility headers excluded)
Louis Dionneb0fd9492022-03-03 22:37:03179
Louis Dionne507125a2022-07-25 17:43:47180 void std::__libcpp_verbose_abort(char const* format, ...) {
Louis Dionne7de5aca2022-07-25 17:19:51181 va_list list;
182 va_start(list, format);
183 std::vfprintf(stderr, format, list);
184 va_end(list);
185
Louis Dionneb0fd9492022-03-03 22:37:03186 std::abort();
187 }
188
189 // In HelloWorld.cpp
190 #include <vector>
191
192 int main() {
193 std::vector<int> v;
varconstf0dfe682023-07-14 23:58:15194 int& x = v[0]; // Your termination function will be called here if hardening is enabled.
Louis Dionneb0fd9492022-03-03 22:37:03195 }
196
Louis Dionne507125a2022-07-25 17:43:47197Also note that the verbose termination function should never return. Since assertions in libc++
198catch undefined behavior, your code will proceed with undefined behavior if your function is called
199and does return.
Louis Dionneb0fd9492022-03-03 22:37:03200
Louis Dionne507125a2022-07-25 17:43:47201Furthermore, exceptions should not be thrown from the function. Indeed, many functions in the
202library are ``noexcept``, and any exception thrown from the termination function will result
203in ``std::terminate`` being called.
Louis Dionneb0fd9492022-03-03 22:37:03204
Eric Fiselierefd48ca2016-11-13 23:00:30205Libc++ Configuration Macros
206===========================
207
208Libc++ provides a number of configuration macros which can be used to enable
varconstf0dfe682023-07-14 23:58:15209or disable extended libc++ behavior, including enabling hardening or thread
210safety annotations.
Eric Fiselierefd48ca2016-11-13 23:00:30211
Eric Fiselierefd48ca2016-11-13 23:00:30212**_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS**:
213 This macro is used to enable -Wthread-safety annotations on libc++'s
Jennifer Chukwu21bef4e2021-04-17 15:04:06214 ``std::mutex`` and ``std::lock_guard``. By default, these annotations are
Eric Fiselierefd48ca2016-11-13 23:00:30215 disabled and must be manually enabled by the user.
Shoaib Meenaifc6100c2016-12-05 19:40:12216
varconstf0dfe682023-07-14 23:58:15217**_LIBCPP_ENABLE_HARDENED_MODE**:
218 This macro is used to enable the :ref:`hardened mode <using-hardened-mode>`.
219
220**_LIBCPP_ENABLE_DEBUG_MODE**:
221 This macro is used to enable the :ref:`debug mode <using-hardened-mode>`.
222
Shoaib Meenaifc6100c2016-12-05 19:40:12223**_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS**:
224 This macro is used to disable all visibility annotations inside libc++.
225 Defining this macro and then building libc++ with hidden visibility gives a
226 build of libc++ which does not export any symbols, which can be useful when
227 building statically for inclusion into another library.
Eric Fiselierbd688252016-12-08 23:57:08228
Eric Fiselierb1e7a122017-01-13 22:02:08229**_LIBCPP_DISABLE_ADDITIONAL_DIAGNOSTICS**:
230 This macro disables the additional diagnostics generated by libc++ using the
231 `diagnose_if` attribute. These additional diagnostics include checks for:
232
Louis Dionne3560fbf32018-12-06 21:46:17233 * Giving `set`, `map`, `multiset`, `multimap` and their `unordered_`
234 counterparts a comparator which is not const callable.
235 * Giving an unordered associative container a hasher that is not const
236 callable.
Eric Fiselierb1e7a122017-01-13 22:02:08237
Shoaib Meenai492d7132017-10-09 19:25:17238**_LIBCPP_NO_VCRUNTIME**:
239 Microsoft's C and C++ headers are fairly entangled, and some of their C++
240 headers are fairly hard to avoid. In particular, `vcruntime_new.h` gets pulled
241 in from a lot of other headers and provides definitions which clash with
242 libc++ headers, such as `nothrow_t` (note that `nothrow_t` is a struct, so
243 there's no way for libc++ to provide a compatible definition, since you can't
244 have multiple definitions).
245
246 By default, libc++ solves this problem by deferring to Microsoft's vcruntime
247 headers where needed. However, it may be undesirable to depend on vcruntime
248 headers, since they may not always be available in cross-compilation setups,
249 or they may clash with other headers. The `_LIBCPP_NO_VCRUNTIME` macro
250 prevents libc++ from depending on vcruntime headers. Consequently, it also
251 prevents libc++ headers from being interoperable with vcruntime headers (from
252 the aforementioned clashes), so users of this macro are promising to not
253 attempt to combine libc++ headers with the problematic vcruntime headers. This
254 macro also currently prevents certain `operator new`/`operator delete`
255 replacement scenarios from working, e.g. replacing `operator new` and
256 expecting a non-replaced `operator new[]` to call the replaced `operator new`.
257
Nikolas Klauser3c355e22022-09-01 10:02:58258**_LIBCPP_DISABLE_NODISCARD_EXT**:
259 This macro disables library-extensions of ``[[nodiscard]]``.
Nikolas Klauserb978dfb2022-08-19 13:41:56260 See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>` for more information.
Roman Lebedevc65d39a2018-09-22 17:54:48261
Louis Dionnea470a132019-03-12 20:10:06262**_LIBCPP_DISABLE_DEPRECATION_WARNINGS**:
263 This macro disables warnings when using deprecated components. For example,
264 using `std::auto_ptr` when compiling in C++11 mode will normally trigger a
265 warning saying that `std::auto_ptr` is deprecated. If the macro is defined,
266 no warning will be emitted. By default, this macro is not defined.
Roman Lebedevc65d39a2018-09-22 17:54:48267
Eric Fiselier2a1bfa92017-02-17 03:25:08268C++17 Specific Configuration Macros
269-----------------------------------
270**_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES**:
271 This macro is used to re-enable all the features removed in C++17. The effect
272 is equivalent to manually defining each macro listed below.
273
Eric Fiselier07e93d32017-02-17 03:30:25274**_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR**:
Arthur O'Dwyerd42d9e12021-05-24 22:36:17275 This macro is used to re-enable `auto_ptr`.
276
277**_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS**:
278 This macro is used to re-enable the `binder1st`, `binder2nd`,
279 `pointer_to_unary_function`, `pointer_to_binary_function`, `mem_fun_t`,
280 `mem_fun1_t`, `mem_fun_ref_t`, `mem_fun1_ref_t`, `const_mem_fun_t`,
281 `const_mem_fun1_t`, `const_mem_fun_ref_t`, and `const_mem_fun1_ref_t`
282 class templates, and the `bind1st`, `bind2nd`, `mem_fun`, `mem_fun_ref`,
283 and `ptr_fun` functions.
284
285**_LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE**:
286 This macro is used to re-enable the `random_shuffle` algorithm.
287
288**_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS**:
289 This macro is used to re-enable `set_unexpected`, `get_unexpected`, and
290 `unexpected`.
Roman Lebedevc65d39a2018-09-22 17:54:48291
Mark de Wever8aa59652022-07-07 17:07:03292C++20 Specific Configuration Macros
293-----------------------------------
Roman Lebedevc65d39a2018-09-22 17:54:48294**_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17**:
295 This macro can be used to disable diagnostics emitted from functions marked
296 ``[[nodiscard]]`` in dialects after C++17. See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>`
297 for more information.
298
Arthur O'Dwyerd42d9e12021-05-24 22:36:17299**_LIBCPP_ENABLE_CXX20_REMOVED_FEATURES**:
300 This macro is used to re-enable all the features removed in C++20. The effect
301 is equivalent to manually defining each macro listed below.
302
303**_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS**:
304 This macro is used to re-enable redundant members of `allocator<T>`,
305 including `pointer`, `reference`, `rebind`, `address`, `max_size`,
306 `construct`, `destroy`, and the two-argument overload of `allocate`.
Arthur O'Dwyerd42d9e12021-05-24 22:36:17307
Ilya Biryukov374f9382022-06-15 08:55:55308**_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_VOID_SPECIALIZATION**:
309 This macro is used to re-enable the library-provided specializations of
310 `allocator<void>` and `allocator<const void>`.
311 Use it in conjunction with `_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS`
312 to ensure that removed members of `allocator<void>` can be accessed.
313
Arthur O'Dwyerdc066882021-05-25 18:34:18314**_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS**:
315 This macro is used to re-enable the `argument_type`, `result_type`,
316 `first_argument_type`, and `second_argument_type` members of class
317 templates such as `plus`, `logical_not`, `hash`, and `owner_less`.
318
Arthur O'Dwyerd42d9e12021-05-24 22:36:17319**_LIBCPP_ENABLE_CXX20_REMOVED_NEGATORS**:
320 This macro is used to re-enable `not1`, `not2`, `unary_negate`,
321 and `binary_negate`.
322
323**_LIBCPP_ENABLE_CXX20_REMOVED_RAW_STORAGE_ITERATOR**:
324 This macro is used to re-enable `raw_storage_iterator`.
325
wmbat2ff5a562021-07-02 17:08:36326**_LIBCPP_ENABLE_CXX20_REMOVED_TYPE_TRAITS**:
Louis Dionne2ce0df42021-07-06 14:39:01327 This macro is used to re-enable `is_literal_type`, `is_literal_type_v`,
wmbat2ff5a562021-07-02 17:08:36328 `result_of` and `result_of_t`.
Roman Lebedevc65d39a2018-09-22 17:54:48329
Louis Dionne2ce0df42021-07-06 14:39:01330
Roman Lebedevc65d39a2018-09-22 17:54:48331Libc++ Extensions
332=================
333
334This section documents various extensions provided by libc++, how they're
335provided, and any information regarding how to use them.
336
337.. _nodiscard extension:
338
339Extended applications of ``[[nodiscard]]``
340------------------------------------------
341
342The ``[[nodiscard]]`` attribute is intended to help users find bugs where
343function return values are ignored when they shouldn't be. After C++17 the
344C++ standard has started to declared such library functions as ``[[nodiscard]]``.
345However, this application is limited and applies only to dialects after C++17.
346Users who want help diagnosing misuses of STL functions may desire a more
347liberal application of ``[[nodiscard]]``.
348
349For this reason libc++ provides an extension that does just that! The
Nikolas Klauser3c355e22022-09-01 10:02:58350extension is enabled by default and can be disabled by defining ``_LIBCPP_DISABLE_NODISCARD_EXT``.
351The extended applications of ``[[nodiscard]]`` takes two forms:
Roman Lebedevc65d39a2018-09-22 17:54:48352
3531. Backporting ``[[nodiscard]]`` to entities declared as such by the
354 standard in newer dialects, but not in the present one.
355
Arthur O'Dwyer4b7bad92021-04-05 18:56:033562. Extended applications of ``[[nodiscard]]``, at the library's discretion,
Roman Lebedevc65d39a2018-09-22 17:54:48357 applied to entities never declared as such by the standard.
358
Roman Lebedevc65d39a2018-09-22 17:54:48359Entities declared with ``_LIBCPP_NODISCARD_EXT``
360~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
361
362This section lists all extended applications of ``[[nodiscard]]`` to entities
363which no dialect declares as such (See the second form described above).
364
Nico Weber1362d7e2019-04-03 18:13:08365* ``adjacent_find``
366* ``all_of``
367* ``any_of``
Mark de Wever9c053e62023-06-04 12:37:20368* ``as_const``
Nico Weber1362d7e2019-04-03 18:13:08369* ``binary_search``
Mark de Wever9c053e62023-06-04 12:37:20370* ``bit_cast``
Nikolas Klauser7d3bba52023-06-13 14:57:26371* ``bit_ceil``
372* ``bit_floor``
373* ``bit_width``
374* ``byteswap``
Mark de Wever9c053e62023-06-04 12:37:20375* ``cbrt``
376* ``ceil``
Nico Weber1362d7e2019-04-03 18:13:08377* ``clamp``
Mark de Wever9c053e62023-06-04 12:37:20378* ``copysign``
Nico Weber1362d7e2019-04-03 18:13:08379* ``count_if``
380* ``count``
Nikolas Klauser7d3bba52023-06-13 14:57:26381* ``countl_zero``
382* ``countl_one``
383* ``countr_zero``
384* ``countr_one``
Nico Weber1362d7e2019-04-03 18:13:08385* ``equal_range``
386* ``equal``
Mark de Wever9c053e62023-06-04 12:37:20387* ``fabs``
Nico Weber1362d7e2019-04-03 18:13:08388* ``find_end``
389* ``find_first_of``
390* ``find_if_not``
391* ``find_if``
392* ``find``
Mark de Wever9c053e62023-06-04 12:37:20393* ``floor``
394* ``fmax``
395* ``fmin``
396* ``forward``
397* ``fpclassify``
Roman Lebedevc65d39a2018-09-22 17:54:48398* ``get_temporary_buffer``
Nikolas Klauser7d3bba52023-06-13 14:57:26399* ``has_single_bit``
Mark de Wever9c053e62023-06-04 12:37:20400* ``identity::operator()``
Nico Weber1362d7e2019-04-03 18:13:08401* ``includes``
402* ``is_heap_until``
403* ``is_heap``
404* ``is_partitioned``
405* ``is_permutation``
406* ``is_sorted_until``
407* ``is_sorted``
Mark de Wever9c053e62023-06-04 12:37:20408* ``isfinite``
409* ``isgreater``
410* ``isgreaterequal``
411* ``isinf``
412* ``isless``
413* ``islessequal``
414* ``islessgreater``
415* ``isnan``
416* ``isnormal``
417* ``isunordered``
Nico Weber1362d7e2019-04-03 18:13:08418* ``lexicographical_compare``
Mark de Wever9c053e62023-06-04 12:37:20419* ``lock_guard``'s constructors
Nico Weber1362d7e2019-04-03 18:13:08420* ``lower_bound``
Mark de Wever9c053e62023-06-04 12:37:20421* ``make_format_args``
422* ``make_wformat_args``
Nico Weber1362d7e2019-04-03 18:13:08423* ``max_element``
424* ``max``
425* ``min_element``
426* ``min``
427* ``minmax_element``
428* ``minmax``
429* ``mismatch``
Mark de Wever9c053e62023-06-04 12:37:20430* ``move_if_noexcept``
431* ``move``
432* ``nearbyint``
Nico Weber1362d7e2019-04-03 18:13:08433* ``none_of``
Nikolas Klauser7d3bba52023-06-13 14:57:26434* ``popcount``
Nikolas Klauser660b2432022-11-01 19:06:11435* ``ranges::adjacent_find``
436* ``ranges::all_of``
437* ``ranges::any_of``
438* ``ranges::binary_search``
439* ``ranges::clamp``
440* ``ranges::count_if``
441* ``ranges::count``
442* ``ranges::equal_range``
443* ``ranges::equal``
444* ``ranges::find_end``
445* ``ranges::find_first_of``
446* ``ranges::find_if_not``
447* ``ranges::find_if``
448* ``ranges::find``
449* ``ranges::get_temporary_buffer``
450* ``ranges::includes``
451* ``ranges::is_heap_until``
452* ``ranges::is_heap``
453* ``ranges::is_partitioned``
454* ``ranges::is_permutation``
455* ``ranges::is_sorted_until``
456* ``ranges::is_sorted``
457* ``ranges::lexicographical_compare``
458* ``ranges::lower_bound``
459* ``ranges::max_element``
460* ``ranges::max``
461* ``ranges::min_element``
462* ``ranges::min``
463* ``ranges::minmax_element``
464* ``ranges::minmax``
465* ``ranges::mismatch``
466* ``ranges::none_of``
467* ``ranges::remove_if``
468* ``ranges::remove``
469* ``ranges::search_n``
470* ``ranges::search``
471* ``ranges::unique``
472* ``ranges::upper_bound``
Mark de Wever9c053e62023-06-04 12:37:20473* ``remove_if``
474* ``remove``
Nikolas Klauser633927d2022-12-25 19:13:39475* ``rint``
476* ``round``
Mark de Wever9c053e62023-06-04 12:37:20477* ``search_n``
478* ``search``
479* ``signbit``
480* ``to_integer``
481* ``to_underlying``
Nikolas Klauser633927d2022-12-25 19:13:39482* ``trunc``
Mark de Wever9c053e62023-06-04 12:37:20483* ``unique``
484* ``upper_bound``
485* ``vformat``
Louis Dionne07e984b2022-06-01 19:25:14486
Louis Dionne497705f2022-08-10 21:34:45487Extended integral type support
488------------------------------
489
490Several platforms support types that are not specified in the Standard, such as
491the 128-bit integral types ``__int128_t`` and ``__uint128_t``. As an extension,
492libc++ does a best-effort attempt to support these types like other integral
493types, by supporting them notably in:
494
495* ``<bits>``
496* ``<charconv>``
497* ``<functional>``
498* ``<type_traits>``
499* ``<format>``
500* ``<random>``
501
Louis Dionne07e984b2022-06-01 19:25:14502Additional types supported in random distributions
503~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
504
505The `C++ Standard <http://eel.is/c++draft/rand#req.genl-1.5>`_ mentions that instantiating several random number
506distributions with types other than ``short``, ``int``, ``long``, ``long long``, and their unsigned versions is
507undefined. As an extension, libc++ supports instantiating ``binomial_distribution``, ``discrete_distribution``,
508``geometric_distribution``, ``negative_binomial_distribution``, ``poisson_distribution``, and ``uniform_int_distribution``
509with ``int8_t``, ``__int128_t`` and their unsigned versions.
Mark de Wever77ccf632022-07-07 18:02:07510
Mark de Weverf7127752022-07-15 05:42:17511Extensions to ``<format>``
512--------------------------
513
514The exposition only type ``basic-format-string`` and its typedefs
515``format-string`` and ``wformat-string`` became ``basic_format_string``,
516``format_string``, and ``wformat_string`` in C++23. Libc++ makes these types
517available in C++20 as an extension.
Mark de Wever68c3d662023-02-21 16:33:56518
519For padding Unicode strings the ``format`` library relies on the Unicode
520Standard. Libc++ retroactively updates the Unicode Standard in older C++
521versions. This allows the library to have better estimates for newly introduced
522Unicode code points, without requiring the user to use the latest C++ version
523in their code base.
Mark de Wever7da669d2023-06-27 16:39:59524
Mark de Wevera9e57732022-04-03 15:43:52525In C++26 formatting pointers gained a type ``P`` and allows to use
526zero-padding. These options have been retroactively applied to C++20.
527
Mark de Wever44d17cd2023-07-09 15:54:11528.. _turning-off-asan:
529
Advenam Tacet2fa1bec2023-05-04 21:16:06530Turning off ASan annotation in containers
Mark de Wever7da669d2023-06-27 16:39:59531-----------------------------------------
Advenam Tacet2fa1bec2023-05-04 21:16:06532
533``__asan_annotate_container_with_allocator`` is a customization point to allow users to disable
534`Address Sanitizer annotations for containers <https://github.com/google/sanitizers/wiki/AddressSanitizerContainerOverflow>`_ for specific allocators. This may be necessary for allocators that access allocated memory.
535This customization point exists only when ``_LIBCPP_HAS_ASAN_CONTAINER_ANNOTATIONS_FOR_ALL_ALLOCATORS`` Feature Test Macro is defined.
536
537For allocators not running destructors, it is also possible to `bulk-unpoison memory <https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning>`_ instead of disabling annotations altogether.
538
539The struct may be specialized for user-defined allocators. It is a `Cpp17UnaryTypeTrait <http://eel.is/c++draft/type.traits#meta.rqmts>`_ with a base characteristic of ``true_type`` if the container is allowed to use annotations and ``false_type`` otherwise.
540
541The annotations for a ``user_allocator`` can be disabled like this:
542
543.. code-block:: cpp
544
545 #ifdef _LIBCPP_HAS_ASAN_CONTAINER_ANNOTATIONS_FOR_ALL_ALLOCATORS
546 template <class T>
547 struct std::__asan_annotate_container_with_allocator<user_allocator<T>> : std::false_type {};
548 #endif
549
550Why may I want to turn it off?
Mark de Wever7da669d2023-06-27 16:39:59551~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Advenam Tacet2fa1bec2023-05-04 21:16:06552
553There are a few reasons why you may want to turn off annotations for an allocator.
554Unpoisoning may not be an option, if (for example) you are not maintaining the allocator.
555
556* You are using allocator, which does not call destructor during deallocation.
557* You are aware that memory allocated with an allocator may be accessed, even when unused by container.
Martin Storsjöfcbbd962023-03-15 10:11:28558
559Platform specific behavior
560==========================
561
562Windows
563-------
564
565The ``stdout``, ``stderr``, and ``stdin`` file streams can be placed in
566Unicode mode by a suitable call to ``_setmode()``. When in this mode,
567the sequence of bytes read from, or written to, these streams is interpreted
568as a sequence of little-endian ``wchar_t`` elements. Thus, use of
569``std::cout``, ``std::cerr``, or ``std::cin`` with streams in Unicode mode
570will not behave as they usually do since bytes read or written won't be
571interpreted as individual ``char`` elements. However, ``std::wcout``,
572``std::wcerr``, and ``std::wcin`` will behave as expected.
573
574Wide character stream such as ``std::wcin`` or ``std::wcout`` imbued with a
575locale behave differently than they otherwise do. By default, wide character
576streams don't convert wide characters but input/output them as is. If a
577specific locale is imbued, the IO with the underlying stream happens with
578regular ``char`` elements, which are converted to/from wide characters
579according to the locale. Note that this doesn't behave as expected if the
580stream has been set in Unicode mode.