aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/c-c++-common/attr-nonstring-5.c
blob: f9b4fd92732bd07effef9d6859f214fed2aeb3ef (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
/* PR middle-end/84725 - enable attribute nonstring for all narrow character
   types
   Verify that using attribute nonstring with all three narrow character
   types is accepted and using arrays and pointers to characters of all
   three types (including their qualified forms) declared with the
   attributes doesn't trigger -Wstringop-truncation warnings.
   { dg-do compile }
   { dg-options "-O -Wall -Wstringop-truncation" } */

#if __cplusplus
extern "C"
#endif
char* strncpy (char*, const char*, __SIZE_TYPE__);

#define NONSTR __attribute__ ((nonstring))

#define S "1234"

struct Arrays
{
  char NONSTR a[4];
  signed char NONSTR b[4];
  unsigned char NONSTR c[4];
};

void test_arrays (struct Arrays *p, const char *s)
{
  strncpy (p->a, s, sizeof p->a);
  strncpy ((char*)p->b, s, sizeof p->b);
  strncpy ((char*)p->c, s, sizeof p->c);
}

struct Pointers
{
  char NONSTR *p;
  signed char NONSTR *q;
  unsigned char NONSTR *r;
};

void test_pointers (struct Pointers *p)
{
  strncpy (p->p, S, sizeof S - 1);
  strncpy ((char*)p->q, S, sizeof S - 1);
  strncpy ((char*)p->r, S, sizeof S - 1);
}

struct ConstArrays
{
  const char NONSTR a[4];
  const signed char NONSTR b[4];
  const unsigned char NONSTR c[4];
};

void test_const_arrays (struct ConstArrays *p, const char *s)
{
  strncpy ((char*)p->a, s, sizeof p->a);
  strncpy ((char*)p->b, s, sizeof p->b);
  strncpy ((char*)p->c, s, sizeof p->c);
}

struct ConstPointers
{
  const char NONSTR *p;
  const signed char NONSTR *q;
  const unsigned char NONSTR *r;
};

void test_const_pointers (struct ConstPointers *p)
{
  strncpy ((char*)p->p, S, sizeof S - 1);
  strncpy ((char*)p->q, S, sizeof S - 1);
  strncpy ((char*)p->r, S, sizeof S - 1);
}

struct VolatileArrays
{
  volatile char NONSTR a[4];
  volatile signed char NONSTR b[4];
  volatile unsigned char NONSTR c[4];
};

void test_volatile_arrays (struct VolatileArrays *p, const char *s)
{
  strncpy ((char*)p->a, s, sizeof p->a);
  strncpy ((char*)p->b, s, sizeof p->b);
  strncpy ((char*)p->c, s, sizeof p->c);
}

struct VolatilePointers
{
  volatile char NONSTR *p;
  volatile signed char NONSTR *q;
  volatile unsigned char NONSTR *r;
};

void test_volatile_pointers (struct VolatilePointers *p)
{
  strncpy ((char*)p->p, S, sizeof S - 1);
  strncpy ((char*)p->q, S, sizeof S - 1);
  strncpy ((char*)p->r, S, sizeof S - 1);
}

struct ConstVolatileArrays
{
  const volatile char NONSTR a[4];
  const volatile signed char NONSTR b[4];
  const volatile unsigned char NONSTR c[4];
};

void test_const_volatile_arrays (struct ConstVolatileArrays *p, const char *s)
{
  strncpy ((char*)p->a, s, sizeof p->a);
  strncpy ((char*)p->b, s, sizeof p->b);
  strncpy ((char*)p->c, s, sizeof p->c);
}

struct ConstVolatilePointers
{
  const volatile char NONSTR *p;
  const volatile signed char NONSTR *q;
  const volatile unsigned char NONSTR *r;
};

void test_const_volatile_pointers (struct ConstVolatilePointers *p)
{
  strncpy ((char*)p->p, S, sizeof S - 1);
  strncpy ((char*)p->q, S, sizeof S - 1);
  strncpy ((char*)p->r, S, sizeof S - 1);
}

/* { dg-prune-output "-Wdiscarded-qualifiers" } */