[llvm-dev] [RFC] Should we add isa_or_null<>?

David Greene via llvm-dev llvm-dev at lists.llvm.org
Thu Apr 4 12:55:53 PDT 2019


Don Hinton <hintonda at gmail.com> writes:

> >  if (isa_or_null<T>(var)) {
> >    ...
> >  }
> >
> >  at least according to what "isa_or_null" conveys to me.
>
> This is the same convention used by the existing "_or_null" varieties,
> i.e., "cast_or_null" and "dyn_cast_or_null".  They accept a null and
> propagate it.  In the "isa" case, it would accept a null and propagate
> it as false.

isa<> is very different from *cast<>.  *cast<> gives you a pointer back,
which may be null.  isa<> is precondition check, so it "reads"
differently to me.  If I were to see:

if (isa_or_null<T>(var)) {
  ...
}

I would think, "Ok, the body is fine if var is null."

Instead:

if (exists_and_isa<T>(var)) {
  ...
}

This tells me that the body expects a non-null value.

> >  That said, I'm not sure sure we need a special API for this.  Are
> >  expensive calls used in the way you describe really common?
>
> I've only been looking at the ones involving method calls, but it's
> not too common.  Perhaps a dozen in clang/lib -- haven't run it
> against the rest of the code base.

Thanks for checking.  I don't have a strong opinion about the need
either way, but I do care that the spelling is clear and intuitive.

                           -David


More information about the llvm-dev mailing list