/* * Test sign extensions on short signed values passed as arguments * to function calls. Include arithmetic to produce extra high bits * from operations that overflow. Lots of codes do this! */ #include #include #include typedef signed char schar; short getShort(schar c, schar c2, schar c3, short s, short s2, int i); int getUnknown(schar c, ...); int passShort(schar c, short s) { schar c2 = s + c; schar c3 = s - c; short s2 = s * c; int i = s * s * c * c; short s3 = getShort(c, c2, c3, s, s2, i); /* args shd be sign-extended */ return getUnknown(c, c2, c3, s, s2, s3, i); /* args shd be promoted to int */ } int main() { printf("%d\n", passShort(0x80, 0xf0f4)); return 0; } short getShort(schar c, schar c2, schar c3, short s, short s2, int i) { int bc = c == (schar) -128; int bc2 = c2 == (schar) 116; int bc3 = c3 == (schar) 116; int bs = s == (short) -3852; int bs2 = s2 == (short) -31232; int bi = i == (int) -1708916736; printf("getShort():\t%d %d %d %d %d %d\n", bc, bc2, bc3, bs, bs2, bi); printf("getShort():\t%d %d %d %d %d %d\n", c, c2, c3, s, s2, i); return (c + c2 + c3 + s + s2) + (short) i; } int getUnknown(schar c, ...) { schar c2, c3; short s, s2, s3; int i; va_list ap; va_start(ap, c); c2 = (schar) va_arg(ap, int); c3 = (schar) va_arg(ap, int); s = (short) va_arg(ap, int); s2 = (short) va_arg(ap, int); s3 = (short) va_arg(ap, int); i = va_arg(ap, int); va_end(ap); printf("getUnknown():\t%d %d %d %d %d %d %d\n", c, c2, c3, s, s2, s3, i); return c + c2 + c3 + s + s2 + s3 + i; }