ICE (внутренняя ошибка компилятора) после обновления vcxproj с vs2013 до vs2015 - PullRequest
0 голосов
/ 16 апреля 2020

«похожие вопросы» не охватывают мой случай.

После переключения с VS2013 (v120) на VS2015 (v140) результат:

1>------ Build started: Project: my_project, Configuration: Debug Win32 ------
1>  aSource.cpp
1>d:\my_project\aHeader.h(61): warning C4114: same type qualifier used more than once
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(215): warning C4346: 'std::_Is_nothrow_swappable<_Ty>::value': dependent name is not a type
1>  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(215): note: prefix with 'typename' to indicate a type
1>  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(221): note: see reference to class template instantiation 'std::array<_Ty,_Size>' being compiled
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(215): error C2061: syntax error: identifier 'value'
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(216): error C2091: function returns function
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(435): error C2988: unrecognizable template declaration/definition
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(435): error C2059: syntax error: ')'
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(442): error C2065: '_Ty': undeclared identifier
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(442): error C2065: '_Size': undeclared identifier
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(442): error C2923: 'std::array': '_Ty' is not a valid template type argument for parameter '_Ty'
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(442): error C2975: '_Size': invalid template argument for 'std::array', expected compile-time constant expression
1>  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(20): note: see declaration of '_Size'
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(443): error C2065: '_Ty': undeclared identifier
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(443): error C2065: '_Size': undeclared identifier
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(443): error C2923: 'std::array': '_Ty' is not a valid template type argument for parameter '_Ty'
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(443): error C2975: '_Size': invalid template argument for 'std::array', expected compile-time constant expression
1>  C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(20): note: see declaration of '_Size'
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(444): error C2143: syntax error: missing ';' before '{'
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\array(444): error C2447: '{': missing function header (old-style formal list?)
1>  INTERNAL COMPILER ERROR in 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\CL.exe'
1>      Please choose the Technical Support command on the Visual C++
1>      Help menu, or open the Technical Support help file for more information
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Примечания:

  • нет Оптимизация (/ Od)
  • та же проблема также для VS2017 (v141) и VS2019 (v142)
  • Я имею в виду, что этот проект также проблематичен c для компиляции без VS2013-update5, но это действительно опасная память , Но, может быть, кто-то звонит кому-то еще?
  • Обновление необходимо, потому что мы хотим использовать MongoDB, который последний драйвер cxx не поддерживает VS2013

РЕДАКТИРОВАТЬ: Содержимое aHeader.h

#ifndef AINTERFACE_H
#define AINTERFACE_H 1

typedef int result;

#define IRESULT         result
#define IFUNCTION       virtual IRESULT
#define IIN(X)          X const&
#define IOUT(X)         X&
#define FUNCSPEC_IFACE  noexcept = 0
#define FUNCSPEC_IMPL   noexcept
#define ISUCCESS        0

class aInterface {
public:

    aInterface(IIN(char const* const) name)
        : iface_name_(name) {}

    IFUNCTION iface_name(IOUT(char const*) target)  FUNCSPEC_IFACE;

protected:

    char const*const    iface_name_;
};

#define IFACE_FUNCTIONS_DEFAULT                                         \
            IFUNCTION iface_name(IOUT(char const*) target) FUNCSPEC_IMPL\
                { target = aInterface::iface_name_; return ISUCCESS; }

#define IFACE_DEFAULT(NAME)                                         \
                    IFACE_FUNCTIONS_DEFAULT                         \
                    public: NAME() : aInterface(str(NAME))


#endif

Afaik это базовый c интерфейс для реализации CRTP

sidenote:

#define str_hlp(arg) #arg
#define strnz(arg) str_hlp(arg)
#define strz(arg) str_hlp(arg) "\0"
#define str(arg) strz(arg)

Спасибо

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

За время первоначальной разработки проектов. VS2015 все еще не закончен, а VS2013 (все еще) не полностью поддерживает стандарт c ++ 11.

По соображениям совместимости был сделан хак в своего рода скрытом углу.

#if defined( _MSC_VER )/* && (_MSC_VER < insert here version which will support)*/

#  define noexcept  throw()
#  define constexpr const inline

#endif

Мы решил теперь изменить это на

#if defined( _MSC_VER ) && (_MSC_VER < 1910)

#  define noexcept  throw()
#  define constexpr const inline

#endif

и пропустить VS2015.

Большое спасибо

0 голосов
/ 16 апреля 2020

Я думаю, что root причина первого предупреждения - слишком много const квалификаторов:

#define IIN(X)          X const&
    aInterface(IIN(char const* const) name)

Расширяется до:

    aInterface(char const* const const& name)

Что слишком много consts

Предложите что-то вроде:

#include <type_traits>
...
#define IIN(X) typename std::remove_const<X>::type const&
#define IOUT(X) typename std::remove_const<X>::type&

Так что верхний уровень const будет удален из X

Если это не решит проблему, тогда "определитель того же типа Использовано более одного раза "не имеет отношения к делу, и нужно больше контекста.

...