Skip to content

Commit ef1ac7f

Browse files
kparzyszrlavaee
authored andcommitted
[STLForwardCompat] Implement llvm::type_identity (llvm#146390)
A basic implementation until we get it in `std` in C++20.
1 parent f4a7d02 commit ef1ac7f

File tree

3 files changed

+36
-9
lines changed

3 files changed

+36
-9
lines changed

clang/include/clang/Tooling/Transformer/Transformer.h

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,6 @@ class TransformerImpl {
4242
virtual void
4343
onMatchImpl(const ast_matchers::MatchFinder::MatchResult &Result) = 0;
4444
};
45-
46-
// FIXME: Use std::type_identity or backport when available.
47-
template <class T> struct type_identity {
48-
using type = T;
49-
};
5045
} // namespace detail
5146

5247
template <typename T> struct TransformerResult {
@@ -95,8 +90,8 @@ class Transformer : public ast_matchers::MatchFinder::MatchCallback {
9590
template <typename MetadataT>
9691
explicit Transformer(
9792
transformer::RewriteRuleWith<MetadataT> Rule,
98-
std::function<void(llvm::Expected<TransformerResult<
99-
typename detail::type_identity<MetadataT>::type>>)>
93+
std::function<void(
94+
llvm::Expected<TransformerResult<llvm::type_identity_t<MetadataT>>>)>
10095
Consumer);
10196

10297
/// N.B. Passes `this` pointer to `MatchFinder`. So, this object should not
@@ -200,8 +195,8 @@ template <typename T> class WithMetadataImpl final : public TransformerImpl {
200195
template <typename MetadataT>
201196
Transformer::Transformer(
202197
transformer::RewriteRuleWith<MetadataT> Rule,
203-
std::function<void(llvm::Expected<TransformerResult<
204-
typename detail::type_identity<MetadataT>::type>>)>
198+
std::function<void(
199+
llvm::Expected<TransformerResult<llvm::type_identity_t<MetadataT>>>)>
205200
Consumer)
206201
: Impl(std::make_unique<detail::WithMetadataImpl<MetadataT>>(
207202
std::move(Rule), std::move(Consumer))) {}

llvm/include/llvm/ADT/STLForwardCompat.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,19 @@ template <typename T>
3636
using remove_cvref_t // NOLINT(readability-identifier-naming)
3737
= typename llvm::remove_cvref<T>::type;
3838

39+
// TODO: Remove this in favor of std::type_identity<T> once we switch to C++23.
40+
template <typename T>
41+
struct type_identity // NOLINT(readability-identifier-naming)
42+
{
43+
using type = T;
44+
};
45+
46+
// TODO: Remove this in favor of std::type_identity_t<T> once we switch to
47+
// C++23.
48+
template <typename T>
49+
using type_identity_t // NOLINT(readability-identifier-naming)
50+
= typename llvm::type_identity<T>::type;
51+
3952
//===----------------------------------------------------------------------===//
4053
// Features from C++23
4154
//===----------------------------------------------------------------------===//

llvm/unittests/ADT/STLForwardCompatTest.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,25 @@ TYPED_TEST(STLForwardCompatRemoveCVRefTest, RemoveCVRefT) {
4545
llvm::remove_cvref_t<From>>::value));
4646
}
4747

48+
template <typename T> class TypeIdentityTest : public ::testing::Test {
49+
public:
50+
using TypeIdentity = llvm::type_identity<T>;
51+
};
52+
53+
struct A {
54+
struct B {};
55+
};
56+
using TypeIdentityTestTypes =
57+
::testing::Types<int, volatile int, A, const A::B>;
58+
59+
TYPED_TEST_SUITE(TypeIdentityTest, TypeIdentityTestTypes, /*NameGenerator*/);
60+
61+
TYPED_TEST(TypeIdentityTest, Identity) {
62+
// TestFixture is the instantiated TypeIdentityTest.
63+
EXPECT_TRUE(
64+
(std::is_same_v<TypeParam, typename TestFixture::TypeIdentity::type>));
65+
}
66+
4867
TEST(TransformTest, TransformStd) {
4968
std::optional<int> A;
5069

0 commit comments

Comments
 (0)