aboutsummaryrefslogtreecommitdiff
path: root/SingleSource/UnitTests/2003-07-09-SignedArgs.c
blob: e31be3bdf8aa204dea8ebb24e064e6197b1a54da (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*
 * 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 <stdio.h>
#include <stdarg.h>
#include <inttypes.h>

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;
}