On Wed, 16 Dec 2009 09:21:16 -0500, Michel Fortin <michel.for...@michelf.com> wrote:

On 2009-12-16 08:54:03 -0500, "Denis Koroskin" <2kor...@gmail.com> said:

I just realized that 'inout' could have a real use even for functions with no return value. Consider this:
        void doSomething(inout(Object)[] a, inout(Object)[] b) {
a[0] = b[0]; // works only when objects in both arrays have the same constness.
        }
 Doesn't work.
 doSomething("hello", "world");

Well, of course it doesn't...

Here's what I meant:

        void doSomething(inout(MyStruct)*[] a, inout(MyStruct)*[] b) {
a[0] = b[0]; // works only when structs in both arrays have the same constness.
        }

This is dangerous.

We should figure out a reason why this shouldn't compile. It's hard for me to wrap my head around it. Either the implicit cast when calling the function shouldn't work, or the assignment shouldn't work. My intuition is that the implicit cast should fail.

Consider the following function with today's notation:

void doSomething(const(MyStruct)*[] a, const(MyStruct*)[] b) {
  a[0] = b[0];
}

Now:

immutable(MyStruct)*[] im;
MyStruct*[] mut;

MyStruct *s = new MyStruct;
mut ~= s;

im.length = 1;

doSomething(im, mut);

Oops, without a cast, we have changed s into an immutable struct. Hidden inside a function no less!

Does this code compile today? If so, we need to fix this. With this fixed, the inout version naturally becomes invalid.

-Steve

Reply via email to