annotate gcc/testsuite/g++.dg/torture/20141013.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 /* { dg-options "-fno-short-enums" } */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 /* { dg-additional-options "-Wno-return-type" } */
111
kono
parents:
diff changeset
3 enum
kono
parents:
diff changeset
4 {
kono
parents:
diff changeset
5 _sch_isdigit = 0x0004,
kono
parents:
diff changeset
6 _sch_ispunct = 0x0020,
kono
parents:
diff changeset
7 _sch_isxdigit = 0x0100,
kono
parents:
diff changeset
8 _sch_isidst = 0x0200,
kono
parents:
diff changeset
9 _sch_isvsp = 0x0400,
kono
parents:
diff changeset
10 _sch_isnvsp = 0x0800,
kono
parents:
diff changeset
11 _sch_isalnum = _sch_isidst | _sch_isdigit,
kono
parents:
diff changeset
12 _sch_iscppsp = _sch_isvsp | _sch_isnvsp,
kono
parents:
diff changeset
13 };
kono
parents:
diff changeset
14 extern const unsigned short _sch_istable[256];
kono
parents:
diff changeset
15 typedef union tree_node *tree;
kono
parents:
diff changeset
16 typedef const union tree_node *const_tree;
kono
parents:
diff changeset
17 enum opt_code
kono
parents:
diff changeset
18 {
kono
parents:
diff changeset
19 OPT_Warray_bounds = 240,
kono
parents:
diff changeset
20 OPT_Wformat_ = 245,
kono
parents:
diff changeset
21 OPT_Wintf_annotation = 368,
kono
parents:
diff changeset
22 OPT_std_gnu__14 = 1311,
kono
parents:
diff changeset
23 };
kono
parents:
diff changeset
24 enum tree_code
kono
parents:
diff changeset
25 {
kono
parents:
diff changeset
26 TREE_LIST,
kono
parents:
diff changeset
27 CONST_DECL,
kono
parents:
diff changeset
28 ADDR_EXPR,
kono
parents:
diff changeset
29 MAX_TREE_CODES
kono
parents:
diff changeset
30 };
kono
parents:
diff changeset
31 enum tree_code_class
kono
parents:
diff changeset
32 {
kono
parents:
diff changeset
33 tcc_type,
kono
parents:
diff changeset
34 };
kono
parents:
diff changeset
35 enum tree_node_structure_enum
kono
parents:
diff changeset
36 {
kono
parents:
diff changeset
37 TS_TYPED,
kono
parents:
diff changeset
38 TS_COMMON,
kono
parents:
diff changeset
39 };
kono
parents:
diff changeset
40 enum integer_type_kind
kono
parents:
diff changeset
41 {
kono
parents:
diff changeset
42 itk_char,
kono
parents:
diff changeset
43 itk_none
kono
parents:
diff changeset
44 };
kono
parents:
diff changeset
45 struct tree_base
kono
parents:
diff changeset
46 {
kono
parents:
diff changeset
47 enum tree_code code:16;
kono
parents:
diff changeset
48 };
kono
parents:
diff changeset
49 struct tree_typed
kono
parents:
diff changeset
50 {
kono
parents:
diff changeset
51 tree type;
kono
parents:
diff changeset
52 };
kono
parents:
diff changeset
53 struct tree_common
kono
parents:
diff changeset
54 {
kono
parents:
diff changeset
55 tree chain;
kono
parents:
diff changeset
56 };
kono
parents:
diff changeset
57 struct tree_list
kono
parents:
diff changeset
58 {
kono
parents:
diff changeset
59 tree purpose;
kono
parents:
diff changeset
60 };
kono
parents:
diff changeset
61 struct tree_type_common
kono
parents:
diff changeset
62 {
kono
parents:
diff changeset
63 tree main_variant;
kono
parents:
diff changeset
64 };
kono
parents:
diff changeset
65 union tree_node
kono
parents:
diff changeset
66 {
kono
parents:
diff changeset
67 struct tree_base base;
kono
parents:
diff changeset
68 struct tree_typed typed;
kono
parents:
diff changeset
69 struct tree_common common;
kono
parents:
diff changeset
70 struct tree_type_common type_common;
kono
parents:
diff changeset
71 struct tree_list list;
kono
parents:
diff changeset
72 };
kono
parents:
diff changeset
73 extern unsigned char tree_contains_struct[MAX_TREE_CODES][64];
kono
parents:
diff changeset
74 extern tree integer_types[itk_none];
kono
parents:
diff changeset
75 extern void tree_contains_struct_check_failed (const_tree,
kono
parents:
diff changeset
76 tree_node_structure_enum,
kono
parents:
diff changeset
77 const char *, int,
kono
parents:
diff changeset
78 const char *)
kono
parents:
diff changeset
79 __attribute__ ((__noreturn__));
kono
parents:
diff changeset
80 inline tree
kono
parents:
diff changeset
81 tree_check (tree __t, const char *__f, int __l, const char *__g,
kono
parents:
diff changeset
82 tree_code __c)
kono
parents:
diff changeset
83 {
kono
parents:
diff changeset
84 }
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 inline const_tree
kono
parents:
diff changeset
87 contains_struct_check (const_tree __t,
kono
parents:
diff changeset
88 const enum tree_node_structure_enum __s,
kono
parents:
diff changeset
89 const char *__f, int __l, const char *__g)
kono
parents:
diff changeset
90 {
kono
parents:
diff changeset
91 if (tree_contains_struct[((enum tree_code) (__t)->base.code)][__s] != 1)
kono
parents:
diff changeset
92 tree_contains_struct_check_failed (__t, __s, __f, __l, __g);
kono
parents:
diff changeset
93 }
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 inline const_tree
kono
parents:
diff changeset
96 tree_class_check (const_tree __t, const enum tree_code_class __class,
kono
parents:
diff changeset
97 const char *__f, int __l, const char *__g)
kono
parents:
diff changeset
98 {
kono
parents:
diff changeset
99 }
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 static inline bool
kono
parents:
diff changeset
102 is_attribute_p (const char *attr_name, const_tree ident)
kono
parents:
diff changeset
103 {
kono
parents:
diff changeset
104 }
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 extern int integer_zerop (const_tree);
kono
parents:
diff changeset
107 extern bool warning (int, const char *, ...)
kono
parents:
diff changeset
108 __attribute__ ((__nonnull__ (2)));
kono
parents:
diff changeset
109 extern void
kono
parents:
diff changeset
110 check_function_arguments_recurse (void (*)(void *, tree, unsigned long long),
kono
parents:
diff changeset
111 void *, tree, unsigned long long);
kono
parents:
diff changeset
112 extern bool objc_string_ref_type_p (tree);
kono
parents:
diff changeset
113 enum
kono
parents:
diff changeset
114 {
kono
parents:
diff changeset
115 FMT_FLAG_SCANF_A_KLUDGE = 2,
kono
parents:
diff changeset
116 FMT_FLAG_PARSE_ARG_CONVERT_EXTERNAL = 256
kono
parents:
diff changeset
117 };
kono
parents:
diff changeset
118 typedef struct
kono
parents:
diff changeset
119 {
kono
parents:
diff changeset
120 }
kono
parents:
diff changeset
121 format_flag_spec;
kono
parents:
diff changeset
122 typedef struct
kono
parents:
diff changeset
123 {
kono
parents:
diff changeset
124 int flags;
kono
parents:
diff changeset
125 tree *width_type;
kono
parents:
diff changeset
126 }
kono
parents:
diff changeset
127 format_kind_info;
kono
parents:
diff changeset
128 typedef struct alloc_pool_list_def
kono
parents:
diff changeset
129 {
kono
parents:
diff changeset
130 }
kono
parents:
diff changeset
131 *alloc_pool;
kono
parents:
diff changeset
132 struct gcc_targetcm
kono
parents:
diff changeset
133 {
kono
parents:
diff changeset
134 bool (*string_object_ref_type_p) (const_tree stringref);
kono
parents:
diff changeset
135 }
kono
parents:
diff changeset
136 ;
kono
parents:
diff changeset
137 extern struct gcc_targetcm targetcm;
kono
parents:
diff changeset
138 enum format_type
kono
parents:
diff changeset
139 {
kono
parents:
diff changeset
140 gcc_objc_string_format_type,
kono
parents:
diff changeset
141 };
kono
parents:
diff changeset
142 typedef struct function_format_info
kono
parents:
diff changeset
143 {
kono
parents:
diff changeset
144 int format_type;
kono
parents:
diff changeset
145 }
kono
parents:
diff changeset
146 function_format_info;
kono
parents:
diff changeset
147 static const format_kind_info format_types_orig[] = { };
kono
parents:
diff changeset
148 struct format_check_context { };
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 static const format_kind_info *format_types = format_types_orig;
kono
parents:
diff changeset
151 static void check_format_info (function_format_info *, tree);
kono
parents:
diff changeset
152 void check_format_arg (void *, tree, unsigned long long);
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 void
kono
parents:
diff changeset
155 check_function_format (tree attrs, int nargs, tree * argarray)
kono
parents:
diff changeset
156 {
kono
parents:
diff changeset
157 tree a;
kono
parents:
diff changeset
158 for (a = attrs;
kono
parents:
diff changeset
159 a;
kono
parents:
diff changeset
160 ((contains_struct_check
kono
parents:
diff changeset
161 ((a), (TS_COMMON), "../../git-master/gcc/c-family/c-format.c", 1002,
kono
parents:
diff changeset
162 __FUNCTION__))->common.chain))
kono
parents:
diff changeset
163 {
kono
parents:
diff changeset
164 if (is_attribute_p
kono
parents:
diff changeset
165 ("format",
kono
parents:
diff changeset
166 ((tree_check
kono
parents:
diff changeset
167 ((a), "../../git-master/gcc/c-family/c-format.c", 1004,
kono
parents:
diff changeset
168 __FUNCTION__, (TREE_LIST)))->list.purpose)))
kono
parents:
diff changeset
169 {
kono
parents:
diff changeset
170 function_format_info info;
kono
parents:
diff changeset
171 {
kono
parents:
diff changeset
172 tree params = (tree) __null;
kono
parents:
diff changeset
173 check_format_info (&info, params);
kono
parents:
diff changeset
174 }
kono
parents:
diff changeset
175 }
kono
parents:
diff changeset
176 }
kono
parents:
diff changeset
177 }
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 static bool
kono
parents:
diff changeset
180 avoid_dollar_number (const char *format)
kono
parents:
diff changeset
181 {
kono
parents:
diff changeset
182 while ((_sch_istable[(*format) & 0xff] & (unsigned short) (_sch_isdigit)))
kono
parents:
diff changeset
183 format++;
kono
parents:
diff changeset
184 if (*format == '$')
kono
parents:
diff changeset
185 {
kono
parents:
diff changeset
186 warning (OPT_Wformat_,
kono
parents:
diff changeset
187 "$ operand number used after format without operand number");
kono
parents:
diff changeset
188 }
kono
parents:
diff changeset
189 }
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 static void
kono
parents:
diff changeset
192 check_format_info (function_format_info * info, tree params)
kono
parents:
diff changeset
193 {
kono
parents:
diff changeset
194 format_check_context format_ctx;
kono
parents:
diff changeset
195 unsigned long long arg_num;
kono
parents:
diff changeset
196 tree format_tree;
kono
parents:
diff changeset
197 check_function_arguments_recurse (check_format_arg, &format_ctx,
kono
parents:
diff changeset
198 format_tree, arg_num);
kono
parents:
diff changeset
199 const char *format_chars;
kono
parents:
diff changeset
200 if (integer_zerop (format_tree))
kono
parents:
diff changeset
201 {
kono
parents:
diff changeset
202 {
kono
parents:
diff changeset
203 ((contains_struct_check
kono
parents:
diff changeset
204 ((params), (TS_COMMON),
kono
parents:
diff changeset
205 "../../git-master/gcc/c-family/c-format.c", 1444,
kono
parents:
diff changeset
206 __FUNCTION__))->common.chain);
kono
parents:
diff changeset
207 }
kono
parents:
diff changeset
208 return;
kono
parents:
diff changeset
209 }
kono
parents:
diff changeset
210 if (((enum tree_code) (format_tree)->base.code) != ADDR_EXPR)
kono
parents:
diff changeset
211 {
kono
parents:
diff changeset
212 return;
kono
parents:
diff changeset
213 }
kono
parents:
diff changeset
214 if (format_types[info->format_type].flags & (int)
kono
parents:
diff changeset
215 FMT_FLAG_PARSE_ARG_CONVERT_EXTERNAL)
kono
parents:
diff changeset
216 {
kono
parents:
diff changeset
217 bool objc_str = (info->format_type == gcc_objc_string_format_type);
kono
parents:
diff changeset
218 if (((enum tree_code) (format_tree)->base.code) != CONST_DECL
kono
parents:
diff changeset
219 ||
kono
parents:
diff changeset
220 !((objc_str
kono
parents:
diff changeset
221 &&
kono
parents:
diff changeset
222 objc_string_ref_type_p (((contains_struct_check
kono
parents:
diff changeset
223 ((format_tree), (TS_TYPED),
kono
parents:
diff changeset
224 "../../git-master/gcc/c-family/c-format.c",
kono
parents:
diff changeset
225 1498, __FUNCTION__))->typed.type)))
kono
parents:
diff changeset
226 ||
kono
parents:
diff changeset
227 (*targetcm.string_object_ref_type_p) ((const_tree)
kono
parents:
diff changeset
228 ((contains_struct_check
kono
parents:
diff changeset
229 ((format_tree),
kono
parents:
diff changeset
230 (TS_TYPED),
kono
parents:
diff changeset
231 "../../git-master/gcc/c-family/c-format.c",
kono
parents:
diff changeset
232 1500,
kono
parents:
diff changeset
233 __FUNCTION__))->typed.
kono
parents:
diff changeset
234 type))))
kono
parents:
diff changeset
235 {
kono
parents:
diff changeset
236 }
kono
parents:
diff changeset
237 }
kono
parents:
diff changeset
238 {
kono
parents:
diff changeset
239 }
kono
parents:
diff changeset
240 if (((tree_class_check
kono
parents:
diff changeset
241 ((((contains_struct_check
kono
parents:
diff changeset
242 ((((contains_struct_check
kono
parents:
diff changeset
243 ((format_tree), (TS_TYPED),
kono
parents:
diff changeset
244 "../../git-master/gcc/c-family/c-format.c", 1549,
kono
parents:
diff changeset
245 __FUNCTION__))->typed.type)), (TS_TYPED),
kono
parents:
diff changeset
246 "../../git-master/gcc/c-family/c-format.c", 1549,
kono
parents:
diff changeset
247 __FUNCTION__))->typed.type)), (tcc_type),
kono
parents:
diff changeset
248 "../../git-master/gcc/c-family/c-format.c", 1549,
kono
parents:
diff changeset
249 __FUNCTION__))->type_common.main_variant) != integer_types[itk_char])
kono
parents:
diff changeset
250 {
kono
parents:
diff changeset
251 return;
kono
parents:
diff changeset
252 }
kono
parents:
diff changeset
253 {
kono
parents:
diff changeset
254 }
kono
parents:
diff changeset
255 const format_kind_info *fki = &format_types[info->format_type];
kono
parents:
diff changeset
256 while (*format_chars != 0)
kono
parents:
diff changeset
257 {
kono
parents:
diff changeset
258 {
kono
parents:
diff changeset
259 if (fki->width_type != __null && *format_chars == '*')
kono
parents:
diff changeset
260 {
kono
parents:
diff changeset
261 {
kono
parents:
diff changeset
262 if (avoid_dollar_number (format_chars))
kono
parents:
diff changeset
263 if (avoid_dollar_number (format_chars))
kono
parents:
diff changeset
264 return;
kono
parents:
diff changeset
265 }
kono
parents:
diff changeset
266 }
kono
parents:
diff changeset
267 }
kono
parents:
diff changeset
268 }
kono
parents:
diff changeset
269 }