2

Я настроил 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 аргументами, а правильная версия функции LLVM cast также не соответствует ее аргументам. Является ли Eclipse CDT более старым, внутренним парсером, который не поддерживает такую ​​функциональность C++ 11, а не делегирует более современную внешнюю инструментальную цепочку GCC, которую она обнаруживает?Семантические ошибки с разрешением перегрузки для аргументов и шаблонов init-list-as-function

#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 * получить (LLVM :: Type *, LLVM :: ссылку на массив, BOOL)
LLVM: : FunctionType * прибудете (LLVM :: Type *, BOOL)

Ошибка № 2

Кандидаты

Недопустимые аргументы являются:
LLVM :: cast_retty < # 0, # 1 *> :: ret_type литая (# 1 *) станд :: enable_if :: ret_type> :: приведение типа (Const # 1 &)
LLVM :: cast_retty < # 0, # 1> :: ret_type литое (# 1 &)
'

ответ

3

Eclipse CDT использует внутренний анализатор C++ кода, называемого codan так что может сообщить, что он считает, что синтаксические или семантические ошибки непрерывно, не только во время сборки. Он также диагностирует то, что он считает или статическим анализом .

Когда codan сек схватывание C++ устарело w.r.t к коду и ваш компилятор, , то ваш код будет компилироваться, несмотря на codan сек колик. В Задачи вкладка у подножия вашей среды IDE, где отображаются диагностика, вы можете отличить codan от от компилятора. Ручка компилятора всегда будет классифицироваться в Тип столбец как C/C++ Задача. A codan gripe будет иметь тип, который идентифицирует одну из проблемных категорий codan, например. Семантическая ошибка, Задача анализа кода.

Другой способ обесценить codan ложных срабатываний, чтобы посмотреть на вкладке консоли, а не проблемы вкладки , после сборки.На вкладке Console отображается вывод инструментальной цепочки .

Но когда компилятор прав, а codan является актуальным и по-прежнему неправильным, вы не хотите его диагностики. шум. Как вы хотели бы надеяться, вы можете настроить codan подавить его: -

  • NAVIGATE Свойства ->C/C++ General ->Анализ кода
  • Включение Используйте параметры проекта
  • Прокрутите вниз Задачи дерево-контроль в категорию Синтаксис и семантические ошибки.
  • Scroll на подкатегорию Недопустимые аргументы (это жалоба цитируется в вашем Error # 1 и Error 2).
  • Отключите эту подкатегорию, сняв флажок и ОК.

Тогда Ошибка № 1 и Ошибка 2 должен уйти в следующий раз вкладка диагностика обновляется.

Если вы не в состоянии подавить все ложные диагностики codan «s отключив несколько синтаксические и семантические ошибки вы можете отключить эту всю категорию и просто позволить компилятору найти свои ошибки компиляции, старую школу.

+0

Я надеялся, что это не будет требовать этого, поскольку мне на самом деле нравится быть информированным сразу, когда я использовал неправильный аргумент, но если нет простого способа обновления 'codan', я думаю, это единственное, что нужно сделать если я хочу продолжать использовать Eclipse с современным синтаксисом и без ложных ошибок, сообщаемых по всему. – JAB

+0

О, снятие флажка ** Недопустимые аргументы ** не отключает ошибку # 2, которая требует снятия отметки ** Символ не разрешен **, что, в свою очередь, приводит к ошибкам разрешения метода, если вместо фактического типа используется 'auto' (поскольку анализатор не может сказать, что возвращаемое значение должно основываться на шаблоном). Так раздражает. – JAB

0

Eclipse CDT содержит свои собственные парсер C/C++, это ничего не внешнего использование , Таким образом, просто обновление компилятора не принесет ничего нового для завершения Eclipse.