跳到主要内容
左猫娘右猫娘

速记之前遇到的msvc和gcc八嘎

· 阅读需 2 分钟
Heng_Xin
ここから先は一方通行だ!

速记, 此bug比较难报告上去.

前几天遇到的, 先记录一下. 有空再看看, 再仔细测测~

1. MSVC: RVO 返回值优化失败

在 C++17 之后, 标准强制规定返回值优化.

struct A {
A& operator=(A&&) = delete;
};

A makeA() { return A{}; }

int main() {
auto a = makeA();
}
cpp

但是 MSVC 有 bug: https://godbolt.org/z/e973zrxPq

struct A {
A& operator=(A&&) = delete;
};

A msvcSb() { return true ? A{} : A{}; }

int main() {
auto a = msvcSb();
}
cpp

仅限 msvc v19.41 VS17.11 以及更早的版本出现

2. MSVC 协程展开 bug

时间原因, 编写一个完整的协程然后放到 godbolt 上太麻烦了. 这里仅描述, 最小案例:

template <typename... Awaiters>
Task<> func(Awaiters&&... awaiters) {
((co_await awaiters) && ...);
}
cpp

类似于这种, 在 C++17 的折叠表达式, 配合协程 co_await, 在 MSVC 上 (至少本机上), 是无效的.

即 MSVC 直接把 ((co_await awaiters) && ...); 看作 ; 了.

代码消失了. 即便你使用 sizeof...(awaiters) 然后 print 还是 调试.

你可以看到 sizeof...(awaiters) != 0 但是他并不会执行 (co_await awaiters).

3. GCC 协程 co_return bug

Tip

我甚至不能确定是什么bug... 不知道怎么描述...

看码:

// 似乎 GCC 下存在问题: 调试看到 _isUniqueEventLoop = ture, 但是却走 tryAsync 分支...
co_return _isUniqueEventLoop
? _eventLoop->trySync(task())
: co_await _eventLoop->tryAsync(task());

// 而下面却正常的:
if (_isUniqueEventLoop) {
co_return _eventLoop->trySync(task());
}
co_return co_await _eventLoop->tryAsync(task());
cpp

对比: clang 运行上下代码都没问题, ctest通过. gcc 就不行, 调试看到了但还是走另一个分支. (debug 运行)

请作者喝奶茶:
Alipay IconQR Code
Alipay IconQR Code
本文遵循 CC CC 4.0 BY-SA 版权协议, 转载请标明出处
Loading Comments...