]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/gcc.dg/strlenopt-69.c
46ceb9ddb054dc5f891cc64afc0e34ff9c37a4b1
[thirdparty/gcc.git] / gcc / testsuite / gcc.dg / strlenopt-69.c
1 /* PR tree-optimization/90879 - fold zero-equality of strcmp between
2 a longer string and a smaller array
3 { dg-do compile }
4 { dg-options "-O2 -Wall -Wno-string-compare -fdump-tree-optimized -ftrack-macro-expansion=0" } */
5
6 #include "strlenopt.h"
7
8 #define A(expr) \
9 ((expr) \
10 ? (void)0 \
11 : (__builtin_printf ("assertion failed on line %i: %s\n", \
12 __LINE__, #expr), \
13 __builtin_abort ()))
14
15 void clobber (void*, ...);
16
17 struct S { char a4[4], c; };
18
19 extern char a4[4];
20 extern char b4[4];
21
22 /* Verify that comparison of string literals with arrays with unknown
23 content but size that prevents them from comparing equal is folded
24 to a constant. */
25
26 void test_array_lit (void)
27 {
28 A (strcmp (a4, "1234")); clobber (a4);
29 A (strcmp (a4, "12345")); clobber (a4);
30 A (strcmp (a4, "123456")); clobber (a4);
31 A (strcmp ("1234", a4)); clobber (a4);
32 A (strcmp ("12345", a4)); clobber (a4);
33 A (strcmp ("123456", a4)); clobber (a4);
34 }
35
36 void test_memarray_lit (struct S *p)
37 {
38 A (strcmp (p->a4, "1234"));
39 A (strcmp (p->a4, "12345"));
40 A (strcmp (p->a4, "123456"));
41
42 A (strcmp ("1234", p->a4));
43 A (strcmp ("12345", p->a4));
44 A (strcmp ("123456", p->a4));
45 }
46
47 /* Verify that the equality of empty strings is folded. */
48
49 void test_empty_string (void)
50 {
51 A (0 == strcmp ("", ""));
52
53 *a4 = '\0';
54 A (0 == strcmp (a4, ""));
55 A (0 == strcmp ("", a4));
56 A (0 == strcmp (a4, a4));
57
58 char s[8] = "";
59 A (0 == strcmp (a4, s));
60
61 a4[1] = '\0';
62 b4[1] = '\0';
63 A (0 == strcmp (a4 + 1, b4 + 1));
64
65 a4[2] = '\0';
66 b4[2] = '\0';
67 A (0 == strcmp (&a4[2], &b4[2]));
68
69 clobber (a4, b4);
70
71 memset (a4, 0, sizeof a4);
72 memset (b4, 0, sizeof b4);
73 A (0 == strcmp (a4, b4));
74 }
75
76 /* Verify that comparison of dynamically created strings with unknown
77 arrays is folded. */
78
79 void test_array_copy (void)
80 {
81 char s[8];
82 strcpy (s, "1234");
83 A (strcmp (a4, s));
84
85 strcpy (s, "12345");
86 A (strlen (s) == 5);
87 A (strcmp (a4, s)); clobber (a4);
88
89 strcpy (s, "123456");
90 A (strcmp (a4, s)); clobber (a4);
91
92 strcpy (s, "1234");
93 A (strcmp (s, a4)); clobber (a4);
94
95 strcpy (s, "12345");
96 A (strcmp (s, a4)); clobber (a4);
97
98 strcpy (s, "123456");
99 A (strcmp (s, a4)); clobber (a4);
100 }
101
102
103 void test_array_bounded (void)
104 {
105 A (strncmp (a4, "12345", 5)); clobber (a4);
106 A (strncmp ("54321", a4, 5)); clobber (a4);
107
108 A (strncmp (a4, "123456", 5)); clobber (a4);
109 A (strncmp ("654321", a4, 5)); clobber (a4);
110 }
111
112 void test_array_copy_bounded (void)
113 {
114 char s[8];
115 strcpy (s, "12345");
116 A (strncmp (a4, s, 5)); clobber (a4);
117 strcpy (s, "54321");
118 A (strncmp (s, a4, 5)); clobber (a4);
119
120 strcpy (s, "123456");
121 A (strncmp (a4, s, 5)); clobber (a4);
122 strcpy (s, "654321");
123 A (strncmp (s, a4, 5)); clobber (a4);
124 }
125
126 /* { dg-final { scan-tree-dump-not "abort|strcmp|strncmp" "optimized" } } */