http://d.puremagic.com/issues/show_bug.cgi?id=7355



--- Comment #6 from timon.g...@gmx.ch 2012-01-26 09:55:37 PST ---
(In reply to comment #5)
> (In reply to comment #3)
> 
> > The typeof resolves to error because inout resolves to immutable.
> 
> As I said, it should fail to match or match mutable and fail to call.  I'm not
> sure which is correct, but I feel either way that the assert should fail.  If
> it's resolving to immutable, I think it's a bug, not because it's not passing,
> but because it's failing for the wrong reason.
> 
> I think your expectations would be a violation of const. 

No.

> Let's assume inout
> did resolve to const for foo, and the function could be called:
> 
> immutable int x = 5;
> immutable(int)* xp = &x;
> immutable(int)** xpp = &xp;
> 
> const(int *)* y = foo(xpp);
> 
> int z = 2;
> 
> *y = &z; // this should pass, since I can assign int* to const(int*).

You cannot assign anything to const(int*), that is the point of const.


> 
> assert(*xp == 2);
> z = 3;
> assert(*xp == 3); // oops!  changed data perceived as immutable!
> 
> Is there an error in my example?  I think it comes down to this:
> 
> immutable(int *)* foo(immutable(int *)* x) // inout == immutable
>     const(int *)* foo(    const(int *)* x) // inout == const
>           int **  foo(          int **  x) // inout == mutable
> 
> none of these can be called with immutable(int)** because there is no implicit
> cast to the parameter.  I don't think const(immutable(int)*)* reduces to
> const(int *)*.

It does. The second version is callable with immutable(int)**. Not fixing this
would mean there are cases where code duplication is more expressive than
inout.

> 
> This does take some mental effort, so I may have made a mistake :)  I hate
> double pointers...

We have:

immutable(T) is a subtype of const(T).

=> immutable(int) :< const(int)

const(T*) :< const(S*) iff const(T) :< const(S)

=> const(immutable(int)*) :< const(int*)

const(T)* :< const(S)* iff const(T) :< const(S)

=> const(immutable(int)*)* : const(int*)*

qed

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------

Reply via email to