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

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

本文关键字:静态成员 引用 函数 代码 强制 实例化 clang      更新时间:2023-10-16

我可以使用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 发出这个从未被引用的静态函数?

这绝对是叮当声中的一个错误。

正如OP在注释中所述,__attribute__((used))的语义是将函数视为在代码中实际引用的函数,迫使它发出函数的代码,而clang在这种情况下没有这样做。

此外,所有类成员函数都具有由C++定义的外部链接。因此,当类实例化,并且编译器(支持 gcc 样式的函数属性)看到成员函数的__attribute__((used))时,它应该立即知道应该发出该函数的外部可见定义。GCC正在这样做,Bug Clang没有。

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

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