On Tuesday, 30 January 2018 at 14:01:00 UTC, bauss wrote:
unittest {
auto a = foo(); // This should fail, because a is never used.

No it shouldn't. It is assigned to a variable, as the constraint said.


// This should also fail, because b is never used actually used afterwards.
    auto b = foo()
    b.morph();

No it shouldn't. It is assigned to a variable, as the constraint said.


   // This should fail, because d does not use c.
// A simply analysis of d will not work, you'll have to track all passed values to d and whether they themselves should be tracked with the attribute.
   auto c = foo();
   d(c);

No it shouldn't. It is assigned to a variable, as the constraint said.


// Same as above, should fail too since d doesn't use the return value
  d(foo());

No it shouldn't. It is passed to a function, as the constraint said.


}

The above is going to be very complex to implement in the compiler.

Sure a simple check if it has just been assigned to a variable would work fine, but in the reality people would most likely just do something like this then:

auto unused = foo();

And there ... we "hacked" our way around the attribute.

Yes, that's the point. Now it's visible that you're discarding the result.

The point isn't actually to make sure people keep the variable around - that'd be silly - it's to inform the programmer that potentially important information is discarded, and to stop the programmer from calling mutating functions on a temporary return value where it will have no effect.

For pure functions, this gives a warning:

auto fun() pure { return 3; }

unittest {
    fun(); // calling without side effects discards return value
}

Does that in any way whatsoever stop me from assigning the return value to a variable and then ignoring it? No. But doing so would make me an idiot. The compiler suggests I cast it to void if I really intended to discard the result. The reason for this is cast(void) is relatively easy to grep for, and sticks out like a sore thumb when looking through the code.


So for it to work it has to track every single return value from a function that implements the attribute and that is borderline impossible to get correct.

No it's not. It's *perfectly* impossible the way your scheme works. What does this function do to its parameters?

extern(C) void foo(S s);

In other words, your idea of perfectly tracking how a value is used cannot be implemented at all. Trying to equate that with what I'm asking is disingenuous.

--
  Simen

Reply via email to