A few bugs connected to structs

Benjamin Thaut code at benjamin-thaut.de
Wed Jan 11 23:02:19 PST 2012


Am 11.01.2012 20:05, schrieb Timon Gehr:
> On 01/11/2012 05:58 PM, Benjamin Thaut wrote:
>> 1. It's currently not possible to overload opAssign for structs with a
>> template because opAssign(T)(T rh) if(is(T == typeof(this)))
>>
>> is not allowed (stated in the documentation). And templates can not
>> overload non template functions (already a known bug).
>>
>> 2. It's not possible to use auto ref with opAssign because
>> opAssign(T)(auto ref T rh) if(is(T == typeof(this))) is not allowed
>> (partly the same issue as 1).
>>
>> Why is this not allowed? (The documentation does not state any reason)
>
> There is no reason, and DMD accepts it. Maybe file a bug against the
> documentation?
>
> struct S{
> auto opAssign(T)(auto ref T rhs) if(is(T==typeof(this))){return rhs;}
> }
>
> void main(){
> S a, b;
> a=b;
> }
>
>>
>> 3. Calling a method that is overloaded with shared / const / immutable
>> from within a function has to be done with this.method()
>> otherwise the compiler complains about ambugiosity. Is method() not the
>> same as this.method() ??
>>
>
> Yes it is. Has this been filed already?

I have a repro case for issue 1+2. It seems to be connected to the 
bostplit constructor. Does the postblit constructor infer with opAssign 
overloading?

struct Array(T){
   T[] data;

   alias typeof(this) this_t;

   this(this)
   {
     data = data.dup;
   }

   this_t opAssign(U)(auto ref U rh) if(is(U == this_t))
   {
     data = rh.data;
     return rh;
   }

   auto opAssign(U)(U rh) if(is(U == T[]))
   {
     data = rh;
     return rh;
   }
}

int main(string[] argv)
{
    Array!int bla;
    bla = [1,2,3];
    return 0;
}

main.d(15): Error: function main.Array!(int).Array.opAssign conflicts 
with template main.Array!(int).Array.opAssign(U) if (is(U == this_t)) at 
main.d(25)
main.d(40): Error: template instance main.Array!(int) error instantiating

-- 
Kind Regards
Benjamin Thaut


More information about the Digitalmars-d mailing list