Прошу заранее извинить, если ошибся темой :)
Пользуюсь сборками от klen для компиляции и сборки проектов под BREW SDK 3.1.5. В данный момент установлена последняя (1228) сборка с gcc 4.4.0.
Вылез интересный баг с компиляцией операторов <<.
В BREW SDK есть макрос:
typedef uint32 RGBVAL;
#define MAKE_RGB(r, g, B) (RGBVAL) ( ((uint32)® << 8) + ((uint32)(g) << 16) + ((uint32)(B) << 24) )
Есть код его использующий:
pSkin->colorText = MAKE_RGB( color.valR, color.valG, color.valB );
где valR, valG, valB - uint8, colorText - RGBVAL.
При выполнении на устройстве возникли трудности, т.к. текст выводился не заданным цветом, а каким-то другим. При отладке в лог обнаружилось, что переменная colorText содержит значение отличающееся от ожидаемого. Так, при считывании из ресурса чисел FF,1,1 в переменной оказывается не 0101FF00, а 0101FFFF... Т.е. в младшем байте (прозрачность) неизвестно откуда появились неизвестные FF...
При компиляции и сборке используются следующие ключи
CODE = -mlittle-endian -fshort-enums -fshort-wchar -fno-builtin -ffunction-sections -Wall
CPU = -mcpu=arm7tdmi
ROPI =
TARG = -mapcs-frame
INTRWK =
DYNAPP = -DDYNAMIC_APP
OPT = -Os
INC = -I$(AEEINCPATH) $(APP_INCLUDES)
LIBDIRS = -L$(GCC_LIBPATH)
OUT = -c
LINK_CMD = --gc-sections --emit-relocs -Map $(TARGET).map
LIBS = -lgcc
BINFORMAT = -O binary
CFLAGS = $(OUT) $(DYNAPP) $(CPU) $(ROPI) $(TARG) $(INTRWK) $(CODE) $(INC) $(OPT)
Летом, в предыдущей версии проекта, видимо использовался gcc 4.2 или 4.3 и там этой ошибки не было. Но, как оказалось, у меня нет привычки сохранять старые версии компиляторов...