<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Nov 16, 2008, at 9:22 PM, Zhongxing Xu wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><br><br><div class="gmail_quote">On Mon, Nov 17, 2008 at 1:14 PM, Zhongxing Xu <span dir="ltr"><<a href="mailto:xuzhongxing@gmail.com">xuzhongxing@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"> <div><div></div><div class="Wj3C7c"><br><br><div class="gmail_quote">On Sun, Nov 16, 2008 at 12:27 PM, Zhongxing Xu <span dir="ltr"><<a href="mailto:xuzhongxing@gmail.com" target="_blank">xuzhongxing@gmail.com</a>></span> wrote:<br> <blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"> <div><div></div><div><br><br><div class="gmail_quote">On Sun, Nov 16, 2008 at 11:28 AM, Ted Kremenek <span dir="ltr"><<a href="mailto:kremenek@apple.com" target="_blank">kremenek@apple.com</a>></span> wrote:<br> <blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"> <div><br> On Nov 15, 2008, at 5:55 AM, Zhongxing Xu wrote:<br> <br> <blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"> <br> One side problem is that I cannot make the MemRegion* in the ImmutableList const. If I did that, I would get compile error, related to FoldingSet Profile() overloading.<br> <br> It seems that ImmutableList cannot take a const type as template parameter, otherwise the  two Profile functions in the partial specialization of FoldingSetTrait would have the same signature. (FoldingSet.h:444, 447).<br> </blockquote> <br></div> Could we provide a partial specialization of FoldingSetTrait just for ImmutableList?  Or, does (something like) this work (i.e., add another partial specialization for const types):<br> <br> template<typename const T> struct FoldingSetTrait<const T*> {<br>  static inline void Profile(const T* X, FoldingSetNodeID& ID) {<br>    ID.AddPointer(X);<br>  }<br> };<br> </blockquote></div><br></div></div>Yeah, this works! Thanks. Incidentally, do you think the old problem is caused by a g++ bug, because, at FoldingSet.h:234, the parameter for Add() already contains 'const', T should not contain 'const' when being instantiated.<br> </blockquote></div><br></div></div>I was wrong. That was not g++ bug.<br><br>The template argument const T& need a const type. But const MemRegion* is not a const type,<br>but a non-const pointer to const MemRegion. So T must match the entire 'const MemRegion*'.<br> </blockquote></div><br>If T only matches 'MemRegion*', then the substituted type would be 'MemRegion* const', that is a const pointer to non-const MemRegion.<br><br>So if we write <br><br>template <typename T><br> inline void Add(T const & x) { FoldingSetTrait<T>::Profile(x, *this); }<br><br>that would be less confusing.<br></blockquote><br></div><div>The problem is that we want a 'const MemRegion*' so that Profile() operators on constant objects.  If we had:</div><div><br></div><div>  const MemRegion* R = ..</div><div>  FoldingSetNodeID& ID;</div><div>  ID.Add(R);</div><div><br></div><div>then (I don't believe) that this wouldn't work if we change Add() to take a "T const& x" because it would require that the const qualifier in 'const MemRegion*' to be cast way.</div><div><br></div><div>Is it possible to add a partial specialization just for pointer types?  e.g.:</div><div><br></div><div><template const T*></div><div>inline void Add(const T* X) { .... }</div><div><br></div><div>This seems simpler and also means that the pointer is passed-by-value instead of passed-by-reference (which is less error prone).</div></body></html>