avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[avr-gcc-list] Compiler bug or Incorrect C ?


From: Anton James Erasmus
Subject: [avr-gcc-list] Compiler bug or Incorrect C ?
Date: Thu, 29 Jan 2009 08:47:31 +0200

Hi,

I have the following C code which gives the compiler
error.
"error: initializer element is not a constant"

#define COMPILE_HOUR (((__TIME__[0]-'0')*10) +
(__TIME__[1]-'0'))
#define COMPILE_MINUTE (((__TIME__[3]-'0')*10) +
(__TIME__[4]-'0'))
#define COMPILE_SECOND (((__TIME__[6]-'0')*10) +
(__TIME__[7]-'0'))

const unsigned char gCompileHour=COMPILE_HOUR;
const unsigned char gCompileMinute=COMPILE_MINUTE;
const unsigned char gCompileSecond=COMPILE_SECOND;    

but the following code compiles without problems and one
can see in the assembly generated that the macros do
collapse to a single constant.

#define COMPILE_HOUR (((__TIME__[0]-'0')*10) +
(__TIME__[1]-'0'))
#define COMPILE_MINUTE (((__TIME__[3]-'0')*10) +
(__TIME__[4]-'0'))
#define COMPILE_SECOND (((__TIME__[6]-'0')*10) +
(__TIME__[7]-'0'))


unsigned char GetCompileHour(void)
{
  unsigned char hour=COMPILE_HOUR;
  return(hour);
}

unsigned char GetCompileMinute(void)
{
  unsigned char minute=COMPILE_MINUTE;
  return(minute);
}

unsigned char GetCompileSecond(void)
{
  unsigned char second=COMPILE_SECOND;
  return(second);
}


Generated assembly using WinAVR 2008-06-10:

        .file   "test.c"
__SREG__ = 0x3f
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__CCP__  = 0x34
__tmp_reg__ = 0
__zero_reg__ = 1
        .global __do_copy_data
        .global __do_clear_bss
        .text
.global GetCompileHour
        .type   GetCompileHour, @function
GetCompileHour:
/* prologue: function */
/* frame size = 0 */
        ldi r24,lo8(8)
/* epilogue start */
        ret
        .size   GetCompileHour, .-GetCompileHour
.global GetCompileMinute
        .type   GetCompileMinute, @function
GetCompileMinute:
/* prologue: function */
/* frame size = 0 */
        ldi r24,lo8(40)
/* epilogue start */
        ret
        .size   GetCompileMinute, .-GetCompileMinute
.global GetCompileSecond
        .type   GetCompileSecond, @function
GetCompileSecond:
/* prologue: function */
/* frame size = 0 */
        ldi r24,lo8(43)
/* epilogue start */
        ret
        .size   GetCompileSecond, .-GetCompileSecond



So is the code that gives an error actually incorrect C, or
is it a compiler bug ?

Regards
  Anton Erasmus




reply via email to

[Prev in Thread] Current Thread [Next in Thread]