Index: gcc/is-a.h =================================================================== --- gcc/is-a.h (revision 214116) +++ gcc/is-a.h (revision 214117) @@ -46,6 +46,14 @@ 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 @@ 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. */ Index: gcc/ChangeLog =================================================================== --- gcc/ChangeLog (revision 214116) +++ gcc/ChangeLog (revision 214117) @@ -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