A few bugs connected to structs
Benjamin Thaut
code at benjamin-thaut.de
Thu Jan 12 01:26:15 PST 2012
Am 12.01.2012 08:15, schrieb kenji hara:
> The definition of postblit generates an non-templated built-in
> opAssign implicitly.
> And it conflicts with your templated opAssign.
>
> It is already filed in bugzilla.
>
> Issue 4424 - Copy constructor and templated opAssign cannot coexist
> http://d.puremagic.com/issues/show_bug.cgi?id=4424
>
> Kenji Hara
>
> 2012/1/12 Benjamin Thaut<code at benjamin-thaut.de>:
>> 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
Thanks for the info. It's nice that there is already a pull request to
fix this.
--
Kind Regards
Benjamin Thaut
More information about the Digitalmars-d
mailing list