[dmd-internals] where is opAssign?

Trass3r mrmocool at gmx.de
Fri Mar 12 10:58:09 PST 2010


> I had a look at the new operator overloading and I can't seem to find  
> opAssign in opover.c.
> http://www.digitalmars.com/d/2.0/operatoroverloading.html#Assignment
>

Ok, found it. I guess writing "if (!s && !s_r && op != TOKequal && op !=  
TOKnotequal && op != TOKassign)" in opover.c:458
should prevent this bug: http://d.puremagic.com/issues/show_bug.cgi?id=3935

The only question is if this is intended.

Should opAssign stay or should it be opBinary!("=")?


Furthermore, where are the checks that are suggested by  
http://www.digitalmars.com/d/2.0/operatoroverloading.html#Assignment

The following compiles even though opAssign(T) isn't allowed "where T is  
the same type as the aggregate type A"
struct Foo {
	void opAssign(Foo f)
	{
	}
}
void main() {
     Foo f;
     f = f;
}

The only implemented check I could find is the following from  
AssignExp::semantic, line 8931 but this one is only for classes.


     else if (t1->ty == Tclass)
     {	// Disallow assignment operator overloads for same type
	if (!e2->type->implicitConvTo(e1->type))
	{
	    Expression *e = op_overload(sc);
	    if (e)
		return e;
	}
     }


More information about the dmd-internals mailing list