D Language Foundation May 2026 Monthly Meeting Summary

Mike Parker aldacron at gmail.com
Tue Aug 11 13:13:22 UTC 2026


The D Language Foundation's May 2026 monthly meeting took place 
on Friday the 8th and lasted about an hour and twenty minutes.

## The Attendees

The following people attended:

* Walter Bright
* Rikki Cattermole
* Jonathan M. Davis
* Timon Gehr
* Martin Kinkelin
* Dennis Korpel
* Átila Neves
* Razvan Nitu
* Mike Parker
* Robert Schadek
* Steven Schveighoffer
* Adam Wilson

## The Summary

### Forum moderation

I opened the meeting with a request that had come in from a forum 
user who uses the mailing list interface. He was annoyed by what 
he called "AI slop" posts and wondered if we could automatically 
moderate all first-time posters.

I explained that the request didn't quite fit the way our forums 
worked. Users didn't need to create an account to post. So in 
practical terms, moderating first-time posters would mean that 
the first post from any new account would be moderated, and all 
posts from users without accounts would be moderated. I didn't 
think that was practical. One alternative would be to require an 
account for posting through the web forum interface, since that 
was where all of the spam was coming from. The spam wasn't coming 
through the newsgroup or the mailing list. I didn't think we were 
at the point where we needed to require accounts, but I wanted us 
to make a decision about the direction we should take if the 
problem got worse.

Walter joked that one wonderful feature of our obsolete 
technology was that nobody knew how to hook up to the NNTP 
interface. I said the problem was the web forum interface. Rikki 
agreed that the spam was definitely coming through DFeed and 
suggested putting all posts from non-user accounts into the 
moderation queue automatically.

My concern with that was the moderation workload. Someone would 
have to go through every post from non-account users and approve 
it. Jonathan said he had thought an account was already required, 
so he had no problem requiring one if it simplified things. From 
his perspective, the amount of spam was already fairly high. He 
said he didn't check the forums frequently enough these days, but 
when he did, it seemed like he almost always had to remove spam. 
Because he used the mailing list, removed spam still showed up 
for him.

That was a useful perspective because I didn't see the same thing 
from the web forum side. A lot of spam either got caught by the 
filter or was removed before I saw it.

Steve asked whether anyone had talked to Vladimir about it. I 
said the user had gone to Vladimir first, and Vladimir had said 
moderation decisions should be brought to the Foundation, which 
was why the user contacted me.

Steve wasn't sure that automatic moderation would have prevented 
the AI-generated posts the user was concerned about. If the issue 
was some of the recent posts, he didn't know whether that would 
have blocked them. He didn't see an ungodly amount of spam coming 
through. Sometimes the spam filter flagged something that might 
be legitimate, and then a moderator had to approve it, but from 
his perspective there wasn't an overwhelming amount.

I said my two main concerns were, first, that requiring accounts 
might upset regular forum users who had been posting without 
accounts for years, and second, that moderating all non-account 
posts could substantially increase the moderation workload. 
Walter said we could add more moderators.

Robert suggested an automatic check for users without accounts, 
something like a simple problem they would have to solve before 
posting. I noted that something like that was already implemented 
for multiple posts in a row. I used to run into it when I was 
posting DIP evaluation results because I had to update multiple 
threads.

Razvan said that didn't necessarily solve the problem because a 
human could still post something completely random. Robert said 
the checks could at least help, and the form could tell users 
that if they were human and wanted to avoid the anti-spam 
protection, they could create an account.

Razvan suggested some sort of AI filter trained on good messages, 
which would put likely spam into the moderation queue. Walter 
found it funny to imagine using AI to detect AI-generated posts. 
Steve asked who would pay for the AI if we were talking about 
LLMs. He also pointed out that CAPTCHAs weren't perfect, since 
even moderators still received CAPTCHA requests.

He suggested a softer version of moderation. A non-logged-in user 
could be moderated at first, but if that user kept posting from 
the same IP address and email address, and the moderators 
repeatedly approved the posts, then the system could start 
letting those posts through automatically. That would avoid 
requiring a login while still putting unknown posters through 
moderation at first.

