summaryrefslogtreecommitdiff
path: root/chromium/styleguide/c++/c++-features.md
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/styleguide/c++/c++-features.md')
-rw-r--r--chromium/styleguide/c++/c++-features.md1939
1 files changed, 1939 insertions, 0 deletions
diff --git a/chromium/styleguide/c++/c++-features.md b/chromium/styleguide/c++/c++-features.md
new file mode 100644
index 00000000000..8174319de06
--- /dev/null
+++ b/chromium/styleguide/c++/c++-features.md
@@ -0,0 +1,1939 @@
+# Modern C++ use in Chromium
+
+_This document is part of the more general
+[Chromium C++ style guide](https://chromium.googlesource.com/chromium/src/+/main/styleguide/c++/c++.md).
+It summarizes the supported state of new and updated language and library
+features in recent C++ standards and the [Abseil](https://abseil.io/about/)
+library. This guide applies to both Chromium and its subprojects, though
+subprojects can choose to be more restrictive if necessary for toolchain
+support._
+
+The C++ language has in recent years received an updated standard every three
+years (C++11, C++14, etc.). For various reasons, Chromium does not immediately
+allow new features on the publication of such a standard. Instead, once
+toolchain support is sufficient, a standard is declared "initially supported",
+with new language/library features banned pending discussion.
+
+You can propose changing the status of a feature by sending an email to
+[cxx@chromium.org](https://groups.google.com/a/chromium.org/forum/#!forum/cxx).
+Include a short blurb on what the feature is and why you think it should or
+should not be allowed, along with links to any relevant previous discussion. If
+the list arrives at some consensus, send a codereview to change this file
+accordingly, linking to your discussion thread.
+
+If an item remains on the TBD list two years after initial support is added,
+style arbiters should explicitly move it to an appropriate allowlist or
+blocklist, allowing it if there are no obvious reasons to ban.
+
+The current status of existing standards and Abseil features is:
+
+* **C++11:** _Default allowed; see banned features below_
+* **C++14:** _Default allowed; see banned features below_
+* **C++17:** Initially supported December 23, 2021; see allowed/banned/TBD
+ features below
+* **C++20:** _Not yet supported in Chromium_
+* **C++23:** _Not yet standardized_
+* **Abseil:** Initially supported July 31, 2020; see allowed/banned/TBD
+ features below
+ * absl::StatusOr: Initially supported September 3, 2020
+ * absl::Cleanup: Initially supported February 4, 2021
+
+[TOC]
+
+## C++11 Banned Language Features {#core-blocklist-11}
+
+The following C++11 language features are not allowed in the Chromium codebase.
+
+### Inline Namespaces <sup>[banned]</sup>
+
+```c++
+inline namespace foo { ... }
+```
+
+**Description:** Allows better versioning of namespaces.
+
+**Documentation:**
+[Inline namespaces](https://en.cppreference.com/w/cpp/language/namespace#Inline_namespaces)
+
+**Notes:**
+*** promo
+Banned in the
+[Google Style Guide](https://google.github.io/styleguide/cppguide.html#Namespaces).
+Unclear how it will work with components.
+***
+
+### long long Type <sup>[banned]</sup>
+
+```c++
+long long var = value;
+```
+
+**Description:** An integer of at least 64 bits.
+
+**Documentation:**
+[Fundamental types](https://en.cppreference.com/w/cpp/language/types)
+
+**Notes:**
+*** promo
+Use a stdint.h type if you need a 64-bit number.
+[Discussion thread](https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/RxugZ-pIDxk)
+***
+
+### User-Defined Literals <sup>[banned]</sup>
+
+```c++
+type var = literal_value_type;
+```
+
+**Description:** Allows user-defined literal expressions.
+
+**Documentation:**
+[User-defined literals](https://en.cppreference.com/w/cpp/language/user_literal)
+
+**Notes:**
+*** promo
+Banned in the
+[Google Style Guide](https://google.github.io/styleguide/cppguide.html#Operator_Overloading).
+***
+
+### thread_local Storage Class <sup>[banned]</sup>
+
+```c++
+thread_local int foo = 1;
+```
+
+**Description:** Puts variables into thread local storage.
+
+**Documentation:**
+[Storage duration](https://en.cppreference.com/w/cpp/language/storage_duration)
+
+**Notes:**
+*** promo
+Some surprising effects on Mac
+([discussion](https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/2msN8k3Xzgs),
+[fork](https://groups.google.com/a/chromium.org/forum/#!topic/cxx/h7O5BdtWCZw)).
+Use `base::SequenceLocalStorageSlot` for sequence support, and
+`base::ThreadLocal`/`base::ThreadLocalStorage` otherwise.
+***
+
+## C++11 Banned Library Features {#library-blocklist-11}
+
+The following C++11 library features are not allowed in the Chromium codebase.
+
+### Bind Operations <sup>[banned]</sup>
+
+```c++
+std::bind(function, args, ...)
+```
+
+**Description:** Declares a function object bound to certain arguments
+
+**Documentation:**
+[std::bind](https://en.cppreference.com/w/cpp/utility/functional/bind)
+
+**Notes:**
+*** promo
+Use `base::Bind` instead. Compared to `std::bind`, `base::Bind` helps prevent
+lifetime issues by preventing binding of capturing lambdas and by forcing
+callers to declare raw pointers as `Unretained`.
+[Discussion thread](https://groups.google.com/a/chromium.org/forum/#!topic/cxx/SoEj7oIDNuA)
+***
+
+### C Floating-Point Environment <sup>[banned]</sup>
+
+```c++
+#include <cfenv>
+#include <fenv.h>
+```
+
+**Description:** Provides floating point status flags and control modes for
+C-compatible code
+
+**Documentation:**
+[Standard library header "cfenv"](https://en.cppreference.com/w/cpp/header/cfenv)
+
+**Notes:**
+*** promo
+Banned by the
+[Google Style Guide](https://google.github.io/styleguide/cppguide.html#C++11)
+due to concerns about compiler support.
+***
+
+### Date and time utilities <sup>[banned]</sup>
+
+```c++
+#include <chrono>
+```
+
+**Description:** A standard date and time library
+
+**Documentation:**
+[Date and time utilities](https://en.cppreference.com/w/cpp/chrono)
+
+**Notes:**
+*** promo
+Overlaps with `Time` APIs in `base/`. Keep using the `base/` classes.
+***
+
+### Exceptions <sup>[banned]</sup>
+
+```c++
+#include <exception>
+```
+
+**Description:** Enhancements to exception throwing and handling
+
+**Documentation:**
+[Standard library header "exception"](https://en.cppreference.com/w/cpp/header/exception)
+
+**Notes:**
+*** promo
+Exceptions are banned by the
+[Google Style Guide](https://google.github.io/styleguide/cppguide.html#Exceptions)
+and disabled in Chromium compiles. However, the `noexcept` specifier is
+explicitly allowed.
+[Discussion thread](https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/8i4tMqNpHhg)
+***
+
+### Function Objects <sup>[banned]</sup>
+
+```c++
+std::function
+```
+
+**Description:** Wraps a standard polymorphic function
+
+**Documentation:**
+[std::function](https://en.cppreference.com/w/cpp/utility/functional/function)
+
+**Notes:**
+*** promo
+Use `base::{Once,Repeating}Callback` instead. Compared to `std::function`,
+`base::{Once,Repeating}Callback` directly supports Chromium's refcounting
+classes and weak pointers and deals with additional thread safety concerns.
+[Discussion thread](https://groups.google.com/a/chromium.org/forum/#!topic/cxx/SoEj7oIDNuA)
+***
+
+### Random Number Engines <sup>[banned]</sup>
+
+*** aside
+The random number engines defined in `<random>` (see separate item for random
+number distributions), e.g.: `linear_congruential_engine`,
+`mersenne_twister_engine`, `minstd_rand0`, `mt19937`, `ranlinux48`,
+`random_device`
+***
+
+**Description:** Random number generation algorithms and utilities.
+
+**Documentation:**
+[Pseudo-random number generation](https://en.cppreference.com/w/cpp/numeric/random)
+
+**Notes:**
+*** promo
+Do not use any random number engines from `<random>`. Instead, use
+`base::RandomBitGenerator`.
+[Discussion thread](https://groups.google.com/a/chromium.org/forum/#!topic/cxx/16Xmw05C-Y0)
+***
+
+### Ratio Template Class <sup>[banned]</sup>
+
+```c++
+std::ratio<numerator, denominator>
+```
+
+**Description:** Provides compile-time rational numbers
+
+**Documentation:**
+[std::ratio](https://en.cppreference.com/w/cpp/numeric/ratio/ratio)
+
+**Notes:**
+*** promo
+Banned by the
+[Google Style Guide](https://google.github.io/styleguide/cppguide.html#C++11)
+due to concerns that this is tied to a more template-heavy interface style.
+***
+
+### Regular Expressions <sup>[banned]</sup>
+
+```c++
+#include <regex>
+```
+
+**Description:** A standard regular expressions library
+
+**Documentation:**
+[Regular expressions library](https://en.cppreference.com/w/cpp/regex)
+
+**Notes:**
+*** promo
+Overlaps with many regular expression libraries in Chromium. When in doubt, use
+`re2`.
+***
+
+### Shared Pointers <sup>[banned]</sup>
+
+```c++
+std::shared_ptr
+```
+
+**Description:** Allows shared ownership of a pointer through reference counts
+
+**Documentation:**
+[std::shared_ptr](https://en.cppreference.com/w/cpp/memory/shared_ptr)
+
+**Notes:**
+*** promo
+Needs a lot more evaluation for Chromium, and there isn't enough of a push for
+this feature.
+
+* [Google Style Guide](https://google.github.io/styleguide/cppguide.html#Ownership_and_Smart_Pointers).
+* [Discussion Thread](https://groups.google.com/a/chromium.org/forum/#!topic/cxx/aT2wsBLKvzI)
+***
+
+### String-Number Conversion Functions <sup>[banned]</sup>
+
+```c++
+std::stoi()
+std::stol()
+std::stoul()
+std::stoll
+std::stoull()
+std::stof()
+std::stod()
+std::stold()
+std::to_string()
+```
+
+**Description:** Converts strings to/from numbers
+
+**Documentation:**
+* [std::stoi, std::stol, std::stoll](https://en.cppreference.com/w/cpp/string/basic_string/stol),
+* [std::stoul, std::stoull](https://en.cppreference.com/w/cpp/string/basic_string/stoul),
+* [std::stof, std::stod, std::stold](https://en.cppreference.com/w/cpp/string/basic_string/stof),
+* [std::to_string](https://en.cppreference.com/w/cpp/string/basic_string/to_string)
+
+**Notes:**
+*** promo
+The string-to-number conversions rely on exceptions to communicate failure,
+while the number-to-string conversions have performance concerns and depend on
+the locale. Use the routines in `base/strings/string_number_conversions.h`
+instead.
+***
+
+### Thread Library <sup>[banned]</sup>
+
+*** aside
+`<thread>` and related headers, including `<future>`, `<mutex>`,
+`<condition_variable>`
+***
+
+**Description:** Provides a standard multithreading library using `std::thread`
+and associates
+
+**Documentation:**
+[Thread support library](https://en.cppreference.com/w/cpp/thread)
+
+**Notes:**
+*** promo
+Overlaps with many classes in `base/`. Keep using the `base/` classes for now.
+`base::Thread` is tightly coupled to `MessageLoop` which would make it hard to
+replace. We should investigate using standard mutexes, or unique_lock, etc. to
+replace our locking/synchronization classes.
+***
+
+### Weak Pointers <sup>[banned]</sup>
+
+```c++
+std::weak_ptr
+```
+
+**Description:** Allows a weak reference to a `std::shared_ptr`
+
+**Documentation:**
+[std::weak_ptr](https://en.cppreference.com/w/cpp/memory/weak_ptr)
+
+**Notes:**
+*** promo
+Banned because `std::shared_ptr` is banned. Use `base::WeakPtr` instead.
+***
+
+## C++14 Banned Library Features {#library-blocklist-14}
+
+The following C++14 library features are not allowed in the Chromium codebase.
+
+### std::chrono literals <sup>[banned]</sup>
+
+```c++
+using namespace std::chrono_literals;
+auto timeout = 30s;
+```
+
+**Description:** Allows `std::chrono` types to be more easily constructed.
+
+**Documentation:**
+[std::literals::chrono_literals::operator""s](https://en.cppreference.com/w/cpp/chrono/operator%22%22s)
+
+**Notes:**
+*** promo
+Banned because `<chrono>` is banned.
+***
+
+## C++17 Allowed Language Features {#core-allowlist-17}
+
+The following C++17 language features are allowed in the Chromium codebase.
+
+### Nested namespaces <sup>[allowed]</sup>
+
+```c++
+namespace A::B::C { ...
+```
+
+**Description:** Using the namespace resolution operator to create nested
+namespace definitions.
+
+**Documentation:**
+[Namespaces](https://en.cppreference.com/w/cpp/language/namespace)
+
+**Notes:**
+*** promo
+[Discussion thread](https://groups.google.com/a/chromium.org/g/cxx/c/gLdR3apDSmg/)
+***
+
+### Template argument deduction for class templates <sup>[allowed]</sup>
+
+```c++
+template <typename T>
+struct MyContainer {
+ MyContainer(T val) : val{val} {}
+ // ...
+};
+MyContainer c1(1); // Type deduced to be `int`.
+```
+
+**Description:** Automatic template argument deduction much like how it's done
+for functions, but now including class constructors.
+
+**Documentation:**
+[Class template argument deduction](https://en.cppreference.com/w/cpp/language/class_template_argument_deduction)
+
+**Notes:**
+*** promo
+Usage is governed by the
+[Google Style Guide](https://google.github.io/styleguide/cppguide.html#CTAD).
+***
+
+### Selection statements with initializer <sup>[allowed]</sup>
+
+```c++
+if (int a = Func(); a < 3) { ...
+switch (int a = Func(); a) { ...
+```
+
+**Description:** New versions of the if and switch statements which simplify
+common code patterns and help users keep scopes tight.
+
+**Documentation:**
+[if statement](https://en.cppreference.com/w/cpp/language/if),
+[switch statement](https://en.cppreference.com/w/cpp/language/switch)
+
+**Notes:**
+*** promo
+[@cxx discussion thread](https://groups.google.com/a/chromium.org/g/cxx/c/4GP43nftePE)
+***
+
+### fallthrough attribute <sup>[allowed]</sup>
+
+```c++
+case 1:
+ DoSomething();
+ [[fallthrough]];
+case 2:
+ break;
+```
+
+**Description:**
+The `[[fallthrough]]` attribute can be used in switch statements to indicate
+when intentionally falling through to the next case.
+
+**Documentation:**
+[C++ attribute: fallthrough](https://en.cppreference.com/w/cpp/language/attributes/fallthrough)
+
+**Notes:**
+*** promo
+See [discussion thread](https://groups.google.com/a/chromium.org/g/cxx/c/JrvyFd243QI).
+
+See [migration task](https://bugs.chromium.org/p/chromium/issues/detail?id=1283907).
+***
+
+### constexpr if <sup>[allowed]</sup>
+
+```c++
+if constexpr (cond) { ...
+```
+
+**Description:** Write code that is instantiated depending on a compile-time
+condition.
+
+**Documentation:**
+[if statement](https://en.cppreference.com/w/cpp/language/if)
+
+**Notes:**
+*** promo
+See [discussion thread](https://groups.google.com/a/chromium.org/g/cxx/c/op2ePZnjP0w).
+***
+
+### nodiscard attribute <sup>[allowed]</sup>
+
+```c++
+struct [[nodiscard]] ErrorOrValue;
+[[nodiscard]] bool DoSomething();
+```
+
+**Description:**
+The `[[nodiscard]]` attribute can be used to indicate that
+
+ - the return value of a function should not be ignored
+ - values of annotated classes/structs/enums returned from functions should not
+ be ignored
+
+**Documentation:**
+[C++ attribute: nodiscard](https://en.cppreference.com/w/cpp/language/attributes/nodiscard)
+
+**Notes:**
+*** promo
+This replaces the previous `WARN_UNUSED_RESULT` macro, which was a wrapper
+around the compiler-specific `__attribute__((warn_unused_result))`.
+
+[Discussion thread](https://groups.google.com/a/chromium.org/g/cxx/c/nH7Ar8pZ1Dw/m/c90vGChvAAAJ)
+***
+
+### maybe_unused attribute <sup>[allowed]</sup>
+
+```c++
+struct [[maybe_unused]] MyUnusedThing;
+[[maybe_unused]] int x;
+```
+
+**Description:**
+The `[[maybe_unused]]` attribute can be used to indicate that individual
+variables, functions, or fields of a class/struct/enum can be left unused.
+
+**Documentation:**
+[C++ attribute: maybe_unused](https://en.cppreference.com/w/cpp/language/attributes/maybe_unused)
+
+**Notes:**
+*** promo
+See [discussion thread](https://groups.google.com/a/chromium.org/g/cxx/c/jPLfU5eRg8M/).
+***
+
+### Structured bindings <sup>[allowed]</sup>
+
+```c++
+const auto [x, y] = FuncReturningStdPair();
+```
+
+**Description:** Allows writing `auto [x, y, z] = expr;` where the type of
+`expr` is a tuple-like object, whose elements are bound to the variables `x`,
+`y`, and `z` (which this construct declares). Tuple-like objects include
+`std::tuple`, `std::pair`, `std::array`, and aggregate structures.
+
+**Documentation:**
+[Structured binding declaration](https://en.cppreference.com/w/cpp/language/structured_binding)
+[Explanation of structured binding types](https://jguegant.github.io/blogs/tech/structured-bindings.html)
+
+**Notes:**
+*** promo
+In C++17, structured bindings don't work with lambda captures.
+[C++20 will allow capturing structured bindings by value](https://wg21.link/p1091r3).
+
+This feature forces omitting type names. Its use should follow
+[the guidance around `auto` in Google C++ Style guide](https://google.github.io/styleguide/cppguide.html#Type_deduction).
+
+See [discussion thread](https://groups.google.com/a/chromium.org/g/cxx/c/ExfSorNLNf4).
+***
+
+### Inline variables
+
+```c++
+struct S {
+ static constexpr int kZero = 0; // constexpr implies inline here.
+};
+
+inline constexpr int kOne = 1; // Explicit inline needed here.
+```
+
+**Description:** The `inline` specifier can be applied to variables as well as
+to functions. A variable declared inline has the same semantics as a function
+declared inline. It can also be used to declare and define a static member
+variable, such that it does not need to be initialized in the source file.
+
+**Documentation:**
+[inline specifier](https://en.cppreference.com/w/cpp/language/inline)
+
+**Notes:**
+*** promo
+Inline variables in anonymous namespaces in header files will still get one copy
+per translation unit, so they must be outside of an anonymous namespace to be
+effective.
+
+Mutable inline variables and taking the address of inline variables are banned
+since these will break the component build.
+
+See [discussion thread](https://groups.google.com/a/chromium.org/g/cxx/c/hmyGFD80ocE/m/O4AXC93vAQAJ).
+***
+
+## C++17 Allowed Library Features {#library-allowlist-17}
+
+The following C++17 language features are allowed in the Chromium codebase.
+
+### Allocation functions with explicit alignment <sup>[allowed]</sup>
+
+```c++
+class alignas(32) Vec3d {
+ double x, y, z;
+};
+auto p_vec = new Vec3d[10]; // 32-byte aligned in C++17, maybe not previously
+```
+
+**Description:** Performs heap allocation of objects whose alignment
+requirements exceed `__STDCPP_DEFAULT_NEW_ALIGNMENT__`.
+
+**Documentation:**
+[operator new](https://en.cppreference.com/w/cpp/memory/new/operator_new)
+
+**Notes:**
+*** promo
+None
+***
+
+### Type trait variable templates <sup>[tbd]</sup>
+
+```c++
+bool b = std::is_same_v<int, std::int32_t>;
+```
+
+**Description:** Syntactic sugar to provide convenient access to `::value`
+members by simply adding `_v`.
+
+**Documentation:**
+[Type support](https://en.cppreference.com/w/cpp/types)
+
+**Notes:**
+*** promo
+[Discussion thread](Non://groups.google.com/a/chromium.org/g/cxx/c/KEa-0AOGRNY/m/IV_S3_pvAAAJ)
+***
+
+### std::map::try_emplace <sup>[allowed]</sup>
+
+```c++
+std::map<std::string, std::string> m;
+m.try_emplace("c", 10, 'c');
+m.try_emplace("c", "Won't be inserted");
+```
+
+**Description:** Like `emplace`, but does not move from rvalue arguments if the
+insertion does not happen.
+
+**Documentation:**
+[std::map::try_emplace](https://en.cppreference.com/w/cpp/container/map/try_emplace),
+
+**Notes:**
+*** promo
+[Discussion thread](https://groups.google.com/a/chromium.org/g/cxx/c/Uv2tUfIwUfQ/m/ffMxCk9uAAAJ)
+***
+
+### std::map::insert_or_assign <sup>[allowed]</sup>
+
+```c++
+std::map<std::string, std::string> m;
+m.insert_or_assign("c", "cherry");
+m.insert_or_assign("c", "clementine");
+```
+
+**Description:** Like `operator[]`, but returns more information and does not
+require default-constructibility of the mapped type.
+
+**Documentation:**
+[std::map::insert_or_assign](https://en.cppreference.com/w/cpp/container/map/insert_or_assign)
+
+**Notes:**
+*** promo
+[Discussion thread](https://groups.google.com/a/chromium.org/g/cxx/c/Uv2tUfIwUfQ/m/ffMxCk9uAAAJ)
+***
+
+## C++17 Banned Library Features {#library-blocklist-17}
+
+The following C++17 library features are not allowed in the Chromium codebase.
+
+### std::any <sup>[banned]</sup>
+
+```c++
+std::any x = 5;
+```
+
+**Description:** A type-safe container for single values of any type.
+
+**Documentation:**
+[std::any](https://en.cppreference.com/w/cpp/utility/any)
+
+**Notes:**
+*** promo
+[Discussion thread](https://groups.google.com/a/chromium.org/g/cxx/c/KEa-0AOGRNY/m/IV_S3_pvAAAJ)
+
+Banned since workaround for lack of RTTI isn't compatible with the component
+build ([Bug](https://crbug.com/1096380)). Also see `absl::any`.
+***
+
+### std::filesystem <sup>[banned]</sup>
+
+```c++
+#include <filesystem>
+```
+
+**Description:** A standard way to manipulate files, directories, and paths in a
+filesystem.
+
+**Documentation:**
+[Filesystem library](https://en.cppreference.com/w/cpp/filesystem)
+
+**Notes:**
+*** promo
+Banned by the [Google Style Guide](https://google.github.io/styleguide/cppguide.html#Other_Features).
+***
+
+### weak_from_this <sup>[banned]</sup>
+
+```c++
+auto weak_ptr = weak_from_this();
+```
+
+**Description:** Returns a `std::weak_ptr<T>` that tracks ownership of `*this`
+by all existing `std::shared_ptr`s that refer to `*this`.
+
+**Documentation:**
+[std::enable_shared_from_this<T>::weak_from_this](https://en.cppreference.com/w/cpp/memory/enable_shared_from_this/weak_from_this)
+
+**Notes:**
+*** promo
+Banned since `std::shared_ptr` and `std::weak_ptr` are banned.
+***
+
+### Transparent std::owner_less <sup>[banned]</sup>
+
+```c++
+std::map<std::weak_ptr<T>, U, std::owner_less<>>
+```
+
+**Description:** Function object providing mixed-type owner-based ordering of
+shared and weak pointers, regardless of the type of the pointee.
+
+**Documentation:**
+[std::owner_less](https://en.cppreference.com/w/cpp/memory/owner_less)
+
+**Notes:**
+*** promo
+Banned since `std::shared_ptr` and `std::weak_ptr` are banned.
+***
+
+### Array support for std::shared_ptr <sup>[banned]</sup>
+
+```c++
+std::shared_ptr<int[]> p(new int[10]{0,1,2,3,4,5,6,7,8,9});
+std::cout << p[3]; // "3"
+```
+
+**Description:** Supports memory management of arrays via `std::shared_ptr`.
+
+**Documentation:**
+[std::shared_ptr](https://en.cppreference.com/w/cpp/memory/shared_ptr)
+
+**Notes:**
+*** promo
+Banned since `std::shared_ptr` is banned.
+***
+
+### std::uncaught_exceptions <sup>[banned]</sup>
+
+```c++
+int count = std::uncaught_exceptions();
+```
+
+**Description:** Determines whether there are live exception objects.
+
+**Documentation:**
+[std::uncaught_exceptions](https://en.cppreference.com/w/cpp/error/uncaught_exception)
+
+**Notes:**
+*** promo
+Banned because exceptions are banned.
+***
+
+### Rounding functions for duration and time_point <sup>[banned]</sup>
+
+```c++
+std::chrono::ceil<std::chrono::seconds>(dur);
+std::chrono::ceil<std::chrono::seconds>(time_pt);
+std::chrono::floor<std::chrono::seconds>(dur);
+std::chrono::floor<std::chrono::seconds>(time_pt);
+std::chrono::round<std::chrono::seconds>(dur);
+std::chrono::round<std::chrono::seconds>(time_pt);
+```
+
+**Description:** Converts durations and time_points by rounding.
+
+**Documentation:**
+[std::chrono::duration](https://en.cppreference.com/w/cpp/chrono/duration),
+[std::chrono::time_point](https://en.cppreference.com/w/cpp/chrono/time_point)
+
+**Notes:**
+*** promo
+Banned since `std::chrono` is banned.
+***
+
+## C++17 TBD Language Features {#core-review-17}
+
+The following C++17 language features are not allowed in the Chromium codebase.
+See the top of this page on how to propose moving a feature from this list into
+the allowed or banned sections.
+
+### Declaring non-type template parameters with auto <sup>[tbd]</sup>
+
+```c++
+template <auto... seq>
+struct my_integer_sequence {
+ // ...
+};
+auto seq = my_integer_sequence<0, 1, 2>(); // Type deduced to be `int`.
+```
+
+**Description:** Following the deduction rules of `auto`, while respecting the
+non-type template parameter list of allowable types, template arguments can be
+deduced from the types of its arguments.
+
+**Documentation:**
+[Template parameters](https://en.cppreference.com/w/cpp/language/template_parameters)
+
+**Notes:**
+*** promo
+None
+***
+
+### Fold expressions <sup>[tbd]</sup>
+
+```c++
+template <typename... Args>
+auto sum(Args... args) {
+ return (... + args);
+}
+```
+
+**Description:** A fold expression performs a fold of a template parameter pack
+over a binary operator.
+
+**Documentation:**
+[Fold expression](https://en.cppreference.com/w/cpp/language/fold)
+
+**Notes:**
+*** promo
+None
+***
+
+### constexpr lambda <sup>[tbd]</sup>
+
+```c++
+auto identity = [](int n) constexpr { return n; };
+static_assert(identity(123) == 123);
+```
+
+**Description:** Compile-time lambdas using constexpr.
+
+**Documentation:**
+[Lambda expressions](https://en.cppreference.com/w/cpp/language/lambda)
+
+**Notes:**
+*** promo
+None
+***
+
+### Lambda capture this by value <sup>[tbd]</sup>
+
+```c++
+const auto l = [*this] { return member_; }
+```
+
+**Description:** `*this` captures the current object by copy, while `this`
+continues to capture by reference.
+
+**Documentation:**
+[Lambda capture](https://en.cppreference.com/w/cpp/language/lambda#Lambda_capture)
+
+**Notes:**
+*** promo
+None
+***
+
+### UTF-8 character literals <sup>[tbd]</sup>
+
+```c++
+char x = u8'x';
+```
+
+**Description:** A character literal that begins with `u8` is a character
+literal of type `char`. The value of a UTF-8 character literal is equal to its
+ISO 10646 code point value.
+
+**Documentation:**
+[Character literal](https://en.cppreference.com/w/cpp/language/character_literal)
+
+**Notes:**
+*** promo
+C++20 changes the type to `char8_t`, causing migration hazards for code using
+this.
+***
+
+### using declaration for attributes <sup>[tbd]</sup>
+
+```c++
+[[using CC: opt(1), debug]] // same as [[CC:opt(1), CC::debug]]
+```
+
+**Description:** Specifies a common namespace for a list of attributes.
+
+**Documentation:**
+[Attribute specifier sequence](https://en.cppreference.com/w/cpp/language/attributes)
+
+**Notes:**
+*** promo
+See similar attribute macros in base/compiler_specific.h.
+***
+
+### __has_include <sup>[tbd]</sup>
+
+```c++
+#if __has_include(<optional>) ...
+```
+
+**Description:** Checks whether a file is available for inclusion, i.e. the file
+exists.
+
+**Documentation:**
+[Source file inclusion](https://en.cppreference.com/w/cpp/preprocessor/include)
+
+**Notes:**
+*** promo
+None
+***
+
+## C++17 TBD Library Features {#library-review-17}
+
+The following C++17 library features are not allowed in the Chromium codebase.
+See the top of this page on how to propose moving a feature from this list into
+the allowed or banned sections.
+
+### std::variant <sup>[tbd]</sup>
+
+```c++
+std::variant<int, double> v = 12;
+```
+
+**Description:** The class template `std::variant` represents a type-safe
+`union`. An instance of `std::variant` at any given time holds a value of one of
+its alternative types (it's also possible for it to be valueless).
+
+**Documentation:**
+[std::variant](https://en.cppreference.com/w/cpp/utility/variant)
+
+**Notes:**
+*** promo
+See also `absl::variant`.
+***
+
+### std::optional <sup>[tbd]</sup>
+
+```c++
+std::optional<std::string> s;
+```
+
+**Description:** The class template `std::optional` manages an optional
+contained value, i.e. a value that may or may not be present. A common use case
+for optional is the return value of a function that may fail.
+
+**Documentation:**
+[std::optional](https://en.cppreference.com/w/cpp/utility/optional)
+
+**Notes:**
+*** promo
+See also `absl::optional`.
+***
+
+### std::string_view <sup>[tbd]</sup>
+
+```c++
+std::string_view str = "foo";
+```
+
+**Description:** A non-owning reference to a string. Useful for providing an
+abstraction on top of strings (e.g. for parsing).
+
+**Documentation:**
+[std::basic_string_view](https://en.cppreference.com/w/cpp/string/basic_string_view)
+
+**Notes:**
+*** promo
+See also `absl::string_view` and `base::StringPiece`.
+***
+
+### std::invoke <sup>[tbd]</sup>
+
+```c++
+static_assert(std::invoke(std::plus<>(), 1, 2) == 3);
+```
+
+**Description:** Invokes a `Callable` object with parameters. An example of a
+`Callable` object is `base::Callback` where an object can be called similarly to
+a regular function.
+
+**Documentation:**
+[std::invoke](https://en.cppreference.com/w/cpp/utility/functional/invoke)
+
+**Notes:**
+*** promo
+See also `base::invoke`.
+***
+
+### std::apply <sup>[tbd]</sup>
+
+```c++
+static_assert(std::apply(std::plus<>(), std::make_tuple(1, 2)) == 3);
+```
+
+**Description:** Invokes a `Callable` object with a tuple of arguments.
+
+**Documentation:**
+[std::apply](https://en.cppreference.com/w/cpp/utility/apply)
+
+**Notes:**
+*** promo
+See also `absl::apply` and `base::apply`.
+***
+
+### std::byte <sup>[tbd]</sup>
+
+```c++
+std::byte b = 0xFF;
+int i = std::to_integer<int>(b); // 0xFF
+```
+
+**Description:** A standard way of representing data as a byte. `std::byte` is
+neither a character type nor an arithmetic type, and the only operator overloads
+available are bitwise operations.
+
+**Documentation:**
+[std::byte](https://en.cppreference.com/w/cpp/types/byte)
+
+**Notes:**
+*** promo
+None
+***
+
+### Splicing for maps and sets <sup>[tbd]</sup>
+
+```c++
+std::map<...>::extract
+std::map<...>::merge
+std::set<...>::extract
+std::set<...>::merge
+```
+
+**Description:** Moving nodes and merging containers without the overhead of
+expensive copies, moves, or heap allocations/deallocations.
+
+**Documentation:**
+[std::map::extract](https://en.cppreference.com/w/cpp/container/map/extract),
+[std::map::merge](https://en.cppreference.com/w/cpp/container/map/merge)
+
+**Notes:**
+*** promo
+None
+***
+
+### Parallel algorithms <sup>[tbd]</sup>
+
+```c++
+auto it = std::find(std::execution::par, std::begin(vec), std::end(vec), 2);
+```
+
+**Description:** Many of the STL algorithms, such as the `copy`, `find` and
+`sort` methods, now support the parallel execution policies: `seq`, `par`, and
+`par_unseq` which translate to "sequentially", "parallel" and
+"parallel unsequenced".
+
+**Documentation:**
+[execution_policy_tag_t](https://en.cppreference.com/w/cpp/algorithm/execution_policy_tag_t)
+
+**Notes:**
+*** promo
+None
+***
+
+### std::make_from_tuple <sup>[tbd]</sup>
+
+```c++
+// Calls Foo(int, double):
+auto foo = std::make_from_tuple<Foo>(std::make_tuple(1, 3.5));
+```
+
+**Description:** Constructs an object from a tuple of arguments.
+
+**Documentation:**
+[std::make_from_tuple](https://en.cppreference.com/w/cpp/utility/make_from_tuple)
+
+**Notes:**
+*** promo
+See also `absl::make_from_tuple`.
+***
+
+### Searchers <sup>[tbd]</sup>
+
+```c++
+auto it = std::search(haystack.begin(), haystack.end(),
+ std::boyer_moore_searcher(needle.begin(), needle.end()));
+```
+
+**Description:** Alternate string searching algorithms.
+
+**Documentation:**
+[Searchers](https://en.cppreference.com/w/cpp/utility/functional#Searchers)
+
+**Notes:**
+*** promo
+None
+***
+
+### std::as_const <sup>[tbd]</sup>
+
+```c++
+auto&& const_ref = std::as_const(mutable_obj);
+```
+
+**Description:** Forms reference to const T.
+
+**Documentation:**
+[std::as_const](https://en.cppreference.com/w/cpp/utility/as_const)
+
+**Notes:**
+*** promo
+See also `base::as_const`.
+***
+
+### std::not_fn <sup>[tbd]</sup>
+
+```c++
+auto nonwhite = std::find_if(str.begin(), str.end(), std::not_fn(IsWhitespace));
+```
+
+**Description:** Creates a forwarding call wrapper that returns the negation of
+the callable object it holds.
+
+**Documentation:**
+[std::not_fn](https://en.cppreference.com/w/cpp/utility/functional/not_fn)
+
+**Notes:**
+*** promo
+See also `base::not_fn`.
+***
+
+### Uninitialized memory algorithms <sup>[tbd]</sup>
+
+```c++
+std::destroy_at(ptr);
+std::destroy(ptr, ptr + 8);
+std::destroy_n(ptr, 8);
+std::uninitialized_move(src.begin(), src.end(), dest.begin());
+std::uninitialized_value_construct(std::begin(storage), std::end(storage));
+```
+
+**Description:** Replaces direct constructor and destructor calls when manually
+managing memory.
+
+**Documentation:**
+[std::destroy_at](https://en.cppreference.com/w/cpp/memory/destroy_at),
+[std::destroy](https://en.cppreference.com/w/cpp/memory/destroy),
+[std::destroy_n](https://en.cppreference.com/w/cpp/memory/destroy_n),
+[std::uninitialized_move](https://en.cppreference.com/w/cpp/memory/uninitialized_move),
+[std::uninitialized_value_construct](https://en.cppreference.com/w/cpp/memory/uninitialized_value_construct)
+
+**Notes:**
+*** promo
+None
+***
+
+### std::pmr::memory_resource and std::polymorphic_allocator <sup>[tbd]</sup>
+
+```c++
+#include <memory_resource>
+```
+
+**Description:** Manages memory allocations using runtime polymorphism.
+
+**Documentation:**
+[std::pmr::memory_resource](https://en.cppreference.com/w/cpp/memory/memory_resource),
+[std::pmr::polymorphic_allocator](https://en.cppreference.com/w/cpp/memory/polymorphic_allocator),
+
+**Notes:**
+*** promo
+May not be supported in libc++, according to the
+[library features table](https://en.cppreference.com/w/cpp/17)
+***
+
+### std::aligned_alloc <sup>[tbd]</sup>
+
+```c++
+int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024));
+```
+
+**Description:** Allocates uninitialized storage with the specified alignment.
+
+**Documentation:**
+[std::aligned_alloc](https://en.cppreference.com/w/cpp/memory/c/aligned_alloc)
+
+**Notes:**
+*** promo
+None
+***
+
+### std::conjunction/std::disjunction/std::negation <sup>[tbd]</sup>
+
+```c++
+template<typename T, typename... Ts>
+std::enable_if_t<std::conjunction_v<std::is_same<T, Ts>...>>
+func(T, Ts...) { ...
+```
+
+**Description:** Performs logical operations on type traits.
+
+**Documentation:**
+[std::conjunction](https://en.cppreference.com/w/cpp/types/conjunction),
+[std::disjunction](https://en.cppreference.com/w/cpp/types/disjunction),
+[std::negation](https://en.cppreference.com/w/cpp/types/negation)
+
+**Notes:**
+*** promo
+None
+***
+
+### std::is_swappable <sup>[tbd]</sup>
+
+```c++
+std::is_swappable<T>
+std::is_swappable_with_v<T, U>
+```
+
+**Description:** Checks whether classes may be swapped.
+
+**Documentation:**
+[std::is_swappable](https://en.cppreference.com/w/cpp/types/is_swappable)
+
+**Notes:**
+*** promo
+None
+***
+
+### std::is_invocable <sup>[tbd]</sup>
+
+```c++
+std::is_invocable_v<Fn, 1, "Hello">
+```
+
+**Description:** Checks whether a function may be invoked with the given
+argument types. The `_r` variant also evaluates whether the result is
+convertible to a given type.
+
+**Documentation:**
+[std::is_invocable](https://en.cppreference.com/w/cpp/types/is_invocable)
+
+**Notes:**
+*** promo
+None
+***
+
+### std::is_aggregate <sup>[tbd]</sup>
+
+```c++
+if constexpr(std::is_aggregate_v<T>) { ...
+```
+
+**Description:** Checks wither the given type is an aggregate type.
+
+**Documentation:**
+[std::is_aggregate](https://en.cppreference.com/w/cpp/types/is_aggregate)
+
+**Notes:**
+*** promo
+None
+***
+
+### std::has_unique_object_representations <sup>[tbd]</sup>
+
+```c++
+std::has_unique_object_representations_v<foo>
+```
+
+**Description:** Checks wither the given type is trivially copyable and any two
+objects with the same value have the same object representation.
+
+**Documentation:**
+[std::has_unique_object_representations](https://en.cppreference.com/w/cpp/types/has_unique_object_representations)
+
+**Notes:**
+*** promo
+None
+***
+
+### std::clamp <sup>[tbd]</sup>
+
+```c++
+int x = base::clamp(inp, 0, 100);
+```
+
+**Description:** Clamps a value between a minimum and a maximum.
+
+**Documentation:**
+[std::clamp](https://en.cppreference.com/w/cpp/algorithm/clamp)
+
+**Notes:**
+*** promo
+See also `base::clamp`.
+***
+
+### std::reduce <sup>[tbd]</sup>
+
+```c++
+std::reduce(std::execution::par, v.cbegin(), v.cend());
+```
+
+**Description:** Like `std::accumulate` except the elements of the range may be
+grouped and rearranged in arbitrary order.
+
+**Documentation:**
+[std::reduce](https://en.cppreference.com/w/cpp/algorithm/reduce)
+
+**Notes:**
+*** promo
+Makes the most sense in conjunction with `std::execution::par`.
+***
+
+### std::inclusive_scan <sup>[tbd]</sup>
+
+```c++
+std::inclusive_scan(data.begin(), data.end(), output.begin());
+```
+
+**Description:** Like `std::accumulate` but writes the result at each step into
+the output range.
+
+**Documentation:**
+[std::inclusive_scan](https://en.cppreference.com/w/cpp/algorithm/inclusive_scan)
+
+**Notes:**
+*** promo
+None
+***
+
+### std::exclusive_scan <sup>[tbd]</sup>
+
+```c++
+std::exclusive_scan(data.begin(), data.end(), output.begin());
+```
+
+**Description:** Like `std::inclusive_scan` but omits the current element from
+the written output at each step; that is, results are "one value behind" those
+of `std::inclusive_scan`.
+
+**Documentation:**
+[std::exclusive_scan](https://en.cppreference.com/w/cpp/algorithm/exclusive_scan)
+
+**Notes:**
+*** promo
+None
+***
+
+### std::gcd <sup>[tbd]</sup>
+
+```c++
+static_assert(std::gcd(12, 18) == 6);
+```
+
+**Description:** Computes the greatest common divisor of its arguments.
+
+**Documentation:**
+[std::gcd](https://en.cppreference.com/w/cpp/numeric/gcd)
+
+**Notes:**
+*** promo
+None
+***
+
+### std::lcm <sup>[tbd]</sup>
+
+```c++
+static_assert(std::lcm(12, 18) == 36);
+```
+
+**Description:** Computes the least common multiple of its arguments.
+
+**Documentation:**
+[std::lcm](https://en.cppreference.com/w/cpp/numeric/lcm)
+
+**Notes:**
+*** promo
+None
+***
+
+### Non-member std::size/std::empty/std::data <sup>[tbd]</sup>
+
+```c++
+for (std::size_t i = 0; i < std::size(c); ++i) { ...
+if (!std::empty(c)) { ...
+std::strcpy(arr, std::data(str));
+```
+
+**Description:** Non-member versions of what are normally member functions, for
+symmetrical use with things like arrays and initializer_lists.
+
+**Documentation:**
+[std::size](https://en.cppreference.com/w/cpp/iterator/size),
+[std::empty](https://en.cppreference.com/w/cpp/iterator/empty),
+[std::data](https://en.cppreference.com/w/cpp/iterator/data)
+
+**Notes:**
+*** promo
+See `base::size`, `base::empty`, and `base::data`.
+***
+
+### Mathematical special functions <sup>[tbd]</sup>
+
+```c++
+std::assoc_laguerre()
+std::assoc_legendre()
+std::beta()
+std::comp_ellint_1()
+std::comp_ellint_2()
+std::comp_ellint_3()
+std::cyl_bessel_i()
+std::cyl_bessel_j()
+std::cyl_bessel_k()
+std::cyl_neumann()
+std::ellint_1()
+std::ellint_2()
+std::ellint_3()
+std::expint()
+std::hermite()
+std::legendre()
+std::laguerre()
+std::riemann_zeta()
+std::sph_bessel()
+std::sph_legendre()
+std::sph_neumann()
+```
+
+**Description:** A variety of mathematical functions.
+
+**Documentation:**
+[Mathematical special functions](https://en.cppreference.com/w/cpp/numeric/special_functions)
+
+**Notes:**
+*** promo
+May not be supported in libc++, according to the
+[library features table](https://en.cppreference.com/w/cpp/17)
+***
+
+### 3D std::hypot <sup>[tbd]</sup>
+
+```c++
+double dist = std::hypot(1.0, 2.5, 3.7);
+```
+
+**Description:** Computes the distance from the origin in 3D space.
+
+**Documentation:**
+[std::hypot](https://en.cppreference.com/w/cpp/numeric/math/hypot)
+
+**Notes:**
+*** promo
+None
+***
+
+### Cache line interface <sup>[tbd]</sup>
+
+```c++
+alignas(std::hardware_destructive_interference_size) std::atomic<int> cat;
+static_assert(sizeof(S) <= std::hardware_constructive_interference_size);
+```
+
+**Description:** A portable way to access the L1 data cache line size.
+
+**Documentation:**
+[Hardware interference size](https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_size)
+
+**Notes:**
+*** promo
+May not be supported in libc++, according to the
+[library features table](https://en.cppreference.com/w/cpp/17)
+***
+
+### std::launder <sup>[tbd]</sup>
+
+```c++
+struct Y { int z; };
+alignas(Y) std::byte s[sizeof(Y)];
+Y* q = new(&s) Y{2};
+const int h = std::launder(reinterpret_cast<Y*>(&s))->z;
+```
+
+**Description:** When used to wrap a pointer, makes it valid to access the
+resulting object in cases it otherwise wouldn't have been, in a very limited set
+of circumstances.
+
+**Documentation:**
+[std::launder](https://en.cppreference.com/w/cpp/utility/launder)
+
+**Notes:**
+*** promo
+None
+***
+
+### std::to_chars/std::from_chars <sup>[tbd]</sup>
+
+```c++
+std::to_chars(str.data(), str.data() + str.size(), 42);
+std::from_chars(str.data(), str.data() + str.size(), result);
+```
+
+**Description:** Locale-independent, non-allocating, non-throwing functions to
+convert values to/from character strings, designed for use in high-throughput
+contexts.
+
+**Documentation:**
+[std::to_chars](https://en.cppreference.com/w/cpp/utility/to_chars),
+[std::from_chars](https://en.cppreference.com/w/cpp/utility/from_chars)
+
+**Notes:**
+*** promo
+None
+***
+
+### std::atomic<T>::is_always_lock_free <sup>[tbd]</sup>
+
+```c++
+template <typename T>
+struct is_lock_free_impl
+: std::integral_constant<bool, std::atomic<T>::is_always_lock_free> {};
+```
+
+**Description:** True when the given atomic type is always lock-free.
+
+**Documentation:**
+[std::atomic<T>::is_always_lock_free](https://en.cppreference.com/w/cpp/atomic/atomic/is_always_lock_free)
+
+**Notes:**
+*** promo
+None
+***
+
+### std::scoped_lock <sup>[tbd]</sup>
+
+```c++
+std::scoped_lock lock(e1.m, e2.m);
+```
+
+**Description:** Provides an RAII-style mechanism for owning one or more mutexes
+for the duration of a scoped block.
+
+**Documentation:**
+[std::scoped_lock](https://en.cppreference.com/w/cpp/thread/scoped_lock)
+
+**Notes:**
+*** promo
+See also `base::AutoLock`.
+***
+
+### std::timespec_get <sup>[tbd]</sup>
+
+```c++
+std::timespec ts;
+std::timespec_get(&ts, TIME_UTC);
+```
+
+**Description:** Gets the current calendar time in the given time base.
+
+**Documentation:**
+[std::timespec_get](https://en.cppreference.com/w/cpp/chrono/c/timespec_get)
+
+**Notes:**
+*** promo
+None
+***
+
+## Abseil Allowed Library Features {#absl-allowlist}
+
+The following Abseil library features are allowed in the Chromium codebase.
+
+### 128bit integer <sup>[allowed]</sup>
+
+```c++
+uint64_t a;
+absl::uint128 v = a;
+```
+
+**Description:** Signed and unsigned 128-bit integer types meant to mimic
+intrinsic types as closely as possible.
+
+**Documentation:**
+[Numerics](https://abseil.io/docs/cpp/guides/numeric)
+
+**Notes:**
+*** promo
+[Discussion thread](https://groups.google.com/a/chromium.org/g/cxx/c/6l8MlO7vEek)
+***
+
+### Optional <sup>[allowed]</sup>
+
+```c++
+absl::optional
+```
+
+**Description:** Early adaptation of C++17 `std::optional`.
+
+**Documentation:**
+[std::optional](https://en.cppreference.com/w/cpp/utility/optional)
+
+**Notes:**
+*** promo
+Replaces `base::Optional`.
+[Discussion thread](https://groups.google.com/a/chromium.org/g/cxx/c/zUGqagX1NFU)
+***
+
+### Status <sup>[allowed]</sup>
+
+```c++
+absl::Status
+```
+
+**Description:** Type for returning detailed errors.
+
+**Documentation:**
+[status.h](https://source.chromium.org/chromium/chromium/src/+/main:third_party/abseil-cpp/absl/status/status.h)
+
+**Notes:**
+*** promo
+Approved for use inside a wrapper type. Use
+[abseil_string_conversions.h](https://source.chromium.org/chromium/chromium/src/+/main:base/strings/abseil_string_conversions.h)
+to convert to and from
+[absl::string_view](https://source.chromium.org/chromium/chromium/src/+/main:third_party/abseil-cpp/absl/strings/string_view.h)
+so the wrapper can expose
+[base::StringPiece](https://source.chromium.org/chromium/chromium/src/+/main:base/strings/string_piece.h).
+Use
+[absl::Cord](https://source.chromium.org/chromium/chromium/src/+/main:third_party/abseil-cpp/absl/strings/cord.h)
+directly as minimally necessary to interface; do not expose in the wrapper type
+API.
+
+[Discussion thread](https://groups.google.com/a/chromium.org/g/cxx/c/ImdFCSZ-NMA)
+***
+
+### Variant <sup>[allowed]</sup>
+
+```c++
+absl::variant
+```
+
+**Description:** Early adaptation of C++17 `std::variant`.
+
+**Documentation:**
+[std::variant](https://en.cppreference.com/w/cpp/utility/variant)
+
+**Notes:**
+*** promo
+[Discussion thread](https://groups.google.com/a/chromium.org/g/cxx/c/DqvG-TpvMyU)
+***
+
+## Abseil Banned Library Features {#absl-blocklist}
+
+The following Abseil library features are not allowed in the Chromium codebase.
+
+### Any <sup>[banned]</sup>
+
+```c++
+absl::any a = int{5};
+EXPECT_THAT(absl::any_cast<int>(&a), Pointee(5));
+EXPECT_EQ(absl::any_cast<size_t>(&a), nullptr);
+```
+
+**Description:** Early adaptation of C++17 `std::any`.
+
+**Documentation:** [std::any](https://en.cppreference.com/w/cpp/utility/any)
+
+**Notes:**
+*** promo
+Banned since workaround for lack of RTTI isn't compatible with the component
+build ([Bug](https://crbug.com/1096380)). Also see `std::any`.
+***
+
+### Command line flags <sup>[banned]</sup>
+
+```c++
+ABSL_FLAG(bool, logs, false, "print logs to stderr");
+app --logs=true;
+```
+
+**Description:** Allows programmatic access to flag values passed on the
+command-line to binaries.
+
+**Documentation:** [Flags Library](https://abseil.io/docs/cpp/guides/flags)
+
+**Notes:**
+*** promo
+Banned since workaround for lack of RTTI isn't compatible with the component
+build. ([Bug](https://crbug.com/1096380)) Use `base::CommandLine` instead.
+***
+
+### Span <sup>[banned]</sup>
+
+```c++
+absl::Span
+```
+
+**Description:** Early adaptation of C++20 `std::span`.
+
+**Documentation:** [Using absl::Span](https://abseil.io/tips/93)
+
+**Notes:**
+*** promo
+Banned due to being less std::-compliant than `base::span`. Keep using
+`base::span`.
+***
+
+### string_view <sup>[banned]</sup>
+
+```c++
+absl::string_view
+```
+
+**Description:** Early adaptation of C++17 `std::string_view`.
+
+**Documentation:** [absl::string_view](https://abseil.io/tips/1)
+
+**Notes:**
+*** promo
+Banned due to only working with 8-bit characters. Keep using
+`base::StringPiece` from `base/strings/`.
+***
+
+## Abseil TBD Features {#absl-review}
+
+The following Abseil library features are not allowed in the Chromium codebase.
+See the top of this page on how to propose moving a feature from this list into
+the allowed or banned sections.
+
+### bind_front <sup>[tbd]</sup>
+
+```c++
+absl::bind_front
+```
+
+**Description:** Binds the first N arguments of an invocable object and stores them by value.
+
+**Documentation:**
+* [bind_front.h](https://source.chromium.org/chromium/chromium/src/+/main:third_party/abseil-cpp/absl/functional/bind_front.h)
+* [Avoid std::bind](https://abseil.io/tips/108)
+
+**Notes:**
+*** promo
+Overlaps with `base::Bind`.
+***
+
+### Cleanup <sup>[tbd]</sup>
+
+```c++
+FILE* sink_file = fopen(sink_path, "w");
+auto sink_closer = absl::MakeCleanup([sink_file] { fclose(sink_file); });
+```
+
+**Description:** Implements the scope guard idiom, invoking the contained
+callback's `operator()() &&` on scope exit.
+
+**Documentation:**
+[cleanup.h](https://source.chromium.org/chromium/chromium/src/+/main:third_party/abseil-cpp/absl/cleanup/cleanup.h)
+
+**Notes:**
+*** promo
+Similar to `defer` in Golang.
+***
+
+### Containers <sup>[tbd]</sup>
+
+```c++
+absl::flat_hash_map
+absl::flat_hash_set
+absl::node_hash_map
+absl::node_hash_set
+absl::btree_map
+absl::btree_set
+absl::btree_multimap
+absl::btree_multiset
+absl::InlinedVector
+absl::FixedArray
+```
+
+**Description:** Alternatives to STL containers designed to be more efficient
+in the general case.
+
+**Documentation:**
+* [Containers](https://abseil.io/docs/cpp/guides/container)
+* [Hash](https://abseil.io/docs/cpp/guides/hash)
+
+**Notes:**
+*** promo
+Supplements `base/containers/`.
+***
+
+### Container utilities <sup>[tbd]</sup>
+
+```c++
+auto it = absl::c_find(container, value);
+```
+
+**Description:** Container-based versions of algorithmic functions within C++
+standard library.
+
+**Documentation:**
+[container.h](https://source.chromium.org/chromium/chromium/src/+/main:third_party/abseil-cpp/absl/algorithm/container.h)
+
+**Notes:**
+*** promo
+Overlaps with `base/ranges/algorithm.h`.
+***
+
+### FunctionRef <sup>[tbd]</sup>
+
+```c++
+absl::FunctionRef
+```
+
+**Description:** Type for holding a non-owning reference to an object of any
+invocable type.
+
+**Documentation:**
+[function_ref.h](https://source.chromium.org/chromium/chromium/src/+/main:third_party/abseil-cpp/absl/functional/function_ref.h)
+
+**Notes:**
+*** promo
+None
+***
+
+### Random <sup>[tbd]</sup>
+
+```c++
+absl::BitGen bitgen;
+size_t index = absl::Uniform(bitgen, 0u, elems.size());
+```
+
+**Description:** Functions and utilities for generating pseudorandom data.
+
+**Documentation:** [Random library](https://abseil.io/docs/cpp/guides/random)
+
+**Notes:**
+*** promo
+Overlaps with `base/rand_util.h`.
+***
+
+### StatusOr <sup>[tbd]</sup>
+
+```c++
+absl::StatusOr<T>
+```
+
+**Description:** An object that is either a usable value, or an error Status
+explaining why such a value is not present.
+
+**Documentation:**
+[statusor.h](https://source.chromium.org/chromium/chromium/src/+/main:third_party/abseil-cpp/absl/status/statusor.h)
+
+**Notes:**
+*** promo
+None
+***
+
+### String Formatting <sup>[tbd]</sup>
+
+```c++
+absl::StrFormat
+```
+
+**Description:** A typesafe replacement for the family of printf() string
+formatting routines.
+
+**Documentation:**
+[String Formatting](https://abseil.io/docs/cpp/guides/format)
+
+**Notes:**
+*** promo
+None
+***
+
+### Strings Library <sup>[tbd]</sup>
+
+```c++
+absl::StrSplit
+absl::StrJoin
+absl::StrCat
+absl::StrAppend
+absl::Substitute
+absl::StrContains
+```
+
+**Description:** Classes and utility functions for manipulating and comparing
+strings.
+
+**Documentation:**
+[String Utilities](https://abseil.io/docs/cpp/guides/strings)
+
+**Notes:**
+*** promo
+Overlaps with `base/strings`.
+***
+
+### Synchronization <sup>[tbd]</sup>
+
+```c++
+absl::Mutex
+```
+
+**Description:** Primitives for managing tasks across different threads.
+
+**Documentation:**
+[Synchronization](https://abseil.io/docs/cpp/guides/synchronization)
+
+**Notes:**
+*** promo
+Overlaps with `Lock` in `base/synchronization/`.
+***
+
+### Time library <sup>[tbd]</sup>
+
+```c++
+absl::Duration
+absl::Time
+absl::TimeZone
+absl::CivilDay
+```
+
+**Description:** Abstractions for holding time values, both in terms of
+absolute time and civil time.
+
+**Documentation:** [Time](https://abseil.io/docs/cpp/guides/time)
+
+**Notes:**
+*** promo
+Overlaps with `Time` APIs in `base/`.
+***