Instantiate local class at the end of its definition

Michael Park mcypark at gmail.com
Sun Mar 22 20:04:34 PDT 2015


ping

On 23 February 2015 at 03:08, Michael Park <mcypark at gmail.com> wrote:

> Hi Richard,
>
> I forgot about this for long time but I had a chance this weekend to
> revisit it.
>
> I've added the part to save and restore the pending local instantiations
> around the calls to instantiate the class body and its members. But I'm
> uncertain whether we need/want the vtable related code here since I don't
> think we actually have a way to use the vtable in this context. It also
> seems that we don't need an instance of *LocalInstantiationScope* here
> since we don't have any template parameters to store at this level.
>
> Sorry for the delay in the follow-up, once I get feedback from you the
> subsequent ones will be much quicker.
>
> Thanks,
>
> MPark.
>
>
>
>
> On 29 September 2014 at 11:05, Richard Smith <richard at metafoo.co.uk>
> wrote:
>
>> On Tue, Sep 23, 2014 at 2:33 PM, Michael Park <mcypark at gmail.com> wrote:
>>
>>> I tried adding *LocalInstantiationScope* around
>>> *PerformPendingInstantiation*, like so:
>>>
>>> // A static constexpr member function of a local class can be used in
>>>> // a constexpr expression right after the local class' definition.
>>>> // We need to instantiate them now, otherwise it may be too late.
>>>> LocalInstantiationScope Local(SemaRef);
>>>> SemaRef.PerformPendingInstantiations(/*LocalOnly=*/true);
>>>> Local.Exit();
>>>
>>>
>>> but it didn't seem to work. I'm not sure what I'm missing here. Could
>>> you give me a hint please?
>>>
>>
>> This is the bit I was referring to:
>>
>>   SavePendingLocalImplicitInstantiationsRAII
>>       SavedPendingLocalImplicitInstantiations(*this);
>>   std::unique_ptr<SavePendingInstantiationsAndVTableUsesRAII>
>>       SavePendingInstantiationsAndVTableUses;
>>   if (Recursive) {
>>     SavePendingInstantiationsAndVTableUses.reset(
>>         new SavePendingInstantiationsAndVTableUsesRAII(*this));
>>   }
>>
>> [...]
>>
>>   PerformPendingInstantiations(/*LocalOnly=*/true);
>>   Scope.Exit();
>>
>>   if (Recursive) {
>>     // Define any pending vtables.
>>     DefineUsedVTables();
>>
>>     // Instantiate any pending implicit instantiations found during the
>>     // instantiation of this template.
>>     PerformPendingInstantiations();
>>
>>     // Restore PendingInstantiations and VTableUses.
>>     SavePendingInstantiationsAndVTableUses.reset();
>>   }
>>
>>
>>
>>> Thanks
>>>
>>> On 25 August 2014 01:30, Richard Smith <richard at metafoo.co.uk> wrote:
>>>
>>>> It would be better to save and restore the pending local instantiations
>>>> around the calls to instantiate the class body and its members, as we do
>>>> elsewhere when we perform local pending instantiations.
>>>>
>>>>
>>>> On Fri, Aug 22, 2014 at 2:41 AM, Michael Park <mcypark at gmail.com>
>>>> wrote:
>>>>
>>>>> Fixes http://llvm.org/bugs/show_bug.cgi?id=20625
>>>>>
>>>>> _______________________________________________
>>>>> cfe-commits mailing list
>>>>> cfe-commits at cs.uiuc.edu
>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>>>>
>>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150322/693115f9/attachment.html>


More information about the cfe-commits mailing list