| /* PERMUTE_ARGS: -O -inline |
| */ |
| // https://issues.dlang.org/show_bug.cgi?id=22115 |
| |
| |
| int sx; |
| void sss() { ++sx; } |
| |
| static if (1) |
| { |
| struct S { int a; } |
| |
| void test1(S* s) |
| { |
| if (s.a == 3 ? s : null) |
| sss(); |
| } |
| } |
| |
| static if (1) |
| { |
| extern (C++) class Exp |
| { |
| int a; |
| |
| void func() { } |
| final inout(AddExp) isAddExp() inout { return a == 3 ? cast(typeof(return))this : null; } |
| } |
| |
| extern (C++) class AddExp : Exp |
| { |
| } |
| |
| void test2(Exp e) |
| { |
| if (e.isAddExp()) |
| sss(); |
| } |
| } |
| |
| |
| int main() |
| { |
| static if (1) |
| { |
| S s; |
| s.a = 3; |
| test1(&s); |
| assert(sx == 1); |
| s.a = 2; |
| test1(&s); |
| assert(sx == 1); |
| } |
| sx = 1; |
| |
| static if (1) |
| { |
| auto c = new AddExp(); |
| c.a = 3; |
| test2(c); |
| assert(sx == 2); |
| auto ae = c.isAddExp(); |
| assert(ae && ae.a == 3); |
| c.a = 2; |
| test2(c); |
| assert(sx == 2); |
| } |
| |
| return 0; |
| } |