Rikki said CAPTCHAs had already been bypassed by AI, so they were 
dead on arrival. He suggested a temporary account mechanism 
instead. A user could provide the same name and email they 
already provided when posting, and the system could store that 
information in the browser. If the cookies disappeared, the 
temporary account would effectively be gone. The first post could 
go into moderation, and after that, the user would be fine. Since 
the user was already providing that information, it wouldn't add 
much friction, and it would limit the number of posts that went 
into the queue.

Timon said CAPTCHAs probably slowed down human posters more than 
bots at this point because bots could often get past them 
immediately. Walter suggested checking how fast someone responded 
to a CAPTCHA. If the response came instantly, it was probably 
automated. If the user took a few seconds to read and solve it, 
it was probably a human. Átila said that wasn't quite reliable 
with AI, since AI could take about the same amount of time as a 
smart human. Jonathan and Steve both noted that adding a delay 
would also be easy for an attacker.

Walter said D was a small target, so he wasn't sure it would be 
worth someone's time to tune an attack specifically against us. 
Steve thought that was why the existing D-programming CAPTCHAs 
had been effective. They weren't a standard Internet CAPTCHA that 
bots already knew how to bypass.

The conclusion was that no one objected to implementing some kind 
of additional protection. I said I would talk to Vladimir and see 
what he thought was feasible. Possibilities included whitelisting 
users without accounts based on IP address, storing a cookie, or 
some similar mechanism. Steve liked the cookie idea. Jonathan 
said that whatever protection went in up front, being able to 
whitelist people who had posted successfully would reduce the 
problem. Dennis noted that banning was already IP-address based, 
so a gentle approach could be to moderate the first post from a 
new IP address and then allow future posts unless the IP was 
banned.

Walter said the existing user base should automatically be 
greenlit. I also noted that the user who had raised the issue had 
volunteered to help with moderation if we needed it.

### `pragma(lint)` and linting

