[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
Fri Feb 3 17:14:51 PST 2012


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



--- Comment #18 from timon.gehr at gmx.ch 2012-02-03 17:14:50 PST ---
(In reply to comment #17)
> (In reply to comment #16)
> > (In reply to comment #13)
> > > Once again you are right Timon!
> > > 
> > > I was neglecting to see in the original example that the call was id(foo(y))
> > > instead of just id(y)!  I sometimes cannot penetrate your inadvertent
> > > obfuscation :)  Your original example was (should have been) sufficient.
> > > 
> > 
> > OK. What measures can I take to less obfuscate my code? =)
> 
> hehe, use temporaries to demonstrate what types should be.  Or more inline
> comments maybe.  I just missed seeing the double call in one expression.
> 
> For example, this could have been more effective:
> 
> // your definition for foo
> 
> inout(int)[] id(inout(int)[] x) { return x;}
> 
> inout(const(int))[] bar(inout(int)[] x)
> {
>    inout(const(int))[] tmp = foo(x);
>    return id(tmp); // need to be able to call
> }
> 
> > I think what you propose would work.
> > 
> > But the overload rule I want to add (see issue 7431) is actually quite
> > intuitive and I think it is a good move to make the overload rules consistent
> > enough so that we could re-use them for inout matching. It benefits code that
> > does not use inout too.
> > 
> > Not fixing the overload rules would result in inout being _more_ powerful than
> > three overloads => inout could not be replaced by three overloads
> > transparently, if it was later determined that the different const versions
> > need different function bodies.
> 
> inout is *already* more powerful.  It guarantees no molestation, even for
> mutable args.
> 

Indeed, it gives the same guarantees as const.

> But I see your point.  I'm not opposed to fixing both, but this way of
> explaining inout is simple to me, and to someone who doesn't want to get into
> the complexities of understanding overload resolution.  In other words, one
> doesn't have to be able to understand overload resolution to understand inout.
> 

One goal of overload resolution is to be as intuitive as possible. Few
programmers who use overloading are actually intimately familiar with the rules
that govern the resolution process.

> Consequently, if the way it gets implemented is that overload resolution is
> fixed, and then inout uses that, it's not any different, but it's easier to
> explain this way (IMO).
> 

That is probably true.

> > The only difference between using the repaired overload
> > resolution and your proposal I can see is that yours introduces possible
> > disambiguation in the case of multiple alias this. I don't know if this is good
> > or bad (my initial proposal had the same characteristic).
> > 
> > inout(int)[] foo(inout(int)[] x){return x;}
> > 
> > class C{
> >     int[] x(){writeln("x!");return new int[10];}
> >     immutable int[] y(){writeln("y!");return new immutable(int)[10];}
> >     alias x this;
> >     alias y this;
> > }
> > 
> > void main(){
> >     C c = new C;
> >     foo(c); // should this work or fail?
> > }
> 
> I think you give me too many headaches :)  My gut says this should fail,
> because the call is not just ambiguously typed, but what you *pass* to the call
> is ambiguous.  Consider this less benign example:
> 
> struct S
> {
>    int[] x;
>    immutable(int)[] y;
>    alias x this;
>    alias y this;
> }
> 
> x and y are not just generated temporaries, so the data you pass could be
> different depending on the compiler choice of what order to try the first three
> type constructors.
> 
> My rules depend on the assumption that the argument type is already decided. 
> In the case of literals, that's ok, because an arbitrary choice doesn't change
> code paths, just the type of the expression.
> 
> In this case, we have to cry ambiguity, and fail to compile, in the name of
> consistency.  So how to amend my algorithm?  I suppose something like:
> 
> try at a minimum immutable, mutable, and inout.  If more than one of these
> typechecks, the call is ambiguous.

What if one is a better match than the other? If it should fail I think we
should use the repaired overload resolution. It has exactly the required
semantics.

-- 
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