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

时间:2013-09-24 00:38:05

标签: c++ gcc clang

我可以使用gccused function attributesnoinline轻松实现此目标(请参阅下面的代码),但这并不适用{{1}即使它应该支持这两个函数属性。

简化示例:

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确认gcc正确发出了该函数:

nm

代码在nm --demangle test | grep createFoo 0000000000403185 W Factory<int>::createFoo() 中编译得很好,但它不会像它应该的那样为静态clang函数发出代码。

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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

您还应该file a clang bug report with llvm修复此问题。