Rikki said Manu had asked for a new warning related to unused 
parameters and had submitted a PR that had since been closed. 
Timon had then come up with a set of requirements for how 
something like that should work. Rikki had come up with a pragma 
and someone else [had implemented 
it](https://github.com/dlang/dmd/pull/22840) more or less.

Rikki wanted to discuss the direction we wanted to take. As he 
saw it, there were three options: we could put linting into the 
compiler; we could get Rainer to make Visual D understand 
D-Scanner; or we could tell Manu to switch to an IDE that already 
supported D-Scanner. The direction we chose would determine 
whether the PR lived or died and whether it was worth pursuing.

I said that a linter in the compiler seemed to be the direction 
we had been moving toward anyway when we talked about the 
compiler as a daemon and LSP support. A linter seemed to go hand 
in hand with that. Rikki asked whether that meant we were moving 
forward with a compiler linter. I clarified that I only had the 
impression that this was where we were going. I didn't know 
whether everyone agreed.

Walter said that as he had written in the PR thread, this was a 
significant change to the language and should have a DIP. The 
pull request also needed comments in the code. As it stood, it 
looked like a big blob of code. He thought the general forum 
should be involved. Adding a linter to the language was not 
trivial, and hacking something together with links scattered all 
over the place seemed slapdash to him.

Robert said that on the LSP and compiler-daemon topic, he had 
been one of the people pushing for the daemon, but he would not 
necessarily say that was about linting. He saw the LSP work as 
being more about getting actual compile errors into the editor. 
He agreed with Walter that additional warnings could fragment the 
language. From his perspective, the compiler should be binary; 
either the code compiled or it was an error. He had recently been 
doing Python and TypeScript for work and hated dealing with 
multiple linter passes just to keep the typing somewhat strict. 
He wanted LSP support for actual errors, but he was strongly 
against lint-style warnings.

Steve also disagreed with baking it into the language. He thought 
the direction of DMD-as-a-library was a better path. If we could 
make DMD-as-a-library work, then people could build a linter 
around it. The same applied to LSP. A linter built that way would 
have access to the AST and semantic information, and if users 
wanted to configure it with UDAs or something, that could be 
explored. He didn't think the linter itself needed to be built 
into the compiler.

Walter asked whether Steve thought a UDA would be better than a 
pragma. Steve said linting was about things that were valid in 
the language but frowned upon in some contexts. You might not 
want to see `goto`, for example, even though it was valid. 
Someone might want to turn that kind of check on, but it would 
need to be a way to talk to a linter, not necessarily something 
built into the compiler itself.

Átila agreed with Steve. He didn't like the pragma. If linting 
were in the compiler, he thought we would need a way to opt out 
of checks rather than opt in. Python used comments for that. You 
could ignore a rule for a line because they really meant the code 
to be that way. Mostly, though, he thought we should just have a 
linter that depended on the DMD front end and let people use it 
or not as they saw fit.

Martin also didn't see a reason to complicate or touch the 
language with pragmas or other syntax. On the implementation 
side, he thought the linting logic could live in the front end 
directly rather than as a separate project, but only under 
constraints. It would need to be nicely separated. He didn't want 
extra ugly code scattered across unrelated parts of the codebase. 
A normal compile without linting shouldn't have CPU or memory 
overhead. He would be fine with a little extra tag or pointer on 
AST structures that linter implementations could use, but not 
with normal builds paying a significant cost.

The advantage of having linting in the compiler was that users 
could get unused imports, unused parameters, and similar warnings 
as part of a normal compile. If the goal was only IDE feedback, 
then a separate tool or daemon based on DMD-as-a-library would 
probably be fine.

Timon said he strongly agreed with Robert that a program should 
compile and be fine or not compile. He noted that the specific 
`pragma(lint)` proposal did make that true in a sense. Whether 
the code compiled would depend only on what was written in the 
source file. He wasn't invested in having a linter and was even 
against having an external tool, because that fragmented the 
ecosystem. Some people would run the linter, some wouldn't, and 
some would require linter success before checking code in. If it 
were part of the language, at least it would be clear what was 
going on.

Jonathan said he was generally not a fan of linters because they 
usually meant adding a ton of warnings, and he thought warnings 
were usually a mistake for a language. Things should generally be 
errors or not errors. A linter could be useful for catching 
things that were possibly wrong, but he didn't want any linter 
feature that turned warnings into errors. We already had issues 
with `-w`, which affected what compiled. He thought `-w` should 
stop affecting compilation entirely because it affected 
template-heavy code like `std.algorithm`.

He said that DMD-as-a-library should, in theory, allow people to 
build whatever linter functionality they wanted without adding 
anything to the language. A lot of this stuff could be solved via 
comments and the like. As long as that was available, a tool 
could do whatever without the compiler needing to do any of this. 
And anyway, linters became necessary only in C and C++ land 
because of how insane everything was that was allowed. We didn't 
have anywhere near the same level of issues that would make a 
linter as useful in D.

Adam said that Microsoft rewrote the C# compiler around ten years 
ago to support a plug-in infrastructure where you could add your 
own things. One result was that you could do some really cool 
linting around performance warnings. When he was working with 
Entity Framework, it would warn him that the way he built a call 
would be slow and tell him what to do instead.

He thought they should be warnings and not affect compilation. In 
C#, the linter warnings showed up in the IDE. They would show up 
in compilation, but you had to turn off warnings as errors to 
make it not hateful to work with. Linting was never about errors. 
It was about, here's a different way to do things. Did you not 
think about using `goto`? That kind of thing. So they needed to 
be in the front end. He wasn't saying we needed to go as far as 
writing a whole plugin infrastructure like C#. It was about 
warnings. We weren't going to be treating them as errors because 
they weren't errors.

Walter thought user plugins was interesting. For example, a 
company might want a plugin to enforce their style guide. "Don't 
use the GC", that sort of thing. That may be a perfectly 
reasonable thing, but it would be something users installed and 
turned on, not something wired into the compiler by us. He could 
see value in that, and he could ignore it if he wanted to. His 
experience with C++ linters had given him a strongly negative 
view of linters. He had run multiple commercial linters against 
code and gotten thousands of messages, none of which found actual 
errors, and different linters produced different sets of 
complaints.

If there were a plug-in architecture where individuals and 
companies could add their own linting features, that seemed fine. 
The question remained whether it should be done via a pragma or a 
UDA. He leaned toward a UDA. He also noted that DIP 1000 was, in 
a way, turning on warnings that some people liked and some people 
didn't.

Rikki said a pragma could be a statement, a declaration, and an 
attribute all at once, so it could replace comments. D-Scanner 
and dfmt did replace comments, but comments were thrown away by 
DMD anyway, so he didn't think they could be relied on for this. 
It could just be one pointer stored in the AST nodes, and it 
would be `void*` as far as the backends were concerned. So that 
would help Martin. If a pragma wasn't in a module, that module 
should never be walked by the linter. So it should be freed. It 
should never run.

Walter asked again why this should be a pragma rather than a UDA. 
Rikki said it should be a pragma, because a pragma could be a 
statement in a function body, which meant linting rules could be 
turned on and off in regions. Walter thought that was too 
fine-grained. Jonathan said that was exactly what was needed a 
lot of the time for a linter. You had to mark up your code like 
crazy to ignore this line and that line. It was either going to 
have to be comments or a pragma. A UDA wouldn't work for a lot of 
that, because it wasn't at function level for a lot of that 
stuff. Walter said that maybe it should be.

Timon warned that as soon as we had an official list of things 
that were frowned upon, some people would treat them as errors. 
That had already happened with warnings. Warnings were added, 
then warnings-as-errors were added, then dub enabled 
warnings-as-errors by default, and suddenly warnings became 
errors in practice for many people. He thought the same thing 
would happen with any linter.

He said Manu's original context had been a pull request to warn 
if a function parameter was unused. Timon thought adding more 
warnings was a terrible idea because warnings were fundamentally 
broken. At the same time, he recognized that some people wanted 
aggressive warnings because they had come to rely on them in C++ 
and then found that they got bugs in D code they would not have 
gotten in C++ with their linter settings. From his perspective, 
`pragma(lint)` had looked like the best way to satisfy those 
people without fragmenting the ecosystem too badly.

Robert thought this belonged in D-Scanner. As far as he 
understood, there had already been some work on making D-Scanner 
use the DMD front end as a library, and D-Scanner already had 
some linter steps. Timon said one concern was that D-Scanner 
could complain about code in third-party libraries whose authors 
didn't use D-Scanner and didn't want to annotate their libraries. 
Robert said D-Scanner could simply select which files to scan. If 
you didn't want to scan a third-party library, you could exclude 
it.

Steve went back to plugins. We were already going down the path 
of DMD-as-a-library, which let tools interact with the parser and 
semantic analysis. A plugin system would be a different way of 
doing something similar, so he wasn't sure we wanted plugins. As 
for the implementation, he thought the fact that pragmas could be 
statements was a strong argument against UDAs. The pragma could 
be a no-op in the normal compiler, while a tool using the DMD 
front end could interpret it.

Adam clarified that he wasn't saying we needed a full plugin 
infrastructure like C#. He was only reporting what Microsoft had 
done. He also noted that C# used comments for disabling lints 
because one lint could require you to write a comment explaining 
why you disabled another lint. That documented the reason in the 
source. ReSharper and other tools respected those comments as 
well. He thought it worked well.

Rikki said he was definitely on the side of killing off 
warnings-as-errors, though that should probably be its own agenda 
item. He also said it would be nice to support UDAs on statements.

Rikki said the big practical issue for Manu was that Visual D 
didn't support D-Scanner. It could only call the compiler. 
Talking to Rainer about getting Visual D to support D-Scanner was 
a valid option.

Martin said that implementing linting through plugins would be 
tricky, especially on Windows. Anyone who had played with D 
shared libraries knew that a plugin would need to use the same 
host compiler that had built the compiler itself. If the plugin 
needed to share the GC with the compiler, then the compiler would 
likely need to be built with a shared DRuntime. That was all 
messy.

Regarding pragmas, he saw two uses of any pragma. One was to 
introduce exceptions. In that case, he would say that was 
something for comments. That would give us the option to have the 
linter define its own little language as a comment. For example, 
in Python there was some kind of standard for type annotations 
that was supported by multiple linters. We could also come up 
with some kind of standard interface without touching the 
language itself. We didn't need UDAs or extra pragmas, just 
comments that were uninteresting for anything except the linter.

If the pragma was supposed to be used to enable or disable 
certain linter features on a per-module basis, or even more 
fine-grained on a per-function basis, he thought that was going 
to be very bad. For example, if he were writing a library and 
wanted to make sure none of his library modules had any unused 
imports or unused parameters, he would put that in the dub recipe 
or something. But it definitely wouldn't be in every little 
module, enabling a bunch of lints and disabling the others. In 
that sense, every module would need to define its own set of 
lints, saying it would only compile successfully if there weren't 
any unused inputs or unused parameters.

He thought that should be done on the command line. He saw it 
just like `-W` in GCC to enable or disable specific warnings. 
Very fine-grained stuff. If it was an external tool, he didn't 
care. Then it would be a config file. It could be a config file 
for the compiler, too. He just wouldn't like to see it in the 
module.

Jonathan didn't see how UDAs and statements could possibly work 
for any kind of introspection in general. It might work for some 
compiler stuff, but that wouldn't be at all how UDAs were used in 
general at this point. Usually you were using those and 
introspecting in your code. That wasn't going to work with 
statements.

In terms of other languages, every linter he had seen used 
comments for this stuff, so that would be the normal thing to do. 
If DMD normally stripped comments, then a better solution might 
be a flag to keep comments around for a linter. He thought Ddoc 
already needed to keep comments in some form, so the compiler 
already had some machinery for this. If it was DMD-as-a-library, 
it could just be a setting on the library interface.

Walter said we had experience with line-by-line attributes from 
the early days of `@trusted` lambdas. People would write `@safe` 
code, include `@system` code inside functions, and make it work 
by wrapping statements in `@trusted` lambdas. That got sprinkled 
through code and was ugly. Although the language still allowed 
it, it was considered bad style. He thought it had worked out 
much better to put annotations at the function level rather than 
the statement level. He was skeptical of turning warnings on and 
off statement by statement.

Jonathan said for linters, you kind of had to do it line-by-line 
or statement-by-statement. Yes, it was ugly, and that was part of 
why the whole thing sucked, but generally that was the kind of 
control you needed. He also disagreed with Walter about 
`@trusted` lambdas. They could make clear what was actually being 
trusted. Walter said that if you needed to know what was going 
on, you could make it `@safe` and let the compiler tell you.

I asked whether the discussion had moved the needle. Were we on 
board with putting a linter into the compiler or language, or 
were we saying this should be an external tool using 
DMD-as-a-library?

Walter said the next step should be a DIP. The topic was clearly 
not trivial, and a few comments plus a PR was not the right way 
to handle a major feature. Steve said the first step was to 
propose a way to communicate information for the linter in source 
code, whether through pragmas, comments, or something else. That 
would be needed regardless of whether the linter itself lived in 
the compiler.

Rikki said one of his ideas was a `LintPrograms` struct in 
`core.attribute` that could be passed to the pragma to configure 
the linter. He felt that part was solved. What he wanted to know 
was whether the idea was being killed completely. I said Walter's 
answer seemed to be that it should go into the DIP process. The 
full arguments needed to be collected in one place, not scattered 
across PR comments.

Dennis said the obvious place for this was LSP. LSP already had a 
mechanism to publish diagnostics, and those diagnostics could 
include unused parameter warnings, deprecated code, versioned-out 
code, or whatever else an IDE wanted to show. Jonathan said that 
was fine with him, though he didn't personally care much about 
either LSP or linting.

I wondered whether Visual D could use LSP. Rikki said Visual 
Studio might not understand it. Adam said Visual Studio did 
support LSP, which made sense because LSP came from Microsoft. 
Rikki said that changed things. I suggested he talk to Rainer and 
see whether that was feasible for Visual D.

### Preview switches

Átila wanted to go over old preview switches that weren't turned 
on by default. He thought we should decide whether to turn them 
on by default or consider them failed experiments and remove them.

Jonathan said that in some cases, like `nosharedaccess`, they 
needed to be fixed. Átila said he was working on that one in 
particular, but there were others that weren't such large 
changes, including `fieldwise`, `fiximmutableconv`, 
`rvaluerefparam`, `inclusiveincontracts`, `fixaliasthis`, and 
`systemvariables`.

Rikki said he had been looking at this for the first edition 
before we changed the edition plan. He suggested turning on the 
ones we wanted through editions, except for DIP 1008, which he 
thought was dead because the implementation didn't work properly, 
and DIP 1025. He thought DIP 1008 could be killed sooner if we 
were going to get rid of it outright.

Jonathan said that if we were getting rid of a switch, we could 
do that whenever. All of the enabling should go in editions.

Átila asked if we were saying to turn all the preview switches on 
by default in the next edition except for DIP 1008. I clarified 
that it should be the second edition, since the first edition was 
going to be for deprecations.

Martin said we definitely needed to go through the list one by 
one. For example, he didn't think `rvaluerefparam` was a clear 
100% yes. `fieldwise`, on the other hand, was important, though 
he wasn't sure whether it was already enabled by default. He 
remembered a problem involving unions, where hashing an aggregate 
that contained a union, or hashing the union itself, could 
combine the hashes of all union members even though only one 
member was valid. In their case, one field could be a string or 
array and another could be an integer, and the wrong 
interpretation could lead to treating garbage as an array. His 
point was that we needed to be careful and make sure each preview 
switch actually worked correctly before turning it on.

Átila wondered if we had to wait for an edition. We could turn 
preview switches on by default before an edition, and users could 
still revert them. In an edition, though, they would no longer 
have that choice.

I asked what the point of editions would be if we turned things 
on by default before the edition. Jonathan said the issue was 
breakage. If a library broke because a preview switch was enabled 
by default, and the library was not updated, then existing builds 
would break. Avoiding that was part of why we had designed 
editions the way we had.

Átila said that for the switches we wanted to keep, we could turn 
them on in the edition after the first one. For ones we wanted to 
get rid of, such as DIP 1008, he wanted to know what we should do.

Rikki said DIP 1008 simply didn't work properly. We could keep 
the command-line flag undocumented but make it do nothing, so it 
wouldn't cause an error if someone still had it switched on.

He said DIP 1000 was different. Once the fast DFA escape analysis 
was close to being turned on, we could complete DIP 1000. But 
that was still a while away. He had only been working on it since 
BeerConf, and so far it protected the stack even in `@system` 
functions without false positives.

Átila said it sounded like the first step was to make a thumbs-up 
or thumbs-down decision on each preview switch. Razvan said his 
understanding was that preview switches were experimental 
implementations of experimental features. Editions looked like an 
opportunity either to turn the good ones on by default or delete 
the bad ones, because otherwise they bit-rotted the codebase.

Rikki said someone on Discord had recently asked what would 
happen to preview switches. Rikki had answered that if a preview 
was turned on, the switch would eventually go away, because a 
preview switch was not meant to be a permanent compiler feature 
flag.

Jonathan said he would have to study what the switches did again 
because he didn't use most of them. Átila counted roughly eight 
switches, not including `nosharedaccess`. Jonathan thought 
anything that was clearly fixing an outright bug should be turned 
on as soon as possible, but other behavior-changing switches 
would be debatable.

I said that if we were going to review all the preview switches 
and decide what to do with them, we needed a process. Rikki 
suggested compiling a list of the switches we wanted to consider, 
posting it to the newsgroups, and asking whether people knew of 
any bugs. When he had looked earlier in the year, there were 
issues for some of them, but he didn't think the list was 
complete. That seemed like the first step.

Razvan thought we should look at the switches individually and 
only discuss the controversial ones, since we would probably 
reach a reasonable decision quickly on most of them. I asked 
Átila to organize the process. Martin thought one meeting could 
probably handle it, with some homework for the controversial 
cases. He thought `rvaluerefparam` and maybe `in` contracts were 
likely to require more discussion, while things like 
`systemvariables`, bitfields, and `fieldwise` were no-brainers. 
Some of the others, such as `fixaliasthis`, would need to be 
looked up, but if they were called "fix" something, they probably 
made sense.

Átila said that if we didn't want one of them, there was no point 
fixing issues with it. I said I would schedule a meeting toward 
the end of the month, and Átila should send an email beforehand 
with the list of switches so everyone could review them before 
the meeting.

__UPDATE__: There's a brief summary of the planning session at 
the bottom of this post.

### Power assignment operator

Dennis wanted to get a decision on the power assignment operator 
over with because [the PR had been 
open](https://github.com/dlang/dmd/pull/23023) for two weeks and 
was ready to merge. To him, it looked like an obvious yes.

Walter said he had complained in his reply to the agenda email 
that `a = a * b` behaved differently from `a *= b` with respect 
to value range propagation. Dennis said that wasn't value range 
propagation. The specification explicitly said that `a += b` 
included a cast, and it said that for every operator. The PR 
simply made the power assignment operator consistent with every 
other assignment operator and with the specification.

Walter agreed with that point, but said value range propagation 
had come later. When value range propagation was implemented, the 
operator-assignment cases may simply have been forgotten. He 
asked why we should have value range propagation and then ignore 
it for the operator-assignment cases.

Dennis said it was redundant because the operator-assignment 
cases already downcast by design. Walter still saw it as a value 
range propagation problem and thought that when value range 
propagation was defined or implemented, this case may not have 
been addressed. The question, in his mind, was whether to fix the 
issue by adding value range propagation to operator-assignment 
expressions or by inserting the cast as the PR did. He didn't 
think the answer was obvious. He also said he would rather remove 
the power operators anyway, since they behaved differently from 
other operators and he didn't think they were necessary.

Dennis said that removing the power operators would be a 
long-term, controversial change. In the meantime, making the 
implementation comply with the current specification seemed like 
the right thing to do.

Rikki asked Walter to reply in the email thread with how value 
range propagation was implemented, where he thought it was 
lacking, and how the issue worked. Walter said the problem was 
that `*=` and `*` behaved differently.

Dennis said the power operator wasn't even being called in the 
relevant case. The difference existed because the power 
assignment operator didn't include the cast required by the 
specification. After the PR, it would behave consistently with 
the other operators.

Walter agreed that the power assignment operator didn't currently 
do the cast that the other assignment operators did. His concern 
was that the other assignment operators themselves might be 
wrongly specified or implemented. Dennis said they were 
implemented according to the spec. Walter said he understood 
that, but the spec itself might be wrong. It might be a design 
bug that had been overlooked when value range propagation was 
added.

Dennis said that was a separate issue and shouldn't prevent 
merging the PR. Walter said that if we merged it and changed the 
behavior later, people would be angry. Dennis thought people 
would be angry either way, and the edge case of the power 
assignment operator would not move the needle much. If anything, 
what Walter was suggesting would likely be less popular because 
people already complained that they couldn't add two `short`s and 
assign the result to a `short` without an explicit cast. 
Requiring more casts for assignment operators would go in the 
opposite direction from what people wanted.

Walter said people had liked value range propagation when it was 
first added. Dennis said they liked it compared with not having 
it, but not necessarily compared with simply allowing small 
integer operations to cast back to the original small integer 
type.

Martin looked at the code and agreed with Dennis. He had 
initially been worried that the PR affected all power 
expressions, but it was really just for the power assignment 
operator. He thought the PR was correct. If Walter wanted to 
change the assignment operator behavior generally, we could talk 
about that later. It didn't need to block this PR.

Walter said Martin had a good point. Maybe this was really two 
issues, and we could go ahead with the PR. He asked if anyone 
else objected. Jonathan did not object, partly because he often 
forgot the operator even existed and doubted it affected much 
code. His only concern was whether allowing code that was 
currently disallowed could create breakage later if we changed 
direction. Dennis said any breakage from the power assignment 
operator would be overshadowed by the breakage from changing 
`+=`, `*=`, and the other common assignment operators.

Timon asked whether there were more than zero or one uses of the 
power assignment operator with small integer types in the world. 
Dennis said the bug had been filed some time earlier and had 
recently come up again, so there were at least two occurrences. 
Walter said he still wondered whether we even wanted an 
assignment exponentiation operator. Dennis said it was 
consistent, and the bug had now been raised twice.

Rikki said the power operator was used heavily in areas like data 
science and machine learning, and being able to use it with 
assignment was valuable. Walter said that if everyone wanted to 
proceed with the PR, it was okay with him, even though he would 
never use it. The power operator was of no interest to him.

__UPDATE__: The PR has since been merged.

## Conclusion

Our next monthly meeting took place on June 13th.

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

## Planning session update

We held a separate planning session on May 30th. The original 
intent was to review the preview switches, but given that we 
hadn't yet discussed the deprecated features that we wanted to 
convert to errors in the first edition, as we'd agreed [in the 
April monthly 
meeting](https://forum.dlang.org/post/gfljhyttpprhzoigmqet@forum.dlang.org), we decided to do that as well.

We began with the deprecations. We had a list of them that Walter 
had generated with a `grep` over the compiler source after the 
April meeting.

We started with the deprecations of the built-in complex and 
imaginary types. Walter thought it would be good to remove them 
from an implementation perspective, but said doing so was 
impractical because of ImportC and interoperability with C code 
that used imaginary types. After a bit of discussion, we agreed 
to undeprecate complex and imaginary types and discourage their 
use in the documentation.

That was as far as we got. The list Walter had produced was 
difficult to read and had several duplicates, so no one had 
reviewed the entire thing. Robert generated a more readable list 
that associated the deprecation messages with examples and their 
locations in the compiler. We agreed that everyone would review 
that document before the June monthly meeting and that 
deprecations would be our main focus there.

We then reviewed older preview switches with the goal of deciding 
which ones we should enable by default in a future edition, which 
ones we wanted to abandon, and which required further 
consideration.

`dip1008` was the only one we decided should not become a default 
language feature. We agreed that it had substantial problems. It 
can remain available to existing code for the time being, but it 
will not be enabled in a future edition and will ultimately be 
removed.

We decided to defer four switches for further discussion: 
`dip1021`, `fixaliasthis`, `rvaluerefparam`, and `in`. The 
aliasing checks in `dip1021` currently produce false positives 
and may ultimately be better handled by Rikki's new DFA-based 
analysis. `fixaliasthis` raised questions about the future of 
`alias this` itself. `rvaluerefparam` led to an extended 
discussion about C++ interoperability, reference semantics, 
lifetimes, and whether accepting rvalues through ordinary `ref` 
parameters obscures programmer intent. `in` raised questions 
about its `const`, `scope`, and reference semantics.

We approved enabling the following switches in a future edition: 
`fieldwise`, `nosharedaccess`, `inclusiveincontracts`, 
`fiximmutableconv`, and `systemvariables`. `nosharedaccess` still 
requires implementation work before it can be enabled.

Finally, the difficulty we had researching the deprecations and 
some of the preview switches showed that we have a documentation 
problem. Going forward, any PR adding either a deprecation or a 
preview switch should require corresponding documentation on 
dedicated pages for deprecations and preview switches as part of 
the PR.



More information about the Digitalmars-d-announce mailing list