初始化thread_local叮当中的错误
Bug in clang thread_local initialization
以下代码应该只创建一次类内thread_local
,但它最终会在每次访问时对其进行初始化
#include <iostream>
#include <thread>
using std::cout;
using std::endl;
template <typename T>
class Something {
public:
struct TLBookkeeping {
TLBookkeeping() {
std::cout << "TLBookkeeping() " << std::this_thread::get_id() << std::endl;
}
};
static void foo();
static thread_local TLBookkeeping bookkeeping_;
};
template <typename T>
thread_local typename Something<T>::TLBookkeeping Something<T>::bookkeeping_;
template <typename T>
void Something<T>::foo() {
std::cout << &bookkeeping_ << std::endl;
std::cout << &bookkeeping_ << std::endl;
}
namespace {
struct Struct {};
}
int main() {
Something<Struct>::foo();
}
(https://wandbox.org/permlink/fgqCDHV0axKDRt89(
有趣的是,该错误仅在Struct
位于匿名命名空间中时才显示。
有人知道这是一个叮当错误(gcc 做对了 - https://wandbox.org/permlink/hsxRj8OdYbt4Eeck(还是本质上不正确的thread_local
用法? 如果是后者,正确的用法是什么? 如果是前者,具体是什么错误? 这是否记录在某处? 我们应该打开错误报告吗?
当你发现编译器导致运行时行为时,你相对确定是不正确的;而另一个流行的编译器不会导致相同的行为 - 恕我直言,这足以针对所述编译器提交错误。
作为@SamVarshavchik建议,您:
- 访问LLVM的错误跟踪器 如果您
- 没有帐户,请创建一个帐户
- 查找重复项(例如,使用术语"线程本地"(
- 如果您没有找到 - 则提交错误
我已经这样做了,所以现在我们有错误 42111。
在最坏的情况下 - 它将被标记为欺骗。
编辑:这不是欺骗,并且刚刚(2019年6月5日(已修复。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- 叮当格式化程序多行格式配置错误
- 避免指针运算,修复叮当整齐错误
- 初始化thread_local叮当中的错误
- 忽略由第三方标头引起的 [叮当声诊断错误] 叮当声整洁
- 设置大型特征矢量Xd时出现叮当错误
- 在叮当声中regex_constants实现错误
- 输出 endl 时的叮当段错误
- 叮当自动变量模板错误
- GMOCK 叮当讨厌的错误"/usr/include/limits.h:123:16: fatal error: 'limits.h' file not found"
- 不能在函数中声明运算符.叮当错误或规范
- 叮当 Mac 链接错误与 gtest 建筑x86_64的未定义符号
- 叮当错误地删除了死代码
- 在模板参数中是否禁止 SFINAE,还是我遇到了叮当错误
- 叮当教程 "missing file"上的段错误
- 在 -m32 的 64 位编译错误上叮当
- 叮当"hello, world!"窗口中的链接错误
- 叮当:将特定警告标记为非错误