Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ошибка в GNU assembler


Автор: andrew_121 3.7.2009, 07:30
Код

extern __inline__ long
ilockexch (volatile long *t, long v)
{
  return
  ({
    register __typeof (*t) ret __asm ("%eax"); /* предупреждение: volatile register variables don't work as you might wish */
    __asm __volatile ("\n"
    "1:    lock cmpxchgl %2, %1\n"
    "    jne  1b\n"
    : "=a" (ret), "=m" (*t)
    : "r" (v), "m" (*t), "0" (*t)
    : "memory");
    ret;
  });
}

Как исправить?

Автор: MAKCim 3.7.2009, 09:52
andrew_121, 
на gcc 4.3 компилится без ворнингов с -Wall

а вообще правильно ругается
volatile-семантика не совместима с регистрами

Добавлено через 9 минут и 21 секунду
решение
Код

register __typeof (v) ret __asm ("%eax")

но в данном случае, имхо, typeof вообще не нужен
обычно он применяется для #define, где тип не известен

Автор: andrew_121 3.7.2009, 10:09
MAKCim, Теперь вот что говорит:
Цитата

invalid conversion from `volatile long int*' to `long int'


Добавлено через 2 минуты и 24 секунды
Цитата(MAKCim @  3.7.2009,  09:52 Найти цитируемый пост)
на gcc 4.3 компилится без ворнингов с -Wall

Кстати:
Цитата

gcc-cygwin-pc-i686-3.4.5

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)