aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/uninit-33.c
blob: 732d33e006ddf42eb1b186d18a98856b9bee4492 (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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/* PR middle-end/10138 - warn for uninitialized arrays passed as const*
   arguments
   Verify that passing pointers to uninitialized objects to arguments
   to functions declared with attribute access is diagnosed where expected.
   { dg-do compile }
   { dg-options "-O -Wall" } */

#define RO(...) __attribute__ ((access (read_only, __VA_ARGS__)))
#define RW(...) __attribute__ ((access (read_write, __VA_ARGS__)))
#define WO(...) __attribute__ ((access (write_only, __VA_ARGS__)))

RO (1) void fpri (int*);      // { dg-message "in a call to 'fpri' declared with attribute 'access \\\(read_only, 1\\\)' here" }

RO (1) void fpcri (const int*);

RO (1, 2) void fpcri1_2 (const int*, int);


void warn_scalar_fpri (void)
{
  int i;                      // { dg-message "declared here" }
  fpri (&i);                  // { dg-warning "'i' is used uninitialized" }
}

void nowarn_scalar_plus_fpri (void)
{
  int i;
  /* This gets a -Wstringop-overflow for reading past the end but not
     -Wuninitialized because there's nothing to initialize there.  */
  fpri (&i + 1);              // { dg-warning "\\\[-Wstringop-overread" }
}

void nowarn_array_assign_fpcri (void)
{
  int a[2];
  a[0] = 0;
  fpcri (a);
}

void nowarn_array_init_fpcri (void)
{
  int a[4] = { 0 };
  fpcri (a);
}

void nowarn_array_compound_fpri (void)
{
  fpri ((int[2]){ 0 });
}

void nowarn_array_compound_fpcri (void)
{
  fpcri ((int[3]){ 1 });
}

void warn_scalar_fpcri (void)
{
  int i;
  fpcri (&i);                 // { dg-warning "\\\[-Wuninitialized" }
}

void warn_array_fpcri (void)
{
  int a[4];
  fpcri (a);                  // { dg-warning "\\\[-Wuninitialized" }
}

void warn_array_plus_cst_fpcri (void)
{
  int a[4];
  fpcri (a + 1);              // { dg-warning "\\\[-Wuninitialized" }
}

void warn_array_plus_var_fpcri (int i)
{
  int a[4];
  fpcri (a + i);              // { dg-warning "\\\[-Wuninitialized" }
}

void nowarn_struct_assign_fpcri (void)
{
  struct { int a, b; } s;
  s.a = 0;
  fpcri (&s.a);
}

void warn_struct_assign_fpcri (void)
{
  struct { int a, b; } s;
  s.a = 0;
  fpcri (&s.b);               // { dg-warning "\\\[-Wuninitialized" }
}

void nowarn_struct_init_fpcri (void)
{
  struct { int a, b; } s = { 0 };
  fpcri (&s.a);
  fpcri (&s.b);
}

void nowarn_struct_compound_fpcri (void)
{
  struct S { int a, b; };
  fpcri (&(struct S){ }.a);
  fpcri (&(struct S){ }.b);
}


void nowarn_scalar_fpcri1_2 (void)
{
  int i;
  fpcri1_2 (&i, 0);
}

void nowarn_array_assign_fpcri1_2 (void)
{
  int a[2];
  a[0] = 0;
  fpcri1_2 (a, 1);
}

void nowarn_array_assign_fpcri1_2_plus_cst (void)
{
  int a[3];
  a[1] = 0;
  fpcri1_2 (a + 1, 1);
}

void nowarn_array_init_fpcri1_2 (void)
{
  int a[4] = { 0 };
  fpcri1_2 (a, 2);
}

void warn_array_fpcri1_2_rd1 (void)
{
  int a[4];
  fpcri1_2 (a, 1);            // { dg-warning "\\\[-Wuninitialized" }
}

void warn_array_fpcri1_2_rd2 (void)
{
  int a[4];
  fpcri1_2 (a, 2);            // { dg-warning "\\\[-Wuninitialized" }
}