gpt4 book ai didi

c++ - LLVM 覆盖被 if-constexpr 混淆

转载 作者:行者123 更新时间:2023-11-30 04:57:19 25 4
gpt4 key购买 nike

if-statement 中使用常量表达式时,我遇到了一个奇怪的 LLVM 覆盖问题:

template<typename T>
int foo(const T &val)
{
int idx = 0;

if constexpr(std::is_trivially_copyable<T>::value && sizeof(T) <= sizeof(int)
{
memcpy(&idx, &v, sizeof(T));
}
else
{
//store val and assign its index to idx
}

return idx;
}

执行的实例化:

int idx1 = foo<int>(10);
int idx2 = foo<long long>(10);
int idx3 = foo<std::string>(std::string("Hello"));
int idx4 = foo<std::vector<int>>(std::vector<int>{1,2,3,4,5});

这些都不是sizeof(T) <= sizeof(int)曾经显示为已执行。然而在第一种情况下实例化( int )第一个 if 的主体确实按应有的方式执行。在没有其他情况下,它显示为已执行。

编译命令行相关部分:

/usr/bin/clang++ -g -O0 -Wall -Wextra -fprofile-instr-generate -fcoverage-mapping -target x86_64-pc-linux-gnu -pipe -fexceptions -fvisibility=default -fPIC -DQT_CORE_LIB -DQT_TESTLIB_LIB -I(...) -std=c++17 -o test.o -c test.cpp

链接器命令行的相关部分:

/usr/bin/clang++ -Wl,-m,elf_x86_64,-rpath,/home/michael/Qt/5.11.2/gcc_64/lib -L/home/michael/Qt/5.11.2/gcc_64/lib -fprofile-instr-generate -fcoverage-mapping -target x86_64-pc-linux-gnu -o testd test.o -lpthread -fuse-ld=lld

当条件被提取到它自己的函数时 intlong long实例化在执行 sizeof(T) <= sizeof(int) 时在覆盖范围内正确显示部分。什么可能导致这种行为以及如何解决它?它是 Clang/LLVM cov 中的错误吗?

有什么想法吗?

编辑:这似乎是 LLVM 中的一个已知错误(尚不清楚是 LLVM-cov 还是 Clang):

https://bugs.llvm.org/show_bug.cgi?id=36086

https://bugs.chromium.org/p/chromium/issues/detail?id=845575

最佳答案

首先,sizeof(T) <= sizeof(int)应该在您的代码中在编译时执行,因此很可能不会对编译进行分析以进行覆盖。

接下来,只有这三种类型 long long看起来 trivially_copyable , 但它的大小(很可能)大于 int 的大小,因此 then-clause 不会为它们执行,甚至不会编译。由于一切都发生在模板函数内,因此不会编译未执行的分支。

关于c++ - LLVM 覆盖被 if-constexpr 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52064372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com