Home | History | Annotate | Line # | Download | only in lint1
      1  1.3    rillig /*	$NetBSD: d_bltinoffsetof.c,v 1.3 2024/01/09 23:46:54 rillig Exp $	*/
      2  1.2    rillig # 3 "d_bltinoffsetof.c"
      3  1.1  christos 
      4  1.1  christos struct foo {
      5  1.3    rillig 	union {
      6  1.3    rillig 		struct {
      7  1.3    rillig 			struct {
      8  1.3    rillig 				int a;
      9  1.3    rillig 				int b;
     10  1.3    rillig 			} first;
     11  1.3    rillig 			char *second;
     12  1.3    rillig 		} s;
     13  1.3    rillig 		unsigned char padding[1000];
     14  1.3    rillig 	} u;
     15  1.3    rillig 	union {
     16  1.3    rillig 		int a;
     17  1.3    rillig 		double b;
     18  1.3    rillig 	} array[50];
     19  1.1  christos };
     20  1.1  christos 
     21  1.3    rillig typedef int first[-(int)__builtin_offsetof(struct foo, u.s.first)];
     22  1.3    rillig typedef int first_a[-(int)__builtin_offsetof(struct foo, u.s.first.a)];
     23  1.3    rillig /* expect+1: ... (-4) ... */
     24  1.3    rillig typedef int first_b[-(int)__builtin_offsetof(struct foo, u.s.first.b)];
     25  1.3    rillig /* expect+1: ... (-8) ... */
     26  1.3    rillig typedef int second[-(int)__builtin_offsetof(struct foo, u.s.second)];
     27  1.1  christos 
     28  1.3    rillig /* expect+1: ... (-1000) ... */
     29  1.3    rillig typedef int array[-(int)__builtin_offsetof(struct foo, array)];
     30  1.3    rillig /* expect+1: ... (-1000) ... */
     31  1.3    rillig typedef int array_0_a[-(int)__builtin_offsetof(struct foo, array[0].a)];
     32  1.3    rillig /* expect+1: ... (-1000) ... */
     33  1.3    rillig typedef int array_0_b[-(int)__builtin_offsetof(struct foo, array[0].b)];
     34  1.3    rillig /* expect+1: ... (-1008) ... */
     35  1.3    rillig typedef int array_1_a[-(int)__builtin_offsetof(struct foo, array[1].a)];
     36  1.3    rillig 
     37  1.3    rillig // There is no element array[50], but pointing right behind the last element
     38  1.3    rillig // may be fine.
     39  1.3    rillig /* expect+1: ... (-1400) ... */
     40  1.3    rillig typedef int array_50_a[-(int)__builtin_offsetof(struct foo, array[50].a)];
     41  1.3    rillig /* expect+1: ... (-1400) ... */
     42  1.3    rillig typedef int sizeof_foo[-(int)sizeof(struct foo)];
     43  1.3    rillig 
     44  1.3    rillig 
     45  1.3    rillig // 51 is out of bounds, as it is larger than the size of the struct.
     46  1.3    rillig // No warning though, maybe later.
     47  1.3    rillig /* expect+1: ... (-1408) ... */
     48  1.3    rillig typedef int array_51_a[-(int)__builtin_offsetof(struct foo, array[51].a)];
     49