C++11 作为函数参数和模板的init list重载解析的语义错误
我已经将EclipseCDT(EclipseV4.5.0,构建id 20150621-1200;CDTv8.7.0.201506070905)配置为在C++11的连续构建过程中使用,但某些表达式仍然会导致语义错误,即使它们使用g++4.9.2和clang++3.8.0正确编译。也就是说,作为函数参数提供的带括号的init列表与参数对应的C++11 作为函数参数和模板的init list重载解析的语义错误,c++11,llvm,eclipse-cdt,initializer-list,template-argument-deduction,C++11,Llvm,Eclipse Cdt,Initializer List,Template Argument Deduction,我已经将EclipseCDT(EclipseV4.5.0,构建id 20150621-1200;CDTv8.7.0.201506070905)配置为在C++11的连续构建过程中使用,但某些表达式仍然会导致语义错误,即使它们使用g++4.9.2和clang++3.8.0正确编译。也就是说,作为函数参数提供的带括号的init列表与参数对应的std::initializer_list构造函数不匹配,LLVM的cast函数的正确版本也与其提供的参数不匹配。EclipseCDT使用的是不支持此类C++11
std::initializer_list
构造函数不匹配,LLVM的cast
函数的正确版本也与其提供的参数不匹配。EclipseCDT使用的是不支持此类C++11功能的较旧的内部解析器,而不是委托给更现代的外部GCC工具链(它会检测到)吗
#包括“llvm/ADT/ArrayRef.h”
#包括“llvm/ADT/SmallVector.h”
#包括“llvm/IR/DerivedTypes.h”
#包括“llvm/IR/Function.h”
#包括“llvm/IR/Module.h”
#包括“llvm/IR/Type.h”
使用名称空间llvm;
//i32@myFunc1(i32,i32),i32@myFunc2(i32,i32)
SmallVector getMyFuncs(模块&M){
Type*i32=Type::getInt32Ty(M.getContext());
//报告错误#1
FunctionType*FT=FunctionType::get(i32,{i32,i32},false);
//报告错误#2
Function*F1=cast(M.getOrInsertFunction(“myFunc1”,FT));
//此处ArrayRef(const std::initializer_list&)的隐式匹配没有错误
ArrayRef ArgTypes={i32,i32};
FT=FunctionType::get(i32,ArgTypes,false);
//报告错误#2
函数*F2=cast(M.getOrInsertFunction(“myFunc2”,FT));
//此处SmallVector(std::initializer_list)的隐式匹配没有错误
返回{F1,F2};
}
错误#1
无效参数“候选人是:
llvm::FunctionType*get(llvm::Type*,llvm::ArrayRef,bool)
llvm::FunctionType*get(llvm::Type*,bool) 错误#2 无效参数“
候选人是:
llvm::cast_retty::ret_type cast(#1*)std::enable_if::ret_type>::type cast(const#1&)
llvm::cast_retty::ret_类型cast(#1&)
"
EclipseCDT包含自己的C/C++解析器,它不使用任何外部的东西。因此,简单地升级编译器不会带来任何新的Eclipse完成。 Eclipse CDT使用一个内部C++分析器称为<代码> CODAN < /COD> 可以连续报告其认为的语法或语义错误, 不仅仅是在构建时。它还可以诊断它认为是什么或静态分析 问题 <> >
codan
s抱怨。在问题选项卡中
在显示诊断的IDE底部,您可以区分codan
来自编译器的抱怨。编译器抱怨将始终分类在
将列键入为C/C++问题。codan
gripe的类型
识别codan的问题类别之一,例如语义错误,
代码分析问题
另一种降低误报率的方法是查看控制台
选项卡,而不是生成后的问题选项卡。控制台选项卡报告
工具链的输出
但是,当编译器是正确的,并且codan
是最新的,并且仍然是错误的时,您就不需要它的诊断代码了
噪音正如您所希望的,您可以配置codan
以抑制它:-
- 浏览属性->C/C++常规->代码分析
- 启用使用项目设置
- 向下滚动问题树控件至类别 语法和语义错误
- 滚动到子类别无效参数(这是 您的错误#1和错误2)中引用的投诉
- 通过取消选中该子类别的复选框并确定,禁用该子类别
codan
的错误诊断
一些语法和语义错误可以禁用整个类别
让编译器找到你的编译错误,老派。我希望它不会要求这样做,因为我真的喜欢在我使用错误的参数时立即得到通知,但是,如果没有简单的方法来更新
codan
我想如果我想继续使用Eclipse,使用现代语法,并且没有错误报告,那么这是唯一可以做的事情。哦,取消选中无效参数并不能关闭错误#2,这需要取消选中符号才能解决,如果使用auto
而不是实际类型,则会导致方法解析错误(因为分析器无法判断返回值是否基于模板类型)。真烦人。