From: David Malcolm Date: Mon, 18 Aug 2014 19:50:38 +0000 (+0000) Subject: Introduce safe_as_a X-Git-Tag: releases/gcc-5.1.0~5405 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=26b3538ba2d537d820c45a02c11ae830093410c0;p=thirdparty%2Fgcc.git Introduce safe_as_a gcc/ 2014-08-18 David Malcolm * is-a.h (template safe_as_a ) New function. From-SVN: r214117 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 55b41ae582fe..bc5c327b9310 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2014-08-18 David Malcolm + + * is-a.h (template safe_as_a ) New function. + 2014-08-18 Jan Hubicka * ipa-visibility.c (update_visibility_by_resolution_info): Do no turn UNDEF diff --git a/gcc/is-a.h b/gcc/is-a.h index a14e344761af..176066b42bca 100644 --- a/gcc/is-a.h +++ b/gcc/is-a.h @@ -46,6 +46,14 @@ TYPE as_a (pointer) do_something_with (as_a *ptr); +TYPE safe_as_a (pointer) + + Like as_a (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 *ptr); + TYPE dyn_cast (pointer) Converts pointer to TYPE if and only if "is_a pointer". Otherwise, @@ -185,6 +193,22 @@ as_a (U *p) return is_a_helper ::cast (p); } +/* Similar to as_a<>, but where the pointer can be NULL, even if + is_a_helper doesn't check for NULL. */ + +template +inline T +safe_as_a (U *p) +{ + if (p) + { + gcc_checking_assert (is_a (p)); + return is_a_helper ::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. */