Consider this example:
// In module foo.d:
void baz(bool condition, lazy int value)
{
if (condition)
writeln(value);
}
// In module bar.d:
import foo;
bool someCondition() { return false; }
void main()
{
auto vals = [1, 2, 3, 4];
while (!vals.empty)
baz(someCondition(), items.moveFront());
}
There is **absolutely NO WAY** to figure out what's wrong at the calling
site. You need to check /every/ method call and make sure nothing weird
is happening (e.g. lazy), and it's pretty much impossible to figure it
out unless you're intimately familiar with the entire library you're
calling -- something which (obviously) doesn't scale.
I don't know of a similar example off the top of my head for out/ref,
but the same idea applies.
Is this convincing enough that we need to document storage classes at
the CALLING site, rather than just the CALLEE site?