[PATCH 005/236] Introduce as_a_nullable
David Malcolm
dmalcolm@redhat.com
Wed Aug 6 17:38:00 GMT 2014
In many circumstances, is_a_helper <T>::test assumes that the pointer is
non-NULL, but sometimes you have a pointer of type T that can be NULL.
Earlier versions of this patch kit made numerous uses of the ternary
operator to handle nullable pointers e.g.:
return insn ? as_a <rtx_insn *> (insn) : NULL;
but this was ugly. Instead, introduce an as_a_nullable<T> variant that
adds a check for NULL, so the above can be written simply as:
return as_a_nullable <rtx_insn *> (insn);
gcc/
* is-a.h (template<T, U> as_a_nullable <U *p>) New function.
---
gcc/is-a.h | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/gcc/is-a.h b/gcc/is-a.h
index a14e344..f50e62c 100644
--- a/gcc/is-a.h
+++ b/gcc/is-a.h
@@ -46,6 +46,14 @@ TYPE as_a <TYPE> (pointer)
do_something_with (as_a <cgraph_node *> *ptr);
+TYPE as_a_nullable <TYPE> (pointer)
+
+ Like as_a <TYPE> (pointer), but where pointer could be NULL. This
+ adds a check against NULL where the regular is_a_helper hook for TYPE
+ assumes non-NULL.
+
+ do_something_with (as_a_nullable <cgraph_node *> *ptr);
+
TYPE dyn_cast <TYPE> (pointer)
Converts pointer to TYPE if and only if "is_a <TYPE> pointer". Otherwise,
@@ -185,6 +193,22 @@ as_a (U *p)
return is_a_helper <T>::cast (p);
}
+/* Similar to as_a<>, but where the pointer can be NULL, even if
+ is_a_helper<T> doesn't check for NULL. */
+
+template <typename T, typename U>
+inline T
+as_a_nullable (U *p)
+{
+ if (p)
+ {
+ gcc_checking_assert (is_a <T> (p));
+ return is_a_helper <T>::cast (p);
+ }
+ else
+ return NULL;
+}
+
/* A generic checked conversion from a base type U to a derived type T. See
the discussion above for when to use this function. */
--
1.8.5.3
More information about the Gcc-patches
mailing list