digitalmars.D.announce - D Language Foundation January 2026 Monthly Meeting Summary
- Mike Parker (429/429) May 02 The D Language Foundation's January 2026 monthly meeting took
The D Language Foundation's January 2026 monthly meeting took place on Friday the 16th and lasted about 50 minutes. The following people attended: * Walter Bright * Rikki Cattermole * Jonathan M. Davis * Mathias Lang * Mike Parker * Átila Neves * Razvan Nitu * Robert Schadek * Steven Schveighoffer * Nicholas Wilson Rikki said that people had been trying for a long time to find a safe way to cast `shared` off of an object. This was kind of important, because if you couldn't do it safely, then you were basically in ` system` territory, which wasn't a good thing. He thought there was a simple way to solve it using a new storage class, `onstackonly`. Any value marked with it would be stack-only and couldn't go into another variable with an equal or longer lifetime. It couldn't be put into return values, globals, pointers, or anything similar. It could be passed down the stack and put into `scope` things. He asked if the storage class made sense. Nicholas asked whether this needed to be another storage class, or whether it was already covered by `scope`. Rikki said `scope` was very similar, but it didn't communicate the same thing. Jonathan said that without DIP 1000, `scope` didn't do much. He wasn't even sure that what it currently did was memory safe, because without DIP 1000 it mostly took the programmer's word for it. With DIP 1000, extra checks were added, but without it, `scope` was kind of iffy. He also suspected that we'd need to see a DIP listing it out in detail before we could really understand what Rikki was getting at. Walter said he didn't understand what it meant to cast `shared` off safely and asked Rikki to write up a short description. Rikki said he could do that, but he wanted first to determine whether this was something worth sending straight into development with a DIP. Mathias said his understanding was that Rikki wanted to be able to cast `shared` away in a safe context. Rikki said it was. Mathias didn't see how it would be safe then if you passed it down the stack. Walter said the only way to do that was by putting a mutex on it and then casting away `shared`. Mathias agreed, but said that if `shared` was in ` system` territory, trying to paint ` safe` over it defeated the type system. Jonathan said that if there were a mutex associated with a variable, and the language understood that association, then in theory there might be limited contexts where the compiler could implicitly cast `shared` away safely. That, to an extent, was what Andrei's proposal about `shared` for synchronized classes had been trying to do. It was very limited in what it could do. There would still be many cases where you'd have to use ` system` casts because the language couldn't understand every strange thing someone might want to do. It might be possible on a limited basis, but only if we could associate a mutex with specific variables. Steve didn't know why D needed to support casting `shared` away in a safe context without something like ` trusted`. At that point, the programmer was writing ` system` code anyway. Even if the language could understand that a particular mutex was tied to one particular shared thing, the model would be extremely limited and still wouldn't be immune to problems such as deadlocks. This had been a chronic problem with `shared`, which was why the way forward was basically to say you couldn't access shared data directly. You had to first cast it away through a system function and build safe primitives around that using trusted code. Jonathan said it wasn't like what we were trying to do with DIP 1000 in the sense that we had what you could currently do in the language and determine was memory safe, but in theory we could make more stuff memory safe with some extensions. The question was whether we could make enough additional stuff memory safe. With DIP 1000 there had been a lot of issues where it had been over complicated in order to get that extra benefit. The basic concept of being able to say "here's a set of things we can do where shared is removed, and therefore, there's more code that can be memory safe without ` trusted`" was great. The question was whether any particular solution would be simple enough to be usuable while still allowing enough to make it the extra complication worthwhile. Átila asked whether this would really be better than a library solution, since he had written one and thought its API was pretty good. The code that did the actual casting was ` trusted`, but it presented a safe interface. He didn't see why a new language feature was necessary. Rikki said that without a borrow checker, the library couldn't really ensure that the lock was held as long as there was any reference to the protected data. Átila said that was probably good enough. Robert said that from what he had seen, the two solutions that had really been adopted for sharing data across threads were atomics and message passing. Everything in between was half-baked. It was a nice solution in no man's land and nobody wanted to go there. It didn't give you enough and was too complicated for what it gave you. So either you were very smart and used atomics and then fell on your face, or you used message passing. Then it was good enough. Jonathan understood why Rikki didn't want to invest the time to figure out or implement a solution if he wasn't sure it would be accepted. But any solution like this would require a detailed DIP explaining exactly how it would work. If it was too complicated, it wouldn't fly. If it didn't allow much more than D could already do, that probably wouldn't fly either. Without an actual proposal, we could only talk in generalities, and that wasn't very useful. Walter said that one of Rust's features was that it prevented data races. He thought that fell out of the borrow checker semantics. He said he had implemented a borrow checker for D and nobody wanted it. It was only a proof of concept and didn't cover every detail, such as lazy functions, but he had seen no point in continuing because not a single person had wanted the feature in D. If people didn't want a borrow checker, he didn't see a reason to go further down the path of trying to solve this by adding more language machinery. D should use mutexes or the other usual techniques. Robert said there was an interesting story that had recently come up regarding Rust in the Linux kernel. The kernel developers had needed to mark some code as unsafe to do something they wanted, and then they ran into an issue where they corrupted memory. His point was that the cool things they wanted to do, they weren't able to do in safe Rust, so they basically slapped ` trusted` or ` system` on it and let it rip, and it ripped right into memory and they had a segfault and stuff. He understood the desire for compiler-validated, memory-safe shared code, but roughly 60 years of computer science research had not yielded the perfect solution. He doubted there was one. The understandable solutions for the average programmer were atomics and message passing. I said it sounded like the the consensus was against Rikki's proposal. Átila agreed. I suggested Rikki's next step if he wanted to pursue it would be to put a written proposal together. Not necessarily a full DIP, but something in the DIP Ideas forum. Rikki said it looked more like this would become documentation for how the problem _could_ be solved, rather than the direction we actually wanted to go. Walter said it was still worth taking a shot at the problem. He didn't think Rikki needed a detailed proposal right away, just a general proposal about how it might possibly work, posted to the DIP Ideas forum, so people could react to it. Átila said we had a library solution for this anyway. Just use it. Could we guarantee at the compiler level? No, but that was fine and would be good enough. He thought we should make `preview=noSharedAccess` the default in the next edition, which was why he was trying to get the runtime to compile with it. We could move forward with that, then you were on your own with anything that didn't go through a library like the one that associated a mutex with a variable. Or you could do what Robert said and pass messages around or use atomics. He thought that would cover nearly all the bases. Languages like Pony had more ambitious solutions, but they paid for that with an incredibly complicated type system. Walter then reminded everyone we had synchronized classes. Átila immediately said he wanted to delete those, too. Walter had been about to say that D could remove them in an edition. Átila reiterated that he wanted to nuke them. Jonathan generally agreed, but he expected some people would complain, including Funkwerk. He also pointed out that `preview=noSharedAccess` still had issues that needed to be fixed before it could be enabled. One problem was that we had no way to distinguish between a reference to a shared object and whether the reference was also shared, especially with classes. That could become a problem with member functions. He wasn't sure how we could tackle that. As a general thing outside of member functions, he thought it required another helper struct to fix it, just like `Rebindable`. We needed to get those details sorted before we enabled it. Átila said this was another consequence of classes being references by default. If the pointer were explicit, then `shared` could be applied to the pointer or to the type as needed. Jonathan agreed that the missing syntax was the problem. He said Amaury had suggested in the past that classes should have been written as pointers everywhere. They would still be reference types, but the pointer would be explicit. Átila agreed. Nicholas asked whether the explicit `this` parameter that had come up in discussions about DIP 1000 and attributes could be a solution to this. Jonathan said that could potentially help. Steve said explicit `this` only changed syntax, not semantics. Jonathan agreed that an explicit `this` by itself wouldn't be enough, but coupled with explicit pointer syntax for classes, it could work. I asked if Rikki was good with the outcome, and then we moved on. (__UPDATE__: Rikki subsequently posted [a writeup in the DIP Ideas forum](https://forum.dlang.org/post/pwhgwshfxfunwtflhmfz forum.dlang.org).) Rikki shared [a link to an example of some error message output](https://gist.github.com/rikkimax/f39721fe9f9377efe6896b30ad39c860?permalink_comment_id=5916804#gistcomment-5916804). He said that “diagnostic reporting” was his name for a style of compiler error message for compilers that he thought originated with Rust. It was nice in that it went line by line using ASCII graphics to show exactly where error messages applied in the source code. The output was quite dense, but it was nice to see and often used for static analysis. He said he would need this for the fast DFA engine once he added tracing support. He'd written some toy code that converted existing error messages and found that the they were pretty bad in this style. He proposed we add a new message style for this kind of output. iskabon10, who had worked on error messages as part of SAOC, had offered to do it. Robert believed the next GCC release, and therefore the next GDC release, would have an error reporting style very close to this. He gave the proposal two thumbs up. He'd been pedantic in the past for people to have a look at Elm's error messages, which he found even better. If some of that influence could be sprinkled in, he welcomed it. Good error messages mattered because error messages were basically the user interface for developers. We should make them awesome. Steve seconded Robert. He'd spent about a year working on the new GC using SDC, and the error messages were atrocious, basically dumps of LLVM internal representation. Any time we could make error messages better, we should. Jonathan expected there would be some bikeshedding over exactly how the output looked, but he didn't think anyone would argue against making error messages clearer. The tracing information Rikki was talking about would be helpful. For example, with `scope` in DIP 1000, one of the big problems had been presenting error messages without that kind of tracing information. If DMD could provide explicit tracing info for attribute inference or whatnot, he didn't think anyone would complain about getting additional information. In the worst case, it would be too verbose. We'd need an extra flag to make it spit out more stuff, but he thought it was a clear win. Nicholas was all for it. Adding a new error style was the right way to do it, because that would avoid mucking up the whole test suite. Eventually, if the new style was well liked, we could merge it into the default style kind of like we did with context output and keep the test suite using the simpler style. I asked whether Rikki had gotten what he needed. He said there was one more thing. Currently, the error message code had about four modules sitting in the DMD directory. He thought it was time to refactor that into a package, maybe something like `dmd.messages`, especially if we were going to add modules. That needed Walter's approval. Walter said he had split `ErrorSink` into a separate module in order to stop the intricate interdependencies among the various pieces of the error message stuff. He didn't think putting things into a package would improve anything. What would improve things, and what he had already done in places, was to stop calling `error` directly and instead call through `ErrorSink`. Getting the whole compiler transitioned to that would make it much more practical to build an LSP server, because it would eliminate the global-variable problem. To him, that was more useful than putting modules into packages. He asked which modules Rikki wanted to put into a package. Rikki said he didn't remember all of them offhand. Nicholas thought one of them might be related to a previous student project involving a generic interchange format similar to LSP. I asked if that was SARIF. Nicholas said he didn't know, only that it was an acronym. Rikki said there were four related modules currently sitting in the DMD directory, and at least one or two more would be added for the new diagnostic style. Some things that were currently private would also need to be split into another module for utility code related to line coloring and stuff. In his view, it really needed to be in a package, and it would be better if that were done first. Walter didn't think it needed to be done first, since packaging was simple and could always be added later. He wasn't sure what the gain was. Rikki asked Nicholas whether he could handle that aspect. Nicholas said he'd be happy to. Razvan reminded everyone that GSoC's application period for mentoring organizations would open at the end of January. As usual, we needed mentors. Based on past experience, the people in the meeting were the most likely mentors because people from the wider community usually didn't step up. He urged us to think about whether we had work that could benefit from student help and could reasonably be done in eight to twelve weeks. He would take care of the application, but we needed project ideas with mentors attached. In 2025, we'd submitted four projects and received only two slots. Typical organizations of our size had more like six to fifteen projects. The more projects we submitted and the more engaged mentors we could show, the better our chances of being accepted. If we applied again with only two, three, or four projects, he feared our chances would be slim. He also reminded everyone that a person couldn't be the principal mentor for more than one project. Someone could be a secondary mentor on two or three projects while serving as principal mentor on one. But if we wanted to increase our chances, people needed to step up. He had made a forum post, but the pattern was that people often had plenty of project ideas and were much less willing to mentor them. The real need was for mentors. (__UPDATE__: We very recently recieved word on our application status. I expect an announcement from Razvan is forthcoming. I don't want to steal his thunder.) Steve said some people had complained recently that when you went to the old Bugzilla page, it redirected to GitHub, but not to the specific issue that had been opened. Instead, it redirected to the GitHub DMD issue list. He thought this was really bad and asked whether there was a way to restore Bugzilla. A lot of bugs had already been closed by the time of the migration and weren't moved to GitHub. Without the old instance, all that history was lost. I said he should probably talk to Vladimir Panteleev, since he was likely the person who had done the redirect. Steve said Bugzilla had been chronically going down. I said that then that would instead be Brad Roberts. I wasn't sure whether Vladimir had ever migrated everything from Brad. There'd been some talk about doing that. Vladimir was definitely the person to talk to about the status. Walter said that, worst case, all Bugzilla postings had also been sent to him by email, so he had an email archive of every Bugzilla message. Steve noted that they were also on the newsgroup. I thought we had an archive of the database anyway. Jonathan said the related issue was link preservation. The old links were floating around online in various posts, so ideally those links should still work. If the old site couldn't be restored, then it couldn't be restored, but ideally it would come back in a way that allowed those links to resolve. Walter said that email wasn't the greatest way to access the data, but we did have it, and a program could always reconstruct a website from it. He saw that Rikki was shaking his head and asked why. Rikki said he had tried to use the newsgroup interface to look at issues for a specific case and couldn't find all the messages. He thought some might be missing because of age. Walter said he had all the messages unless his mail system had failed and caused him to miss a few. He'd been collecting them since Day One, though he hadn't done anything with them. Steve would be surprised if the Bugzilla instance data didn't still exist somewhere. He assumed Brad still had it and just hadn't wanted to keep the instance running. It would be crazy if all that data had been thrown away. Walter agreed completely and said it needed to be online somewhere. I was sure the data was still there and that somebody had simply redirected the site. The decision had been to put the Bugzilla instance into read-only mode and leave the links active. I looked at the DNS. `issues.dlang.org` was a CNAME that pointed to `issues-d.puremagic.com`, which was Brad's domain, but was redirecting to GitHub. Going to the `issues-d.puremagic.com` directly ended up at the D auto-tester on `autotester.puremagic.com`. Mathias said that this was likely a different virtual host or server configuration issue. The redirect was probably coming from the server, not from DNS, because DNS couldn't redirect to a subpath of an HTTP URL. I said that meant Brad was the person we needed to talk to. Walter said that, at the very least, perhaps he could download the Bugzilla database and we could set it up on another server. I thought Vladimir might already have it. I would email him first and ask. If he didn't know what was going on, then Walter or I could reach out to Brad. I told Steve the issue was off his hands now. Walter said the best outcome would be to get the database, put it on one of D's own servers with the other infrastructure, and just leave it there. (__UPDATE__: After some email back and forth, we got everything sorted. https://issues.dlang.org/ now points to a Bugzilla archive on one of our servers, courtesy of Vladimir Panteleev.) Walter said a recent newsgroup discussion about the release cadence had made him realize how critical it was to get an AArch64 version of DMD. He had taken a short break from working on the code generator to work on other parts of D, but he was now back to trying to get the AArch64 code generator working. At the moment, he was taking every test case in the test suite and running it through the compiler to see whether the compiler crashed while trying to compile it. It was difficult to run the resulting programs because there wasn't yet a working AArch64 DRuntime, but he could at least try compiling them. Once every test case compiled without crashing, the next step would be to try building the compiler itself as an ARM executable. He was making progress, though he didn't know how long it would take. He also noted that he had put an 80-bit floating-point emulator on the Summer of Code project list. He'd found that if he gave ChatGPT a prompt, it would generate an 80-bit floating-point emulator. That might make the project relatively simple, but it raised a question: if D incorporated ChatGPT-generated code into the codebase, what would the copyright status be? Jonathan said one concern he had, though he expected many people would disagree, was that if GPL code was being fed into LLMs, then arguably anything produced from those models was derived from GPL code and should also be GPL. He didn't know what the legal outcome would be because it hadn't really been tested. In that sense, he thought it was fairly dangerous to use LLM-generated code unless there was a compelling reason. Walter said he knew how to implement floating-point code and had done it before. It was just convenient to have ChatGPT do it for this kind of constrained problem, where the requirements were completely specified. Robert disagreed with Jonathan. The genie was out of the bottle. From his point of view, whether outputs from LLMs inherited copyright constraints from their inputs was the trillion-dollar question, and if a court eventually ruled that they did, the economy would tank. Walter said he would at least put a note on any generated code saying it was ChatGPT-generated and we wouldn't try to claim copyright on it ourselves. Nicholas said D already had LLM-denoted sections from Vladimir, who had used Claude rather than ChatGPT in some recent pull requests. Rikki said he had used Gemini to generate code in DMD, specifically some math for the fast DFA engine's point analysis. It was simple stuff he couldn't be bothered to figure out manually, and he had personally verified it. But he drew a distinction between small utility code and something like an 80-bit floating-point emulator. Small verified code was one thing. A whole module was another. Walter said the emulator didn't need to be complete. It only needed to implement add, subtract, multiply, divide, compare, and conversions. It didn't need to emulate every x87 function. Steve said that ethically, with LLM-generated code, the more obscure the problem, the more likely the model had seen only a few examples of that problem being solved, and therefore the more likely it was to produce something close to a copy-paste solution. Asking it to make a checklist program was probably fine. Asking it to make an 80-bit floating-point emulator might be different, because there might be very few examples to draw from. Robert told Walter that talk was cheap. He suggested Walter put $20 into Claude tokens, give it the last x87 floating-point test suite, tell it to implement the emulator and not change the tests, then make coffee and see what happened. The result might be surprisingly good, half bad, or at least a useful starting point. It would be a fun thing to try. Walter said he did have an excellent test suite for 32-bit and 64-bit floating-point code that had served him well when he implemented floating-point code by hand in the 8088 days. Robert said that made the experiment even better. For fun, Walter could spend another $20 having one model generate a test suite and another implement the emulator. Rikki said he'd been using Google's Antigravity editor with D. It had successfully fixed bugs in the fast DFA engine. For about $15 a month, the paid plan gave higher limits, extra code features, and Gemini thinking. He hadn't yet run into any limits. Our next meeting was a January 23rd planning session focused on editions. We held our next monthly meeting on February 13th. If you have anything you'd like to bring to us in a monthly meeting, please let me know.
May 02








Mike Parker <aldacron gmail.com>