[dmd-beta] D 2.059 beta 3

Jonathan M Davis jmdavisProg at gmx.com
Sun Apr 8 18:07:27 PDT 2012


On Monday, April 09, 2012 09:39:16 kenji hara wrote:
> 2012年4月9日8:36 Jonathan M Davis <jmdavisProg at gmx.com>:
> > On Saturday, April 07, 2012 22:15:53 Walter Bright wrote:
> >> http://ftp.digitalmars.com/dmd2beta.zip
> > 
> > With this release, it looks like opCmp (like opEquals) needs to have
> > overloads which take both const ref and non-ref, which is fine. But the
> > obvious way to implement this seems to result in infinite recursion:
> > 
> > import std.string;
> > 
> > struct S
> > {
> > 
> >    string s;
> >    
> >    int opCmp(S rhs) const
> >    {
> >    
> >        return opCmp(rhs);
> >    
> >    }
> >    
> >    int opCmp(const ref S rhs) const
> >    {
> >    
> >        return cmp(s, rhs.s);
> >    
> >    }
> > 
> > }
> > 
> > void main()
> > {
> > 
> >    assert(S("h") < S("w"));
> >    assert(S("w") > S("h"));
> >    
> >    auto h = S("h");
> >    auto w = S("w");
> >    
> >    assert(h < w);
> >    assert(w > h);
> > 
> > }
> > 
> > 
> > Shouldn't the non-ref opCmp being calling the ref one and not itself?
> > Right
> > now, it's resulting in a segfault, because it's calling itself. Is this a
> > bug, or is it expected behavior? I'm inclined to say that it's a bug and
> > a rather serious issue in light of needing to duplicate functions like
> > opEquals and opCmp. But I may be missing something here.
> > 
> > - Jonathan M Davis
> > _______________________________________________
> > dmd-beta mailing list
> > dmd-beta at puremagic.com
> > http://lists.puremagic.com/mailman/listinfo/dmd-beta
> 
> I think this is an expected behavior.
> 
> struct S should have two opCmps, int opCmp(const ref S rhs) const and
> int opCmp(const S rhs) const, both parameter rhs should be const.
> Whole S is 'a type has mutable indirection' because S has a string
> field s,  then copying const S to mutabe S is always forbidden.
> 
> >    int opCmp(S rhs) const
> >    {
> >    
> >        return opCmp(rhs);  // copy conversion from S to const S never run,
> >        so makes self-recursion.>    
> >    }
> 
> I think the cause of issue 7864 is same.

There really should be errors for opEquals, opCmp, toString, and toHash with 
incorrect signatures, and for any of them that need multiple overloads, it 
should complain not only if any of the overloads are incorrect but if any are 
missing. The fact that it's sort that's complaining makes it very hard to 
determine what's actually wrong.

- Jonathan M Davis


More information about the dmd-beta mailing list