[Issue 16528] @safe inference does not work for mutually recursive functions
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Fri Sep 23 10:21:01 PDT 2016
https://issues.dlang.org/show_bug.cgi?id=16528
John Colvin <john.loughran.colvin at gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |john.loughran.colvin at gmail.
| |com
--- Comment #1 from John Colvin <john.loughran.colvin at gmail.com> ---
Ok so this is absolutely hideous and there is definitely something weird going
on with the compiler in this region, but I *think* the following works as
expected. There is probably an adaption of this that can be made simpler, but I
don't have time to find it right now.
template fun1Wrap(T)
{
enum foo = q{
void impl(T value) %s
{
if (value) fun2%s(value - 1);
}
};
import std.format : format;
static if(__traits(compiles, { mixin(format(foo, `@safe`, `Safe`)); }))
mixin(format(foo, `@safe`, `Safe`));
else
mixin(foo);
}
void fun1Safe(T)(T t) @safe
{
fun1Wrap!T.impl(t);
}
void fun1(T)(T t)
{
static if (__traits(compiles, fun1Safe(t) ))
fun1Safe(t);
else
fun1Wrap!T.impl(t);
}
template fun2Wrap(T)
{
enum foo = q{%s void impl(T value)
{
if (value) fun1%s(value - 1);
}
};
import std.format : format;
static if(__traits(compiles, { mixin(format(foo, `@safe`, `Safe`)); }))
mixin(format(foo, `@safe`, `Safe`));
else
mixin(foo);
}
void fun2Safe(T)(T t) @safe
{
fun2Wrap!T.impl(t);
}
void fun2(T)(T t)
{
static if (__traits(compiles, fun1Safe(t) ))
fun2Safe(t);
else
fun2Wrap!T.impl(t);
}
@safe void main()
{
fun1(4);
}
--
More information about the Digitalmars-d-bugs
mailing list