mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 13:10:12 +03:00
185 lines
2.8 KiB
D
185 lines
2.8 KiB
D
// 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();
|
|
}
|