www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - A few bugs connected to structs

reply Benjamin Thaut <code benjamin-thaut.de> writes:
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)

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() ??

-- 
Kind Regards
Benjamin Thaut
Jan 11 2012
parent reply Timon Gehr <timon.gehr gmx.ch> writes:
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?
Jan 11 2012
next sibling parent Benjamin Thaut <code benjamin-thaut.de> writes:
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?
The bugs are not filed yet as I wanted to make sure that they are actually bugs. I have repro cases for both of them, I just need to shrink them down. As soon as I have small repro cases I'm going to file them. -- Kind Regards Benjamin Thaut
Jan 11 2012
prev sibling next sibling parent Benjamin Thaut <code benjamin-thaut.de> writes:
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?
Bug ticket for issue 3: http://d.puremagic.com/issues/show_bug.cgi?id=7276 -- Kind Regards Benjamin Thaut
Jan 11 2012
prev sibling parent reply Benjamin Thaut <code benjamin-thaut.de> writes:
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
Jan 11 2012
parent reply kenji hara <k.hara.pg gmail.com> writes:
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=3D4424

Kenji Hara

2012/1/12 Benjamin Thaut <code 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 =3D=3D 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 =3D=3D 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=3D=3Dtypeof(this))){return rhs;=
}
 }

 void main(){
 S a, b;
 a=3Db;
 }

 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 bostpl=
it
 constructor. Does the postblit constructor infer with opAssign overloadin=
g?
 struct Array(T){
 =A0T[] data;

 =A0alias typeof(this) this_t;

 =A0this(this)
 =A0{
 =A0 =A0data =3D data.dup;
 =A0}

 =A0this_t opAssign(U)(auto ref U rh) if(is(U =3D=3D this_t))
 =A0{
 =A0 =A0data =3D rh.data;
 =A0 =A0return rh;
 =A0}

 =A0auto opAssign(U)(U rh) if(is(U =3D=3D T[]))
 =A0{
 =A0 =A0data =3D rh;
 =A0 =A0return rh;
 =A0}
 }

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

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


 --
 Kind Regards
 Benjamin Thaut
Jan 11 2012
parent Benjamin Thaut <code benjamin-thaut.de> writes:
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 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
Jan 12 2012