annotate gcc/testsuite/gcc.dg/strlenopt-36.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /* PR tree-optimization/78450 - strlen(s) return value can be assumed
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 to be less than the size of s
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 { dg-do compile }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 { dg-options "-O2 -fdump-tree-optimized" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 #include "strlenopt.h"
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 extern char a7[7], a6[6], a5[5], a4[4], a3[3], a2[2], a1[1];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 extern char a0[0]; /* Intentionally not tested here. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 extern char ax[]; /* Same. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 struct MemArrays {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 char a7[7], a6[6], a5[5], a4[4], a3[3], a2[2], a1[1];
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 char a0[0]; /* Not tested here. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 struct NestedMemArrays {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 struct { char a7[7]; } ma7;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 struct { char a6[6]; } ma6;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 struct { char a5[5]; } ma5;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 struct { char a4[4]; } ma4;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 struct { char a3[3]; } ma3;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 struct { char a2[2]; } ma2;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 struct { char a1[1]; } ma1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 struct { char a0[0]; } ma0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 char last;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 extern void failure_on_line (int);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 #define TEST_FAIL(line) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 do { \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 failure_on_line (line); \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 } while (0)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 #define T(expr) \
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 if (!(expr)) TEST_FAIL (__LINE__); else (void)0
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 void test_array (void)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 T (strlen (a7) < sizeof a7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 T (strlen (a6) < sizeof a6);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 T (strlen (a5) < sizeof a5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 T (strlen (a4) < sizeof a4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 T (strlen (a3) < sizeof a3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 /* The following two calls are folded too early which defeats
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 the strlen() optimization.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 T (strlen (a2) == 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 T (strlen (a1) == 0); */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 void test_memarray (struct MemArrays *ma)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 T (strlen (ma->a7) < sizeof ma->a7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 T (strlen (ma->a6) < sizeof ma->a6);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 T (strlen (ma->a5) < sizeof ma->a5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 T (strlen (ma->a4) < sizeof ma->a4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 T (strlen (ma->a3) < sizeof ma->a3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 /* The following two calls are folded too early which defeats
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 the strlen() optimization.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 T (strlen (ma->a2) == 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 T (strlen (ma->a1) == 0); */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 /* Verify that the range of strlen(A) of a last struct member is
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 set even when the array is the sole member of a struct as long
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 as the struct itself is a member of another struct. The converse
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 is tested in stlenopt-37.c. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 void test_nested_memarray (struct NestedMemArrays *ma)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 T (strlen (ma->ma7.a7) < sizeof ma->ma7.a7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 T (strlen (ma->ma6.a6) < sizeof ma->ma6.a6);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76 T (strlen (ma->ma5.a5) < sizeof ma->ma5.a5);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 T (strlen (ma->ma4.a4) < sizeof ma->ma4.a4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 T (strlen (ma->ma3.a3) < sizeof ma->ma3.a3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 /* The following two calls are folded too early which defeats
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 the strlen() optimization.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 T (strlen (ma->ma2.a2) == 1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 T (strlen (ma->ma1.a1) == 0); */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 /* { dg-final { scan-tree-dump-not "failure_on_line" "optimized" } } */