D Language Foundation April 2026 Monthly Meeting Summary

Mike Parker aldacron at gmail.com
Tue Jun 23 12:09:23 UTC 2026


The D Language Foundation's April 2026 monthly meeting took place 
on Friday the 17th and lasted a little under an hour.

## The Attendees

The following people attended:

* Walter Bright
* Rikki Cattermole
* Dennis Korpel
* Timon Gehr
* Mathias Lang
* Mike Parker
* Átila Neves
* Razvan Nitu
* Mario

## The Summary

### Editions

Dennis wanted to know the status of editions. Some PRs targeting 
the first edition had already been merged, even though we had 
decided that the first edition would be limited to the removal of 
deprecated features. After a brief discuission, we agreed that we 
needed to determine exactly which deprecations would become 
errors in the first edition, make sure that those already-merged 
features did not go into it, and to prevent PRs from targeting a 
future edition until they had been approved for one.

(__UPDATE__: Getting the deprecations sorted took longer than 
expected, but in the June monthly, we went through all known 
deprecations, filtered them, and came up with a list of some that 
are good to be turned into errors in the first edition, some that 
need more discussion/investigation, and some that have been 
deprecated for less than two years and so will go in a future 
edition. I'll publish some information on that shortly.)

### CTFE-only functions

Rikki said the compiler had a lot of attribute inference 
internally, including the concept of whether a function was 
available only at CTFE. The problem was that the inference 
existed, but there was no attribute tied into it.

This was holding him back in the fast DFA engine work. Some 
source code should never have code generated for it at all, and 
therefore the fast DFA engine should never need to run on it. 
Without a way to mark that kind of code as CTFE-only, there was 
no good workaround, especially in BetterC cases involving CTFE, 
memory allocation, and so on.

He said this had been requested for many years and had come up in 
more than one DIP Ideas thread. His proposal was very simple: an 
attribute, `@__ctfe`, that would set a flag. It wouldn't affect 
overloading, would not change the type system, and would not 
introduce a new overloading scheme. As far as he knew, there were 
no real downsides. He had [a PR for the 
implementation](https://github.com/dlang/dmd/pull/22557).

I remembered that we had discussed the same general issue [in a 
quarterly meeting with Ilya from 
Weka](https://forum.dlang.org/post/ljcazyvqlmvnonmhherh@forum.dlang.org). At that time, we had discussed alternatives such as `assert(__ctfe)` and a pragma. Dennis remembered that as well and said the attribute looked good to him.

Walter said he had recently sent around an email showing how D 
already had ways to require CTFE for a function without adding a 
new feature. He had discussed it with Átila, who was opposed to 
it, but Walter wanted to know what everyone else thought. He said 
that because templates were already compile-time execution 
entities, he had found two ways to cause CTFE to happen using 
features already in the language. From his perspective, we didn't 
need to invent a new pragma, keyword, or overloading mechanism.

Rikki said that what he was proposing did not involve any of 
that. It was just a small parser change that set a flag. Walter 
said that what he had read talked about overloading and other 
things and looked like it was turning into a monster, so he 
didn't know what Rikki was proposing.

Walter asked everyone to look at the two ways he had described in 
his email. He said he had been thinking about it during the 
symposium and had concluded there had to be a way to do it with 
templates. Since templates were compile-time execution entities, 
and since he had found that they could solve the problem, he 
didn't think we needed anything new.

Dennis said it wasn't really the same thing. Walter's approach 
was a template that took compile-time arguments. CTFE could also 
just be a regular integer that was incremented in a `for` loop 
and passed to a function. You couldn't instantiate a thousand 
templates in a regular `for` loop. That required a `static 
foreach`. There was a big difference between a runtime parameter 
evaluated at CTFE and a template parameter that had to be 
constant.

Walter thought the solution was for the template to call a 
function that did the loops and other work. Since the call would 
happen in a constant expression context, the function would be 
run at CTFE.

Timon said the issue, as he understood it, was that people didn't 
want functions that were only called at CTFE to end up in the 
binary. Walter said the templates wouldn't end up in the binary. 
Timon pointed out that the function called by the `consteval` 
template would end up in the binary. Walter agreed that something 
like a factorial function would be emitted, but said linkers had 
removed unreferenced functions for decades, so he didn't see the 
problem.

Timon said it was still an efficiency concern. If the compiler 
dumped many CTFE-only functions into the object file, then it 
still had to generate code for them and force the linker to 
discard them, which added build time. Walter said he didn't see 
that as a significant problem. DMD compiled very quickly even on 
his old Linux machine, and his new Mac Mini was so fast that when 
he compiled DMD, the prompt came back almost immediately. He 
didn't see code generation for some CTFE functions as a real 
problem.

I noted that it apparently was a big problem for Weka.

Átila said DMD was not that big. He also didn't want code 
generated, didn't want template symbols generated, and didn't 
want the linker to spend any more time than it already did, 
because he hated the linker with a burning passion. He said he 
wanted to use CTFE specifically because he didn't want templates. 
Templates took too long, and Symmetry had had linker issues 
because of templates in the past. Walter asked if those issues 
had been resolved. Átila didn't think so.

I clarified from the old summary that the problem hadn't been 
getting rid of functions at link time. The problem had been 
spending compiler cycles generating code for functions that would 
only be thrown away at link time.

Átila said he had run into other metaprogramming cases where he 
was forced to use templates because he didn't have this feature. 
For example, he might want to break long code into functions so 
that he could read it later. But if the code involved a string 
mixin, and he needed to pass the string to a helper function, he 
had to use a template parameter because there was no other way to 
get that string into a function that would mix it in. With 
CTFE-only functions, he could use a normal string parameter 
because the compiler would know the function was compile-time 
only.

I noted that in the previous discussion, Walter had advocated for 
`assert(__ctfe)` for the same reason he was advocating templates 
now: avoiding new language changes. But in that meeting, everyone 
had converged on an `in` contract. Walter asked if there was a 
written proposal for the contract approach.

I found [the old meeting 
summary](https://forum.dlang.org/post/ljcazyvqlmvnonmhherh@forum.dlang.org) and [the original proposal](https://forum.dlang.org/post/veqgighfeexaxrgpwnuj@forum.dlang.org). Ilya had originally proposed an attribute, which he called `@ctOnly`. In the quarterly meeting, we had discussed that attribute and alternatives such as `assert(__ctfe)` and `in(__ctfe)`. We had settled on the contract approach. No one had ever submitted a DIP for it.

Dennis looked back at the thread and said he had highlighted some 
linker problems with the contract approach and that there had 
been no response since. He said Ilya didn't want the contract 
approach because it could result in linker errors.

Rikki said he had solved the linker errors in his implementation. 
It had to be done in glue code, unfortunately, but it was 
solvable. The attribute version would produce a compiler error 
instead of a linker error because the compiler would see the 
reference to the CTFE-only function.

Dennis said the whole idea of conflating contract programming 
with this felt so wrong. Any design change regarding contract 
programming would have to keep in mind this special case we 
bolted on to it. It seemed way cleaner to keep it all separate. 
He was fine with Rikki's PR as it was.

Walter also noted a problem with inheritance. If a function were 
CTFE-only and not emitted, then an overriding function with an 
`in` contract would have trouble because the parent function 
wouldn't be there in the first place. Timon agreed that you 
couldn't widen the `in` contract in that case. Dennis said that 
was a good point, since derived classes could loosen an `in` 
contract.

Dennis said he was fine with Rikki's PR as it was. The syntax was 
already valid, it didn't add a new attribute in the sense of 
adding new surface syntax, and the compiler already had the logic 
for compile-time-only functions. The pull request just connected 
the existing syntax to the existing logic. In a perfect world, 
maybe we wouldn't need the optimization, but pragmatically, it 
seemed good enough.

Rikki then gave his objection to the `assert(__ctfe)` approach. 
If the compiler had to look for an assert somewhere in the 
function body and decide whether it had to apply the flag, it 
would have to deal with `is`, type analysis, and Boolean algebra. 
When looking at a function's parse tree, that assert could be 
multiple layers deep, requiring a nasty tree walk. With an 
attribute, the parser saw it and set the flag. That was much 
simpler and much harder to get wrong.

I suggested that the way to go would be a short DIP describing 
the attribute, the alternatives, and why the attribute was 
better. Timon said it should also explain the interactions with 
inheritance.

Dennis asked whether anyone had hard objections to the pull 
request. Átila said he didn't. Dennis said the feature had been 
bikeshedded for a long time and requested multiple times, so his 
position was to just merge it. It wasn't perfect, but it was good 
enough.

I asked whether it broke anything. It seemed completely additive. 
Dennis said it technically was additive, but we maybe could 
imagine some potential breakage. I said in that case, the 
question was whether we needed to put it in an eidtion. Átila 
didn't think so. He couldn't see how it would break anything. 
Nothing currently had the attribute. You had to add it.

Walter reviewed the PR and asked whether the attribute 
participated in or influenced overloading in any way. Rikki said 
it didn't touch the type system in any way. Walter asked whether 
it was the same as Adam Ruppe's implementation in OpenD or 
whether Rikki had reinvented it. He thought Adam had mentioned 
problems with his version and wanted to know whether those 
problems existed in Rikki's implementation. Rikki didn't remember 
anything like that. He said he hadn't handled inheritance, so 
inheritance wouldn't be taken into account.

Walter asked Rikki to compare his implementation with Adam's and 
see if anything had been missed. Timon noted that Adam's 
implementation appeared to be in semantic, while Rikki's was in 
code generation.

After reviewing the PR some more, Walter said he had no more 
objections. I said Rikki could write a DIP and we could push it 
through the process. Walter then said that the README on the PR 
was probably most of what a DIP would contain. He was thinking 
that we might not need a DIP if there were broad agreement. Átila 
and Dennis both said they thought we should just merge it. Walter 
agreed.

Walter conceded that the template explosion in his own proposal 
could be a problem. He could see the point. He thanked Rikki for 
doing the work and carrying it through.

(__UPDATE__: Rikki's PR was merged on May 8.)

### GSoC proposals and the D Programming Language Symposium

Those were the only agenda items. I asked if anyone had anything 
else.

Razvan reminded Átila that the following Tuesday was the deadline 
to submit rankings for the GSoC proposals we had received. Átila 
said he would get the ones for his project sorted by then. He 
already knew which one was his top pick.

I asked how the symposium at Yale had gone and whether the 
students there seemed interested in D. Walter said it went very 
well. Átila said the students had questions, were focused, and 
paid attention. Andrei had also shown up.

Walter said Mike Shah had done a terrific job organizing the 
event. The students who came were motivated and interested, asked 
appropriate and insightful questions, and were all extremely nice 
to him. The Yale campus was beautiful, and he had enjoyed the 
trip.

Dennis asked how Andrei was doing and whether he still used D. 
Walter said Andrei arrived that morning and Walter had to leave 
early in the afternoon, so they had very little time to talk. 
That was Walter's only disappointment. He would have liked more 
time to catch up with Andrei. Átila had talked with him a little 
longer, though he also had to return to a panel.

Walter said one piece of feedback from the symposium amused him. 
Someone had written that they hadn't known Walter really hated C. 
He was a little perturbed by that because he didn't hate C. He 
thought C had been a wonderful language forty years ago, but 
today it seemed very primitive. In his view, C was obsolete, not 
something he hated.

### DMD globals, the front end as a library, and LSP work

Rikki said Luna had asked in Discord what was holding DMD back 
from removing its extensive use of globals and making it 
instanceable.

Dennis said the short answer was a bunch of refactoring work. He 
asked if Luna's goal was making the compiler multithreaded or 
using it as a library. Rikki said she was interested in using it 
as a library and was running into problems with missing symbols 
in the front end.

Walter said removing globals was an ongoing process. He regularly 
eliminated them, but globals permeated the program and it would 
take a long time to untangle them all. He had recently been 
looking at the DWARF debug emission code, and it was heavily 
dependent on globals. That would take a while to fix.

Dennis guessed that Luna was mostly interested in the front end. 
Walter said that the lexer and parser, at least, didn't rely on 
globals. Rikki said the lexer did rely on them because of 
identifiers. Dennis said there were many cached class instances 
for basic types and common identifiers, plus other global caches. 
Walter said that if it was just a global cache for identifiers, 
he didn't see the problem. Identifiers could be shared across all 
processes and threads.

Rikki then pointed out that memory allocation itself was a 
problem. It was all meant to go through an arena, and that arena 
would have to be per compiler instance as well. Walter said that 
was a problem he hadn't thought of.

Rikki suggested that Razvan talk with Luna and see whether she 
could help do some planning for moving forward. He wasn't 
necessarily saying she should work on it, but perhaps she could 
help identify pieces of the work. Razvan said that sounded good 
and that the work could easily be bundled with the GSoC project 
for separating semantic routines.

Dennis said he had also been looking into globals because he'd 
been experimenting with a personal LSP branch for DMD. The idea 
was to make DMD support the Language Server Protocol for IDE 
integration. For that to work, DMD would need to be able to reset 
all state between runs, because a language server usually runs as 
a daemon. It could restart sometimes, but ideally it shouldn't 
need to exit just to clear compiler state. That meant either 
getting rid of globals or at least consolidating them so that all 
global state could be reset.

I asked when we had gotten an actual LSP branch for DMD. Dennis 
clarified that it was just his personal branch, not anything 
official. He had shown an early version to Robert and Walter at 
the previous DConf. He thought LSP support was a high priority 
for D.

I said I'd thought all the refactoring would have to come first. 
Dennis said removing globals was not strictly required, though it 
would make things much cleaner. Currently, the API had functions 
to initialize and deinitialize the DMD front end. Those functions 
set or reset the globals and could be called over and over again. 
That wasn't optimal, but it was probably good enough for many use 
cases.

The next step was to build prototypes and see what actually 
happened: how much memory leaked, how much work was required to 
plug the leaks, and how many easy fixes there were. DMD currently 
leaked memory intentionally, so closing enough of those leaks to 
make the front end usable as a long-running service would be 
hard. But Dennis thought it was doable in the short term.

### AI-assisted contributions

Dennis said he'd been using Claude Code for various things and 
had found it very capable for certain tasks. But AI was moving 
fast, was controversial, and raised questions about how far we 
should go. He had ambitious ideas, such as giving an agent a 
larger refactoring task like eliminating globals or even trying 
to make parts of DMD multithreaded just to see how far it could 
get. But AI could also cause a lot of churn and introduce subtle 
mistakes, so he wanted to know how comfortable everyone was with 
that.

Walter said he wasn't comfortable with giant PRs. He was fine 
with using AI to help, but the work needed to come in small, 
reviewable chunks. A PR that claimed to fix all the global 
variables at once would be impossible to review.

Átila said his Yale talk had literally been about using AI agents 
to hack on D, so he was very bullish on it. He agreed with Walter 
that even if an agent could do a big task, that didn't mean the 
result should be submitted as one big PR. It had to be 
reviewable. On the question of AI introducing mistakes, he said 
the answer was to have a really solid test suite so that we could 
have confidence in the changes. That wasn't unique to AI. He 
didn't trust human code either, including his own.

Mathias said AI was a tool. If the tool made a developer more 
productive, then by all means use it, but the contributor still 
owned the code. His understanding of the Linux kernel's stance 
was similar: the person submitting the code was offering the 
code, and they were using a tool. Claude or whatever else was not 
the contributor.

Walter agreed. Blaming the AI wasn't acceptable.

Dennis said he wasn't trying to blame AI. He'd been using it in a 
reserved way, more as a starting point, and still looked deeply 
into the code himself. But he had also seen people at the other 
extreme, running multiple agents in parallel, letting them hack 
at everything, and then committing the results without looking at 
the code. He was not a fan of that. There was a whole spectrum 
between full vibe coding and very careful, slight-improvement 
modes. That was the space he wanted to explore a bit.

Walter said that sounded good.

Timon said he had seen people recommend using AI, saying you let 
the AI do its thing and then you debug what it did. In his 
experience, the other way around worked better.

Razvan said it depended on the task. For a refactoring task, you 
could have a relatively high degree of confidence, especially 
with tests. But for designing something specific that had to 
integrate into a large codebase, the code would need more careful 
auditing.

Timon said he had asked Claude to get exceptions to work in 
WebAssembly, and it had done it in about eight hours. It seemed 
to work for his use case, but he had no idea what it might have 
broken.

Rikki reminded everyone that [he had a PR 
open](https://github.com/dlang/dmd/pull/21364) to add to 
`CONTRIBUTING.md` that tools were not responsible, humans were. 
We had talked about it in a previous meeting, but the pull 
request hadn't moved forward. He asked someone to review it, make 
suggestions, or merge it if it was fine. We needed to communicate 
our stance on AI usage.

Átila said he and Andrei had been trying to convince Walter to 
get on the agent bandwagon at Yale. Andrei had recently given a 
talk in which he told the audience to stop using ChatGPT to 
generate code. When a few people reacted, he followed up by 
saying they should use agents instead.

Átila said one important thing he had learned recently was to 
have the agent ask questions instead of making assumptions. 
Otherwise, it would create a plan that made no sense. Tell it to 
create a plan to do X, but ask questions first. When he'd tried 
that, it had brought up failure scenarios he hadn't considered. 
He thought that was useful.

With refactoring, a good test suite was especially important. If 
the code still behaved the same way after the refactor, that was 
what mattered. He still reviewed the code, but he was 
increasingly relying on tests, provided the tests were actually 
testing the right thing.

As an example, he said that if you were writing a build system 
that generated Makefiles, a bad test would simply check whether 
the output files looked like what you expected. That would be 
brittle because Make itself didn't care about formatting. The 
better test would be to have Make verify the semantics. That kind 
of test design wasn't something he thought AI was capable of 
doing for you. If you had the test in place, you might not even 
care about what the code looked like.

Rikki asked whether, given that we had Andrei around again, there 
was any chance we could get NVIDIA to donate some plans to us. 
The free LLMs he had access to weren't good, and he didn't have 
the money to pay for better ones. He said NVIDIA had an open 
source portal and gave away some free support or usage, so maybe 
we could convince them to help us because we were an open source 
project.

Walter said that with Codex, as he understood it, you paid $20 a 
month and that was it. Átila and Mathias both said you absolutely 
could run out of tokens, depending on what you did. Rikki said 
the higher-tier plan was much more expensive.

Walter said he had heard of people getting huge unexpected bills 
from Claude while trying to build things using AI, and that kind 
of thing was concerning. I asked whether there were any local 
models that were good for this. The answer was basically no. 
Dennis said local models existed, but they were a whole league 
below Codex, Claude, and the other big models.

There was a bit of discussion about the hardware required to run 
good local models. Rikki asked how many of us had a bank of RTX 
5090s. I clarified that he meant NVIDIA's top-of-the-line 
consumer graphics cards. Timon noted that the professional cards 
with HBM memory were more appropriate for some applications, but 
they were well outside the comfortable price range for most 
people. I mentioned that some people were buying Mac Studios for 
this kind of work and were looking forward to the M5 because it 
was expected to be an especially strong consumer compute machine.

## Conclusion

Our next monthly meeting took place on May 8th.

If you have anything you'd like to bring to us in a monthly 
meeting, please let me know.



More information about the Digitalmars-d-announce mailing list