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