Questions tagged «clang»

有关clang LLVM编译器前端的问题。对于有关C的一般问题,请使用C标记。

4
是否有一个C代码片段,可以在不使用编译器内置函数的情况下有效地计算溢出安全加法?
这是一个C函数,将C添加int到另一个函数,如果发生溢出将失败: int safe_add(int *value, int delta) { if (*value >= 0) { if (delta > INT_MAX - *value) { return -1; } } else { if (delta < INT_MIN - *value) { return -1; } } *value += delta; return 0; } 不幸的是,GCC或Clang 无法对其进行优化: safe_add(int*, int): movl (%rdi), %eax testl …

1
在C ++ 17中初始化后可以更改内联变量吗?
我的情况如下(它在clang中起作用,但在gcc中不起作用) liba.hpp: inline int MY_GLOBAL = 0; libother.cpp:(dll) #include "myliba.hpp" void myFunc() { // MYGLOBAL = 28; } someexe.cpp: RunAppThatUsesBothLibAandLibOther(); 问题在于,内联变量在我希望28的地方显示0,因为它在运行时被修改了。MSVC对此表示不同意,但是clang做了我期望的事情。 问题是:在我的方案中,可以在运行时修改内联变量吗?(我通过取消内联变量解决了问题。)
11 c++  visual-c++  dll  clang  c++17 

1
在Windows中配置CMake以使用命令行中的clang获得最新的OpenMP支持
我有一个使用OpenMP进行并行化的小型测试项目。我的目标是对其进行编译,以使其生成.dll并.lib用于库(因为我的真实项目链接到使用这些类型分发的外部库),并且支持OpenMP 4.5或更高版本,并且可以从命令行进行操作,因此可以在docker上完成测试和检查(泊坞窗部分不在此问题的范围内,仅供参考,以说明为什么我需要它在命令行中工作)。我可以使用不满意的其他编译器来编译该项目: MSVC:,mkdir build-msvc然后cmake ..(从新创建的文件夹中),最后是cmake --build . --config Release。这可以很好地编译,但是仅支持OpenMP 2.0,因此对于我的真实项目不是一个好的选择。 Intel Parallel Studio:,mkdir build-intel然后cmake .. -T "Intel C++ Compiler 19.0"(从新创建的文件夹中),最后是cmake --build . --config Release。它支持OpenMP 5.0,但其许可证对我而言却相当昂贵。 MinGW x64 g ++:,mkdir build-g++然后cmake .. -G "MinGW Makefiles"(从新创建的文件夹中),最后是cmake --build .。它支持OpenMP 4.5,但该编译器与.lib(据我所知)与我已经提到的对我而言是不兼容的。 我尝试使用clang没有成功: 然后从MSVC中进行CLANG:,mkdir build-clang-msvc然后cmake -G Ninja -DCMAKE_CXX_COMPILER=clang-cl ..(从新创建的文件夹中),但失败并显示以下错误: -CXX编译器标识是Clang 8.0.1,带有类似MSVC的命令行 -检查工作的CXX编译器:C:/ Program Files(x86)/ Microsoft …

1
为何编译器坚持在此处使用被调用者保存的寄存器?
考虑下面的C代码: void foo(void); long bar(long x) { foo(); return x; } 当我在GCC 9.3上使用-O3或编译它时-Os,得到以下信息: bar: push r12 mov r12, rdi call foo mov rax, r12 pop r12 ret clang的输出是相同的,除了选择rbx而不是r12作为被调用者保存的寄存器。 但是,我希望/希望看到看起来像这样的程序集: bar: push rdi call foo pop rax ret 用英语,这就是我所看到的: 将已保存被调用者的寄存器的旧值推入堆栈 移动x到该被调用方保存寄存器 呼叫 foo 移动x从被调用者被保存的寄存器到返回值寄存器 弹出堆栈以恢复被调用方保存的寄存器的旧值 为什么要弄乱所有保存在被调用方中的寄存器?为什么不这样做呢?它看起来更短,更简单,并且可能更快: 推x入栈 呼叫 foo x从堆栈弹出到返回值寄存器 我的大会错了吗?它比以多余的寄存器搞乱效率低吗?如果对这两个问题的回答都是“否”,那么为什么GCC或clang都不这样做呢? …
10 c  gcc  assembly  clang  x86-64 

3
可以将nullptr转换为uintptr_t吗?不同的编译器不同意
考虑以下程序: #include <cstdint> using my_time_t = uintptr_t; int main() { const my_time_t t = my_time_t(nullptr); } 无法使用msvc v19.24进行编译: <source>(5): error C2440: '<function-style-cast>': cannot convert from 'nullptr' to 'my_time_t' <source>(5): note: A native nullptr can only be converted to bool or, using reinterpret_cast, to an integral type <source>(5): error C2789: 't': …
10 c++  c++11  gcc  visual-c++  clang 

1
GCC / C ++ 17中带有模板模板类的问题
考虑以下2个重载 template<typename T> bool test() { return true; } template<template<typename ...> class T> bool test() { return false; } 第一个适用于常规类,而第二个适用于未实例化的模板。例如: std::cout<<test<int>()<<std::endl; <-- this yields 1 std::cout<<test<std::list>()<<std::endl; <--this yields 0 现在考虑以下模板函数: template<typename U> bool templfun(){ struct A{ bool f(){ return test<A>(); // <-- this gives an error } }; return test<A>(); …
10 c++  templates  gcc  clang  c++17 

2
不同C ++编译器之间的自动类型推导不匹配
因此,我试图以某种现代C ++的形式实现点积(https://en.wikipedia.org/wiki/Dot_product),并提出了以下代码: #include <iostream> template<class... Args> auto dot(Args... args) { auto a = [args...](Args...) { return [=](auto... brgs) { static_assert(sizeof...(args) == sizeof...(brgs)); auto v1 = {args...}, i1 = v1.begin(); auto v2 = {brgs...}, i2 = v2.begin(); typename std::common_type<Args...>::type s = 0; while( i1 != v1.end() && i2!= v2.end()) { s …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.