Процесс компиляции:
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. Разоблачение параметра не помогло.
Есть идеи о причине и решении?
Мы можем сказать от edg\lower_il.c
что это интерфейс EDG, а не проприетарный анализатор IAR. EDG в хорошем состоянии и пользуется уважением, и вы можете играть с более новой версией на http://gcc.godbolt.org/ . (Выберите ICC в меню компилятора.)
Имя файла предполагает, что оно имеет дело с промежуточным представлением более низкого уровня, а не с созданием исходного AST. Может быть проблема с переводом указателя на член к более примитивным операциям. Или флаг может появиться на неправильной линии. Внутренние ошибки не всегда точны. SSCCE было бы лучше.
Пакет обновления IAR 6.70.2 решил проблему.