[Issue 7355] inout incorrectly resolved if the same type has both mutable and immutable parts
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Thu Jan 26 09:20:33 PST 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7355
--- Comment #4 from timon.gehr at gmx.ch 2012-01-26 09:20:32 PST ---
(In reply to comment #1)
> My understanding is, each inout deduction from a function argument just like
> pattern matching.
>
> Parameter type: inout( int *)*
> Argument type: mutable(immutable(int)*)* // mutable(...) is pseudo modifier
> --> 'inout' is deduced to 'mutable'.
>
The compiler deduces inout to _immutable_ in this case. Other than that, it
does not make much sense to talk about a mutable pseudo modifier: inout is
transitive, but such a pseudo modifier cannot be transitive.
> I think if we allow this kind of deduction, there is an ambiguous case:
>
> inout(int) foo(inout(int**) x){ return 0; }
> void main()
> {
> immutable(int*)* x;
> foo(x);
> // inout is deduced to imuutable or const? Both conversions
> // immutable(int*)* to immutable(int**)
> // immutable(int*)* to const(int**)
> // are valid, so it is ambiguous.
> }
The same ambiguity is already resolved at other points in the compiler:
inout(int) foo(inout(int) x, inout(int)* y){ return 0; }
void main(){
immutable(int)* y;
foo(1, y);
}
inout is resolved to const, even though immutable would be a far better choice.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list