[cfe-dev] Endless operator-> chain causing infinite loop

rahul 1989.rahuljain at gmail.com
Tue Oct 22 10:45:25 PDT 2013


Thanks David, will check out and get back with further analysis.

Thanks,
Rahul


> On 22-Oct-2013, at 8:40 pm, David Blaikie <dblaikie at gmail.com> wrote:
> 
> 
> 
> 
>> On Tue, Oct 22, 2013 at 2:45 AM, Rahul Jain <1989.rahuljain at gmail.com> wrote:
>> 
>> Hi all,
>> 
>> clang version 3.4 (192772)
>> 
>> This is with respect to the following gcc testsuite TC:
>> 
>> template< int n >
>> struct a {
>>     a< n+1 > operator->()
>>         {
>>         return a< n+1 >();
>>         }
>> };
>> 
>> int main() {
>>     a<0>()->x; 
>> }
>> 
>> 
>> This TC goes into an infinite loop when compiled. Ideally it should throw the error
>> recursive template instantiation exceeded maximum depth of 256.
>> 
>> On initial investigation I found that when the constructor 
>> Sema::InstantiatingTemplate::
>> InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation,
>>                       Decl *Entity,
>>                       SourceRange InstantiationRange);
>> 
>> is run on each recursive object creation, 
>> the first thing the constructor does is check whether the recursive instantiation depth is reached or not by calling the function 
>> 
>> Invalid = CheckInstantiationDepth(PointOfInstantiation,
>>                                     InstantiationRange);
>> 
>> The above function checks whether the size of SemaRef.ActiveTemplateInstantiations(a container which stacks all the template instantiations originating from a particular PointOfInstantiation) is within the limit as specified by templateinstantiationdepth(256 by default).
>> 
>> So far, so good.
>> 
>> Now when CheckInstantiationDepth returns false, the constructor pushes the current Inst using the following statement:
>> SemaRef.ActiveTemplateInstantiations.push_back(Inst);
>> 
>> Also the push_back function correctly increments the EndX value. 
>> 
>> 
>> So ideally the size of SemaRef.ActiveTemplateInstantiations should increase from 1 to 2 to 3 to .....256 and than the error should get printed.
>> 
>> But, the EndX value which was incremented in the push_back function call is no longer reflected 
>> in the size computation done as part of the function call CheckInstantiationDepth(PointOfInstantiation,
>>                                     InstantiationRange);.
>> 
>> i.e SemaRef.ActiveTemplateInstantiations.size() always returns zero in the function CheckInstantiationDepth.
>> 
>> My question is where is the EndX value getting reset after it was rightly incremented in the push_back function call?
>> 
>> 
>> Am I missing something in my analysis above? Any help on the same would be appreciated.
> 
> Assuming there's no memory corruption, etc, presumably there's a symmetric "pop_back" call to echo the push_back (I'd hope that the symmetry is in the same object - some sort of RAII or otherwise scoped situation) you'd want to find. If it's not discoverable via code inspection, you could set a data watchpoint in your debugger to try to find it.
> 
> - David
>  
>> 
>> Thanks,
>> Rahul
>> 
>> 
>> 
>> 
>> 
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
> 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20131022/ffd03330/attachment.html>


More information about the cfe-dev mailing list