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.

Richard.

>
> Martin
>
>
>>
>> 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
>>

Reply via email to