init-list-as-function-argument 和模板的重载决议的语义错误
Semantic errors with overload resolution for init-list-as-function-argument and templates
我已经配置了 Eclipse CDT(Eclipse v4.5.0,构建 ID 20150621-1200;CDT v8.7.0.201506070905),以便在其持续构建过程中使用 C++11,但某些表达式仍然导致语义错误,即使它们使用 g++ 4.9.2 和 clang++ 3.8.0 正确编译。即,作为函数参数提供的大括号初始化列表与参数对应的 std::initializer_list
构造函数不匹配,并且 LLVM 的 cast
函数的正确版本也不与其提供的参数匹配。 Eclipse CDT 是否使用不支持此类 C++11 功能的较旧的内部解析器,而不是委托给它检测到的更现代的外部 GCC 工具链?
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
using namespace llvm;
// i32 @myFunc1(i32, i32), i32 @myFunc2(i32, i32)
SmallVector<Function*, 2> getMyFuncs(Module& M) {
Type* i32 = Type::getInt32Ty(M.getContext());
// error #1 reported
FunctionType* FT = FunctionType::get(i32, {i32, i32}, false);
// error #2 reported
Function* F1 = cast<Function>(M.getOrInsertFunction("myFunc1", FT));
// no error with implicit matching of ArrayRef(const std::initializer_list<T>&) here
ArrayRef<Type*> ArgTypes = {i32, i32};
FT = FunctionType::get(i32, ArgTypes, false);
// error #2 reported
Function* F2 = cast<Function>(M.getOrInsertFunction("myFunc2", FT));
// no error with implicit matching of SmallVector(std::initializer_list<T>) here
return {F1, F2};
}
错误#1
Invalid arguments '
Candidates are:
llvm::FunctionType * get(llvm::Type *, llvm::ArrayRef, bool)
llvm::FunctionType * get(llvm::Type *, bool)
错误 #2
Invalid arguments '
Candidates are:
llvm::cast_retty<#0,#1 *>::ret_type cast(#1 *) std::enable_if::ret_type>::type cast(const #1 &)
llvm::cast_retty<#0,#1>::ret_type cast(#1 &)
'
Eclipse CDT 包含它自己的 C/C++ 解析器,它不使用任何外部的东西。因此,简单地升级编译器不会为 Eclipse 的完成带来任何新的东西。
Eclipse CDT 使用名为 codan
的内部 C++ 代码分析器,因此它
可以连续报告它认为是语法或语义错误的内容,
不仅仅是在构建时。它还诊断它认为是什么或静态分析
问题。
当 codan
对 C++ 的掌握对您的代码和编译器来说已经过时 w.r.t 时,
那么尽管有 codan
的抱怨,您的代码仍会编译。在问题 选项卡中
在 IDE 脚下出现诊断信息的地方,您可以区分 codan
的
来自编译器的抱怨。编译器抱怨总是归类于
键入 列作为 C/C++ 问题。 codan
抱怨的类型是
确定 codan 的问题类别之一,例如语义错误,
代码分析问题.
另一种减少 codan
误报的方法是查看 控制台
选项卡,而不是 Problems 选项卡,在构建之后。 控制台 选项卡报告
工具链的输出。
但是当编译器是正确的并且 codan
是最新的但仍然错误时你不希望它的诊断
噪音。如您所愿,您可以配置 codan
来抑制它:-
- 导航属性 -> C/C++ 一般 -> 代码分析
- 启用使用项目设置
- 向下滚动 问题 树控件到类别
语法和语义错误。
- 滚动到子类别无效参数(这是
您的 错误 #1 和 错误 2).
中引用的投诉
- 通过取消选中它的复选框并确定来禁用此子类别。
然后 错误 #1 和 错误 2 应该会在下次出现时消失
诊断选项卡已刷新。
如果您无法通过禁用来抑制 codan
的所有错误诊断
一些 语法和语义错误 您可以禁用整个类别
让编译器发现你的编译错误,老派。
我已经配置了 Eclipse CDT(Eclipse v4.5.0,构建 ID 20150621-1200;CDT v8.7.0.201506070905),以便在其持续构建过程中使用 C++11,但某些表达式仍然导致语义错误,即使它们使用 g++ 4.9.2 和 clang++ 3.8.0 正确编译。即,作为函数参数提供的大括号初始化列表与参数对应的 std::initializer_list
构造函数不匹配,并且 LLVM 的 cast
函数的正确版本也不与其提供的参数匹配。 Eclipse CDT 是否使用不支持此类 C++11 功能的较旧的内部解析器,而不是委托给它检测到的更现代的外部 GCC 工具链?
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
using namespace llvm;
// i32 @myFunc1(i32, i32), i32 @myFunc2(i32, i32)
SmallVector<Function*, 2> getMyFuncs(Module& M) {
Type* i32 = Type::getInt32Ty(M.getContext());
// error #1 reported
FunctionType* FT = FunctionType::get(i32, {i32, i32}, false);
// error #2 reported
Function* F1 = cast<Function>(M.getOrInsertFunction("myFunc1", FT));
// no error with implicit matching of ArrayRef(const std::initializer_list<T>&) here
ArrayRef<Type*> ArgTypes = {i32, i32};
FT = FunctionType::get(i32, ArgTypes, false);
// error #2 reported
Function* F2 = cast<Function>(M.getOrInsertFunction("myFunc2", FT));
// no error with implicit matching of SmallVector(std::initializer_list<T>) here
return {F1, F2};
}
错误#1
Invalid arguments '
Candidates are:
llvm::FunctionType * get(llvm::Type *, llvm::ArrayRef, bool)
llvm::FunctionType * get(llvm::Type *, bool)
错误 #2
Invalid arguments '
Candidates are:
llvm::cast_retty<#0,#1 *>::ret_type cast(#1 *) std::enable_if::ret_type>::type cast(const #1 &)
llvm::cast_retty<#0,#1>::ret_type cast(#1 &)
'
Eclipse CDT 包含它自己的 C/C++ 解析器,它不使用任何外部的东西。因此,简单地升级编译器不会为 Eclipse 的完成带来任何新的东西。
Eclipse CDT 使用名为 codan
的内部 C++ 代码分析器,因此它
可以连续报告它认为是语法或语义错误的内容,
不仅仅是在构建时。它还诊断它认为是什么或静态分析
问题。
当 codan
对 C++ 的掌握对您的代码和编译器来说已经过时 w.r.t 时,
那么尽管有 codan
的抱怨,您的代码仍会编译。在问题 选项卡中
在 IDE 脚下出现诊断信息的地方,您可以区分 codan
的
来自编译器的抱怨。编译器抱怨总是归类于
键入 列作为 C/C++ 问题。 codan
抱怨的类型是
确定 codan 的问题类别之一,例如语义错误,
代码分析问题.
另一种减少 codan
误报的方法是查看 控制台
选项卡,而不是 Problems 选项卡,在构建之后。 控制台 选项卡报告
工具链的输出。
但是当编译器是正确的并且 codan
是最新的但仍然错误时你不希望它的诊断
噪音。如您所愿,您可以配置 codan
来抑制它:-
- 导航属性 -> C/C++ 一般 -> 代码分析
- 启用使用项目设置
- 向下滚动 问题 树控件到类别 语法和语义错误。
- 滚动到子类别无效参数(这是 您的 错误 #1 和 错误 2). 中引用的投诉
- 通过取消选中它的复选框并确定来禁用此子类别。
然后 错误 #1 和 错误 2 应该会在下次出现时消失 诊断选项卡已刷新。
如果您无法通过禁用来抑制 codan
的所有错误诊断
一些 语法和语义错误 您可以禁用整个类别
让编译器发现你的编译错误,老派。