[cfe-commits] r59232 - /cfe/trunk/lib/Analysis/GRExprEngine.cpp

Zhongxing Xu xuzhongxing at gmail.com
Sun Nov 16 21:22:10 PST 2008


On Mon, Nov 17, 2008 at 1:14 PM, Zhongxing Xu <xuzhongxing at gmail.com> wrote:

>
>
> On Sun, Nov 16, 2008 at 12:27 PM, Zhongxing Xu <xuzhongxing at gmail.com>wrote:
>
>>
>>
>> On Sun, Nov 16, 2008 at 11:28 AM, Ted Kremenek <kremenek at apple.com>wrote:
>>
>>>
>>> On Nov 15, 2008, at 5:55 AM, Zhongxing Xu wrote:
>>>
>>>
>>>> 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.
>>>>
>>>> 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).
>>>>
>>>
>>> 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):
>>>
>>> template<typename const T> struct FoldingSetTrait<const T*> {
>>>  static inline void Profile(const T* X, FoldingSetNodeID& ID) {
>>>    ID.AddPointer(X);
>>>  }
>>> };
>>>
>>
>> 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.
>>
>
> I was wrong. That was not g++ bug.
>
> The template argument const T& need a const type. But const MemRegion* is
> not a const type,
> but a non-const pointer to const MemRegion. So T must match the entire
> 'const MemRegion*'.
>

If T only matches 'MemRegion*', then the substituted type would be
'MemRegion* const', that is a const pointer to non-const MemRegion.

So if we write

template <typename T>
inline void Add(T const & x) { FoldingSetTrait<T>::Profile(x, *this); }

that would be less confusing.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20081117/5ee25951/attachment.html>


More information about the cfe-commits mailing list