First Draft: Static Single Assignment

Paul Backus snarwin at gmail.com
Fri Nov 28 03:25:27 UTC 2025


On Sunday, 16 November 2025 at 01:50:16 UTC, Walter Bright wrote:
> On 11/14/2025 11:13 PM, Walter Bright wrote:
>> https://www.digitalmars.com/d/archives/digitalmars/dip/ideas/Single_Assignment_1765.html
>
> Ooops! forgot the linky:
>
> https://github.com/WalterBright/documents/blob/master/final.md

Take these two rules:

> A `ref` cannot be taken of a `final` declaration

> `final` can be applied to function parameters, but overloading 
> is not affected. Hence, it has no effect on name mangling.

Now, consider their effect on the following code:

     void foo(ref int n) {}
     void foo(ref const int n) {}

     void bar(ref inout int n) {}

     void baz(T)(auto ref T t) {}

     void main()
     {
         final int n;
         foo(n); // Error - selects non-const overload
         bar(n); // Error - substitutes mutable for inout
         baz(n); // Error - calls baz!int(ref int)
     }

In all of these cases, the function calls *could* be made to 
work. But because `final` is a storage class, not a type 
qualifier, it cannot participate in overload selection, `inout` 
substitution, or template instantiation, and the compiler cannot 
figure out how to call the function correctly.

It is worth noting that all three calls would succeed if `final` 
were replaced with `const`.

If `final` is implemented as proposed, these kinds of edge cases 
will severely hinder its adoption.


More information about the dip.development mailing list