CTFE and DI: The Crossroads of D

Adam Wilson flyboynw at gmail.com
Wed May 9 13:56:38 PDT 2012


On Wed, 09 May 2012 13:45:04 -0700, Jacob Carlborg <doob at me.com> wrote:

> On 2012-05-09 21:27, Adam Wilson wrote:
>> Hello Everyone,
>>
>> I am afraid that we as a community have reached an inflection point. The
>> crossroads of CTFE and DI.
>>
>> I recently completed my work on a patch for the DI generation system. In
>> the process I solicited the feedback of the community about what should
>> and should not be in a DI file. The most agreed up point was that all
>> functions that can loose their implementations should. In the
>> communities opinion that means only auto-functions and
>> template-functions should retain their implementations.
>>
>> The problem is thus: CTFE requires that any function that it could
>> possibly evaluated by CTFE, must retain it's implementation.
>> Unfortunately, there is simply no way for the DI generation system to
>> know which functions are capable of being called by CTFE and which ones
>> actually are.
>>
>> This limitation is due to the fact that DI generation must be run before
>> Semantic Analysis because said analysis may perform significant rewrites
>> of the AST. There is even a large (for DMD) comment in the main function
>> of DMD explaining that DI generation should not be moved from where it
>> is due to the inconsistencies that could arise.
>
> In the long run the compiler needs to run some form of (limited)  
> semantic analysis to be able resolve inferred types.
>

It certainly does, but that's a LOT more work than we have time for at the  
moment.

>> The patch I created currently fails in the autotester because the
>> template function dur() in the druntime is called via CTFE from Phobos.
>> Per the community agreed upon DI rules, the function implementation of
>> the Duration constructor that is called by the dur() function is
>> stripped away and CTFE fails.
>
> A workaround to force a function/type to appear in DI files with their  
> implementation is to make it into a template.
>
> void foo () () {}
>
> Will always show up in the DI files.
>

If this example works on constructors, I have no problem making the  
changes and opening a pull on the drt assuming it doesn't semantically  
alter the function.

In the long run I think an @implementation attribute would be nice because  
I could use that to direct the DI generator to include the whole  
implementation in the DI file, and this would be an acceptable solution  
for business.

-- 
Adam Wilson
IRC: LightBender
Project Coordinator
The Horizon Project
http://www.thehorizonproject.org/


More information about the Digitalmars-d mailing list