Request for Comment assert(__ctfe)

Johannes Pfau nospam at example.com
Tue Apr 7 11:41:32 UTC 2020


Am Mon, 06 Apr 2020 13:49:19 +0000 schrieb Atila Neves:

> On Monday, 6 April 2020 at 13:41:52 UTC, Stefan Koch wrote:
>> On Monday, 6 April 2020 at 10:14:24 UTC, Atila Neves wrote:
>>> On Sunday, 5 April 2020 at 12:11:23 UTC, Stefan Koch wrote:
>>>> [...]
>>>
>>> Wouldn't it be easier to skip codegen for private functions that are
>>> never called from non CTFE contexts?
>>
>> Easier from the user-perspective yes.
>> From the compiler perspective,
>> That's another step which may take quite a while to do correctly.
>> The easy thing would be (Essentially an (N*M) loop over all calls and
>> functions),
> 
> Where N and M are all calls and private functions in one module,
> not all code in a project.
> 

In fact, you can't do that in current D. I thought about it some time 
ago, consider this valid D code:

---------------------------
module foo;

private void privateFunc() {}

public void publicTemplate(T)()
{
    privateFunc();
}
---------------------------

Let's say I compile module foo into libfoo. libfoo internally never uses 
publicTemplate. An external user instantiates publicTemplate ==> 
privateFunc needs to be emitted in libfoo.

Now you can't even check that privateFunc is never called, cause you 
can't analyze the template without instantiating it. And in general, you 
can't instantiate it without knowing the template instance type 
parameters. (In this simple example you might think this should work. But 
just imagine that I can pass in a type with an enum string member, which 
I can then mixin in the template, ....)


Generally the only way to solve this seems to finally implement export 
properly, as it was proposed years ago. Then privateFunc should be 
flagged export (needed for windows DLL support and linux .so selective 
exports anyway) and you could probably strip uncalled, non-exported 
private functions.


TLDR: It's certainly not easy to implement.

-- 
Johannes


More information about the Digitalmars-d mailing list