[llvm] [STLForwardCompat] Improve category handling in transformOptional (PR #149539)
Krzysztof Parzyszek via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 18 09:23:11 PDT 2025
================
@@ -55,21 +55,13 @@ using type_identity_t // NOLINT(readability-identifier-naming)
// TODO: Remove this in favor of std::optional<T>::transform once we switch to
// C++23.
-template <typename T, typename Function>
-auto transformOptional(const std::optional<T> &O, const Function &F)
- -> std::optional<decltype(F(*O))> {
- if (O)
- return F(*O);
- return std::nullopt;
-}
-
-// TODO: Remove this in favor of std::optional<T>::transform once we switch to
-// C++23.
-template <typename T, typename Function>
-auto transformOptional(std::optional<T> &&O, const Function &F)
- -> std::optional<decltype(F(*std::move(O)))> {
- if (O)
- return F(*std::move(O));
+template <typename Optional, typename Function,
+ typename Value = typename llvm::remove_cvref_t<Optional>::value_type>
+auto transformOptional(Optional &&O, Function &&F)
+ -> std::optional<std::invoke_result_t<Function, Value>> {
----------------
kparzysz wrote:
The "return std::nullopt" causes issues otherwise: nullopt's type is nullopt_t, which causes the return type deduction to fail.
https://github.com/llvm/llvm-project/pull/149539
More information about the llvm-commits
mailing list