[C++ PATCH] Deprecate -ffriend-injection
[official-gcc.git] / gcc / testsuite / gcc.dg / strlenopt-12.c
blob1005fc6709e53265f4804384ebfbea7ac6124662
1 /* { dg-do run } */
2 /* { dg-options "-O2" } */
4 #include "strlenopt.h"
6 __attribute__((noinline, noclone)) char *
7 fn1 (char *p, size_t *l)
9 char *q = strcat (p, "abcde");
10 *l = strlen (p);
11 return q;
14 __attribute__((noinline, noclone)) char *
15 fn2 (char *p, const char *q, size_t *l1, size_t *l2)
17 size_t l = strlen (q);
18 char *r = strcat (p, q);
19 *l1 = l;
20 *l2 = strlen (p);
21 return r;
24 __attribute__((noinline, noclone)) char *
25 fn3 (char *p, const char *q, size_t *l)
27 char *r = strcpy (p, q);
28 *l = strlen (p);
29 return r;
32 __attribute__((noinline, noclone)) char *
33 fn4 (char *p, const char *q, size_t *l)
35 char *r = strcat (p, q);
36 *l = strlen (p);
37 return r;
40 __attribute__((noinline, noclone)) char *
41 fn5 (char *p, const char *q, size_t *l1, size_t *l2, size_t *l3)
43 size_t l = strlen (q);
44 size_t ll = strlen (p);
45 char *r = strcat (p, q);
46 *l1 = l;
47 *l2 = strlen (p);
48 *l3 = ll;
49 return r;
52 __attribute__((noinline, noclone)) char *
53 fn6 (char *p, const char *q, size_t *l1, size_t *l2)
55 size_t l = strlen (p);
56 char *r = strcat (p, q);
57 *l1 = strlen (p);
58 *l2 = l;
59 return r;
62 int
63 main ()
65 char buf[64];
66 const char *volatile q = "fgh";
67 size_t l, l1, l2, l3;
68 memset (buf, '\0', sizeof buf);
69 memset (buf, 'a', 3);
70 if (fn1 (buf, &l) != buf || l != 8 || memcmp (buf, "aaaabcde", 9) != 0)
71 abort ();
72 if (fn2 (buf, q, &l1, &l2) != buf || l1 != 3 || l2 != 11
73 || memcmp (buf, "aaaabcdefgh", 12) != 0)
74 abort ();
75 if (fn3 (buf, q, &l) != buf || l != 3
76 || memcmp (buf, "fgh\0bcdefgh", 12) != 0)
77 abort ();
78 if (fn4 (buf, q, &l) != buf || l != 6
79 || memcmp (buf, "fghfgh\0efgh", 12) != 0)
80 abort ();
81 l1 = 0;
82 l2 = 0;
83 if (fn5 (buf, q, &l1, &l2, &l3) != buf || l1 != 3 || l2 != 9 || l3 != 6
84 || memcmp (buf, "fghfghfgh\0h", 12) != 0)
85 abort ();
86 if (fn6 (buf, q, &l1, &l2) != buf || l1 != 12 || l2 != 9
87 || memcmp (buf, "fghfghfghfgh", 13) != 0)
88 abort ();
89 return 0;