Thread overview | |||||
---|---|---|---|---|---|
|
March 07, 2017 Cconditional expression in return statement. Bug? | ||||
---|---|---|---|---|
| ||||
Code (https://dpaste.dzfl.pl/8e7a9c380e99): import std.stdio; struct Foo { int val; this(int val) { writefln("%s.this(int)", val); this.val = val; } this(this) { writefln("%s.this(this)", val); this.val = val; } ~this() { writefln("%s.~this()", val); this.val = val; } } struct Bar { Foo foo; this(Foo foo, bool) { this.foo = foo; } } bool fun(bool val) { return !val; } auto genBar(bool flag) { return flag ? Bar() : Bar(Foo(10), fun(!flag)); } void main(string[] args) { auto bar = genBar(args.length == 0); } Compiler generates extra destructor call: 10.this(int) 10.this(this) 10.~this() 10.~this() 10.~this() If we slightly change function genBar: auto genBar(bool flag) { auto a = flag ? Bar() : Bar(Foo(10), fun(!flag)); return a; } or auto genBar(bool flag) { return flag ? Bar() : Bar(Foo(10), false); } then output looks as expected: 10.this(int) 10.this(this) 10.~this() 10.~this() I'm pretty sure this is a bug. And very bad bug. I spent several hours looking for it. What do you think? |
March 07, 2017 Re: Cconditional expression in return statement. Bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jack Applegame | On Tuesday, 7 March 2017 at 14:26:18 UTC, Jack Applegame wrote:
> I'm pretty sure this is a bug. And very bad bug. I spent several hours looking for it.
> What do you think?
Definitely a very bad bug. It works too if you mark `fun()` as nothrow. Please file a DMD issue.
|
March 08, 2017 Re: Cconditional expression in return statement. Bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to kinke | On Tuesday, 7 March 2017 at 16:00:54 UTC, kinke wrote: > Definitely a very bad bug. It works too if you mark `fun()` as nothrow. Please file a DMD issue. https://issues.dlang.org/show_bug.cgi?id=17246 |
Copyright © 1999-2021 by the D Language Foundation