struct Example {
    int opApply(int delegate(int x) dlg) const {
        return dlg(0);
    }
}

Example.opApply now cannot be used in a @nogc context, even though it is fully @nogc whenever dlg is.

Ditto with nothrow, pure, @safe and other attributes.

For a large code-base containing higher-order functions, this makes use of these attributes nearly impractical.

What I would like to say is something like:

struct Example {
int opApply(int delegate(int x) dlg G?@nogc T?nothrow P?pure) const @G @T @P {
        return dlg(0);
    }
}

The above would assign G to @nogc or nothing, according to whether the delegate is.
Ditto with T and nothrow, P and pure.

Then they can be used freely in other parts of the type signature.

Unlike templates, these would not require any generated code duplication (they're just for type-checking, after all).

Fixing this along-side the more minor issue of many standard libraries lacking proper annotations -- would make @nogc, pure and nothrow much more practical.

Reply via email to