aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/analyzer/data-model-22.c
blob: 8429b2f4dc68de23c295e6841fa7530c294043cc (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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <string.h>
#include "analyzer-decls.h"

extern void check_init_char (char v);
extern void check_init_int (int v);

void test_1 (void)
{
  union
  {
    char c[16];
    int  i[4];
  } v;
  memset (&v, 0, sizeof (v));
  v.c[5] = 42;
  check_init_int (v.c[0]);
  check_init_int (v.c[4]);
  check_init_int (v.c[6]);
  check_init_int (v.i[1]);
}

void test_2 (void)
{
  /* Intersection of byte ranges within "v".  */
  union
  {
    struct {
      int  a;
      char b;
      char c;
    } __attribute__((packed)) icc;
    struct {
      char a;
      int  b;
      char c;
    } __attribute__((packed)) cic;
    struct {
      char a;
      char b;
      int  c;
    } __attribute__((packed)) cci;
  } v;

  v.icc.a = 1066;
  v.icc.b = 42;
  v.icc.c = 17;

  __analyzer_eval (v.icc.a == 1066); /* { dg-warning "TRUE" } */
  __analyzer_eval (v.icc.b == 42); /* { dg-warning "TRUE" } */
  __analyzer_eval (v.icc.c == 17); /* { dg-warning "TRUE" } */
  check_init_int (v.icc.a);
  check_init_char (v.icc.b);
  check_init_char (v.icc.c);
  
  check_init_char (v.cic.a);
  check_init_int (v.cic.b);
  check_init_char (v.cic.c);
  
  check_init_char (v.cci.a);
  check_init_char (v.cci.b);
  check_init_int (v.cci.c);

  v.cic.a = 42;
  v.cic.b = 1066;
  v.cic.c = 17;

  __analyzer_eval (v.cic.a == 42); /* { dg-warning "TRUE" } */
  __analyzer_eval (v.cic.b == 1066); /* { dg-warning "TRUE" } */
  __analyzer_eval (v.cic.c == 17); /* { dg-warning "TRUE" } */
  check_init_int (v.icc.a);
  check_init_char (v.icc.b);
  check_init_char (v.icc.c);
  
  check_init_char (v.cic.a);
  check_init_int (v.cic.b);
  check_init_char (v.cic.c);
  
  check_init_char (v.cci.a);
  check_init_char (v.cci.b);
  check_init_int (v.cci.c);  

  v.cci.a = 42;
  v.cci.b = 17;
  v.cci.c = 1066;

  __analyzer_eval (v.cci.a == 42); /* { dg-warning "TRUE" } */
  __analyzer_eval (v.cci.b == 17); /* { dg-warning "TRUE" } */
  __analyzer_eval (v.cci.c == 1066); /* { dg-warning "TRUE" } */
  check_init_int (v.icc.a);
  check_init_char (v.icc.b);
  check_init_char (v.icc.c);
  
  check_init_char (v.cic.a);
  check_init_int (v.cic.b);
  check_init_char (v.cic.c);
  
  check_init_char (v.cci.a);
  check_init_char (v.cci.b);
  check_init_int (v.cci.c);  

}