annotate gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-5.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* PR middle-end/78476 - snprintf(0, 0, ...) with known arguments not
kono
parents:
diff changeset
2 optimized away
kono
parents:
diff changeset
3 { dg-do compile }
kono
parents:
diff changeset
4 { dg-options "-O2 -fdump-tree-optimized" }
kono
parents:
diff changeset
5 { dg-require-effective-target int32plus } */
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 #define CAT(s, n) s ## n
kono
parents:
diff changeset
8 #define FAIL(line) CAT (failure_on_line_, line)
kono
parents:
diff changeset
9 #define PASS(line) CAT (success_on_line_, line)
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 /* Emit a call to a function named failure_on_line_NNN when VALUE
kono
parents:
diff changeset
12 is not equal to the constant EXPECTED, otherwise emit a call to
kono
parents:
diff changeset
13 function success_on_line_NNN. */
kono
parents:
diff changeset
14 #define ASSERT(value, expected) \
kono
parents:
diff changeset
15 do { \
kono
parents:
diff changeset
16 extern void FAIL (__LINE__)(int); \
kono
parents:
diff changeset
17 extern void PASS (__LINE__)(int); \
kono
parents:
diff changeset
18 if (value == expected) \
kono
parents:
diff changeset
19 PASS (__LINE__)(value); \
kono
parents:
diff changeset
20 else \
kono
parents:
diff changeset
21 FAIL (__LINE__)(value); \
kono
parents:
diff changeset
22 } while (0)
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 /* Verify that EXPECT == snprintf(0, 0, ...). */
kono
parents:
diff changeset
25 #define EQL(expect, ...) \
kono
parents:
diff changeset
26 do { \
kono
parents:
diff changeset
27 int n = __builtin_snprintf (0, 0, __VA_ARGS__); \
kono
parents:
diff changeset
28 ASSERT (n, expect); \
kono
parents:
diff changeset
29 } while (0)
kono
parents:
diff changeset
30
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
31 static int ival (int i) { return i; }
111
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 /* Generate a signed int value in the specified range. */
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 static int
kono
parents:
diff changeset
36 int_range (int min, int max)
kono
parents:
diff changeset
37 {
kono
parents:
diff changeset
38 extern int int_value (void);
kono
parents:
diff changeset
39 int val = int_value ();
kono
parents:
diff changeset
40 if (val < min || max < val)
kono
parents:
diff changeset
41 val = min;
kono
parents:
diff changeset
42 return val;
kono
parents:
diff changeset
43 }
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 #define R(min, max) int_range (min, max)
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 void test_arg_int (int i, int n)
kono
parents:
diff changeset
48 {
kono
parents:
diff changeset
49 EQL (1, "%i", ival (0));
kono
parents:
diff changeset
50 EQL (1, "%i", ival (1));
kono
parents:
diff changeset
51 EQL (2, "%i%i", ival (0), ival (1));
kono
parents:
diff changeset
52 EQL (3, "%i%i%i", ival (0), ival (1), ival (9));
kono
parents:
diff changeset
53 EQL (5, "%i %i %i", ival (0), ival (1), ival (9));
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 EQL (5, "%i %i %i", ival (0), ival (1), ival (9));
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 EQL (13, "%hhu.%hhu.%hhu.%hhu", ival (23), ival (78), ival (216), ival (135));
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 for (i = 0; i != 9; ++i)
kono
parents:
diff changeset
60 EQL (1, "%i", i);
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 for (i = -n; i != n; ++i)
kono
parents:
diff changeset
63 EQL (8, "%08x", i);
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 /* As a special case, a precision of zero with an argument of zero
kono
parents:
diff changeset
66 results in zero bytes (unless modified by width). */
kono
parents:
diff changeset
67 EQL (0, "%.0d", ival (0));
kono
parents:
diff changeset
68 EQL (0, "%.0i", ival (0));
kono
parents:
diff changeset
69 EQL (0, "%.0o", ival (0));
kono
parents:
diff changeset
70 EQL (0, "%.0u", ival (0));
kono
parents:
diff changeset
71 EQL (0, "%.0x", ival (0));
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 EQL (0, "%.*d", 0, ival (0));
kono
parents:
diff changeset
74 EQL (0, "%.*i", 0, ival (0));
kono
parents:
diff changeset
75 EQL (0, "%.*o", 0, ival (0));
kono
parents:
diff changeset
76 EQL (0, "%.*u", 0, ival (0));
kono
parents:
diff changeset
77 EQL (0, "%.*x", 0, ival (0));
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 EQL (1, "%1.0d", ival (0));
kono
parents:
diff changeset
80 EQL (1, "%1.0i", ival (0));
kono
parents:
diff changeset
81 EQL (1, "%1.0o", ival (0));
kono
parents:
diff changeset
82 EQL (1, "%1.0u", ival (0));
kono
parents:
diff changeset
83 EQL (1, "%1.0x", ival (0));
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 EQL (4, "%hhi", R (-128, -127));
kono
parents:
diff changeset
86 EQL (3, "%hhi", R ( -99, -10));
kono
parents:
diff changeset
87 EQL (2, "%hhi", R ( -9, -1));
kono
parents:
diff changeset
88 EQL (1, "%hhi", R ( 0, 9));
kono
parents:
diff changeset
89 EQL (1, "%hhi", R ( 0, 9));
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 EQL (1, "%1.0hhi", R ( 0, 1));
kono
parents:
diff changeset
92 EQL (1, "%1.1hhi", R ( 0, 9));
kono
parents:
diff changeset
93 EQL (2, "%1.2hhi", R ( 0, 9));
kono
parents:
diff changeset
94 EQL (3, "%1.3hhi", R ( 0, 9));
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 EQL (1, "%hhi", R (1024, 1033));
kono
parents:
diff changeset
97 EQL (2, "%hhi", R (1034, 1123));
kono
parents:
diff changeset
98 EQL (1, "%hhu", R (1024, 1033));
kono
parents:
diff changeset
99 EQL (2, "%hhu", R (1034, 1123));
kono
parents:
diff changeset
100 }
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 void test_arg_string (const char *s)
kono
parents:
diff changeset
103 {
kono
parents:
diff changeset
104 EQL ( 0, "%-s", "");
kono
parents:
diff changeset
105 EQL ( 1, "%%");
kono
parents:
diff changeset
106 EQL ( 1, "%-s", "1");
kono
parents:
diff changeset
107 EQL ( 2, "%-s", "12");
kono
parents:
diff changeset
108 EQL ( 3, "%-s", "123");
kono
parents:
diff changeset
109 EQL ( 5, "s=%s", "123");
kono
parents:
diff changeset
110 EQL (10, "%%s=\"%s\"", "12345");
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 EQL ( 1, "%.*s", 1, "123");
kono
parents:
diff changeset
113 EQL ( 2, "%.*s", 2, "123");
kono
parents:
diff changeset
114 EQL ( 3, "%.*s", 3, "123");
kono
parents:
diff changeset
115 EQL ( 3, "%.*s", 4, "123");
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 EQL ( 1, "%1.*s", 1, "123");
kono
parents:
diff changeset
118 EQL ( 2, "%1.*s", 2, "123");
kono
parents:
diff changeset
119 EQL ( 3, "%1.*s", 3, "123");
kono
parents:
diff changeset
120 EQL ( 3, "%1.*s", 4, "123");
kono
parents:
diff changeset
121 EQL ( 4, "%4.*s", 1, "123");
kono
parents:
diff changeset
122 EQL ( 4, "%4.*s", 2, "123");
kono
parents:
diff changeset
123 EQL ( 4, "%4.*s", 3, "123");
kono
parents:
diff changeset
124 EQL ( 4, "%4.*s", 4, "123");
kono
parents:
diff changeset
125 EQL ( 4, "%4.*s", 5, "123");
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 const char *a = "123";
kono
parents:
diff changeset
128 const char *b = "456";
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 EQL ( 3, "%-s", s ? a : b);
kono
parents:
diff changeset
131 EQL ( 0, "%.0s", s);
kono
parents:
diff changeset
132 EQL ( 1, "%1.1s", s);
kono
parents:
diff changeset
133 EQL ( 2, "%2.2s", s);
kono
parents:
diff changeset
134 EQL ( 2, "%2.1s", s);
kono
parents:
diff changeset
135 }
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 void test_arg_multiarg (int i, double d)
kono
parents:
diff changeset
138 {
kono
parents:
diff changeset
139 EQL (16, "%12i %s", i, "abc");
kono
parents:
diff changeset
140 EQL (16, "%*i %s", 12, i, "abc");
kono
parents:
diff changeset
141 }
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 /* Verify that EXPECT == vsnprintf(0, 0, ...). */
kono
parents:
diff changeset
144 #define EQLv(expect, fmt, va) \
kono
parents:
diff changeset
145 do { \
kono
parents:
diff changeset
146 int n = __builtin_vsnprintf (0, 0, fmt, va); \
kono
parents:
diff changeset
147 ASSERT (n, expect); \
kono
parents:
diff changeset
148 } while (0)
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 void test_va_int (__builtin_va_list va)
kono
parents:
diff changeset
151 {
kono
parents:
diff changeset
152 EQLv ( 2, "%02hhx", va);
kono
parents:
diff changeset
153 EQLv ( 4, "%04hx", va);
kono
parents:
diff changeset
154 }
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 void test_va_multiarg (__builtin_va_list va)
kono
parents:
diff changeset
157 {
kono
parents:
diff changeset
158 EQLv ( 8, "%8x", va);
kono
parents:
diff changeset
159 EQLv ( 8, "% 8x", va);
kono
parents:
diff changeset
160 EQLv ( 9, "%9x", va);
kono
parents:
diff changeset
161 EQLv (11, "%11o", va);
kono
parents:
diff changeset
162 EQLv (12, "%12o", va);
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 EQLv (16, "%12i %3.2s", va);
kono
parents:
diff changeset
165 }
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 /* { dg-final { scan-tree-dump-not "failure_on_line" "optimized"} }
kono
parents:
diff changeset
169 { dg-final { scan-tree-dump-not "snprintf" "optimized"} } */