aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/flex-array-counted-by-6.c
blob: 65fa01443d95f7d8bd54a5f70b2bb64596264f59 (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
/* Test the attribute counted_by and its usage in
 * __builtin_dynamic_object_size: when the type of the flexible array member
 * is casting to another type.  */
/* { dg-do run } */
/* { dg-options "-O2" } */

#include "builtin-object-size-common.h"

typedef unsigned short u16;

struct info {
       u16 data_len;
       char data[] __attribute__((counted_by(data_len)));
};

struct foo {
       int a;
       int b;
};

static __attribute__((__noinline__))
struct info *setup ()
{
 struct info *p;
 size_t bytes = 3 * sizeof(struct foo);

 p = (struct info *)malloc (sizeof (struct info) + bytes);
 p->data_len = bytes;

 return p;
}

static void
__attribute__((__noinline__)) report (struct info *p)
{
 struct foo *bar = (struct foo *)p->data;
 EXPECT(__builtin_dynamic_object_size((char *)(bar + 1), 1), 16);
 EXPECT(__builtin_dynamic_object_size((char *)(bar + 2), 1), 8);
}

int main(int argc, char *argv[])
{
 struct info *p = setup();
 report(p);
 return 0;
}