blob: eca5727873964a281d8c0e15b99fef4ae575ea57 [file] [log] [blame]
// 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();
}