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

C++ 强制clang为类模板实例化的从未引用过的静态成员函数发出代码,c++,gcc,clang,C++,Gcc,Clang,我可以在gcc中使用used和noinline(参见下面的代码)轻松实现这一点,但这在clang中不起作用,即使它应该支持这两个函数属性 一个简化的例子: template<typename T> struct Factory { static __attribute__((used, noinline)) T createFoo() { return T(); } }; int main() { Factory<int> f; // insta

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

一个简化的例子:

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

int main() {
    Factory<int> f; // instantiate and use Factory<int>
}
代码在
clang
中编译得很好,但它不会像预期的那样为静态
createFoo()
函数发出代码

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

这肯定是clang中的一个bug。 正如OP在注释中所述,
\uuuuuu attribute\uuuuuu((使用))
的语义是将函数视为代码中实际引用的函数,强制它为函数发出代码,而在本例中clang没有这样做

此外,所有类成员函数都有C++定义的外部链接。因此,当类被实例化时,编译器(支持gcc风格的函数attibutes)看到成员函数的

\uuuuu attribute\uuuuu((使用))
,它应该立即知道应该发出该函数的外部可见定义gcc正在这样做,bugclang没有

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


您还需要解决此问题。

此行为超出标准,因此不需要编译器支持。可移植的解决方案是添加对该方法的引用。@brianbeuning:我意识到编译器不需要支持它-我的问题是
clang
是否支持它。(它应该像
gcc
一样,通过
used
函数属性,告诉编译器假装它在某个地方被引用过。)感谢您的确认-我会继续并提交一个bug报告。所以这仍然是一个带有Clang 10的bug,嗯
nm --demangle test | grep createFoo
0000000000403185 W Factory<int>::createFoo()