We often repeat advice to put `@safe:`, or some other function attribute, at the top of your modules to apply the attribute en masse.

In practice this quickly becomes infeasible. Sooner or later, a generic function is introduced to idiomatic D modules, and many of them, perhaps most of them, are more general when attribute inference is used. Any explicit attribute application disables inference of that attribute. In my experience this is by far the most common reason that blanket application of attributes is impractical.

A recent example is this Phobos PR[1] which cannot apply `@safe` module-wide because the module contains generic functions where attribute inference is desirable. In this particular case it could be avoided by defining those generic functions before declaring `@safe:`, but this is at best unintuitive organization of code, and at worst highly intrusive when the generic function is a member function as it affects the whole type. It would also affect generated documentation with the current state of our tools.

DIP 79[2] suggests a number of possible language amendments that would help with this problem. The @attribute(<boolean expression>) syntax has support from (and was originally proposed by?) Andrei, but it doesn't really help with the attribute inference problem so I think we should consider it a separate issue.

It suggests "default" as a possible function attribute which negates previously applied attributes, which seems like it would solve the problem with minimal change to the language. Maybe there is a better way, or maybe we should move forward with it. What do you think?

Fixing this problem would encourage attribute proliferation while facilitating correct use of attribute inference.

[1] https://github.com/D-Programming-Language/phobos/pull/4082
[2] http://wiki.dlang.org/DIP79

Reply via email to