expand: Fix up expansion of VIEW_CONVERT_EXPR to BITINT_TYPE [PR117354]
[official-gcc.git] / gcc / testsuite / g++.dg / torture / 20141013.C
blobfea70ec7ea54ae5267280d9dc18f589eefc9e90d
1 /* { dg-options "-fno-short-enums -Wno-return-type" } */
2 enum
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,
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
18   OPT_Warray_bounds = 240,
19   OPT_Wformat_ = 245,
20   OPT_Wintf_annotation = 368,
21   OPT_std_gnu__14 = 1311,
23 enum tree_code
25   TREE_LIST,
26   CONST_DECL,
27   ADDR_EXPR,
28   MAX_TREE_CODES
30 enum tree_code_class
32   tcc_type,
34 enum tree_node_structure_enum
36   TS_TYPED,
37   TS_COMMON,
39 enum integer_type_kind
41   itk_char,
42   itk_none
44 struct tree_base
46   enum tree_code code:16;
48 struct tree_typed
50   tree type;
52 struct tree_common
54   tree chain;
56 struct tree_list
58   tree purpose;
60 struct tree_type_common
62   tree main_variant;
64 union tree_node
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;
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
80 tree_check (tree __t, const char *__f, int __l, const char *__g,
81             tree_code __c)
85 inline const_tree
86 contains_struct_check (const_tree __t,
87                        const enum tree_node_structure_enum __s,
88                        const char *__f, int __l, const char *__g)
90   if (tree_contains_struct[((enum tree_code) (__t)->base.code)][__s] != 1)
91     tree_contains_struct_check_failed (__t, __s, __f, __l, __g);
94 inline const_tree
95 tree_class_check (const_tree __t, const enum tree_code_class __class,
96                   const char *__f, int __l, const char *__g)
100 static inline bool
101 is_attribute_p (const char *attr_name, const_tree ident)
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
114   FMT_FLAG_SCANF_A_KLUDGE = 2,
115   FMT_FLAG_PARSE_ARG_CONVERT_EXTERNAL = 256
117 typedef struct
120 format_flag_spec;
121 typedef struct
123   int flags;
124   tree *width_type;
126 format_kind_info;
127 typedef struct alloc_pool_list_def
130  *alloc_pool;
131 struct gcc_targetcm
133   bool (*string_object_ref_type_p) (const_tree stringref);
136 extern struct gcc_targetcm targetcm;
137 enum format_type
139   gcc_objc_string_format_type,
141 typedef struct function_format_info
143   int format_type;
145 function_format_info;
146 static const format_kind_info format_types_orig[] = { };
147 struct format_check_context { };
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);
153 void
154 check_function_format (tree attrs, int nargs, tree * argarray)
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     }
178 static bool
179 avoid_dollar_number (const char *format)
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     }
190 static void
191 check_format_info (function_format_info * info, tree params)
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     }