Bug with references (no casting used)

anonymous anonymous at example.com
Sat Feb 22 10:31:17 PST 2014


On Saturday, 22 February 2014 at 17:22:51 UTC, andrea9940 wrote:
> Hi everyone,
> I was trying to get my vector struct to use extensively 
> references for passing parameters and I found a subtle bug 
> which make me lose a few hour.
>
> A sample code that shows the bug is here 
> http://pastebin.com/rvcNdjAE (fails with dmd 2.064 on linux)
> I think that the code is wrong and dmd does not recognize it:
> opBinary() allocates a struct on the stack which is then 
> accepted by reference in opOpAssign.

Clarifying: The bug is that opBinary returns a reference to a
local (vector), which is invalid. I don't know if dmd should see
that, as it's hidden behind a call.

> I'd like to know if currently there are correct ways to pass 
> rvalue structs by reference or if I should pass everything by 
> value and hope the compiler optimizes all reduntant copies.

There isn't. But adding an overload that forwards to the ref
version is trivial (as long as there's only one parameter):
---
          auto opOpAssign(string op)(const Vector rhs)
          if (op == "+" || op == "-")
          {
                  return opOpAssign!op(rhs);
          }
---
I don't know if the ref even buys you anything performance-wise,
though.


More information about the Digitalmars-d-learn mailing list