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