On Sun, Nov 23, 2014 at 03:12:06PM -0800, Andrew Pinski wrote: > On Sun, Nov 23, 2014 at 12:51 PM, Trevor Saunders <tsaund...@mozilla.com> > wrote: > > 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. > > In a function, I already have a const_rtx and I want to use > RTL_LOCATION to get a location for the rtx. How should I handle this > case? In 4.9, it would just work as there was no casting needed but > in GCC 5 I need to cast away the const first before I could use > RTL_LOCATION.
erf, I forgot about macros. > RTL_LOCATION does not modify at all the rtx so it should be using > as_a<const rtx_insn *>. Should I just add a cast to const_rtx inside > the RTL_LOCATION macro before doing the as_a<const rtx_insn*>? I'd say ideally it should be changed to an inline function, but casting seems pretty reasonable for now. Trev > > Thanks, > Andrew > > > > > 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 > >