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