digitalmars.D - A few bugs connected to structs
- Benjamin Thaut (15/15) Jan 11 2012 1. It's currently not possible to overload opAssign for structs with a
- Timon Gehr (11/23) Jan 11 2012 There is no reason, and DMD accepts it. Maybe file a bug against the
- Benjamin Thaut (8/36) Jan 11 2012 The bugs are not filed yet as I wanted to make sure that they are
- Benjamin Thaut (5/33) Jan 11 2012 Bug ticket for issue 3: http://d.puremagic.com/issues/show_bug.cgi?id=72...
- Benjamin Thaut (35/63) Jan 11 2012 I have a repro case for issue 1+2. It seems to be connected to the
- kenji hara (12/82) Jan 11 2012 The definition of postblit generates an non-templated built-in
- Benjamin Thaut (6/95) Jan 12 2012 Thanks for the info. It's nice that there is already a pull request to
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
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
Am 11.01.2012 20:05, schrieb Timon Gehr:On 01/11/2012 05:58 PM, Benjamin Thaut wrote: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 Thaut1. 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
Am 11.01.2012 20:05, schrieb Timon Gehr:On 01/11/2012 05:58 PM, Benjamin Thaut wrote:Bug ticket for issue 3: http://d.puremagic.com/issues/show_bug.cgi?id=7276 -- Kind Regards Benjamin Thaut1. 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
Am 11.01.2012 20:05, schrieb Timon Gehr:On 01/11/2012 05:58 PM, Benjamin Thaut wrote: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 Thaut1. 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
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;=it} void main(){ S a, b; a=3Db; }I have a repro case for issue 1+2. It seems to be connected to the bostpl=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?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=htemplate 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
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>:Thanks for the info. It's nice that there is already a pull request to fix this. -- Kind Regards Benjamin ThautAm 11.01.2012 20:05, schrieb Timon Gehr:On 01/11/2012 05:58 PM, Benjamin Thaut wrote: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 Thaut1. 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 12 2012