Семантические ошибки с разрешением перегрузки для init-list-as-function-argument и шаблонов

Я настроил 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 &)
'


person JAB    schedule 31.07.2015    source источник


Ответы (2)


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

Когда понимание С++ codan устарело по отношению к вашему коду и вашему компилятору, тогда ваш код скомпилируется, несмотря на жалобы codan. На вкладке Проблемы в нижней части IDE, где появляется диагностика, вы можете отличить жалобы codan от жалоб компилятора. Недовольство компилятором всегда будет классифицироваться в столбце Тип как Проблема C/C++. Претензия codan будет иметь тип, который идентифицирует одну из категорий проблем Codan, например. Семантическая ошибка, Проблема анализа кода.

Еще один способ избежать codan ложных срабатываний – это посмотреть после сборки на вкладку Консоль, а не на вкладку Проблемы. Вкладка Консоль сообщает о выводе цепочки инструментов.

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

  • Перейдите в раздел Свойства -> Общие сведения о C/C++ -> Анализ кода.
  • Включите Использовать настройки проекта.
  • Прокрутите вниз древовидное управление Проблемы до категории Синтаксические и семантические ошибки.
  • Прокрутите до подкатегории Недопустимые аргументы (это жалоба, указанная в ваших Ошибке №1 и Ошибке 2).
  • Отключите эту подкатегорию, сняв ее флажок и нажав OK.

Затем Ошибка №1 и Ошибка 2 должны исчезнуть при следующем обновлении вкладки диагностики.

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

person Mike Kinghan    schedule 02.08.2015
comment
Я надеялся, что это не потребует этого, так как мне действительно нравится получать информацию сразу же, когда я использовал неправильный аргумент, но если нет простого способа обновить codan, я думаю, это единственное, что можно сделать, если я хочу сохранить используя Eclipse с современным синтаксисом и без сообщений о ложных ошибках. - person JAB; 03.08.2015
comment
О, снятие флажка Недопустимые аргументы не отключает ошибку №2, которая требует снятия флажка Символ не разрешен, что, в свою очередь, приводит к ошибкам разрешения метода, если вместо него используется auto фактический тип (поскольку анализатор не может сказать, что возвращаемое значение должно быть основано на шаблонном типе). Так раздражает. - person JAB; 03.08.2015

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

person Anton Korobeynikov    schedule 01.08.2015