1 /* PR 85643 - attribute nonstring fails to squash -Wstringop-truncation
2 warning
3 { dg-do compile }
4 { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */
5
6 #define strncpy __builtin_strncpy
7
8 struct A {
9 char a[16 + 1];
10 };
11
12 struct B {
13 char a[16] __attribute__ ((__nonstring__));
14 };
15
16 struct B*
test_memarray(const struct A * s)17 test_memarray (const struct A *s)
18 {
19 static struct B b;
20 strncpy (b.a, s->a, sizeof b.a);
21 return &b;
22 }
23
24 const char*
test_array(const char * s)25 test_array (const char *s)
26 {
27 static char a[80] __attribute__ ((__nonstring__));
28 strncpy (a, s, sizeof a);
29 return a;
30 }
31
32 const char*
test_array_idx(const char * s)33 test_array_idx (const char *s)
34 {
35 static char a[80] __attribute__ ((__nonstring__));
36 char *p __attribute__ ((__nonstring__)) = &a[20];
37 strncpy (p, s, 60); /* { dg-bogus "-Wstringop-truncation" } */
38 return a;
39 }
40
41 const char*
test_array_off(const char * s)42 test_array_off (const char *s)
43 {
44 static char a[80] __attribute__ ((__nonstring__));
45 char *p __attribute__ ((__nonstring__)) = a + 20;
46 strncpy (p, s, 60); /* { dg-bogus "-Wstringop-truncation" } */
47 return a;
48 }
49
50 struct B*
test_memarray_cstidx_idx(const char * s)51 test_memarray_cstidx_idx (const char *s)
52 {
53 static struct B b[2];
54 char *p __attribute__ ((__nonstring__)) = &b[1].a[4];
55
56 /* The destination below is represented as &MEM[(void *)&a + 20B] and
57 which (in general) doesn't make it possible to determine what member
58 it refers to. */
59 strncpy (p, s, sizeof b[1].a - 4); /* { dg-bogus "-Wstringop-truncation" "" { xfail *-*-*} } */
60 return b;
61 }
62
63 struct B*
test_memarray_cstidx_off(const char * s)64 test_memarray_cstidx_off (const char *s)
65 {
66 static struct B b[2];
67 char *p __attribute__ ((__nonstring__)) = b[1].a + 4;
68
69 /* Same as above. */
70 strncpy (p, s, sizeof b[1].a - 4); /* { dg-bogus "-Wstringop-truncation" "" { xfail *-*-*} } */
71 return b;
72 }
73
74 struct B*
test_memarray_varidx_idx(const char * s,int i)75 test_memarray_varidx_idx (const char *s, int i)
76 {
77 static struct B b[3];
78 char *p __attribute__ ((__nonstring__)) = &b[i].a[4];
79 strncpy (p, s, sizeof b[i].a - 4);
80 return b;
81 }
82
83 struct B*
test_memarray_varidx_off(const char * s,int i)84 test_memarray_varidx_off (const char *s, int i)
85 {
86 static struct B b[3];
87 char *p __attribute__ ((__nonstring__)) = b[i].a + 4;
88 strncpy (p, s, sizeof b[i].a - 4);
89 return b;
90 }
91