Skip to content

Commit 342bba2

Browse files
committed
Support nullptr:
1 parent cc6f8cc commit 342bba2

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

llvm/include/llvm/ADT/TypeSwitch.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,14 @@ class TypeSwitch : public detail::TypeSwitchBase<TypeSwitch<T, ResultT>, T> {
119119
return defaultResult;
120120
}
121121

122+
/// Default for pointer-like results types that accept `nullptr`.
123+
template <typename ArgT = ResultT,
124+
typename =
125+
std::enable_if_t<std::is_constructible_v<ArgT, std::nullptr_t>>>
126+
[[nodiscard]] ResultT Default(std::nullptr_t) {
127+
return Default(ResultT(nullptr));
128+
}
129+
122130
/// Default for optional results types that accept `std::nullopt`.
123131
template <typename ArgT = ResultT,
124132
typename =

llvm/unittests/ADT/TypeSwitchTest.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,3 +152,34 @@ TEST(TypeSwitchTest, DefaultNullopt) {
152152
EXPECT_EQ(0, translate(DerivedA()));
153153
EXPECT_EQ(std::nullopt, translate(DerivedD()));
154154
}
155+
156+
TEST(TypeSwitchTest, DefaultNullptr) {
157+
float foo = 0.0f;
158+
auto translate = [&](auto value) {
159+
return TypeSwitch<Base *, float *>(&value)
160+
.Case([&](DerivedA *) { return &foo; })
161+
.Default(nullptr);
162+
};
163+
EXPECT_EQ(&foo, translate(DerivedA()));
164+
EXPECT_EQ(nullptr, translate(DerivedD()));
165+
}
166+
167+
TEST(TypeSwitchTest, DefaultNullptrForPointerLike) {
168+
struct Value {
169+
void *ptr;
170+
Value(const Value &other) : ptr(other.ptr) {}
171+
Value(std::nullptr_t) : ptr(nullptr) {}
172+
Value() : Value(nullptr) {}
173+
};
174+
175+
float foo = 0.0f;
176+
Value fooVal;
177+
fooVal.ptr = &foo;
178+
auto translate = [&](auto value) {
179+
return TypeSwitch<Base *, Value>(&value)
180+
.Case([&](DerivedA *) { return fooVal; })
181+
.Default(nullptr);
182+
};
183+
EXPECT_EQ(&foo, translate(DerivedA()).ptr);
184+
EXPECT_EQ(nullptr, translate(DerivedD()).ptr);
185+
}

0 commit comments

Comments
 (0)