| // REQUIRED_ARGS: -inline |
| |
| /***************************************************/ |
| |
| pragma(inline, true) |
| { |
| int foo1(int v) |
| { |
| return bar1(2 * v); |
| } |
| |
| int bar1(int a) |
| { |
| if (a > 0) |
| return 1; |
| else |
| return baz1(a); |
| } |
| } |
| |
| int baz1(int a) |
| { |
| if (a > 0) |
| throw new Exception("a > 0"); |
| return a - 1; |
| } |
| |
| // --- |
| |
| pragma(inline, true) |
| { |
| int foo2(int v) |
| { |
| return bar2(2 * v); |
| } |
| |
| int bar2(int a) |
| { |
| if (a > 0) |
| return 1; |
| // else |
| return baz2(a); |
| } |
| } |
| |
| int baz2(int a) |
| { |
| if (a > 0) |
| throw new Exception("a > 0"); |
| return a - 1; |
| } |
| |
| // --- |
| |
| pragma(inline, true) |
| { |
| int foo3(int v) |
| { |
| return bar3(2 * v); |
| } |
| |
| int bar3(int a) |
| { |
| if (a > 0) |
| a = 1; |
| else |
| return baz3(a); |
| return a; |
| } |
| } |
| |
| int baz3(int a) |
| { |
| if (a > 0) |
| throw new Exception("a > 0"); |
| return a - 1; |
| } |
| |
| void test7625a() |
| { |
| assert(foo1(1) == 1); |
| assert(foo1(0) == -1); |
| assert(foo2(1) == 1); |
| assert(foo2(0) == -1); |
| assert(foo3(1) == 1); |
| assert(foo3(0) == -1); |
| } |
| |
| /***************************************************/ |
| |
| @safe pragma(inline, true) |
| { |
| int tembo(int x, int y) |
| { |
| if (y == 0) |
| return 0; |
| x++; |
| return x / y; |
| } |
| int pembo(int x, int y) |
| { |
| if (y == 0) |
| return 0; |
| else |
| { |
| x++; |
| return x / y; |
| } |
| } |
| |
| int twiga(int x, int y, int z) |
| { |
| auto w = tembo(x, y); |
| return w * z; |
| } |
| |
| int simba(int x, int y, int z) |
| { |
| auto w = pembo(x, y); |
| return w * z; |
| } |
| } |
| |
| void test7625b() |
| { |
| assert(twiga(5, 3, 4) == 8); |
| assert(twiga(5, 0, 4) == 0); |
| |
| assert(simba(5, 3, 4) == 8); |
| assert(simba(5, 0, 4) == 0); |
| } |
| |
| /***************************************************/ |
| |
| @safe pragma(inline, true) |
| { |
| bool inlineMe15483a(bool left) |
| { |
| if (left) |
| return true; |
| |
| return false; |
| } |
| |
| bool inlineMe15483b(bool left) |
| { |
| if (left) |
| return true; |
| |
| static if (false) |
| { |
| /* https://issues.dlang.org/show_bug.cgi?id=15483 |
| Even though it does absolutely nothing, |
| the mere presence of this block prevents inlining |
| of this function. |
| */ |
| } |
| |
| return false; |
| } |
| } |
| |
| int foo15483() |
| { |
| auto r1 = inlineMe15483a(true); |
| auto r2 = inlineMe15483b(true); // OK <- NG |
| |
| return 128; |
| } |
| |
| void test15483() |
| { |
| // Prevent inlining of test function call. |
| auto fp = &foo15483; |
| assert(fp() == 128); |
| } |
| |
| /***************************************************/ |
| |
| void main() |
| { |
| test7625a(); |
| test7625b(); |
| test15483(); |
| } |