Я настроил Eclipse CDT (Eclipse v4.5.0, идентификатор сборки 20150621-1200; CDT v8.7.0.201506070905) для использования C++11 в постоянном процессе сборки, но некоторые выражения по-прежнему вызывают семантические ошибки, даже если они правильно компилируются. используя g++ 4.9.2 и clang++ 3.8.0. А именно, списки инициализации в фигурных скобках, предоставленные в качестве аргументов функции, не сопоставляются с соответствующими конструкторами std::initializer_list
аргументов, и правильная версия функции cast
LLVM также не сопоставляется с предоставленными аргументами. Использует ли 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 &)
'