On Wed, 2014-08-13 at 07:48 -0600, Jeff Law wrote:
> On 08/13/14 04:07, Richard Biener wrote:
> > On Wed, Aug 13, 2014 at 12:01 PM, Martin Jambor <mjam...@suse.cz> wrote:
> >> Hi,
> >>
> >> On Wed, Aug 06, 2014 at 01:19:44PM -0400, David Malcolm wrote:
> >>> 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);
> >>
> >> A tiny bikeshedding, disregard it if you don't like it: however, the
> >> "nullable" part of the name suggests the pointer can be NULLed in the
> >> process.  I think that variants of functions that survive NULL
> >> arguments are traditionally called "safe" in gcc, so what about
> >> "safe_as" (or safely_as)?
> >
> > Ok, I resisted at first starting the bike-shedding but I agree on
> > the badness of "nullable" (what does that mean anyway?).
> > as_a_safe or safe_as_a both work for me.
> Then let's go with that.
> 
> David, pick one of those and adjust accordingly.  Hopefully the cases 
> where you have to adjust aren't too many.
> 
> Adjusting any patch already approved with the name change is pre-approved.

Thanks.  I went with "safe_as_a<>" and (after bootstrapping&regrtesting)
committed the attached to trunk, as r214117.

Dave
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 <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 @@
   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.  */
 
Index: gcc/ChangeLog
===================================================================
--- gcc/ChangeLog	(revision 214116)
+++ gcc/ChangeLog	(revision 214117)
@@ -1,3 +1,7 @@
+2014-08-18  David Malcolm  <dmalc...@redhat.com>
+
+	* is-a.h (template<T, U> safe_as_a <U *p>) New function.
+
 2014-08-18  Jan Hubicka  <hubi...@ucw.cz>
 
 	* ipa-visibility.c (update_visibility_by_resolution_info): Do no turn UNDEF

Reply via email to