d不能链接问题
原文
化简为:
struct S()
{
void delegate() d;
}
S!() f_Ds(U)()
{
static if (is(U == struct))
return S!()
(
{
foreach (i, field; U.init.tupleof)
f_Ds!(typeof(field))();
}
);
else
return f_Ds!(D)();
}
void f_E()
{
auto f = S!()
(
{
enum x = is(typeof(f_Ds!(D*)()));
f_Ds!(D*)();
}
);
}
struct A
{
D* d;
}
struct D
{
A a;
int b;
}
void main()
{
f_E();
f_Ds!(D*)();
}
再化简为:
void f()() { h!()(); }
void g()() { f!()(); }
void h()() { g!()(); }
enum x = is(typeof(g!()()));
alias my_h = h!();
void main() {}
这里有个变体,无论用不用-debug都失败:
void f()()
{
g!()();
h!()();
}
void g()() { f!()(); }
void h()() { f!()(); }
enum x = is(typeof(f!()()));
alias my_g = g!();
void main() {}
原始测试修复
其他化简仍失败,在这里之后带-debug会失败.
下面是猜测,看看语义分析:
1.首先分析x语义.typeof实例化了f!().
2.f!()实例化了g!()和h!().
3.my_g直接实例化了g!().
h!()只是间接实例化的,并且因为是在typeof实例化,因此不会按为它生成代码标记.
DMD默认是急切修剪期望在其他地方实例化的模板.按默认期望未定义的引用.
如果在-allist中有未定义的错误,则是要修复的漏洞.
浙公网安备 33010602011771号