繁体   English   中英

强制clang为类模板实例化的从未引用的静态成员函数发出代码

[英]forcing clang to emit code for never-referenced static member function of class-template instantiation

我可以使用usednoinline 函数属性gcc轻松实现这一点(参见下面的代码),但这在clang不起作用,即使它应该支持这两个函数属性。

一个简化的例子:

template<typename T>
struct Factory {
    static __attribute__((used, noinline))
    T createFoo() { return T(); }
};

int main() {
    Factory<int> f; // instantiate and use Factory<int>
}

编译gcc的代码并使用nm确认gcc正确发出了函数:

nm --demangle test | grep createFoo
0000000000403185 W Factory<int>::createFoo()

代码在clang编译得很好,但是它不像它应该的那样为静态createFoo()函数发出代码。

如何强制clang发出从未引用过的静态函数?

这肯定是cla​​ng中的一个错误。

正如OP在注释中所述, __attribute__((used))的语义是将函数视为代码中实际引用的函数,强制它为函数发出代码,在这种情况下clang不执行。

此外,所有类成员函数都具有C ++定义的外部链接。 因此,当实例化类时,编译器(支持gcc样式函数attibutes)会看到成员函数的__attribute__((used)) ,它应该立即知道应该发出该函数的外部可见定义。 gcc正在这样做,bug clang不是。

临时解决方法(对于clang)是在代码中的某处显式引用该函数。

您还应该使用llvm提交clang错误报告以解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM