2

Eclipse CDT (Eclipse v4.5.0、ビルド ID 20150621-1200; CDT v8.7.0.201506070905) をその継続的なビルド プロセスで C++11 を使用するように構成しましたが、特定の式は適切にコンパイルされていてもセマンティック エラーを引き起こしています。 g++ 4.9.2 および clang++ 3.8.0 を使用。つまり、関数の引数として指定された波括弧付きの init リストは、引数の対応するstd::initializer_listコンストラクターと一致せず、LLVM のcast関数の正しいバージョンも、指定された引数と一致しません。Eclipse CDT は、検出する最新の外部 GCC ツールチェーンに委任するのではなく、そのような C++11 機能をサポートしない古い内部パーサーを使用していますか?

#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

0

Eclipse CDT には独自の C/C++ パーサーが含まれており、外部のものは一切使用しません。したがって、単にコンパイラーをアップグレードしただけでは、Eclipse の完成に新しいものは何ももたらされません。

于 2015-08-01T10:51:11.097 に答える