On Thu, Oct 10, 2019 at 08:00:53PM +0100, Richard Sandiford wrote:
> Ping
> 
> Richard Sandiford <richard.sandif...@arm.com> writes:
> > The current aka diagnostics can sometimes leak internal details that
> > seem more likely to be distracting than useful.  E.g. on aarch64:
> >
> >   void f (va_list *va) { *va = 1; }
> >
> > gives:
> >
> >   incompatible types when assigning to type ‘va_list’ {aka ‘__va_list’} 
> > from type ‘int’
> >
> > where __va_list isn't something the user is expected to know about.
> > A similar thing happens for C++ on the arm_neon.h-based:
> >
> >   float x;
> >   int8x8_t y = x;
> >
> > which gives:
> >
> >   cannot convert ‘float’ to ‘int8x8_t’ {aka ‘__Int8x8_t’} in initialization
> >
> > This is accurate -- and __Int8x8_t is defined by the AArch64 PCS --
> > but it's not going to be meaningful to most users.

Agreed.

> +/* Return true if it is worth exposing the DECL_ORIGINAL_TYPE of TYPE to
> +   the user in diagnostics, false if it would be better to use TYPE itself.
> +   TYPE is known to satisfy typedef_variant_p.  */
> +
> +bool
> +user_facing_original_type_p (const_tree type)
> +{
> +  gcc_assert (typedef_variant_p (type));
> +  tree decl = TYPE_NAME (type);
> +
> +  /* Look through any typedef in "user" code.  */
> +  if (!DECL_IN_SYSTEM_HEADER (decl) && !DECL_IS_BUILTIN (decl))
> +    return true;
> +
> +  /* If the original type is also named and is in the user namespace,
> +     assume it too is a user-facing type.  */
> +  tree orig_type = DECL_ORIGINAL_TYPE (decl);
> +  if (tree orig_id = TYPE_IDENTIFIER (orig_type))
> +    {
> +      const char *name = IDENTIFIER_POINTER (orig_id);
> +      if (name[0] != '_' || (name[1] != '_' && !ISUPPER (name[1])))
> +     return true;

This looks like name_reserved_for_implementation_p.

The rest looks fine to me!
--
Marek Polacek • Red Hat, Inc. • 300 A St, Boston, MA

Reply via email to