On Sun, Nov 23, 2014 at 12:05:52PM -0800, Andrew Pinski wrote:
> Hi,
> While working on a patch to change some error to inform, I changed
> the as_a cast in RTL_LOCATION to be as_a <const rtx_insn *>. This
> falls down when you start with a rtx rather than a const_rtx..
so, don't do that? if you have a const_rtx use as_a<const rtx_insn *>,
otherwise as_a<rtx_insn *>. I can't think of a case where it is
necessary to cast to const rtx_insn * from rtx, instead of letting the
constification be implicit.
Trev
>
> I had to modify is-a.h to this but I really don't like the
> modification at all since it shows the bigger issues with templates.
> Can anyone think of a better way of supporting this? Attached is my
> patch currently which is able to bootstrap with the modification to
> RTL_LOCATION being there.
>
> Thanks,
> Andrew Pinski
> Index: is-a.h
> ===================================================================
> --- is-a.h (revision 217985)
> +++ is-a.h (working copy)
> @@ -147,10 +147,26 @@ struct is_a_helper
> {
> template <typename U>
> static inline bool test (U *p);
> + static inline bool test (T *) { return true; }
> template <typename U>
> static inline T cast (U *p);
> };
>
> +
> +template <typename T>
> +struct is_a_helper<const T*>
> +{
> + template <typename U>
> + static inline bool test (const U *p);
> + template <typename U>
> + static inline bool test (U *p) {return test(const_cast<const U*>(p));}
> + static inline bool test (const T *) { return true; }
> + template <typename U>
> + static inline const T *cast (const U *p);
> + template <typename U>
> + static inline const T *cast (U *p) { return cast(const_cast<const U*>(p));
> }
> +};
> +
> /* Note that we deliberately do not define the 'test' member template. Not
> doing so will result in a build-time error for type relationships that
> have
> not been defined, rather than a run-time error. See the discussion above
> @@ -169,6 +185,15 @@ is_a_helper <T>::cast (U *p)
> }
>
>
> +template <typename T>
> +template <typename U>
> +inline const T*
> +is_a_helper <const T*>::cast (const U *p)
> +{
> + return reinterpret_cast <const T*> (p);
> +}
> +
> +
> /* The public interface. */
>
> /* A generic test for a type relationship. See the discussion above for when