2

我已经为 C++11 在其持续构建过程中的使用配置了 Eclipse CDT(Eclipse v4.5.0,构建 ID 20150621-1200;CDT v8.7.0.201506070905),但某些表达式仍然会导致语义错误,即使它们编译正确使用 g++ 4.9.2 和 clang++ 3.8.0。也就是说,作为函数参数提供的大括号初始化列表与参数的相应std::initializer_list构造函数不匹配,并且 LLVMcast函数的正确版本也不与其提供的参数匹配。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

无效参数 '
候选者是:
llvm::FunctionType * get(llvm::Type *, llvm::ArrayRef, bool)
llvm::FunctionType * get(llvm::Type *, bool)

错误 #2

无效参数 '
候选者是:
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 &)
'

4

2 回答 2

3

Eclipse CDT 使用称为的内部 C++ 代码分析器codan,以便它可以连续报告它认为是语法或语义错误,而不仅仅是在构建时。它还诊断它认为是什么或静态分析问题。

codan你对 C++ 的掌握对你的代码和编译器来说已经过时了,那么你的代码将尽管codan抱怨,但仍然可以编译。在出现诊断的 IDE 底部的Problemscodan选项卡中,您可以将's 的抱怨与编译器的抱怨区分开来。编译器抱怨将始终在 Type列中归类为C/C++ Problem。抱怨将codan具有识别 codan 问题类别之一的类型,例如Semantic errorCode Analysis Problem

另一种消除codan误报的方法是在构建后查看控制台 选项卡,而不是问题选项卡。控制台选项卡报告工具链的输出。

但是当编译器是正确的并且codan是最新的并且仍然错误时,您不希望它的诊断噪音。如您所愿,您可以配置codan以抑制它:-

  • 导航属性-> C/C++ 常规->代码分析
  • 启用使用项目设置
  • 向下滚动Problems树控件到 Syntax and Semantic Errors类别。
  • 滚动到子类别Invalid Arguments (这是您的Error #1Error 2中引用的投诉)。
  • 通过取消选中其复选框并确定来禁用此子类别。

下次刷新诊断选项卡时,错误#1错误 2应该会消失。

如果你不能通过禁用一些语法和语义错误codan来抑制所有的错误诊断,你可以禁用整个类别,让编译器找到你的编译错误,老派。

于 2015-08-02T08:49:11.063 回答
0

Eclipse CDT 包含它自己的 C/C++ 解析器,它不使用任何外部的东西。因此,简单地升级编译器不会为 Eclipse 的完成带来任何新的东西。

于 2015-08-01T10:51:11.097 回答