Использование универсального оператора- & gt; * в качестве значения r

Процесс компиляции:

template <typename T> T GetMember(const T STRUCT_T::* member)
{
STRUCT_T* pStruct = GetStruct();
...
// read value
T retVal = pStruct->*member; // compiler assertion here

ReleaseStruct();

return retVal;
}

заканчивается из-за утверждения компилятора при использовании с неосновным типом T:

Внутренняя ошибка инструмента:
Внутренняя ошибка: [Front end]: подтверждение не выполнено в:
«…. \ Translator \ compiler_core \ src \ parser \ edg \ lower_il.c», строка 13411

В шоке от того факта, что «lower_il.c» компилятора IAR имеет по крайней мере 13 411 строк, и ни одна из них не является правильным универсальным оператором -> * (), я обнаружил, что даже более странно, что следующая функция компилируется с неосновным типом T :

template <typename T> void SetMember(T STRUCT_T::* member, const T& value)
{
STRUCT_T* pStruct = GetStruct();
...
// write value
pStruct->*member = value; // no compiler assertion here

ReleaseStruct();
}

Я предполагаю, что результат универсального оператора в порядке как lvalue, но не как rvalue. Разоблачение параметра не помогло.

Есть идеи о причине и решении?

1

Решение

Мы можем сказать от edg\lower_il.c что это интерфейс EDG, а не проприетарный анализатор IAR. EDG в хорошем состоянии и пользуется уважением, и вы можете играть с более новой версией на http://gcc.godbolt.org/ . (Выберите ICC в меню компилятора.)

Имя файла предполагает, что оно имеет дело с промежуточным представлением более низкого уровня, а не с созданием исходного AST. Может быть проблема с переводом указателя на член к более примитивным операциям. Или флаг может появиться на неправильной линии. Внутренние ошибки не всегда точны. SSCCE было бы лучше.

0

Другие решения

Пакет обновления IAR 6.70.2 решил проблему.

0

По вопросам рекламы [email protected]