Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
March 31, 2014 template interface and delegates | ||||
---|---|---|---|---|
| ||||
Hi, I'm new to D and played a bit with templates and delegates. Now i discovered some behaviore that i don't understand. Can somebody explain me why i get two different outputs? import std.stdio; interface A(T){ bool GetBool(); T getT(); } class C:A!(double){ override bool GetBool(){ return false; } override double getT(){ return 1; } } void mwriteln(T)( A!T delegate() dg){ writeln(dg().getT()); } void main() { auto c = new C(); writeln(c.getT()); mwriteln!double({return new C();}); } |
March 31, 2014 Re: template interface and delegates | ||||
---|---|---|---|---|
| ||||
Posted in reply to anonymous | On Mon, 31 Mar 2014 18:58:30 +0000, anonymous wrote: > Hi, > I'm new to D and played a bit with templates and delegates. > Now i discovered some behaviore that i don't understand. Can somebody > explain me why i get two different outputs? > > > import std.stdio; > > > interface A(T){ > bool GetBool(); > T getT(); > } > > class C:A!(double){ > override bool GetBool(){ > return false; > } > override double getT(){ > return 1; > } > } > > void mwriteln(T)( A!T delegate() dg){ > writeln(dg().getT()); > } > > void main() > { > auto c = new C(); writeln(c.getT()); mwriteln!double({return new > C();}); > } Looks like a bug. Here's a cleaned-up test case: ----------------------------------------------------------- interface A(T) { T getT(); } class C : A!double { double getT(){ return 1; } } void mwriteln(T)(A!T delegate() dg) { import std.stdio; auto a = dg(); writeln("Checkpoint 1"); assert(a !is null); writeln(a); writeln("Checkpoint 2"); } void main() { import std.traits; static assert(isImplicitlyConvertible!(C, A!double)); mwriteln!double({return new C();}); } ----------------------------------------------------------- Backtrace: ----------------------------------------------------------- Program received signal SIGSEGV, Segmentation fault. #0 0x000000000042ac8c in _d_interface_cast () #1 0x0000000000427ec6 in std.format.__T11formatValueTS3std5stdio4File17LockingTextWriterTC4test8__T1ATdZ1ATaZ.formatValue () () #2 0x0000000000427e23 in std.format.__T13formatGenericTS3std5stdio4File17LockingTextWriterTC4test8__T1ATdZ1ATaZ.formatGeneric () () #3 0x0000000000427d29 in std.format.__T14formattedWriteTS3std5stdio4File17LockingTextWriterTaTC4test8__T1ATdZ1AZ.formattedWrite () () #4 0x0000000000427871 in std.stdio.File.__T5writeTC4test8__T1ATdZ1ATaZ.write() () #5 0x00000000004277d5 in std.stdio.__T7writelnTC4test8__T1ATdZ1AZ.writeln () () #6 0x000000000042771f in test.__T8mwritelnTdZ.mwriteln() () #7 0x00000000004276a9 in D main () #8 0x000000000042b61c in rt.dmain2._d_run_main() () #9 0x000000000042b576 in rt.dmain2._d_run_main() () #10 0x000000000042b5dc in rt.dmain2._d_run_main() () #11 0x000000000042b576 in rt.dmain2._d_run_main() () #12 0x000000000042b4f7 in _d_run_main () #13 0x0000000000429c5f in main () ----------------------------------------------------------- |
March 31, 2014 Re: template interface and delegates | ||||
---|---|---|---|---|
| ||||
Posted in reply to anonymous | On Mon, 31 Mar 2014 14:58:30 -0400, anonymous <non@trash-mail.com> wrote:
> Hi,
> I'm new to D and played a bit with templates and delegates.
> Now i discovered some behaviore that i don't understand.
> Can somebody explain me why i get two different outputs?
>
>
> import std.stdio;
>
>
> interface A(T){
> bool GetBool();
> T getT();
> }
>
> class C:A!(double){
> override bool GetBool(){
> return false;
> }
> override double getT(){
> return 1;
> }
> }
>
> void mwriteln(T)( A!T delegate() dg){
> writeln(dg().getT());
> }
>
> void main()
> {
> auto c = new C();
> writeln(c.getT());
> mwriteln!double({return new C();});
> }
This is definitely a bug.
Reduced case:
import std.stdio;
interface A{
void foo();
}
class C:A{
override void foo(){
writeln("here");
}
}
void x( A delegate() dg){
dg().foo();
}
void main()
{
A c = new C;
c.foo(); // prints "here"
x({A a = new C; return a;}); // prints "here"
x({return new C;}); // does not print
}
This is really an issue with delegate return type inferrence not working properly.
-Steve
|
April 01, 2014 Re: template interface and delegates | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | Ok, thought i did something wrong or got some wrong idea how it should work. |
April 01, 2014 Re: template interface and delegates | ||||
---|---|---|---|---|
| ||||
Posted in reply to anonymous | Is this bug allready reported? or can somebody who has a deeper insight to this report it?
On Tuesday, 1 April 2014 at 05:51:46 UTC, anonymous wrote:
> Ok, thought i did something wrong or got some wrong idea how it should work.
|
April 01, 2014 Re: template interface and delegates | ||||
---|---|---|---|---|
| ||||
Posted in reply to anonymous | On Tue, 01 Apr 2014 15:47:42 -0400, anonymous <non@trash-mail.com> wrote:
> Is this bug allready reported? or can somebody who has a deeper insight to this report it?
I don't know. I think you should report it. If it's already reported, someone will close it as a "duplicate"
-Steve
|
April 03, 2014 Re: template interface and delegates | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Tuesday, 1 April 2014 at 19:55:05 UTC, Steven Schveighoffer wrote: > On Tue, 01 Apr 2014 15:47:42 -0400, anonymous <non@trash-mail.com> wrote: > >> Is this bug allready reported? or can somebody who has a deeper insight to this report it? > > I don't know. I think you should report it. If it's already reported, someone will close it as a "duplicate" > > -Steve I filed it. https://d.puremagic.com/issues/show_bug.cgi?id=12508 Kenji Hara |
Copyright © 1999-2021 by the D Language Foundation