mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-18 18:42:46 +02:00
[llvm] Add isa_and_nonnull
Summary: Add new ``isa_and_nonnull<>`` operator that works just like the ``isa<>`` operator, except that it allows for a null pointer as an argument (which it then returns false). Reviewers: lattner, aaron.ballman, greened Reviewed By: lattner Subscribers: hubert.reinterpretcast, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D60291 llvm-svn: 357761
This commit is contained in:
parent
a1dfbc03cf
commit
5a5f040128
@ -164,6 +164,12 @@ rarely have to include this file directly).
|
||||
efficient to use the ``InstVisitor`` class to dispatch over the instruction
|
||||
type directly.
|
||||
|
||||
``isa_and_nonnull<>``:
|
||||
The ``isa_and_nonnull<>`` operator works just like the ``isa<>`` operator,
|
||||
except that it allows for a null pointer as an argument (which it then
|
||||
returns false). This can sometimes be useful, allowing you to combine several
|
||||
null checks into one.
|
||||
|
||||
``cast_or_null<>``:
|
||||
The ``cast_or_null<>`` operator works just like the ``cast<>`` operator,
|
||||
except that it allows for a null pointer as an argument (which it then
|
||||
|
@ -143,6 +143,16 @@ template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
|
||||
typename simplify_type<const Y>::SimpleType>::doit(Val);
|
||||
}
|
||||
|
||||
// isa_and_nonnull<X> - Functionally identical to isa, except that a null value
|
||||
// is accepted.
|
||||
//
|
||||
template <class X, class Y>
|
||||
LLVM_NODISCARD inline bool isa_and_nonnull(const Y &Val) {
|
||||
if (!Val)
|
||||
return false;
|
||||
return isa<X>(Val);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// cast<x> Support Templates
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -118,6 +118,12 @@ TEST(CastingTest, isa) {
|
||||
EXPECT_TRUE(isa<foo>(B4));
|
||||
}
|
||||
|
||||
TEST(CastingTest, isa_and_nonnull) {
|
||||
EXPECT_TRUE(isa_and_nonnull<foo>(B2));
|
||||
EXPECT_TRUE(isa_and_nonnull<foo>(B4));
|
||||
EXPECT_FALSE(isa_and_nonnull<foo>(fub()));
|
||||
}
|
||||
|
||||
TEST(CastingTest, cast) {
|
||||
foo &F1 = cast<foo>(B1);
|
||||
EXPECT_NE(&F1, null_foo);
|
||||
|
Loading…
Reference in New Issue
Block a user