Jump to page: 1 2 3
Thread overview
Universal Function Attribute Inference
Feb 28, 2024
Paul Backus
Feb 29, 2024
Dukc
Feb 29, 2024
Paul Backus
Feb 29, 2024
Sebastiaan Koppe
Feb 29, 2024
Paul Backus
Apr 05, 2024
Dom DiSc
Mar 09, 2024
Walter Bright
Mar 09, 2024
ryuukk_
Mar 17, 2024
Timon Gehr
Mar 20, 2024
Paul Backus
Apr 05, 2024
Dom DiSc
May 30, 2024
Atila Neves
May 23, 2024
zopsicle
May 24, 2024
Paul Backus
May 26, 2024
Dukc
May 01, 2024
Zach Tollen
May 16, 2024
Quirin Schroll
May 16, 2024
Paul Backus
February 28, 2024

Description

Currently, function attributes and function parameter attributes are only inferred by the D compiler for certain kinds of functions. This DIP idea proposes that such inference be extended to all non-overridable functions with bodies.

The primary goal of universal inference is to solve D's "attribute soup" problem without breaking compatibility with existing code. Compatibility with existing code makes universal inference a better solution to this problem than "@safe by default," "nothrow by default," and other similar proposals.

Overridable functions (that is, non-final virtual functions) are excluded from universal inference because their bodies may be replaced at runtime.

For cases where attribute inference is not desired, an opt-out mechanism will be provided.

Currently, .di files generated by the compiler do not include inferred function attributes. This will have to change.

Related Links

February 29, 2024

On Wednesday, 28 February 2024 at 17:18:04 UTC, Paul Backus wrote:

>

[snip]

I do not personally care whether inference is on or off by default. It's easy to toggle when I want anyway. On balance maybe I prefer it being off by default, simply because of backwards compatibility.

Still, this is a worthwhile direction to pursue. I'm sometimes annoyed that I can't specify a return type for a function and still turn attribute inference on (without making it a template), or that I can't turn attribute inference off for templates or function literals. If the proposal will address those, I might well support it.

I feel this proposal is orthogonal to the question of attribute defaults per se - we will still want to debate the defaults regardless of inference - but it will certainly take pressure off from that question. Especially if this dip will include an ability to turn any function attribute either on, off, or to be inferred. In that case it'll be trivial for anyone to add their favorite default attributes on top of each module, and selectively override those as needed. Something like:

module example;

@safe:
@autoinpure:
@autonothrow:
@gc:

pure int failsCompilationIfImpure(int) => // ..

@trusted int canBeUnsafeInternally(int) => // ...

@autonogc T sometimesNogcTemplate(T)(int) => // ...
March 01, 2024
On 01/03/2024 2:46 AM, Dukc wrote:
snip

Dukc makes a good point, being able to override inference is important when it fails to work with other functions or scenarios (such as globally set attributes).

We will need to consider adding the opposite of a given attribute, to maximize the possibility of inference not interfering with peoples code negatively.
February 29, 2024

On Wednesday, 28 February 2024 at 17:18:04 UTC, Paul Backus wrote:

>

[...]

What about only doing inference when something fails to compile due to a missing attribute?

Say a nothrow function calling a non one. Compiler detects it, but before erroring out checks if the function is implicitly nothrow and then continues accordingly.

Opting out can be done by setting incompatible attributes. E.g. if I explicitly mark a function as system, no amount of inference will enable it to be called from safe.

That way you can have almost no attributes anywhere except for e.g. @safe on main and get safety everywhere or an error

February 29, 2024

On Thursday, 29 February 2024 at 21:21:12 UTC, Sebastiaan Koppe wrote:

>

On Wednesday, 28 February 2024 at 17:18:04 UTC, Paul Backus wrote:

>

[...]

What about only doing inference when something fails to compile due to a missing attribute?

This would completely break separate compilation, but it would still be a bad idea even if it didn't. Having the attributes of a function depend on the code that calls it violates modularity and creates all kinds of opportunities for "spooky action at a distance."

Also as far as I can tell there is literally zero upside to this approach compared to the original version. What is all of this additional complexity supposed to be buying us?

February 29, 2024
On Thursday, 29 February 2024 at 14:03:30 UTC, Richard (Rikki) Andrew Cattermole wrote:
> We will need to consider adding the opposite of a given attribute, to maximize the possibility of inference not interfering with peoples code negatively.

I agree that adding opposites for the remaining function attributes without them is a good idea, but it isn't strictly necessary. Even if you only have a single @noinfer attribute, you can simulate "impure" and "@gc" like this:

    @noinfer @safe nothrow @nogc
    void inferImpure() {}

    @noinfer @safe pure nothrow
    void inferGC() {}

    // Will never be pure or @nogc
    void example()
    {
        inferImpure();
        inferGC();

        // etc.
    }

The main benefit of @noinfer (compared to impure/@gc) is that it does not require adding a new reserved word. Since one of the main benefits of universal inference is that it works with existing code, I plan to propose it for inclusion in the base language edition, and that means avoiding breaking language changes.
March 09, 2024
The main difficulty with this is it requires the compiler to compile all the functions in the "header" files. This is a significant performance penalty. That is why the current scheme only infers for functions that the compiler must compile anyway, such as templates and auto functions.

I'm not necessarilly saying "no", just that everyone should be aware of this.
March 10, 2024
On 10/03/2024 9:07 AM, Walter Bright wrote:
> The main difficulty with this is it requires the compiler to compile all the functions in the "header" files. This is a significant performance penalty. That is why the current scheme only infers for functions that the compiler must compile anyway, such as templates and auto functions.
> 
> I'm not necessarilly saying "no", just that everyone should be aware of this.

There is some concern with multi-step builds yes.

However we do have a solution that while it isn't ready for use today, it could be made ready once a preview switch has been implemented.

The .di generator.

It could be a while until we could turn the preview switch on, perhaps two or three editions.

A bit of an adjustment yes, but the benefit means no more attribute soup to write for non-virtual code so I expect it to be worth it!
March 09, 2024
On Saturday, 9 March 2024 at 20:33:35 UTC, Richard (Rikki) Andrew Cattermole wrote:
> On 10/03/2024 9:07 AM, Walter Bright wrote:
>> The main difficulty with this is it requires the compiler to compile all the functions in the "header" files. This is a significant performance penalty. That is why the current scheme only infers for functions that the compiler must compile anyway, such as templates and auto functions.
>> 
>> I'm not necessarilly saying "no", just that everyone should be aware of this.
>
> There is some concern with multi-step builds yes.
>
> However we do have a solution that while it isn't ready for use today, it could be made ready once a preview switch has been implemented.
>
> The .di generator.
>
> It could be a while until we could turn the preview switch on, perhaps two or three editions.
>
> A bit of an adjustment yes, but the benefit means no more attribute soup to write for non-virtual code so I expect it to be worth it!

If there is a significant build penalty, than i hope it's opt-in, i personally do not use any of the attributes
March 10, 2024
On 10/03/2024 10:26 AM, ryuukk_ wrote:
> If there is a significant build penalty, than i hope it's opt-in, i personally do not use any of the attributes

It shouldn't be significant.

It is a minor cost as things go, no reason to start thinking opt-in at this stage.
« First   ‹ Prev
1 2 3