Вложение не выполнено: тело функции может быть перезаписано во время соединения

Сегодня я обновил Ubuntu 12.04, который, как я думаю, имел g++ - 4.6 для Ubuntu 12.10 с g++ - 4.7.2. В моем коде у меня было несколько функций, отмеченных как __attribute__((always_inline)). Причиной этого было просто то, что профилирование показало мне, что это значительно повысило производительность кода. Он отлично работал с g++ 4.6, но теперь с g++ 4.7 Я получаю сообщение об ошибке:

error: inlining failed in call to always_inline 'void func_name (args)': тело функции может быть перезаписано во время ссылки

Я не могу поделиться своим фактическим кодом, я пытался сузить его, но когда я слишком сильно меняю ошибку, это не помогает. Меня интересует первопричина этого сообщения об ошибке.

Ответ 1

Я не собирался отвечать на это сам, но я случайно нашел ответ через несколько минут после того, как я опубликовал.

Причиной этого (загадочного) сообщения об ошибке было то, что функция не была помечена как inline, только __attribute((always_inline)).

Ответ 2

Для нас проблема заключалась в том, что мы также не смогли объявить функцию "статической". "attribute((always_inline))" означает, в обычном тексте, "встроить это и никогда не включать тело функции", а сообщение об ошибке означает "компилятор должен был включать тело функции". В нашем случае, поскольку функция не была "статичной", она должна была быть доступна для внешней ссылки.