We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi all,
I would like to discover why the compiler issues warning #68 (integer conversion resulted in a change of sign) for the code below. It is issued only for -O3, "Optimize for Time" enabled and when the function is inlined (__inline keyword).
I have tried to cast anything which could be implicitly converted to int back to uint, but no chance to get rid of this warning.
armcc.exe V4.0.0.524
static __inline uint8_t IsDecDigit(char c) { return ( (c >= '0') && (c <= '9')); } ... static void UseIt(void) { char *name; ... /* Initialize the name to something useful */ ... if ( (IsDecDigit(name[3])) /* <- warning issued for this expression */ && (IsDecDigit(name[4])) && (IsDecDigit(name[5])) && (IsDecDigit(name[6])) { ... } }
Thanks for responses.
Regards Pavel
As I see it now, I would rather agree it's just a compiler bug as mentioned somewhere above... Anyway, there is complete and completely useless example you want ;) Use the compiler settings mentioned earlier.
#include <stdint.h> #include <lpc23xx.h> /* * Set to nonzero to remove warnings ;) */ #define REMOVE_WARNINGS 0 static char *random_data = (char *)0x40000000; /* * Remove __inline and warnings disappear */ static __inline int IsDecDigit(char c) { return (int)(( (c >= (char)'0') && (c <= (char)'9')) ? 1 : 0); } static __inline int IsSet(uint32_t flags, uint8_t pos) { return (int)((int)(flags & (1ul << pos)) ? 1 : 0); } static DoSomething(uint8_t what) { FIO0CLR = (1ul << what); } static DoSomethingElse(uint8_t what) { FIO1SET = (1ul << what); } int main(void) { char *name = random_data; uint32_t flags = 0; #if REMOVE_WARNINGS /* Not sure why..., maybe compiler chooses different optimization when there is inline asm? */ __asm("nop"); #endif for (;;) { if (IsDecDigit(name[0])) { DoSomething(1); flags |= (1ul << 0); } if ( IsDecDigit(name[1]) /* warning: #68-D: integer conversion resulted in a change of sign */ && IsDecDigit(name[2])) { DoSomething(2); flags |= ((1ul << 1) | (1ul << 2)); } if (IsSet(flags, 3)) { DoSomethingElse(3); } if ( IsSet(flags, 4) /* warning: #68-D: integer conversion resulted in a change of sign */ && IsSet(flags, 5)) { DoSomethingElse(5); flags |= 0xf; } } /* return 0;*/ }