https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85344
--- Comment #5 from Thomas Preud'homme <thopre01 at gcc dot gnu.org> --- (In reply to Thomas Preud'homme from comment #4) > (In reply to Thomas Preud'homme from comment #3) > > More worrying is that this code compiles without error when it should error > > out: > > > > void > > foo (void) > > { > > __asm( "%0" :: "J" ((unsigned char) 0x80)); > > } > > In which case we end up with #-128 in the assembly which is not what the > user wrote. Thus adding wrong-code tag. I have difficulty to make up my mind about what is the expected behavior for constant input in inline asm, esp. for immediate constraint. But first let's look at register constraint: asm ("mov %0, %0" : "=r"(result) : "0"((signed char) -128)); will put 0x00000080 in the register holding result. It basically set the register in the mode of the immediate, so QImode here. I would have expected for a 32bit register to have the immediate as 2-complement 32bit value, ie 0xFFFFFF80 in this case. The documentation says that a general register should be used which is true in both case. Now what about asm ("%0" :: "i"((unsigned char) 128)); This gives -128 in the assembly code, on at least ARM and x86_64 targets but I would expect likewise on all targets. Likewise: asm ("%0" :: "i"(0x80000000)); gives #-2147483648 in assembly for the similar reason. Here my expectation is that provided that the constant can be represented in a const_int its value as a C level constant is what should be printed in assembly and the constraint check (eg for constraint I in ARM backend) should be based on that value as well. Thoughts?