annotate gcc/testsuite/g++.dg/init/string2.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children
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/71625 - missing strlen optimization on different
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 // array initialization style
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 //
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 // Verify that strlen() calls with constant character array arguments
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 // initialized with string constants are folded. (This is a small
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 // subset of pr71625).
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 // { dg-do compile }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 // { dg-options "-O0 -Wno-error=narrowing -fdump-tree-gimple" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 #define A(expr) do { typedef char A[-1 + 2 * !!(expr)]; } while (0)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 /* This is undefined but accepted without -Wpedantic. Verify that
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 the size is zero. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 const char ax[] = { };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 void size0 ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 A (sizeof ax == 0);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 const char a0[] = { 'a', 'b', 'c', '\0' };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 int len0 ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 return __builtin_strlen (a0);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 // Verify that narrowing warnings are preserved.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 const signed char
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 sa0[] = { 'a', 'b', 255, '\0' }; // { dg-warning "\\\[\(-Wnarrowing|-Woverflow\)" "" { target { ! c++98_only } } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 int lens0 ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 return __builtin_strlen ((const char*)sa0);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 const unsigned char
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 ua0[] = { 'a', 'b', -1, '\0' }; // { dg-warning "\\\[\(-Wnarrowing|-Woverflow\)" "" { target { ! c++98_only } } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 int lenu0 ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 return __builtin_strlen ((const char*)ua0);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 const char c = 0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 const char a1[] = { 'a', 'b', 'c', c };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 int len1 ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 return __builtin_strlen (a1);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 template <class T>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 int tmplen ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 static const T
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 a[] = { 1, 2, 333, 0 }; // { dg-warning "\\\[\(-Wnarrowing|-Woverflow\)" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 return __builtin_strlen (a);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 template int tmplen<char>();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 const wchar_t ws4[] = { 1, 2, 3, 4 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 const wchar_t ws7[] = { 1, 2, 3, 4, 0, 0, 0 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 const wchar_t ws9[9] = { 1, 2, 3, 4, 0 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 void wsize ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 A (sizeof ws4 == 4 * sizeof *ws4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 A (ws4[0] == 1 && ws4[1] == 2 && ws4[2] == 3 && ws4[3] == 4);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 A (sizeof ws7 == 7 * sizeof *ws7);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 A (ws7[0] == 1 && ws7[1] == 2 && ws7[2] == 3 && ws7[4] == 4
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 && !ws7[5] && !ws7[6]);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76 A (sizeof ws9 == 9 * sizeof *ws9);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 A (ws9[0] == 1 && ws9[1] == 2 && ws9[2] == 3 && ws9[4] == 4
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 && !ws9[5] && !ws9[6] && !ws9[7] && !ws9[8]);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 #if 0
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 // The following aren't handled.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85 const char &cref = c;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 const char a2[] = { 'a', 'b', 'c', cref };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 int len2 ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 return __builtin_strlen (a2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 const char* const cptr = &cref;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 const char a3[] = { 'a', 'b', 'c', *cptr };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97 int len3 ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 return __builtin_strlen (a3);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 #endif
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 // { dg-final { scan-tree-dump-times "strlen" 0 "gimple" } }