summaryrefslogtreecommitdiff
path: root/gcc/is-a.h
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2014-08-18 19:50:38 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2014-08-18 19:50:38 +0000
commit26b3538ba2d537d820c45a02c11ae830093410c0 (patch)
tree9de6672999a52ba34bb22855eb614e2b5b7dc0b0 /gcc/is-a.h
parentc41b94cef21ec1b2c224bfe31223cf2e5c91305c (diff)
Introduce safe_as_a
gcc/ 2014-08-18 David Malcolm <dmalcolm@redhat.com> * is-a.h (template<T, U> safe_as_a <U *p>) New function. From-SVN: r214117
Diffstat (limited to 'gcc/is-a.h')
-rw-r--r--gcc/is-a.h24
1 files changed, 24 insertions, 0 deletions
diff --git a/gcc/is-a.h b/gcc/is-a.h
index a14e344761a..176066b42bc 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 safe_as_a <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 (safe_as_a <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
+safe_as_a (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. */