www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Cconditional expression in return statement. Bug?

reply Jack Applegame <japplegame gmail.com> writes:
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?
Mar 07
parent reply kinke <noone nowhere.com> writes:
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.
Mar 07
parent Jack Applegame <japplegame gmail.com> writes:
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
Mar 08