File: offsetof.c

package info (click to toggle)
sdcc 4.5.0%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 112,980 kB
  • sloc: ansic: 622,683; cpp: 259,454; makefile: 81,253; sh: 40,203; asm: 19,222; perl: 12,139; yacc: 7,761; awk: 3,378; lisp: 1,677; python: 1,097; lex: 1,028; sed: 76
file content (83 lines) | stat: -rw-r--r-- 1,664 bytes parent folder | download | duplicates (4)
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
 * some testcases to check sanity of the offsetof implementation
 *   especially the __builtin_offsetof implementation
 */

#include <testfwk.h>
#include <stddef.h>

struct tail {
  int t;
};

struct aux {
  char x;
  char fil[2];
  struct tail ta;
};

union bla {
  char a;
  long b;
  struct aux ax;
};

struct st {
  char first;
  short a[11], b;
  struct aux s;
  struct aux arr[7];
  union bla abla;
  union bla abla_arr[2];
};

typedef struct st st_t;
typedef union bla bla_t;

#define check(type, element) \
  { int x, y; \
    union { long bits; type *ptr; } nul; nul.bits = 0;      \
    x = (int) &(nul.ptr->element); \
    y = offsetof (type, element); \
    ASSERT (x == y); \
  }

void
testOffsetOf(void)
{
  int z;

  check (struct st, first);
#ifndef __SDCC_pdk14 // Lack of memory
  check (struct st, b);
  check (struct st, a);
  check (struct st, a[9]);
  check (struct st, s);
  check (struct st, s.x);
  check (struct st, s.ta.t);
  check (struct st, s.fil);
  check (struct st, s.fil[1]);
  check (struct st, arr);
  check (struct st, arr[1]);
  check (struct st, arr[1].x);
  check (struct st, arr[1].fil);
  check (struct st, arr[1].fil[1]);
  check (struct st, abla);
  check (struct st, abla.b);
  check (struct st, abla_arr);
  check (struct st, abla_arr[1]);
  check (struct st, abla_arr[1].b);
  check (struct st, abla_arr[1].ax);
  check (struct st, abla_arr[1].ax.fil);
  check (struct st, abla_arr[1].ax.fil[1]);
#endif

  z = 7; check (struct st, a[z*3+1]);
  z = 3; check (struct st, arr[z].x);

  check (st_t, arr[1].fil[1]);
  check (bla_t, b);

  ASSERT (0 == offsetof (union bla, b));
  ASSERT (0 == offsetof (bla_t, b));
}