[PATCH] D151952: [clang] adds `__type_pack_index` so we can get a type's parameter pack index

Jonathan Wakely via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Jun 27 05:57:57 PDT 2023


jwakely added a comment.

In D151952#4396485 <https://reviews.llvm.org/D151952#4396485>, @cjdb wrote:

> Since we're doing this, it may also be worth checking that `T1s...` are unique in `T2s...`, which I'd intended to be a separate feature.

It seems like it would be more efficient to include the uniqueness check in the intrinsic, otherwise `std::get<T>` and helpers like libstdc++'s `variant::__index_of<T>` will still need some template metaprogramming to check for uniqueness. Even if there's a separate intrinsic for that, it seems more useful to just have one intrinsic that does both. If you have a use case for finding the index of the first T in a pack, maybe add an additional boolean that requests uniqueness and would cause `__type_pack_index` to fail if T is not unique.

As @BertalanD also said, it doesn't seem useful to be ill-formed if the type isn't in the pack. That makes it unusable for `std::get<T>` and `std::variant`. Libstdc++'s `__find_uniq_type_in_pack<T, Types...>` returns `sizeof...(Types)` if `T` isn't found (either this or `-1uz` seems fine, you can check the returned index is `< sizeof...(Types)` to tell if the type was found).



================
Comment at: clang/docs/LanguageExtensions.rst:1660
+    T& get(tuple<Ts...>& ts) noexcept {
+      return std::get<__type_pack_index(T, Ts...)>(ts);
+    }
----------------
If this intrinsic doesn't (yet?) check for uniqueness, then this `get<T>` doesn't match `std::get<T>`. It might be worth mentioning that here.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D151952/new/

https://reviews.llvm.org/D151952



More information about the cfe-commits mailing list