草庐IT

clang-omp

全部标签

c++ - Clang:模板推导失败 'double' 与 '<double>'

考虑以下代码,它使用带有可变参数的函数:#include//TypedeffunctiontypetemplateusingFunc=void(Output*...);//Functionrunnertemplatevoidrun_func(Func&func,Output*...output){for(inti=0;i用g++4.7.3编译它工作正常,运行产生1024.0正如预期的那样。使用icpc14.0.2编译会崩溃...templ.cc(21):internalerror:assertionfailed:lower_expr:badkind(shared/cfe/edgcpfe

c++ - 模板参数类型成员上的运算符 << 仅在 clang 中导致错误

我有这个例子:#include#include#includetemplateclassA{public:A(constT&t):m_t(t){}voidfoo(){std::coutType;std::ostream&operator(t)(t);returnos;}intmain(){Aa(Type{"ala","makota"});a.foo();return0;}用clang++(3.6)产生:test_clang.cpp:10:19:error:calltofunction'operator,std::basic_string>>::foo'requestedherea.fo

c++ - constexpr 唯一标识,使用 clang 编译但不使用 gcc

大家早上好!我正在重构一个事件队列。我四处寻找是否可以在编译时使事件ID唯一。我想出的方法适用于clang4.0.0,但使用g++6.3.1时会出现编译错误。想法是使用静态成员变量的地址来唯一标识各个类型,然后使用标记从类模板生成这些唯一类型。使用静态成员的地址作为类型id是一种相当普遍的技术,但使用模板来实现它意味着清除ODR。MSN在这里引用标准来表明这是一种有效的方法:Compile-timeconstantid我的问题是做这个constexpr。如果我删除constexpr并在运行时对其进行测试,一切都会按预期进行。但是,执行此constexpr会导致g++中的静态断言失败,提

c++ - 在 Windows 上使用 clang 编译 CUDA 时的重新定义

尽管question几乎相同已经问过,答案是针对OSX的,不再适用(而且真的很老套)。问题是在Windows上用clang编译cuda时,math_functions.hpp中有大量重定义。通过一些调查,显然cuda决定将其math_functions.hpp和math_functions.h函数放在namespacestd中(这是否合法??),并与cmath中的所有libstdc++函数和clang自己用于编译cuda的头文件发生冲突。我该如何处理?最好不要使用上一个问题中显示的hacky方式?旁注根据clang的documentation,clang可以基于__global__/_

c++ - 自动非类型模板参数 : ambiguous partial specializations in Clang

Clang(7,8,trunk)拒绝以下代码enumclassE{};inlinestaticconstexprautoe=E{};//inlinestaticconstexprautoe=nullptr;templateclassS;templateclassS{};templateclassS{};intmain(){Ss;}出现错误:error:ambiguouspartialspecializationsof'S'note:partialspecializationmatches[witha=0,b=0]templateclassS{};^note:partialspecial

c++ - 如何使用 Clang 从 C++ 字符串生成 AST?

我正在尝试使用Clang来操作C++源代码,但我在发现API时遇到了问题。我想获取一串C++源代码并从中生成一个AST;类似于:automyAst=clang::parse("autox=1+1;");有这方面的最小工作示例吗? 最佳答案 你可以试试下面的代码:std::unique_ptrAST(tooling::buildASTFromCode("autox=1+1;"));TranslationUnitDecl*DC=AST->getASTContext().getTranslationUnitDecl();if(DC){ll

C++ std::vector initializer_list 重载歧义 (g++/clang++)

考虑以下代码:#include#defineBROKENclassVar{public:#ifdefBROKENtemplateVar(Tx):value(x){}#elseVar(intx):value(x){}#endifintvalue;};classClass{public:Class(std::vectorarg):v{arg}{}std::vectorv;};无论BROKEN是否被定义,Clang++(7.0.1)编译它没有错误,但是如果BROKEN被定义,g++(8.2.1)会引发错误:main.cpp:9:20:error:cannotconvert‘std::vect

c++ - 无法通过 Clang API 找到标识符,但 Clang 在使用时可以找到它

我正在Clang解析的C++源文件中查找标识符。这是一个带有五个参数的函数,这些参数在源文件(而不是标题)中声明。当我试图用一个参数调用它时,Clang给出了一个适当的错误——甚至是函数声明的全文。但是当我尝试使用API查找它时,Clang坚持认为它不存在。相关代码如下:llvm::LLVMContextc;clang::CompilerInstanceCI;llvm::Modulem("",c);clang::EmitLLVMOnlyActionemit(&c);emit.setLinkModule(&m);std::stringerrors;llvm::raw_string_ost

c++ - 在 clang 中返回 std::initializer_list

这个问题在这里已经有了答案:lifetimeofastd::initializer_listreturnvalue(2个答案)关闭7年前。考虑这个代码示例:#include#includeintmain(){for(autoe:[]()->std::initializer_list{return{1,2,3};}())std::cout我尝试用g++编译它(gcc版本4.9.2(Debian4.9.2-10))并且输出是正确的。在clang++(Debianclangversion3.5.0-9(tags/RELEASE_350/final)(basedonLLVM3.5.0))中输出

c++ - 在 clang 中强制使用 `const char[]` 字符串文字

编译以下代码voidf(char*,constchar*,...){}voidf(constchar*,...){}intmain(){f("a","b");}用clang给我这个错误:prog.cpp:6:2:error:callto'f'isambiguousf("a","b");^prog.cpp:1:6:note:candidatefunctionvoidf(char*,constchar*,...){}^prog.cpp:2:6:note:candidatefunctionvoidf(constchar*,...){}^AFAIK字符串字面量在C++中是常量,因此重载规则应该