1 /* Subroutines shared by all languages that are variants of C.
2    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
4    Free Software Foundation, Inc.
5 
6 This file is part of GCC.
7 
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12 
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17 
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21 
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "intl.h"
27 #include "tree.h"
28 #include "flags.h"
29 #include "output.h"
30 #include "c-pragma.h"
31 #include "ggc.h"
32 #include "c-common.h"
33 #include "c-objc.h"
34 #include "tm_p.h"
35 #include "obstack.h"
36 #include "cpplib.h"
37 #include "target.h"
38 #include "common/common-target.h"
39 #include "langhooks.h"
40 #include "tree-inline.h"
41 #include "toplev.h"
42 #include "diagnostic.h"
43 #include "tree-iterator.h"
44 #include "hashtab.h"
45 #include "tree-mudflap.h"
46 #include "opts.h"
47 #include "cgraph.h"
48 #include "target-def.h"
49 #include "libfuncs.h"
50 
51 cpp_reader *parse_in;		/* Declared in c-pragma.h.  */
52 
53 /* The following symbols are subsumed in the c_global_trees array, and
54    listed here individually for documentation purposes.
55 
56    INTEGER_TYPE and REAL_TYPE nodes for the standard data types.
57 
58 	tree short_integer_type_node;
59 	tree long_integer_type_node;
60 	tree long_long_integer_type_node;
61 	tree int128_integer_type_node;
62 
63 	tree short_unsigned_type_node;
64 	tree long_unsigned_type_node;
65 	tree long_long_unsigned_type_node;
66 	tree int128_unsigned_type_node;
67 
68 	tree truthvalue_type_node;
69 	tree truthvalue_false_node;
70 	tree truthvalue_true_node;
71 
72 	tree ptrdiff_type_node;
73 
74 	tree unsigned_char_type_node;
75 	tree signed_char_type_node;
76 	tree wchar_type_node;
77 
78 	tree char16_type_node;
79 	tree char32_type_node;
80 
81 	tree float_type_node;
82 	tree double_type_node;
83 	tree long_double_type_node;
84 
85 	tree complex_integer_type_node;
86 	tree complex_float_type_node;
87 	tree complex_double_type_node;
88 	tree complex_long_double_type_node;
89 
90 	tree dfloat32_type_node;
91 	tree dfloat64_type_node;
92 	tree_dfloat128_type_node;
93 
94 	tree intQI_type_node;
95 	tree intHI_type_node;
96 	tree intSI_type_node;
97 	tree intDI_type_node;
98 	tree intTI_type_node;
99 
100 	tree unsigned_intQI_type_node;
101 	tree unsigned_intHI_type_node;
102 	tree unsigned_intSI_type_node;
103 	tree unsigned_intDI_type_node;
104 	tree unsigned_intTI_type_node;
105 
106 	tree widest_integer_literal_type_node;
107 	tree widest_unsigned_literal_type_node;
108 
109    Nodes for types `void *' and `const void *'.
110 
111 	tree ptr_type_node, const_ptr_type_node;
112 
113    Nodes for types `char *' and `const char *'.
114 
115 	tree string_type_node, const_string_type_node;
116 
117    Type `char[SOMENUMBER]'.
118    Used when an array of char is needed and the size is irrelevant.
119 
120 	tree char_array_type_node;
121 
122    Type `int[SOMENUMBER]' or something like it.
123    Used when an array of int needed and the size is irrelevant.
124 
125 	tree int_array_type_node;
126 
127    Type `wchar_t[SOMENUMBER]' or something like it.
128    Used when a wide string literal is created.
129 
130 	tree wchar_array_type_node;
131 
132    Type `char16_t[SOMENUMBER]' or something like it.
133    Used when a UTF-16 string literal is created.
134 
135 	tree char16_array_type_node;
136 
137    Type `char32_t[SOMENUMBER]' or something like it.
138    Used when a UTF-32 string literal is created.
139 
140 	tree char32_array_type_node;
141 
142    Type `int ()' -- used for implicit declaration of functions.
143 
144 	tree default_function_type;
145 
146    A VOID_TYPE node, packaged in a TREE_LIST.
147 
148 	tree void_list_node;
149 
150   The lazily created VAR_DECLs for __FUNCTION__, __PRETTY_FUNCTION__,
151   and __func__. (C doesn't generate __FUNCTION__ and__PRETTY_FUNCTION__
152   VAR_DECLS, but C++ does.)
153 
154 	tree function_name_decl_node;
155 	tree pretty_function_name_decl_node;
156 	tree c99_function_name_decl_node;
157 
158   Stack of nested function name VAR_DECLs.
159 
160 	tree saved_function_name_decls;
161 
162 */
163 
164 tree c_global_trees[CTI_MAX];
165 
166 /* Switches common to the C front ends.  */
167 
168 /* Nonzero means don't output line number information.  */
169 
170 char flag_no_line_commands;
171 
172 /* Nonzero causes -E output not to be done, but directives such as
173    #define that have side effects are still obeyed.  */
174 
175 char flag_no_output;
176 
177 /* Nonzero means dump macros in some fashion.  */
178 
179 char flag_dump_macros;
180 
181 /* Nonzero means pass #include lines through to the output.  */
182 
183 char flag_dump_includes;
184 
185 /* Nonzero means process PCH files while preprocessing.  */
186 
187 bool flag_pch_preprocess;
188 
189 /* The file name to which we should write a precompiled header, or
190    NULL if no header will be written in this compile.  */
191 
192 const char *pch_file;
193 
194 /* Nonzero if an ISO standard was selected.  It rejects macros in the
195    user's namespace.  */
196 int flag_iso;
197 
198 /* Warn about #pragma directives that are not recognized.  */
199 
200 int warn_unknown_pragmas; /* Tri state variable.  */
201 
202 /* Warn about format/argument anomalies in calls to formatted I/O functions
203    (*printf, *scanf, strftime, strfmon, etc.).  */
204 
205 int warn_format;
206 
207 /* C/ObjC language option variables.  */
208 
209 
210 /* Nonzero means allow type mismatches in conditional expressions;
211    just make their values `void'.  */
212 
213 int flag_cond_mismatch;
214 
215 /* Nonzero means enable C89 Amendment 1 features.  */
216 
217 int flag_isoc94;
218 
219 /* Nonzero means use the ISO C99 (or C11) dialect of C.  */
220 
221 int flag_isoc99;
222 
223 /* Nonzero means use the ISO C11 dialect of C.  */
224 
225 int flag_isoc11;
226 
227 /* Nonzero means that we have builtin functions, and main is an int.  */
228 
229 int flag_hosted = 1;
230 
231 
232 /* ObjC language option variables.  */
233 
234 
235 /* Tells the compiler that this is a special run.  Do not perform any
236    compiling, instead we are to test some platform dependent features
237    and output a C header file with appropriate definitions.  */
238 
239 int print_struct_values;
240 
241 /* Tells the compiler what is the constant string class for ObjC.  */
242 
243 const char *constant_string_class_name;
244 
245 
246 /* C++ language option variables.  */
247 
248 
249 /* Nonzero means generate separate instantiation control files and
250    juggle them at link time.  */
251 
252 int flag_use_repository;
253 
254 /* The C++ dialect being used. C++98 is the default.  */
255 
256 enum cxx_dialect cxx_dialect = cxx98;
257 
258 /* Maximum template instantiation depth.  This limit exists to limit the
259    time it takes to notice excessively recursive template instantiations.
260 
261    The default is lower than the 1024 recommended by the C++0x standard
262    because G++ runs out of stack before 1024 with highly recursive template
263    argument deduction substitution (g++.dg/cpp0x/enum11.C).  */
264 
265 int max_tinst_depth = 900;
266 
267 /* The elements of `ridpointers' are identifier nodes for the reserved
268    type names and storage classes.  It is indexed by a RID_... value.  */
269 tree *ridpointers;
270 
271 tree (*make_fname_decl) (location_t, tree, int);
272 
273 /* Nonzero means don't warn about problems that occur when the code is
274    executed.  */
275 int c_inhibit_evaluation_warnings;
276 
277 /* Whether we are building a boolean conversion inside
278    convert_for_assignment, or some other late binary operation.  If
279    build_binary_op is called for C (from code shared by C and C++) in
280    this case, then the operands have already been folded and the
281    result will not be folded again, so C_MAYBE_CONST_EXPR should not
282    be generated.  */
283 bool in_late_binary_op;
284 
285 /* Whether lexing has been completed, so subsequent preprocessor
286    errors should use the compiler's input_location.  */
287 bool done_lexing = false;
288 
289 /* Information about how a function name is generated.  */
290 struct fname_var_t
291 {
292   tree *const decl;	/* pointer to the VAR_DECL.  */
293   const unsigned rid;	/* RID number for the identifier.  */
294   const int pretty;	/* How pretty is it? */
295 };
296 
297 /* The three ways of getting then name of the current function.  */
298 
299 const struct fname_var_t fname_vars[] =
300 {
301   /* C99 compliant __func__, must be first.  */
302   {&c99_function_name_decl_node, RID_C99_FUNCTION_NAME, 0},
303   /* GCC __FUNCTION__ compliant.  */
304   {&function_name_decl_node, RID_FUNCTION_NAME, 0},
305   /* GCC __PRETTY_FUNCTION__ compliant.  */
306   {&pretty_function_name_decl_node, RID_PRETTY_FUNCTION_NAME, 1},
307   {NULL, 0, 0},
308 };
309 
310 /* Global visibility options.  */
311 struct visibility_flags visibility_options;
312 
313 static tree c_fully_fold_internal (tree expr, bool, bool *, bool *);
314 static tree check_case_value (tree);
315 static bool check_case_bounds (tree, tree, tree *, tree *);
316 
317 static tree handle_packed_attribute (tree *, tree, tree, int, bool *);
318 static tree handle_nocommon_attribute (tree *, tree, tree, int, bool *);
319 static tree handle_common_attribute (tree *, tree, tree, int, bool *);
320 static tree handle_noreturn_attribute (tree *, tree, tree, int, bool *);
321 static tree handle_hot_attribute (tree *, tree, tree, int, bool *);
322 static tree handle_cold_attribute (tree *, tree, tree, int, bool *);
323 static tree handle_noinline_attribute (tree *, tree, tree, int, bool *);
324 static tree handle_noclone_attribute (tree *, tree, tree, int, bool *);
325 static tree handle_leaf_attribute (tree *, tree, tree, int, bool *);
326 static tree handle_always_inline_attribute (tree *, tree, tree, int,
327 					    bool *);
328 static tree handle_gnu_inline_attribute (tree *, tree, tree, int, bool *);
329 static tree handle_artificial_attribute (tree *, tree, tree, int, bool *);
330 static tree handle_flatten_attribute (tree *, tree, tree, int, bool *);
331 static tree handle_error_attribute (tree *, tree, tree, int, bool *);
332 static tree handle_used_attribute (tree *, tree, tree, int, bool *);
333 static tree handle_unused_attribute (tree *, tree, tree, int, bool *);
334 static tree handle_externally_visible_attribute (tree *, tree, tree, int,
335 						 bool *);
336 static tree handle_const_attribute (tree *, tree, tree, int, bool *);
337 static tree handle_transparent_union_attribute (tree *, tree, tree,
338 						int, bool *);
339 static tree handle_constructor_attribute (tree *, tree, tree, int, bool *);
340 static tree handle_destructor_attribute (tree *, tree, tree, int, bool *);
341 static tree handle_mode_attribute (tree *, tree, tree, int, bool *);
342 static tree handle_section_attribute (tree *, tree, tree, int, bool *);
343 static tree handle_aligned_attribute (tree *, tree, tree, int, bool *);
344 static tree handle_weak_attribute (tree *, tree, tree, int, bool *) ;
345 static tree handle_alias_ifunc_attribute (bool, tree *, tree, tree, bool *);
346 static tree handle_ifunc_attribute (tree *, tree, tree, int, bool *);
347 static tree handle_alias_attribute (tree *, tree, tree, int, bool *);
348 static tree handle_weakref_attribute (tree *, tree, tree, int, bool *) ;
349 static tree handle_visibility_attribute (tree *, tree, tree, int,
350 					 bool *);
351 static tree handle_tls_model_attribute (tree *, tree, tree, int,
352 					bool *);
353 static tree handle_no_instrument_function_attribute (tree *, tree,
354 						     tree, int, bool *);
355 static tree handle_malloc_attribute (tree *, tree, tree, int, bool *);
356 static tree handle_returns_twice_attribute (tree *, tree, tree, int, bool *);
357 static tree handle_no_limit_stack_attribute (tree *, tree, tree, int,
358 					     bool *);
359 static tree handle_pure_attribute (tree *, tree, tree, int, bool *);
360 static tree handle_tm_attribute (tree *, tree, tree, int, bool *);
361 static tree handle_tm_wrap_attribute (tree *, tree, tree, int, bool *);
362 static tree handle_novops_attribute (tree *, tree, tree, int, bool *);
363 static tree handle_deprecated_attribute (tree *, tree, tree, int,
364 					 bool *);
365 static tree handle_vector_size_attribute (tree *, tree, tree, int,
366 					  bool *);
367 static tree handle_nonnull_attribute (tree *, tree, tree, int, bool *);
368 static tree handle_nothrow_attribute (tree *, tree, tree, int, bool *);
369 static tree handle_cleanup_attribute (tree *, tree, tree, int, bool *);
370 static tree handle_warn_unused_result_attribute (tree *, tree, tree, int,
371 						 bool *);
372 static tree handle_sentinel_attribute (tree *, tree, tree, int, bool *);
373 static tree handle_type_generic_attribute (tree *, tree, tree, int, bool *);
374 static tree handle_alloc_size_attribute (tree *, tree, tree, int, bool *);
375 static tree handle_target_attribute (tree *, tree, tree, int, bool *);
376 static tree handle_optimize_attribute (tree *, tree, tree, int, bool *);
377 static tree ignore_attribute (tree *, tree, tree, int, bool *);
378 static tree handle_no_split_stack_attribute (tree *, tree, tree, int, bool *);
379 static tree handle_fnspec_attribute (tree *, tree, tree, int, bool *);
380 
381 static void check_function_nonnull (tree, int, tree *);
382 static void check_nonnull_arg (void *, tree, unsigned HOST_WIDE_INT);
383 static bool nonnull_check_p (tree, unsigned HOST_WIDE_INT);
384 static bool get_nonnull_operand (tree, unsigned HOST_WIDE_INT *);
385 static int resort_field_decl_cmp (const void *, const void *);
386 
387 /* Reserved words.  The third field is a mask: keywords are disabled
388    if they match the mask.
389 
390    Masks for languages:
391    C --std=c89: D_C99 | D_CXXONLY | D_OBJC | D_CXX_OBJC
392    C --std=c99: D_CXXONLY | D_OBJC
393    ObjC is like C except that D_OBJC and D_CXX_OBJC are not set
394    C++ --std=c98: D_CONLY | D_CXXOX | D_OBJC
395    C++ --std=c0x: D_CONLY | D_OBJC
396    ObjC++ is like C++ except that D_OBJC is not set
397 
398    If -fno-asm is used, D_ASM is added to the mask.  If
399    -fno-gnu-keywords is used, D_EXT is added.  If -fno-asm and C in
400    C89 mode, D_EXT89 is added for both -fno-asm and -fno-gnu-keywords.
401    In C with -Wc++-compat, we warn if D_CXXWARN is set.
402 
403    Note the complication of the D_CXX_OBJC keywords.  These are
404    reserved words such as 'class'.  In C++, 'class' is a reserved
405    word.  In Objective-C++ it is too.  In Objective-C, it is a
406    reserved word too, but only if it follows an '@' sign.
407 */
408 const struct c_common_resword c_common_reswords[] =
409 {
410   { "_Alignas",		RID_ALIGNAS,   D_CONLY },
411   { "_Alignof",		RID_ALIGNOF,   D_CONLY },
412   { "_Bool",		RID_BOOL,      D_CONLY },
413   { "_Complex",		RID_COMPLEX,	0 },
414   { "_Imaginary",	RID_IMAGINARY, D_CONLY },
415   { "_Decimal32",       RID_DFLOAT32,  D_CONLY | D_EXT },
416   { "_Decimal64",       RID_DFLOAT64,  D_CONLY | D_EXT },
417   { "_Decimal128",      RID_DFLOAT128, D_CONLY | D_EXT },
418   { "_Fract",           RID_FRACT,     D_CONLY | D_EXT },
419   { "_Accum",           RID_ACCUM,     D_CONLY | D_EXT },
420   { "_Sat",             RID_SAT,       D_CONLY | D_EXT },
421   { "_Static_assert",   RID_STATIC_ASSERT, D_CONLY },
422   { "_Noreturn",        RID_NORETURN,  D_CONLY },
423   { "__FUNCTION__",	RID_FUNCTION_NAME, 0 },
424   { "__PRETTY_FUNCTION__", RID_PRETTY_FUNCTION_NAME, 0 },
425   { "__alignof",	RID_ALIGNOF,	0 },
426   { "__alignof__",	RID_ALIGNOF,	0 },
427   { "__asm",		RID_ASM,	0 },
428   { "__asm__",		RID_ASM,	0 },
429   { "__attribute",	RID_ATTRIBUTE,	0 },
430   { "__attribute__",	RID_ATTRIBUTE,	0 },
431   { "__bases",          RID_BASES, D_CXXONLY },
432   { "__builtin_choose_expr", RID_CHOOSE_EXPR, D_CONLY },
433   { "__builtin_complex", RID_BUILTIN_COMPLEX, D_CONLY },
434   { "__builtin_shuffle", RID_BUILTIN_SHUFFLE, D_CONLY },
435   { "__builtin_offsetof", RID_OFFSETOF, 0 },
436   { "__builtin_types_compatible_p", RID_TYPES_COMPATIBLE_P, D_CONLY },
437   { "__builtin_va_arg",	RID_VA_ARG,	0 },
438   { "__complex",	RID_COMPLEX,	0 },
439   { "__complex__",	RID_COMPLEX,	0 },
440   { "__const",		RID_CONST,	0 },
441   { "__const__",	RID_CONST,	0 },
442   { "__decltype",       RID_DECLTYPE,   D_CXXONLY },
443   { "__direct_bases",   RID_DIRECT_BASES, D_CXXONLY },
444   { "__extension__",	RID_EXTENSION,	0 },
445   { "__func__",		RID_C99_FUNCTION_NAME, 0 },
446   { "__has_nothrow_assign", RID_HAS_NOTHROW_ASSIGN, D_CXXONLY },
447   { "__has_nothrow_constructor", RID_HAS_NOTHROW_CONSTRUCTOR, D_CXXONLY },
448   { "__has_nothrow_copy", RID_HAS_NOTHROW_COPY, D_CXXONLY },
449   { "__has_trivial_assign", RID_HAS_TRIVIAL_ASSIGN, D_CXXONLY },
450   { "__has_trivial_constructor", RID_HAS_TRIVIAL_CONSTRUCTOR, D_CXXONLY },
451   { "__has_trivial_copy", RID_HAS_TRIVIAL_COPY, D_CXXONLY },
452   { "__has_trivial_destructor", RID_HAS_TRIVIAL_DESTRUCTOR, D_CXXONLY },
453   { "__has_virtual_destructor", RID_HAS_VIRTUAL_DESTRUCTOR, D_CXXONLY },
454   { "__imag",		RID_IMAGPART,	0 },
455   { "__imag__",		RID_IMAGPART,	0 },
456   { "__inline",		RID_INLINE,	0 },
457   { "__inline__",	RID_INLINE,	0 },
458   { "__int128",		RID_INT128,	0 },
459   { "__is_abstract",	RID_IS_ABSTRACT, D_CXXONLY },
460   { "__is_base_of",	RID_IS_BASE_OF, D_CXXONLY },
461   { "__is_class",	RID_IS_CLASS,	D_CXXONLY },
462   { "__is_convertible_to", RID_IS_CONVERTIBLE_TO, D_CXXONLY },
463   { "__is_empty",	RID_IS_EMPTY,	D_CXXONLY },
464   { "__is_enum",	RID_IS_ENUM,	D_CXXONLY },
465   { "__is_final",	RID_IS_FINAL,	D_CXXONLY },
466   { "__is_literal_type", RID_IS_LITERAL_TYPE, D_CXXONLY },
467   { "__is_pod",		RID_IS_POD,	D_CXXONLY },
468   { "__is_polymorphic",	RID_IS_POLYMORPHIC, D_CXXONLY },
469   { "__is_standard_layout", RID_IS_STD_LAYOUT, D_CXXONLY },
470   { "__is_trivial",     RID_IS_TRIVIAL, D_CXXONLY },
471   { "__is_union",	RID_IS_UNION,	D_CXXONLY },
472   { "__label__",	RID_LABEL,	0 },
473   { "__null",		RID_NULL,	0 },
474   { "__real",		RID_REALPART,	0 },
475   { "__real__",		RID_REALPART,	0 },
476   { "__restrict",	RID_RESTRICT,	0 },
477   { "__restrict__",	RID_RESTRICT,	0 },
478   { "__signed",		RID_SIGNED,	0 },
479   { "__signed__",	RID_SIGNED,	0 },
480   { "__thread",		RID_THREAD,	0 },
481   { "__transaction_atomic", RID_TRANSACTION_ATOMIC, 0 },
482   { "__transaction_relaxed", RID_TRANSACTION_RELAXED, 0 },
483   { "__transaction_cancel", RID_TRANSACTION_CANCEL, 0 },
484   { "__typeof",		RID_TYPEOF,	0 },
485   { "__typeof__",	RID_TYPEOF,	0 },
486   { "__underlying_type", RID_UNDERLYING_TYPE, D_CXXONLY },
487   { "__volatile",	RID_VOLATILE,	0 },
488   { "__volatile__",	RID_VOLATILE,	0 },
489   { "alignof",		RID_ALIGNOF,	D_CXXONLY | D_CXX0X | D_CXXWARN },
490   { "asm",		RID_ASM,	D_ASM },
491   { "auto",		RID_AUTO,	0 },
492   { "bool",		RID_BOOL,	D_CXXONLY | D_CXXWARN },
493   { "break",		RID_BREAK,	0 },
494   { "case",		RID_CASE,	0 },
495   { "catch",		RID_CATCH,	D_CXX_OBJC | D_CXXWARN },
496   { "char",		RID_CHAR,	0 },
497   { "char16_t",		RID_CHAR16,	D_CXXONLY | D_CXX0X | D_CXXWARN },
498   { "char32_t",		RID_CHAR32,	D_CXXONLY | D_CXX0X | D_CXXWARN },
499   { "class",		RID_CLASS,	D_CXX_OBJC | D_CXXWARN },
500   { "const",		RID_CONST,	0 },
501   { "constexpr",	RID_CONSTEXPR,	D_CXXONLY | D_CXX0X | D_CXXWARN },
502   { "const_cast",	RID_CONSTCAST,	D_CXXONLY | D_CXXWARN },
503   { "continue",		RID_CONTINUE,	0 },
504   { "decltype",         RID_DECLTYPE,   D_CXXONLY | D_CXX0X | D_CXXWARN },
505   { "default",		RID_DEFAULT,	0 },
506   { "delete",		RID_DELETE,	D_CXXONLY | D_CXXWARN },
507   { "do",		RID_DO,		0 },
508   { "double",		RID_DOUBLE,	0 },
509   { "dynamic_cast",	RID_DYNCAST,	D_CXXONLY | D_CXXWARN },
510   { "else",		RID_ELSE,	0 },
511   { "enum",		RID_ENUM,	0 },
512   { "explicit",		RID_EXPLICIT,	D_CXXONLY | D_CXXWARN },
513   { "export",		RID_EXPORT,	D_CXXONLY | D_CXXWARN },
514   { "extern",		RID_EXTERN,	0 },
515   { "false",		RID_FALSE,	D_CXXONLY | D_CXXWARN },
516   { "float",		RID_FLOAT,	0 },
517   { "for",		RID_FOR,	0 },
518   { "friend",		RID_FRIEND,	D_CXXONLY | D_CXXWARN },
519   { "goto",		RID_GOTO,	0 },
520   { "if",		RID_IF,		0 },
521   { "inline",		RID_INLINE,	D_EXT89 },
522   { "int",		RID_INT,	0 },
523   { "long",		RID_LONG,	0 },
524   { "mutable",		RID_MUTABLE,	D_CXXONLY | D_CXXWARN },
525   { "namespace",	RID_NAMESPACE,	D_CXXONLY | D_CXXWARN },
526   { "new",		RID_NEW,	D_CXXONLY | D_CXXWARN },
527   { "noexcept",		RID_NOEXCEPT,	D_CXXONLY | D_CXX0X | D_CXXWARN },
528   { "nullptr",		RID_NULLPTR,	D_CXXONLY | D_CXX0X | D_CXXWARN },
529   { "operator",		RID_OPERATOR,	D_CXXONLY | D_CXXWARN },
530   { "private",		RID_PRIVATE,	D_CXX_OBJC | D_CXXWARN },
531   { "protected",	RID_PROTECTED,	D_CXX_OBJC | D_CXXWARN },
532   { "public",		RID_PUBLIC,	D_CXX_OBJC | D_CXXWARN },
533   { "register",		RID_REGISTER,	0 },
534   { "reinterpret_cast",	RID_REINTCAST,	D_CXXONLY | D_CXXWARN },
535   { "restrict",		RID_RESTRICT,	D_CONLY | D_C99 },
536   { "return",		RID_RETURN,	0 },
537   { "short",		RID_SHORT,	0 },
538   { "signed",		RID_SIGNED,	0 },
539   { "sizeof",		RID_SIZEOF,	0 },
540   { "static",		RID_STATIC,	0 },
541   { "static_assert",    RID_STATIC_ASSERT, D_CXXONLY | D_CXX0X | D_CXXWARN },
542   { "static_cast",	RID_STATCAST,	D_CXXONLY | D_CXXWARN },
543   { "struct",		RID_STRUCT,	0 },
544   { "switch",		RID_SWITCH,	0 },
545   { "template",		RID_TEMPLATE,	D_CXXONLY | D_CXXWARN },
546   { "this",		RID_THIS,	D_CXXONLY | D_CXXWARN },
547   { "throw",		RID_THROW,	D_CXX_OBJC | D_CXXWARN },
548   { "true",		RID_TRUE,	D_CXXONLY | D_CXXWARN },
549   { "try",		RID_TRY,	D_CXX_OBJC | D_CXXWARN },
550   { "typedef",		RID_TYPEDEF,	0 },
551   { "typename",		RID_TYPENAME,	D_CXXONLY | D_CXXWARN },
552   { "typeid",		RID_TYPEID,	D_CXXONLY | D_CXXWARN },
553   { "typeof",		RID_TYPEOF,	D_ASM | D_EXT },
554   { "union",		RID_UNION,	0 },
555   { "unsigned",		RID_UNSIGNED,	0 },
556   { "using",		RID_USING,	D_CXXONLY | D_CXXWARN },
557   { "virtual",		RID_VIRTUAL,	D_CXXONLY | D_CXXWARN },
558   { "void",		RID_VOID,	0 },
559   { "volatile",		RID_VOLATILE,	0 },
560   { "wchar_t",		RID_WCHAR,	D_CXXONLY },
561   { "while",		RID_WHILE,	0 },
562   /* These Objective-C keywords are recognized only immediately after
563      an '@'.  */
564   { "compatibility_alias", RID_AT_ALIAS,	D_OBJC },
565   { "defs",		RID_AT_DEFS,		D_OBJC },
566   { "encode",		RID_AT_ENCODE,		D_OBJC },
567   { "end",		RID_AT_END,		D_OBJC },
568   { "implementation",	RID_AT_IMPLEMENTATION,	D_OBJC },
569   { "interface",	RID_AT_INTERFACE,	D_OBJC },
570   { "protocol",		RID_AT_PROTOCOL,	D_OBJC },
571   { "selector",		RID_AT_SELECTOR,	D_OBJC },
572   { "finally",		RID_AT_FINALLY,		D_OBJC },
573   { "synchronized",	RID_AT_SYNCHRONIZED,	D_OBJC },
574   { "optional",		RID_AT_OPTIONAL,	D_OBJC },
575   { "required",		RID_AT_REQUIRED,	D_OBJC },
576   { "property",		RID_AT_PROPERTY,	D_OBJC },
577   { "package",		RID_AT_PACKAGE,		D_OBJC },
578   { "synthesize",	RID_AT_SYNTHESIZE,	D_OBJC },
579   { "dynamic",		RID_AT_DYNAMIC,		D_OBJC },
580   /* These are recognized only in protocol-qualifier context
581      (see above) */
582   { "bycopy",		RID_BYCOPY,		D_OBJC },
583   { "byref",		RID_BYREF,		D_OBJC },
584   { "in",		RID_IN,			D_OBJC },
585   { "inout",		RID_INOUT,		D_OBJC },
586   { "oneway",		RID_ONEWAY,		D_OBJC },
587   { "out",		RID_OUT,		D_OBJC },
588   /* These are recognized inside a property attribute list */
589   { "assign",	        RID_ASSIGN,		D_OBJC },
590   { "copy",	        RID_COPY,		D_OBJC },
591   { "getter",		RID_GETTER,		D_OBJC },
592   { "nonatomic",	RID_NONATOMIC,		D_OBJC },
593   { "readonly",		RID_READONLY,		D_OBJC },
594   { "readwrite",	RID_READWRITE,		D_OBJC },
595   { "retain",	        RID_RETAIN,		D_OBJC },
596   { "setter",		RID_SETTER,		D_OBJC },
597 };
598 
599 const unsigned int num_c_common_reswords =
600   sizeof c_common_reswords / sizeof (struct c_common_resword);
601 
602 /* Table of machine-independent attributes common to all C-like languages.  */
603 const struct attribute_spec c_common_attribute_table[] =
604 {
605   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
606        affects_type_identity } */
607   { "packed",                 0, 0, false, false, false,
608 			      handle_packed_attribute , false},
609   { "nocommon",               0, 0, true,  false, false,
610 			      handle_nocommon_attribute, false},
611   { "common",                 0, 0, true,  false, false,
612 			      handle_common_attribute, false },
613   /* FIXME: logically, noreturn attributes should be listed as
614      "false, true, true" and apply to function types.  But implementing this
615      would require all the places in the compiler that use TREE_THIS_VOLATILE
616      on a decl to identify non-returning functions to be located and fixed
617      to check the function type instead.  */
618   { "noreturn",               0, 0, true,  false, false,
619 			      handle_noreturn_attribute, false },
620   { "volatile",               0, 0, true,  false, false,
621 			      handle_noreturn_attribute, false },
622   { "noinline",               0, 0, true,  false, false,
623 			      handle_noinline_attribute, false },
624   { "noclone",                0, 0, true,  false, false,
625 			      handle_noclone_attribute, false },
626   { "leaf",                   0, 0, true,  false, false,
627 			      handle_leaf_attribute, false },
628   { "always_inline",          0, 0, true,  false, false,
629 			      handle_always_inline_attribute, false },
630   { "gnu_inline",             0, 0, true,  false, false,
631 			      handle_gnu_inline_attribute, false },
632   { "artificial",             0, 0, true,  false, false,
633 			      handle_artificial_attribute, false },
634   { "flatten",                0, 0, true,  false, false,
635 			      handle_flatten_attribute, false },
636   { "used",                   0, 0, true,  false, false,
637 			      handle_used_attribute, false },
638   { "unused",                 0, 0, false, false, false,
639 			      handle_unused_attribute, false },
640   { "externally_visible",     0, 0, true,  false, false,
641 			      handle_externally_visible_attribute, false },
642   /* The same comments as for noreturn attributes apply to const ones.  */
643   { "const",                  0, 0, true,  false, false,
644 			      handle_const_attribute, false },
645   { "transparent_union",      0, 0, false, false, false,
646 			      handle_transparent_union_attribute, false },
647   { "constructor",            0, 1, true,  false, false,
648 			      handle_constructor_attribute, false },
649   { "destructor",             0, 1, true,  false, false,
650 			      handle_destructor_attribute, false },
651   { "mode",                   1, 1, false,  true, false,
652 			      handle_mode_attribute, false },
653   { "section",                1, 1, true,  false, false,
654 			      handle_section_attribute, false },
655   { "aligned",                0, 1, false, false, false,
656 			      handle_aligned_attribute, false },
657   { "weak",                   0, 0, true,  false, false,
658 			      handle_weak_attribute, false },
659   { "ifunc",                  1, 1, true,  false, false,
660 			      handle_ifunc_attribute, false },
661   { "alias",                  1, 1, true,  false, false,
662 			      handle_alias_attribute, false },
663   { "weakref",                0, 1, true,  false, false,
664 			      handle_weakref_attribute, false },
665   { "no_instrument_function", 0, 0, true,  false, false,
666 			      handle_no_instrument_function_attribute,
667 			      false },
668   { "malloc",                 0, 0, true,  false, false,
669 			      handle_malloc_attribute, false },
670   { "returns_twice",          0, 0, true,  false, false,
671 			      handle_returns_twice_attribute, false },
672   { "no_stack_limit",         0, 0, true,  false, false,
673 			      handle_no_limit_stack_attribute, false },
674   { "pure",                   0, 0, true,  false, false,
675 			      handle_pure_attribute, false },
676   { "transaction_callable",   0, 0, false, true,  false,
677 			      handle_tm_attribute, false },
678   { "transaction_unsafe",     0, 0, false, true,  false,
679 			      handle_tm_attribute, false },
680   { "transaction_safe",       0, 0, false, true,  false,
681 			      handle_tm_attribute, false },
682   { "transaction_may_cancel_outer", 0, 0, false, true, false,
683 			      handle_tm_attribute, false },
684   /* ??? These two attributes didn't make the transition from the
685      Intel language document to the multi-vendor language document.  */
686   { "transaction_pure",       0, 0, false, true,  false,
687 			      handle_tm_attribute, false },
688   { "transaction_wrap",       1, 1, true,  false,  false,
689 			     handle_tm_wrap_attribute, false },
690   /* For internal use (marking of builtins) only.  The name contains space
691      to prevent its usage in source code.  */
692   { "no vops",                0, 0, true,  false, false,
693 			      handle_novops_attribute, false },
694   { "deprecated",             0, 1, false, false, false,
695 			      handle_deprecated_attribute, false },
696   { "vector_size",	      1, 1, false, true, false,
697 			      handle_vector_size_attribute, false },
698   { "visibility",	      1, 1, false, false, false,
699 			      handle_visibility_attribute, false },
700   { "tls_model",	      1, 1, true,  false, false,
701 			      handle_tls_model_attribute, false },
702   { "nonnull",                0, -1, false, true, true,
703 			      handle_nonnull_attribute, false },
704   { "nothrow",                0, 0, true,  false, false,
705 			      handle_nothrow_attribute, false },
706   { "may_alias",	      0, 0, false, true, false, NULL, false },
707   { "cleanup",		      1, 1, true, false, false,
708 			      handle_cleanup_attribute, false },
709   { "warn_unused_result",     0, 0, false, true, true,
710 			      handle_warn_unused_result_attribute, false },
711   { "sentinel",               0, 1, false, true, true,
712 			      handle_sentinel_attribute, false },
713   /* For internal use (marking of builtins) only.  The name contains space
714      to prevent its usage in source code.  */
715   { "type generic",           0, 0, false, true, true,
716 			      handle_type_generic_attribute, false },
717   { "alloc_size",	      1, 2, false, true, true,
718 			      handle_alloc_size_attribute, false },
719   { "cold",                   0, 0, true,  false, false,
720 			      handle_cold_attribute, false },
721   { "hot",                    0, 0, true,  false, false,
722 			      handle_hot_attribute, false },
723   { "warning",		      1, 1, true,  false, false,
724 			      handle_error_attribute, false },
725   { "error",		      1, 1, true,  false, false,
726 			      handle_error_attribute, false },
727   { "target",                 1, -1, true, false, false,
728 			      handle_target_attribute, false },
729   { "optimize",               1, -1, true, false, false,
730 			      handle_optimize_attribute, false },
731   /* For internal use only.  The leading '*' both prevents its usage in
732      source code and signals that it may be overridden by machine tables.  */
733   { "*tm regparm",            0, 0, false, true, true,
734 			      ignore_attribute, false },
735   { "no_split_stack",	      0, 0, true,  false, false,
736 			      handle_no_split_stack_attribute, false },
737   /* For internal use (marking of builtins and runtime functions) only.
738      The name contains space to prevent its usage in source code.  */
739   { "fn spec",	 	      1, 1, false, true, true,
740 			      handle_fnspec_attribute, false },
741   { NULL,                     0, 0, false, false, false, NULL, false }
742 };
743 
744 /* Give the specifications for the format attributes, used by C and all
745    descendants.  */
746 
747 const struct attribute_spec c_common_format_attribute_table[] =
748 {
749   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
750        affects_type_identity } */
751   { "format",                 3, 3, false, true,  true,
752 			      handle_format_attribute, false },
753   { "format_arg",             1, 1, false, true,  true,
754 			      handle_format_arg_attribute, false },
755   { NULL,                     0, 0, false, false, false, NULL, false }
756 };
757 
758 /* Return identifier for address space AS.  */
759 
760 const char *
761 c_addr_space_name (addr_space_t as)
762 {
763   int rid = RID_FIRST_ADDR_SPACE + as;
764   gcc_assert (ridpointers [rid]);
765   return IDENTIFIER_POINTER (ridpointers [rid]);
766 }
767 
768 /* Push current bindings for the function name VAR_DECLS.  */
769 
770 void
771 start_fname_decls (void)
772 {
773   unsigned ix;
774   tree saved = NULL_TREE;
775 
776   for (ix = 0; fname_vars[ix].decl; ix++)
777     {
778       tree decl = *fname_vars[ix].decl;
779 
780       if (decl)
781 	{
782 	  saved = tree_cons (decl, build_int_cst (integer_type_node, ix),
783 			     saved);
784 	  *fname_vars[ix].decl = NULL_TREE;
785 	}
786     }
787   if (saved || saved_function_name_decls)
788     /* Normally they'll have been NULL, so only push if we've got a
789        stack, or they are non-NULL.  */
790     saved_function_name_decls = tree_cons (saved, NULL_TREE,
791 					   saved_function_name_decls);
792 }
793 
794 /* Finish up the current bindings, adding them into the current function's
795    statement tree.  This must be done _before_ finish_stmt_tree is called.
796    If there is no current function, we must be at file scope and no statements
797    are involved. Pop the previous bindings.  */
798 
799 void
800 finish_fname_decls (void)
801 {
802   unsigned ix;
803   tree stmts = NULL_TREE;
804   tree stack = saved_function_name_decls;
805 
806   for (; stack && TREE_VALUE (stack); stack = TREE_CHAIN (stack))
807     append_to_statement_list (TREE_VALUE (stack), &stmts);
808 
809   if (stmts)
810     {
811       tree *bodyp = &DECL_SAVED_TREE (current_function_decl);
812 
813       if (TREE_CODE (*bodyp) == BIND_EXPR)
814 	bodyp = &BIND_EXPR_BODY (*bodyp);
815 
816       append_to_statement_list_force (*bodyp, &stmts);
817       *bodyp = stmts;
818     }
819 
820   for (ix = 0; fname_vars[ix].decl; ix++)
821     *fname_vars[ix].decl = NULL_TREE;
822 
823   if (stack)
824     {
825       /* We had saved values, restore them.  */
826       tree saved;
827 
828       for (saved = TREE_PURPOSE (stack); saved; saved = TREE_CHAIN (saved))
829 	{
830 	  tree decl = TREE_PURPOSE (saved);
831 	  unsigned ix = TREE_INT_CST_LOW (TREE_VALUE (saved));
832 
833 	  *fname_vars[ix].decl = decl;
834 	}
835       stack = TREE_CHAIN (stack);
836     }
837   saved_function_name_decls = stack;
838 }
839 
840 /* Return the text name of the current function, suitably prettified
841    by PRETTY_P.  Return string must be freed by caller.  */
842 
843 const char *
844 fname_as_string (int pretty_p)
845 {
846   const char *name = "top level";
847   char *namep;
848   int vrb = 2, len;
849   cpp_string cstr = { 0, 0 }, strname;
850 
851   if (!pretty_p)
852     {
853       name = "";
854       vrb = 0;
855     }
856 
857   if (current_function_decl)
858     name = lang_hooks.decl_printable_name (current_function_decl, vrb);
859 
860   len = strlen (name) + 3; /* Two for '"'s.  One for NULL.  */
861 
862   namep = XNEWVEC (char, len);
863   snprintf (namep, len, "\"%s\"", name);
864   strname.text = (unsigned char *) namep;
865   strname.len = len - 1;
866 
867   if (cpp_interpret_string (parse_in, &strname, 1, &cstr, CPP_STRING))
868     {
869       XDELETEVEC (namep);
870       return (const char *) cstr.text;
871     }
872 
873   return namep;
874 }
875 
876 /* Return the VAR_DECL for a const char array naming the current
877    function. If the VAR_DECL has not yet been created, create it
878    now. RID indicates how it should be formatted and IDENTIFIER_NODE
879    ID is its name (unfortunately C and C++ hold the RID values of
880    keywords in different places, so we can't derive RID from ID in
881    this language independent code. LOC is the location of the
882    function.  */
883 
884 tree
885 fname_decl (location_t loc, unsigned int rid, tree id)
886 {
887   unsigned ix;
888   tree decl = NULL_TREE;
889 
890   for (ix = 0; fname_vars[ix].decl; ix++)
891     if (fname_vars[ix].rid == rid)
892       break;
893 
894   decl = *fname_vars[ix].decl;
895   if (!decl)
896     {
897       /* If a tree is built here, it would normally have the lineno of
898 	 the current statement.  Later this tree will be moved to the
899 	 beginning of the function and this line number will be wrong.
900 	 To avoid this problem set the lineno to 0 here; that prevents
901 	 it from appearing in the RTL.  */
902       tree stmts;
903       location_t saved_location = input_location;
904       input_location = UNKNOWN_LOCATION;
905 
906       stmts = push_stmt_list ();
907       decl = (*make_fname_decl) (loc, id, fname_vars[ix].pretty);
908       stmts = pop_stmt_list (stmts);
909       if (!IS_EMPTY_STMT (stmts))
910 	saved_function_name_decls
911 	  = tree_cons (decl, stmts, saved_function_name_decls);
912       *fname_vars[ix].decl = decl;
913       input_location = saved_location;
914     }
915   if (!ix && !current_function_decl)
916     pedwarn (loc, 0, "%qD is not defined outside of function scope", decl);
917 
918   return decl;
919 }
920 
921 /* Given a STRING_CST, give it a suitable array-of-chars data type.  */
922 
923 tree
924 fix_string_type (tree value)
925 {
926   int length = TREE_STRING_LENGTH (value);
927   int nchars;
928   tree e_type, i_type, a_type;
929 
930   /* Compute the number of elements, for the array type.  */
931   if (TREE_TYPE (value) == char_array_type_node || !TREE_TYPE (value))
932     {
933       nchars = length;
934       e_type = char_type_node;
935     }
936   else if (TREE_TYPE (value) == char16_array_type_node)
937     {
938       nchars = length / (TYPE_PRECISION (char16_type_node) / BITS_PER_UNIT);
939       e_type = char16_type_node;
940     }
941   else if (TREE_TYPE (value) == char32_array_type_node)
942     {
943       nchars = length / (TYPE_PRECISION (char32_type_node) / BITS_PER_UNIT);
944       e_type = char32_type_node;
945     }
946   else
947     {
948       nchars = length / (TYPE_PRECISION (wchar_type_node) / BITS_PER_UNIT);
949       e_type = wchar_type_node;
950     }
951 
952   /* C89 2.2.4.1, C99 5.2.4.1 (Translation limits).  The analogous
953      limit in C++98 Annex B is very large (65536) and is not normative,
954      so we do not diagnose it (warn_overlength_strings is forced off
955      in c_common_post_options).  */
956   if (warn_overlength_strings)
957     {
958       const int nchars_max = flag_isoc99 ? 4095 : 509;
959       const int relevant_std = flag_isoc99 ? 99 : 90;
960       if (nchars - 1 > nchars_max)
961 	/* Translators: The %d after 'ISO C' will be 90 or 99.  Do not
962 	   separate the %d from the 'C'.  'ISO' should not be
963 	   translated, but it may be moved after 'C%d' in languages
964 	   where modifiers follow nouns.  */
965 	pedwarn (input_location, OPT_Woverlength_strings,
966 		 "string length %qd is greater than the length %qd "
967 		 "ISO C%d compilers are required to support",
968 		 nchars - 1, nchars_max, relevant_std);
969     }
970 
971   /* Create the array type for the string constant.  The ISO C++
972      standard says that a string literal has type `const char[N]' or
973      `const wchar_t[N]'.  We use the same logic when invoked as a C
974      front-end with -Wwrite-strings.
975      ??? We should change the type of an expression depending on the
976      state of a warning flag.  We should just be warning -- see how
977      this is handled in the C++ front-end for the deprecated implicit
978      conversion from string literals to `char*' or `wchar_t*'.
979 
980      The C++ front end relies on TYPE_MAIN_VARIANT of a cv-qualified
981      array type being the unqualified version of that type.
982      Therefore, if we are constructing an array of const char, we must
983      construct the matching unqualified array type first.  The C front
984      end does not require this, but it does no harm, so we do it
985      unconditionally.  */
986   i_type = build_index_type (size_int (nchars - 1));
987   a_type = build_array_type (e_type, i_type);
988   if (c_dialect_cxx() || warn_write_strings)
989     a_type = c_build_qualified_type (a_type, TYPE_QUAL_CONST);
990 
991   TREE_TYPE (value) = a_type;
992   TREE_CONSTANT (value) = 1;
993   TREE_READONLY (value) = 1;
994   TREE_STATIC (value) = 1;
995   return value;
996 }
997 
998 /* If DISABLE is true, stop issuing warnings.  This is used when
999    parsing code that we know will not be executed.  This function may
1000    be called multiple times, and works as a stack.  */
1001 
1002 static void
1003 c_disable_warnings (bool disable)
1004 {
1005   if (disable)
1006     {
1007       ++c_inhibit_evaluation_warnings;
1008       fold_defer_overflow_warnings ();
1009     }
1010 }
1011 
1012 /* If ENABLE is true, reenable issuing warnings.  */
1013 
1014 static void
1015 c_enable_warnings (bool enable)
1016 {
1017   if (enable)
1018     {
1019       --c_inhibit_evaluation_warnings;
1020       fold_undefer_and_ignore_overflow_warnings ();
1021     }
1022 }
1023 
1024 /* Fully fold EXPR, an expression that was not folded (beyond integer
1025    constant expressions and null pointer constants) when being built
1026    up.  If IN_INIT, this is in a static initializer and certain
1027    changes are made to the folding done.  Clear *MAYBE_CONST if
1028    MAYBE_CONST is not NULL and EXPR is definitely not a constant
1029    expression because it contains an evaluated operator (in C99) or an
1030    operator outside of sizeof returning an integer constant (in C90)
1031    not permitted in constant expressions, or because it contains an
1032    evaluated arithmetic overflow.  (*MAYBE_CONST should typically be
1033    set to true by callers before calling this function.)  Return the
1034    folded expression.  Function arguments have already been folded
1035    before calling this function, as have the contents of SAVE_EXPR,
1036    TARGET_EXPR, BIND_EXPR, VA_ARG_EXPR, OBJ_TYPE_REF and
1037    C_MAYBE_CONST_EXPR.  */
1038 
1039 tree
1040 c_fully_fold (tree expr, bool in_init, bool *maybe_const)
1041 {
1042   tree ret;
1043   tree eptype = NULL_TREE;
1044   bool dummy = true;
1045   bool maybe_const_itself = true;
1046   location_t loc = EXPR_LOCATION (expr);
1047 
1048   /* This function is not relevant to C++ because C++ folds while
1049      parsing, and may need changes to be correct for C++ when C++
1050      stops folding while parsing.  */
1051   if (c_dialect_cxx ())
1052     gcc_unreachable ();
1053 
1054   if (!maybe_const)
1055     maybe_const = &dummy;
1056   if (TREE_CODE (expr) == EXCESS_PRECISION_EXPR)
1057     {
1058       eptype = TREE_TYPE (expr);
1059       expr = TREE_OPERAND (expr, 0);
1060     }
1061   ret = c_fully_fold_internal (expr, in_init, maybe_const,
1062 			       &maybe_const_itself);
1063   if (eptype)
1064     ret = fold_convert_loc (loc, eptype, ret);
1065   *maybe_const &= maybe_const_itself;
1066   return ret;
1067 }
1068 
1069 /* Internal helper for c_fully_fold.  EXPR and IN_INIT are as for
1070    c_fully_fold.  *MAYBE_CONST_OPERANDS is cleared because of operands
1071    not permitted, while *MAYBE_CONST_ITSELF is cleared because of
1072    arithmetic overflow (for C90, *MAYBE_CONST_OPERANDS is carried from
1073    both evaluated and unevaluated subexpressions while
1074    *MAYBE_CONST_ITSELF is carried from only evaluated
1075    subexpressions).  */
1076 
1077 static tree
1078 c_fully_fold_internal (tree expr, bool in_init, bool *maybe_const_operands,
1079 		       bool *maybe_const_itself)
1080 {
1081   tree ret = expr;
1082   enum tree_code code = TREE_CODE (expr);
1083   enum tree_code_class kind = TREE_CODE_CLASS (code);
1084   location_t loc = EXPR_LOCATION (expr);
1085   tree op0, op1, op2, op3;
1086   tree orig_op0, orig_op1, orig_op2;
1087   bool op0_const = true, op1_const = true, op2_const = true;
1088   bool op0_const_self = true, op1_const_self = true, op2_const_self = true;
1089   bool nowarning = TREE_NO_WARNING (expr);
1090   bool unused_p;
1091 
1092   /* This function is not relevant to C++ because C++ folds while
1093      parsing, and may need changes to be correct for C++ when C++
1094      stops folding while parsing.  */
1095   if (c_dialect_cxx ())
1096     gcc_unreachable ();
1097 
1098   /* Constants, declarations, statements, errors, SAVE_EXPRs and
1099      anything else not counted as an expression cannot usefully be
1100      folded further at this point.  */
1101   if (!IS_EXPR_CODE_CLASS (kind)
1102       || kind == tcc_statement
1103       || code == SAVE_EXPR)
1104     return expr;
1105 
1106   /* Operands of variable-length expressions (function calls) have
1107      already been folded, as have __builtin_* function calls, and such
1108      expressions cannot occur in constant expressions.  */
1109   if (kind == tcc_vl_exp)
1110     {
1111       *maybe_const_operands = false;
1112       ret = fold (expr);
1113       goto out;
1114     }
1115 
1116   if (code == C_MAYBE_CONST_EXPR)
1117     {
1118       tree pre = C_MAYBE_CONST_EXPR_PRE (expr);
1119       tree inner = C_MAYBE_CONST_EXPR_EXPR (expr);
1120       if (C_MAYBE_CONST_EXPR_NON_CONST (expr))
1121 	*maybe_const_operands = false;
1122       if (C_MAYBE_CONST_EXPR_INT_OPERANDS (expr))
1123 	*maybe_const_itself = false;
1124       if (pre && !in_init)
1125 	ret = build2 (COMPOUND_EXPR, TREE_TYPE (expr), pre, inner);
1126       else
1127 	ret = inner;
1128       goto out;
1129     }
1130 
1131   /* Assignment, increment, decrement, function call and comma
1132      operators, and statement expressions, cannot occur in constant
1133      expressions if evaluated / outside of sizeof.  (Function calls
1134      were handled above, though VA_ARG_EXPR is treated like a function
1135      call here, and statement expressions are handled through
1136      C_MAYBE_CONST_EXPR to avoid folding inside them.)  */
1137   switch (code)
1138     {
1139     case MODIFY_EXPR:
1140     case PREDECREMENT_EXPR:
1141     case PREINCREMENT_EXPR:
1142     case POSTDECREMENT_EXPR:
1143     case POSTINCREMENT_EXPR:
1144     case COMPOUND_EXPR:
1145       *maybe_const_operands = false;
1146       break;
1147 
1148     case VA_ARG_EXPR:
1149     case TARGET_EXPR:
1150     case BIND_EXPR:
1151     case OBJ_TYPE_REF:
1152       *maybe_const_operands = false;
1153       ret = fold (expr);
1154       goto out;
1155 
1156     default:
1157       break;
1158     }
1159 
1160   /* Fold individual tree codes as appropriate.  */
1161   switch (code)
1162     {
1163     case COMPOUND_LITERAL_EXPR:
1164       /* Any non-constancy will have been marked in a containing
1165 	 C_MAYBE_CONST_EXPR; there is no more folding to do here.  */
1166       goto out;
1167 
1168     case COMPONENT_REF:
1169       orig_op0 = op0 = TREE_OPERAND (expr, 0);
1170       op1 = TREE_OPERAND (expr, 1);
1171       op2 = TREE_OPERAND (expr, 2);
1172       op0 = c_fully_fold_internal (op0, in_init, maybe_const_operands,
1173 				   maybe_const_itself);
1174       STRIP_TYPE_NOPS (op0);
1175       if (op0 != orig_op0)
1176 	ret = build3 (COMPONENT_REF, TREE_TYPE (expr), op0, op1, op2);
1177       if (ret != expr)
1178 	{
1179 	  TREE_READONLY (ret) = TREE_READONLY (expr);
1180 	  TREE_THIS_VOLATILE (ret) = TREE_THIS_VOLATILE (expr);
1181 	}
1182       goto out;
1183 
1184     case ARRAY_REF:
1185       orig_op0 = op0 = TREE_OPERAND (expr, 0);
1186       orig_op1 = op1 = TREE_OPERAND (expr, 1);
1187       op2 = TREE_OPERAND (expr, 2);
1188       op3 = TREE_OPERAND (expr, 3);
1189       op0 = c_fully_fold_internal (op0, in_init, maybe_const_operands,
1190 				   maybe_const_itself);
1191       STRIP_TYPE_NOPS (op0);
1192       op1 = c_fully_fold_internal (op1, in_init, maybe_const_operands,
1193 				   maybe_const_itself);
1194       STRIP_TYPE_NOPS (op1);
1195       op1 = decl_constant_value_for_optimization (op1);
1196       if (op0 != orig_op0 || op1 != orig_op1)
1197 	ret = build4 (ARRAY_REF, TREE_TYPE (expr), op0, op1, op2, op3);
1198       if (ret != expr)
1199 	{
1200 	  TREE_READONLY (ret) = TREE_READONLY (expr);
1201 	  TREE_SIDE_EFFECTS (ret) = TREE_SIDE_EFFECTS (expr);
1202 	  TREE_THIS_VOLATILE (ret) = TREE_THIS_VOLATILE (expr);
1203 	}
1204       ret = fold (ret);
1205       goto out;
1206 
1207     case COMPOUND_EXPR:
1208     case MODIFY_EXPR:
1209     case PREDECREMENT_EXPR:
1210     case PREINCREMENT_EXPR:
1211     case POSTDECREMENT_EXPR:
1212     case POSTINCREMENT_EXPR:
1213     case PLUS_EXPR:
1214     case MINUS_EXPR:
1215     case MULT_EXPR:
1216     case POINTER_PLUS_EXPR:
1217     case TRUNC_DIV_EXPR:
1218     case CEIL_DIV_EXPR:
1219     case FLOOR_DIV_EXPR:
1220     case TRUNC_MOD_EXPR:
1221     case RDIV_EXPR:
1222     case EXACT_DIV_EXPR:
1223     case LSHIFT_EXPR:
1224     case RSHIFT_EXPR:
1225     case BIT_IOR_EXPR:
1226     case BIT_XOR_EXPR:
1227     case BIT_AND_EXPR:
1228     case LT_EXPR:
1229     case LE_EXPR:
1230     case GT_EXPR:
1231     case GE_EXPR:
1232     case EQ_EXPR:
1233     case NE_EXPR:
1234     case COMPLEX_EXPR:
1235     case TRUTH_AND_EXPR:
1236     case TRUTH_OR_EXPR:
1237     case TRUTH_XOR_EXPR:
1238     case UNORDERED_EXPR:
1239     case ORDERED_EXPR:
1240     case UNLT_EXPR:
1241     case UNLE_EXPR:
1242     case UNGT_EXPR:
1243     case UNGE_EXPR:
1244     case UNEQ_EXPR:
1245       /* Binary operations evaluating both arguments (increment and
1246 	 decrement are binary internally in GCC).  */
1247       orig_op0 = op0 = TREE_OPERAND (expr, 0);
1248       orig_op1 = op1 = TREE_OPERAND (expr, 1);
1249       op0 = c_fully_fold_internal (op0, in_init, maybe_const_operands,
1250 				   maybe_const_itself);
1251       STRIP_TYPE_NOPS (op0);
1252       if (code != MODIFY_EXPR
1253 	  && code != PREDECREMENT_EXPR
1254 	  && code != PREINCREMENT_EXPR
1255 	  && code != POSTDECREMENT_EXPR
1256 	  && code != POSTINCREMENT_EXPR)
1257 	op0 = decl_constant_value_for_optimization (op0);
1258       /* The RHS of a MODIFY_EXPR was fully folded when building that
1259 	 expression for the sake of conversion warnings.  */
1260       if (code != MODIFY_EXPR)
1261 	op1 = c_fully_fold_internal (op1, in_init, maybe_const_operands,
1262 				     maybe_const_itself);
1263       STRIP_TYPE_NOPS (op1);
1264       op1 = decl_constant_value_for_optimization (op1);
1265       if (op0 != orig_op0 || op1 != orig_op1 || in_init)
1266 	ret = in_init
1267 	  ? fold_build2_initializer_loc (loc, code, TREE_TYPE (expr), op0, op1)
1268 	  : fold_build2_loc (loc, code, TREE_TYPE (expr), op0, op1);
1269       else
1270 	ret = fold (expr);
1271       if (TREE_OVERFLOW_P (ret)
1272 	  && !TREE_OVERFLOW_P (op0)
1273 	  && !TREE_OVERFLOW_P (op1))
1274 	overflow_warning (EXPR_LOCATION (expr), ret);
1275       goto out;
1276 
1277     case INDIRECT_REF:
1278     case FIX_TRUNC_EXPR:
1279     case FLOAT_EXPR:
1280     CASE_CONVERT:
1281     case VIEW_CONVERT_EXPR:
1282     case NON_LVALUE_EXPR:
1283     case NEGATE_EXPR:
1284     case BIT_NOT_EXPR:
1285     case TRUTH_NOT_EXPR:
1286     case ADDR_EXPR:
1287     case CONJ_EXPR:
1288     case REALPART_EXPR:
1289     case IMAGPART_EXPR:
1290       /* Unary operations.  */
1291       orig_op0 = op0 = TREE_OPERAND (expr, 0);
1292       op0 = c_fully_fold_internal (op0, in_init, maybe_const_operands,
1293 				   maybe_const_itself);
1294       STRIP_TYPE_NOPS (op0);
1295       if (code != ADDR_EXPR && code != REALPART_EXPR && code != IMAGPART_EXPR)
1296 	op0 = decl_constant_value_for_optimization (op0);
1297       /* ??? Cope with user tricks that amount to offsetof.  The middle-end is
1298 	 not prepared to deal with them if they occur in initializers.  */
1299       if (op0 != orig_op0
1300 	  && code == ADDR_EXPR
1301 	  && (op1 = get_base_address (op0)) != NULL_TREE
1302 	  && TREE_CODE (op1) == INDIRECT_REF
1303 	  && TREE_CONSTANT (TREE_OPERAND (op1, 0)))
1304 	ret = fold_convert_loc (loc, TREE_TYPE (expr), fold_offsetof_1 (op0));
1305       else if (op0 != orig_op0 || in_init)
1306 	ret = in_init
1307 	  ? fold_build1_initializer_loc (loc, code, TREE_TYPE (expr), op0)
1308 	  : fold_build1_loc (loc, code, TREE_TYPE (expr), op0);
1309       else
1310 	ret = fold (expr);
1311       if (code == INDIRECT_REF
1312 	  && ret != expr
1313 	  && TREE_CODE (ret) == INDIRECT_REF)
1314 	{
1315 	  TREE_READONLY (ret) = TREE_READONLY (expr);
1316 	  TREE_SIDE_EFFECTS (ret) = TREE_SIDE_EFFECTS (expr);
1317 	  TREE_THIS_VOLATILE (ret) = TREE_THIS_VOLATILE (expr);
1318 	}
1319       switch (code)
1320 	{
1321 	case FIX_TRUNC_EXPR:
1322 	case FLOAT_EXPR:
1323 	CASE_CONVERT:
1324 	  /* Don't warn about explicit conversions.  We will already
1325 	     have warned about suspect implicit conversions.  */
1326 	  break;
1327 
1328 	default:
1329 	  if (TREE_OVERFLOW_P (ret) && !TREE_OVERFLOW_P (op0))
1330 	    overflow_warning (EXPR_LOCATION (expr), ret);
1331 	  break;
1332 	}
1333       goto out;
1334 
1335     case TRUTH_ANDIF_EXPR:
1336     case TRUTH_ORIF_EXPR:
1337       /* Binary operations not necessarily evaluating both
1338 	 arguments.  */
1339       orig_op0 = op0 = TREE_OPERAND (expr, 0);
1340       orig_op1 = op1 = TREE_OPERAND (expr, 1);
1341       op0 = c_fully_fold_internal (op0, in_init, &op0_const, &op0_const_self);
1342       STRIP_TYPE_NOPS (op0);
1343 
1344       unused_p = (op0 == (code == TRUTH_ANDIF_EXPR
1345 			  ? truthvalue_false_node
1346 			  : truthvalue_true_node));
1347       c_disable_warnings (unused_p);
1348       op1 = c_fully_fold_internal (op1, in_init, &op1_const, &op1_const_self);
1349       STRIP_TYPE_NOPS (op1);
1350       c_enable_warnings (unused_p);
1351 
1352       if (op0 != orig_op0 || op1 != orig_op1 || in_init)
1353 	ret = in_init
1354 	  ? fold_build2_initializer_loc (loc, code, TREE_TYPE (expr), op0, op1)
1355 	  : fold_build2_loc (loc, code, TREE_TYPE (expr), op0, op1);
1356       else
1357 	ret = fold (expr);
1358       *maybe_const_operands &= op0_const;
1359       *maybe_const_itself &= op0_const_self;
1360       if (!(flag_isoc99
1361 	    && op0_const
1362 	    && op0_const_self
1363 	    && (code == TRUTH_ANDIF_EXPR
1364 		? op0 == truthvalue_false_node
1365 		: op0 == truthvalue_true_node)))
1366 	*maybe_const_operands &= op1_const;
1367       if (!(op0_const
1368 	    && op0_const_self
1369 	    && (code == TRUTH_ANDIF_EXPR
1370 		? op0 == truthvalue_false_node
1371 		: op0 == truthvalue_true_node)))
1372 	*maybe_const_itself &= op1_const_self;
1373       goto out;
1374 
1375     case COND_EXPR:
1376       orig_op0 = op0 = TREE_OPERAND (expr, 0);
1377       orig_op1 = op1 = TREE_OPERAND (expr, 1);
1378       orig_op2 = op2 = TREE_OPERAND (expr, 2);
1379       op0 = c_fully_fold_internal (op0, in_init, &op0_const, &op0_const_self);
1380 
1381       STRIP_TYPE_NOPS (op0);
1382       c_disable_warnings (op0 == truthvalue_false_node);
1383       op1 = c_fully_fold_internal (op1, in_init, &op1_const, &op1_const_self);
1384       STRIP_TYPE_NOPS (op1);
1385       c_enable_warnings (op0 == truthvalue_false_node);
1386 
1387       c_disable_warnings (op0 == truthvalue_true_node);
1388       op2 = c_fully_fold_internal (op2, in_init, &op2_const, &op2_const_self);
1389       STRIP_TYPE_NOPS (op2);
1390       c_enable_warnings (op0 == truthvalue_true_node);
1391 
1392       if (op0 != orig_op0 || op1 != orig_op1 || op2 != orig_op2)
1393 	ret = fold_build3_loc (loc, code, TREE_TYPE (expr), op0, op1, op2);
1394       else
1395 	ret = fold (expr);
1396       *maybe_const_operands &= op0_const;
1397       *maybe_const_itself &= op0_const_self;
1398       if (!(flag_isoc99
1399 	    && op0_const
1400 	    && op0_const_self
1401 	    && op0 == truthvalue_false_node))
1402 	*maybe_const_operands &= op1_const;
1403       if (!(op0_const
1404 	    && op0_const_self
1405 	    && op0 == truthvalue_false_node))
1406 	*maybe_const_itself &= op1_const_self;
1407       if (!(flag_isoc99
1408 	    && op0_const
1409 	    && op0_const_self
1410 	    && op0 == truthvalue_true_node))
1411 	*maybe_const_operands &= op2_const;
1412       if (!(op0_const
1413 	    && op0_const_self
1414 	    && op0 == truthvalue_true_node))
1415 	*maybe_const_itself &= op2_const_self;
1416       goto out;
1417 
1418     case EXCESS_PRECISION_EXPR:
1419       /* Each case where an operand with excess precision may be
1420 	 encountered must remove the EXCESS_PRECISION_EXPR around
1421 	 inner operands and possibly put one around the whole
1422 	 expression or possibly convert to the semantic type (which
1423 	 c_fully_fold does); we cannot tell at this stage which is
1424 	 appropriate in any particular case.  */
1425       gcc_unreachable ();
1426 
1427     default:
1428       /* Various codes may appear through folding built-in functions
1429 	 and their arguments.  */
1430       goto out;
1431     }
1432 
1433  out:
1434   /* Some folding may introduce NON_LVALUE_EXPRs; all lvalue checks
1435      have been done by this point, so remove them again.  */
1436   nowarning |= TREE_NO_WARNING (ret);
1437   STRIP_TYPE_NOPS (ret);
1438   if (nowarning && !TREE_NO_WARNING (ret))
1439     {
1440       if (!CAN_HAVE_LOCATION_P (ret))
1441 	ret = build1 (NOP_EXPR, TREE_TYPE (ret), ret);
1442       TREE_NO_WARNING (ret) = 1;
1443     }
1444   if (ret != expr)
1445     protected_set_expr_location (ret, loc);
1446   return ret;
1447 }
1448 
1449 /* If not optimizing, EXP is not a VAR_DECL, or EXP has array type,
1450    return EXP.  Otherwise, return either EXP or its known constant
1451    value (if it has one), but return EXP if EXP has mode BLKmode.  ???
1452    Is the BLKmode test appropriate?  */
1453 
1454 tree
1455 decl_constant_value_for_optimization (tree exp)
1456 {
1457   tree ret;
1458 
1459   /* This function is only used by C, for c_fully_fold and other
1460      optimization, and may not be correct for C++.  */
1461   if (c_dialect_cxx ())
1462     gcc_unreachable ();
1463 
1464   if (!optimize
1465       || TREE_CODE (exp) != VAR_DECL
1466       || TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE
1467       || DECL_MODE (exp) == BLKmode)
1468     return exp;
1469 
1470   ret = decl_constant_value (exp);
1471   /* Avoid unwanted tree sharing between the initializer and current
1472      function's body where the tree can be modified e.g. by the
1473      gimplifier.  */
1474   if (ret != exp && TREE_STATIC (exp))
1475     ret = unshare_expr (ret);
1476   return ret;
1477 }
1478 
1479 /* Print a warning if a constant expression had overflow in folding.
1480    Invoke this function on every expression that the language
1481    requires to be a constant expression.
1482    Note the ANSI C standard says it is erroneous for a
1483    constant expression to overflow.  */
1484 
1485 void
1486 constant_expression_warning (tree value)
1487 {
1488   if (warn_overflow && pedantic
1489       && (TREE_CODE (value) == INTEGER_CST || TREE_CODE (value) == REAL_CST
1490 	  || TREE_CODE (value) == FIXED_CST
1491 	  || TREE_CODE (value) == VECTOR_CST
1492 	  || TREE_CODE (value) == COMPLEX_CST)
1493       && TREE_OVERFLOW (value))
1494     pedwarn (input_location, OPT_Woverflow, "overflow in constant expression");
1495 }
1496 
1497 /* The same as above but print an unconditional error.  */
1498 void
1499 constant_expression_error (tree value)
1500 {
1501   if ((TREE_CODE (value) == INTEGER_CST || TREE_CODE (value) == REAL_CST
1502        || TREE_CODE (value) == FIXED_CST
1503        || TREE_CODE (value) == VECTOR_CST
1504        || TREE_CODE (value) == COMPLEX_CST)
1505       && TREE_OVERFLOW (value))
1506     error ("overflow in constant expression");
1507 }
1508 
1509 /* Print a warning if an expression had overflow in folding and its
1510    operands hadn't.
1511 
1512    Invoke this function on every expression that
1513    (1) appears in the source code, and
1514    (2) is a constant expression that overflowed, and
1515    (3) is not already checked by convert_and_check;
1516    however, do not invoke this function on operands of explicit casts
1517    or when the expression is the result of an operator and any operand
1518    already overflowed.  */
1519 
1520 void
1521 overflow_warning (location_t loc, tree value)
1522 {
1523   if (c_inhibit_evaluation_warnings != 0)
1524     return;
1525 
1526   switch (TREE_CODE (value))
1527     {
1528     case INTEGER_CST:
1529       warning_at (loc, OPT_Woverflow, "integer overflow in expression");
1530       break;
1531 
1532     case REAL_CST:
1533       warning_at (loc, OPT_Woverflow,
1534 		  "floating point overflow in expression");
1535       break;
1536 
1537     case FIXED_CST:
1538       warning_at (loc, OPT_Woverflow, "fixed-point overflow in expression");
1539       break;
1540 
1541     case VECTOR_CST:
1542       warning_at (loc, OPT_Woverflow, "vector overflow in expression");
1543       break;
1544 
1545     case COMPLEX_CST:
1546       if (TREE_CODE (TREE_REALPART (value)) == INTEGER_CST)
1547 	warning_at (loc, OPT_Woverflow,
1548 		    "complex integer overflow in expression");
1549       else if (TREE_CODE (TREE_REALPART (value)) == REAL_CST)
1550 	warning_at (loc, OPT_Woverflow,
1551 		    "complex floating point overflow in expression");
1552       break;
1553 
1554     default:
1555       break;
1556     }
1557 }
1558 
1559 /* Warn about uses of logical || / && operator in a context where it
1560    is likely that the bitwise equivalent was intended by the
1561    programmer.  We have seen an expression in which CODE is a binary
1562    operator used to combine expressions OP_LEFT and OP_RIGHT, which before folding
1563    had CODE_LEFT and CODE_RIGHT, into an expression of type TYPE.  */
1564 void
1565 warn_logical_operator (location_t location, enum tree_code code, tree type,
1566 		       enum tree_code code_left, tree op_left,
1567 		       enum tree_code ARG_UNUSED (code_right), tree op_right)
1568 {
1569   int or_op = (code == TRUTH_ORIF_EXPR || code == TRUTH_OR_EXPR);
1570   int in0_p, in1_p, in_p;
1571   tree low0, low1, low, high0, high1, high, lhs, rhs, tem;
1572   bool strict_overflow_p = false;
1573 
1574   if (code != TRUTH_ANDIF_EXPR
1575       && code != TRUTH_AND_EXPR
1576       && code != TRUTH_ORIF_EXPR
1577       && code != TRUTH_OR_EXPR)
1578     return;
1579 
1580   /* Warn if &&/|| are being used in a context where it is
1581      likely that the bitwise equivalent was intended by the
1582      programmer. That is, an expression such as op && MASK
1583      where op should not be any boolean expression, nor a
1584      constant, and mask seems to be a non-boolean integer constant.  */
1585   if (!truth_value_p (code_left)
1586       && INTEGRAL_TYPE_P (TREE_TYPE (op_left))
1587       && !CONSTANT_CLASS_P (op_left)
1588       && !TREE_NO_WARNING (op_left)
1589       && TREE_CODE (op_right) == INTEGER_CST
1590       && !integer_zerop (op_right)
1591       && !integer_onep (op_right))
1592     {
1593       if (or_op)
1594 	warning_at (location, OPT_Wlogical_op, "logical %<or%>"
1595 		    " applied to non-boolean constant");
1596       else
1597 	warning_at (location, OPT_Wlogical_op, "logical %<and%>"
1598 		    " applied to non-boolean constant");
1599       TREE_NO_WARNING (op_left) = true;
1600       return;
1601     }
1602 
1603   /* We do not warn for constants because they are typical of macro
1604      expansions that test for features.  */
1605   if (CONSTANT_CLASS_P (op_left) || CONSTANT_CLASS_P (op_right))
1606     return;
1607 
1608   /* This warning only makes sense with logical operands.  */
1609   if (!(truth_value_p (TREE_CODE (op_left))
1610 	|| INTEGRAL_TYPE_P (TREE_TYPE (op_left)))
1611       || !(truth_value_p (TREE_CODE (op_right))
1612 	   || INTEGRAL_TYPE_P (TREE_TYPE (op_right))))
1613     return;
1614 
1615   lhs = make_range (op_left, &in0_p, &low0, &high0, &strict_overflow_p);
1616   rhs = make_range (op_right, &in1_p, &low1, &high1, &strict_overflow_p);
1617 
1618   if (lhs && TREE_CODE (lhs) == C_MAYBE_CONST_EXPR)
1619     lhs = C_MAYBE_CONST_EXPR_EXPR (lhs);
1620 
1621   if (rhs && TREE_CODE (rhs) == C_MAYBE_CONST_EXPR)
1622     rhs = C_MAYBE_CONST_EXPR_EXPR (rhs);
1623 
1624   /* If this is an OR operation, invert both sides; we will invert
1625      again at the end.  */
1626   if (or_op)
1627     in0_p = !in0_p, in1_p = !in1_p;
1628 
1629   /* If both expressions are the same, if we can merge the ranges, and we
1630      can build the range test, return it or it inverted.  */
1631   if (lhs && rhs && operand_equal_p (lhs, rhs, 0)
1632       && merge_ranges (&in_p, &low, &high, in0_p, low0, high0,
1633 		       in1_p, low1, high1)
1634       && 0 != (tem = build_range_check (UNKNOWN_LOCATION,
1635 					type, lhs, in_p, low, high)))
1636     {
1637       if (TREE_CODE (tem) != INTEGER_CST)
1638 	return;
1639 
1640       if (or_op)
1641         warning_at (location, OPT_Wlogical_op,
1642                     "logical %<or%> "
1643                     "of collectively exhaustive tests is always true");
1644       else
1645         warning_at (location, OPT_Wlogical_op,
1646                     "logical %<and%> "
1647                     "of mutually exclusive tests is always false");
1648     }
1649 }
1650 
1651 
1652 /* Print a warning about casts that might indicate violation
1653    of strict aliasing rules if -Wstrict-aliasing is used and
1654    strict aliasing mode is in effect. OTYPE is the original
1655    TREE_TYPE of EXPR, and TYPE the type we're casting to. */
1656 
1657 bool
1658 strict_aliasing_warning (tree otype, tree type, tree expr)
1659 {
1660   /* Strip pointer conversion chains and get to the correct original type.  */
1661   STRIP_NOPS (expr);
1662   otype = TREE_TYPE (expr);
1663 
1664   if (!(flag_strict_aliasing
1665 	&& POINTER_TYPE_P (type)
1666 	&& POINTER_TYPE_P (otype)
1667 	&& !VOID_TYPE_P (TREE_TYPE (type)))
1668       /* If the type we are casting to is a ref-all pointer
1669          dereferencing it is always valid.  */
1670       || TYPE_REF_CAN_ALIAS_ALL (type))
1671     return false;
1672 
1673   if ((warn_strict_aliasing > 1) && TREE_CODE (expr) == ADDR_EXPR
1674       && (DECL_P (TREE_OPERAND (expr, 0))
1675           || handled_component_p (TREE_OPERAND (expr, 0))))
1676     {
1677       /* Casting the address of an object to non void pointer. Warn
1678          if the cast breaks type based aliasing.  */
1679       if (!COMPLETE_TYPE_P (TREE_TYPE (type)) && warn_strict_aliasing == 2)
1680 	{
1681 	  warning (OPT_Wstrict_aliasing, "type-punning to incomplete type "
1682 		   "might break strict-aliasing rules");
1683 	  return true;
1684 	}
1685       else
1686         {
1687           /* warn_strict_aliasing >= 3.   This includes the default (3).
1688              Only warn if the cast is dereferenced immediately.  */
1689           alias_set_type set1 =
1690 	    get_alias_set (TREE_TYPE (TREE_OPERAND (expr, 0)));
1691           alias_set_type set2 = get_alias_set (TREE_TYPE (type));
1692 
1693           if (set1 != set2 && set2 != 0
1694 	      && (set1 == 0 || !alias_sets_conflict_p (set1, set2)))
1695 	    {
1696 	      warning (OPT_Wstrict_aliasing, "dereferencing type-punned "
1697 		       "pointer will break strict-aliasing rules");
1698 	      return true;
1699 	    }
1700           else if (warn_strict_aliasing == 2
1701 		   && !alias_sets_must_conflict_p (set1, set2))
1702 	    {
1703 	      warning (OPT_Wstrict_aliasing, "dereferencing type-punned "
1704 		       "pointer might break strict-aliasing rules");
1705 	      return true;
1706 	    }
1707         }
1708     }
1709   else
1710     if ((warn_strict_aliasing == 1) && !VOID_TYPE_P (TREE_TYPE (otype)))
1711       {
1712         /* At this level, warn for any conversions, even if an address is
1713            not taken in the same statement.  This will likely produce many
1714            false positives, but could be useful to pinpoint problems that
1715            are not revealed at higher levels.  */
1716         alias_set_type set1 = get_alias_set (TREE_TYPE (otype));
1717         alias_set_type set2 = get_alias_set (TREE_TYPE (type));
1718         if (!COMPLETE_TYPE_P (type)
1719             || !alias_sets_must_conflict_p (set1, set2))
1720 	  {
1721             warning (OPT_Wstrict_aliasing, "dereferencing type-punned "
1722                      "pointer might break strict-aliasing rules");
1723             return true;
1724           }
1725       }
1726 
1727   return false;
1728 }
1729 
1730 /* Warn for unlikely, improbable, or stupid DECL declarations
1731    of `main'.  */
1732 
1733 void
1734 check_main_parameter_types (tree decl)
1735 {
1736   function_args_iterator iter;
1737   tree type;
1738   int argct = 0;
1739 
1740   FOREACH_FUNCTION_ARGS (TREE_TYPE (decl), type, iter)
1741     {
1742       /* XXX void_type_node belies the abstraction.  */
1743       if (type == void_type_node || type == error_mark_node )
1744 	break;
1745 
1746       ++argct;
1747       switch (argct)
1748 	{
1749 	case 1:
1750 	  if (TYPE_MAIN_VARIANT (type) != integer_type_node)
1751 	    pedwarn (input_location, OPT_Wmain,
1752 		     "first argument of %q+D should be %<int%>", decl);
1753 	  break;
1754 
1755 	case 2:
1756 	  if (TREE_CODE (type) != POINTER_TYPE
1757 	      || TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE
1758 	      || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type)))
1759 		  != char_type_node))
1760 	    pedwarn (input_location, OPT_Wmain,
1761 		     "second argument of %q+D should be %<char **%>", decl);
1762 	  break;
1763 
1764 	case 3:
1765 	  if (TREE_CODE (type) != POINTER_TYPE
1766 	      || TREE_CODE (TREE_TYPE (type)) != POINTER_TYPE
1767 	      || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (type)))
1768 		  != char_type_node))
1769 	    pedwarn (input_location, OPT_Wmain,
1770 		     "third argument of %q+D should probably be "
1771 		     "%<char **%>", decl);
1772 	  break;
1773 	}
1774     }
1775 
1776   /* It is intentional that this message does not mention the third
1777     argument because it's only mentioned in an appendix of the
1778     standard.  */
1779   if (argct > 0 && (argct < 2 || argct > 3))
1780     pedwarn (input_location, OPT_Wmain,
1781 	     "%q+D takes only zero or two arguments", decl);
1782 }
1783 
1784 /* True if pointers to distinct types T1 and T2 can be converted to
1785    each other without an explicit cast.  Only returns true for opaque
1786    vector types.  */
1787 bool
1788 vector_targets_convertible_p (const_tree t1, const_tree t2)
1789 {
1790   if (TREE_CODE (t1) == VECTOR_TYPE && TREE_CODE (t2) == VECTOR_TYPE
1791       && (TYPE_VECTOR_OPAQUE (t1) || TYPE_VECTOR_OPAQUE (t2))
1792       && tree_int_cst_equal (TYPE_SIZE (t1), TYPE_SIZE (t2)))
1793     return true;
1794 
1795   return false;
1796 }
1797 
1798 /* True if vector types T1 and T2 can be converted to each other
1799    without an explicit cast.  If EMIT_LAX_NOTE is true, and T1 and T2
1800    can only be converted with -flax-vector-conversions yet that is not
1801    in effect, emit a note telling the user about that option if such
1802    a note has not previously been emitted.  */
1803 bool
1804 vector_types_convertible_p (const_tree t1, const_tree t2, bool emit_lax_note)
1805 {
1806   static bool emitted_lax_note = false;
1807   bool convertible_lax;
1808 
1809   if ((TYPE_VECTOR_OPAQUE (t1) || TYPE_VECTOR_OPAQUE (t2))
1810       && tree_int_cst_equal (TYPE_SIZE (t1), TYPE_SIZE (t2)))
1811     return true;
1812 
1813   convertible_lax =
1814     (tree_int_cst_equal (TYPE_SIZE (t1), TYPE_SIZE (t2))
1815      && (TREE_CODE (TREE_TYPE (t1)) != REAL_TYPE ||
1816 	 TYPE_PRECISION (t1) == TYPE_PRECISION (t2))
1817      && (INTEGRAL_TYPE_P (TREE_TYPE (t1))
1818 	 == INTEGRAL_TYPE_P (TREE_TYPE (t2))));
1819 
1820   if (!convertible_lax || flag_lax_vector_conversions)
1821     return convertible_lax;
1822 
1823   if (TYPE_VECTOR_SUBPARTS (t1) == TYPE_VECTOR_SUBPARTS (t2)
1824       && lang_hooks.types_compatible_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1825     return true;
1826 
1827   if (emit_lax_note && !emitted_lax_note)
1828     {
1829       emitted_lax_note = true;
1830       inform (input_location, "use -flax-vector-conversions to permit "
1831               "conversions between vectors with differing "
1832               "element types or numbers of subparts");
1833     }
1834 
1835   return false;
1836 }
1837 
1838 /* Like tree.c:get_narrower, but retain conversion from C++0x scoped enum
1839    to integral type.  */
1840 
1841 static tree
1842 c_common_get_narrower (tree op, int *unsignedp_ptr)
1843 {
1844   op = get_narrower (op, unsignedp_ptr);
1845 
1846   if (TREE_CODE (TREE_TYPE (op)) == ENUMERAL_TYPE
1847       && ENUM_IS_SCOPED (TREE_TYPE (op)))
1848     {
1849       /* C++0x scoped enumerations don't implicitly convert to integral
1850 	 type; if we stripped an explicit conversion to a larger type we
1851 	 need to replace it so common_type will still work.  */
1852       tree type = (lang_hooks.types.type_for_size
1853 		   (TYPE_PRECISION (TREE_TYPE (op)),
1854 		    TYPE_UNSIGNED (TREE_TYPE (op))));
1855       op = fold_convert (type, op);
1856     }
1857   return op;
1858 }
1859 
1860 /* This is a helper function of build_binary_op.
1861 
1862    For certain operations if both args were extended from the same
1863    smaller type, do the arithmetic in that type and then extend.
1864 
1865    BITWISE indicates a bitwise operation.
1866    For them, this optimization is safe only if
1867    both args are zero-extended or both are sign-extended.
1868    Otherwise, we might change the result.
1869    Eg, (short)-1 | (unsigned short)-1 is (int)-1
1870    but calculated in (unsigned short) it would be (unsigned short)-1.
1871 */
1872 tree
1873 shorten_binary_op (tree result_type, tree op0, tree op1, bool bitwise)
1874 {
1875   int unsigned0, unsigned1;
1876   tree arg0, arg1;
1877   int uns;
1878   tree type;
1879 
1880   /* Cast OP0 and OP1 to RESULT_TYPE.  Doing so prevents
1881      excessive narrowing when we call get_narrower below.  For
1882      example, suppose that OP0 is of unsigned int extended
1883      from signed char and that RESULT_TYPE is long long int.
1884      If we explicitly cast OP0 to RESULT_TYPE, OP0 would look
1885      like
1886 
1887      (long long int) (unsigned int) signed_char
1888 
1889      which get_narrower would narrow down to
1890 
1891      (unsigned int) signed char
1892 
1893      If we do not cast OP0 first, get_narrower would return
1894      signed_char, which is inconsistent with the case of the
1895      explicit cast.  */
1896   op0 = convert (result_type, op0);
1897   op1 = convert (result_type, op1);
1898 
1899   arg0 = c_common_get_narrower (op0, &unsigned0);
1900   arg1 = c_common_get_narrower (op1, &unsigned1);
1901 
1902   /* UNS is 1 if the operation to be done is an unsigned one.  */
1903   uns = TYPE_UNSIGNED (result_type);
1904 
1905   /* Handle the case that OP0 (or OP1) does not *contain* a conversion
1906      but it *requires* conversion to FINAL_TYPE.  */
1907 
1908   if ((TYPE_PRECISION (TREE_TYPE (op0))
1909        == TYPE_PRECISION (TREE_TYPE (arg0)))
1910       && TREE_TYPE (op0) != result_type)
1911     unsigned0 = TYPE_UNSIGNED (TREE_TYPE (op0));
1912   if ((TYPE_PRECISION (TREE_TYPE (op1))
1913        == TYPE_PRECISION (TREE_TYPE (arg1)))
1914       && TREE_TYPE (op1) != result_type)
1915     unsigned1 = TYPE_UNSIGNED (TREE_TYPE (op1));
1916 
1917   /* Now UNSIGNED0 is 1 if ARG0 zero-extends to FINAL_TYPE.  */
1918 
1919   /* For bitwise operations, signedness of nominal type
1920      does not matter.  Consider only how operands were extended.  */
1921   if (bitwise)
1922     uns = unsigned0;
1923 
1924   /* Note that in all three cases below we refrain from optimizing
1925      an unsigned operation on sign-extended args.
1926      That would not be valid.  */
1927 
1928   /* Both args variable: if both extended in same way
1929      from same width, do it in that width.
1930      Do it unsigned if args were zero-extended.  */
1931   if ((TYPE_PRECISION (TREE_TYPE (arg0))
1932        < TYPE_PRECISION (result_type))
1933       && (TYPE_PRECISION (TREE_TYPE (arg1))
1934 	  == TYPE_PRECISION (TREE_TYPE (arg0)))
1935       && unsigned0 == unsigned1
1936       && (unsigned0 || !uns))
1937     return c_common_signed_or_unsigned_type
1938       (unsigned0, common_type (TREE_TYPE (arg0), TREE_TYPE (arg1)));
1939 
1940   else if (TREE_CODE (arg0) == INTEGER_CST
1941 	   && (unsigned1 || !uns)
1942 	   && (TYPE_PRECISION (TREE_TYPE (arg1))
1943 	       < TYPE_PRECISION (result_type))
1944 	   && (type
1945 	       = c_common_signed_or_unsigned_type (unsigned1,
1946 						   TREE_TYPE (arg1)))
1947 	   && !POINTER_TYPE_P (type)
1948 	   && int_fits_type_p (arg0, type))
1949     return type;
1950 
1951   else if (TREE_CODE (arg1) == INTEGER_CST
1952 	   && (unsigned0 || !uns)
1953 	   && (TYPE_PRECISION (TREE_TYPE (arg0))
1954 	       < TYPE_PRECISION (result_type))
1955 	   && (type
1956 	       = c_common_signed_or_unsigned_type (unsigned0,
1957 						   TREE_TYPE (arg0)))
1958 	   && !POINTER_TYPE_P (type)
1959 	   && int_fits_type_p (arg1, type))
1960     return type;
1961 
1962   return result_type;
1963 }
1964 
1965 /* Checks if expression EXPR of real/integer type cannot be converted
1966    to the real/integer type TYPE. Function returns true when:
1967 	* EXPR is a constant which cannot be exactly converted to TYPE
1968 	* EXPR is not a constant and size of EXPR's type > than size of TYPE,
1969 	  for EXPR type and TYPE being both integers or both real.
1970 	* EXPR is not a constant of real type and TYPE is an integer.
1971 	* EXPR is not a constant of integer type which cannot be
1972 	  exactly converted to real type.
1973    Function allows conversions between types of different signedness and
1974    does not return true in that case.  Function can produce signedness
1975    warnings if PRODUCE_WARNS is true.  */
1976 bool
1977 unsafe_conversion_p (tree type, tree expr, bool produce_warns)
1978 {
1979   bool give_warning = false;
1980   tree expr_type = TREE_TYPE (expr);
1981   location_t loc = EXPR_LOC_OR_HERE (expr);
1982 
1983   if (TREE_CODE (expr) == REAL_CST || TREE_CODE (expr) == INTEGER_CST)
1984     {
1985       /* Warn for real constant that is not an exact integer converted
1986 	 to integer type.  */
1987       if (TREE_CODE (expr_type) == REAL_TYPE
1988 	  && TREE_CODE (type) == INTEGER_TYPE)
1989 	{
1990 	  if (!real_isinteger (TREE_REAL_CST_PTR (expr), TYPE_MODE (expr_type)))
1991 	    give_warning = true;
1992 	}
1993       /* Warn for an integer constant that does not fit into integer type.  */
1994       else if (TREE_CODE (expr_type) == INTEGER_TYPE
1995 	       && TREE_CODE (type) == INTEGER_TYPE
1996 	       && !int_fits_type_p (expr, type))
1997 	{
1998 	  if (TYPE_UNSIGNED (type) && !TYPE_UNSIGNED (expr_type)
1999 	      && tree_int_cst_sgn (expr) < 0)
2000 	    {
2001 	      if (produce_warns)
2002 		warning_at (loc, OPT_Wsign_conversion, "negative integer"
2003 			    " implicitly converted to unsigned type");
2004 	    }
2005 	  else if (!TYPE_UNSIGNED (type) && TYPE_UNSIGNED (expr_type))
2006 	    {
2007 	      if (produce_warns)
2008 		warning_at (loc, OPT_Wsign_conversion, "conversion of unsigned"
2009 			    " constant value to negative integer");
2010 	    }
2011 	  else
2012 	    give_warning = true;
2013 	}
2014       else if (TREE_CODE (type) == REAL_TYPE)
2015 	{
2016 	  /* Warn for an integer constant that does not fit into real type.  */
2017 	  if (TREE_CODE (expr_type) == INTEGER_TYPE)
2018 	    {
2019 	      REAL_VALUE_TYPE a = real_value_from_int_cst (0, expr);
2020 	      if (!exact_real_truncate (TYPE_MODE (type), &a))
2021 		give_warning = true;
2022 	    }
2023 	  /* Warn for a real constant that does not fit into a smaller
2024 	     real type.  */
2025 	  else if (TREE_CODE (expr_type) == REAL_TYPE
2026 		   && TYPE_PRECISION (type) < TYPE_PRECISION (expr_type))
2027 	    {
2028 	      REAL_VALUE_TYPE a = TREE_REAL_CST (expr);
2029 	      if (!exact_real_truncate (TYPE_MODE (type), &a))
2030 		give_warning = true;
2031 	    }
2032 	}
2033     }
2034   else
2035     {
2036       /* Warn for real types converted to integer types.  */
2037       if (TREE_CODE (expr_type) == REAL_TYPE
2038 	  && TREE_CODE (type) == INTEGER_TYPE)
2039 	give_warning = true;
2040 
2041       else if (TREE_CODE (expr_type) == INTEGER_TYPE
2042 	       && TREE_CODE (type) == INTEGER_TYPE)
2043 	{
2044 	  /* Don't warn about unsigned char y = 0xff, x = (int) y;  */
2045 	  expr = get_unwidened (expr, 0);
2046 	  expr_type = TREE_TYPE (expr);
2047 
2048 	  /* Don't warn for short y; short x = ((int)y & 0xff);  */
2049 	  if (TREE_CODE (expr) == BIT_AND_EXPR
2050 	      || TREE_CODE (expr) == BIT_IOR_EXPR
2051 	      || TREE_CODE (expr) == BIT_XOR_EXPR)
2052 	    {
2053 	      /* If both args were extended from a shortest type,
2054 		 use that type if that is safe.  */
2055 	      expr_type = shorten_binary_op (expr_type,
2056 					     TREE_OPERAND (expr, 0),
2057 					     TREE_OPERAND (expr, 1),
2058 					     /* bitwise */1);
2059 
2060 	      if (TREE_CODE (expr) == BIT_AND_EXPR)
2061 		{
2062 		  tree op0 = TREE_OPERAND (expr, 0);
2063 		  tree op1 = TREE_OPERAND (expr, 1);
2064 		  bool unsigned0 = TYPE_UNSIGNED (TREE_TYPE (op0));
2065 		  bool unsigned1 = TYPE_UNSIGNED (TREE_TYPE (op1));
2066 
2067 		  /* If one of the operands is a non-negative constant
2068 		     that fits in the target type, then the type of the
2069 		     other operand does not matter. */
2070 		  if ((TREE_CODE (op0) == INTEGER_CST
2071 		       && int_fits_type_p (op0, c_common_signed_type (type))
2072 		       && int_fits_type_p (op0, c_common_unsigned_type (type)))
2073 		      || (TREE_CODE (op1) == INTEGER_CST
2074 			  && int_fits_type_p (op1, c_common_signed_type (type))
2075 			  && int_fits_type_p (op1,
2076 					      c_common_unsigned_type (type))))
2077 		    return false;
2078 		  /* If constant is unsigned and fits in the target
2079 		     type, then the result will also fit.  */
2080 		  else if ((TREE_CODE (op0) == INTEGER_CST
2081 			    && unsigned0
2082 			    && int_fits_type_p (op0, type))
2083 			   || (TREE_CODE (op1) == INTEGER_CST
2084 			       && unsigned1
2085 			       && int_fits_type_p (op1, type)))
2086 		    return false;
2087 		}
2088 	    }
2089 	  /* Warn for integer types converted to smaller integer types.  */
2090 	  if (TYPE_PRECISION (type) < TYPE_PRECISION (expr_type))
2091 	    give_warning = true;
2092 
2093 	  /* When they are the same width but different signedness,
2094 	     then the value may change.  */
2095 	  else if (((TYPE_PRECISION (type) == TYPE_PRECISION (expr_type)
2096 		    && TYPE_UNSIGNED (expr_type) != TYPE_UNSIGNED (type))
2097 		   /* Even when converted to a bigger type, if the type is
2098 		      unsigned but expr is signed, then negative values
2099 		      will be changed.  */
2100 		    || (TYPE_UNSIGNED (type) && !TYPE_UNSIGNED (expr_type)))
2101 		   && produce_warns)
2102 	    warning_at (loc, OPT_Wsign_conversion, "conversion to %qT from %qT "
2103 			"may change the sign of the result",
2104 			type, expr_type);
2105 	}
2106 
2107       /* Warn for integer types converted to real types if and only if
2108 	 all the range of values of the integer type cannot be
2109 	 represented by the real type.  */
2110       else if (TREE_CODE (expr_type) == INTEGER_TYPE
2111 	       && TREE_CODE (type) == REAL_TYPE)
2112 	{
2113 	  tree type_low_bound, type_high_bound;
2114 	  REAL_VALUE_TYPE real_low_bound, real_high_bound;
2115 
2116 	  /* Don't warn about char y = 0xff; float x = (int) y;  */
2117 	  expr = get_unwidened (expr, 0);
2118 	  expr_type = TREE_TYPE (expr);
2119 
2120 	  type_low_bound = TYPE_MIN_VALUE (expr_type);
2121 	  type_high_bound = TYPE_MAX_VALUE (expr_type);
2122 	  real_low_bound = real_value_from_int_cst (0, type_low_bound);
2123 	  real_high_bound = real_value_from_int_cst (0, type_high_bound);
2124 
2125 	  if (!exact_real_truncate (TYPE_MODE (type), &real_low_bound)
2126 	      || !exact_real_truncate (TYPE_MODE (type), &real_high_bound))
2127 	    give_warning = true;
2128 	}
2129 
2130       /* Warn for real types converted to smaller real types.  */
2131       else if (TREE_CODE (expr_type) == REAL_TYPE
2132 	       && TREE_CODE (type) == REAL_TYPE
2133 	       && TYPE_PRECISION (type) < TYPE_PRECISION (expr_type))
2134 	give_warning = true;
2135     }
2136 
2137   return give_warning;
2138 }
2139 
2140 /* Warns if the conversion of EXPR to TYPE may alter a value.
2141    This is a helper function for warnings_for_convert_and_check.  */
2142 
2143 static void
2144 conversion_warning (tree type, tree expr)
2145 {
2146   tree expr_type = TREE_TYPE (expr);
2147   location_t loc = EXPR_LOC_OR_HERE (expr);
2148 
2149   if (!warn_conversion && !warn_sign_conversion)
2150     return;
2151 
2152   switch (TREE_CODE (expr))
2153     {
2154     case EQ_EXPR:
2155     case NE_EXPR:
2156     case LE_EXPR:
2157     case GE_EXPR:
2158     case LT_EXPR:
2159     case GT_EXPR:
2160     case TRUTH_ANDIF_EXPR:
2161     case TRUTH_ORIF_EXPR:
2162     case TRUTH_AND_EXPR:
2163     case TRUTH_OR_EXPR:
2164     case TRUTH_XOR_EXPR:
2165     case TRUTH_NOT_EXPR:
2166       /* Conversion from boolean to a signed:1 bit-field (which only
2167 	 can hold the values 0 and -1) doesn't lose information - but
2168 	 it does change the value.  */
2169       if (TYPE_PRECISION (type) == 1 && !TYPE_UNSIGNED (type))
2170 	warning_at (loc, OPT_Wconversion,
2171 		    "conversion to %qT from boolean expression", type);
2172       return;
2173 
2174     case REAL_CST:
2175     case INTEGER_CST:
2176       if (unsafe_conversion_p (type, expr, true))
2177 	warning_at (loc, OPT_Wconversion,
2178 		    "conversion to %qT alters %qT constant value",
2179 		    type, expr_type);
2180       return;
2181 
2182     case COND_EXPR:
2183       {
2184 	/* In case of COND_EXPR, if both operands are constants or
2185 	   COND_EXPR, then we do not care about the type of COND_EXPR,
2186 	   only about the conversion of each operand.  */
2187 	tree op1 = TREE_OPERAND (expr, 1);
2188 	tree op2 = TREE_OPERAND (expr, 2);
2189 
2190 	if ((TREE_CODE (op1) == REAL_CST || TREE_CODE (op1) == INTEGER_CST
2191 	     || TREE_CODE (op1) == COND_EXPR)
2192 	    && (TREE_CODE (op2) == REAL_CST || TREE_CODE (op2) == INTEGER_CST
2193 		|| TREE_CODE (op2) == COND_EXPR))
2194 	  {
2195 	    conversion_warning (type, op1);
2196 	    conversion_warning (type, op2);
2197 	    return;
2198 	  }
2199 	/* Fall through.  */
2200       }
2201 
2202     default: /* 'expr' is not a constant.  */
2203       if (unsafe_conversion_p (type, expr, true))
2204 	warning_at (loc, OPT_Wconversion,
2205 		    "conversion to %qT from %qT may alter its value",
2206 		    type, expr_type);
2207     }
2208 }
2209 
2210 /* Produce warnings after a conversion. RESULT is the result of
2211    converting EXPR to TYPE.  This is a helper function for
2212    convert_and_check and cp_convert_and_check.  */
2213 
2214 void
2215 warnings_for_convert_and_check (tree type, tree expr, tree result)
2216 {
2217   if (TREE_CODE (expr) == INTEGER_CST
2218       && (TREE_CODE (type) == INTEGER_TYPE
2219           || TREE_CODE (type) == ENUMERAL_TYPE)
2220       && !int_fits_type_p (expr, type))
2221     {
2222       /* Do not diagnose overflow in a constant expression merely
2223          because a conversion overflowed.  */
2224       if (TREE_OVERFLOW (result))
2225         TREE_OVERFLOW (result) = TREE_OVERFLOW (expr);
2226 
2227       if (TYPE_UNSIGNED (type))
2228         {
2229           /* This detects cases like converting -129 or 256 to
2230              unsigned char.  */
2231           if (!int_fits_type_p (expr, c_common_signed_type (type)))
2232             warning (OPT_Woverflow,
2233                      "large integer implicitly truncated to unsigned type");
2234           else
2235             conversion_warning (type, expr);
2236         }
2237       else if (!int_fits_type_p (expr, c_common_unsigned_type (type)))
2238 	warning (OPT_Woverflow,
2239 		 "overflow in implicit constant conversion");
2240       /* No warning for converting 0x80000000 to int.  */
2241       else if (pedantic
2242 	       && (TREE_CODE (TREE_TYPE (expr)) != INTEGER_TYPE
2243 		   || TYPE_PRECISION (TREE_TYPE (expr))
2244 		   != TYPE_PRECISION (type)))
2245 	warning (OPT_Woverflow,
2246 		 "overflow in implicit constant conversion");
2247 
2248       else
2249 	conversion_warning (type, expr);
2250     }
2251   else if ((TREE_CODE (result) == INTEGER_CST
2252 	    || TREE_CODE (result) == FIXED_CST) && TREE_OVERFLOW (result))
2253     warning (OPT_Woverflow,
2254              "overflow in implicit constant conversion");
2255   else
2256     conversion_warning (type, expr);
2257 }
2258 
2259 
2260 /* Convert EXPR to TYPE, warning about conversion problems with constants.
2261    Invoke this function on every expression that is converted implicitly,
2262    i.e. because of language rules and not because of an explicit cast.  */
2263 
2264 tree
2265 convert_and_check (tree type, tree expr)
2266 {
2267   tree result;
2268   tree expr_for_warning;
2269 
2270   /* Convert from a value with possible excess precision rather than
2271      via the semantic type, but do not warn about values not fitting
2272      exactly in the semantic type.  */
2273   if (TREE_CODE (expr) == EXCESS_PRECISION_EXPR)
2274     {
2275       tree orig_type = TREE_TYPE (expr);
2276       expr = TREE_OPERAND (expr, 0);
2277       expr_for_warning = convert (orig_type, expr);
2278       if (orig_type == type)
2279 	return expr_for_warning;
2280     }
2281   else
2282     expr_for_warning = expr;
2283 
2284   if (TREE_TYPE (expr) == type)
2285     return expr;
2286 
2287   result = convert (type, expr);
2288 
2289   if (c_inhibit_evaluation_warnings == 0
2290       && !TREE_OVERFLOW_P (expr)
2291       && result != error_mark_node)
2292     warnings_for_convert_and_check (type, expr_for_warning, result);
2293 
2294   return result;
2295 }
2296 
2297 /* A node in a list that describes references to variables (EXPR), which are
2298    either read accesses if WRITER is zero, or write accesses, in which case
2299    WRITER is the parent of EXPR.  */
2300 struct tlist
2301 {
2302   struct tlist *next;
2303   tree expr, writer;
2304 };
2305 
2306 /* Used to implement a cache the results of a call to verify_tree.  We only
2307    use this for SAVE_EXPRs.  */
2308 struct tlist_cache
2309 {
2310   struct tlist_cache *next;
2311   struct tlist *cache_before_sp;
2312   struct tlist *cache_after_sp;
2313   tree expr;
2314 };
2315 
2316 /* Obstack to use when allocating tlist structures, and corresponding
2317    firstobj.  */
2318 static struct obstack tlist_obstack;
2319 static char *tlist_firstobj = 0;
2320 
2321 /* Keep track of the identifiers we've warned about, so we can avoid duplicate
2322    warnings.  */
2323 static struct tlist *warned_ids;
2324 /* SAVE_EXPRs need special treatment.  We process them only once and then
2325    cache the results.  */
2326 static struct tlist_cache *save_expr_cache;
2327 
2328 static void add_tlist (struct tlist **, struct tlist *, tree, int);
2329 static void merge_tlist (struct tlist **, struct tlist *, int);
2330 static void verify_tree (tree, struct tlist **, struct tlist **, tree);
2331 static int warning_candidate_p (tree);
2332 static bool candidate_equal_p (const_tree, const_tree);
2333 static void warn_for_collisions (struct tlist *);
2334 static void warn_for_collisions_1 (tree, tree, struct tlist *, int);
2335 static struct tlist *new_tlist (struct tlist *, tree, tree);
2336 
2337 /* Create a new struct tlist and fill in its fields.  */
2338 static struct tlist *
2339 new_tlist (struct tlist *next, tree t, tree writer)
2340 {
2341   struct tlist *l;
2342   l = XOBNEW (&tlist_obstack, struct tlist);
2343   l->next = next;
2344   l->expr = t;
2345   l->writer = writer;
2346   return l;
2347 }
2348 
2349 /* Add duplicates of the nodes found in ADD to the list *TO.  If EXCLUDE_WRITER
2350    is nonnull, we ignore any node we find which has a writer equal to it.  */
2351 
2352 static void
2353 add_tlist (struct tlist **to, struct tlist *add, tree exclude_writer, int copy)
2354 {
2355   while (add)
2356     {
2357       struct tlist *next = add->next;
2358       if (!copy)
2359 	add->next = *to;
2360       if (!exclude_writer || !candidate_equal_p (add->writer, exclude_writer))
2361 	*to = copy ? new_tlist (*to, add->expr, add->writer) : add;
2362       add = next;
2363     }
2364 }
2365 
2366 /* Merge the nodes of ADD into TO.  This merging process is done so that for
2367    each variable that already exists in TO, no new node is added; however if
2368    there is a write access recorded in ADD, and an occurrence on TO is only
2369    a read access, then the occurrence in TO will be modified to record the
2370    write.  */
2371 
2372 static void
2373 merge_tlist (struct tlist **to, struct tlist *add, int copy)
2374 {
2375   struct tlist **end = to;
2376 
2377   while (*end)
2378     end = &(*end)->next;
2379 
2380   while (add)
2381     {
2382       int found = 0;
2383       struct tlist *tmp2;
2384       struct tlist *next = add->next;
2385 
2386       for (tmp2 = *to; tmp2; tmp2 = tmp2->next)
2387 	if (candidate_equal_p (tmp2->expr, add->expr))
2388 	  {
2389 	    found = 1;
2390 	    if (!tmp2->writer)
2391 	      tmp2->writer = add->writer;
2392 	  }
2393       if (!found)
2394 	{
2395 	  *end = copy ? add : new_tlist (NULL, add->expr, add->writer);
2396 	  end = &(*end)->next;
2397 	  *end = 0;
2398 	}
2399       add = next;
2400     }
2401 }
2402 
2403 /* WRITTEN is a variable, WRITER is its parent.  Warn if any of the variable
2404    references in list LIST conflict with it, excluding reads if ONLY writers
2405    is nonzero.  */
2406 
2407 static void
2408 warn_for_collisions_1 (tree written, tree writer, struct tlist *list,
2409 		       int only_writes)
2410 {
2411   struct tlist *tmp;
2412 
2413   /* Avoid duplicate warnings.  */
2414   for (tmp = warned_ids; tmp; tmp = tmp->next)
2415     if (candidate_equal_p (tmp->expr, written))
2416       return;
2417 
2418   while (list)
2419     {
2420       if (candidate_equal_p (list->expr, written)
2421 	  && !candidate_equal_p (list->writer, writer)
2422 	  && (!only_writes || list->writer))
2423 	{
2424 	  warned_ids = new_tlist (warned_ids, written, NULL_TREE);
2425 	  warning_at (EXPR_LOC_OR_HERE (writer),
2426 		      OPT_Wsequence_point, "operation on %qE may be undefined",
2427 		      list->expr);
2428 	}
2429       list = list->next;
2430     }
2431 }
2432 
2433 /* Given a list LIST of references to variables, find whether any of these
2434    can cause conflicts due to missing sequence points.  */
2435 
2436 static void
2437 warn_for_collisions (struct tlist *list)
2438 {
2439   struct tlist *tmp;
2440 
2441   for (tmp = list; tmp; tmp = tmp->next)
2442     {
2443       if (tmp->writer)
2444 	warn_for_collisions_1 (tmp->expr, tmp->writer, list, 0);
2445     }
2446 }
2447 
2448 /* Return nonzero if X is a tree that can be verified by the sequence point
2449    warnings.  */
2450 static int
2451 warning_candidate_p (tree x)
2452 {
2453   if (DECL_P (x) && DECL_ARTIFICIAL (x))
2454     return 0;
2455 
2456   if (TREE_CODE (x) == BLOCK)
2457     return 0;
2458 
2459   /* VOID_TYPE_P (TREE_TYPE (x)) is workaround for cp/tree.c
2460      (lvalue_p) crash on TRY/CATCH. */
2461   if (TREE_TYPE (x) == NULL_TREE || VOID_TYPE_P (TREE_TYPE (x)))
2462     return 0;
2463 
2464   if (!lvalue_p (x))
2465     return 0;
2466 
2467   /* No point to track non-const calls, they will never satisfy
2468      operand_equal_p.  */
2469   if (TREE_CODE (x) == CALL_EXPR && (call_expr_flags (x) & ECF_CONST) == 0)
2470     return 0;
2471 
2472   if (TREE_CODE (x) == STRING_CST)
2473     return 0;
2474 
2475   return 1;
2476 }
2477 
2478 /* Return nonzero if X and Y appear to be the same candidate (or NULL) */
2479 static bool
2480 candidate_equal_p (const_tree x, const_tree y)
2481 {
2482   return (x == y) || (x && y && operand_equal_p (x, y, 0));
2483 }
2484 
2485 /* Walk the tree X, and record accesses to variables.  If X is written by the
2486    parent tree, WRITER is the parent.
2487    We store accesses in one of the two lists: PBEFORE_SP, and PNO_SP.  If this
2488    expression or its only operand forces a sequence point, then everything up
2489    to the sequence point is stored in PBEFORE_SP.  Everything else gets stored
2490    in PNO_SP.
2491    Once we return, we will have emitted warnings if any subexpression before
2492    such a sequence point could be undefined.  On a higher level, however, the
2493    sequence point may not be relevant, and we'll merge the two lists.
2494 
2495    Example: (b++, a) + b;
2496    The call that processes the COMPOUND_EXPR will store the increment of B
2497    in PBEFORE_SP, and the use of A in PNO_SP.  The higher-level call that
2498    processes the PLUS_EXPR will need to merge the two lists so that
2499    eventually, all accesses end up on the same list (and we'll warn about the
2500    unordered subexpressions b++ and b.
2501 
2502    A note on merging.  If we modify the former example so that our expression
2503    becomes
2504      (b++, b) + a
2505    care must be taken not simply to add all three expressions into the final
2506    PNO_SP list.  The function merge_tlist takes care of that by merging the
2507    before-SP list of the COMPOUND_EXPR into its after-SP list in a special
2508    way, so that no more than one access to B is recorded.  */
2509 
2510 static void
2511 verify_tree (tree x, struct tlist **pbefore_sp, struct tlist **pno_sp,
2512 	     tree writer)
2513 {
2514   struct tlist *tmp_before, *tmp_nosp, *tmp_list2, *tmp_list3;
2515   enum tree_code code;
2516   enum tree_code_class cl;
2517 
2518   /* X may be NULL if it is the operand of an empty statement expression
2519      ({ }).  */
2520   if (x == NULL)
2521     return;
2522 
2523  restart:
2524   code = TREE_CODE (x);
2525   cl = TREE_CODE_CLASS (code);
2526 
2527   if (warning_candidate_p (x))
2528     *pno_sp = new_tlist (*pno_sp, x, writer);
2529 
2530   switch (code)
2531     {
2532     case CONSTRUCTOR:
2533       return;
2534 
2535     case COMPOUND_EXPR:
2536     case TRUTH_ANDIF_EXPR:
2537     case TRUTH_ORIF_EXPR:
2538       tmp_before = tmp_nosp = tmp_list3 = 0;
2539       verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_nosp, NULL_TREE);
2540       warn_for_collisions (tmp_nosp);
2541       merge_tlist (pbefore_sp, tmp_before, 0);
2542       merge_tlist (pbefore_sp, tmp_nosp, 0);
2543       verify_tree (TREE_OPERAND (x, 1), &tmp_list3, pno_sp, NULL_TREE);
2544       merge_tlist (pbefore_sp, tmp_list3, 0);
2545       return;
2546 
2547     case COND_EXPR:
2548       tmp_before = tmp_list2 = 0;
2549       verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_list2, NULL_TREE);
2550       warn_for_collisions (tmp_list2);
2551       merge_tlist (pbefore_sp, tmp_before, 0);
2552       merge_tlist (pbefore_sp, tmp_list2, 1);
2553 
2554       tmp_list3 = tmp_nosp = 0;
2555       verify_tree (TREE_OPERAND (x, 1), &tmp_list3, &tmp_nosp, NULL_TREE);
2556       warn_for_collisions (tmp_nosp);
2557       merge_tlist (pbefore_sp, tmp_list3, 0);
2558 
2559       tmp_list3 = tmp_list2 = 0;
2560       verify_tree (TREE_OPERAND (x, 2), &tmp_list3, &tmp_list2, NULL_TREE);
2561       warn_for_collisions (tmp_list2);
2562       merge_tlist (pbefore_sp, tmp_list3, 0);
2563       /* Rather than add both tmp_nosp and tmp_list2, we have to merge the
2564 	 two first, to avoid warning for (a ? b++ : b++).  */
2565       merge_tlist (&tmp_nosp, tmp_list2, 0);
2566       add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
2567       return;
2568 
2569     case PREDECREMENT_EXPR:
2570     case PREINCREMENT_EXPR:
2571     case POSTDECREMENT_EXPR:
2572     case POSTINCREMENT_EXPR:
2573       verify_tree (TREE_OPERAND (x, 0), pno_sp, pno_sp, x);
2574       return;
2575 
2576     case MODIFY_EXPR:
2577       tmp_before = tmp_nosp = tmp_list3 = 0;
2578       verify_tree (TREE_OPERAND (x, 1), &tmp_before, &tmp_nosp, NULL_TREE);
2579       verify_tree (TREE_OPERAND (x, 0), &tmp_list3, &tmp_list3, x);
2580       /* Expressions inside the LHS are not ordered wrt. the sequence points
2581 	 in the RHS.  Example:
2582 	   *a = (a++, 2)
2583 	 Despite the fact that the modification of "a" is in the before_sp
2584 	 list (tmp_before), it conflicts with the use of "a" in the LHS.
2585 	 We can handle this by adding the contents of tmp_list3
2586 	 to those of tmp_before, and redoing the collision warnings for that
2587 	 list.  */
2588       add_tlist (&tmp_before, tmp_list3, x, 1);
2589       warn_for_collisions (tmp_before);
2590       /* Exclude the LHS itself here; we first have to merge it into the
2591 	 tmp_nosp list.  This is done to avoid warning for "a = a"; if we
2592 	 didn't exclude the LHS, we'd get it twice, once as a read and once
2593 	 as a write.  */
2594       add_tlist (pno_sp, tmp_list3, x, 0);
2595       warn_for_collisions_1 (TREE_OPERAND (x, 0), x, tmp_nosp, 1);
2596 
2597       merge_tlist (pbefore_sp, tmp_before, 0);
2598       if (warning_candidate_p (TREE_OPERAND (x, 0)))
2599 	merge_tlist (&tmp_nosp, new_tlist (NULL, TREE_OPERAND (x, 0), x), 0);
2600       add_tlist (pno_sp, tmp_nosp, NULL_TREE, 1);
2601       return;
2602 
2603     case CALL_EXPR:
2604       /* We need to warn about conflicts among arguments and conflicts between
2605 	 args and the function address.  Side effects of the function address,
2606 	 however, are not ordered by the sequence point of the call.  */
2607       {
2608 	call_expr_arg_iterator iter;
2609 	tree arg;
2610 	tmp_before = tmp_nosp = 0;
2611 	verify_tree (CALL_EXPR_FN (x), &tmp_before, &tmp_nosp, NULL_TREE);
2612 	FOR_EACH_CALL_EXPR_ARG (arg, iter, x)
2613 	  {
2614 	    tmp_list2 = tmp_list3 = 0;
2615 	    verify_tree (arg, &tmp_list2, &tmp_list3, NULL_TREE);
2616 	    merge_tlist (&tmp_list3, tmp_list2, 0);
2617 	    add_tlist (&tmp_before, tmp_list3, NULL_TREE, 0);
2618 	  }
2619 	add_tlist (&tmp_before, tmp_nosp, NULL_TREE, 0);
2620 	warn_for_collisions (tmp_before);
2621 	add_tlist (pbefore_sp, tmp_before, NULL_TREE, 0);
2622 	return;
2623       }
2624 
2625     case TREE_LIST:
2626       /* Scan all the list, e.g. indices of multi dimensional array.  */
2627       while (x)
2628 	{
2629 	  tmp_before = tmp_nosp = 0;
2630 	  verify_tree (TREE_VALUE (x), &tmp_before, &tmp_nosp, NULL_TREE);
2631 	  merge_tlist (&tmp_nosp, tmp_before, 0);
2632 	  add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
2633 	  x = TREE_CHAIN (x);
2634 	}
2635       return;
2636 
2637     case SAVE_EXPR:
2638       {
2639 	struct tlist_cache *t;
2640 	for (t = save_expr_cache; t; t = t->next)
2641 	  if (candidate_equal_p (t->expr, x))
2642 	    break;
2643 
2644 	if (!t)
2645 	  {
2646 	    t = XOBNEW (&tlist_obstack, struct tlist_cache);
2647 	    t->next = save_expr_cache;
2648 	    t->expr = x;
2649 	    save_expr_cache = t;
2650 
2651 	    tmp_before = tmp_nosp = 0;
2652 	    verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_nosp, NULL_TREE);
2653 	    warn_for_collisions (tmp_nosp);
2654 
2655 	    tmp_list3 = 0;
2656 	    while (tmp_nosp)
2657 	      {
2658 		struct tlist *t = tmp_nosp;
2659 		tmp_nosp = t->next;
2660 		merge_tlist (&tmp_list3, t, 0);
2661 	      }
2662 	    t->cache_before_sp = tmp_before;
2663 	    t->cache_after_sp = tmp_list3;
2664 	  }
2665 	merge_tlist (pbefore_sp, t->cache_before_sp, 1);
2666 	add_tlist (pno_sp, t->cache_after_sp, NULL_TREE, 1);
2667 	return;
2668       }
2669 
2670     case ADDR_EXPR:
2671       x = TREE_OPERAND (x, 0);
2672       if (DECL_P (x))
2673 	return;
2674       writer = 0;
2675       goto restart;
2676 
2677     default:
2678       /* For other expressions, simply recurse on their operands.
2679 	 Manual tail recursion for unary expressions.
2680 	 Other non-expressions need not be processed.  */
2681       if (cl == tcc_unary)
2682 	{
2683 	  x = TREE_OPERAND (x, 0);
2684 	  writer = 0;
2685 	  goto restart;
2686 	}
2687       else if (IS_EXPR_CODE_CLASS (cl))
2688 	{
2689 	  int lp;
2690 	  int max = TREE_OPERAND_LENGTH (x);
2691 	  for (lp = 0; lp < max; lp++)
2692 	    {
2693 	      tmp_before = tmp_nosp = 0;
2694 	      verify_tree (TREE_OPERAND (x, lp), &tmp_before, &tmp_nosp, 0);
2695 	      merge_tlist (&tmp_nosp, tmp_before, 0);
2696 	      add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
2697 	    }
2698 	}
2699       return;
2700     }
2701 }
2702 
2703 /* Try to warn for undefined behavior in EXPR due to missing sequence
2704    points.  */
2705 
2706 DEBUG_FUNCTION void
2707 verify_sequence_points (tree expr)
2708 {
2709   struct tlist *before_sp = 0, *after_sp = 0;
2710 
2711   warned_ids = 0;
2712   save_expr_cache = 0;
2713   if (tlist_firstobj == 0)
2714     {
2715       gcc_obstack_init (&tlist_obstack);
2716       tlist_firstobj = (char *) obstack_alloc (&tlist_obstack, 0);
2717     }
2718 
2719   verify_tree (expr, &before_sp, &after_sp, 0);
2720   warn_for_collisions (after_sp);
2721   obstack_free (&tlist_obstack, tlist_firstobj);
2722 }
2723 
2724 /* Validate the expression after `case' and apply default promotions.  */
2725 
2726 static tree
2727 check_case_value (tree value)
2728 {
2729   if (value == NULL_TREE)
2730     return value;
2731 
2732   if (TREE_CODE (value) == INTEGER_CST)
2733     /* Promote char or short to int.  */
2734     value = perform_integral_promotions (value);
2735   else if (value != error_mark_node)
2736     {
2737       error ("case label does not reduce to an integer constant");
2738       value = error_mark_node;
2739     }
2740 
2741   constant_expression_warning (value);
2742 
2743   return value;
2744 }
2745 
2746 /* See if the case values LOW and HIGH are in the range of the original
2747    type (i.e. before the default conversion to int) of the switch testing
2748    expression.
2749    TYPE is the promoted type of the testing expression, and ORIG_TYPE is
2750    the type before promoting it.  CASE_LOW_P is a pointer to the lower
2751    bound of the case label, and CASE_HIGH_P is the upper bound or NULL
2752    if the case is not a case range.
2753    The caller has to make sure that we are not called with NULL for
2754    CASE_LOW_P (i.e. the default case).
2755    Returns true if the case label is in range of ORIG_TYPE (saturated or
2756    untouched) or false if the label is out of range.  */
2757 
2758 static bool
2759 check_case_bounds (tree type, tree orig_type,
2760 		   tree *case_low_p, tree *case_high_p)
2761 {
2762   tree min_value, max_value;
2763   tree case_low = *case_low_p;
2764   tree case_high = case_high_p ? *case_high_p : case_low;
2765 
2766   /* If there was a problem with the original type, do nothing.  */
2767   if (orig_type == error_mark_node)
2768     return true;
2769 
2770   min_value = TYPE_MIN_VALUE (orig_type);
2771   max_value = TYPE_MAX_VALUE (orig_type);
2772 
2773   /* Case label is less than minimum for type.  */
2774   if (tree_int_cst_compare (case_low, min_value) < 0
2775       && tree_int_cst_compare (case_high, min_value) < 0)
2776     {
2777       warning (0, "case label value is less than minimum value for type");
2778       return false;
2779     }
2780 
2781   /* Case value is greater than maximum for type.  */
2782   if (tree_int_cst_compare (case_low, max_value) > 0
2783       && tree_int_cst_compare (case_high, max_value) > 0)
2784     {
2785       warning (0, "case label value exceeds maximum value for type");
2786       return false;
2787     }
2788 
2789   /* Saturate lower case label value to minimum.  */
2790   if (tree_int_cst_compare (case_high, min_value) >= 0
2791       && tree_int_cst_compare (case_low, min_value) < 0)
2792     {
2793       warning (0, "lower value in case label range"
2794 	       " less than minimum value for type");
2795       case_low = min_value;
2796     }
2797 
2798   /* Saturate upper case label value to maximum.  */
2799   if (tree_int_cst_compare (case_low, max_value) <= 0
2800       && tree_int_cst_compare (case_high, max_value) > 0)
2801     {
2802       warning (0, "upper value in case label range"
2803 	       " exceeds maximum value for type");
2804       case_high = max_value;
2805     }
2806 
2807   if (*case_low_p != case_low)
2808     *case_low_p = convert (type, case_low);
2809   if (case_high_p && *case_high_p != case_high)
2810     *case_high_p = convert (type, case_high);
2811 
2812   return true;
2813 }
2814 
2815 /* Return an integer type with BITS bits of precision,
2816    that is unsigned if UNSIGNEDP is nonzero, otherwise signed.  */
2817 
2818 tree
2819 c_common_type_for_size (unsigned int bits, int unsignedp)
2820 {
2821   if (bits == TYPE_PRECISION (integer_type_node))
2822     return unsignedp ? unsigned_type_node : integer_type_node;
2823 
2824   if (bits == TYPE_PRECISION (signed_char_type_node))
2825     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
2826 
2827   if (bits == TYPE_PRECISION (short_integer_type_node))
2828     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
2829 
2830   if (bits == TYPE_PRECISION (long_integer_type_node))
2831     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
2832 
2833   if (bits == TYPE_PRECISION (long_long_integer_type_node))
2834     return (unsignedp ? long_long_unsigned_type_node
2835 	    : long_long_integer_type_node);
2836 
2837   if (int128_integer_type_node
2838       && bits == TYPE_PRECISION (int128_integer_type_node))
2839     return (unsignedp ? int128_unsigned_type_node
2840 	    : int128_integer_type_node);
2841 
2842   if (bits == TYPE_PRECISION (widest_integer_literal_type_node))
2843     return (unsignedp ? widest_unsigned_literal_type_node
2844 	    : widest_integer_literal_type_node);
2845 
2846   if (bits <= TYPE_PRECISION (intQI_type_node))
2847     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
2848 
2849   if (bits <= TYPE_PRECISION (intHI_type_node))
2850     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
2851 
2852   if (bits <= TYPE_PRECISION (intSI_type_node))
2853     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
2854 
2855   if (bits <= TYPE_PRECISION (intDI_type_node))
2856     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
2857 
2858   return 0;
2859 }
2860 
2861 /* Return a fixed-point type that has at least IBIT ibits and FBIT fbits
2862    that is unsigned if UNSIGNEDP is nonzero, otherwise signed;
2863    and saturating if SATP is nonzero, otherwise not saturating.  */
2864 
2865 tree
2866 c_common_fixed_point_type_for_size (unsigned int ibit, unsigned int fbit,
2867 				    int unsignedp, int satp)
2868 {
2869   enum machine_mode mode;
2870   if (ibit == 0)
2871     mode = unsignedp ? UQQmode : QQmode;
2872   else
2873     mode = unsignedp ? UHAmode : HAmode;
2874 
2875   for (; mode != VOIDmode; mode = GET_MODE_WIDER_MODE (mode))
2876     if (GET_MODE_IBIT (mode) >= ibit && GET_MODE_FBIT (mode) >= fbit)
2877       break;
2878 
2879   if (mode == VOIDmode || !targetm.scalar_mode_supported_p (mode))
2880     {
2881       sorry ("GCC cannot support operators with integer types and "
2882 	     "fixed-point types that have too many integral and "
2883 	     "fractional bits together");
2884       return 0;
2885     }
2886 
2887   return c_common_type_for_mode (mode, satp);
2888 }
2889 
2890 /* Used for communication between c_common_type_for_mode and
2891    c_register_builtin_type.  */
2892 static GTY(()) tree registered_builtin_types;
2893 
2894 /* Return a data type that has machine mode MODE.
2895    If the mode is an integer,
2896    then UNSIGNEDP selects between signed and unsigned types.
2897    If the mode is a fixed-point mode,
2898    then UNSIGNEDP selects between saturating and nonsaturating types.  */
2899 
2900 tree
2901 c_common_type_for_mode (enum machine_mode mode, int unsignedp)
2902 {
2903   tree t;
2904 
2905   if (mode == TYPE_MODE (integer_type_node))
2906     return unsignedp ? unsigned_type_node : integer_type_node;
2907 
2908   if (mode == TYPE_MODE (signed_char_type_node))
2909     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
2910 
2911   if (mode == TYPE_MODE (short_integer_type_node))
2912     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
2913 
2914   if (mode == TYPE_MODE (long_integer_type_node))
2915     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
2916 
2917   if (mode == TYPE_MODE (long_long_integer_type_node))
2918     return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node;
2919 
2920   if (int128_integer_type_node
2921       && mode == TYPE_MODE (int128_integer_type_node))
2922     return unsignedp ? int128_unsigned_type_node : int128_integer_type_node;
2923 
2924   if (mode == TYPE_MODE (widest_integer_literal_type_node))
2925     return unsignedp ? widest_unsigned_literal_type_node
2926 		     : widest_integer_literal_type_node;
2927 
2928   if (mode == QImode)
2929     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
2930 
2931   if (mode == HImode)
2932     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
2933 
2934   if (mode == SImode)
2935     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
2936 
2937   if (mode == DImode)
2938     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
2939 
2940 #if HOST_BITS_PER_WIDE_INT >= 64
2941   if (mode == TYPE_MODE (intTI_type_node))
2942     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
2943 #endif
2944 
2945   if (mode == TYPE_MODE (float_type_node))
2946     return float_type_node;
2947 
2948   if (mode == TYPE_MODE (double_type_node))
2949     return double_type_node;
2950 
2951   if (mode == TYPE_MODE (long_double_type_node))
2952     return long_double_type_node;
2953 
2954   if (mode == TYPE_MODE (void_type_node))
2955     return void_type_node;
2956 
2957   if (mode == TYPE_MODE (build_pointer_type (char_type_node)))
2958     return (unsignedp
2959 	    ? make_unsigned_type (GET_MODE_PRECISION (mode))
2960 	    : make_signed_type (GET_MODE_PRECISION (mode)));
2961 
2962   if (mode == TYPE_MODE (build_pointer_type (integer_type_node)))
2963     return (unsignedp
2964 	    ? make_unsigned_type (GET_MODE_PRECISION (mode))
2965 	    : make_signed_type (GET_MODE_PRECISION (mode)));
2966 
2967   if (COMPLEX_MODE_P (mode))
2968     {
2969       enum machine_mode inner_mode;
2970       tree inner_type;
2971 
2972       if (mode == TYPE_MODE (complex_float_type_node))
2973 	return complex_float_type_node;
2974       if (mode == TYPE_MODE (complex_double_type_node))
2975 	return complex_double_type_node;
2976       if (mode == TYPE_MODE (complex_long_double_type_node))
2977 	return complex_long_double_type_node;
2978 
2979       if (mode == TYPE_MODE (complex_integer_type_node) && !unsignedp)
2980 	return complex_integer_type_node;
2981 
2982       inner_mode = GET_MODE_INNER (mode);
2983       inner_type = c_common_type_for_mode (inner_mode, unsignedp);
2984       if (inner_type != NULL_TREE)
2985 	return build_complex_type (inner_type);
2986     }
2987   else if (VECTOR_MODE_P (mode))
2988     {
2989       enum machine_mode inner_mode = GET_MODE_INNER (mode);
2990       tree inner_type = c_common_type_for_mode (inner_mode, unsignedp);
2991       if (inner_type != NULL_TREE)
2992 	return build_vector_type_for_mode (inner_type, mode);
2993     }
2994 
2995   if (mode == TYPE_MODE (dfloat32_type_node))
2996     return dfloat32_type_node;
2997   if (mode == TYPE_MODE (dfloat64_type_node))
2998     return dfloat64_type_node;
2999   if (mode == TYPE_MODE (dfloat128_type_node))
3000     return dfloat128_type_node;
3001 
3002   if (ALL_SCALAR_FIXED_POINT_MODE_P (mode))
3003     {
3004       if (mode == TYPE_MODE (short_fract_type_node))
3005 	return unsignedp ? sat_short_fract_type_node : short_fract_type_node;
3006       if (mode == TYPE_MODE (fract_type_node))
3007 	return unsignedp ? sat_fract_type_node : fract_type_node;
3008       if (mode == TYPE_MODE (long_fract_type_node))
3009 	return unsignedp ? sat_long_fract_type_node : long_fract_type_node;
3010       if (mode == TYPE_MODE (long_long_fract_type_node))
3011 	return unsignedp ? sat_long_long_fract_type_node
3012 			 : long_long_fract_type_node;
3013 
3014       if (mode == TYPE_MODE (unsigned_short_fract_type_node))
3015 	return unsignedp ? sat_unsigned_short_fract_type_node
3016 			 : unsigned_short_fract_type_node;
3017       if (mode == TYPE_MODE (unsigned_fract_type_node))
3018 	return unsignedp ? sat_unsigned_fract_type_node
3019 			 : unsigned_fract_type_node;
3020       if (mode == TYPE_MODE (unsigned_long_fract_type_node))
3021 	return unsignedp ? sat_unsigned_long_fract_type_node
3022 			 : unsigned_long_fract_type_node;
3023       if (mode == TYPE_MODE (unsigned_long_long_fract_type_node))
3024 	return unsignedp ? sat_unsigned_long_long_fract_type_node
3025 			 : unsigned_long_long_fract_type_node;
3026 
3027       if (mode == TYPE_MODE (short_accum_type_node))
3028 	return unsignedp ? sat_short_accum_type_node : short_accum_type_node;
3029       if (mode == TYPE_MODE (accum_type_node))
3030 	return unsignedp ? sat_accum_type_node : accum_type_node;
3031       if (mode == TYPE_MODE (long_accum_type_node))
3032 	return unsignedp ? sat_long_accum_type_node : long_accum_type_node;
3033       if (mode == TYPE_MODE (long_long_accum_type_node))
3034 	return unsignedp ? sat_long_long_accum_type_node
3035 			 : long_long_accum_type_node;
3036 
3037       if (mode == TYPE_MODE (unsigned_short_accum_type_node))
3038 	return unsignedp ? sat_unsigned_short_accum_type_node
3039 			 : unsigned_short_accum_type_node;
3040       if (mode == TYPE_MODE (unsigned_accum_type_node))
3041 	return unsignedp ? sat_unsigned_accum_type_node
3042 			 : unsigned_accum_type_node;
3043       if (mode == TYPE_MODE (unsigned_long_accum_type_node))
3044 	return unsignedp ? sat_unsigned_long_accum_type_node
3045 			 : unsigned_long_accum_type_node;
3046       if (mode == TYPE_MODE (unsigned_long_long_accum_type_node))
3047 	return unsignedp ? sat_unsigned_long_long_accum_type_node
3048 			 : unsigned_long_long_accum_type_node;
3049 
3050       if (mode == QQmode)
3051 	return unsignedp ? sat_qq_type_node : qq_type_node;
3052       if (mode == HQmode)
3053 	return unsignedp ? sat_hq_type_node : hq_type_node;
3054       if (mode == SQmode)
3055 	return unsignedp ? sat_sq_type_node : sq_type_node;
3056       if (mode == DQmode)
3057 	return unsignedp ? sat_dq_type_node : dq_type_node;
3058       if (mode == TQmode)
3059 	return unsignedp ? sat_tq_type_node : tq_type_node;
3060 
3061       if (mode == UQQmode)
3062 	return unsignedp ? sat_uqq_type_node : uqq_type_node;
3063       if (mode == UHQmode)
3064 	return unsignedp ? sat_uhq_type_node : uhq_type_node;
3065       if (mode == USQmode)
3066 	return unsignedp ? sat_usq_type_node : usq_type_node;
3067       if (mode == UDQmode)
3068 	return unsignedp ? sat_udq_type_node : udq_type_node;
3069       if (mode == UTQmode)
3070 	return unsignedp ? sat_utq_type_node : utq_type_node;
3071 
3072       if (mode == HAmode)
3073 	return unsignedp ? sat_ha_type_node : ha_type_node;
3074       if (mode == SAmode)
3075 	return unsignedp ? sat_sa_type_node : sa_type_node;
3076       if (mode == DAmode)
3077 	return unsignedp ? sat_da_type_node : da_type_node;
3078       if (mode == TAmode)
3079 	return unsignedp ? sat_ta_type_node : ta_type_node;
3080 
3081       if (mode == UHAmode)
3082 	return unsignedp ? sat_uha_type_node : uha_type_node;
3083       if (mode == USAmode)
3084 	return unsignedp ? sat_usa_type_node : usa_type_node;
3085       if (mode == UDAmode)
3086 	return unsignedp ? sat_uda_type_node : uda_type_node;
3087       if (mode == UTAmode)
3088 	return unsignedp ? sat_uta_type_node : uta_type_node;
3089     }
3090 
3091   for (t = registered_builtin_types; t; t = TREE_CHAIN (t))
3092     if (TYPE_MODE (TREE_VALUE (t)) == mode
3093 	&& !!unsignedp == !!TYPE_UNSIGNED (TREE_VALUE (t)))
3094       return TREE_VALUE (t);
3095 
3096   return 0;
3097 }
3098 
3099 tree
3100 c_common_unsigned_type (tree type)
3101 {
3102   return c_common_signed_or_unsigned_type (1, type);
3103 }
3104 
3105 /* Return a signed type the same as TYPE in other respects.  */
3106 
3107 tree
3108 c_common_signed_type (tree type)
3109 {
3110   return c_common_signed_or_unsigned_type (0, type);
3111 }
3112 
3113 /* Return a type the same as TYPE except unsigned or
3114    signed according to UNSIGNEDP.  */
3115 
3116 tree
3117 c_common_signed_or_unsigned_type (int unsignedp, tree type)
3118 {
3119   tree type1;
3120 
3121   /* This block of code emulates the behavior of the old
3122      c_common_unsigned_type. In particular, it returns
3123      long_unsigned_type_node if passed a long, even when a int would
3124      have the same size. This is necessary for warnings to work
3125      correctly in archs where sizeof(int) == sizeof(long) */
3126 
3127   type1 = TYPE_MAIN_VARIANT (type);
3128   if (type1 == signed_char_type_node || type1 == char_type_node || type1 == unsigned_char_type_node)
3129     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
3130   if (type1 == integer_type_node || type1 == unsigned_type_node)
3131     return unsignedp ? unsigned_type_node : integer_type_node;
3132   if (type1 == short_integer_type_node || type1 == short_unsigned_type_node)
3133     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
3134   if (type1 == long_integer_type_node || type1 == long_unsigned_type_node)
3135     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
3136   if (type1 == long_long_integer_type_node || type1 == long_long_unsigned_type_node)
3137     return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node;
3138   if (int128_integer_type_node
3139       && (type1 == int128_integer_type_node
3140 	  || type1 == int128_unsigned_type_node))
3141     return unsignedp ? int128_unsigned_type_node : int128_integer_type_node;
3142   if (type1 == widest_integer_literal_type_node || type1 == widest_unsigned_literal_type_node)
3143     return unsignedp ? widest_unsigned_literal_type_node : widest_integer_literal_type_node;
3144 #if HOST_BITS_PER_WIDE_INT >= 64
3145   if (type1 == intTI_type_node || type1 == unsigned_intTI_type_node)
3146     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
3147 #endif
3148   if (type1 == intDI_type_node || type1 == unsigned_intDI_type_node)
3149     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
3150   if (type1 == intSI_type_node || type1 == unsigned_intSI_type_node)
3151     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
3152   if (type1 == intHI_type_node || type1 == unsigned_intHI_type_node)
3153     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
3154   if (type1 == intQI_type_node || type1 == unsigned_intQI_type_node)
3155     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
3156 
3157 #define C_COMMON_FIXED_TYPES(NAME)	    \
3158   if (type1 == short_ ## NAME ## _type_node \
3159       || type1 == unsigned_short_ ## NAME ## _type_node) \
3160     return unsignedp ? unsigned_short_ ## NAME ## _type_node \
3161 		     : short_ ## NAME ## _type_node; \
3162   if (type1 == NAME ## _type_node \
3163       || type1 == unsigned_ ## NAME ## _type_node) \
3164     return unsignedp ? unsigned_ ## NAME ## _type_node \
3165 		     : NAME ## _type_node; \
3166   if (type1 == long_ ## NAME ## _type_node \
3167       || type1 == unsigned_long_ ## NAME ## _type_node) \
3168     return unsignedp ? unsigned_long_ ## NAME ## _type_node \
3169 		     : long_ ## NAME ## _type_node; \
3170   if (type1 == long_long_ ## NAME ## _type_node \
3171       || type1 == unsigned_long_long_ ## NAME ## _type_node) \
3172     return unsignedp ? unsigned_long_long_ ## NAME ## _type_node \
3173 		     : long_long_ ## NAME ## _type_node;
3174 
3175 #define C_COMMON_FIXED_MODE_TYPES(NAME) \
3176   if (type1 == NAME ## _type_node \
3177       || type1 == u ## NAME ## _type_node) \
3178     return unsignedp ? u ## NAME ## _type_node \
3179 		     : NAME ## _type_node;
3180 
3181 #define C_COMMON_FIXED_TYPES_SAT(NAME) \
3182   if (type1 == sat_ ## short_ ## NAME ## _type_node \
3183       || type1 == sat_ ## unsigned_short_ ## NAME ## _type_node) \
3184     return unsignedp ? sat_ ## unsigned_short_ ## NAME ## _type_node \
3185 		     : sat_ ## short_ ## NAME ## _type_node; \
3186   if (type1 == sat_ ## NAME ## _type_node \
3187       || type1 == sat_ ## unsigned_ ## NAME ## _type_node) \
3188     return unsignedp ? sat_ ## unsigned_ ## NAME ## _type_node \
3189 		     : sat_ ## NAME ## _type_node; \
3190   if (type1 == sat_ ## long_ ## NAME ## _type_node \
3191       || type1 == sat_ ## unsigned_long_ ## NAME ## _type_node) \
3192     return unsignedp ? sat_ ## unsigned_long_ ## NAME ## _type_node \
3193 		     : sat_ ## long_ ## NAME ## _type_node; \
3194   if (type1 == sat_ ## long_long_ ## NAME ## _type_node \
3195       || type1 == sat_ ## unsigned_long_long_ ## NAME ## _type_node) \
3196     return unsignedp ? sat_ ## unsigned_long_long_ ## NAME ## _type_node \
3197 		     : sat_ ## long_long_ ## NAME ## _type_node;
3198 
3199 #define C_COMMON_FIXED_MODE_TYPES_SAT(NAME)	\
3200   if (type1 == sat_ ## NAME ## _type_node \
3201       || type1 == sat_ ## u ## NAME ## _type_node) \
3202     return unsignedp ? sat_ ## u ## NAME ## _type_node \
3203 		     : sat_ ## NAME ## _type_node;
3204 
3205   C_COMMON_FIXED_TYPES (fract);
3206   C_COMMON_FIXED_TYPES_SAT (fract);
3207   C_COMMON_FIXED_TYPES (accum);
3208   C_COMMON_FIXED_TYPES_SAT (accum);
3209 
3210   C_COMMON_FIXED_MODE_TYPES (qq);
3211   C_COMMON_FIXED_MODE_TYPES (hq);
3212   C_COMMON_FIXED_MODE_TYPES (sq);
3213   C_COMMON_FIXED_MODE_TYPES (dq);
3214   C_COMMON_FIXED_MODE_TYPES (tq);
3215   C_COMMON_FIXED_MODE_TYPES_SAT (qq);
3216   C_COMMON_FIXED_MODE_TYPES_SAT (hq);
3217   C_COMMON_FIXED_MODE_TYPES_SAT (sq);
3218   C_COMMON_FIXED_MODE_TYPES_SAT (dq);
3219   C_COMMON_FIXED_MODE_TYPES_SAT (tq);
3220   C_COMMON_FIXED_MODE_TYPES (ha);
3221   C_COMMON_FIXED_MODE_TYPES (sa);
3222   C_COMMON_FIXED_MODE_TYPES (da);
3223   C_COMMON_FIXED_MODE_TYPES (ta);
3224   C_COMMON_FIXED_MODE_TYPES_SAT (ha);
3225   C_COMMON_FIXED_MODE_TYPES_SAT (sa);
3226   C_COMMON_FIXED_MODE_TYPES_SAT (da);
3227   C_COMMON_FIXED_MODE_TYPES_SAT (ta);
3228 
3229   /* For ENUMERAL_TYPEs in C++, must check the mode of the types, not
3230      the precision; they have precision set to match their range, but
3231      may use a wider mode to match an ABI.  If we change modes, we may
3232      wind up with bad conversions.  For INTEGER_TYPEs in C, must check
3233      the precision as well, so as to yield correct results for
3234      bit-field types.  C++ does not have these separate bit-field
3235      types, and producing a signed or unsigned variant of an
3236      ENUMERAL_TYPE may cause other problems as well.  */
3237 
3238   if (!INTEGRAL_TYPE_P (type)
3239       || TYPE_UNSIGNED (type) == unsignedp)
3240     return type;
3241 
3242 #define TYPE_OK(node)							    \
3243   (TYPE_MODE (type) == TYPE_MODE (node)					    \
3244    && TYPE_PRECISION (type) == TYPE_PRECISION (node))
3245   if (TYPE_OK (signed_char_type_node))
3246     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
3247   if (TYPE_OK (integer_type_node))
3248     return unsignedp ? unsigned_type_node : integer_type_node;
3249   if (TYPE_OK (short_integer_type_node))
3250     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
3251   if (TYPE_OK (long_integer_type_node))
3252     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
3253   if (TYPE_OK (long_long_integer_type_node))
3254     return (unsignedp ? long_long_unsigned_type_node
3255 	    : long_long_integer_type_node);
3256   if (int128_integer_type_node && TYPE_OK (int128_integer_type_node))
3257     return (unsignedp ? int128_unsigned_type_node
3258 	    : int128_integer_type_node);
3259   if (TYPE_OK (widest_integer_literal_type_node))
3260     return (unsignedp ? widest_unsigned_literal_type_node
3261 	    : widest_integer_literal_type_node);
3262 
3263 #if HOST_BITS_PER_WIDE_INT >= 64
3264   if (TYPE_OK (intTI_type_node))
3265     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
3266 #endif
3267   if (TYPE_OK (intDI_type_node))
3268     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
3269   if (TYPE_OK (intSI_type_node))
3270     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
3271   if (TYPE_OK (intHI_type_node))
3272     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
3273   if (TYPE_OK (intQI_type_node))
3274     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
3275 #undef TYPE_OK
3276 
3277   return build_nonstandard_integer_type (TYPE_PRECISION (type), unsignedp);
3278 }
3279 
3280 /* Build a bit-field integer type for the given WIDTH and UNSIGNEDP.  */
3281 
3282 tree
3283 c_build_bitfield_integer_type (unsigned HOST_WIDE_INT width, int unsignedp)
3284 {
3285   /* Extended integer types of the same width as a standard type have
3286      lesser rank, so those of the same width as int promote to int or
3287      unsigned int and are valid for printf formats expecting int or
3288      unsigned int.  To avoid such special cases, avoid creating
3289      extended integer types for bit-fields if a standard integer type
3290      is available.  */
3291   if (width == TYPE_PRECISION (integer_type_node))
3292     return unsignedp ? unsigned_type_node : integer_type_node;
3293   if (width == TYPE_PRECISION (signed_char_type_node))
3294     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
3295   if (width == TYPE_PRECISION (short_integer_type_node))
3296     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
3297   if (width == TYPE_PRECISION (long_integer_type_node))
3298     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
3299   if (width == TYPE_PRECISION (long_long_integer_type_node))
3300     return (unsignedp ? long_long_unsigned_type_node
3301 	    : long_long_integer_type_node);
3302   if (int128_integer_type_node
3303       && width == TYPE_PRECISION (int128_integer_type_node))
3304     return (unsignedp ? int128_unsigned_type_node
3305 	    : int128_integer_type_node);
3306   return build_nonstandard_integer_type (width, unsignedp);
3307 }
3308 
3309 /* The C version of the register_builtin_type langhook.  */
3310 
3311 void
3312 c_register_builtin_type (tree type, const char* name)
3313 {
3314   tree decl;
3315 
3316   decl = build_decl (UNKNOWN_LOCATION,
3317 		     TYPE_DECL, get_identifier (name), type);
3318   DECL_ARTIFICIAL (decl) = 1;
3319   if (!TYPE_NAME (type))
3320     TYPE_NAME (type) = decl;
3321   pushdecl (decl);
3322 
3323   registered_builtin_types = tree_cons (0, type, registered_builtin_types);
3324 }
3325 
3326 /* Print an error message for invalid operands to arith operation
3327    CODE with TYPE0 for operand 0, and TYPE1 for operand 1.
3328    LOCATION is the location of the message.  */
3329 
3330 void
3331 binary_op_error (location_t location, enum tree_code code,
3332 		 tree type0, tree type1)
3333 {
3334   const char *opname;
3335 
3336   switch (code)
3337     {
3338     case PLUS_EXPR:
3339       opname = "+"; break;
3340     case MINUS_EXPR:
3341       opname = "-"; break;
3342     case MULT_EXPR:
3343       opname = "*"; break;
3344     case MAX_EXPR:
3345       opname = "max"; break;
3346     case MIN_EXPR:
3347       opname = "min"; break;
3348     case EQ_EXPR:
3349       opname = "=="; break;
3350     case NE_EXPR:
3351       opname = "!="; break;
3352     case LE_EXPR:
3353       opname = "<="; break;
3354     case GE_EXPR:
3355       opname = ">="; break;
3356     case LT_EXPR:
3357       opname = "<"; break;
3358     case GT_EXPR:
3359       opname = ">"; break;
3360     case LSHIFT_EXPR:
3361       opname = "<<"; break;
3362     case RSHIFT_EXPR:
3363       opname = ">>"; break;
3364     case TRUNC_MOD_EXPR:
3365     case FLOOR_MOD_EXPR:
3366       opname = "%"; break;
3367     case TRUNC_DIV_EXPR:
3368     case FLOOR_DIV_EXPR:
3369       opname = "/"; break;
3370     case BIT_AND_EXPR:
3371       opname = "&"; break;
3372     case BIT_IOR_EXPR:
3373       opname = "|"; break;
3374     case TRUTH_ANDIF_EXPR:
3375       opname = "&&"; break;
3376     case TRUTH_ORIF_EXPR:
3377       opname = "||"; break;
3378     case BIT_XOR_EXPR:
3379       opname = "^"; break;
3380     default:
3381       gcc_unreachable ();
3382     }
3383   error_at (location,
3384 	    "invalid operands to binary %s (have %qT and %qT)", opname,
3385 	    type0, type1);
3386 }
3387 
3388 /* Subroutine of build_binary_op, used for comparison operations.
3389    See if the operands have both been converted from subword integer types
3390    and, if so, perhaps change them both back to their original type.
3391    This function is also responsible for converting the two operands
3392    to the proper common type for comparison.
3393 
3394    The arguments of this function are all pointers to local variables
3395    of build_binary_op: OP0_PTR is &OP0, OP1_PTR is &OP1,
3396    RESTYPE_PTR is &RESULT_TYPE and RESCODE_PTR is &RESULTCODE.
3397 
3398    If this function returns nonzero, it means that the comparison has
3399    a constant value.  What this function returns is an expression for
3400    that value.  */
3401 
3402 tree
3403 shorten_compare (tree *op0_ptr, tree *op1_ptr, tree *restype_ptr,
3404 		 enum tree_code *rescode_ptr)
3405 {
3406   tree type;
3407   tree op0 = *op0_ptr;
3408   tree op1 = *op1_ptr;
3409   int unsignedp0, unsignedp1;
3410   int real1, real2;
3411   tree primop0, primop1;
3412   enum tree_code code = *rescode_ptr;
3413 
3414   /* Throw away any conversions to wider types
3415      already present in the operands.  */
3416 
3417   primop0 = c_common_get_narrower (op0, &unsignedp0);
3418   primop1 = c_common_get_narrower (op1, &unsignedp1);
3419 
3420   /* If primopN is first sign-extended from primopN's precision to opN's
3421      precision, then zero-extended from opN's precision to
3422      *restype_ptr precision, shortenings might be invalid.  */
3423   if (TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (TREE_TYPE (op0))
3424       && TYPE_PRECISION (TREE_TYPE (op0)) < TYPE_PRECISION (*restype_ptr)
3425       && !unsignedp0
3426       && TYPE_UNSIGNED (TREE_TYPE (op0)))
3427     primop0 = op0;
3428   if (TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (TREE_TYPE (op1))
3429       && TYPE_PRECISION (TREE_TYPE (op1)) < TYPE_PRECISION (*restype_ptr)
3430       && !unsignedp1
3431       && TYPE_UNSIGNED (TREE_TYPE (op1)))
3432     primop1 = op1;
3433 
3434   /* Handle the case that OP0 does not *contain* a conversion
3435      but it *requires* conversion to FINAL_TYPE.  */
3436 
3437   if (op0 == primop0 && TREE_TYPE (op0) != *restype_ptr)
3438     unsignedp0 = TYPE_UNSIGNED (TREE_TYPE (op0));
3439   if (op1 == primop1 && TREE_TYPE (op1) != *restype_ptr)
3440     unsignedp1 = TYPE_UNSIGNED (TREE_TYPE (op1));
3441 
3442   /* If one of the operands must be floated, we cannot optimize.  */
3443   real1 = TREE_CODE (TREE_TYPE (primop0)) == REAL_TYPE;
3444   real2 = TREE_CODE (TREE_TYPE (primop1)) == REAL_TYPE;
3445 
3446   /* If first arg is constant, swap the args (changing operation
3447      so value is preserved), for canonicalization.  Don't do this if
3448      the second arg is 0.  */
3449 
3450   if (TREE_CONSTANT (primop0)
3451       && !integer_zerop (primop1) && !real_zerop (primop1)
3452       && !fixed_zerop (primop1))
3453     {
3454       tree tem = primop0;
3455       int temi = unsignedp0;
3456       primop0 = primop1;
3457       primop1 = tem;
3458       tem = op0;
3459       op0 = op1;
3460       op1 = tem;
3461       *op0_ptr = op0;
3462       *op1_ptr = op1;
3463       unsignedp0 = unsignedp1;
3464       unsignedp1 = temi;
3465       temi = real1;
3466       real1 = real2;
3467       real2 = temi;
3468 
3469       switch (code)
3470 	{
3471 	case LT_EXPR:
3472 	  code = GT_EXPR;
3473 	  break;
3474 	case GT_EXPR:
3475 	  code = LT_EXPR;
3476 	  break;
3477 	case LE_EXPR:
3478 	  code = GE_EXPR;
3479 	  break;
3480 	case GE_EXPR:
3481 	  code = LE_EXPR;
3482 	  break;
3483 	default:
3484 	  break;
3485 	}
3486       *rescode_ptr = code;
3487     }
3488 
3489   /* If comparing an integer against a constant more bits wide,
3490      maybe we can deduce a value of 1 or 0 independent of the data.
3491      Or else truncate the constant now
3492      rather than extend the variable at run time.
3493 
3494      This is only interesting if the constant is the wider arg.
3495      Also, it is not safe if the constant is unsigned and the
3496      variable arg is signed, since in this case the variable
3497      would be sign-extended and then regarded as unsigned.
3498      Our technique fails in this case because the lowest/highest
3499      possible unsigned results don't follow naturally from the
3500      lowest/highest possible values of the variable operand.
3501      For just EQ_EXPR and NE_EXPR there is another technique that
3502      could be used: see if the constant can be faithfully represented
3503      in the other operand's type, by truncating it and reextending it
3504      and see if that preserves the constant's value.  */
3505 
3506   if (!real1 && !real2
3507       && TREE_CODE (TREE_TYPE (primop0)) != FIXED_POINT_TYPE
3508       && TREE_CODE (primop1) == INTEGER_CST
3509       && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr))
3510     {
3511       int min_gt, max_gt, min_lt, max_lt;
3512       tree maxval, minval;
3513       /* 1 if comparison is nominally unsigned.  */
3514       int unsignedp = TYPE_UNSIGNED (*restype_ptr);
3515       tree val;
3516 
3517       type = c_common_signed_or_unsigned_type (unsignedp0,
3518 					       TREE_TYPE (primop0));
3519 
3520       maxval = TYPE_MAX_VALUE (type);
3521       minval = TYPE_MIN_VALUE (type);
3522 
3523       if (unsignedp && !unsignedp0)
3524 	*restype_ptr = c_common_signed_type (*restype_ptr);
3525 
3526       if (TREE_TYPE (primop1) != *restype_ptr)
3527 	{
3528 	  /* Convert primop1 to target type, but do not introduce
3529 	     additional overflow.  We know primop1 is an int_cst.  */
3530 	  primop1 = force_fit_type_double (*restype_ptr,
3531 					   tree_to_double_int (primop1),
3532 					   0, TREE_OVERFLOW (primop1));
3533 	}
3534       if (type != *restype_ptr)
3535 	{
3536 	  minval = convert (*restype_ptr, minval);
3537 	  maxval = convert (*restype_ptr, maxval);
3538 	}
3539 
3540       if (unsignedp && unsignedp0)
3541 	{
3542 	  min_gt = INT_CST_LT_UNSIGNED (primop1, minval);
3543 	  max_gt = INT_CST_LT_UNSIGNED (primop1, maxval);
3544 	  min_lt = INT_CST_LT_UNSIGNED (minval, primop1);
3545 	  max_lt = INT_CST_LT_UNSIGNED (maxval, primop1);
3546 	}
3547       else
3548 	{
3549 	  min_gt = INT_CST_LT (primop1, minval);
3550 	  max_gt = INT_CST_LT (primop1, maxval);
3551 	  min_lt = INT_CST_LT (minval, primop1);
3552 	  max_lt = INT_CST_LT (maxval, primop1);
3553 	}
3554 
3555       val = 0;
3556       /* This used to be a switch, but Genix compiler can't handle that.  */
3557       if (code == NE_EXPR)
3558 	{
3559 	  if (max_lt || min_gt)
3560 	    val = truthvalue_true_node;
3561 	}
3562       else if (code == EQ_EXPR)
3563 	{
3564 	  if (max_lt || min_gt)
3565 	    val = truthvalue_false_node;
3566 	}
3567       else if (code == LT_EXPR)
3568 	{
3569 	  if (max_lt)
3570 	    val = truthvalue_true_node;
3571 	  if (!min_lt)
3572 	    val = truthvalue_false_node;
3573 	}
3574       else if (code == GT_EXPR)
3575 	{
3576 	  if (min_gt)
3577 	    val = truthvalue_true_node;
3578 	  if (!max_gt)
3579 	    val = truthvalue_false_node;
3580 	}
3581       else if (code == LE_EXPR)
3582 	{
3583 	  if (!max_gt)
3584 	    val = truthvalue_true_node;
3585 	  if (min_gt)
3586 	    val = truthvalue_false_node;
3587 	}
3588       else if (code == GE_EXPR)
3589 	{
3590 	  if (!min_lt)
3591 	    val = truthvalue_true_node;
3592 	  if (max_lt)
3593 	    val = truthvalue_false_node;
3594 	}
3595 
3596       /* If primop0 was sign-extended and unsigned comparison specd,
3597 	 we did a signed comparison above using the signed type bounds.
3598 	 But the comparison we output must be unsigned.
3599 
3600 	 Also, for inequalities, VAL is no good; but if the signed
3601 	 comparison had *any* fixed result, it follows that the
3602 	 unsigned comparison just tests the sign in reverse
3603 	 (positive values are LE, negative ones GE).
3604 	 So we can generate an unsigned comparison
3605 	 against an extreme value of the signed type.  */
3606 
3607       if (unsignedp && !unsignedp0)
3608 	{
3609 	  if (val != 0)
3610 	    switch (code)
3611 	      {
3612 	      case LT_EXPR:
3613 	      case GE_EXPR:
3614 		primop1 = TYPE_MIN_VALUE (type);
3615 		val = 0;
3616 		break;
3617 
3618 	      case LE_EXPR:
3619 	      case GT_EXPR:
3620 		primop1 = TYPE_MAX_VALUE (type);
3621 		val = 0;
3622 		break;
3623 
3624 	      default:
3625 		break;
3626 	      }
3627 	  type = c_common_unsigned_type (type);
3628 	}
3629 
3630       if (TREE_CODE (primop0) != INTEGER_CST)
3631 	{
3632 	  if (val == truthvalue_false_node)
3633 	    warning (OPT_Wtype_limits, "comparison is always false due to limited range of data type");
3634 	  if (val == truthvalue_true_node)
3635 	    warning (OPT_Wtype_limits, "comparison is always true due to limited range of data type");
3636 	}
3637 
3638       if (val != 0)
3639 	{
3640 	  /* Don't forget to evaluate PRIMOP0 if it has side effects.  */
3641 	  if (TREE_SIDE_EFFECTS (primop0))
3642 	    return build2 (COMPOUND_EXPR, TREE_TYPE (val), primop0, val);
3643 	  return val;
3644 	}
3645 
3646       /* Value is not predetermined, but do the comparison
3647 	 in the type of the operand that is not constant.
3648 	 TYPE is already properly set.  */
3649     }
3650 
3651   /* If either arg is decimal float and the other is float, find the
3652      proper common type to use for comparison.  */
3653   else if (real1 && real2
3654 	   && (DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (primop0)))
3655 	       || DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (primop1)))))
3656     type = common_type (TREE_TYPE (primop0), TREE_TYPE (primop1));
3657 
3658   else if (real1 && real2
3659 	   && (TYPE_PRECISION (TREE_TYPE (primop0))
3660 	       == TYPE_PRECISION (TREE_TYPE (primop1))))
3661     type = TREE_TYPE (primop0);
3662 
3663   /* If args' natural types are both narrower than nominal type
3664      and both extend in the same manner, compare them
3665      in the type of the wider arg.
3666      Otherwise must actually extend both to the nominal
3667      common type lest different ways of extending
3668      alter the result.
3669      (eg, (short)-1 == (unsigned short)-1  should be 0.)  */
3670 
3671   else if (unsignedp0 == unsignedp1 && real1 == real2
3672 	   && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr)
3673 	   && TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (*restype_ptr))
3674     {
3675       type = common_type (TREE_TYPE (primop0), TREE_TYPE (primop1));
3676       type = c_common_signed_or_unsigned_type (unsignedp0
3677 					       || TYPE_UNSIGNED (*restype_ptr),
3678 					       type);
3679       /* Make sure shorter operand is extended the right way
3680 	 to match the longer operand.  */
3681       primop0
3682 	= convert (c_common_signed_or_unsigned_type (unsignedp0,
3683 						     TREE_TYPE (primop0)),
3684 		   primop0);
3685       primop1
3686 	= convert (c_common_signed_or_unsigned_type (unsignedp1,
3687 						     TREE_TYPE (primop1)),
3688 		   primop1);
3689     }
3690   else
3691     {
3692       /* Here we must do the comparison on the nominal type
3693 	 using the args exactly as we received them.  */
3694       type = *restype_ptr;
3695       primop0 = op0;
3696       primop1 = op1;
3697 
3698       if (!real1 && !real2 && integer_zerop (primop1)
3699 	  && TYPE_UNSIGNED (*restype_ptr))
3700 	{
3701 	  tree value = 0;
3702 	  switch (code)
3703 	    {
3704 	    case GE_EXPR:
3705 	      /* All unsigned values are >= 0, so we warn.  However,
3706 		 if OP0 is a constant that is >= 0, the signedness of
3707 		 the comparison isn't an issue, so suppress the
3708 		 warning.  */
3709 	      if (warn_type_limits && !in_system_header
3710 		  && !(TREE_CODE (primop0) == INTEGER_CST
3711 		       && !TREE_OVERFLOW (convert (c_common_signed_type (type),
3712 						   primop0))))
3713 		warning (OPT_Wtype_limits,
3714 			 "comparison of unsigned expression >= 0 is always true");
3715 	      value = truthvalue_true_node;
3716 	      break;
3717 
3718 	    case LT_EXPR:
3719 	      if (warn_type_limits && !in_system_header
3720 		  && !(TREE_CODE (primop0) == INTEGER_CST
3721 		       && !TREE_OVERFLOW (convert (c_common_signed_type (type),
3722 						   primop0))))
3723 		warning (OPT_Wtype_limits,
3724 			 "comparison of unsigned expression < 0 is always false");
3725 	      value = truthvalue_false_node;
3726 	      break;
3727 
3728 	    default:
3729 	      break;
3730 	    }
3731 
3732 	  if (value != 0)
3733 	    {
3734 	      /* Don't forget to evaluate PRIMOP0 if it has side effects.  */
3735 	      if (TREE_SIDE_EFFECTS (primop0))
3736 		return build2 (COMPOUND_EXPR, TREE_TYPE (value),
3737 			       primop0, value);
3738 	      return value;
3739 	    }
3740 	}
3741     }
3742 
3743   *op0_ptr = convert (type, primop0);
3744   *op1_ptr = convert (type, primop1);
3745 
3746   *restype_ptr = truthvalue_type_node;
3747 
3748   return 0;
3749 }
3750 
3751 /* Return a tree for the sum or difference (RESULTCODE says which)
3752    of pointer PTROP and integer INTOP.  */
3753 
3754 tree
3755 pointer_int_sum (location_t loc, enum tree_code resultcode,
3756 		 tree ptrop, tree intop)
3757 {
3758   tree size_exp, ret;
3759 
3760   /* The result is a pointer of the same type that is being added.  */
3761   tree result_type = TREE_TYPE (ptrop);
3762 
3763   if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE)
3764     {
3765       pedwarn (loc, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
3766 	       "pointer of type %<void *%> used in arithmetic");
3767       size_exp = integer_one_node;
3768     }
3769   else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE)
3770     {
3771       pedwarn (loc, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
3772 	       "pointer to a function used in arithmetic");
3773       size_exp = integer_one_node;
3774     }
3775   else if (TREE_CODE (TREE_TYPE (result_type)) == METHOD_TYPE)
3776     {
3777       pedwarn (loc, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
3778 	       "pointer to member function used in arithmetic");
3779       size_exp = integer_one_node;
3780     }
3781   else
3782     size_exp = size_in_bytes (TREE_TYPE (result_type));
3783 
3784   /* We are manipulating pointer values, so we don't need to warn
3785      about relying on undefined signed overflow.  We disable the
3786      warning here because we use integer types so fold won't know that
3787      they are really pointers.  */
3788   fold_defer_overflow_warnings ();
3789 
3790   /* If what we are about to multiply by the size of the elements
3791      contains a constant term, apply distributive law
3792      and multiply that constant term separately.
3793      This helps produce common subexpressions.  */
3794   if ((TREE_CODE (intop) == PLUS_EXPR || TREE_CODE (intop) == MINUS_EXPR)
3795       && !TREE_CONSTANT (intop)
3796       && TREE_CONSTANT (TREE_OPERAND (intop, 1))
3797       && TREE_CONSTANT (size_exp)
3798       /* If the constant comes from pointer subtraction,
3799 	 skip this optimization--it would cause an error.  */
3800       && TREE_CODE (TREE_TYPE (TREE_OPERAND (intop, 0))) == INTEGER_TYPE
3801       /* If the constant is unsigned, and smaller than the pointer size,
3802 	 then we must skip this optimization.  This is because it could cause
3803 	 an overflow error if the constant is negative but INTOP is not.  */
3804       && (!TYPE_UNSIGNED (TREE_TYPE (intop))
3805 	  || (TYPE_PRECISION (TREE_TYPE (intop))
3806 	      == TYPE_PRECISION (TREE_TYPE (ptrop)))))
3807     {
3808       enum tree_code subcode = resultcode;
3809       tree int_type = TREE_TYPE (intop);
3810       if (TREE_CODE (intop) == MINUS_EXPR)
3811 	subcode = (subcode == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR);
3812       /* Convert both subexpression types to the type of intop,
3813 	 because weird cases involving pointer arithmetic
3814 	 can result in a sum or difference with different type args.  */
3815       ptrop = build_binary_op (EXPR_LOCATION (TREE_OPERAND (intop, 1)),
3816 			       subcode, ptrop,
3817 			       convert (int_type, TREE_OPERAND (intop, 1)), 1);
3818       intop = convert (int_type, TREE_OPERAND (intop, 0));
3819     }
3820 
3821   /* Convert the integer argument to a type the same size as sizetype
3822      so the multiply won't overflow spuriously.  */
3823   if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype)
3824       || TYPE_UNSIGNED (TREE_TYPE (intop)) != TYPE_UNSIGNED (sizetype))
3825     intop = convert (c_common_type_for_size (TYPE_PRECISION (sizetype),
3826 					     TYPE_UNSIGNED (sizetype)), intop);
3827 
3828   /* Replace the integer argument with a suitable product by the object size.
3829      Do this multiplication as signed, then convert to the appropriate type
3830      for the pointer operation and disregard an overflow that occured only
3831      because of the sign-extension change in the latter conversion.  */
3832   {
3833     tree t = build_binary_op (loc,
3834 			      MULT_EXPR, intop,
3835 			      convert (TREE_TYPE (intop), size_exp), 1);
3836     intop = convert (sizetype, t);
3837     if (TREE_OVERFLOW_P (intop) && !TREE_OVERFLOW (t))
3838       intop = build_int_cst_wide (TREE_TYPE (intop), TREE_INT_CST_LOW (intop),
3839 				  TREE_INT_CST_HIGH (intop));
3840   }
3841 
3842   /* Create the sum or difference.  */
3843   if (resultcode == MINUS_EXPR)
3844     intop = fold_build1_loc (loc, NEGATE_EXPR, sizetype, intop);
3845 
3846   ret = fold_build_pointer_plus_loc (loc, ptrop, intop);
3847 
3848   fold_undefer_and_ignore_overflow_warnings ();
3849 
3850   return ret;
3851 }
3852 
3853 /* Wrap a C_MAYBE_CONST_EXPR around an expression that is fully folded
3854    and if NON_CONST is known not to be permitted in an evaluated part
3855    of a constant expression.  */
3856 
3857 tree
3858 c_wrap_maybe_const (tree expr, bool non_const)
3859 {
3860   bool nowarning = TREE_NO_WARNING (expr);
3861   location_t loc = EXPR_LOCATION (expr);
3862 
3863   /* This should never be called for C++.  */
3864   if (c_dialect_cxx ())
3865     gcc_unreachable ();
3866 
3867   /* The result of folding may have a NOP_EXPR to set TREE_NO_WARNING.  */
3868   STRIP_TYPE_NOPS (expr);
3869   expr = build2 (C_MAYBE_CONST_EXPR, TREE_TYPE (expr), NULL, expr);
3870   C_MAYBE_CONST_EXPR_NON_CONST (expr) = non_const;
3871   if (nowarning)
3872     TREE_NO_WARNING (expr) = 1;
3873   protected_set_expr_location (expr, loc);
3874 
3875   return expr;
3876 }
3877 
3878 /* Wrap a SAVE_EXPR around EXPR, if appropriate.  Like save_expr, but
3879    for C folds the inside expression and wraps a C_MAYBE_CONST_EXPR
3880    around the SAVE_EXPR if needed so that c_fully_fold does not need
3881    to look inside SAVE_EXPRs.  */
3882 
3883 tree
3884 c_save_expr (tree expr)
3885 {
3886   bool maybe_const = true;
3887   if (c_dialect_cxx ())
3888     return save_expr (expr);
3889   expr = c_fully_fold (expr, false, &maybe_const);
3890   expr = save_expr (expr);
3891   if (!maybe_const)
3892     expr = c_wrap_maybe_const (expr, true);
3893   return expr;
3894 }
3895 
3896 /* Return whether EXPR is a declaration whose address can never be
3897    NULL.  */
3898 
3899 bool
3900 decl_with_nonnull_addr_p (const_tree expr)
3901 {
3902   return (DECL_P (expr)
3903 	  && (TREE_CODE (expr) == PARM_DECL
3904 	      || TREE_CODE (expr) == LABEL_DECL
3905 	      || !DECL_WEAK (expr)));
3906 }
3907 
3908 /* Prepare expr to be an argument of a TRUTH_NOT_EXPR,
3909    or for an `if' or `while' statement or ?..: exp.  It should already
3910    have been validated to be of suitable type; otherwise, a bad
3911    diagnostic may result.
3912 
3913    The EXPR is located at LOCATION.
3914 
3915    This preparation consists of taking the ordinary
3916    representation of an expression expr and producing a valid tree
3917    boolean expression describing whether expr is nonzero.  We could
3918    simply always do build_binary_op (NE_EXPR, expr, truthvalue_false_node, 1),
3919    but we optimize comparisons, &&, ||, and !.
3920 
3921    The resulting type should always be `truthvalue_type_node'.  */
3922 
3923 tree
3924 c_common_truthvalue_conversion (location_t location, tree expr)
3925 {
3926   switch (TREE_CODE (expr))
3927     {
3928     case EQ_EXPR:   case NE_EXPR:   case UNEQ_EXPR: case LTGT_EXPR:
3929     case LE_EXPR:   case GE_EXPR:   case LT_EXPR:   case GT_EXPR:
3930     case UNLE_EXPR: case UNGE_EXPR: case UNLT_EXPR: case UNGT_EXPR:
3931     case ORDERED_EXPR: case UNORDERED_EXPR:
3932       if (TREE_TYPE (expr) == truthvalue_type_node)
3933 	return expr;
3934       expr = build2 (TREE_CODE (expr), truthvalue_type_node,
3935 		     TREE_OPERAND (expr, 0), TREE_OPERAND (expr, 1));
3936       goto ret;
3937 
3938     case TRUTH_ANDIF_EXPR:
3939     case TRUTH_ORIF_EXPR:
3940     case TRUTH_AND_EXPR:
3941     case TRUTH_OR_EXPR:
3942     case TRUTH_XOR_EXPR:
3943       if (TREE_TYPE (expr) == truthvalue_type_node)
3944 	return expr;
3945       expr = build2 (TREE_CODE (expr), truthvalue_type_node,
3946 		     c_common_truthvalue_conversion (location,
3947 						     TREE_OPERAND (expr, 0)),
3948 		     c_common_truthvalue_conversion (location,
3949 						     TREE_OPERAND (expr, 1)));
3950       goto ret;
3951 
3952     case TRUTH_NOT_EXPR:
3953       if (TREE_TYPE (expr) == truthvalue_type_node)
3954 	return expr;
3955       expr = build1 (TREE_CODE (expr), truthvalue_type_node,
3956 		     c_common_truthvalue_conversion (location,
3957 						     TREE_OPERAND (expr, 0)));
3958       goto ret;
3959 
3960     case ERROR_MARK:
3961       return expr;
3962 
3963     case INTEGER_CST:
3964       return integer_zerop (expr) ? truthvalue_false_node
3965 				  : truthvalue_true_node;
3966 
3967     case REAL_CST:
3968       return real_compare (NE_EXPR, &TREE_REAL_CST (expr), &dconst0)
3969 	     ? truthvalue_true_node
3970 	     : truthvalue_false_node;
3971 
3972     case FIXED_CST:
3973       return fixed_compare (NE_EXPR, &TREE_FIXED_CST (expr),
3974 			    &FCONST0 (TYPE_MODE (TREE_TYPE (expr))))
3975 	     ? truthvalue_true_node
3976 	     : truthvalue_false_node;
3977 
3978     case FUNCTION_DECL:
3979       expr = build_unary_op (location, ADDR_EXPR, expr, 0);
3980       /* Fall through.  */
3981 
3982     case ADDR_EXPR:
3983       {
3984  	tree inner = TREE_OPERAND (expr, 0);
3985 	if (decl_with_nonnull_addr_p (inner))
3986 	  {
3987 	    /* Common Ada/Pascal programmer's mistake.  */
3988 	    warning_at (location,
3989 			OPT_Waddress,
3990 			"the address of %qD will always evaluate as %<true%>",
3991 			inner);
3992 	    return truthvalue_true_node;
3993 	  }
3994 	break;
3995       }
3996 
3997     case COMPLEX_EXPR:
3998       expr = build_binary_op (EXPR_LOCATION (expr),
3999 			      (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1))
4000 			       ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
4001 		c_common_truthvalue_conversion (location,
4002 						TREE_OPERAND (expr, 0)),
4003 		c_common_truthvalue_conversion (location,
4004 						TREE_OPERAND (expr, 1)),
4005 			      0);
4006       goto ret;
4007 
4008     case NEGATE_EXPR:
4009     case ABS_EXPR:
4010     case FLOAT_EXPR:
4011     case EXCESS_PRECISION_EXPR:
4012       /* These don't change whether an object is nonzero or zero.  */
4013       return c_common_truthvalue_conversion (location, TREE_OPERAND (expr, 0));
4014 
4015     case LROTATE_EXPR:
4016     case RROTATE_EXPR:
4017       /* These don't change whether an object is zero or nonzero, but
4018 	 we can't ignore them if their second arg has side-effects.  */
4019       if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
4020 	{
4021 	  expr = build2 (COMPOUND_EXPR, truthvalue_type_node,
4022 			 TREE_OPERAND (expr, 1),
4023 			 c_common_truthvalue_conversion
4024 			 (location, TREE_OPERAND (expr, 0)));
4025 	  goto ret;
4026 	}
4027       else
4028 	return c_common_truthvalue_conversion (location,
4029 					       TREE_OPERAND (expr, 0));
4030 
4031     case COND_EXPR:
4032       /* Distribute the conversion into the arms of a COND_EXPR.  */
4033       if (c_dialect_cxx ())
4034 	{
4035 	  tree op1 = TREE_OPERAND (expr, 1);
4036 	  tree op2 = TREE_OPERAND (expr, 2);
4037 	  /* In C++ one of the arms might have void type if it is throw.  */
4038 	  if (!VOID_TYPE_P (TREE_TYPE (op1)))
4039 	    op1 = c_common_truthvalue_conversion (location, op1);
4040 	  if (!VOID_TYPE_P (TREE_TYPE (op2)))
4041 	    op2 = c_common_truthvalue_conversion (location, op2);
4042 	  expr = fold_build3_loc (location, COND_EXPR, truthvalue_type_node,
4043 				  TREE_OPERAND (expr, 0), op1, op2);
4044 	  goto ret;
4045 	}
4046       else
4047 	{
4048 	  /* Folding will happen later for C.  */
4049 	  expr = build3 (COND_EXPR, truthvalue_type_node,
4050 			 TREE_OPERAND (expr, 0),
4051 			 c_common_truthvalue_conversion (location,
4052 							 TREE_OPERAND (expr, 1)),
4053 			 c_common_truthvalue_conversion (location,
4054 							 TREE_OPERAND (expr, 2)));
4055 	  goto ret;
4056 	}
4057 
4058     CASE_CONVERT:
4059       {
4060 	tree totype = TREE_TYPE (expr);
4061 	tree fromtype = TREE_TYPE (TREE_OPERAND (expr, 0));
4062 
4063 	/* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE,
4064 	   since that affects how `default_conversion' will behave.  */
4065 	if (TREE_CODE (totype) == REFERENCE_TYPE
4066 	    || TREE_CODE (fromtype) == REFERENCE_TYPE)
4067 	  break;
4068 	/* Don't strip a conversion from C++0x scoped enum, since they
4069 	   don't implicitly convert to other types.  */
4070 	if (TREE_CODE (fromtype) == ENUMERAL_TYPE
4071 	    && ENUM_IS_SCOPED (fromtype))
4072 	  break;
4073 	/* If this isn't narrowing the argument, we can ignore it.  */
4074 	if (TYPE_PRECISION (totype) >= TYPE_PRECISION (fromtype))
4075 	  return c_common_truthvalue_conversion (location,
4076 						 TREE_OPERAND (expr, 0));
4077       }
4078       break;
4079 
4080     case MODIFY_EXPR:
4081       if (!TREE_NO_WARNING (expr)
4082 	  && warn_parentheses)
4083 	{
4084 	  warning (OPT_Wparentheses,
4085 		   "suggest parentheses around assignment used as truth value");
4086 	  TREE_NO_WARNING (expr) = 1;
4087 	}
4088       break;
4089 
4090     default:
4091       break;
4092     }
4093 
4094   if (TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
4095     {
4096       tree t = (in_late_binary_op ? save_expr (expr) : c_save_expr (expr));
4097       expr = (build_binary_op
4098 	      (EXPR_LOCATION (expr),
4099 	       (TREE_SIDE_EFFECTS (expr)
4100 		? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
4101 	c_common_truthvalue_conversion
4102 	       (location,
4103 		build_unary_op (location, REALPART_EXPR, t, 0)),
4104 	c_common_truthvalue_conversion
4105 	       (location,
4106 		build_unary_op (location, IMAGPART_EXPR, t, 0)),
4107 	       0));
4108       goto ret;
4109     }
4110 
4111   if (TREE_CODE (TREE_TYPE (expr)) == FIXED_POINT_TYPE)
4112     {
4113       tree fixed_zero_node = build_fixed (TREE_TYPE (expr),
4114 					  FCONST0 (TYPE_MODE
4115 						   (TREE_TYPE (expr))));
4116       return build_binary_op (location, NE_EXPR, expr, fixed_zero_node, 1);
4117     }
4118   else
4119     return build_binary_op (location, NE_EXPR, expr, integer_zero_node, 1);
4120 
4121  ret:
4122   protected_set_expr_location (expr, location);
4123   return expr;
4124 }
4125 
4126 static void def_builtin_1  (enum built_in_function fncode,
4127 			    const char *name,
4128 			    enum built_in_class fnclass,
4129 			    tree fntype, tree libtype,
4130 			    bool both_p, bool fallback_p, bool nonansi_p,
4131 			    tree fnattrs, bool implicit_p);
4132 
4133 
4134 /* Apply the TYPE_QUALS to the new DECL.  */
4135 
4136 void
4137 c_apply_type_quals_to_decl (int type_quals, tree decl)
4138 {
4139   tree type = TREE_TYPE (decl);
4140 
4141   if (type == error_mark_node)
4142     return;
4143 
4144   if ((type_quals & TYPE_QUAL_CONST)
4145       || (type && TREE_CODE (type) == REFERENCE_TYPE))
4146     /* We used to check TYPE_NEEDS_CONSTRUCTING here, but now a constexpr
4147        constructor can produce constant init, so rely on cp_finish_decl to
4148        clear TREE_READONLY if the variable has non-constant init.  */
4149     TREE_READONLY (decl) = 1;
4150   if (type_quals & TYPE_QUAL_VOLATILE)
4151     {
4152       TREE_SIDE_EFFECTS (decl) = 1;
4153       TREE_THIS_VOLATILE (decl) = 1;
4154     }
4155   if (type_quals & TYPE_QUAL_RESTRICT)
4156     {
4157       while (type && TREE_CODE (type) == ARRAY_TYPE)
4158 	/* Allow 'restrict' on arrays of pointers.
4159 	   FIXME currently we just ignore it.  */
4160 	type = TREE_TYPE (type);
4161       if (!type
4162 	  || !POINTER_TYPE_P (type)
4163 	  || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (type)))
4164 	error ("invalid use of %<restrict%>");
4165     }
4166 }
4167 
4168 /* Hash function for the problem of multiple type definitions in
4169    different files.  This must hash all types that will compare
4170    equal via comptypes to the same value.  In practice it hashes
4171    on some of the simple stuff and leaves the details to comptypes.  */
4172 
4173 static hashval_t
4174 c_type_hash (const void *p)
4175 {
4176   int n_elements;
4177   int shift, size;
4178   const_tree const t = (const_tree) p;
4179   tree t2;
4180   switch (TREE_CODE (t))
4181     {
4182     /* For pointers, hash on pointee type plus some swizzling.  */
4183     case POINTER_TYPE:
4184       return c_type_hash (TREE_TYPE (t)) ^ 0x3003003;
4185     /* Hash on number of elements and total size.  */
4186     case ENUMERAL_TYPE:
4187       shift = 3;
4188       t2 = TYPE_VALUES (t);
4189       break;
4190     case RECORD_TYPE:
4191       shift = 0;
4192       t2 = TYPE_FIELDS (t);
4193       break;
4194     case QUAL_UNION_TYPE:
4195       shift = 1;
4196       t2 = TYPE_FIELDS (t);
4197       break;
4198     case UNION_TYPE:
4199       shift = 2;
4200       t2 = TYPE_FIELDS (t);
4201       break;
4202     default:
4203       gcc_unreachable ();
4204     }
4205   /* FIXME: We want to use a DECL_CHAIN iteration method here, but
4206      TYPE_VALUES of ENUMERAL_TYPEs is stored as a TREE_LIST.  */
4207   n_elements = list_length (t2);
4208   /* We might have a VLA here.  */
4209   if (TREE_CODE (TYPE_SIZE (t)) != INTEGER_CST)
4210     size = 0;
4211   else
4212     size = TREE_INT_CST_LOW (TYPE_SIZE (t));
4213   return ((size << 24) | (n_elements << shift));
4214 }
4215 
4216 static GTY((param_is (union tree_node))) htab_t type_hash_table;
4217 
4218 /* Return the typed-based alias set for T, which may be an expression
4219    or a type.  Return -1 if we don't do anything special.  */
4220 
4221 alias_set_type
4222 c_common_get_alias_set (tree t)
4223 {
4224   tree u;
4225   PTR *slot;
4226 
4227   /* For VLAs, use the alias set of the element type rather than the
4228      default of alias set 0 for types compared structurally.  */
4229   if (TYPE_P (t) && TYPE_STRUCTURAL_EQUALITY_P (t))
4230     {
4231       if (TREE_CODE (t) == ARRAY_TYPE)
4232 	return get_alias_set (TREE_TYPE (t));
4233       return -1;
4234     }
4235 
4236   /* Permit type-punning when accessing a union, provided the access
4237      is directly through the union.  For example, this code does not
4238      permit taking the address of a union member and then storing
4239      through it.  Even the type-punning allowed here is a GCC
4240      extension, albeit a common and useful one; the C standard says
4241      that such accesses have implementation-defined behavior.  */
4242   for (u = t;
4243        TREE_CODE (u) == COMPONENT_REF || TREE_CODE (u) == ARRAY_REF;
4244        u = TREE_OPERAND (u, 0))
4245     if (TREE_CODE (u) == COMPONENT_REF
4246 	&& TREE_CODE (TREE_TYPE (TREE_OPERAND (u, 0))) == UNION_TYPE)
4247       return 0;
4248 
4249   /* That's all the expressions we handle specially.  */
4250   if (!TYPE_P (t))
4251     return -1;
4252 
4253   /* The C standard guarantees that any object may be accessed via an
4254      lvalue that has character type.  */
4255   if (t == char_type_node
4256       || t == signed_char_type_node
4257       || t == unsigned_char_type_node)
4258     return 0;
4259 
4260   /* The C standard specifically allows aliasing between signed and
4261      unsigned variants of the same type.  We treat the signed
4262      variant as canonical.  */
4263   if (TREE_CODE (t) == INTEGER_TYPE && TYPE_UNSIGNED (t))
4264     {
4265       tree t1 = c_common_signed_type (t);
4266 
4267       /* t1 == t can happen for boolean nodes which are always unsigned.  */
4268       if (t1 != t)
4269 	return get_alias_set (t1);
4270     }
4271 
4272   /* Handle the case of multiple type nodes referring to "the same" type,
4273      which occurs with IMA.  These share an alias set.  FIXME:  Currently only
4274      C90 is handled.  (In C99 type compatibility is not transitive, which
4275      complicates things mightily. The alias set splay trees can theoretically
4276      represent this, but insertion is tricky when you consider all the
4277      different orders things might arrive in.) */
4278 
4279   if (c_language != clk_c || flag_isoc99)
4280     return -1;
4281 
4282   /* Save time if there's only one input file.  */
4283   if (num_in_fnames == 1)
4284     return -1;
4285 
4286   /* Pointers need special handling if they point to any type that
4287      needs special handling (below).  */
4288   if (TREE_CODE (t) == POINTER_TYPE)
4289     {
4290       tree t2;
4291       /* Find bottom type under any nested POINTERs.  */
4292       for (t2 = TREE_TYPE (t);
4293 	   TREE_CODE (t2) == POINTER_TYPE;
4294 	   t2 = TREE_TYPE (t2))
4295 	;
4296       if (TREE_CODE (t2) != RECORD_TYPE
4297 	  && TREE_CODE (t2) != ENUMERAL_TYPE
4298 	  && TREE_CODE (t2) != QUAL_UNION_TYPE
4299 	  && TREE_CODE (t2) != UNION_TYPE)
4300 	return -1;
4301       if (TYPE_SIZE (t2) == 0)
4302 	return -1;
4303     }
4304   /* These are the only cases that need special handling.  */
4305   if (TREE_CODE (t) != RECORD_TYPE
4306       && TREE_CODE (t) != ENUMERAL_TYPE
4307       && TREE_CODE (t) != QUAL_UNION_TYPE
4308       && TREE_CODE (t) != UNION_TYPE
4309       && TREE_CODE (t) != POINTER_TYPE)
4310     return -1;
4311   /* Undefined? */
4312   if (TYPE_SIZE (t) == 0)
4313     return -1;
4314 
4315   /* Look up t in hash table.  Only one of the compatible types within each
4316      alias set is recorded in the table.  */
4317   if (!type_hash_table)
4318     type_hash_table = htab_create_ggc (1021, c_type_hash,
4319 	    (htab_eq) lang_hooks.types_compatible_p,
4320 	    NULL);
4321   slot = htab_find_slot (type_hash_table, t, INSERT);
4322   if (*slot != NULL)
4323     {
4324       TYPE_ALIAS_SET (t) = TYPE_ALIAS_SET ((tree)*slot);
4325       return TYPE_ALIAS_SET ((tree)*slot);
4326     }
4327   else
4328     /* Our caller will assign and record (in t) a new alias set; all we need
4329        to do is remember t in the hash table.  */
4330     *slot = t;
4331 
4332   return -1;
4333 }
4334 
4335 /* Compute the value of 'sizeof (TYPE)' or '__alignof__ (TYPE)', where
4336    the second parameter indicates which OPERATOR is being applied.
4337    The COMPLAIN flag controls whether we should diagnose possibly
4338    ill-formed constructs or not.  LOC is the location of the SIZEOF or
4339    TYPEOF operator.  */
4340 
4341 tree
4342 c_sizeof_or_alignof_type (location_t loc,
4343 			  tree type, bool is_sizeof, int complain)
4344 {
4345   const char *op_name;
4346   tree value = NULL;
4347   enum tree_code type_code = TREE_CODE (type);
4348 
4349   op_name = is_sizeof ? "sizeof" : "__alignof__";
4350 
4351   if (type_code == FUNCTION_TYPE)
4352     {
4353       if (is_sizeof)
4354 	{
4355 	  if (complain && (pedantic || warn_pointer_arith))
4356 	    pedwarn (loc, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
4357 		     "invalid application of %<sizeof%> to a function type");
4358           else if (!complain)
4359             return error_mark_node;
4360 	  value = size_one_node;
4361 	}
4362       else
4363 	{
4364 	  if (complain)
4365 	    {
4366 	      if (c_dialect_cxx ())
4367 		pedwarn (loc, OPT_pedantic, "ISO C++ does not permit "
4368 			 "%<alignof%> applied to a function type");
4369 	      else
4370 		pedwarn (loc, OPT_pedantic, "ISO C does not permit "
4371 			 "%<_Alignof%> applied to a function type");
4372 	    }
4373 	  value = size_int (FUNCTION_BOUNDARY / BITS_PER_UNIT);
4374 	}
4375     }
4376   else if (type_code == VOID_TYPE || type_code == ERROR_MARK)
4377     {
4378       if (type_code == VOID_TYPE
4379 	  && complain && (pedantic || warn_pointer_arith))
4380 	pedwarn (loc, pedantic ? OPT_pedantic : OPT_Wpointer_arith,
4381 		 "invalid application of %qs to a void type", op_name);
4382       else if (!complain)
4383         return error_mark_node;
4384       value = size_one_node;
4385     }
4386   else if (!COMPLETE_TYPE_P (type)
4387 	   && (!c_dialect_cxx () || is_sizeof || type_code != ARRAY_TYPE))
4388     {
4389       if (complain)
4390 	error_at (loc, "invalid application of %qs to incomplete type %qT",
4391 		  op_name, type);
4392       return error_mark_node;
4393     }
4394   else if (c_dialect_cxx () && type_code == ARRAY_TYPE
4395 	   && !COMPLETE_TYPE_P (TREE_TYPE (type)))
4396     {
4397       if (complain)
4398 	error_at (loc, "invalid application of %qs to array type %qT of "
4399 		  "incomplete element type", op_name, type);
4400       return error_mark_node;
4401     }
4402   else
4403     {
4404       if (is_sizeof)
4405 	/* Convert in case a char is more than one unit.  */
4406 	value = size_binop_loc (loc, CEIL_DIV_EXPR, TYPE_SIZE_UNIT (type),
4407 				size_int (TYPE_PRECISION (char_type_node)
4408 					  / BITS_PER_UNIT));
4409       else
4410 	value = size_int (TYPE_ALIGN_UNIT (type));
4411     }
4412 
4413   /* VALUE will have an integer type with TYPE_IS_SIZETYPE set.
4414      TYPE_IS_SIZETYPE means that certain things (like overflow) will
4415      never happen.  However, this node should really have type
4416      `size_t', which is just a typedef for an ordinary integer type.  */
4417   value = fold_convert_loc (loc, size_type_node, value);
4418   gcc_assert (!TYPE_IS_SIZETYPE (TREE_TYPE (value)));
4419 
4420   return value;
4421 }
4422 
4423 /* Implement the __alignof keyword: Return the minimum required
4424    alignment of EXPR, measured in bytes.  For VAR_DECLs,
4425    FUNCTION_DECLs and FIELD_DECLs return DECL_ALIGN (which can be set
4426    from an "aligned" __attribute__ specification).  LOC is the
4427    location of the ALIGNOF operator.  */
4428 
4429 tree
4430 c_alignof_expr (location_t loc, tree expr)
4431 {
4432   tree t;
4433 
4434   if (VAR_OR_FUNCTION_DECL_P (expr))
4435     t = size_int (DECL_ALIGN_UNIT (expr));
4436 
4437   else if (TREE_CODE (expr) == COMPONENT_REF
4438 	   && DECL_C_BIT_FIELD (TREE_OPERAND (expr, 1)))
4439     {
4440       error_at (loc, "%<__alignof%> applied to a bit-field");
4441       t = size_one_node;
4442     }
4443   else if (TREE_CODE (expr) == COMPONENT_REF
4444 	   && TREE_CODE (TREE_OPERAND (expr, 1)) == FIELD_DECL)
4445     t = size_int (DECL_ALIGN_UNIT (TREE_OPERAND (expr, 1)));
4446 
4447   else if (TREE_CODE (expr) == INDIRECT_REF)
4448     {
4449       tree t = TREE_OPERAND (expr, 0);
4450       tree best = t;
4451       int bestalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t)));
4452 
4453       while (CONVERT_EXPR_P (t)
4454 	     && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == POINTER_TYPE)
4455 	{
4456 	  int thisalign;
4457 
4458 	  t = TREE_OPERAND (t, 0);
4459 	  thisalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t)));
4460 	  if (thisalign > bestalign)
4461 	    best = t, bestalign = thisalign;
4462 	}
4463       return c_alignof (loc, TREE_TYPE (TREE_TYPE (best)));
4464     }
4465   else
4466     return c_alignof (loc, TREE_TYPE (expr));
4467 
4468   return fold_convert_loc (loc, size_type_node, t);
4469 }
4470 
4471 /* Handle C and C++ default attributes.  */
4472 
4473 enum built_in_attribute
4474 {
4475 #define DEF_ATTR_NULL_TREE(ENUM) ENUM,
4476 #define DEF_ATTR_INT(ENUM, VALUE) ENUM,
4477 #define DEF_ATTR_IDENT(ENUM, STRING) ENUM,
4478 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) ENUM,
4479 #include "builtin-attrs.def"
4480 #undef DEF_ATTR_NULL_TREE
4481 #undef DEF_ATTR_INT
4482 #undef DEF_ATTR_IDENT
4483 #undef DEF_ATTR_TREE_LIST
4484   ATTR_LAST
4485 };
4486 
4487 static GTY(()) tree built_in_attributes[(int) ATTR_LAST];
4488 
4489 static void c_init_attributes (void);
4490 
4491 enum c_builtin_type
4492 {
4493 #define DEF_PRIMITIVE_TYPE(NAME, VALUE) NAME,
4494 #define DEF_FUNCTION_TYPE_0(NAME, RETURN) NAME,
4495 #define DEF_FUNCTION_TYPE_1(NAME, RETURN, ARG1) NAME,
4496 #define DEF_FUNCTION_TYPE_2(NAME, RETURN, ARG1, ARG2) NAME,
4497 #define DEF_FUNCTION_TYPE_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
4498 #define DEF_FUNCTION_TYPE_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
4499 #define DEF_FUNCTION_TYPE_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) NAME,
4500 #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) NAME,
4501 #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) NAME,
4502 #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME,
4503 #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME,
4504 #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME,
4505 #define DEF_FUNCTION_TYPE_VAR_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
4506 #define DEF_FUNCTION_TYPE_VAR_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
4507 #define DEF_FUNCTION_TYPE_VAR_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG6) \
4508   NAME,
4509 #define DEF_POINTER_TYPE(NAME, TYPE) NAME,
4510 #include "builtin-types.def"
4511 #undef DEF_PRIMITIVE_TYPE
4512 #undef DEF_FUNCTION_TYPE_0
4513 #undef DEF_FUNCTION_TYPE_1
4514 #undef DEF_FUNCTION_TYPE_2
4515 #undef DEF_FUNCTION_TYPE_3
4516 #undef DEF_FUNCTION_TYPE_4
4517 #undef DEF_FUNCTION_TYPE_5
4518 #undef DEF_FUNCTION_TYPE_6
4519 #undef DEF_FUNCTION_TYPE_7
4520 #undef DEF_FUNCTION_TYPE_VAR_0
4521 #undef DEF_FUNCTION_TYPE_VAR_1
4522 #undef DEF_FUNCTION_TYPE_VAR_2
4523 #undef DEF_FUNCTION_TYPE_VAR_3
4524 #undef DEF_FUNCTION_TYPE_VAR_4
4525 #undef DEF_FUNCTION_TYPE_VAR_5
4526 #undef DEF_POINTER_TYPE
4527   BT_LAST
4528 };
4529 
4530 typedef enum c_builtin_type builtin_type;
4531 
4532 /* A temporary array for c_common_nodes_and_builtins.  Used in
4533    communication with def_fn_type.  */
4534 static tree builtin_types[(int) BT_LAST + 1];
4535 
4536 /* A helper function for c_common_nodes_and_builtins.  Build function type
4537    for DEF with return type RET and N arguments.  If VAR is true, then the
4538    function should be variadic after those N arguments.
4539 
4540    Takes special care not to ICE if any of the types involved are
4541    error_mark_node, which indicates that said type is not in fact available
4542    (see builtin_type_for_size).  In which case the function type as a whole
4543    should be error_mark_node.  */
4544 
4545 static void
4546 def_fn_type (builtin_type def, builtin_type ret, bool var, int n, ...)
4547 {
4548   tree t;
4549   tree *args = XALLOCAVEC (tree, n);
4550   va_list list;
4551   int i;
4552 
4553   va_start (list, n);
4554   for (i = 0; i < n; ++i)
4555     {
4556       builtin_type a = (builtin_type) va_arg (list, int);
4557       t = builtin_types[a];
4558       if (t == error_mark_node)
4559 	goto egress;
4560       args[i] = t;
4561     }
4562 
4563   t = builtin_types[ret];
4564   if (t == error_mark_node)
4565     goto egress;
4566   if (var)
4567     t = build_varargs_function_type_array (t, n, args);
4568   else
4569     t = build_function_type_array (t, n, args);
4570 
4571  egress:
4572   builtin_types[def] = t;
4573   va_end (list);
4574 }
4575 
4576 /* Build builtin functions common to both C and C++ language
4577    frontends.  */
4578 
4579 static void
4580 c_define_builtins (tree va_list_ref_type_node, tree va_list_arg_type_node)
4581 {
4582 #define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \
4583   builtin_types[ENUM] = VALUE;
4584 #define DEF_FUNCTION_TYPE_0(ENUM, RETURN) \
4585   def_fn_type (ENUM, RETURN, 0, 0);
4586 #define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1) \
4587   def_fn_type (ENUM, RETURN, 0, 1, ARG1);
4588 #define DEF_FUNCTION_TYPE_2(ENUM, RETURN, ARG1, ARG2) \
4589   def_fn_type (ENUM, RETURN, 0, 2, ARG1, ARG2);
4590 #define DEF_FUNCTION_TYPE_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
4591   def_fn_type (ENUM, RETURN, 0, 3, ARG1, ARG2, ARG3);
4592 #define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
4593   def_fn_type (ENUM, RETURN, 0, 4, ARG1, ARG2, ARG3, ARG4);
4594 #define DEF_FUNCTION_TYPE_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5)	\
4595   def_fn_type (ENUM, RETURN, 0, 5, ARG1, ARG2, ARG3, ARG4, ARG5);
4596 #define DEF_FUNCTION_TYPE_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
4597 			    ARG6)					\
4598   def_fn_type (ENUM, RETURN, 0, 6, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
4599 #define DEF_FUNCTION_TYPE_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
4600 			    ARG6, ARG7)					\
4601   def_fn_type (ENUM, RETURN, 0, 7, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7);
4602 #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \
4603   def_fn_type (ENUM, RETURN, 1, 0);
4604 #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \
4605   def_fn_type (ENUM, RETURN, 1, 1, ARG1);
4606 #define DEF_FUNCTION_TYPE_VAR_2(ENUM, RETURN, ARG1, ARG2) \
4607   def_fn_type (ENUM, RETURN, 1, 2, ARG1, ARG2);
4608 #define DEF_FUNCTION_TYPE_VAR_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
4609   def_fn_type (ENUM, RETURN, 1, 3, ARG1, ARG2, ARG3);
4610 #define DEF_FUNCTION_TYPE_VAR_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
4611   def_fn_type (ENUM, RETURN, 1, 4, ARG1, ARG2, ARG3, ARG4);
4612 #define DEF_FUNCTION_TYPE_VAR_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \
4613   def_fn_type (ENUM, RETURN, 1, 5, ARG1, ARG2, ARG3, ARG4, ARG5);
4614 #define DEF_POINTER_TYPE(ENUM, TYPE) \
4615   builtin_types[(int) ENUM] = build_pointer_type (builtin_types[(int) TYPE]);
4616 
4617 #include "builtin-types.def"
4618 
4619 #undef DEF_PRIMITIVE_TYPE
4620 #undef DEF_FUNCTION_TYPE_1
4621 #undef DEF_FUNCTION_TYPE_2
4622 #undef DEF_FUNCTION_TYPE_3
4623 #undef DEF_FUNCTION_TYPE_4
4624 #undef DEF_FUNCTION_TYPE_5
4625 #undef DEF_FUNCTION_TYPE_6
4626 #undef DEF_FUNCTION_TYPE_VAR_0
4627 #undef DEF_FUNCTION_TYPE_VAR_1
4628 #undef DEF_FUNCTION_TYPE_VAR_2
4629 #undef DEF_FUNCTION_TYPE_VAR_3
4630 #undef DEF_FUNCTION_TYPE_VAR_4
4631 #undef DEF_FUNCTION_TYPE_VAR_5
4632 #undef DEF_POINTER_TYPE
4633   builtin_types[(int) BT_LAST] = NULL_TREE;
4634 
4635   c_init_attributes ();
4636 
4637 #define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_P, FALLBACK_P, \
4638 		    NONANSI_P, ATTRS, IMPLICIT, COND)			\
4639   if (NAME && COND)							\
4640     def_builtin_1 (ENUM, NAME, CLASS,                                   \
4641 		   builtin_types[(int) TYPE],                           \
4642 		   builtin_types[(int) LIBTYPE],                        \
4643 		   BOTH_P, FALLBACK_P, NONANSI_P,                       \
4644 		   built_in_attributes[(int) ATTRS], IMPLICIT);
4645 #include "builtins.def"
4646 #undef DEF_BUILTIN
4647 
4648   targetm.init_builtins ();
4649 
4650   build_common_builtin_nodes ();
4651 
4652   if (flag_mudflap)
4653     mudflap_init ();
4654 }
4655 
4656 /* Like get_identifier, but avoid warnings about null arguments when
4657    the argument may be NULL for targets where GCC lacks stdint.h type
4658    information.  */
4659 
4660 static inline tree
4661 c_get_ident (const char *id)
4662 {
4663   return get_identifier (id);
4664 }
4665 
4666 /* Build tree nodes and builtin functions common to both C and C++ language
4667    frontends.  */
4668 
4669 void
4670 c_common_nodes_and_builtins (void)
4671 {
4672   int char16_type_size;
4673   int char32_type_size;
4674   int wchar_type_size;
4675   tree array_domain_type;
4676   tree va_list_ref_type_node;
4677   tree va_list_arg_type_node;
4678 
4679   build_common_tree_nodes (flag_signed_char, flag_short_double);
4680 
4681   /* Define `int' and `char' first so that dbx will output them first.  */
4682   record_builtin_type (RID_INT, NULL, integer_type_node);
4683   record_builtin_type (RID_CHAR, "char", char_type_node);
4684 
4685   /* `signed' is the same as `int'.  FIXME: the declarations of "signed",
4686      "unsigned long", "long long unsigned" and "unsigned short" were in C++
4687      but not C.  Are the conditionals here needed?  */
4688   if (c_dialect_cxx ())
4689     record_builtin_type (RID_SIGNED, NULL, integer_type_node);
4690   record_builtin_type (RID_LONG, "long int", long_integer_type_node);
4691   record_builtin_type (RID_UNSIGNED, "unsigned int", unsigned_type_node);
4692   record_builtin_type (RID_MAX, "long unsigned int",
4693 		       long_unsigned_type_node);
4694   if (int128_integer_type_node != NULL_TREE)
4695     {
4696       record_builtin_type (RID_INT128, "__int128",
4697 			   int128_integer_type_node);
4698       record_builtin_type (RID_MAX, "__int128 unsigned",
4699 			   int128_unsigned_type_node);
4700     }
4701   if (c_dialect_cxx ())
4702     record_builtin_type (RID_MAX, "unsigned long", long_unsigned_type_node);
4703   record_builtin_type (RID_MAX, "long long int",
4704 		       long_long_integer_type_node);
4705   record_builtin_type (RID_MAX, "long long unsigned int",
4706 		       long_long_unsigned_type_node);
4707   if (c_dialect_cxx ())
4708     record_builtin_type (RID_MAX, "long long unsigned",
4709 			 long_long_unsigned_type_node);
4710   record_builtin_type (RID_SHORT, "short int", short_integer_type_node);
4711   record_builtin_type (RID_MAX, "short unsigned int",
4712 		       short_unsigned_type_node);
4713   if (c_dialect_cxx ())
4714     record_builtin_type (RID_MAX, "unsigned short",
4715 			 short_unsigned_type_node);
4716 
4717   /* Define both `signed char' and `unsigned char'.  */
4718   record_builtin_type (RID_MAX, "signed char", signed_char_type_node);
4719   record_builtin_type (RID_MAX, "unsigned char", unsigned_char_type_node);
4720 
4721   /* These are types that c_common_type_for_size and
4722      c_common_type_for_mode use.  */
4723   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4724 					 TYPE_DECL, NULL_TREE,
4725 					 intQI_type_node));
4726   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4727 					 TYPE_DECL, NULL_TREE,
4728 					 intHI_type_node));
4729   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4730 					 TYPE_DECL, NULL_TREE,
4731 					 intSI_type_node));
4732   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4733 					 TYPE_DECL, NULL_TREE,
4734 					 intDI_type_node));
4735 #if HOST_BITS_PER_WIDE_INT >= 64
4736   if (targetm.scalar_mode_supported_p (TImode))
4737     lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4738 					   TYPE_DECL,
4739 					   get_identifier ("__int128_t"),
4740 					   intTI_type_node));
4741 #endif
4742   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4743 					 TYPE_DECL, NULL_TREE,
4744 					 unsigned_intQI_type_node));
4745   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4746 					 TYPE_DECL, NULL_TREE,
4747 					 unsigned_intHI_type_node));
4748   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4749 					 TYPE_DECL, NULL_TREE,
4750 					 unsigned_intSI_type_node));
4751   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4752 					 TYPE_DECL, NULL_TREE,
4753 					 unsigned_intDI_type_node));
4754 #if HOST_BITS_PER_WIDE_INT >= 64
4755   if (targetm.scalar_mode_supported_p (TImode))
4756     lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4757 					   TYPE_DECL,
4758 					   get_identifier ("__uint128_t"),
4759 					   unsigned_intTI_type_node));
4760 #endif
4761 
4762   /* Create the widest literal types.  */
4763   widest_integer_literal_type_node
4764     = make_signed_type (HOST_BITS_PER_WIDE_INT * 2);
4765   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4766 					 TYPE_DECL, NULL_TREE,
4767 					 widest_integer_literal_type_node));
4768 
4769   widest_unsigned_literal_type_node
4770     = make_unsigned_type (HOST_BITS_PER_WIDE_INT * 2);
4771   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4772 					 TYPE_DECL, NULL_TREE,
4773 					 widest_unsigned_literal_type_node));
4774 
4775   signed_size_type_node = c_common_signed_type (size_type_node);
4776 
4777   pid_type_node =
4778     TREE_TYPE (identifier_global_value (get_identifier (PID_TYPE)));
4779 
4780   record_builtin_type (RID_FLOAT, NULL, float_type_node);
4781   record_builtin_type (RID_DOUBLE, NULL, double_type_node);
4782   record_builtin_type (RID_MAX, "long double", long_double_type_node);
4783 
4784   /* Only supported decimal floating point extension if the target
4785      actually supports underlying modes. */
4786   if (targetm.scalar_mode_supported_p (SDmode)
4787       && targetm.scalar_mode_supported_p (DDmode)
4788       && targetm.scalar_mode_supported_p (TDmode))
4789     {
4790       record_builtin_type (RID_DFLOAT32, NULL, dfloat32_type_node);
4791       record_builtin_type (RID_DFLOAT64, NULL, dfloat64_type_node);
4792       record_builtin_type (RID_DFLOAT128, NULL, dfloat128_type_node);
4793     }
4794 
4795   if (targetm.fixed_point_supported_p ())
4796     {
4797       record_builtin_type (RID_MAX, "short _Fract", short_fract_type_node);
4798       record_builtin_type (RID_FRACT, NULL, fract_type_node);
4799       record_builtin_type (RID_MAX, "long _Fract", long_fract_type_node);
4800       record_builtin_type (RID_MAX, "long long _Fract",
4801 			   long_long_fract_type_node);
4802       record_builtin_type (RID_MAX, "unsigned short _Fract",
4803 			   unsigned_short_fract_type_node);
4804       record_builtin_type (RID_MAX, "unsigned _Fract",
4805 			   unsigned_fract_type_node);
4806       record_builtin_type (RID_MAX, "unsigned long _Fract",
4807 			   unsigned_long_fract_type_node);
4808       record_builtin_type (RID_MAX, "unsigned long long _Fract",
4809 			   unsigned_long_long_fract_type_node);
4810       record_builtin_type (RID_MAX, "_Sat short _Fract",
4811 			   sat_short_fract_type_node);
4812       record_builtin_type (RID_MAX, "_Sat _Fract", sat_fract_type_node);
4813       record_builtin_type (RID_MAX, "_Sat long _Fract",
4814 			   sat_long_fract_type_node);
4815       record_builtin_type (RID_MAX, "_Sat long long _Fract",
4816 			   sat_long_long_fract_type_node);
4817       record_builtin_type (RID_MAX, "_Sat unsigned short _Fract",
4818 			   sat_unsigned_short_fract_type_node);
4819       record_builtin_type (RID_MAX, "_Sat unsigned _Fract",
4820 			   sat_unsigned_fract_type_node);
4821       record_builtin_type (RID_MAX, "_Sat unsigned long _Fract",
4822 			   sat_unsigned_long_fract_type_node);
4823       record_builtin_type (RID_MAX, "_Sat unsigned long long _Fract",
4824 			   sat_unsigned_long_long_fract_type_node);
4825       record_builtin_type (RID_MAX, "short _Accum", short_accum_type_node);
4826       record_builtin_type (RID_ACCUM, NULL, accum_type_node);
4827       record_builtin_type (RID_MAX, "long _Accum", long_accum_type_node);
4828       record_builtin_type (RID_MAX, "long long _Accum",
4829 			   long_long_accum_type_node);
4830       record_builtin_type (RID_MAX, "unsigned short _Accum",
4831 			   unsigned_short_accum_type_node);
4832       record_builtin_type (RID_MAX, "unsigned _Accum",
4833 			   unsigned_accum_type_node);
4834       record_builtin_type (RID_MAX, "unsigned long _Accum",
4835 			   unsigned_long_accum_type_node);
4836       record_builtin_type (RID_MAX, "unsigned long long _Accum",
4837 			   unsigned_long_long_accum_type_node);
4838       record_builtin_type (RID_MAX, "_Sat short _Accum",
4839 			   sat_short_accum_type_node);
4840       record_builtin_type (RID_MAX, "_Sat _Accum", sat_accum_type_node);
4841       record_builtin_type (RID_MAX, "_Sat long _Accum",
4842 			   sat_long_accum_type_node);
4843       record_builtin_type (RID_MAX, "_Sat long long _Accum",
4844 			  sat_long_long_accum_type_node);
4845       record_builtin_type (RID_MAX, "_Sat unsigned short _Accum",
4846 			   sat_unsigned_short_accum_type_node);
4847       record_builtin_type (RID_MAX, "_Sat unsigned _Accum",
4848 			   sat_unsigned_accum_type_node);
4849       record_builtin_type (RID_MAX, "_Sat unsigned long _Accum",
4850 			   sat_unsigned_long_accum_type_node);
4851       record_builtin_type (RID_MAX, "_Sat unsigned long long _Accum",
4852 			   sat_unsigned_long_long_accum_type_node);
4853 
4854     }
4855 
4856   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4857 					 TYPE_DECL,
4858 					 get_identifier ("complex int"),
4859 					 complex_integer_type_node));
4860   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4861 					 TYPE_DECL,
4862 					 get_identifier ("complex float"),
4863 					 complex_float_type_node));
4864   lang_hooks.decls.pushdecl (build_decl (UNKNOWN_LOCATION,
4865 					 TYPE_DECL,
4866 					 get_identifier ("complex double"),
4867 					 complex_double_type_node));
4868   lang_hooks.decls.pushdecl
4869     (build_decl (UNKNOWN_LOCATION,
4870 		 TYPE_DECL, get_identifier ("complex long double"),
4871 		 complex_long_double_type_node));
4872 
4873   if (c_dialect_cxx ())
4874     /* For C++, make fileptr_type_node a distinct void * type until
4875        FILE type is defined.  */
4876     fileptr_type_node = build_variant_type_copy (ptr_type_node);
4877 
4878   record_builtin_type (RID_VOID, NULL, void_type_node);
4879 
4880   /* Set the TYPE_NAME for any variants that were built before
4881      record_builtin_type gave names to the built-in types. */
4882   {
4883     tree void_name = TYPE_NAME (void_type_node);
4884     TYPE_NAME (void_type_node) = NULL_TREE;
4885     TYPE_NAME (build_qualified_type (void_type_node, TYPE_QUAL_CONST))
4886       = void_name;
4887     TYPE_NAME (void_type_node) = void_name;
4888   }
4889 
4890   /* This node must not be shared.  */
4891   void_zero_node = make_node (INTEGER_CST);
4892   TREE_TYPE (void_zero_node) = void_type_node;
4893 
4894   void_list_node = build_void_list_node ();
4895 
4896   /* Make a type to be the domain of a few array types
4897      whose domains don't really matter.
4898      200 is small enough that it always fits in size_t
4899      and large enough that it can hold most function names for the
4900      initializations of __FUNCTION__ and __PRETTY_FUNCTION__.  */
4901   array_domain_type = build_index_type (size_int (200));
4902 
4903   /* Make a type for arrays of characters.
4904      With luck nothing will ever really depend on the length of this
4905      array type.  */
4906   char_array_type_node
4907     = build_array_type (char_type_node, array_domain_type);
4908 
4909   /* Likewise for arrays of ints.  */
4910   int_array_type_node
4911     = build_array_type (integer_type_node, array_domain_type);
4912 
4913   string_type_node = build_pointer_type (char_type_node);
4914   const_string_type_node
4915     = build_pointer_type (build_qualified_type
4916 			  (char_type_node, TYPE_QUAL_CONST));
4917 
4918   /* This is special for C++ so functions can be overloaded.  */
4919   wchar_type_node = get_identifier (MODIFIED_WCHAR_TYPE);
4920   wchar_type_node = TREE_TYPE (identifier_global_value (wchar_type_node));
4921   wchar_type_size = TYPE_PRECISION (wchar_type_node);
4922   underlying_wchar_type_node = wchar_type_node;
4923   if (c_dialect_cxx ())
4924     {
4925       if (TYPE_UNSIGNED (wchar_type_node))
4926 	wchar_type_node = make_unsigned_type (wchar_type_size);
4927       else
4928 	wchar_type_node = make_signed_type (wchar_type_size);
4929       record_builtin_type (RID_WCHAR, "wchar_t", wchar_type_node);
4930     }
4931 
4932   /* This is for wide string constants.  */
4933   wchar_array_type_node
4934     = build_array_type (wchar_type_node, array_domain_type);
4935 
4936   /* Define 'char16_t'.  */
4937   char16_type_node = get_identifier (CHAR16_TYPE);
4938   char16_type_node = TREE_TYPE (identifier_global_value (char16_type_node));
4939   char16_type_size = TYPE_PRECISION (char16_type_node);
4940   if (c_dialect_cxx ())
4941     {
4942       char16_type_node = make_unsigned_type (char16_type_size);
4943 
4944       if (cxx_dialect == cxx0x)
4945 	record_builtin_type (RID_CHAR16, "char16_t", char16_type_node);
4946     }
4947 
4948   /* This is for UTF-16 string constants.  */
4949   char16_array_type_node
4950     = build_array_type (char16_type_node, array_domain_type);
4951 
4952   /* Define 'char32_t'.  */
4953   char32_type_node = get_identifier (CHAR32_TYPE);
4954   char32_type_node = TREE_TYPE (identifier_global_value (char32_type_node));
4955   char32_type_size = TYPE_PRECISION (char32_type_node);
4956   if (c_dialect_cxx ())
4957     {
4958       char32_type_node = make_unsigned_type (char32_type_size);
4959 
4960       if (cxx_dialect == cxx0x)
4961 	record_builtin_type (RID_CHAR32, "char32_t", char32_type_node);
4962     }
4963 
4964   /* This is for UTF-32 string constants.  */
4965   char32_array_type_node
4966     = build_array_type (char32_type_node, array_domain_type);
4967 
4968   wint_type_node =
4969     TREE_TYPE (identifier_global_value (get_identifier (WINT_TYPE)));
4970 
4971   intmax_type_node =
4972     TREE_TYPE (identifier_global_value (get_identifier (INTMAX_TYPE)));
4973   uintmax_type_node =
4974     TREE_TYPE (identifier_global_value (get_identifier (UINTMAX_TYPE)));
4975 
4976   if (SIG_ATOMIC_TYPE)
4977     sig_atomic_type_node =
4978       TREE_TYPE (identifier_global_value (c_get_ident (SIG_ATOMIC_TYPE)));
4979   if (INT8_TYPE)
4980     int8_type_node =
4981       TREE_TYPE (identifier_global_value (c_get_ident (INT8_TYPE)));
4982   if (INT16_TYPE)
4983     int16_type_node =
4984       TREE_TYPE (identifier_global_value (c_get_ident (INT16_TYPE)));
4985   if (INT32_TYPE)
4986     int32_type_node =
4987       TREE_TYPE (identifier_global_value (c_get_ident (INT32_TYPE)));
4988   if (INT64_TYPE)
4989     int64_type_node =
4990       TREE_TYPE (identifier_global_value (c_get_ident (INT64_TYPE)));
4991   if (UINT8_TYPE)
4992     uint8_type_node =
4993       TREE_TYPE (identifier_global_value (c_get_ident (UINT8_TYPE)));
4994   if (UINT16_TYPE)
4995     uint16_type_node =
4996       TREE_TYPE (identifier_global_value (c_get_ident (UINT16_TYPE)));
4997   if (UINT32_TYPE)
4998     c_uint32_type_node =
4999       TREE_TYPE (identifier_global_value (c_get_ident (UINT32_TYPE)));
5000   if (UINT64_TYPE)
5001     c_uint64_type_node =
5002       TREE_TYPE (identifier_global_value (c_get_ident (UINT64_TYPE)));
5003   if (INT_LEAST8_TYPE)
5004     int_least8_type_node =
5005       TREE_TYPE (identifier_global_value (c_get_ident (INT_LEAST8_TYPE)));
5006   if (INT_LEAST16_TYPE)
5007     int_least16_type_node =
5008       TREE_TYPE (identifier_global_value (c_get_ident (INT_LEAST16_TYPE)));
5009   if (INT_LEAST32_TYPE)
5010     int_least32_type_node =
5011       TREE_TYPE (identifier_global_value (c_get_ident (INT_LEAST32_TYPE)));
5012   if (INT_LEAST64_TYPE)
5013     int_least64_type_node =
5014       TREE_TYPE (identifier_global_value (c_get_ident (INT_LEAST64_TYPE)));
5015   if (UINT_LEAST8_TYPE)
5016     uint_least8_type_node =
5017       TREE_TYPE (identifier_global_value (c_get_ident (UINT_LEAST8_TYPE)));
5018   if (UINT_LEAST16_TYPE)
5019     uint_least16_type_node =
5020       TREE_TYPE (identifier_global_value (c_get_ident (UINT_LEAST16_TYPE)));
5021   if (UINT_LEAST32_TYPE)
5022     uint_least32_type_node =
5023       TREE_TYPE (identifier_global_value (c_get_ident (UINT_LEAST32_TYPE)));
5024   if (UINT_LEAST64_TYPE)
5025     uint_least64_type_node =
5026       TREE_TYPE (identifier_global_value (c_get_ident (UINT_LEAST64_TYPE)));
5027   if (INT_FAST8_TYPE)
5028     int_fast8_type_node =
5029       TREE_TYPE (identifier_global_value (c_get_ident (INT_FAST8_TYPE)));
5030   if (INT_FAST16_TYPE)
5031     int_fast16_type_node =
5032       TREE_TYPE (identifier_global_value (c_get_ident (INT_FAST16_TYPE)));
5033   if (INT_FAST32_TYPE)
5034     int_fast32_type_node =
5035       TREE_TYPE (identifier_global_value (c_get_ident (INT_FAST32_TYPE)));
5036   if (INT_FAST64_TYPE)
5037     int_fast64_type_node =
5038       TREE_TYPE (identifier_global_value (c_get_ident (INT_FAST64_TYPE)));
5039   if (UINT_FAST8_TYPE)
5040     uint_fast8_type_node =
5041       TREE_TYPE (identifier_global_value (c_get_ident (UINT_FAST8_TYPE)));
5042   if (UINT_FAST16_TYPE)
5043     uint_fast16_type_node =
5044       TREE_TYPE (identifier_global_value (c_get_ident (UINT_FAST16_TYPE)));
5045   if (UINT_FAST32_TYPE)
5046     uint_fast32_type_node =
5047       TREE_TYPE (identifier_global_value (c_get_ident (UINT_FAST32_TYPE)));
5048   if (UINT_FAST64_TYPE)
5049     uint_fast64_type_node =
5050       TREE_TYPE (identifier_global_value (c_get_ident (UINT_FAST64_TYPE)));
5051   if (INTPTR_TYPE)
5052     intptr_type_node =
5053       TREE_TYPE (identifier_global_value (c_get_ident (INTPTR_TYPE)));
5054   if (UINTPTR_TYPE)
5055     uintptr_type_node =
5056       TREE_TYPE (identifier_global_value (c_get_ident (UINTPTR_TYPE)));
5057 
5058   default_function_type
5059     = build_varargs_function_type_list (integer_type_node, NULL_TREE);
5060   ptrdiff_type_node
5061     = TREE_TYPE (identifier_global_value (get_identifier (PTRDIFF_TYPE)));
5062   unsigned_ptrdiff_type_node = c_common_unsigned_type (ptrdiff_type_node);
5063 
5064   lang_hooks.decls.pushdecl
5065     (build_decl (UNKNOWN_LOCATION,
5066 		 TYPE_DECL, get_identifier ("__builtin_va_list"),
5067 		 va_list_type_node));
5068   if (targetm.enum_va_list_p)
5069     {
5070       int l;
5071       const char *pname;
5072       tree ptype;
5073 
5074       for (l = 0; targetm.enum_va_list_p (l, &pname, &ptype); ++l)
5075 	{
5076 	  lang_hooks.decls.pushdecl
5077 	    (build_decl (UNKNOWN_LOCATION,
5078 		         TYPE_DECL, get_identifier (pname),
5079 	  	         ptype));
5080 
5081 	}
5082     }
5083 
5084   if (TREE_CODE (va_list_type_node) == ARRAY_TYPE)
5085     {
5086       va_list_arg_type_node = va_list_ref_type_node =
5087 	build_pointer_type (TREE_TYPE (va_list_type_node));
5088     }
5089   else
5090     {
5091       va_list_arg_type_node = va_list_type_node;
5092       va_list_ref_type_node = build_reference_type (va_list_type_node);
5093     }
5094 
5095   if (!flag_preprocess_only)
5096     c_define_builtins (va_list_ref_type_node, va_list_arg_type_node);
5097 
5098   main_identifier_node = get_identifier ("main");
5099 
5100   /* Create the built-in __null node.  It is important that this is
5101      not shared.  */
5102   null_node = make_node (INTEGER_CST);
5103   TREE_TYPE (null_node) = c_common_type_for_size (POINTER_SIZE, 0);
5104 
5105   /* Since builtin_types isn't gc'ed, don't export these nodes.  */
5106   memset (builtin_types, 0, sizeof (builtin_types));
5107 }
5108 
5109 /* The number of named compound-literals generated thus far.  */
5110 static GTY(()) int compound_literal_number;
5111 
5112 /* Set DECL_NAME for DECL, a VAR_DECL for a compound-literal.  */
5113 
5114 void
5115 set_compound_literal_name (tree decl)
5116 {
5117   char *name;
5118   ASM_FORMAT_PRIVATE_NAME (name, "__compound_literal",
5119 			   compound_literal_number);
5120   compound_literal_number++;
5121   DECL_NAME (decl) = get_identifier (name);
5122 }
5123 
5124 tree
5125 build_va_arg (location_t loc, tree expr, tree type)
5126 {
5127   expr = build1 (VA_ARG_EXPR, type, expr);
5128   SET_EXPR_LOCATION (expr, loc);
5129   return expr;
5130 }
5131 
5132 
5133 /* Linked list of disabled built-in functions.  */
5134 
5135 typedef struct disabled_builtin
5136 {
5137   const char *name;
5138   struct disabled_builtin *next;
5139 } disabled_builtin;
5140 static disabled_builtin *disabled_builtins = NULL;
5141 
5142 static bool builtin_function_disabled_p (const char *);
5143 
5144 /* Disable a built-in function specified by -fno-builtin-NAME.  If NAME
5145    begins with "__builtin_", give an error.  */
5146 
5147 void
5148 disable_builtin_function (const char *name)
5149 {
5150   if (strncmp (name, "__builtin_", strlen ("__builtin_")) == 0)
5151     error ("cannot disable built-in function %qs", name);
5152   else
5153     {
5154       disabled_builtin *new_disabled_builtin = XNEW (disabled_builtin);
5155       new_disabled_builtin->name = name;
5156       new_disabled_builtin->next = disabled_builtins;
5157       disabled_builtins = new_disabled_builtin;
5158     }
5159 }
5160 
5161 
5162 /* Return true if the built-in function NAME has been disabled, false
5163    otherwise.  */
5164 
5165 static bool
5166 builtin_function_disabled_p (const char *name)
5167 {
5168   disabled_builtin *p;
5169   for (p = disabled_builtins; p != NULL; p = p->next)
5170     {
5171       if (strcmp (name, p->name) == 0)
5172 	return true;
5173     }
5174   return false;
5175 }
5176 
5177 
5178 /* Worker for DEF_BUILTIN.
5179    Possibly define a builtin function with one or two names.
5180    Does not declare a non-__builtin_ function if flag_no_builtin, or if
5181    nonansi_p and flag_no_nonansi_builtin.  */
5182 
5183 static void
5184 def_builtin_1 (enum built_in_function fncode,
5185 	       const char *name,
5186 	       enum built_in_class fnclass,
5187 	       tree fntype, tree libtype,
5188 	       bool both_p, bool fallback_p, bool nonansi_p,
5189 	       tree fnattrs, bool implicit_p)
5190 {
5191   tree decl;
5192   const char *libname;
5193 
5194   if (fntype == error_mark_node)
5195     return;
5196 
5197   gcc_assert ((!both_p && !fallback_p)
5198 	      || !strncmp (name, "__builtin_",
5199 			   strlen ("__builtin_")));
5200 
5201   libname = name + strlen ("__builtin_");
5202   decl = add_builtin_function (name, fntype, fncode, fnclass,
5203 			       (fallback_p ? libname : NULL),
5204 			       fnattrs);
5205 
5206   set_builtin_decl (fncode, decl, implicit_p);
5207 
5208   if (both_p
5209       && !flag_no_builtin && !builtin_function_disabled_p (libname)
5210       && !(nonansi_p && flag_no_nonansi_builtin))
5211     add_builtin_function (libname, libtype, fncode, fnclass,
5212 			  NULL, fnattrs);
5213 }
5214 
5215 /* Nonzero if the type T promotes to int.  This is (nearly) the
5216    integral promotions defined in ISO C99 6.3.1.1/2.  */
5217 
5218 bool
5219 c_promoting_integer_type_p (const_tree t)
5220 {
5221   switch (TREE_CODE (t))
5222     {
5223     case INTEGER_TYPE:
5224       return (TYPE_MAIN_VARIANT (t) == char_type_node
5225 	      || TYPE_MAIN_VARIANT (t) == signed_char_type_node
5226 	      || TYPE_MAIN_VARIANT (t) == unsigned_char_type_node
5227 	      || TYPE_MAIN_VARIANT (t) == short_integer_type_node
5228 	      || TYPE_MAIN_VARIANT (t) == short_unsigned_type_node
5229 	      || TYPE_PRECISION (t) < TYPE_PRECISION (integer_type_node));
5230 
5231     case ENUMERAL_TYPE:
5232       /* ??? Technically all enumerations not larger than an int
5233 	 promote to an int.  But this is used along code paths
5234 	 that only want to notice a size change.  */
5235       return TYPE_PRECISION (t) < TYPE_PRECISION (integer_type_node);
5236 
5237     case BOOLEAN_TYPE:
5238       return 1;
5239 
5240     default:
5241       return 0;
5242     }
5243 }
5244 
5245 /* Return 1 if PARMS specifies a fixed number of parameters
5246    and none of their types is affected by default promotions.  */
5247 
5248 int
5249 self_promoting_args_p (const_tree parms)
5250 {
5251   const_tree t;
5252   for (t = parms; t; t = TREE_CHAIN (t))
5253     {
5254       tree type = TREE_VALUE (t);
5255 
5256       if (type == error_mark_node)
5257 	continue;
5258 
5259       if (TREE_CHAIN (t) == 0 && type != void_type_node)
5260 	return 0;
5261 
5262       if (type == 0)
5263 	return 0;
5264 
5265       if (TYPE_MAIN_VARIANT (type) == float_type_node)
5266 	return 0;
5267 
5268       if (c_promoting_integer_type_p (type))
5269 	return 0;
5270     }
5271   return 1;
5272 }
5273 
5274 /* Recursively remove any '*' or '&' operator from TYPE.  */
5275 tree
5276 strip_pointer_operator (tree t)
5277 {
5278   while (POINTER_TYPE_P (t))
5279     t = TREE_TYPE (t);
5280   return t;
5281 }
5282 
5283 /* Recursively remove pointer or array type from TYPE. */
5284 tree
5285 strip_pointer_or_array_types (tree t)
5286 {
5287   while (TREE_CODE (t) == ARRAY_TYPE || POINTER_TYPE_P (t))
5288     t = TREE_TYPE (t);
5289   return t;
5290 }
5291 
5292 /* Used to compare case labels.  K1 and K2 are actually tree nodes
5293    representing case labels, or NULL_TREE for a `default' label.
5294    Returns -1 if K1 is ordered before K2, -1 if K1 is ordered after
5295    K2, and 0 if K1 and K2 are equal.  */
5296 
5297 int
5298 case_compare (splay_tree_key k1, splay_tree_key k2)
5299 {
5300   /* Consider a NULL key (such as arises with a `default' label) to be
5301      smaller than anything else.  */
5302   if (!k1)
5303     return k2 ? -1 : 0;
5304   else if (!k2)
5305     return k1 ? 1 : 0;
5306 
5307   return tree_int_cst_compare ((tree) k1, (tree) k2);
5308 }
5309 
5310 /* Process a case label, located at LOC, for the range LOW_VALUE
5311    ... HIGH_VALUE.  If LOW_VALUE and HIGH_VALUE are both NULL_TREE
5312    then this case label is actually a `default' label.  If only
5313    HIGH_VALUE is NULL_TREE, then case label was declared using the
5314    usual C/C++ syntax, rather than the GNU case range extension.
5315    CASES is a tree containing all the case ranges processed so far;
5316    COND is the condition for the switch-statement itself.  Returns the
5317    CASE_LABEL_EXPR created, or ERROR_MARK_NODE if no CASE_LABEL_EXPR
5318    is created.  */
5319 
5320 tree
5321 c_add_case_label (location_t loc, splay_tree cases, tree cond, tree orig_type,
5322 		  tree low_value, tree high_value)
5323 {
5324   tree type;
5325   tree label;
5326   tree case_label;
5327   splay_tree_node node;
5328 
5329   /* Create the LABEL_DECL itself.  */
5330   label = create_artificial_label (loc);
5331 
5332   /* If there was an error processing the switch condition, bail now
5333      before we get more confused.  */
5334   if (!cond || cond == error_mark_node)
5335     goto error_out;
5336 
5337   if ((low_value && TREE_TYPE (low_value)
5338        && POINTER_TYPE_P (TREE_TYPE (low_value)))
5339       || (high_value && TREE_TYPE (high_value)
5340 	  && POINTER_TYPE_P (TREE_TYPE (high_value))))
5341     {
5342       error_at (loc, "pointers are not permitted as case values");
5343       goto error_out;
5344     }
5345 
5346   /* Case ranges are a GNU extension.  */
5347   if (high_value)
5348     pedwarn (loc, OPT_pedantic,
5349 	     "range expressions in switch statements are non-standard");
5350 
5351   type = TREE_TYPE (cond);
5352   if (low_value)
5353     {
5354       low_value = check_case_value (low_value);
5355       low_value = convert_and_check (type, low_value);
5356       if (low_value == error_mark_node)
5357 	goto error_out;
5358     }
5359   if (high_value)
5360     {
5361       high_value = check_case_value (high_value);
5362       high_value = convert_and_check (type, high_value);
5363       if (high_value == error_mark_node)
5364 	goto error_out;
5365     }
5366 
5367   if (low_value && high_value)
5368     {
5369       /* If the LOW_VALUE and HIGH_VALUE are the same, then this isn't
5370 	 really a case range, even though it was written that way.
5371 	 Remove the HIGH_VALUE to simplify later processing.  */
5372       if (tree_int_cst_equal (low_value, high_value))
5373 	high_value = NULL_TREE;
5374       else if (!tree_int_cst_lt (low_value, high_value))
5375 	warning_at (loc, 0, "empty range specified");
5376     }
5377 
5378   /* See if the case is in range of the type of the original testing
5379      expression.  If both low_value and high_value are out of range,
5380      don't insert the case label and return NULL_TREE.  */
5381   if (low_value
5382       && !check_case_bounds (type, orig_type,
5383 			     &low_value, high_value ? &high_value : NULL))
5384     return NULL_TREE;
5385 
5386   /* Look up the LOW_VALUE in the table of case labels we already
5387      have.  */
5388   node = splay_tree_lookup (cases, (splay_tree_key) low_value);
5389   /* If there was not an exact match, check for overlapping ranges.
5390      There's no need to do this if there's no LOW_VALUE or HIGH_VALUE;
5391      that's a `default' label and the only overlap is an exact match.  */
5392   if (!node && (low_value || high_value))
5393     {
5394       splay_tree_node low_bound;
5395       splay_tree_node high_bound;
5396 
5397       /* Even though there wasn't an exact match, there might be an
5398 	 overlap between this case range and another case range.
5399 	 Since we've (inductively) not allowed any overlapping case
5400 	 ranges, we simply need to find the greatest low case label
5401 	 that is smaller that LOW_VALUE, and the smallest low case
5402 	 label that is greater than LOW_VALUE.  If there is an overlap
5403 	 it will occur in one of these two ranges.  */
5404       low_bound = splay_tree_predecessor (cases,
5405 					  (splay_tree_key) low_value);
5406       high_bound = splay_tree_successor (cases,
5407 					 (splay_tree_key) low_value);
5408 
5409       /* Check to see if the LOW_BOUND overlaps.  It is smaller than
5410 	 the LOW_VALUE, so there is no need to check unless the
5411 	 LOW_BOUND is in fact itself a case range.  */
5412       if (low_bound
5413 	  && CASE_HIGH ((tree) low_bound->value)
5414 	  && tree_int_cst_compare (CASE_HIGH ((tree) low_bound->value),
5415 				    low_value) >= 0)
5416 	node = low_bound;
5417       /* Check to see if the HIGH_BOUND overlaps.  The low end of that
5418 	 range is bigger than the low end of the current range, so we
5419 	 are only interested if the current range is a real range, and
5420 	 not an ordinary case label.  */
5421       else if (high_bound
5422 	       && high_value
5423 	       && (tree_int_cst_compare ((tree) high_bound->key,
5424 					 high_value)
5425 		   <= 0))
5426 	node = high_bound;
5427     }
5428   /* If there was an overlap, issue an error.  */
5429   if (node)
5430     {
5431       tree duplicate = CASE_LABEL ((tree) node->value);
5432 
5433       if (high_value)
5434 	{
5435 	  error_at (loc, "duplicate (or overlapping) case value");
5436 	  error_at (DECL_SOURCE_LOCATION (duplicate),
5437 		    "this is the first entry overlapping that value");
5438 	}
5439       else if (low_value)
5440 	{
5441 	  error_at (loc, "duplicate case value") ;
5442 	  error_at (DECL_SOURCE_LOCATION (duplicate), "previously used here");
5443 	}
5444       else
5445 	{
5446 	  error_at (loc, "multiple default labels in one switch");
5447 	  error_at (DECL_SOURCE_LOCATION (duplicate),
5448 		    "this is the first default label");
5449 	}
5450       goto error_out;
5451     }
5452 
5453   /* Add a CASE_LABEL to the statement-tree.  */
5454   case_label = add_stmt (build_case_label (low_value, high_value, label));
5455   /* Register this case label in the splay tree.  */
5456   splay_tree_insert (cases,
5457 		     (splay_tree_key) low_value,
5458 		     (splay_tree_value) case_label);
5459 
5460   return case_label;
5461 
5462  error_out:
5463   /* Add a label so that the back-end doesn't think that the beginning of
5464      the switch is unreachable.  Note that we do not add a case label, as
5465      that just leads to duplicates and thence to failure later on.  */
5466   if (!cases->root)
5467     {
5468       tree t = create_artificial_label (loc);
5469       add_stmt (build_stmt (loc, LABEL_EXPR, t));
5470     }
5471   return error_mark_node;
5472 }
5473 
5474 /* Subroutines of c_do_switch_warnings, called via splay_tree_foreach.
5475    Used to verify that case values match up with enumerator values.  */
5476 
5477 static void
5478 match_case_to_enum_1 (tree key, tree type, tree label)
5479 {
5480   char buf[2 + 2*HOST_BITS_PER_WIDE_INT/4 + 1];
5481 
5482   /* ??? Not working too hard to print the double-word value.
5483      Should perhaps be done with %lwd in the diagnostic routines?  */
5484   if (TREE_INT_CST_HIGH (key) == 0)
5485     snprintf (buf, sizeof (buf), HOST_WIDE_INT_PRINT_UNSIGNED,
5486 	      TREE_INT_CST_LOW (key));
5487   else if (!TYPE_UNSIGNED (type)
5488 	   && TREE_INT_CST_HIGH (key) == -1
5489 	   && TREE_INT_CST_LOW (key) != 0)
5490     snprintf (buf, sizeof (buf), "-" HOST_WIDE_INT_PRINT_UNSIGNED,
5491 	      -TREE_INT_CST_LOW (key));
5492   else
5493     snprintf (buf, sizeof (buf), HOST_WIDE_INT_PRINT_DOUBLE_HEX,
5494 	      (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (key),
5495 	      (unsigned HOST_WIDE_INT) TREE_INT_CST_LOW (key));
5496 
5497   if (TYPE_NAME (type) == 0)
5498     warning_at (DECL_SOURCE_LOCATION (CASE_LABEL (label)),
5499 		warn_switch ? OPT_Wswitch : OPT_Wswitch_enum,
5500 		"case value %qs not in enumerated type",
5501 		buf);
5502   else
5503     warning_at (DECL_SOURCE_LOCATION (CASE_LABEL (label)),
5504 		warn_switch ? OPT_Wswitch : OPT_Wswitch_enum,
5505 		"case value %qs not in enumerated type %qT",
5506 		buf, type);
5507 }
5508 
5509 /* Subroutine of c_do_switch_warnings, called via splay_tree_foreach.
5510    Used to verify that case values match up with enumerator values.  */
5511 
5512 static int
5513 match_case_to_enum (splay_tree_node node, void *data)
5514 {
5515   tree label = (tree) node->value;
5516   tree type = (tree) data;
5517 
5518   /* Skip default case.  */
5519   if (!CASE_LOW (label))
5520     return 0;
5521 
5522   /* If CASE_LOW_SEEN is not set, that means CASE_LOW did not appear
5523      when we did our enum->case scan.  Reset our scratch bit after.  */
5524   if (!CASE_LOW_SEEN (label))
5525     match_case_to_enum_1 (CASE_LOW (label), type, label);
5526   else
5527     CASE_LOW_SEEN (label) = 0;
5528 
5529   /* If CASE_HIGH is non-null, we have a range.  If CASE_HIGH_SEEN is
5530      not set, that means that CASE_HIGH did not appear when we did our
5531      enum->case scan.  Reset our scratch bit after.  */
5532   if (CASE_HIGH (label))
5533     {
5534       if (!CASE_HIGH_SEEN (label))
5535 	match_case_to_enum_1 (CASE_HIGH (label), type, label);
5536       else
5537 	CASE_HIGH_SEEN (label) = 0;
5538     }
5539 
5540   return 0;
5541 }
5542 
5543 /* Handle -Wswitch*.  Called from the front end after parsing the
5544    switch construct.  */
5545 /* ??? Should probably be somewhere generic, since other languages
5546    besides C and C++ would want this.  At the moment, however, C/C++
5547    are the only tree-ssa languages that support enumerations at all,
5548    so the point is moot.  */
5549 
5550 void
5551 c_do_switch_warnings (splay_tree cases, location_t switch_location,
5552 		      tree type, tree cond)
5553 {
5554   splay_tree_node default_node;
5555   splay_tree_node node;
5556   tree chain;
5557 
5558   if (!warn_switch && !warn_switch_enum && !warn_switch_default)
5559     return;
5560 
5561   default_node = splay_tree_lookup (cases, (splay_tree_key) NULL);
5562   if (!default_node)
5563     warning_at (switch_location, OPT_Wswitch_default,
5564 		"switch missing default case");
5565 
5566   /* From here on, we only care about about enumerated types.  */
5567   if (!type || TREE_CODE (type) != ENUMERAL_TYPE)
5568     return;
5569 
5570   /* From here on, we only care about -Wswitch and -Wswitch-enum.  */
5571   if (!warn_switch_enum && !warn_switch)
5572     return;
5573 
5574   /* Check the cases.  Warn about case values which are not members of
5575      the enumerated type.  For -Wswitch-enum, or for -Wswitch when
5576      there is no default case, check that exactly all enumeration
5577      literals are covered by the cases.  */
5578 
5579   /* Clearing COND if it is not an integer constant simplifies
5580      the tests inside the loop below.  */
5581   if (TREE_CODE (cond) != INTEGER_CST)
5582     cond = NULL_TREE;
5583 
5584   /* The time complexity here is O(N*lg(N)) worst case, but for the
5585       common case of monotonically increasing enumerators, it is
5586       O(N), since the nature of the splay tree will keep the next
5587       element adjacent to the root at all times.  */
5588 
5589   for (chain = TYPE_VALUES (type); chain; chain = TREE_CHAIN (chain))
5590     {
5591       tree value = TREE_VALUE (chain);
5592       if (TREE_CODE (value) == CONST_DECL)
5593         value = DECL_INITIAL (value);
5594       node = splay_tree_lookup (cases, (splay_tree_key) value);
5595       if (node)
5596 	{
5597 	  /* Mark the CASE_LOW part of the case entry as seen.  */
5598 	  tree label = (tree) node->value;
5599 	  CASE_LOW_SEEN (label) = 1;
5600 	  continue;
5601 	}
5602 
5603       /* Even though there wasn't an exact match, there might be a
5604 	 case range which includes the enumerator's value.  */
5605       node = splay_tree_predecessor (cases, (splay_tree_key) value);
5606       if (node && CASE_HIGH ((tree) node->value))
5607 	{
5608 	  tree label = (tree) node->value;
5609 	  int cmp = tree_int_cst_compare (CASE_HIGH (label), value);
5610 	  if (cmp >= 0)
5611 	    {
5612 	      /* If we match the upper bound exactly, mark the CASE_HIGH
5613 		 part of the case entry as seen.  */
5614 	      if (cmp == 0)
5615 		CASE_HIGH_SEEN (label) = 1;
5616 	      continue;
5617 	    }
5618 	}
5619 
5620       /* We've now determined that this enumerated literal isn't
5621 	 handled by the case labels of the switch statement.  */
5622 
5623       /* If the switch expression is a constant, we only really care
5624 	 about whether that constant is handled by the switch.  */
5625       if (cond && tree_int_cst_compare (cond, value))
5626 	continue;
5627 
5628       /* If there is a default_node, the only relevant option is
5629 	 Wswitch-enum.  Otherwise, if both are enabled then we prefer
5630 	 to warn using -Wswitch because -Wswitch is enabled by -Wall
5631 	 while -Wswitch-enum is explicit.  */
5632       warning_at (switch_location,
5633 		  (default_node || !warn_switch
5634 		   ? OPT_Wswitch_enum
5635 		   : OPT_Wswitch),
5636 		  "enumeration value %qE not handled in switch",
5637 		  TREE_PURPOSE (chain));
5638     }
5639 
5640   /* Warn if there are case expressions that don't correspond to
5641      enumerators.  This can occur since C and C++ don't enforce
5642      type-checking of assignments to enumeration variables.
5643 
5644      The time complexity here is now always O(N) worst case, since
5645      we should have marked both the lower bound and upper bound of
5646      every disjoint case label, with CASE_LOW_SEEN and CASE_HIGH_SEEN
5647      above.  This scan also resets those fields.  */
5648 
5649   splay_tree_foreach (cases, match_case_to_enum, type);
5650 }
5651 
5652 /* Finish an expression taking the address of LABEL (an
5653    IDENTIFIER_NODE).  Returns an expression for the address.
5654 
5655    LOC is the location for the expression returned.  */
5656 
5657 tree
5658 finish_label_address_expr (tree label, location_t loc)
5659 {
5660   tree result;
5661 
5662   pedwarn (input_location, OPT_pedantic, "taking the address of a label is non-standard");
5663 
5664   if (label == error_mark_node)
5665     return error_mark_node;
5666 
5667   label = lookup_label (label);
5668   if (label == NULL_TREE)
5669     result = null_pointer_node;
5670   else
5671     {
5672       TREE_USED (label) = 1;
5673       result = build1 (ADDR_EXPR, ptr_type_node, label);
5674       /* The current function is not necessarily uninlinable.
5675 	 Computed gotos are incompatible with inlining, but the value
5676 	 here could be used only in a diagnostic, for example.  */
5677       protected_set_expr_location (result, loc);
5678     }
5679 
5680   return result;
5681 }
5682 
5683 
5684 /* Given a boolean expression ARG, return a tree representing an increment
5685    or decrement (as indicated by CODE) of ARG.  The front end must check for
5686    invalid cases (e.g., decrement in C++).  */
5687 tree
5688 boolean_increment (enum tree_code code, tree arg)
5689 {
5690   tree val;
5691   tree true_res = build_int_cst (TREE_TYPE (arg), 1);
5692 
5693   arg = stabilize_reference (arg);
5694   switch (code)
5695     {
5696     case PREINCREMENT_EXPR:
5697       val = build2 (MODIFY_EXPR, TREE_TYPE (arg), arg, true_res);
5698       break;
5699     case POSTINCREMENT_EXPR:
5700       val = build2 (MODIFY_EXPR, TREE_TYPE (arg), arg, true_res);
5701       arg = save_expr (arg);
5702       val = build2 (COMPOUND_EXPR, TREE_TYPE (arg), val, arg);
5703       val = build2 (COMPOUND_EXPR, TREE_TYPE (arg), arg, val);
5704       break;
5705     case PREDECREMENT_EXPR:
5706       val = build2 (MODIFY_EXPR, TREE_TYPE (arg), arg,
5707 		    invert_truthvalue_loc (input_location, arg));
5708       break;
5709     case POSTDECREMENT_EXPR:
5710       val = build2 (MODIFY_EXPR, TREE_TYPE (arg), arg,
5711 		    invert_truthvalue_loc (input_location, arg));
5712       arg = save_expr (arg);
5713       val = build2 (COMPOUND_EXPR, TREE_TYPE (arg), val, arg);
5714       val = build2 (COMPOUND_EXPR, TREE_TYPE (arg), arg, val);
5715       break;
5716     default:
5717       gcc_unreachable ();
5718     }
5719   TREE_SIDE_EFFECTS (val) = 1;
5720   return val;
5721 }
5722 
5723 /* Built-in macros for stddef.h and stdint.h, that require macros
5724    defined in this file.  */
5725 void
5726 c_stddef_cpp_builtins(void)
5727 {
5728   builtin_define_with_value ("__SIZE_TYPE__", SIZE_TYPE, 0);
5729   builtin_define_with_value ("__PTRDIFF_TYPE__", PTRDIFF_TYPE, 0);
5730   builtin_define_with_value ("__WCHAR_TYPE__", MODIFIED_WCHAR_TYPE, 0);
5731   builtin_define_with_value ("__WINT_TYPE__", WINT_TYPE, 0);
5732   builtin_define_with_value ("__INTMAX_TYPE__", INTMAX_TYPE, 0);
5733   builtin_define_with_value ("__UINTMAX_TYPE__", UINTMAX_TYPE, 0);
5734   builtin_define_with_value ("__CHAR16_TYPE__", CHAR16_TYPE, 0);
5735   builtin_define_with_value ("__CHAR32_TYPE__", CHAR32_TYPE, 0);
5736   if (SIG_ATOMIC_TYPE)
5737     builtin_define_with_value ("__SIG_ATOMIC_TYPE__", SIG_ATOMIC_TYPE, 0);
5738   if (INT8_TYPE)
5739     builtin_define_with_value ("__INT8_TYPE__", INT8_TYPE, 0);
5740   if (INT16_TYPE)
5741     builtin_define_with_value ("__INT16_TYPE__", INT16_TYPE, 0);
5742   if (INT32_TYPE)
5743     builtin_define_with_value ("__INT32_TYPE__", INT32_TYPE, 0);
5744   if (INT64_TYPE)
5745     builtin_define_with_value ("__INT64_TYPE__", INT64_TYPE, 0);
5746   if (UINT8_TYPE)
5747     builtin_define_with_value ("__UINT8_TYPE__", UINT8_TYPE, 0);
5748   if (UINT16_TYPE)
5749     builtin_define_with_value ("__UINT16_TYPE__", UINT16_TYPE, 0);
5750   if (UINT32_TYPE)
5751     builtin_define_with_value ("__UINT32_TYPE__", UINT32_TYPE, 0);
5752   if (UINT64_TYPE)
5753     builtin_define_with_value ("__UINT64_TYPE__", UINT64_TYPE, 0);
5754   if (INT_LEAST8_TYPE)
5755     builtin_define_with_value ("__INT_LEAST8_TYPE__", INT_LEAST8_TYPE, 0);
5756   if (INT_LEAST16_TYPE)
5757     builtin_define_with_value ("__INT_LEAST16_TYPE__", INT_LEAST16_TYPE, 0);
5758   if (INT_LEAST32_TYPE)
5759     builtin_define_with_value ("__INT_LEAST32_TYPE__", INT_LEAST32_TYPE, 0);
5760   if (INT_LEAST64_TYPE)
5761     builtin_define_with_value ("__INT_LEAST64_TYPE__", INT_LEAST64_TYPE, 0);
5762   if (UINT_LEAST8_TYPE)
5763     builtin_define_with_value ("__UINT_LEAST8_TYPE__", UINT_LEAST8_TYPE, 0);
5764   if (UINT_LEAST16_TYPE)
5765     builtin_define_with_value ("__UINT_LEAST16_TYPE__", UINT_LEAST16_TYPE, 0);
5766   if (UINT_LEAST32_TYPE)
5767     builtin_define_with_value ("__UINT_LEAST32_TYPE__", UINT_LEAST32_TYPE, 0);
5768   if (UINT_LEAST64_TYPE)
5769     builtin_define_with_value ("__UINT_LEAST64_TYPE__", UINT_LEAST64_TYPE, 0);
5770   if (INT_FAST8_TYPE)
5771     builtin_define_with_value ("__INT_FAST8_TYPE__", INT_FAST8_TYPE, 0);
5772   if (INT_FAST16_TYPE)
5773     builtin_define_with_value ("__INT_FAST16_TYPE__", INT_FAST16_TYPE, 0);
5774   if (INT_FAST32_TYPE)
5775     builtin_define_with_value ("__INT_FAST32_TYPE__", INT_FAST32_TYPE, 0);
5776   if (INT_FAST64_TYPE)
5777     builtin_define_with_value ("__INT_FAST64_TYPE__", INT_FAST64_TYPE, 0);
5778   if (UINT_FAST8_TYPE)
5779     builtin_define_with_value ("__UINT_FAST8_TYPE__", UINT_FAST8_TYPE, 0);
5780   if (UINT_FAST16_TYPE)
5781     builtin_define_with_value ("__UINT_FAST16_TYPE__", UINT_FAST16_TYPE, 0);
5782   if (UINT_FAST32_TYPE)
5783     builtin_define_with_value ("__UINT_FAST32_TYPE__", UINT_FAST32_TYPE, 0);
5784   if (UINT_FAST64_TYPE)
5785     builtin_define_with_value ("__UINT_FAST64_TYPE__", UINT_FAST64_TYPE, 0);
5786   if (INTPTR_TYPE)
5787     builtin_define_with_value ("__INTPTR_TYPE__", INTPTR_TYPE, 0);
5788   if (UINTPTR_TYPE)
5789     builtin_define_with_value ("__UINTPTR_TYPE__", UINTPTR_TYPE, 0);
5790 }
5791 
5792 static void
5793 c_init_attributes (void)
5794 {
5795   /* Fill in the built_in_attributes array.  */
5796 #define DEF_ATTR_NULL_TREE(ENUM)				\
5797   built_in_attributes[(int) ENUM] = NULL_TREE;
5798 #define DEF_ATTR_INT(ENUM, VALUE)				\
5799   built_in_attributes[(int) ENUM] = build_int_cst (integer_type_node, VALUE);
5800 #define DEF_ATTR_IDENT(ENUM, STRING)				\
5801   built_in_attributes[(int) ENUM] = get_identifier (STRING);
5802 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN)	\
5803   built_in_attributes[(int) ENUM]			\
5804     = tree_cons (built_in_attributes[(int) PURPOSE],	\
5805 		 built_in_attributes[(int) VALUE],	\
5806 		 built_in_attributes[(int) CHAIN]);
5807 #include "builtin-attrs.def"
5808 #undef DEF_ATTR_NULL_TREE
5809 #undef DEF_ATTR_INT
5810 #undef DEF_ATTR_IDENT
5811 #undef DEF_ATTR_TREE_LIST
5812 }
5813 
5814 /* Returns TRUE iff the attribute indicated by ATTR_ID takes a plain
5815    identifier as an argument, so the front end shouldn't look it up.  */
5816 
5817 bool
5818 attribute_takes_identifier_p (const_tree attr_id)
5819 {
5820   const struct attribute_spec *spec = lookup_attribute_spec (attr_id);
5821   if (spec == NULL)
5822     /* Unknown attribute that we'll end up ignoring, return true so we
5823        don't complain about an identifier argument.  */
5824     return true;
5825   else if (!strcmp ("mode", spec->name)
5826 	   || !strcmp ("format", spec->name)
5827 	   || !strcmp ("cleanup", spec->name))
5828     return true;
5829   else
5830     return targetm.attribute_takes_identifier_p (attr_id);
5831 }
5832 
5833 /* Attribute handlers common to C front ends.  */
5834 
5835 /* Handle a "packed" attribute; arguments as in
5836    struct attribute_spec.handler.  */
5837 
5838 static tree
5839 handle_packed_attribute (tree *node, tree name, tree ARG_UNUSED (args),
5840 			 int flags, bool *no_add_attrs)
5841 {
5842   if (TYPE_P (*node))
5843     {
5844       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
5845 	*node = build_variant_type_copy (*node);
5846       TYPE_PACKED (*node) = 1;
5847     }
5848   else if (TREE_CODE (*node) == FIELD_DECL)
5849     {
5850       if (TYPE_ALIGN (TREE_TYPE (*node)) <= BITS_PER_UNIT
5851 	  /* Still pack bitfields.  */
5852 	  && ! DECL_INITIAL (*node))
5853 	warning (OPT_Wattributes,
5854 		 "%qE attribute ignored for field of type %qT",
5855 		 name, TREE_TYPE (*node));
5856       else
5857 	DECL_PACKED (*node) = 1;
5858     }
5859   /* We can't set DECL_PACKED for a VAR_DECL, because the bit is
5860      used for DECL_REGISTER.  It wouldn't mean anything anyway.
5861      We can't set DECL_PACKED on the type of a TYPE_DECL, because
5862      that changes what the typedef is typing.  */
5863   else
5864     {
5865       warning (OPT_Wattributes, "%qE attribute ignored", name);
5866       *no_add_attrs = true;
5867     }
5868 
5869   return NULL_TREE;
5870 }
5871 
5872 /* Handle a "nocommon" attribute; arguments as in
5873    struct attribute_spec.handler.  */
5874 
5875 static tree
5876 handle_nocommon_attribute (tree *node, tree name,
5877 			   tree ARG_UNUSED (args),
5878 			   int ARG_UNUSED (flags), bool *no_add_attrs)
5879 {
5880   if (TREE_CODE (*node) == VAR_DECL)
5881     DECL_COMMON (*node) = 0;
5882   else
5883     {
5884       warning (OPT_Wattributes, "%qE attribute ignored", name);
5885       *no_add_attrs = true;
5886     }
5887 
5888   return NULL_TREE;
5889 }
5890 
5891 /* Handle a "common" attribute; arguments as in
5892    struct attribute_spec.handler.  */
5893 
5894 static tree
5895 handle_common_attribute (tree *node, tree name, tree ARG_UNUSED (args),
5896 			 int ARG_UNUSED (flags), bool *no_add_attrs)
5897 {
5898   if (TREE_CODE (*node) == VAR_DECL)
5899     DECL_COMMON (*node) = 1;
5900   else
5901     {
5902       warning (OPT_Wattributes, "%qE attribute ignored", name);
5903       *no_add_attrs = true;
5904     }
5905 
5906   return NULL_TREE;
5907 }
5908 
5909 /* Handle a "noreturn" attribute; arguments as in
5910    struct attribute_spec.handler.  */
5911 
5912 static tree
5913 handle_noreturn_attribute (tree *node, tree name, tree ARG_UNUSED (args),
5914 			   int ARG_UNUSED (flags), bool *no_add_attrs)
5915 {
5916   tree type = TREE_TYPE (*node);
5917 
5918   /* See FIXME comment in c_common_attribute_table.  */
5919   if (TREE_CODE (*node) == FUNCTION_DECL
5920       || objc_method_decl (TREE_CODE (*node)))
5921     TREE_THIS_VOLATILE (*node) = 1;
5922   else if (TREE_CODE (type) == POINTER_TYPE
5923 	   && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
5924     TREE_TYPE (*node)
5925       = build_pointer_type
5926 	(build_type_variant (TREE_TYPE (type),
5927 			     TYPE_READONLY (TREE_TYPE (type)), 1));
5928   else
5929     {
5930       warning (OPT_Wattributes, "%qE attribute ignored", name);
5931       *no_add_attrs = true;
5932     }
5933 
5934   return NULL_TREE;
5935 }
5936 
5937 /* Handle a "hot" and attribute; arguments as in
5938    struct attribute_spec.handler.  */
5939 
5940 static tree
5941 handle_hot_attribute (tree *node, tree name, tree ARG_UNUSED (args),
5942 		      int ARG_UNUSED (flags), bool *no_add_attrs)
5943 {
5944   if (TREE_CODE (*node) == FUNCTION_DECL)
5945     {
5946       if (lookup_attribute ("cold", DECL_ATTRIBUTES (*node)) != NULL)
5947 	{
5948 	  warning (OPT_Wattributes, "%qE attribute conflicts with attribute %s",
5949 		   name, "cold");
5950 	  *no_add_attrs = true;
5951 	}
5952       /* Most of the rest of the hot processing is done later with
5953 	 lookup_attribute.  */
5954     }
5955   else
5956     {
5957       warning (OPT_Wattributes, "%qE attribute ignored", name);
5958       *no_add_attrs = true;
5959     }
5960 
5961   return NULL_TREE;
5962 }
5963 /* Handle a "cold" and attribute; arguments as in
5964    struct attribute_spec.handler.  */
5965 
5966 static tree
5967 handle_cold_attribute (tree *node, tree name, tree ARG_UNUSED (args),
5968 		       int ARG_UNUSED (flags), bool *no_add_attrs)
5969 {
5970   if (TREE_CODE (*node) == FUNCTION_DECL)
5971     {
5972       if (lookup_attribute ("hot", DECL_ATTRIBUTES (*node)) != NULL)
5973 	{
5974 	  warning (OPT_Wattributes, "%qE attribute conflicts with attribute %s",
5975 		   name, "hot");
5976 	  *no_add_attrs = true;
5977 	}
5978       /* Most of the rest of the cold processing is done later with
5979 	 lookup_attribute.  */
5980     }
5981   else
5982     {
5983       warning (OPT_Wattributes, "%qE attribute ignored", name);
5984       *no_add_attrs = true;
5985     }
5986 
5987   return NULL_TREE;
5988 }
5989 
5990 /* Handle a "noinline" attribute; arguments as in
5991    struct attribute_spec.handler.  */
5992 
5993 static tree
5994 handle_noinline_attribute (tree *node, tree name,
5995 			   tree ARG_UNUSED (args),
5996 			   int ARG_UNUSED (flags), bool *no_add_attrs)
5997 {
5998   if (TREE_CODE (*node) == FUNCTION_DECL)
5999     DECL_UNINLINABLE (*node) = 1;
6000   else
6001     {
6002       warning (OPT_Wattributes, "%qE attribute ignored", name);
6003       *no_add_attrs = true;
6004     }
6005 
6006   return NULL_TREE;
6007 }
6008 
6009 /* Handle a "noclone" attribute; arguments as in
6010    struct attribute_spec.handler.  */
6011 
6012 static tree
6013 handle_noclone_attribute (tree *node, tree name,
6014 			  tree ARG_UNUSED (args),
6015 			  int ARG_UNUSED (flags), bool *no_add_attrs)
6016 {
6017   if (TREE_CODE (*node) != FUNCTION_DECL)
6018     {
6019       warning (OPT_Wattributes, "%qE attribute ignored", name);
6020       *no_add_attrs = true;
6021     }
6022 
6023   return NULL_TREE;
6024 }
6025 
6026 /* Handle a "always_inline" attribute; arguments as in
6027    struct attribute_spec.handler.  */
6028 
6029 static tree
6030 handle_always_inline_attribute (tree *node, tree name,
6031 				tree ARG_UNUSED (args),
6032 				int ARG_UNUSED (flags),
6033 				bool *no_add_attrs)
6034 {
6035   if (TREE_CODE (*node) == FUNCTION_DECL)
6036     {
6037       /* Set the attribute and mark it for disregarding inline
6038 	 limits.  */
6039       DECL_DISREGARD_INLINE_LIMITS (*node) = 1;
6040     }
6041   else
6042     {
6043       warning (OPT_Wattributes, "%qE attribute ignored", name);
6044       *no_add_attrs = true;
6045     }
6046 
6047   return NULL_TREE;
6048 }
6049 
6050 /* Handle a "gnu_inline" attribute; arguments as in
6051    struct attribute_spec.handler.  */
6052 
6053 static tree
6054 handle_gnu_inline_attribute (tree *node, tree name,
6055 			     tree ARG_UNUSED (args),
6056 			     int ARG_UNUSED (flags),
6057 			     bool *no_add_attrs)
6058 {
6059   if (TREE_CODE (*node) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (*node))
6060     {
6061       /* Do nothing else, just set the attribute.  We'll get at
6062 	 it later with lookup_attribute.  */
6063     }
6064   else
6065     {
6066       warning (OPT_Wattributes, "%qE attribute ignored", name);
6067       *no_add_attrs = true;
6068     }
6069 
6070   return NULL_TREE;
6071 }
6072 
6073 /* Handle a "leaf" attribute; arguments as in
6074    struct attribute_spec.handler.  */
6075 
6076 static tree
6077 handle_leaf_attribute (tree *node, tree name,
6078 		       tree ARG_UNUSED (args),
6079 		       int ARG_UNUSED (flags), bool *no_add_attrs)
6080 {
6081   if (TREE_CODE (*node) != FUNCTION_DECL)
6082     {
6083       warning (OPT_Wattributes, "%qE attribute ignored", name);
6084       *no_add_attrs = true;
6085     }
6086   if (!TREE_PUBLIC (*node))
6087     {
6088       warning (OPT_Wattributes, "%qE attribute has no effect on unit local functions", name);
6089       *no_add_attrs = true;
6090     }
6091 
6092   return NULL_TREE;
6093 }
6094 
6095 /* Handle an "artificial" attribute; arguments as in
6096    struct attribute_spec.handler.  */
6097 
6098 static tree
6099 handle_artificial_attribute (tree *node, tree name,
6100 			     tree ARG_UNUSED (args),
6101 			     int ARG_UNUSED (flags),
6102 			     bool *no_add_attrs)
6103 {
6104   if (TREE_CODE (*node) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (*node))
6105     {
6106       /* Do nothing else, just set the attribute.  We'll get at
6107 	 it later with lookup_attribute.  */
6108     }
6109   else
6110     {
6111       warning (OPT_Wattributes, "%qE attribute ignored", name);
6112       *no_add_attrs = true;
6113     }
6114 
6115   return NULL_TREE;
6116 }
6117 
6118 /* Handle a "flatten" attribute; arguments as in
6119    struct attribute_spec.handler.  */
6120 
6121 static tree
6122 handle_flatten_attribute (tree *node, tree name,
6123 			  tree args ATTRIBUTE_UNUSED,
6124 			  int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
6125 {
6126   if (TREE_CODE (*node) == FUNCTION_DECL)
6127     /* Do nothing else, just set the attribute.  We'll get at
6128        it later with lookup_attribute.  */
6129     ;
6130   else
6131     {
6132       warning (OPT_Wattributes, "%qE attribute ignored", name);
6133       *no_add_attrs = true;
6134     }
6135 
6136   return NULL_TREE;
6137 }
6138 
6139 /* Handle a "warning" or "error" attribute; arguments as in
6140    struct attribute_spec.handler.  */
6141 
6142 static tree
6143 handle_error_attribute (tree *node, tree name, tree args,
6144 			int ARG_UNUSED (flags), bool *no_add_attrs)
6145 {
6146   if (TREE_CODE (*node) == FUNCTION_DECL
6147       || TREE_CODE (TREE_VALUE (args)) == STRING_CST)
6148     /* Do nothing else, just set the attribute.  We'll get at
6149        it later with lookup_attribute.  */
6150     ;
6151   else
6152     {
6153       warning (OPT_Wattributes, "%qE attribute ignored", name);
6154       *no_add_attrs = true;
6155     }
6156 
6157   return NULL_TREE;
6158 }
6159 
6160 /* Handle a "used" attribute; arguments as in
6161    struct attribute_spec.handler.  */
6162 
6163 static tree
6164 handle_used_attribute (tree *pnode, tree name, tree ARG_UNUSED (args),
6165 		       int ARG_UNUSED (flags), bool *no_add_attrs)
6166 {
6167   tree node = *pnode;
6168 
6169   if (TREE_CODE (node) == FUNCTION_DECL
6170       || (TREE_CODE (node) == VAR_DECL && TREE_STATIC (node))
6171       || (TREE_CODE (node) == TYPE_DECL))
6172     {
6173       TREE_USED (node) = 1;
6174       DECL_PRESERVE_P (node) = 1;
6175       if (TREE_CODE (node) == VAR_DECL)
6176 	DECL_READ_P (node) = 1;
6177     }
6178   else
6179     {
6180       warning (OPT_Wattributes, "%qE attribute ignored", name);
6181       *no_add_attrs = true;
6182     }
6183 
6184   return NULL_TREE;
6185 }
6186 
6187 /* Handle a "unused" attribute; arguments as in
6188    struct attribute_spec.handler.  */
6189 
6190 static tree
6191 handle_unused_attribute (tree *node, tree name, tree ARG_UNUSED (args),
6192 			 int flags, bool *no_add_attrs)
6193 {
6194   if (DECL_P (*node))
6195     {
6196       tree decl = *node;
6197 
6198       if (TREE_CODE (decl) == PARM_DECL
6199 	  || TREE_CODE (decl) == VAR_DECL
6200 	  || TREE_CODE (decl) == FUNCTION_DECL
6201 	  || TREE_CODE (decl) == LABEL_DECL
6202 	  || TREE_CODE (decl) == TYPE_DECL)
6203 	{
6204 	  TREE_USED (decl) = 1;
6205 	  if (TREE_CODE (decl) == VAR_DECL
6206 	      || TREE_CODE (decl) == PARM_DECL)
6207 	    DECL_READ_P (decl) = 1;
6208 	}
6209       else
6210 	{
6211 	  warning (OPT_Wattributes, "%qE attribute ignored", name);
6212 	  *no_add_attrs = true;
6213 	}
6214     }
6215   else
6216     {
6217       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
6218 	*node = build_variant_type_copy (*node);
6219       TREE_USED (*node) = 1;
6220     }
6221 
6222   return NULL_TREE;
6223 }
6224 
6225 /* Handle a "externally_visible" attribute; arguments as in
6226    struct attribute_spec.handler.  */
6227 
6228 static tree
6229 handle_externally_visible_attribute (tree *pnode, tree name,
6230 				     tree ARG_UNUSED (args),
6231 				     int ARG_UNUSED (flags),
6232 				     bool *no_add_attrs)
6233 {
6234   tree node = *pnode;
6235 
6236   if (TREE_CODE (node) == FUNCTION_DECL || TREE_CODE (node) == VAR_DECL)
6237     {
6238       if ((!TREE_STATIC (node) && TREE_CODE (node) != FUNCTION_DECL
6239 	   && !DECL_EXTERNAL (node)) || !TREE_PUBLIC (node))
6240 	{
6241 	  warning (OPT_Wattributes,
6242 		   "%qE attribute have effect only on public objects", name);
6243 	  *no_add_attrs = true;
6244 	}
6245     }
6246   else
6247     {
6248       warning (OPT_Wattributes, "%qE attribute ignored", name);
6249       *no_add_attrs = true;
6250     }
6251 
6252   return NULL_TREE;
6253 }
6254 
6255 /* Handle a "const" attribute; arguments as in
6256    struct attribute_spec.handler.  */
6257 
6258 static tree
6259 handle_const_attribute (tree *node, tree name, tree ARG_UNUSED (args),
6260 			int ARG_UNUSED (flags), bool *no_add_attrs)
6261 {
6262   tree type = TREE_TYPE (*node);
6263 
6264   /* See FIXME comment on noreturn in c_common_attribute_table.  */
6265   if (TREE_CODE (*node) == FUNCTION_DECL)
6266     TREE_READONLY (*node) = 1;
6267   else if (TREE_CODE (type) == POINTER_TYPE
6268 	   && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
6269     TREE_TYPE (*node)
6270       = build_pointer_type
6271 	(build_type_variant (TREE_TYPE (type), 1,
6272 			     TREE_THIS_VOLATILE (TREE_TYPE (type))));
6273   else
6274     {
6275       warning (OPT_Wattributes, "%qE attribute ignored", name);
6276       *no_add_attrs = true;
6277     }
6278 
6279   return NULL_TREE;
6280 }
6281 
6282 /* Handle a "transparent_union" attribute; arguments as in
6283    struct attribute_spec.handler.  */
6284 
6285 static tree
6286 handle_transparent_union_attribute (tree *node, tree name,
6287 				    tree ARG_UNUSED (args), int flags,
6288 				    bool *no_add_attrs)
6289 {
6290   tree type;
6291 
6292   *no_add_attrs = true;
6293 
6294   if (TREE_CODE (*node) == TYPE_DECL)
6295     node = &TREE_TYPE (*node);
6296   type = *node;
6297 
6298   if (TREE_CODE (type) == UNION_TYPE)
6299     {
6300       /* Make sure that the first field will work for a transparent union.
6301 	 If the type isn't complete yet, leave the check to the code in
6302 	 finish_struct.  */
6303       if (TYPE_SIZE (type))
6304 	{
6305 	  tree first = first_field (type);
6306 	  if (first == NULL_TREE
6307 	      || DECL_ARTIFICIAL (first)
6308 	      || TYPE_MODE (type) != DECL_MODE (first))
6309 	    goto ignored;
6310 	}
6311 
6312       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
6313 	{
6314 	  /* If the type isn't complete yet, setting the flag
6315 	     on a variant wouldn't ever be checked.  */
6316 	  if (!TYPE_SIZE (type))
6317 	    goto ignored;
6318 
6319 	  /* build_duplicate_type doesn't work for C++.  */
6320 	  if (c_dialect_cxx ())
6321 	    goto ignored;
6322 
6323 	  /* A type variant isn't good enough, since we don't a cast
6324 	     to such a type removed as a no-op.  */
6325 	  *node = type = build_duplicate_type (type);
6326 	}
6327 
6328       TYPE_TRANSPARENT_AGGR (type) = 1;
6329       return NULL_TREE;
6330     }
6331 
6332  ignored:
6333   warning (OPT_Wattributes, "%qE attribute ignored", name);
6334   return NULL_TREE;
6335 }
6336 
6337 /* Subroutine of handle_{con,de}structor_attribute.  Evaluate ARGS to
6338    get the requested priority for a constructor or destructor,
6339    possibly issuing diagnostics for invalid or reserved
6340    priorities.  */
6341 
6342 static priority_type
6343 get_priority (tree args, bool is_destructor)
6344 {
6345   HOST_WIDE_INT pri;
6346   tree arg;
6347 
6348   if (!args)
6349     return DEFAULT_INIT_PRIORITY;
6350 
6351   if (!SUPPORTS_INIT_PRIORITY)
6352     {
6353       if (is_destructor)
6354 	error ("destructor priorities are not supported");
6355       else
6356 	error ("constructor priorities are not supported");
6357       return DEFAULT_INIT_PRIORITY;
6358     }
6359 
6360   arg = TREE_VALUE (args);
6361   if (!host_integerp (arg, /*pos=*/0)
6362       || !INTEGRAL_TYPE_P (TREE_TYPE (arg)))
6363     goto invalid;
6364 
6365   pri = tree_low_cst (TREE_VALUE (args), /*pos=*/0);
6366   if (pri < 0 || pri > MAX_INIT_PRIORITY)
6367     goto invalid;
6368 
6369   if (pri <= MAX_RESERVED_INIT_PRIORITY)
6370     {
6371       if (is_destructor)
6372 	warning (0,
6373 		 "destructor priorities from 0 to %d are reserved "
6374 		 "for the implementation",
6375 		 MAX_RESERVED_INIT_PRIORITY);
6376       else
6377 	warning (0,
6378 		 "constructor priorities from 0 to %d are reserved "
6379 		 "for the implementation",
6380 		 MAX_RESERVED_INIT_PRIORITY);
6381     }
6382   return pri;
6383 
6384  invalid:
6385   if (is_destructor)
6386     error ("destructor priorities must be integers from 0 to %d inclusive",
6387 	   MAX_INIT_PRIORITY);
6388   else
6389     error ("constructor priorities must be integers from 0 to %d inclusive",
6390 	   MAX_INIT_PRIORITY);
6391   return DEFAULT_INIT_PRIORITY;
6392 }
6393 
6394 /* Handle a "constructor" attribute; arguments as in
6395    struct attribute_spec.handler.  */
6396 
6397 static tree
6398 handle_constructor_attribute (tree *node, tree name, tree args,
6399 			      int ARG_UNUSED (flags),
6400 			      bool *no_add_attrs)
6401 {
6402   tree decl = *node;
6403   tree type = TREE_TYPE (decl);
6404 
6405   if (TREE_CODE (decl) == FUNCTION_DECL
6406       && TREE_CODE (type) == FUNCTION_TYPE
6407       && decl_function_context (decl) == 0)
6408     {
6409       priority_type priority;
6410       DECL_STATIC_CONSTRUCTOR (decl) = 1;
6411       priority = get_priority (args, /*is_destructor=*/false);
6412       SET_DECL_INIT_PRIORITY (decl, priority);
6413       TREE_USED (decl) = 1;
6414     }
6415   else
6416     {
6417       warning (OPT_Wattributes, "%qE attribute ignored", name);
6418       *no_add_attrs = true;
6419     }
6420 
6421   return NULL_TREE;
6422 }
6423 
6424 /* Handle a "destructor" attribute; arguments as in
6425    struct attribute_spec.handler.  */
6426 
6427 static tree
6428 handle_destructor_attribute (tree *node, tree name, tree args,
6429 			     int ARG_UNUSED (flags),
6430 			     bool *no_add_attrs)
6431 {
6432   tree decl = *node;
6433   tree type = TREE_TYPE (decl);
6434 
6435   if (TREE_CODE (decl) == FUNCTION_DECL
6436       && TREE_CODE (type) == FUNCTION_TYPE
6437       && decl_function_context (decl) == 0)
6438     {
6439       priority_type priority;
6440       DECL_STATIC_DESTRUCTOR (decl) = 1;
6441       priority = get_priority (args, /*is_destructor=*/true);
6442       SET_DECL_FINI_PRIORITY (decl, priority);
6443       TREE_USED (decl) = 1;
6444     }
6445   else
6446     {
6447       warning (OPT_Wattributes, "%qE attribute ignored", name);
6448       *no_add_attrs = true;
6449     }
6450 
6451   return NULL_TREE;
6452 }
6453 
6454 /* Nonzero if the mode is a valid vector mode for this architecture.
6455    This returns nonzero even if there is no hardware support for the
6456    vector mode, but we can emulate with narrower modes.  */
6457 
6458 static int
6459 vector_mode_valid_p (enum machine_mode mode)
6460 {
6461   enum mode_class mclass = GET_MODE_CLASS (mode);
6462   enum machine_mode innermode;
6463 
6464   /* Doh!  What's going on?  */
6465   if (mclass != MODE_VECTOR_INT
6466       && mclass != MODE_VECTOR_FLOAT
6467       && mclass != MODE_VECTOR_FRACT
6468       && mclass != MODE_VECTOR_UFRACT
6469       && mclass != MODE_VECTOR_ACCUM
6470       && mclass != MODE_VECTOR_UACCUM)
6471     return 0;
6472 
6473   /* Hardware support.  Woo hoo!  */
6474   if (targetm.vector_mode_supported_p (mode))
6475     return 1;
6476 
6477   innermode = GET_MODE_INNER (mode);
6478 
6479   /* We should probably return 1 if requesting V4DI and we have no DI,
6480      but we have V2DI, but this is probably very unlikely.  */
6481 
6482   /* If we have support for the inner mode, we can safely emulate it.
6483      We may not have V2DI, but me can emulate with a pair of DIs.  */
6484   return targetm.scalar_mode_supported_p (innermode);
6485 }
6486 
6487 
6488 /* Handle a "mode" attribute; arguments as in
6489    struct attribute_spec.handler.  */
6490 
6491 static tree
6492 handle_mode_attribute (tree *node, tree name, tree args,
6493 		       int ARG_UNUSED (flags), bool *no_add_attrs)
6494 {
6495   tree type = *node;
6496   tree ident = TREE_VALUE (args);
6497 
6498   *no_add_attrs = true;
6499 
6500   if (TREE_CODE (ident) != IDENTIFIER_NODE)
6501     warning (OPT_Wattributes, "%qE attribute ignored", name);
6502   else
6503     {
6504       int j;
6505       const char *p = IDENTIFIER_POINTER (ident);
6506       int len = strlen (p);
6507       enum machine_mode mode = VOIDmode;
6508       tree typefm;
6509       bool valid_mode;
6510 
6511       if (len > 4 && p[0] == '_' && p[1] == '_'
6512 	  && p[len - 1] == '_' && p[len - 2] == '_')
6513 	{
6514 	  char *newp = (char *) alloca (len - 1);
6515 
6516 	  strcpy (newp, &p[2]);
6517 	  newp[len - 4] = '\0';
6518 	  p = newp;
6519 	}
6520 
6521       /* Change this type to have a type with the specified mode.
6522 	 First check for the special modes.  */
6523       if (!strcmp (p, "byte"))
6524 	mode = byte_mode;
6525       else if (!strcmp (p, "word"))
6526 	mode = word_mode;
6527       else if (!strcmp (p, "pointer"))
6528 	mode = ptr_mode;
6529       else if (!strcmp (p, "libgcc_cmp_return"))
6530 	mode = targetm.libgcc_cmp_return_mode ();
6531       else if (!strcmp (p, "libgcc_shift_count"))
6532 	mode = targetm.libgcc_shift_count_mode ();
6533       else if (!strcmp (p, "unwind_word"))
6534 	mode = targetm.unwind_word_mode ();
6535       else
6536 	for (j = 0; j < NUM_MACHINE_MODES; j++)
6537 	  if (!strcmp (p, GET_MODE_NAME (j)))
6538 	    {
6539 	      mode = (enum machine_mode) j;
6540 	      break;
6541 	    }
6542 
6543       if (mode == VOIDmode)
6544 	{
6545 	  error ("unknown machine mode %qE", ident);
6546 	  return NULL_TREE;
6547 	}
6548 
6549       valid_mode = false;
6550       switch (GET_MODE_CLASS (mode))
6551 	{
6552 	case MODE_INT:
6553 	case MODE_PARTIAL_INT:
6554 	case MODE_FLOAT:
6555 	case MODE_DECIMAL_FLOAT:
6556 	case MODE_FRACT:
6557 	case MODE_UFRACT:
6558 	case MODE_ACCUM:
6559 	case MODE_UACCUM:
6560 	  valid_mode = targetm.scalar_mode_supported_p (mode);
6561 	  break;
6562 
6563 	case MODE_COMPLEX_INT:
6564 	case MODE_COMPLEX_FLOAT:
6565 	  valid_mode = targetm.scalar_mode_supported_p (GET_MODE_INNER (mode));
6566 	  break;
6567 
6568 	case MODE_VECTOR_INT:
6569 	case MODE_VECTOR_FLOAT:
6570 	case MODE_VECTOR_FRACT:
6571 	case MODE_VECTOR_UFRACT:
6572 	case MODE_VECTOR_ACCUM:
6573 	case MODE_VECTOR_UACCUM:
6574 	  warning (OPT_Wattributes, "specifying vector types with "
6575 		   "__attribute__ ((mode)) is deprecated");
6576 	  warning (OPT_Wattributes,
6577 		   "use __attribute__ ((vector_size)) instead");
6578 	  valid_mode = vector_mode_valid_p (mode);
6579 	  break;
6580 
6581 	default:
6582 	  break;
6583 	}
6584       if (!valid_mode)
6585 	{
6586 	  error ("unable to emulate %qs", p);
6587 	  return NULL_TREE;
6588 	}
6589 
6590       if (POINTER_TYPE_P (type))
6591 	{
6592 	  addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (type));
6593 	  tree (*fn)(tree, enum machine_mode, bool);
6594 
6595 	  if (!targetm.addr_space.valid_pointer_mode (mode, as))
6596 	    {
6597 	      error ("invalid pointer mode %qs", p);
6598 	      return NULL_TREE;
6599 	    }
6600 
6601 	  if (TREE_CODE (type) == POINTER_TYPE)
6602 	    fn = build_pointer_type_for_mode;
6603 	  else
6604 	    fn = build_reference_type_for_mode;
6605 	  typefm = fn (TREE_TYPE (type), mode, false);
6606 	}
6607       else
6608 	{
6609 	  /* For fixed-point modes, we need to test if the signness of type
6610 	     and the machine mode are consistent.  */
6611 	  if (ALL_FIXED_POINT_MODE_P (mode)
6612 	      && TYPE_UNSIGNED (type) != UNSIGNED_FIXED_POINT_MODE_P (mode))
6613 	    {
6614 	      error ("signedness of type and machine mode %qs don%'t match", p);
6615 	      return NULL_TREE;
6616 	    }
6617 	  /* For fixed-point modes, we need to pass saturating info.  */
6618 	  typefm = lang_hooks.types.type_for_mode (mode,
6619 			ALL_FIXED_POINT_MODE_P (mode) ? TYPE_SATURATING (type)
6620 						      : TYPE_UNSIGNED (type));
6621 	}
6622 
6623       if (typefm == NULL_TREE)
6624 	{
6625 	  error ("no data type for mode %qs", p);
6626 	  return NULL_TREE;
6627 	}
6628       else if (TREE_CODE (type) == ENUMERAL_TYPE)
6629 	{
6630 	  /* For enumeral types, copy the precision from the integer
6631 	     type returned above.  If not an INTEGER_TYPE, we can't use
6632 	     this mode for this type.  */
6633 	  if (TREE_CODE (typefm) != INTEGER_TYPE)
6634 	    {
6635 	      error ("cannot use mode %qs for enumeral types", p);
6636 	      return NULL_TREE;
6637 	    }
6638 
6639 	  if (flags & ATTR_FLAG_TYPE_IN_PLACE)
6640 	    {
6641 	      TYPE_PRECISION (type) = TYPE_PRECISION (typefm);
6642 	      typefm = type;
6643 	    }
6644 	  else
6645 	    {
6646 	      /* We cannot build a type variant, as there's code that assumes
6647 		 that TYPE_MAIN_VARIANT has the same mode.  This includes the
6648 		 debug generators.  Instead, create a subrange type.  This
6649 		 results in all of the enumeral values being emitted only once
6650 		 in the original, and the subtype gets them by reference.  */
6651 	      if (TYPE_UNSIGNED (type))
6652 		typefm = make_unsigned_type (TYPE_PRECISION (typefm));
6653 	      else
6654 		typefm = make_signed_type (TYPE_PRECISION (typefm));
6655 	      TREE_TYPE (typefm) = type;
6656 	    }
6657 	}
6658       else if (VECTOR_MODE_P (mode)
6659 	       ? TREE_CODE (type) != TREE_CODE (TREE_TYPE (typefm))
6660 	       : TREE_CODE (type) != TREE_CODE (typefm))
6661 	{
6662 	  error ("mode %qs applied to inappropriate type", p);
6663 	  return NULL_TREE;
6664 	}
6665 
6666       *node = typefm;
6667     }
6668 
6669   return NULL_TREE;
6670 }
6671 
6672 /* Handle a "section" attribute; arguments as in
6673    struct attribute_spec.handler.  */
6674 
6675 static tree
6676 handle_section_attribute (tree *node, tree ARG_UNUSED (name), tree args,
6677 			  int ARG_UNUSED (flags), bool *no_add_attrs)
6678 {
6679   tree decl = *node;
6680 
6681   if (targetm_common.have_named_sections)
6682     {
6683       user_defined_section_attribute = true;
6684 
6685       if ((TREE_CODE (decl) == FUNCTION_DECL
6686 	   || TREE_CODE (decl) == VAR_DECL)
6687 	  && TREE_CODE (TREE_VALUE (args)) == STRING_CST)
6688 	{
6689 	  if (TREE_CODE (decl) == VAR_DECL
6690 	      && current_function_decl != NULL_TREE
6691 	      && !TREE_STATIC (decl))
6692 	    {
6693 	      error_at (DECL_SOURCE_LOCATION (decl),
6694 			"section attribute cannot be specified for "
6695 			"local variables");
6696 	      *no_add_attrs = true;
6697 	    }
6698 
6699 	  /* The decl may have already been given a section attribute
6700 	     from a previous declaration.  Ensure they match.  */
6701 	  else if (DECL_SECTION_NAME (decl) != NULL_TREE
6702 		   && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
6703 			      TREE_STRING_POINTER (TREE_VALUE (args))) != 0)
6704 	    {
6705 	      error ("section of %q+D conflicts with previous declaration",
6706 		     *node);
6707 	      *no_add_attrs = true;
6708 	    }
6709 	  else if (TREE_CODE (decl) == VAR_DECL
6710 		   && !targetm.have_tls && targetm.emutls.tmpl_section
6711 		   && DECL_THREAD_LOCAL_P (decl))
6712 	    {
6713 	      error ("section of %q+D cannot be overridden", *node);
6714 	      *no_add_attrs = true;
6715 	    }
6716 	  else
6717 	    DECL_SECTION_NAME (decl) = TREE_VALUE (args);
6718 	}
6719       else
6720 	{
6721 	  error ("section attribute not allowed for %q+D", *node);
6722 	  *no_add_attrs = true;
6723 	}
6724     }
6725   else
6726     {
6727       error_at (DECL_SOURCE_LOCATION (*node),
6728 		"section attributes are not supported for this target");
6729       *no_add_attrs = true;
6730     }
6731 
6732   return NULL_TREE;
6733 }
6734 
6735 /* Check whether ALIGN is a valid user-specified alignment.  If so,
6736    return its base-2 log; if not, output an error and return -1.  If
6737    ALLOW_ZERO then 0 is valid and should result in a return of -1 with
6738    no error.  */
6739 int
6740 check_user_alignment (const_tree align, bool allow_zero)
6741 {
6742   int i;
6743 
6744   if (TREE_CODE (align) != INTEGER_CST
6745       || !INTEGRAL_TYPE_P (TREE_TYPE (align)))
6746     {
6747       error ("requested alignment is not an integer constant");
6748       return -1;
6749     }
6750   else if (allow_zero && integer_zerop (align))
6751     return -1;
6752   else if ((i = tree_log2 (align)) == -1)
6753     {
6754       error ("requested alignment is not a power of 2");
6755       return -1;
6756     }
6757   else if (i >= HOST_BITS_PER_INT - BITS_PER_UNIT_LOG)
6758     {
6759       error ("requested alignment is too large");
6760       return -1;
6761     }
6762   return i;
6763 }
6764 
6765 /* Handle a "aligned" attribute; arguments as in
6766    struct attribute_spec.handler.  */
6767 
6768 static tree
6769 handle_aligned_attribute (tree *node, tree ARG_UNUSED (name), tree args,
6770 			  int flags, bool *no_add_attrs)
6771 {
6772   tree decl = NULL_TREE;
6773   tree *type = NULL;
6774   int is_type = 0;
6775   tree align_expr = (args ? TREE_VALUE (args)
6776 		     : size_int (ATTRIBUTE_ALIGNED_VALUE / BITS_PER_UNIT));
6777   int i;
6778 
6779   if (DECL_P (*node))
6780     {
6781       decl = *node;
6782       type = &TREE_TYPE (decl);
6783       is_type = TREE_CODE (*node) == TYPE_DECL;
6784     }
6785   else if (TYPE_P (*node))
6786     type = node, is_type = 1;
6787 
6788   if ((i = check_user_alignment (align_expr, false)) == -1)
6789     *no_add_attrs = true;
6790   else if (is_type)
6791     {
6792       if ((flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
6793 	/* OK, modify the type in place.  */;
6794       /* If we have a TYPE_DECL, then copy the type, so that we
6795 	 don't accidentally modify a builtin type.  See pushdecl.  */
6796       else if (decl && TREE_TYPE (decl) != error_mark_node
6797 	       && DECL_ORIGINAL_TYPE (decl) == NULL_TREE)
6798 	{
6799 	  tree tt = TREE_TYPE (decl);
6800 	  *type = build_variant_type_copy (*type);
6801 	  DECL_ORIGINAL_TYPE (decl) = tt;
6802 	  TYPE_NAME (*type) = decl;
6803 	  TREE_USED (*type) = TREE_USED (decl);
6804 	  TREE_TYPE (decl) = *type;
6805 	}
6806       else
6807 	*type = build_variant_type_copy (*type);
6808 
6809       TYPE_ALIGN (*type) = (1U << i) * BITS_PER_UNIT;
6810       TYPE_USER_ALIGN (*type) = 1;
6811     }
6812   else if (! VAR_OR_FUNCTION_DECL_P (decl)
6813 	   && TREE_CODE (decl) != FIELD_DECL)
6814     {
6815       error ("alignment may not be specified for %q+D", decl);
6816       *no_add_attrs = true;
6817     }
6818   else if (TREE_CODE (decl) == FUNCTION_DECL
6819 	   && DECL_ALIGN (decl) > (1U << i) * BITS_PER_UNIT)
6820     {
6821       if (DECL_USER_ALIGN (decl))
6822 	error ("alignment for %q+D was previously specified as %d "
6823 	       "and may not be decreased", decl,
6824 	       DECL_ALIGN (decl) / BITS_PER_UNIT);
6825       else
6826 	error ("alignment for %q+D must be at least %d", decl,
6827 	       DECL_ALIGN (decl) / BITS_PER_UNIT);
6828       *no_add_attrs = true;
6829     }
6830   else
6831     {
6832       DECL_ALIGN (decl) = (1U << i) * BITS_PER_UNIT;
6833       DECL_USER_ALIGN (decl) = 1;
6834     }
6835 
6836   return NULL_TREE;
6837 }
6838 
6839 /* Handle a "weak" attribute; arguments as in
6840    struct attribute_spec.handler.  */
6841 
6842 static tree
6843 handle_weak_attribute (tree *node, tree name,
6844 		       tree ARG_UNUSED (args),
6845 		       int ARG_UNUSED (flags),
6846 		       bool * ARG_UNUSED (no_add_attrs))
6847 {
6848   if (TREE_CODE (*node) == FUNCTION_DECL
6849       && DECL_DECLARED_INLINE_P (*node))
6850     {
6851       warning (OPT_Wattributes, "inline function %q+D declared weak", *node);
6852       *no_add_attrs = true;
6853     }
6854   else if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (*node)))
6855     {
6856       error ("indirect function %q+D cannot be declared weak", *node);
6857       *no_add_attrs = true;
6858       return NULL_TREE;
6859     }
6860   else if (TREE_CODE (*node) == FUNCTION_DECL
6861 	   || TREE_CODE (*node) == VAR_DECL)
6862     declare_weak (*node);
6863   else
6864     warning (OPT_Wattributes, "%qE attribute ignored", name);
6865 
6866   return NULL_TREE;
6867 }
6868 
6869 /* Handle an "alias" or "ifunc" attribute; arguments as in
6870    struct attribute_spec.handler, except that IS_ALIAS tells us
6871    whether this is an alias as opposed to ifunc attribute.  */
6872 
6873 static tree
6874 handle_alias_ifunc_attribute (bool is_alias, tree *node, tree name, tree args,
6875 			      bool *no_add_attrs)
6876 {
6877   tree decl = *node;
6878 
6879   if (TREE_CODE (decl) != FUNCTION_DECL
6880       && (!is_alias || TREE_CODE (decl) != VAR_DECL))
6881     {
6882       warning (OPT_Wattributes, "%qE attribute ignored", name);
6883       *no_add_attrs = true;
6884     }
6885   else if ((TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl))
6886       || (TREE_CODE (decl) != FUNCTION_DECL
6887 	  && TREE_PUBLIC (decl) && !DECL_EXTERNAL (decl))
6888       /* A static variable declaration is always a tentative definition,
6889 	 but the alias is a non-tentative definition which overrides.  */
6890       || (TREE_CODE (decl) != FUNCTION_DECL
6891 	  && ! TREE_PUBLIC (decl) && DECL_INITIAL (decl)))
6892     {
6893       error ("%q+D defined both normally and as %qE attribute", decl, name);
6894       *no_add_attrs = true;
6895       return NULL_TREE;
6896     }
6897   else if (!is_alias
6898 	   && (lookup_attribute ("weak", DECL_ATTRIBUTES (decl))
6899 	       || lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))))
6900     {
6901       error ("weak %q+D cannot be defined %qE", decl, name);
6902       *no_add_attrs = true;
6903       return NULL_TREE;
6904     }
6905 
6906   /* Note that the very first time we process a nested declaration,
6907      decl_function_context will not be set.  Indeed, *would* never
6908      be set except for the DECL_INITIAL/DECL_EXTERNAL frobbery that
6909      we do below.  After such frobbery, pushdecl would set the context.
6910      In any case, this is never what we want.  */
6911   else if (decl_function_context (decl) == 0 && current_function_decl == NULL)
6912     {
6913       tree id;
6914 
6915       id = TREE_VALUE (args);
6916       if (TREE_CODE (id) != STRING_CST)
6917 	{
6918 	  error ("attribute %qE argument not a string", name);
6919 	  *no_add_attrs = true;
6920 	  return NULL_TREE;
6921 	}
6922       id = get_identifier (TREE_STRING_POINTER (id));
6923       /* This counts as a use of the object pointed to.  */
6924       TREE_USED (id) = 1;
6925 
6926       if (TREE_CODE (decl) == FUNCTION_DECL)
6927 	DECL_INITIAL (decl) = error_mark_node;
6928       else
6929 	{
6930 	  if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
6931 	    DECL_EXTERNAL (decl) = 1;
6932 	  else
6933 	    DECL_EXTERNAL (decl) = 0;
6934 	  TREE_STATIC (decl) = 1;
6935 	}
6936 
6937       if (!is_alias)
6938 	/* ifuncs are also aliases, so set that attribute too. */
6939 	DECL_ATTRIBUTES (decl)
6940 	  = tree_cons (get_identifier ("alias"), args, DECL_ATTRIBUTES (decl));
6941     }
6942   else
6943     {
6944       warning (OPT_Wattributes, "%qE attribute ignored", name);
6945       *no_add_attrs = true;
6946     }
6947 
6948   return NULL_TREE;
6949 }
6950 
6951 /* Handle an "alias" or "ifunc" attribute; arguments as in
6952    struct attribute_spec.handler.  */
6953 
6954 static tree
6955 handle_ifunc_attribute (tree *node, tree name, tree args,
6956 			int ARG_UNUSED (flags), bool *no_add_attrs)
6957 {
6958   return handle_alias_ifunc_attribute (false, node, name, args, no_add_attrs);
6959 }
6960 
6961 /* Handle an "alias" or "ifunc" attribute; arguments as in
6962    struct attribute_spec.handler.  */
6963 
6964 static tree
6965 handle_alias_attribute (tree *node, tree name, tree args,
6966 			int ARG_UNUSED (flags), bool *no_add_attrs)
6967 {
6968   return handle_alias_ifunc_attribute (true, node, name, args, no_add_attrs);
6969 }
6970 
6971 /* Handle a "weakref" attribute; arguments as in struct
6972    attribute_spec.handler.  */
6973 
6974 static tree
6975 handle_weakref_attribute (tree *node, tree ARG_UNUSED (name), tree args,
6976 			  int flags, bool *no_add_attrs)
6977 {
6978   tree attr = NULL_TREE;
6979 
6980   /* We must ignore the attribute when it is associated with
6981      local-scoped decls, since attribute alias is ignored and many
6982      such symbols do not even have a DECL_WEAK field.  */
6983   if (decl_function_context (*node)
6984       || current_function_decl
6985       || (TREE_CODE (*node) != VAR_DECL && TREE_CODE (*node) != FUNCTION_DECL))
6986     {
6987       warning (OPT_Wattributes, "%qE attribute ignored", name);
6988       *no_add_attrs = true;
6989       return NULL_TREE;
6990     }
6991 
6992   if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (*node)))
6993     {
6994       error ("indirect function %q+D cannot be declared weakref", *node);
6995       *no_add_attrs = true;
6996       return NULL_TREE;
6997     }
6998 
6999   /* The idea here is that `weakref("name")' mutates into `weakref,
7000      alias("name")', and weakref without arguments, in turn,
7001      implicitly adds weak. */
7002 
7003   if (args)
7004     {
7005       attr = tree_cons (get_identifier ("alias"), args, attr);
7006       attr = tree_cons (get_identifier ("weakref"), NULL_TREE, attr);
7007 
7008       *no_add_attrs = true;
7009 
7010       decl_attributes (node, attr, flags);
7011     }
7012   else
7013     {
7014       if (lookup_attribute ("alias", DECL_ATTRIBUTES (*node)))
7015 	error_at (DECL_SOURCE_LOCATION (*node),
7016 		  "weakref attribute must appear before alias attribute");
7017 
7018       /* Can't call declare_weak because it wants this to be TREE_PUBLIC,
7019 	 and that isn't supported; and because it wants to add it to
7020 	 the list of weak decls, which isn't helpful.  */
7021       DECL_WEAK (*node) = 1;
7022     }
7023 
7024   return NULL_TREE;
7025 }
7026 
7027 /* Handle an "visibility" attribute; arguments as in
7028    struct attribute_spec.handler.  */
7029 
7030 static tree
7031 handle_visibility_attribute (tree *node, tree name, tree args,
7032 			     int ARG_UNUSED (flags),
7033 			     bool *ARG_UNUSED (no_add_attrs))
7034 {
7035   tree decl = *node;
7036   tree id = TREE_VALUE (args);
7037   enum symbol_visibility vis;
7038 
7039   if (TYPE_P (*node))
7040     {
7041       if (TREE_CODE (*node) == ENUMERAL_TYPE)
7042 	/* OK */;
7043       else if (TREE_CODE (*node) != RECORD_TYPE && TREE_CODE (*node) != UNION_TYPE)
7044 	{
7045 	  warning (OPT_Wattributes, "%qE attribute ignored on non-class types",
7046 		   name);
7047 	  return NULL_TREE;
7048 	}
7049       else if (TYPE_FIELDS (*node))
7050 	{
7051 	  error ("%qE attribute ignored because %qT is already defined",
7052 		 name, *node);
7053 	  return NULL_TREE;
7054 	}
7055     }
7056   else if (decl_function_context (decl) != 0 || !TREE_PUBLIC (decl))
7057     {
7058       warning (OPT_Wattributes, "%qE attribute ignored", name);
7059       return NULL_TREE;
7060     }
7061 
7062   if (TREE_CODE (id) != STRING_CST)
7063     {
7064       error ("visibility argument not a string");
7065       return NULL_TREE;
7066     }
7067 
7068   /*  If this is a type, set the visibility on the type decl.  */
7069   if (TYPE_P (decl))
7070     {
7071       decl = TYPE_NAME (decl);
7072       if (!decl)
7073 	return NULL_TREE;
7074       if (TREE_CODE (decl) == IDENTIFIER_NODE)
7075 	{
7076 	   warning (OPT_Wattributes, "%qE attribute ignored on types",
7077 		    name);
7078 	   return NULL_TREE;
7079 	}
7080     }
7081 
7082   if (strcmp (TREE_STRING_POINTER (id), "default") == 0)
7083     vis = VISIBILITY_DEFAULT;
7084   else if (strcmp (TREE_STRING_POINTER (id), "internal") == 0)
7085     vis = VISIBILITY_INTERNAL;
7086   else if (strcmp (TREE_STRING_POINTER (id), "hidden") == 0)
7087     vis = VISIBILITY_HIDDEN;
7088   else if (strcmp (TREE_STRING_POINTER (id), "protected") == 0)
7089     vis = VISIBILITY_PROTECTED;
7090   else
7091     {
7092       error ("visibility argument must be one of \"default\", \"hidden\", \"protected\" or \"internal\"");
7093       vis = VISIBILITY_DEFAULT;
7094     }
7095 
7096   if (DECL_VISIBILITY_SPECIFIED (decl)
7097       && vis != DECL_VISIBILITY (decl))
7098     {
7099       tree attributes = (TYPE_P (*node)
7100 			 ? TYPE_ATTRIBUTES (*node)
7101 			 : DECL_ATTRIBUTES (decl));
7102       if (lookup_attribute ("visibility", attributes))
7103 	error ("%qD redeclared with different visibility", decl);
7104       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
7105 	       && lookup_attribute ("dllimport", attributes))
7106 	error ("%qD was declared %qs which implies default visibility",
7107 	       decl, "dllimport");
7108       else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
7109 	       && lookup_attribute ("dllexport", attributes))
7110 	error ("%qD was declared %qs which implies default visibility",
7111 	       decl, "dllexport");
7112     }
7113 
7114   DECL_VISIBILITY (decl) = vis;
7115   DECL_VISIBILITY_SPECIFIED (decl) = 1;
7116 
7117   /* Go ahead and attach the attribute to the node as well.  This is needed
7118      so we can determine whether we have VISIBILITY_DEFAULT because the
7119      visibility was not specified, or because it was explicitly overridden
7120      from the containing scope.  */
7121 
7122   return NULL_TREE;
7123 }
7124 
7125 /* Determine the ELF symbol visibility for DECL, which is either a
7126    variable or a function.  It is an error to use this function if a
7127    definition of DECL is not available in this translation unit.
7128    Returns true if the final visibility has been determined by this
7129    function; false if the caller is free to make additional
7130    modifications.  */
7131 
7132 bool
7133 c_determine_visibility (tree decl)
7134 {
7135   gcc_assert (TREE_CODE (decl) == VAR_DECL
7136 	      || TREE_CODE (decl) == FUNCTION_DECL);
7137 
7138   /* If the user explicitly specified the visibility with an
7139      attribute, honor that.  DECL_VISIBILITY will have been set during
7140      the processing of the attribute.  We check for an explicit
7141      attribute, rather than just checking DECL_VISIBILITY_SPECIFIED,
7142      to distinguish the use of an attribute from the use of a "#pragma
7143      GCC visibility push(...)"; in the latter case we still want other
7144      considerations to be able to overrule the #pragma.  */
7145   if (lookup_attribute ("visibility", DECL_ATTRIBUTES (decl))
7146       || (TARGET_DLLIMPORT_DECL_ATTRIBUTES
7147 	  && (lookup_attribute ("dllimport", DECL_ATTRIBUTES (decl))
7148 	      || lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl)))))
7149     return true;
7150 
7151   /* Set default visibility to whatever the user supplied with
7152      visibility_specified depending on #pragma GCC visibility.  */
7153   if (!DECL_VISIBILITY_SPECIFIED (decl))
7154     {
7155       if (visibility_options.inpragma
7156 	  || DECL_VISIBILITY (decl) != default_visibility)
7157 	{
7158 	  DECL_VISIBILITY (decl) = default_visibility;
7159 	  DECL_VISIBILITY_SPECIFIED (decl) = visibility_options.inpragma;
7160 	  /* If visibility changed and DECL already has DECL_RTL, ensure
7161 	     symbol flags are updated.  */
7162 	  if (((TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
7163 	       || TREE_CODE (decl) == FUNCTION_DECL)
7164 	      && DECL_RTL_SET_P (decl))
7165 	    make_decl_rtl (decl);
7166 	}
7167     }
7168   return false;
7169 }
7170 
7171 /* Handle an "tls_model" attribute; arguments as in
7172    struct attribute_spec.handler.  */
7173 
7174 static tree
7175 handle_tls_model_attribute (tree *node, tree name, tree args,
7176 			    int ARG_UNUSED (flags), bool *no_add_attrs)
7177 {
7178   tree id;
7179   tree decl = *node;
7180   enum tls_model kind;
7181 
7182   *no_add_attrs = true;
7183 
7184   if (TREE_CODE (decl) != VAR_DECL || !DECL_THREAD_LOCAL_P (decl))
7185     {
7186       warning (OPT_Wattributes, "%qE attribute ignored", name);
7187       return NULL_TREE;
7188     }
7189 
7190   kind = DECL_TLS_MODEL (decl);
7191   id = TREE_VALUE (args);
7192   if (TREE_CODE (id) != STRING_CST)
7193     {
7194       error ("tls_model argument not a string");
7195       return NULL_TREE;
7196     }
7197 
7198   if (!strcmp (TREE_STRING_POINTER (id), "local-exec"))
7199     kind = TLS_MODEL_LOCAL_EXEC;
7200   else if (!strcmp (TREE_STRING_POINTER (id), "initial-exec"))
7201     kind = TLS_MODEL_INITIAL_EXEC;
7202   else if (!strcmp (TREE_STRING_POINTER (id), "local-dynamic"))
7203     kind = optimize ? TLS_MODEL_LOCAL_DYNAMIC : TLS_MODEL_GLOBAL_DYNAMIC;
7204   else if (!strcmp (TREE_STRING_POINTER (id), "global-dynamic"))
7205     kind = TLS_MODEL_GLOBAL_DYNAMIC;
7206   else
7207     error ("tls_model argument must be one of \"local-exec\", \"initial-exec\", \"local-dynamic\" or \"global-dynamic\"");
7208 
7209   DECL_TLS_MODEL (decl) = kind;
7210   return NULL_TREE;
7211 }
7212 
7213 /* Handle a "no_instrument_function" attribute; arguments as in
7214    struct attribute_spec.handler.  */
7215 
7216 static tree
7217 handle_no_instrument_function_attribute (tree *node, tree name,
7218 					 tree ARG_UNUSED (args),
7219 					 int ARG_UNUSED (flags),
7220 					 bool *no_add_attrs)
7221 {
7222   tree decl = *node;
7223 
7224   if (TREE_CODE (decl) != FUNCTION_DECL)
7225     {
7226       error_at (DECL_SOURCE_LOCATION (decl),
7227 		"%qE attribute applies only to functions", name);
7228       *no_add_attrs = true;
7229     }
7230   else if (DECL_INITIAL (decl))
7231     {
7232       error_at (DECL_SOURCE_LOCATION (decl),
7233 		"can%'t set %qE attribute after definition", name);
7234       *no_add_attrs = true;
7235     }
7236   else
7237     DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
7238 
7239   return NULL_TREE;
7240 }
7241 
7242 /* Handle a "malloc" attribute; arguments as in
7243    struct attribute_spec.handler.  */
7244 
7245 static tree
7246 handle_malloc_attribute (tree *node, tree name, tree ARG_UNUSED (args),
7247 			 int ARG_UNUSED (flags), bool *no_add_attrs)
7248 {
7249   if (TREE_CODE (*node) == FUNCTION_DECL
7250       && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (*node))))
7251     DECL_IS_MALLOC (*node) = 1;
7252   else
7253     {
7254       warning (OPT_Wattributes, "%qE attribute ignored", name);
7255       *no_add_attrs = true;
7256     }
7257 
7258   return NULL_TREE;
7259 }
7260 
7261 /* Handle a "alloc_size" attribute; arguments as in
7262    struct attribute_spec.handler.  */
7263 
7264 static tree
7265 handle_alloc_size_attribute (tree *node, tree ARG_UNUSED (name), tree args,
7266 			     int ARG_UNUSED (flags), bool *no_add_attrs)
7267 {
7268   unsigned arg_count = type_num_arguments (*node);
7269   for (; args; args = TREE_CHAIN (args))
7270     {
7271       tree position = TREE_VALUE (args);
7272 
7273       if (TREE_CODE (position) != INTEGER_CST
7274 	  || TREE_INT_CST_HIGH (position)
7275 	  || TREE_INT_CST_LOW (position) < 1
7276 	  || TREE_INT_CST_LOW (position) > arg_count )
7277 	{
7278 	  warning (OPT_Wattributes,
7279 	           "alloc_size parameter outside range");
7280 	  *no_add_attrs = true;
7281 	  return NULL_TREE;
7282 	}
7283     }
7284   return NULL_TREE;
7285 }
7286 
7287 /* Handle a "fn spec" attribute; arguments as in
7288    struct attribute_spec.handler.  */
7289 
7290 static tree
7291 handle_fnspec_attribute (tree *node ATTRIBUTE_UNUSED, tree ARG_UNUSED (name),
7292 			 tree args, int ARG_UNUSED (flags),
7293 			 bool *no_add_attrs ATTRIBUTE_UNUSED)
7294 {
7295   gcc_assert (args
7296 	      && TREE_CODE (TREE_VALUE (args)) == STRING_CST
7297 	      && !TREE_CHAIN (args));
7298   return NULL_TREE;
7299 }
7300 
7301 /* Handle a "returns_twice" attribute; arguments as in
7302    struct attribute_spec.handler.  */
7303 
7304 static tree
7305 handle_returns_twice_attribute (tree *node, tree name, tree ARG_UNUSED (args),
7306 			 int ARG_UNUSED (flags), bool *no_add_attrs)
7307 {
7308   if (TREE_CODE (*node) == FUNCTION_DECL)
7309     DECL_IS_RETURNS_TWICE (*node) = 1;
7310   else
7311     {
7312       warning (OPT_Wattributes, "%qE attribute ignored", name);
7313       *no_add_attrs = true;
7314     }
7315 
7316   return NULL_TREE;
7317 }
7318 
7319 /* Handle a "no_limit_stack" attribute; arguments as in
7320    struct attribute_spec.handler.  */
7321 
7322 static tree
7323 handle_no_limit_stack_attribute (tree *node, tree name,
7324 				 tree ARG_UNUSED (args),
7325 				 int ARG_UNUSED (flags),
7326 				 bool *no_add_attrs)
7327 {
7328   tree decl = *node;
7329 
7330   if (TREE_CODE (decl) != FUNCTION_DECL)
7331     {
7332       error_at (DECL_SOURCE_LOCATION (decl),
7333 	     "%qE attribute applies only to functions", name);
7334       *no_add_attrs = true;
7335     }
7336   else if (DECL_INITIAL (decl))
7337     {
7338       error_at (DECL_SOURCE_LOCATION (decl),
7339 		"can%'t set %qE attribute after definition", name);
7340       *no_add_attrs = true;
7341     }
7342   else
7343     DECL_NO_LIMIT_STACK (decl) = 1;
7344 
7345   return NULL_TREE;
7346 }
7347 
7348 /* Handle a "pure" attribute; arguments as in
7349    struct attribute_spec.handler.  */
7350 
7351 static tree
7352 handle_pure_attribute (tree *node, tree name, tree ARG_UNUSED (args),
7353 		       int ARG_UNUSED (flags), bool *no_add_attrs)
7354 {
7355   if (TREE_CODE (*node) == FUNCTION_DECL)
7356     DECL_PURE_P (*node) = 1;
7357   /* ??? TODO: Support types.  */
7358   else
7359     {
7360       warning (OPT_Wattributes, "%qE attribute ignored", name);
7361       *no_add_attrs = true;
7362     }
7363 
7364   return NULL_TREE;
7365 }
7366 
7367 /* Digest an attribute list destined for a transactional memory statement.
7368    ALLOWED is the set of attributes that are allowed for this statement;
7369    return the attribute we parsed.  Multiple attributes are never allowed.  */
7370 
7371 int
7372 parse_tm_stmt_attr (tree attrs, int allowed)
7373 {
7374   tree a_seen = NULL;
7375   int m_seen = 0;
7376 
7377   for ( ; attrs ; attrs = TREE_CHAIN (attrs))
7378     {
7379       tree a = TREE_PURPOSE (attrs);
7380       int m = 0;
7381 
7382       if (is_attribute_p ("outer", a))
7383 	m = TM_STMT_ATTR_OUTER;
7384 
7385       if ((m & allowed) == 0)
7386 	{
7387 	  warning (OPT_Wattributes, "%qE attribute directive ignored", a);
7388 	  continue;
7389 	}
7390 
7391       if (m_seen == 0)
7392 	{
7393 	  a_seen = a;
7394 	  m_seen = m;
7395 	}
7396       else if (m_seen == m)
7397 	warning (OPT_Wattributes, "%qE attribute duplicated", a);
7398       else
7399 	warning (OPT_Wattributes, "%qE attribute follows %qE", a, a_seen);
7400     }
7401 
7402   return m_seen;
7403 }
7404 
7405 /* Transform a TM attribute name into a maskable integer and back.
7406    Note that NULL (i.e. no attribute) is mapped to UNKNOWN, corresponding
7407    to how the lack of an attribute is treated.  */
7408 
7409 int
7410 tm_attr_to_mask (tree attr)
7411 {
7412   if (attr == NULL)
7413     return 0;
7414   if (is_attribute_p ("transaction_safe", attr))
7415     return TM_ATTR_SAFE;
7416   if (is_attribute_p ("transaction_callable", attr))
7417     return TM_ATTR_CALLABLE;
7418   if (is_attribute_p ("transaction_pure", attr))
7419     return TM_ATTR_PURE;
7420   if (is_attribute_p ("transaction_unsafe", attr))
7421     return TM_ATTR_IRREVOCABLE;
7422   if (is_attribute_p ("transaction_may_cancel_outer", attr))
7423     return TM_ATTR_MAY_CANCEL_OUTER;
7424   return 0;
7425 }
7426 
7427 tree
7428 tm_mask_to_attr (int mask)
7429 {
7430   const char *str;
7431   switch (mask)
7432     {
7433     case TM_ATTR_SAFE:
7434       str = "transaction_safe";
7435       break;
7436     case TM_ATTR_CALLABLE:
7437       str = "transaction_callable";
7438       break;
7439     case TM_ATTR_PURE:
7440       str = "transaction_pure";
7441       break;
7442     case TM_ATTR_IRREVOCABLE:
7443       str = "transaction_unsafe";
7444       break;
7445     case TM_ATTR_MAY_CANCEL_OUTER:
7446       str = "transaction_may_cancel_outer";
7447       break;
7448     default:
7449       gcc_unreachable ();
7450     }
7451   return get_identifier (str);
7452 }
7453 
7454 /* Return the first TM attribute seen in LIST.  */
7455 
7456 tree
7457 find_tm_attribute (tree list)
7458 {
7459   for (; list ; list = TREE_CHAIN (list))
7460     {
7461       tree name = TREE_PURPOSE (list);
7462       if (tm_attr_to_mask (name) != 0)
7463 	return name;
7464     }
7465   return NULL_TREE;
7466 }
7467 
7468 /* Handle the TM attributes; arguments as in struct attribute_spec.handler.
7469    Here we accept only function types, and verify that none of the other
7470    function TM attributes are also applied.  */
7471 /* ??? We need to accept class types for C++, but not C.  This greatly
7472    complicates this function, since we can no longer rely on the extra
7473    processing given by function_type_required.  */
7474 
7475 static tree
7476 handle_tm_attribute (tree *node, tree name, tree args,
7477 		     int flags, bool *no_add_attrs)
7478 {
7479   /* Only one path adds the attribute; others don't.  */
7480   *no_add_attrs = true;
7481 
7482   switch (TREE_CODE (*node))
7483     {
7484     case RECORD_TYPE:
7485     case UNION_TYPE:
7486       /* Only tm_callable and tm_safe apply to classes.  */
7487       if (tm_attr_to_mask (name) & ~(TM_ATTR_SAFE | TM_ATTR_CALLABLE))
7488 	goto ignored;
7489       /* FALLTHRU */
7490 
7491     case FUNCTION_TYPE:
7492     case METHOD_TYPE:
7493       {
7494 	tree old_name = find_tm_attribute (TYPE_ATTRIBUTES (*node));
7495 	if (old_name == name)
7496 	  ;
7497 	else if (old_name != NULL_TREE)
7498 	  error ("type was previously declared %qE", old_name);
7499 	else
7500 	  *no_add_attrs = false;
7501       }
7502       break;
7503 
7504     case POINTER_TYPE:
7505       {
7506 	enum tree_code subcode = TREE_CODE (TREE_TYPE (*node));
7507 	if (subcode == FUNCTION_TYPE || subcode == METHOD_TYPE)
7508 	  {
7509 	    tree fn_tmp = TREE_TYPE (*node);
7510 	    decl_attributes (&fn_tmp, tree_cons (name, args, NULL), 0);
7511 	    *node = build_pointer_type (fn_tmp);
7512 	    break;
7513 	  }
7514       }
7515       /* FALLTHRU */
7516 
7517     default:
7518       /* If a function is next, pass it on to be tried next.  */
7519       if (flags & (int) ATTR_FLAG_FUNCTION_NEXT)
7520 	return tree_cons (name, args, NULL);
7521 
7522     ignored:
7523       warning (OPT_Wattributes, "%qE attribute ignored", name);
7524       break;
7525     }
7526 
7527   return NULL_TREE;
7528 }
7529 
7530 /* Handle the TM_WRAP attribute; arguments as in
7531    struct attribute_spec.handler.  */
7532 
7533 static tree
7534 handle_tm_wrap_attribute (tree *node, tree name, tree args,
7535 			  int ARG_UNUSED (flags), bool *no_add_attrs)
7536 {
7537   tree decl = *node;
7538 
7539   /* We don't need the attribute even on success, since we
7540      record the entry in an external table.  */
7541   *no_add_attrs = true;
7542 
7543   if (TREE_CODE (decl) != FUNCTION_DECL)
7544     warning (OPT_Wattributes, "%qE attribute ignored", name);
7545   else
7546     {
7547       tree wrap_decl = TREE_VALUE (args);
7548       if (TREE_CODE (wrap_decl) != IDENTIFIER_NODE
7549 	  && TREE_CODE (wrap_decl) != VAR_DECL
7550 	  && TREE_CODE (wrap_decl) != FUNCTION_DECL)
7551 	error ("%qE argument not an identifier", name);
7552       else
7553 	{
7554 	  if (TREE_CODE (wrap_decl) == IDENTIFIER_NODE)
7555 	    wrap_decl = lookup_name (wrap_decl);
7556 	  if (wrap_decl && TREE_CODE (wrap_decl) == FUNCTION_DECL)
7557 	    {
7558 	      if (lang_hooks.types_compatible_p (TREE_TYPE (decl),
7559 						 TREE_TYPE (wrap_decl)))
7560 		record_tm_replacement (wrap_decl, decl);
7561 	      else
7562 		error ("%qD is not compatible with %qD", wrap_decl, decl);
7563 	    }
7564 	  else
7565 	    error ("transaction_wrap argument is not a function");
7566 	}
7567     }
7568 
7569   return NULL_TREE;
7570 }
7571 
7572 /* Ignore the given attribute.  Used when this attribute may be usefully
7573    overridden by the target, but is not used generically.  */
7574 
7575 static tree
7576 ignore_attribute (tree * ARG_UNUSED (node), tree ARG_UNUSED (name),
7577 		  tree ARG_UNUSED (args), int ARG_UNUSED (flags),
7578 		  bool *no_add_attrs)
7579 {
7580   *no_add_attrs = true;
7581   return NULL_TREE;
7582 }
7583 
7584 /* Handle a "no vops" attribute; arguments as in
7585    struct attribute_spec.handler.  */
7586 
7587 static tree
7588 handle_novops_attribute (tree *node, tree ARG_UNUSED (name),
7589 			 tree ARG_UNUSED (args), int ARG_UNUSED (flags),
7590 			 bool *ARG_UNUSED (no_add_attrs))
7591 {
7592   gcc_assert (TREE_CODE (*node) == FUNCTION_DECL);
7593   DECL_IS_NOVOPS (*node) = 1;
7594   return NULL_TREE;
7595 }
7596 
7597 /* Handle a "deprecated" attribute; arguments as in
7598    struct attribute_spec.handler.  */
7599 
7600 static tree
7601 handle_deprecated_attribute (tree *node, tree name,
7602 			     tree args, int flags,
7603 			     bool *no_add_attrs)
7604 {
7605   tree type = NULL_TREE;
7606   int warn = 0;
7607   tree what = NULL_TREE;
7608 
7609   if (!args)
7610     *no_add_attrs = true;
7611   else if (TREE_CODE (TREE_VALUE (args)) != STRING_CST)
7612     {
7613       error ("deprecated message is not a string");
7614       *no_add_attrs = true;
7615     }
7616 
7617   if (DECL_P (*node))
7618     {
7619       tree decl = *node;
7620       type = TREE_TYPE (decl);
7621 
7622       if (TREE_CODE (decl) == TYPE_DECL
7623 	  || TREE_CODE (decl) == PARM_DECL
7624 	  || TREE_CODE (decl) == VAR_DECL
7625 	  || TREE_CODE (decl) == FUNCTION_DECL
7626 	  || TREE_CODE (decl) == FIELD_DECL
7627 	  || objc_method_decl (TREE_CODE (decl)))
7628 	TREE_DEPRECATED (decl) = 1;
7629       else
7630 	warn = 1;
7631     }
7632   else if (TYPE_P (*node))
7633     {
7634       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
7635 	*node = build_variant_type_copy (*node);
7636       TREE_DEPRECATED (*node) = 1;
7637       type = *node;
7638     }
7639   else
7640     warn = 1;
7641 
7642   if (warn)
7643     {
7644       *no_add_attrs = true;
7645       if (type && TYPE_NAME (type))
7646 	{
7647 	  if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
7648 	    what = TYPE_NAME (*node);
7649 	  else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
7650 		   && DECL_NAME (TYPE_NAME (type)))
7651 	    what = DECL_NAME (TYPE_NAME (type));
7652 	}
7653       if (what)
7654 	warning (OPT_Wattributes, "%qE attribute ignored for %qE", name, what);
7655       else
7656 	warning (OPT_Wattributes, "%qE attribute ignored", name);
7657     }
7658 
7659   return NULL_TREE;
7660 }
7661 
7662 /* Handle a "vector_size" attribute; arguments as in
7663    struct attribute_spec.handler.  */
7664 
7665 static tree
7666 handle_vector_size_attribute (tree *node, tree name, tree args,
7667 			      int ARG_UNUSED (flags),
7668 			      bool *no_add_attrs)
7669 {
7670   unsigned HOST_WIDE_INT vecsize, nunits;
7671   enum machine_mode orig_mode;
7672   tree type = *node, new_type, size;
7673 
7674   *no_add_attrs = true;
7675 
7676   size = TREE_VALUE (args);
7677 
7678   if (!host_integerp (size, 1))
7679     {
7680       warning (OPT_Wattributes, "%qE attribute ignored", name);
7681       return NULL_TREE;
7682     }
7683 
7684   /* Get the vector size (in bytes).  */
7685   vecsize = tree_low_cst (size, 1);
7686 
7687   /* We need to provide for vector pointers, vector arrays, and
7688      functions returning vectors.  For example:
7689 
7690        __attribute__((vector_size(16))) short *foo;
7691 
7692      In this case, the mode is SI, but the type being modified is
7693      HI, so we need to look further.  */
7694 
7695   while (POINTER_TYPE_P (type)
7696 	 || TREE_CODE (type) == FUNCTION_TYPE
7697 	 || TREE_CODE (type) == METHOD_TYPE
7698 	 || TREE_CODE (type) == ARRAY_TYPE
7699 	 || TREE_CODE (type) == OFFSET_TYPE)
7700     type = TREE_TYPE (type);
7701 
7702   /* Get the mode of the type being modified.  */
7703   orig_mode = TYPE_MODE (type);
7704 
7705   if ((!INTEGRAL_TYPE_P (type)
7706        && !SCALAR_FLOAT_TYPE_P (type)
7707        && !FIXED_POINT_TYPE_P (type))
7708       || (!SCALAR_FLOAT_MODE_P (orig_mode)
7709 	  && GET_MODE_CLASS (orig_mode) != MODE_INT
7710 	  && !ALL_SCALAR_FIXED_POINT_MODE_P (orig_mode))
7711       || !host_integerp (TYPE_SIZE_UNIT (type), 1)
7712       || TREE_CODE (type) == BOOLEAN_TYPE)
7713     {
7714       error ("invalid vector type for attribute %qE", name);
7715       return NULL_TREE;
7716     }
7717 
7718   if (vecsize % tree_low_cst (TYPE_SIZE_UNIT (type), 1))
7719     {
7720       error ("vector size not an integral multiple of component size");
7721       return NULL;
7722     }
7723 
7724   if (vecsize == 0)
7725     {
7726       error ("zero vector size");
7727       return NULL;
7728     }
7729 
7730   /* Calculate how many units fit in the vector.  */
7731   nunits = vecsize / tree_low_cst (TYPE_SIZE_UNIT (type), 1);
7732   if (nunits & (nunits - 1))
7733     {
7734       error ("number of components of the vector not a power of two");
7735       return NULL_TREE;
7736     }
7737 
7738   new_type = build_vector_type (type, nunits);
7739 
7740   /* Build back pointers if needed.  */
7741   *node = lang_hooks.types.reconstruct_complex_type (*node, new_type);
7742 
7743   return NULL_TREE;
7744 }
7745 
7746 /* Handle the "nonnull" attribute.  */
7747 static tree
7748 handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name),
7749 			  tree args, int ARG_UNUSED (flags),
7750 			  bool *no_add_attrs)
7751 {
7752   tree type = *node;
7753   unsigned HOST_WIDE_INT attr_arg_num;
7754 
7755   /* If no arguments are specified, all pointer arguments should be
7756      non-null.  Verify a full prototype is given so that the arguments
7757      will have the correct types when we actually check them later.  */
7758   if (!args)
7759     {
7760       if (!prototype_p (type))
7761 	{
7762 	  error ("nonnull attribute without arguments on a non-prototype");
7763 	  *no_add_attrs = true;
7764 	}
7765       return NULL_TREE;
7766     }
7767 
7768   /* Argument list specified.  Verify that each argument number references
7769      a pointer argument.  */
7770   for (attr_arg_num = 1; args; args = TREE_CHAIN (args))
7771     {
7772       unsigned HOST_WIDE_INT arg_num = 0, ck_num;
7773 
7774       if (!get_nonnull_operand (TREE_VALUE (args), &arg_num))
7775 	{
7776 	  error ("nonnull argument has invalid operand number (argument %lu)",
7777 		 (unsigned long) attr_arg_num);
7778 	  *no_add_attrs = true;
7779 	  return NULL_TREE;
7780 	}
7781 
7782       if (prototype_p (type))
7783 	{
7784 	  function_args_iterator iter;
7785 	  tree argument;
7786 
7787 	  function_args_iter_init (&iter, type);
7788 	  for (ck_num = 1; ; ck_num++, function_args_iter_next (&iter))
7789 	    {
7790 	      argument = function_args_iter_cond (&iter);
7791 	      if (argument == NULL_TREE || ck_num == arg_num)
7792 		break;
7793 	    }
7794 
7795 	  if (!argument
7796 	      || TREE_CODE (argument) == VOID_TYPE)
7797 	    {
7798 	      error ("nonnull argument with out-of-range operand number (argument %lu, operand %lu)",
7799 		     (unsigned long) attr_arg_num, (unsigned long) arg_num);
7800 	      *no_add_attrs = true;
7801 	      return NULL_TREE;
7802 	    }
7803 
7804 	  if (TREE_CODE (argument) != POINTER_TYPE)
7805 	    {
7806 	      error ("nonnull argument references non-pointer operand (argument %lu, operand %lu)",
7807 		   (unsigned long) attr_arg_num, (unsigned long) arg_num);
7808 	      *no_add_attrs = true;
7809 	      return NULL_TREE;
7810 	    }
7811 	}
7812     }
7813 
7814   return NULL_TREE;
7815 }
7816 
7817 /* Check the argument list of a function call for null in argument slots
7818    that are marked as requiring a non-null pointer argument.  The NARGS
7819    arguments are passed in the array ARGARRAY.
7820 */
7821 
7822 static void
7823 check_function_nonnull (tree attrs, int nargs, tree *argarray)
7824 {
7825   tree a, args;
7826   int i;
7827 
7828   for (a = attrs; a; a = TREE_CHAIN (a))
7829     {
7830       if (is_attribute_p ("nonnull", TREE_PURPOSE (a)))
7831 	{
7832 	  args = TREE_VALUE (a);
7833 
7834 	  /* Walk the argument list.  If we encounter an argument number we
7835 	     should check for non-null, do it.  If the attribute has no args,
7836 	     then every pointer argument is checked (in which case the check
7837 	     for pointer type is done in check_nonnull_arg).  */
7838 	  for (i = 0; i < nargs; i++)
7839 	    {
7840 	      if (!args || nonnull_check_p (args, i + 1))
7841 		check_function_arguments_recurse (check_nonnull_arg, NULL,
7842 						  argarray[i],
7843 						  i + 1);
7844 	    }
7845 	}
7846     }
7847 }
7848 
7849 /* Check that the Nth argument of a function call (counting backwards
7850    from the end) is a (pointer)0.  The NARGS arguments are passed in the
7851    array ARGARRAY.  */
7852 
7853 static void
7854 check_function_sentinel (const_tree fntype, int nargs, tree *argarray)
7855 {
7856   tree attr = lookup_attribute ("sentinel", TYPE_ATTRIBUTES (fntype));
7857 
7858   if (attr)
7859     {
7860       int len = 0;
7861       int pos = 0;
7862       tree sentinel;
7863       function_args_iterator iter;
7864       tree t;
7865 
7866       /* Skip over the named arguments.  */
7867       FOREACH_FUNCTION_ARGS (fntype, t, iter)
7868 	{
7869 	  if (len == nargs)
7870 	    break;
7871 	  len++;
7872 	}
7873 
7874       if (TREE_VALUE (attr))
7875 	{
7876 	  tree p = TREE_VALUE (TREE_VALUE (attr));
7877 	  pos = TREE_INT_CST_LOW (p);
7878 	}
7879 
7880       /* The sentinel must be one of the varargs, i.e.
7881 	 in position >= the number of fixed arguments.  */
7882       if ((nargs - 1 - pos) < len)
7883 	{
7884 	  warning (OPT_Wformat,
7885 		   "not enough variable arguments to fit a sentinel");
7886 	  return;
7887 	}
7888 
7889       /* Validate the sentinel.  */
7890       sentinel = argarray[nargs - 1 - pos];
7891       if ((!POINTER_TYPE_P (TREE_TYPE (sentinel))
7892 	   || !integer_zerop (sentinel))
7893 	  /* Although __null (in C++) is only an integer we allow it
7894 	     nevertheless, as we are guaranteed that it's exactly
7895 	     as wide as a pointer, and we don't want to force
7896 	     users to cast the NULL they have written there.
7897 	     We warn with -Wstrict-null-sentinel, though.  */
7898 	  && (warn_strict_null_sentinel || null_node != sentinel))
7899 	warning (OPT_Wformat, "missing sentinel in function call");
7900     }
7901 }
7902 
7903 /* Helper for check_function_nonnull; given a list of operands which
7904    must be non-null in ARGS, determine if operand PARAM_NUM should be
7905    checked.  */
7906 
7907 static bool
7908 nonnull_check_p (tree args, unsigned HOST_WIDE_INT param_num)
7909 {
7910   unsigned HOST_WIDE_INT arg_num = 0;
7911 
7912   for (; args; args = TREE_CHAIN (args))
7913     {
7914       bool found = get_nonnull_operand (TREE_VALUE (args), &arg_num);
7915 
7916       gcc_assert (found);
7917 
7918       if (arg_num == param_num)
7919 	return true;
7920     }
7921   return false;
7922 }
7923 
7924 /* Check that the function argument PARAM (which is operand number
7925    PARAM_NUM) is non-null.  This is called by check_function_nonnull
7926    via check_function_arguments_recurse.  */
7927 
7928 static void
7929 check_nonnull_arg (void * ARG_UNUSED (ctx), tree param,
7930 		   unsigned HOST_WIDE_INT param_num)
7931 {
7932   /* Just skip checking the argument if it's not a pointer.  This can
7933      happen if the "nonnull" attribute was given without an operand
7934      list (which means to check every pointer argument).  */
7935 
7936   if (TREE_CODE (TREE_TYPE (param)) != POINTER_TYPE)
7937     return;
7938 
7939   if (integer_zerop (param))
7940     warning (OPT_Wnonnull, "null argument where non-null required "
7941 	     "(argument %lu)", (unsigned long) param_num);
7942 }
7943 
7944 /* Helper for nonnull attribute handling; fetch the operand number
7945    from the attribute argument list.  */
7946 
7947 static bool
7948 get_nonnull_operand (tree arg_num_expr, unsigned HOST_WIDE_INT *valp)
7949 {
7950   /* Verify the arg number is a constant.  */
7951   if (TREE_CODE (arg_num_expr) != INTEGER_CST
7952       || TREE_INT_CST_HIGH (arg_num_expr) != 0)
7953     return false;
7954 
7955   *valp = TREE_INT_CST_LOW (arg_num_expr);
7956   return true;
7957 }
7958 
7959 /* Handle a "nothrow" attribute; arguments as in
7960    struct attribute_spec.handler.  */
7961 
7962 static tree
7963 handle_nothrow_attribute (tree *node, tree name, tree ARG_UNUSED (args),
7964 			  int ARG_UNUSED (flags), bool *no_add_attrs)
7965 {
7966   if (TREE_CODE (*node) == FUNCTION_DECL)
7967     TREE_NOTHROW (*node) = 1;
7968   /* ??? TODO: Support types.  */
7969   else
7970     {
7971       warning (OPT_Wattributes, "%qE attribute ignored", name);
7972       *no_add_attrs = true;
7973     }
7974 
7975   return NULL_TREE;
7976 }
7977 
7978 /* Handle a "cleanup" attribute; arguments as in
7979    struct attribute_spec.handler.  */
7980 
7981 static tree
7982 handle_cleanup_attribute (tree *node, tree name, tree args,
7983 			  int ARG_UNUSED (flags), bool *no_add_attrs)
7984 {
7985   tree decl = *node;
7986   tree cleanup_id, cleanup_decl;
7987 
7988   /* ??? Could perhaps support cleanups on TREE_STATIC, much like we do
7989      for global destructors in C++.  This requires infrastructure that
7990      we don't have generically at the moment.  It's also not a feature
7991      we'd be missing too much, since we do have attribute constructor.  */
7992   if (TREE_CODE (decl) != VAR_DECL || TREE_STATIC (decl))
7993     {
7994       warning (OPT_Wattributes, "%qE attribute ignored", name);
7995       *no_add_attrs = true;
7996       return NULL_TREE;
7997     }
7998 
7999   /* Verify that the argument is a function in scope.  */
8000   /* ??? We could support pointers to functions here as well, if
8001      that was considered desirable.  */
8002   cleanup_id = TREE_VALUE (args);
8003   if (TREE_CODE (cleanup_id) != IDENTIFIER_NODE)
8004     {
8005       error ("cleanup argument not an identifier");
8006       *no_add_attrs = true;
8007       return NULL_TREE;
8008     }
8009   cleanup_decl = lookup_name (cleanup_id);
8010   if (!cleanup_decl || TREE_CODE (cleanup_decl) != FUNCTION_DECL)
8011     {
8012       error ("cleanup argument not a function");
8013       *no_add_attrs = true;
8014       return NULL_TREE;
8015     }
8016 
8017   /* That the function has proper type is checked with the
8018      eventual call to build_function_call.  */
8019 
8020   return NULL_TREE;
8021 }
8022 
8023 /* Handle a "warn_unused_result" attribute.  No special handling.  */
8024 
8025 static tree
8026 handle_warn_unused_result_attribute (tree *node, tree name,
8027 			       tree ARG_UNUSED (args),
8028 			       int ARG_UNUSED (flags), bool *no_add_attrs)
8029 {
8030   /* Ignore the attribute for functions not returning any value.  */
8031   if (VOID_TYPE_P (TREE_TYPE (*node)))
8032     {
8033       warning (OPT_Wattributes, "%qE attribute ignored", name);
8034       *no_add_attrs = true;
8035     }
8036 
8037   return NULL_TREE;
8038 }
8039 
8040 /* Handle a "sentinel" attribute.  */
8041 
8042 static tree
8043 handle_sentinel_attribute (tree *node, tree name, tree args,
8044 			   int ARG_UNUSED (flags), bool *no_add_attrs)
8045 {
8046   if (!prototype_p (*node))
8047     {
8048       warning (OPT_Wattributes,
8049 	       "%qE attribute requires prototypes with named arguments", name);
8050       *no_add_attrs = true;
8051     }
8052   else
8053     {
8054       if (!stdarg_p (*node))
8055 	{
8056 	  warning (OPT_Wattributes,
8057 		   "%qE attribute only applies to variadic functions", name);
8058 	  *no_add_attrs = true;
8059 	}
8060     }
8061 
8062   if (args)
8063     {
8064       tree position = TREE_VALUE (args);
8065 
8066       if (TREE_CODE (position) != INTEGER_CST)
8067 	{
8068 	  warning (OPT_Wattributes,
8069 		   "requested position is not an integer constant");
8070 	  *no_add_attrs = true;
8071 	}
8072       else
8073 	{
8074 	  if (tree_int_cst_lt (position, integer_zero_node))
8075 	    {
8076 	      warning (OPT_Wattributes,
8077 		       "requested position is less than zero");
8078 	      *no_add_attrs = true;
8079 	    }
8080 	}
8081     }
8082 
8083   return NULL_TREE;
8084 }
8085 
8086 /* Handle a "type_generic" attribute.  */
8087 
8088 static tree
8089 handle_type_generic_attribute (tree *node, tree ARG_UNUSED (name),
8090 			       tree ARG_UNUSED (args), int ARG_UNUSED (flags),
8091 			       bool * ARG_UNUSED (no_add_attrs))
8092 {
8093   /* Ensure we have a function type.  */
8094   gcc_assert (TREE_CODE (*node) == FUNCTION_TYPE);
8095 
8096   /* Ensure we have a variadic function.  */
8097   gcc_assert (!prototype_p (*node) || stdarg_p (*node));
8098 
8099   return NULL_TREE;
8100 }
8101 
8102 /* Handle a "target" attribute.  */
8103 
8104 static tree
8105 handle_target_attribute (tree *node, tree name, tree args, int flags,
8106 			 bool *no_add_attrs)
8107 {
8108   /* Ensure we have a function type.  */
8109   if (TREE_CODE (*node) != FUNCTION_DECL)
8110     {
8111       warning (OPT_Wattributes, "%qE attribute ignored", name);
8112       *no_add_attrs = true;
8113     }
8114   else if (! targetm.target_option.valid_attribute_p (*node, name, args,
8115 						      flags))
8116     *no_add_attrs = true;
8117 
8118   return NULL_TREE;
8119 }
8120 
8121 /* Arguments being collected for optimization.  */
8122 typedef const char *const_char_p;		/* For DEF_VEC_P.  */
8123 DEF_VEC_P(const_char_p);
8124 DEF_VEC_ALLOC_P(const_char_p, gc);
8125 static GTY(()) VEC(const_char_p, gc) *optimize_args;
8126 
8127 
8128 /* Inner function to convert a TREE_LIST to argv string to parse the optimize
8129    options in ARGS.  ATTR_P is true if this is for attribute(optimize), and
8130    false for #pragma GCC optimize.  */
8131 
8132 bool
8133 parse_optimize_options (tree args, bool attr_p)
8134 {
8135   bool ret = true;
8136   unsigned opt_argc;
8137   unsigned i;
8138   int saved_flag_strict_aliasing;
8139   const char **opt_argv;
8140   struct cl_decoded_option *decoded_options;
8141   unsigned int decoded_options_count;
8142   tree ap;
8143 
8144   /* Build up argv vector.  Just in case the string is stored away, use garbage
8145      collected strings.  */
8146   VEC_truncate (const_char_p, optimize_args, 0);
8147   VEC_safe_push (const_char_p, gc, optimize_args, NULL);
8148 
8149   for (ap = args; ap != NULL_TREE; ap = TREE_CHAIN (ap))
8150     {
8151       tree value = TREE_VALUE (ap);
8152 
8153       if (TREE_CODE (value) == INTEGER_CST)
8154 	{
8155 	  char buffer[20];
8156 	  sprintf (buffer, "-O%ld", (long) TREE_INT_CST_LOW (value));
8157 	  VEC_safe_push (const_char_p, gc, optimize_args, ggc_strdup (buffer));
8158 	}
8159 
8160       else if (TREE_CODE (value) == STRING_CST)
8161 	{
8162 	  /* Split string into multiple substrings.  */
8163 	  size_t len = TREE_STRING_LENGTH (value);
8164 	  char *p = ASTRDUP (TREE_STRING_POINTER (value));
8165 	  char *end = p + len;
8166 	  char *comma;
8167 	  char *next_p = p;
8168 
8169 	  while (next_p != NULL)
8170 	    {
8171 	      size_t len2;
8172 	      char *q, *r;
8173 
8174 	      p = next_p;
8175 	      comma = strchr (p, ',');
8176 	      if (comma)
8177 		{
8178 		  len2 = comma - p;
8179 		  *comma = '\0';
8180 		  next_p = comma+1;
8181 		}
8182 	      else
8183 		{
8184 		  len2 = end - p;
8185 		  next_p = NULL;
8186 		}
8187 
8188 	      r = q = (char *) ggc_alloc_atomic (len2 + 3);
8189 
8190 	      /* If the user supplied -Oxxx or -fxxx, only allow -Oxxx or -fxxx
8191 		 options.  */
8192 	      if (*p == '-' && p[1] != 'O' && p[1] != 'f')
8193 		{
8194 		  ret = false;
8195 		  if (attr_p)
8196 		    warning (OPT_Wattributes,
8197 			     "bad option %s to optimize attribute", p);
8198 		  else
8199 		    warning (OPT_Wpragmas,
8200 			     "bad option %s to pragma attribute", p);
8201 		  continue;
8202 		}
8203 
8204 	      if (*p != '-')
8205 		{
8206 		  *r++ = '-';
8207 
8208 		  /* Assume that Ox is -Ox, a numeric value is -Ox, a s by
8209 		     itself is -Os, and any other switch begins with a -f.  */
8210 		  if ((*p >= '0' && *p <= '9')
8211 		      || (p[0] == 's' && p[1] == '\0'))
8212 		    *r++ = 'O';
8213 		  else if (*p != 'O')
8214 		    *r++ = 'f';
8215 		}
8216 
8217 	      memcpy (r, p, len2);
8218 	      r[len2] = '\0';
8219 	      VEC_safe_push (const_char_p, gc, optimize_args, q);
8220 	    }
8221 
8222 	}
8223     }
8224 
8225   opt_argc = VEC_length (const_char_p, optimize_args);
8226   opt_argv = (const char **) alloca (sizeof (char *) * (opt_argc + 1));
8227 
8228   for (i = 1; i < opt_argc; i++)
8229     opt_argv[i] = VEC_index (const_char_p, optimize_args, i);
8230 
8231   saved_flag_strict_aliasing = flag_strict_aliasing;
8232 
8233   /* Now parse the options.  */
8234   decode_cmdline_options_to_array_default_mask (opt_argc, opt_argv,
8235 						&decoded_options,
8236 						&decoded_options_count);
8237   decode_options (&global_options, &global_options_set,
8238 		  decoded_options, decoded_options_count,
8239 		  input_location, global_dc);
8240 
8241   targetm.override_options_after_change();
8242 
8243   /* Don't allow changing -fstrict-aliasing.  */
8244   flag_strict_aliasing = saved_flag_strict_aliasing;
8245 
8246   VEC_truncate (const_char_p, optimize_args, 0);
8247   return ret;
8248 }
8249 
8250 /* For handling "optimize" attribute. arguments as in
8251    struct attribute_spec.handler.  */
8252 
8253 static tree
8254 handle_optimize_attribute (tree *node, tree name, tree args,
8255 			   int ARG_UNUSED (flags), bool *no_add_attrs)
8256 {
8257   /* Ensure we have a function type.  */
8258   if (TREE_CODE (*node) != FUNCTION_DECL)
8259     {
8260       warning (OPT_Wattributes, "%qE attribute ignored", name);
8261       *no_add_attrs = true;
8262     }
8263   else
8264     {
8265       struct cl_optimization cur_opts;
8266       tree old_opts = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node);
8267 
8268       /* Save current options.  */
8269       cl_optimization_save (&cur_opts, &global_options);
8270 
8271       /* If we previously had some optimization options, use them as the
8272 	 default.  */
8273       if (old_opts)
8274 	cl_optimization_restore (&global_options,
8275 				 TREE_OPTIMIZATION (old_opts));
8276 
8277       /* Parse options, and update the vector.  */
8278       parse_optimize_options (args, true);
8279       DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node)
8280 	= build_optimization_node ();
8281 
8282       /* Restore current options.  */
8283       cl_optimization_restore (&global_options, &cur_opts);
8284     }
8285 
8286   return NULL_TREE;
8287 }
8288 
8289 /* Handle a "no_split_stack" attribute.  */
8290 
8291 static tree
8292 handle_no_split_stack_attribute (tree *node, tree name,
8293 				 tree ARG_UNUSED (args),
8294 				 int ARG_UNUSED (flags),
8295 				 bool *no_add_attrs)
8296 {
8297   tree decl = *node;
8298 
8299   if (TREE_CODE (decl) != FUNCTION_DECL)
8300     {
8301       error_at (DECL_SOURCE_LOCATION (decl),
8302 		"%qE attribute applies only to functions", name);
8303       *no_add_attrs = true;
8304     }
8305   else if (DECL_INITIAL (decl))
8306     {
8307       error_at (DECL_SOURCE_LOCATION (decl),
8308 		"can%'t set %qE attribute after definition", name);
8309       *no_add_attrs = true;
8310     }
8311 
8312   return NULL_TREE;
8313 }
8314 
8315 /* Check for valid arguments being passed to a function with FNTYPE.
8316    There are NARGS arguments in the array ARGARRAY.  */
8317 void
8318 check_function_arguments (const_tree fntype, int nargs, tree *argarray)
8319 {
8320   /* Check for null being passed in a pointer argument that must be
8321      non-null.  We also need to do this if format checking is enabled.  */
8322 
8323   if (warn_nonnull)
8324     check_function_nonnull (TYPE_ATTRIBUTES (fntype), nargs, argarray);
8325 
8326   /* Check for errors in format strings.  */
8327 
8328   if (warn_format || warn_missing_format_attribute)
8329     check_function_format (TYPE_ATTRIBUTES (fntype), nargs, argarray);
8330 
8331   if (warn_format)
8332     check_function_sentinel (fntype, nargs, argarray);
8333 }
8334 
8335 /* Generic argument checking recursion routine.  PARAM is the argument to
8336    be checked.  PARAM_NUM is the number of the argument.  CALLBACK is invoked
8337    once the argument is resolved.  CTX is context for the callback.  */
8338 void
8339 check_function_arguments_recurse (void (*callback)
8340 				  (void *, tree, unsigned HOST_WIDE_INT),
8341 				  void *ctx, tree param,
8342 				  unsigned HOST_WIDE_INT param_num)
8343 {
8344   if (CONVERT_EXPR_P (param)
8345       && (TYPE_PRECISION (TREE_TYPE (param))
8346 	  == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (param, 0)))))
8347     {
8348       /* Strip coercion.  */
8349       check_function_arguments_recurse (callback, ctx,
8350 					TREE_OPERAND (param, 0), param_num);
8351       return;
8352     }
8353 
8354   if (TREE_CODE (param) == CALL_EXPR)
8355     {
8356       tree type = TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (param)));
8357       tree attrs;
8358       bool found_format_arg = false;
8359 
8360       /* See if this is a call to a known internationalization function
8361 	 that modifies a format arg.  Such a function may have multiple
8362 	 format_arg attributes (for example, ngettext).  */
8363 
8364       for (attrs = TYPE_ATTRIBUTES (type);
8365 	   attrs;
8366 	   attrs = TREE_CHAIN (attrs))
8367 	if (is_attribute_p ("format_arg", TREE_PURPOSE (attrs)))
8368 	  {
8369 	    tree inner_arg;
8370 	    tree format_num_expr;
8371 	    int format_num;
8372 	    int i;
8373 	    call_expr_arg_iterator iter;
8374 
8375 	    /* Extract the argument number, which was previously checked
8376 	       to be valid.  */
8377 	    format_num_expr = TREE_VALUE (TREE_VALUE (attrs));
8378 
8379 	    gcc_assert (TREE_CODE (format_num_expr) == INTEGER_CST
8380 			&& !TREE_INT_CST_HIGH (format_num_expr));
8381 
8382 	    format_num = TREE_INT_CST_LOW (format_num_expr);
8383 
8384 	    for (inner_arg = first_call_expr_arg (param, &iter), i = 1;
8385 		 inner_arg != 0;
8386 		 inner_arg = next_call_expr_arg (&iter), i++)
8387 	      if (i == format_num)
8388 		{
8389 		  check_function_arguments_recurse (callback, ctx,
8390 						    inner_arg, param_num);
8391 		  found_format_arg = true;
8392 		  break;
8393 		}
8394 	  }
8395 
8396       /* If we found a format_arg attribute and did a recursive check,
8397 	 we are done with checking this argument.  Otherwise, we continue
8398 	 and this will be considered a non-literal.  */
8399       if (found_format_arg)
8400 	return;
8401     }
8402 
8403   if (TREE_CODE (param) == COND_EXPR)
8404     {
8405       /* Check both halves of the conditional expression.  */
8406       check_function_arguments_recurse (callback, ctx,
8407 					TREE_OPERAND (param, 1), param_num);
8408       check_function_arguments_recurse (callback, ctx,
8409 					TREE_OPERAND (param, 2), param_num);
8410       return;
8411     }
8412 
8413   (*callback) (ctx, param, param_num);
8414 }
8415 
8416 /* Checks for a builtin function FNDECL that the number of arguments
8417    NARGS against the required number REQUIRED and issues an error if
8418    there is a mismatch.  Returns true if the number of arguments is
8419    correct, otherwise false.  */
8420 
8421 static bool
8422 builtin_function_validate_nargs (tree fndecl, int nargs, int required)
8423 {
8424   if (nargs < required)
8425     {
8426       error_at (input_location,
8427 		"not enough arguments to function %qE", fndecl);
8428       return false;
8429     }
8430   else if (nargs > required)
8431     {
8432       error_at (input_location,
8433 		"too many arguments to function %qE", fndecl);
8434       return false;
8435     }
8436   return true;
8437 }
8438 
8439 /* Verifies the NARGS arguments ARGS to the builtin function FNDECL.
8440    Returns false if there was an error, otherwise true.  */
8441 
8442 bool
8443 check_builtin_function_arguments (tree fndecl, int nargs, tree *args)
8444 {
8445   if (!DECL_BUILT_IN (fndecl)
8446       || DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_NORMAL)
8447     return true;
8448 
8449   switch (DECL_FUNCTION_CODE (fndecl))
8450     {
8451     case BUILT_IN_CONSTANT_P:
8452       return builtin_function_validate_nargs (fndecl, nargs, 1);
8453 
8454     case BUILT_IN_ISFINITE:
8455     case BUILT_IN_ISINF:
8456     case BUILT_IN_ISINF_SIGN:
8457     case BUILT_IN_ISNAN:
8458     case BUILT_IN_ISNORMAL:
8459       if (builtin_function_validate_nargs (fndecl, nargs, 1))
8460 	{
8461 	  if (TREE_CODE (TREE_TYPE (args[0])) != REAL_TYPE)
8462 	    {
8463 	      error ("non-floating-point argument in call to "
8464 		     "function %qE", fndecl);
8465 	      return false;
8466 	    }
8467 	  return true;
8468 	}
8469       return false;
8470 
8471     case BUILT_IN_ISGREATER:
8472     case BUILT_IN_ISGREATEREQUAL:
8473     case BUILT_IN_ISLESS:
8474     case BUILT_IN_ISLESSEQUAL:
8475     case BUILT_IN_ISLESSGREATER:
8476     case BUILT_IN_ISUNORDERED:
8477       if (builtin_function_validate_nargs (fndecl, nargs, 2))
8478 	{
8479 	  enum tree_code code0, code1;
8480 	  code0 = TREE_CODE (TREE_TYPE (args[0]));
8481 	  code1 = TREE_CODE (TREE_TYPE (args[1]));
8482 	  if (!((code0 == REAL_TYPE && code1 == REAL_TYPE)
8483 		|| (code0 == REAL_TYPE && code1 == INTEGER_TYPE)
8484 		|| (code0 == INTEGER_TYPE && code1 == REAL_TYPE)))
8485 	    {
8486 	      error ("non-floating-point arguments in call to "
8487 		     "function %qE", fndecl);
8488 	      return false;
8489 	    }
8490 	  return true;
8491 	}
8492       return false;
8493 
8494     case BUILT_IN_FPCLASSIFY:
8495       if (builtin_function_validate_nargs (fndecl, nargs, 6))
8496 	{
8497 	  unsigned i;
8498 
8499 	  for (i=0; i<5; i++)
8500 	    if (TREE_CODE (args[i]) != INTEGER_CST)
8501 	      {
8502 		error ("non-const integer argument %u in call to function %qE",
8503 		       i+1, fndecl);
8504 		return false;
8505 	      }
8506 
8507 	  if (TREE_CODE (TREE_TYPE (args[5])) != REAL_TYPE)
8508 	    {
8509 	      error ("non-floating-point argument in call to function %qE",
8510 		     fndecl);
8511 	      return false;
8512 	    }
8513 	  return true;
8514 	}
8515       return false;
8516 
8517     case BUILT_IN_ASSUME_ALIGNED:
8518       if (builtin_function_validate_nargs (fndecl, nargs, 2 + (nargs > 2)))
8519 	{
8520 	  if (nargs >= 3 && TREE_CODE (TREE_TYPE (args[2])) != INTEGER_TYPE)
8521 	    {
8522 	      error ("non-integer argument 3 in call to function %qE", fndecl);
8523 	      return false;
8524 	    }
8525 	  return true;
8526 	}
8527       return false;
8528 
8529     default:
8530       return true;
8531     }
8532 }
8533 
8534 /* Function to help qsort sort FIELD_DECLs by name order.  */
8535 
8536 int
8537 field_decl_cmp (const void *x_p, const void *y_p)
8538 {
8539   const tree *const x = (const tree *const) x_p;
8540   const tree *const y = (const tree *const) y_p;
8541 
8542   if (DECL_NAME (*x) == DECL_NAME (*y))
8543     /* A nontype is "greater" than a type.  */
8544     return (TREE_CODE (*y) == TYPE_DECL) - (TREE_CODE (*x) == TYPE_DECL);
8545   if (DECL_NAME (*x) == NULL_TREE)
8546     return -1;
8547   if (DECL_NAME (*y) == NULL_TREE)
8548     return 1;
8549   if (DECL_NAME (*x) < DECL_NAME (*y))
8550     return -1;
8551   return 1;
8552 }
8553 
8554 static struct {
8555   gt_pointer_operator new_value;
8556   void *cookie;
8557 } resort_data;
8558 
8559 /* This routine compares two fields like field_decl_cmp but using the
8560 pointer operator in resort_data.  */
8561 
8562 static int
8563 resort_field_decl_cmp (const void *x_p, const void *y_p)
8564 {
8565   const tree *const x = (const tree *const) x_p;
8566   const tree *const y = (const tree *const) y_p;
8567 
8568   if (DECL_NAME (*x) == DECL_NAME (*y))
8569     /* A nontype is "greater" than a type.  */
8570     return (TREE_CODE (*y) == TYPE_DECL) - (TREE_CODE (*x) == TYPE_DECL);
8571   if (DECL_NAME (*x) == NULL_TREE)
8572     return -1;
8573   if (DECL_NAME (*y) == NULL_TREE)
8574     return 1;
8575   {
8576     tree d1 = DECL_NAME (*x);
8577     tree d2 = DECL_NAME (*y);
8578     resort_data.new_value (&d1, resort_data.cookie);
8579     resort_data.new_value (&d2, resort_data.cookie);
8580     if (d1 < d2)
8581       return -1;
8582   }
8583   return 1;
8584 }
8585 
8586 /* Resort DECL_SORTED_FIELDS because pointers have been reordered.  */
8587 
8588 void
8589 resort_sorted_fields (void *obj,
8590 		      void * ARG_UNUSED (orig_obj),
8591 		      gt_pointer_operator new_value,
8592 		      void *cookie)
8593 {
8594   struct sorted_fields_type *sf = (struct sorted_fields_type *) obj;
8595   resort_data.new_value = new_value;
8596   resort_data.cookie = cookie;
8597   qsort (&sf->elts[0], sf->len, sizeof (tree),
8598 	 resort_field_decl_cmp);
8599 }
8600 
8601 /* Subroutine of c_parse_error.
8602    Return the result of concatenating LHS and RHS. RHS is really
8603    a string literal, its first character is indicated by RHS_START and
8604    RHS_SIZE is its length (including the terminating NUL character).
8605 
8606    The caller is responsible for deleting the returned pointer.  */
8607 
8608 static char *
8609 catenate_strings (const char *lhs, const char *rhs_start, int rhs_size)
8610 {
8611   const int lhs_size = strlen (lhs);
8612   char *result = XNEWVEC (char, lhs_size + rhs_size);
8613   strncpy (result, lhs, lhs_size);
8614   strncpy (result + lhs_size, rhs_start, rhs_size);
8615   return result;
8616 }
8617 
8618 /* Issue the error given by GMSGID, indicating that it occurred before
8619    TOKEN, which had the associated VALUE.  */
8620 
8621 void
8622 c_parse_error (const char *gmsgid, enum cpp_ttype token_type,
8623 	       tree value, unsigned char token_flags)
8624 {
8625 #define catenate_messages(M1, M2) catenate_strings ((M1), (M2), sizeof (M2))
8626 
8627   char *message = NULL;
8628 
8629   if (token_type == CPP_EOF)
8630     message = catenate_messages (gmsgid, " at end of input");
8631   else if (token_type == CPP_CHAR
8632 	   || token_type == CPP_WCHAR
8633 	   || token_type == CPP_CHAR16
8634 	   || token_type == CPP_CHAR32)
8635     {
8636       unsigned int val = TREE_INT_CST_LOW (value);
8637       const char *prefix;
8638 
8639       switch (token_type)
8640 	{
8641 	default:
8642 	  prefix = "";
8643 	  break;
8644 	case CPP_WCHAR:
8645 	  prefix = "L";
8646 	  break;
8647 	case CPP_CHAR16:
8648 	  prefix = "u";
8649 	  break;
8650 	case CPP_CHAR32:
8651 	  prefix = "U";
8652 	  break;
8653         }
8654 
8655       if (val <= UCHAR_MAX && ISGRAPH (val))
8656 	message = catenate_messages (gmsgid, " before %s'%c'");
8657       else
8658 	message = catenate_messages (gmsgid, " before %s'\\x%x'");
8659 
8660       error (message, prefix, val);
8661       free (message);
8662       message = NULL;
8663     }
8664   else if (token_type == CPP_STRING
8665 	   || token_type == CPP_WSTRING
8666 	   || token_type == CPP_STRING16
8667 	   || token_type == CPP_STRING32
8668 	   || token_type == CPP_UTF8STRING)
8669     message = catenate_messages (gmsgid, " before string constant");
8670   else if (token_type == CPP_NUMBER)
8671     message = catenate_messages (gmsgid, " before numeric constant");
8672   else if (token_type == CPP_NAME)
8673     {
8674       message = catenate_messages (gmsgid, " before %qE");
8675       error (message, value);
8676       free (message);
8677       message = NULL;
8678     }
8679   else if (token_type == CPP_PRAGMA)
8680     message = catenate_messages (gmsgid, " before %<#pragma%>");
8681   else if (token_type == CPP_PRAGMA_EOL)
8682     message = catenate_messages (gmsgid, " before end of line");
8683   else if (token_type == CPP_DECLTYPE)
8684     message = catenate_messages (gmsgid, " before %<decltype%>");
8685   else if (token_type < N_TTYPES)
8686     {
8687       message = catenate_messages (gmsgid, " before %qs token");
8688       error (message, cpp_type2name (token_type, token_flags));
8689       free (message);
8690       message = NULL;
8691     }
8692   else
8693     error (gmsgid);
8694 
8695   if (message)
8696     {
8697       error (message);
8698       free (message);
8699     }
8700 #undef catenate_messages
8701 }
8702 
8703 /* Mapping for cpp message reasons to the options that enable them.  */
8704 
8705 struct reason_option_codes_t
8706 {
8707   const int reason;		/* cpplib message reason.  */
8708   const int option_code;	/* gcc option that controls this message.  */
8709 };
8710 
8711 static const struct reason_option_codes_t option_codes[] = {
8712   {CPP_W_DEPRECATED,			OPT_Wdeprecated},
8713   {CPP_W_COMMENTS,			OPT_Wcomment},
8714   {CPP_W_TRIGRAPHS,			OPT_Wtrigraphs},
8715   {CPP_W_MULTICHAR,			OPT_Wmultichar},
8716   {CPP_W_TRADITIONAL,			OPT_Wtraditional},
8717   {CPP_W_LONG_LONG,			OPT_Wlong_long},
8718   {CPP_W_ENDIF_LABELS,			OPT_Wendif_labels},
8719   {CPP_W_VARIADIC_MACROS,		OPT_Wvariadic_macros},
8720   {CPP_W_BUILTIN_MACRO_REDEFINED,	OPT_Wbuiltin_macro_redefined},
8721   {CPP_W_UNDEF,				OPT_Wundef},
8722   {CPP_W_UNUSED_MACROS,			OPT_Wunused_macros},
8723   {CPP_W_CXX_OPERATOR_NAMES,		OPT_Wc___compat},
8724   {CPP_W_NORMALIZE,			OPT_Wnormalized_},
8725   {CPP_W_INVALID_PCH,			OPT_Winvalid_pch},
8726   {CPP_W_WARNING_DIRECTIVE,		OPT_Wcpp},
8727   {CPP_W_NONE,				0}
8728 };
8729 
8730 /* Return the gcc option code associated with the reason for a cpp
8731    message, or 0 if none.  */
8732 
8733 static int
8734 c_option_controlling_cpp_error (int reason)
8735 {
8736   const struct reason_option_codes_t *entry;
8737 
8738   for (entry = option_codes; entry->reason != CPP_W_NONE; entry++)
8739     {
8740       if (entry->reason == reason)
8741 	return entry->option_code;
8742     }
8743   return 0;
8744 }
8745 
8746 /* Callback from cpp_error for PFILE to print diagnostics from the
8747    preprocessor.  The diagnostic is of type LEVEL, with REASON set
8748    to the reason code if LEVEL is represents a warning, at location
8749    LOCATION unless this is after lexing and the compiler's location
8750    should be used instead, with column number possibly overridden by
8751    COLUMN_OVERRIDE if not zero; MSG is the translated message and AP
8752    the arguments.  Returns true if a diagnostic was emitted, false
8753    otherwise.  */
8754 
8755 bool
8756 c_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level, int reason,
8757 	     location_t location, unsigned int column_override,
8758 	     const char *msg, va_list *ap)
8759 {
8760   diagnostic_info diagnostic;
8761   diagnostic_t dlevel;
8762   bool save_warn_system_headers = global_dc->dc_warn_system_headers;
8763   bool ret;
8764 
8765   switch (level)
8766     {
8767     case CPP_DL_WARNING_SYSHDR:
8768       if (flag_no_output)
8769 	return false;
8770       global_dc->dc_warn_system_headers = 1;
8771       /* Fall through.  */
8772     case CPP_DL_WARNING:
8773       if (flag_no_output)
8774 	return false;
8775       dlevel = DK_WARNING;
8776       break;
8777     case CPP_DL_PEDWARN:
8778       if (flag_no_output && !flag_pedantic_errors)
8779 	return false;
8780       dlevel = DK_PEDWARN;
8781       break;
8782     case CPP_DL_ERROR:
8783       dlevel = DK_ERROR;
8784       break;
8785     case CPP_DL_ICE:
8786       dlevel = DK_ICE;
8787       break;
8788     case CPP_DL_NOTE:
8789       dlevel = DK_NOTE;
8790       break;
8791     case CPP_DL_FATAL:
8792       dlevel = DK_FATAL;
8793       break;
8794     default:
8795       gcc_unreachable ();
8796     }
8797   if (done_lexing)
8798     location = input_location;
8799   diagnostic_set_info_translated (&diagnostic, msg, ap,
8800 				  location, dlevel);
8801   if (column_override)
8802     diagnostic_override_column (&diagnostic, column_override);
8803   diagnostic_override_option_index (&diagnostic,
8804                                     c_option_controlling_cpp_error (reason));
8805   ret = report_diagnostic (&diagnostic);
8806   if (level == CPP_DL_WARNING_SYSHDR)
8807     global_dc->dc_warn_system_headers = save_warn_system_headers;
8808   return ret;
8809 }
8810 
8811 /* Convert a character from the host to the target execution character
8812    set.  cpplib handles this, mostly.  */
8813 
8814 HOST_WIDE_INT
8815 c_common_to_target_charset (HOST_WIDE_INT c)
8816 {
8817   /* Character constants in GCC proper are sign-extended under -fsigned-char,
8818      zero-extended under -fno-signed-char.  cpplib insists that characters
8819      and character constants are always unsigned.  Hence we must convert
8820      back and forth.  */
8821   cppchar_t uc = ((cppchar_t)c) & ((((cppchar_t)1) << CHAR_BIT)-1);
8822 
8823   uc = cpp_host_to_exec_charset (parse_in, uc);
8824 
8825   if (flag_signed_char)
8826     return ((HOST_WIDE_INT)uc) << (HOST_BITS_PER_WIDE_INT - CHAR_TYPE_SIZE)
8827 			       >> (HOST_BITS_PER_WIDE_INT - CHAR_TYPE_SIZE);
8828   else
8829     return uc;
8830 }
8831 
8832 /* Fold an offsetof-like expression.  EXPR is a nested sequence of component
8833    references with an INDIRECT_REF of a constant at the bottom; much like the
8834    traditional rendering of offsetof as a macro.  Return the folded result.  */
8835 
8836 tree
8837 fold_offsetof_1 (tree expr)
8838 {
8839   tree base, off, t;
8840 
8841   switch (TREE_CODE (expr))
8842     {
8843     case ERROR_MARK:
8844       return expr;
8845 
8846     case VAR_DECL:
8847       error ("cannot apply %<offsetof%> to static data member %qD", expr);
8848       return error_mark_node;
8849 
8850     case CALL_EXPR:
8851     case TARGET_EXPR:
8852       error ("cannot apply %<offsetof%> when %<operator[]%> is overloaded");
8853       return error_mark_node;
8854 
8855     case NOP_EXPR:
8856     case INDIRECT_REF:
8857       if (!TREE_CONSTANT (TREE_OPERAND (expr, 0)))
8858 	{
8859 	  error ("cannot apply %<offsetof%> to a non constant address");
8860 	  return error_mark_node;
8861 	}
8862       return TREE_OPERAND (expr, 0);
8863 
8864     case COMPONENT_REF:
8865       base = fold_offsetof_1 (TREE_OPERAND (expr, 0));
8866       if (base == error_mark_node)
8867 	return base;
8868 
8869       t = TREE_OPERAND (expr, 1);
8870       if (DECL_C_BIT_FIELD (t))
8871 	{
8872 	  error ("attempt to take address of bit-field structure "
8873 		 "member %qD", t);
8874 	  return error_mark_node;
8875 	}
8876       off = size_binop_loc (input_location, PLUS_EXPR, DECL_FIELD_OFFSET (t),
8877 			    size_int (tree_low_cst (DECL_FIELD_BIT_OFFSET (t),
8878 						    1)
8879 				      / BITS_PER_UNIT));
8880       break;
8881 
8882     case ARRAY_REF:
8883       base = fold_offsetof_1 (TREE_OPERAND (expr, 0));
8884       if (base == error_mark_node)
8885 	return base;
8886 
8887       t = TREE_OPERAND (expr, 1);
8888 
8889       /* Check if the offset goes beyond the upper bound of the array.  */
8890       if (TREE_CODE (t) == INTEGER_CST && tree_int_cst_sgn (t) >= 0)
8891 	{
8892 	  tree upbound = array_ref_up_bound (expr);
8893 	  if (upbound != NULL_TREE
8894 	      && TREE_CODE (upbound) == INTEGER_CST
8895 	      && !tree_int_cst_equal (upbound,
8896 				      TYPE_MAX_VALUE (TREE_TYPE (upbound))))
8897 	    {
8898 	      upbound = size_binop (PLUS_EXPR, upbound,
8899 				    build_int_cst (TREE_TYPE (upbound), 1));
8900 	      if (tree_int_cst_lt (upbound, t))
8901 		{
8902 		  tree v;
8903 
8904 		  for (v = TREE_OPERAND (expr, 0);
8905 		       TREE_CODE (v) == COMPONENT_REF;
8906 		       v = TREE_OPERAND (v, 0))
8907 		    if (TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0)))
8908 			== RECORD_TYPE)
8909 		      {
8910 			tree fld_chain = DECL_CHAIN (TREE_OPERAND (v, 1));
8911 			for (; fld_chain; fld_chain = DECL_CHAIN (fld_chain))
8912 			  if (TREE_CODE (fld_chain) == FIELD_DECL)
8913 			    break;
8914 
8915 			if (fld_chain)
8916 			  break;
8917 		      }
8918 		  /* Don't warn if the array might be considered a poor
8919 		     man's flexible array member with a very permissive
8920 		     definition thereof.  */
8921 		  if (TREE_CODE (v) == ARRAY_REF
8922 		      || TREE_CODE (v) == COMPONENT_REF)
8923 		    warning (OPT_Warray_bounds,
8924 			     "index %E denotes an offset "
8925 			     "greater than size of %qT",
8926 			     t, TREE_TYPE (TREE_OPERAND (expr, 0)));
8927 		}
8928 	    }
8929 	}
8930 
8931       t = convert (sizetype, t);
8932       off = size_binop (MULT_EXPR, TYPE_SIZE_UNIT (TREE_TYPE (expr)), t);
8933       break;
8934 
8935     case COMPOUND_EXPR:
8936       /* Handle static members of volatile structs.  */
8937       t = TREE_OPERAND (expr, 1);
8938       gcc_assert (TREE_CODE (t) == VAR_DECL);
8939       return fold_offsetof_1 (t);
8940 
8941     default:
8942       gcc_unreachable ();
8943     }
8944 
8945   return fold_build_pointer_plus (base, off);
8946 }
8947 
8948 /* Likewise, but convert it to the return type of offsetof.  */
8949 
8950 tree
8951 fold_offsetof (tree expr)
8952 {
8953   return convert (size_type_node, fold_offsetof_1 (expr));
8954 }
8955 
8956 /* Warn for A ?: C expressions (with B omitted) where A is a boolean
8957    expression, because B will always be true. */
8958 
8959 void
8960 warn_for_omitted_condop (location_t location, tree cond)
8961 {
8962   if (truth_value_p (TREE_CODE (cond)))
8963       warning_at (location, OPT_Wparentheses,
8964 		"the omitted middle operand in ?: will always be %<true%>, "
8965 		"suggest explicit middle operand");
8966 }
8967 
8968 /* Give an error for storing into ARG, which is 'const'.  USE indicates
8969    how ARG was being used.  */
8970 
8971 void
8972 readonly_error (tree arg, enum lvalue_use use)
8973 {
8974   gcc_assert (use == lv_assign || use == lv_increment || use == lv_decrement
8975 	      || use == lv_asm);
8976   /* Using this macro rather than (for example) arrays of messages
8977      ensures that all the format strings are checked at compile
8978      time.  */
8979 #define READONLY_MSG(A, I, D, AS) (use == lv_assign ? (A)		\
8980 				   : (use == lv_increment ? (I)		\
8981 				   : (use == lv_decrement ? (D) : (AS))))
8982   if (TREE_CODE (arg) == COMPONENT_REF)
8983     {
8984       if (TYPE_READONLY (TREE_TYPE (TREE_OPERAND (arg, 0))))
8985         error (READONLY_MSG (G_("assignment of member "
8986 				"%qD in read-only object"),
8987 			     G_("increment of member "
8988 				"%qD in read-only object"),
8989 			     G_("decrement of member "
8990 				"%qD in read-only object"),
8991 			     G_("member %qD in read-only object "
8992 				"used as %<asm%> output")),
8993 	       TREE_OPERAND (arg, 1));
8994       else
8995 	error (READONLY_MSG (G_("assignment of read-only member %qD"),
8996 			     G_("increment of read-only member %qD"),
8997 			     G_("decrement of read-only member %qD"),
8998 			     G_("read-only member %qD used as %<asm%> output")),
8999 	       TREE_OPERAND (arg, 1));
9000     }
9001   else if (TREE_CODE (arg) == VAR_DECL)
9002     error (READONLY_MSG (G_("assignment of read-only variable %qD"),
9003 			 G_("increment of read-only variable %qD"),
9004 			 G_("decrement of read-only variable %qD"),
9005 			 G_("read-only variable %qD used as %<asm%> output")),
9006 	   arg);
9007   else if (TREE_CODE (arg) == PARM_DECL)
9008     error (READONLY_MSG (G_("assignment of read-only parameter %qD"),
9009 			 G_("increment of read-only parameter %qD"),
9010 			 G_("decrement of read-only parameter %qD"),
9011 			 G_("read-only parameter %qD use as %<asm%> output")),
9012 	   arg);
9013   else if (TREE_CODE (arg) == RESULT_DECL)
9014     {
9015       gcc_assert (c_dialect_cxx ());
9016       error (READONLY_MSG (G_("assignment of "
9017 			      "read-only named return value %qD"),
9018 			   G_("increment of "
9019 			      "read-only named return value %qD"),
9020 			   G_("decrement of "
9021 			      "read-only named return value %qD"),
9022 			   G_("read-only named return value %qD "
9023 			      "used as %<asm%>output")),
9024 	     arg);
9025     }
9026   else if (TREE_CODE (arg) == FUNCTION_DECL)
9027     error (READONLY_MSG (G_("assignment of function %qD"),
9028 			 G_("increment of function %qD"),
9029 			 G_("decrement of function %qD"),
9030 			 G_("function %qD used as %<asm%> output")),
9031 	   arg);
9032   else
9033     error (READONLY_MSG (G_("assignment of read-only location %qE"),
9034 			 G_("increment of read-only location %qE"),
9035 			 G_("decrement of read-only location %qE"),
9036 			 G_("read-only location %qE used as %<asm%> output")),
9037 	   arg);
9038 }
9039 
9040 /* Print an error message for an invalid lvalue.  USE says
9041    how the lvalue is being used and so selects the error message.  LOC
9042    is the location for the error.  */
9043 
9044 void
9045 lvalue_error (location_t loc, enum lvalue_use use)
9046 {
9047   switch (use)
9048     {
9049     case lv_assign:
9050       error_at (loc, "lvalue required as left operand of assignment");
9051       break;
9052     case lv_increment:
9053       error_at (loc, "lvalue required as increment operand");
9054       break;
9055     case lv_decrement:
9056       error_at (loc, "lvalue required as decrement operand");
9057       break;
9058     case lv_addressof:
9059       error_at (loc, "lvalue required as unary %<&%> operand");
9060       break;
9061     case lv_asm:
9062       error_at (loc, "lvalue required in asm statement");
9063       break;
9064     default:
9065       gcc_unreachable ();
9066     }
9067 }
9068 
9069 /* Print an error message for an invalid indirection of type TYPE.
9070    ERRSTRING is the name of the operator for the indirection.  */
9071 
9072 void
9073 invalid_indirection_error (location_t loc, tree type, ref_operator errstring)
9074 {
9075   switch (errstring)
9076     {
9077     case RO_NULL:
9078       gcc_assert (c_dialect_cxx ());
9079       error_at (loc, "invalid type argument (have %qT)", type);
9080       break;
9081     case RO_ARRAY_INDEXING:
9082       error_at (loc,
9083 		"invalid type argument of array indexing (have %qT)",
9084 		type);
9085       break;
9086     case RO_UNARY_STAR:
9087       error_at (loc,
9088 		"invalid type argument of unary %<*%> (have %qT)",
9089 		type);
9090       break;
9091     case RO_ARROW:
9092       error_at (loc,
9093 		"invalid type argument of %<->%> (have %qT)",
9094 		type);
9095       break;
9096     case RO_IMPLICIT_CONVERSION:
9097       error_at (loc,
9098 		"invalid type argument of implicit conversion (have %qT)",
9099 		type);
9100       break;
9101     default:
9102       gcc_unreachable ();
9103     }
9104 }
9105 
9106 /* *PTYPE is an incomplete array.  Complete it with a domain based on
9107    INITIAL_VALUE.  If INITIAL_VALUE is not present, use 1 if DO_DEFAULT
9108    is true.  Return 0 if successful, 1 if INITIAL_VALUE can't be deciphered,
9109    2 if INITIAL_VALUE was NULL, and 3 if INITIAL_VALUE was empty.  */
9110 
9111 int
9112 complete_array_type (tree *ptype, tree initial_value, bool do_default)
9113 {
9114   tree maxindex, type, main_type, elt, unqual_elt;
9115   int failure = 0, quals;
9116   hashval_t hashcode = 0;
9117 
9118   maxindex = size_zero_node;
9119   if (initial_value)
9120     {
9121       if (TREE_CODE (initial_value) == STRING_CST)
9122 	{
9123 	  int eltsize
9124 	    = int_size_in_bytes (TREE_TYPE (TREE_TYPE (initial_value)));
9125 	  maxindex = size_int (TREE_STRING_LENGTH (initial_value)/eltsize - 1);
9126 	}
9127       else if (TREE_CODE (initial_value) == CONSTRUCTOR)
9128 	{
9129 	  VEC(constructor_elt,gc) *v = CONSTRUCTOR_ELTS (initial_value);
9130 
9131 	  if (VEC_empty (constructor_elt, v))
9132 	    {
9133 	      if (pedantic)
9134 		failure = 3;
9135 	      maxindex = ssize_int (-1);
9136 	    }
9137 	  else
9138 	    {
9139 	      tree curindex;
9140 	      unsigned HOST_WIDE_INT cnt;
9141 	      constructor_elt *ce;
9142 	      bool fold_p = false;
9143 
9144 	      if (VEC_index (constructor_elt, v, 0)->index)
9145 		maxindex = fold_convert_loc (input_location, sizetype,
9146 					     VEC_index (constructor_elt,
9147 							v, 0)->index);
9148 	      curindex = maxindex;
9149 
9150 	      for (cnt = 1;
9151 		   VEC_iterate (constructor_elt, v, cnt, ce);
9152 		   cnt++)
9153 		{
9154 		  bool curfold_p = false;
9155 		  if (ce->index)
9156 		    curindex = ce->index, curfold_p = true;
9157 		  else
9158 		    {
9159 		      if (fold_p)
9160 		        curindex = fold_convert (sizetype, curindex);
9161 		      curindex = size_binop (PLUS_EXPR, curindex,
9162 					     size_one_node);
9163 		    }
9164 		  if (tree_int_cst_lt (maxindex, curindex))
9165 		    maxindex = curindex, fold_p = curfold_p;
9166 		}
9167 	       if (fold_p)
9168 	         maxindex = fold_convert (sizetype, maxindex);
9169 	    }
9170 	}
9171       else
9172 	{
9173 	  /* Make an error message unless that happened already.  */
9174 	  if (initial_value != error_mark_node)
9175 	    failure = 1;
9176 	}
9177     }
9178   else
9179     {
9180       failure = 2;
9181       if (!do_default)
9182 	return failure;
9183     }
9184 
9185   type = *ptype;
9186   elt = TREE_TYPE (type);
9187   quals = TYPE_QUALS (strip_array_types (elt));
9188   if (quals == 0)
9189     unqual_elt = elt;
9190   else
9191     unqual_elt = c_build_qualified_type (elt, KEEP_QUAL_ADDR_SPACE (quals));
9192 
9193   /* Using build_distinct_type_copy and modifying things afterward instead
9194      of using build_array_type to create a new type preserves all of the
9195      TYPE_LANG_FLAG_? bits that the front end may have set.  */
9196   main_type = build_distinct_type_copy (TYPE_MAIN_VARIANT (type));
9197   TREE_TYPE (main_type) = unqual_elt;
9198   TYPE_DOMAIN (main_type)
9199     = build_range_type (TREE_TYPE (maxindex),
9200 			build_int_cst (TREE_TYPE (maxindex), 0), maxindex);
9201   layout_type (main_type);
9202 
9203   /* Make sure we have the canonical MAIN_TYPE. */
9204   hashcode = iterative_hash_object (TYPE_HASH (unqual_elt), hashcode);
9205   hashcode = iterative_hash_object (TYPE_HASH (TYPE_DOMAIN (main_type)),
9206 				    hashcode);
9207   main_type = type_hash_canon (hashcode, main_type);
9208 
9209   /* Fix the canonical type.  */
9210   if (TYPE_STRUCTURAL_EQUALITY_P (TREE_TYPE (main_type))
9211       || TYPE_STRUCTURAL_EQUALITY_P (TYPE_DOMAIN (main_type)))
9212     SET_TYPE_STRUCTURAL_EQUALITY (main_type);
9213   else if (TYPE_CANONICAL (TREE_TYPE (main_type)) != TREE_TYPE (main_type)
9214 	   || (TYPE_CANONICAL (TYPE_DOMAIN (main_type))
9215 	       != TYPE_DOMAIN (main_type)))
9216     TYPE_CANONICAL (main_type)
9217       = build_array_type (TYPE_CANONICAL (TREE_TYPE (main_type)),
9218 			  TYPE_CANONICAL (TYPE_DOMAIN (main_type)));
9219   else
9220     TYPE_CANONICAL (main_type) = main_type;
9221 
9222   if (quals == 0)
9223     type = main_type;
9224   else
9225     type = c_build_qualified_type (main_type, quals);
9226 
9227   if (COMPLETE_TYPE_P (type)
9228       && TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST
9229       && TREE_OVERFLOW (TYPE_SIZE_UNIT (type)))
9230     {
9231       error ("size of array is too large");
9232       /* If we proceed with the array type as it is, we'll eventually
9233 	 crash in tree_low_cst().  */
9234       type = error_mark_node;
9235     }
9236 
9237   *ptype = type;
9238   return failure;
9239 }
9240 
9241 /* Like c_mark_addressable but don't check register qualifier.  */
9242 void
9243 c_common_mark_addressable_vec (tree t)
9244 {
9245   while (handled_component_p (t))
9246     t = TREE_OPERAND (t, 0);
9247   if (TREE_CODE (t) != VAR_DECL && TREE_CODE (t) != PARM_DECL)
9248     return;
9249   TREE_ADDRESSABLE (t) = 1;
9250 }
9251 
9252 
9253 
9254 /* Used to help initialize the builtin-types.def table.  When a type of
9255    the correct size doesn't exist, use error_mark_node instead of NULL.
9256    The later results in segfaults even when a decl using the type doesn't
9257    get invoked.  */
9258 
9259 tree
9260 builtin_type_for_size (int size, bool unsignedp)
9261 {
9262   tree type = lang_hooks.types.type_for_size (size, unsignedp);
9263   return type ? type : error_mark_node;
9264 }
9265 
9266 /* A helper function for resolve_overloaded_builtin in resolving the
9267    overloaded __sync_ builtins.  Returns a positive power of 2 if the
9268    first operand of PARAMS is a pointer to a supported data type.
9269    Returns 0 if an error is encountered.  */
9270 
9271 static int
9272 sync_resolve_size (tree function, VEC(tree,gc) *params)
9273 {
9274   tree type;
9275   int size;
9276 
9277   if (VEC_empty (tree, params))
9278     {
9279       error ("too few arguments to function %qE", function);
9280       return 0;
9281     }
9282 
9283   type = TREE_TYPE (VEC_index (tree, params, 0));
9284   if (TREE_CODE (type) != POINTER_TYPE)
9285     goto incompatible;
9286 
9287   type = TREE_TYPE (type);
9288   if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
9289     goto incompatible;
9290 
9291   size = tree_low_cst (TYPE_SIZE_UNIT (type), 1);
9292   if (size == 1 || size == 2 || size == 4 || size == 8 || size == 16)
9293     return size;
9294 
9295  incompatible:
9296   error ("incompatible type for argument %d of %qE", 1, function);
9297   return 0;
9298 }
9299 
9300 /* A helper function for resolve_overloaded_builtin.  Adds casts to
9301    PARAMS to make arguments match up with those of FUNCTION.  Drops
9302    the variadic arguments at the end.  Returns false if some error
9303    was encountered; true on success.  */
9304 
9305 static bool
9306 sync_resolve_params (location_t loc, tree orig_function, tree function,
9307 		     VEC(tree, gc) *params, bool orig_format)
9308 {
9309   function_args_iterator iter;
9310   tree ptype;
9311   unsigned int parmnum;
9312 
9313   function_args_iter_init (&iter, TREE_TYPE (function));
9314   /* We've declared the implementation functions to use "volatile void *"
9315      as the pointer parameter, so we shouldn't get any complaints from the
9316      call to check_function_arguments what ever type the user used.  */
9317   function_args_iter_next (&iter);
9318   ptype = TREE_TYPE (TREE_TYPE (VEC_index (tree, params, 0)));
9319 
9320   /* For the rest of the values, we need to cast these to FTYPE, so that we
9321      don't get warnings for passing pointer types, etc.  */
9322   parmnum = 0;
9323   while (1)
9324     {
9325       tree val, arg_type;
9326 
9327       arg_type = function_args_iter_cond (&iter);
9328       /* XXX void_type_node belies the abstraction.  */
9329       if (arg_type == void_type_node)
9330 	break;
9331 
9332       ++parmnum;
9333       if (VEC_length (tree, params) <= parmnum)
9334 	{
9335 	  error_at (loc, "too few arguments to function %qE", orig_function);
9336 	  return false;
9337 	}
9338 
9339       /* Only convert parameters if arg_type is unsigned integer type with
9340 	 new format sync routines, i.e. don't attempt to convert pointer
9341 	 arguments (e.g. EXPECTED argument of __atomic_compare_exchange_n),
9342 	 bool arguments (e.g. WEAK argument) or signed int arguments (memmodel
9343 	 kinds).  */
9344       if (TREE_CODE (arg_type) == INTEGER_TYPE && TYPE_UNSIGNED (arg_type))
9345 	{
9346 	  /* Ideally for the first conversion we'd use convert_for_assignment
9347 	     so that we get warnings for anything that doesn't match the pointer
9348 	     type.  This isn't portable across the C and C++ front ends atm.  */
9349 	  val = VEC_index (tree, params, parmnum);
9350 	  val = convert (ptype, val);
9351 	  val = convert (arg_type, val);
9352 	  VEC_replace (tree, params, parmnum, val);
9353 	}
9354 
9355       function_args_iter_next (&iter);
9356     }
9357 
9358   /* __atomic routines are not variadic.  */
9359   if (!orig_format && VEC_length (tree, params) != parmnum + 1)
9360     {
9361       error_at (loc, "too many arguments to function %qE", orig_function);
9362       return false;
9363     }
9364 
9365   /* The definition of these primitives is variadic, with the remaining
9366      being "an optional list of variables protected by the memory barrier".
9367      No clue what that's supposed to mean, precisely, but we consider all
9368      call-clobbered variables to be protected so we're safe.  */
9369   VEC_truncate (tree, params, parmnum + 1);
9370 
9371   return true;
9372 }
9373 
9374 /* A helper function for resolve_overloaded_builtin.  Adds a cast to
9375    RESULT to make it match the type of the first pointer argument in
9376    PARAMS.  */
9377 
9378 static tree
9379 sync_resolve_return (tree first_param, tree result, bool orig_format)
9380 {
9381   tree ptype = TREE_TYPE (TREE_TYPE (first_param));
9382   tree rtype = TREE_TYPE (result);
9383   ptype = TYPE_MAIN_VARIANT (ptype);
9384 
9385   /* New format doesn't require casting unless the types are the same size.  */
9386   if (orig_format || tree_int_cst_equal (TYPE_SIZE (ptype), TYPE_SIZE (rtype)))
9387     return convert (ptype, result);
9388   else
9389     return result;
9390 }
9391 
9392 /* This function verifies the PARAMS to generic atomic FUNCTION.
9393    It returns the size if all the parameters are the same size, otherwise
9394    0 is returned if the parameters are invalid.  */
9395 
9396 static int
9397 get_atomic_generic_size (location_t loc, tree function, VEC(tree,gc) *params)
9398 {
9399   unsigned int n_param;
9400   unsigned int n_model;
9401   unsigned int x;
9402   int size_0;
9403   tree type_0;
9404 
9405   /* Determine the parameter makeup.  */
9406   switch (DECL_FUNCTION_CODE (function))
9407     {
9408     case BUILT_IN_ATOMIC_EXCHANGE:
9409       n_param = 4;
9410       n_model = 1;
9411       break;
9412     case BUILT_IN_ATOMIC_LOAD:
9413     case BUILT_IN_ATOMIC_STORE:
9414       n_param = 3;
9415       n_model = 1;
9416       break;
9417     case BUILT_IN_ATOMIC_COMPARE_EXCHANGE:
9418       n_param = 6;
9419       n_model = 2;
9420       break;
9421     default:
9422       gcc_unreachable ();
9423     }
9424 
9425   if (VEC_length (tree, params) != n_param)
9426     {
9427       error_at (loc, "incorrect number of arguments to function %qE", function);
9428       return 0;
9429     }
9430 
9431   /* Get type of first parameter, and determine its size.  */
9432   type_0 = TREE_TYPE (VEC_index (tree, params, 0));
9433   if (TREE_CODE (type_0) != POINTER_TYPE || VOID_TYPE_P (TREE_TYPE (type_0)))
9434     {
9435       error_at (loc, "argument 1 of %qE must be a non-void pointer type",
9436 		function);
9437       return 0;
9438     }
9439 
9440   /* Types must be compile time constant sizes. */
9441   if (TREE_CODE ((TYPE_SIZE_UNIT (TREE_TYPE (type_0)))) != INTEGER_CST)
9442     {
9443       error_at (loc,
9444 		"argument 1 of %qE must be a pointer to a constant size type",
9445 		function);
9446       return 0;
9447     }
9448 
9449   size_0 = tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (type_0)), 1);
9450 
9451   /* Zero size objects are not allowed.  */
9452   if (size_0 == 0)
9453     {
9454       error_at (loc,
9455 		"argument 1 of %qE must be a pointer to a nonzero size object",
9456 		function);
9457       return 0;
9458     }
9459 
9460   /* Check each other parameter is a pointer and the same size.  */
9461   for (x = 0; x < n_param - n_model; x++)
9462     {
9463       int size;
9464       tree type = TREE_TYPE (VEC_index (tree, params, x));
9465       /* __atomic_compare_exchange has a bool in the 4th postion, skip it.  */
9466       if (n_param == 6 && x == 3)
9467         continue;
9468       if (!POINTER_TYPE_P (type))
9469 	{
9470 	  error_at (loc, "argument %d of %qE must be a pointer type", x + 1,
9471 		    function);
9472 	  return 0;
9473 	}
9474       size = tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (type)), 1);
9475       if (size != size_0)
9476 	{
9477 	  error_at (loc, "size mismatch in argument %d of %qE", x + 1,
9478 		    function);
9479 	  return 0;
9480 	}
9481     }
9482 
9483   /* Check memory model parameters for validity.  */
9484   for (x = n_param - n_model ; x < n_param; x++)
9485     {
9486       tree p = VEC_index (tree, params, x);
9487       if (TREE_CODE (p) == INTEGER_CST)
9488         {
9489 	  int i = tree_low_cst (p, 1);
9490 	  if (i < 0 || i >= MEMMODEL_LAST)
9491 	    {
9492 	      warning_at (loc, OPT_Winvalid_memory_model,
9493 			  "invalid memory model argument %d of %qE", x + 1,
9494 			  function);
9495 	    }
9496 	}
9497       else
9498 	if (!INTEGRAL_TYPE_P (TREE_TYPE (p)))
9499 	  {
9500 	    error_at (loc, "non-integer memory model argument %d of %qE", x + 1,
9501 		   function);
9502 	    return 0;
9503 	  }
9504       }
9505 
9506   return size_0;
9507 }
9508 
9509 
9510 /* This will take an __atomic_ generic FUNCTION call, and add a size parameter N
9511    at the beginning of the parameter list PARAMS representing the size of the
9512    objects.  This is to match the library ABI requirement.  LOC is the location
9513    of the function call.
9514    The new function is returned if it needed rebuilding, otherwise NULL_TREE is
9515    returned to allow the external call to be constructed.  */
9516 
9517 static tree
9518 add_atomic_size_parameter (unsigned n, location_t loc, tree function,
9519 			   VEC(tree,gc) *params)
9520 {
9521   tree size_node;
9522 
9523   /* Insert a SIZE_T parameter as the first param.  If there isn't
9524      enough space, allocate a new vector and recursively re-build with that.  */
9525   if (!VEC_space (tree, params, 1))
9526     {
9527       unsigned int z, len;
9528       VEC(tree,gc) *vec;
9529       tree f;
9530 
9531       len = VEC_length (tree, params);
9532       vec = VEC_alloc (tree, gc, len + 1);
9533       for (z = 0; z < len; z++)
9534 	VEC_quick_push (tree, vec, VEC_index (tree, params, z));
9535       f = build_function_call_vec (loc, function, vec, NULL);
9536       VEC_free (tree, gc, vec);
9537       return f;
9538     }
9539 
9540   /* Add the size parameter and leave as a function call for processing.  */
9541   size_node = build_int_cst (size_type_node, n);
9542   VEC_quick_insert (tree, params, 0, size_node);
9543   return NULL_TREE;
9544 }
9545 
9546 
9547 /* This will process an __atomic_exchange function call, determine whether it
9548    needs to be mapped to the _N variation, or turned into a library call.
9549    LOC is the location of the builtin call.
9550    FUNCTION is the DECL that has been invoked;
9551    PARAMS is the argument list for the call.  The return value is non-null
9552    TRUE is returned if it is translated into the proper format for a call to the
9553    external library, and NEW_RETURN is set the tree for that function.
9554    FALSE is returned if processing for the _N variation is required, and
9555    NEW_RETURN is set to the the return value the result is copied into.  */
9556 static bool
9557 resolve_overloaded_atomic_exchange (location_t loc, tree function,
9558 				    VEC(tree,gc) *params, tree *new_return)
9559 {
9560   tree p0, p1, p2, p3;
9561   tree I_type, I_type_ptr;
9562   int n = get_atomic_generic_size (loc, function, params);
9563 
9564   /* Size of 0 is an error condition.  */
9565   if (n == 0)
9566     {
9567       *new_return = error_mark_node;
9568       return true;
9569     }
9570 
9571   /* If not a lock-free size, change to the library generic format.  */
9572   if (n != 1 && n != 2 && n != 4 && n != 8 && n != 16)
9573     {
9574       *new_return = add_atomic_size_parameter (n, loc, function, params);
9575       return true;
9576     }
9577 
9578   /* Otherwise there is a lockfree match, transform the call from:
9579        void fn(T* mem, T* desired, T* return, model)
9580      into
9581        *return = (T) (fn (In* mem, (In) *desired, model))  */
9582 
9583   p0 = VEC_index (tree, params, 0);
9584   p1 = VEC_index (tree, params, 1);
9585   p2 = VEC_index (tree, params, 2);
9586   p3 = VEC_index (tree, params, 3);
9587 
9588   /* Create pointer to appropriate size.  */
9589   I_type = builtin_type_for_size (BITS_PER_UNIT * n, 1);
9590   I_type_ptr = build_pointer_type (I_type);
9591 
9592   /* Convert object pointer to required type.  */
9593   p0 = build1 (VIEW_CONVERT_EXPR, I_type_ptr, p0);
9594   VEC_replace (tree, params, 0, p0);
9595   /* Convert new value to required type, and dereference it.  */
9596   p1 = build_indirect_ref (loc, p1, RO_UNARY_STAR);
9597   p1 = build1 (VIEW_CONVERT_EXPR, I_type, p1);
9598   VEC_replace (tree, params, 1, p1);
9599 
9600   /* Move memory model to the 3rd position, and end param list.  */
9601   VEC_replace (tree, params, 2, p3);
9602   VEC_truncate (tree, params, 3);
9603 
9604   /* Convert return pointer and dereference it for later assignment.  */
9605   *new_return = build_indirect_ref (loc, p2, RO_UNARY_STAR);
9606 
9607   return false;
9608 }
9609 
9610 
9611 /* This will process an __atomic_compare_exchange function call, determine
9612    whether it needs to be mapped to the _N variation, or turned into a lib call.
9613    LOC is the location of the builtin call.
9614    FUNCTION is the DECL that has been invoked;
9615    PARAMS is the argument list for the call.  The return value is non-null
9616    TRUE is returned if it is translated into the proper format for a call to the
9617    external library, and NEW_RETURN is set the tree for that function.
9618    FALSE is returned if processing for the _N variation is required.  */
9619 
9620 static bool
9621 resolve_overloaded_atomic_compare_exchange (location_t loc, tree function,
9622 					    VEC(tree,gc) *params,
9623 					    tree *new_return)
9624 {
9625   tree p0, p1, p2;
9626   tree I_type, I_type_ptr;
9627   int n = get_atomic_generic_size (loc, function, params);
9628 
9629   /* Size of 0 is an error condition.  */
9630   if (n == 0)
9631     {
9632       *new_return = error_mark_node;
9633       return true;
9634     }
9635 
9636   /* If not a lock-free size, change to the library generic format.  */
9637   if (n != 1 && n != 2 && n != 4 && n != 8 && n != 16)
9638     {
9639       /* The library generic format does not have the weak parameter, so
9640 	 remove it from the param list.  Since a parameter has been removed,
9641 	 we can be sure that there is room for the SIZE_T parameter, meaning
9642 	 there will not be a recursive rebuilding of the parameter list, so
9643 	 there is no danger this will be done twice.  */
9644       if (n > 0)
9645         {
9646 	  VEC_replace (tree, params, 3, VEC_index (tree, params, 4));
9647 	  VEC_replace (tree, params, 4, VEC_index (tree, params, 5));
9648 	  VEC_truncate (tree, params, 5);
9649 	}
9650       *new_return = add_atomic_size_parameter (n, loc, function, params);
9651       return true;
9652     }
9653 
9654   /* Otherwise, there is a match, so the call needs to be transformed from:
9655        bool fn(T* mem, T* desired, T* return, weak, success, failure)
9656      into
9657        bool fn ((In *)mem, (In *)expected, (In) *desired, weak, succ, fail)  */
9658 
9659   p0 = VEC_index (tree, params, 0);
9660   p1 = VEC_index (tree, params, 1);
9661   p2 = VEC_index (tree, params, 2);
9662 
9663   /* Create pointer to appropriate size.  */
9664   I_type = builtin_type_for_size (BITS_PER_UNIT * n, 1);
9665   I_type_ptr = build_pointer_type (I_type);
9666 
9667   /* Convert object pointer to required type.  */
9668   p0 = build1 (VIEW_CONVERT_EXPR, I_type_ptr, p0);
9669   VEC_replace (tree, params, 0, p0);
9670 
9671   /* Convert expected pointer to required type.  */
9672   p1 = build1 (VIEW_CONVERT_EXPR, I_type_ptr, p1);
9673   VEC_replace (tree, params, 1, p1);
9674 
9675   /* Convert desired value to required type, and dereference it.  */
9676   p2 = build_indirect_ref (loc, p2, RO_UNARY_STAR);
9677   p2 = build1 (VIEW_CONVERT_EXPR, I_type, p2);
9678   VEC_replace (tree, params, 2, p2);
9679 
9680   /* The rest of the parameters are fine. NULL means no special return value
9681      processing.*/
9682   *new_return = NULL;
9683   return false;
9684 }
9685 
9686 
9687 /* This will process an __atomic_load function call, determine whether it
9688    needs to be mapped to the _N variation, or turned into a library call.
9689    LOC is the location of the builtin call.
9690    FUNCTION is the DECL that has been invoked;
9691    PARAMS is the argument list for the call.  The return value is non-null
9692    TRUE is returned if it is translated into the proper format for a call to the
9693    external library, and NEW_RETURN is set the tree for that function.
9694    FALSE is returned if processing for the _N variation is required, and
9695    NEW_RETURN is set to the the return value the result is copied into.  */
9696 
9697 static bool
9698 resolve_overloaded_atomic_load (location_t loc, tree function,
9699 				VEC(tree,gc) *params, tree *new_return)
9700 {
9701   tree p0, p1, p2;
9702   tree I_type, I_type_ptr;
9703   int n = get_atomic_generic_size (loc, function, params);
9704 
9705   /* Size of 0 is an error condition.  */
9706   if (n == 0)
9707     {
9708       *new_return = error_mark_node;
9709       return true;
9710     }
9711 
9712   /* If not a lock-free size, change to the library generic format.  */
9713   if (n != 1 && n != 2 && n != 4 && n != 8 && n != 16)
9714     {
9715       *new_return = add_atomic_size_parameter (n, loc, function, params);
9716       return true;
9717     }
9718 
9719   /* Otherwise, there is a match, so the call needs to be transformed from:
9720        void fn(T* mem, T* return, model)
9721      into
9722        *return = (T) (fn ((In *) mem, model))  */
9723 
9724   p0 = VEC_index (tree, params, 0);
9725   p1 = VEC_index (tree, params, 1);
9726   p2 = VEC_index (tree, params, 2);
9727 
9728   /* Create pointer to appropriate size.  */
9729   I_type = builtin_type_for_size (BITS_PER_UNIT * n, 1);
9730   I_type_ptr = build_pointer_type (I_type);
9731 
9732   /* Convert object pointer to required type.  */
9733   p0 = build1 (VIEW_CONVERT_EXPR, I_type_ptr, p0);
9734   VEC_replace (tree, params, 0, p0);
9735 
9736   /* Move memory model to the 2nd position, and end param list.  */
9737   VEC_replace (tree, params, 1, p2);
9738   VEC_truncate (tree, params, 2);
9739 
9740   /* Convert return pointer and dereference it for later assignment.  */
9741   *new_return = build_indirect_ref (loc, p1, RO_UNARY_STAR);
9742 
9743   return false;
9744 }
9745 
9746 
9747 /* This will process an __atomic_store function call, determine whether it
9748    needs to be mapped to the _N variation, or turned into a library call.
9749    LOC is the location of the builtin call.
9750    FUNCTION is the DECL that has been invoked;
9751    PARAMS is the argument list for the call.  The return value is non-null
9752    TRUE is returned if it is translated into the proper format for a call to the
9753    external library, and NEW_RETURN is set the tree for that function.
9754    FALSE is returned if processing for the _N variation is required, and
9755    NEW_RETURN is set to the the return value the result is copied into.  */
9756 
9757 static bool
9758 resolve_overloaded_atomic_store (location_t loc, tree function,
9759 				 VEC(tree,gc) *params, tree *new_return)
9760 {
9761   tree p0, p1;
9762   tree I_type, I_type_ptr;
9763   int n = get_atomic_generic_size (loc, function, params);
9764 
9765   /* Size of 0 is an error condition.  */
9766   if (n == 0)
9767     {
9768       *new_return = error_mark_node;
9769       return true;
9770     }
9771 
9772   /* If not a lock-free size, change to the library generic format.  */
9773   if (n != 1 && n != 2 && n != 4 && n != 8 && n != 16)
9774     {
9775       *new_return = add_atomic_size_parameter (n, loc, function, params);
9776       return true;
9777     }
9778 
9779   /* Otherwise, there is a match, so the call needs to be transformed from:
9780        void fn(T* mem, T* value, model)
9781      into
9782        fn ((In *) mem, (In) *value, model)  */
9783 
9784   p0 = VEC_index (tree, params, 0);
9785   p1 = VEC_index (tree, params, 1);
9786 
9787   /* Create pointer to appropriate size.  */
9788   I_type = builtin_type_for_size (BITS_PER_UNIT * n, 1);
9789   I_type_ptr = build_pointer_type (I_type);
9790 
9791   /* Convert object pointer to required type.  */
9792   p0 = build1 (VIEW_CONVERT_EXPR, I_type_ptr, p0);
9793   VEC_replace (tree, params, 0, p0);
9794 
9795   /* Convert new value to required type, and dereference it.  */
9796   p1 = build_indirect_ref (loc, p1, RO_UNARY_STAR);
9797   p1 = build1 (VIEW_CONVERT_EXPR, I_type, p1);
9798   VEC_replace (tree, params, 1, p1);
9799 
9800   /* The memory model is in the right spot already. Return is void.  */
9801   *new_return = NULL_TREE;
9802 
9803   return false;
9804 }
9805 
9806 
9807 /* Some builtin functions are placeholders for other expressions.  This
9808    function should be called immediately after parsing the call expression
9809    before surrounding code has committed to the type of the expression.
9810 
9811    LOC is the location of the builtin call.
9812 
9813    FUNCTION is the DECL that has been invoked; it is known to be a builtin.
9814    PARAMS is the argument list for the call.  The return value is non-null
9815    when expansion is complete, and null if normal processing should
9816    continue.  */
9817 
9818 tree
9819 resolve_overloaded_builtin (location_t loc, tree function, VEC(tree,gc) *params)
9820 {
9821   enum built_in_function orig_code = DECL_FUNCTION_CODE (function);
9822   bool orig_format = true;
9823   tree new_return = NULL_TREE;
9824 
9825   switch (DECL_BUILT_IN_CLASS (function))
9826     {
9827     case BUILT_IN_NORMAL:
9828       break;
9829     case BUILT_IN_MD:
9830       if (targetm.resolve_overloaded_builtin)
9831 	return targetm.resolve_overloaded_builtin (loc, function, params);
9832       else
9833 	return NULL_TREE;
9834     default:
9835       return NULL_TREE;
9836     }
9837 
9838   /* Handle BUILT_IN_NORMAL here.  */
9839   switch (orig_code)
9840     {
9841     case BUILT_IN_ATOMIC_EXCHANGE:
9842     case BUILT_IN_ATOMIC_COMPARE_EXCHANGE:
9843     case BUILT_IN_ATOMIC_LOAD:
9844     case BUILT_IN_ATOMIC_STORE:
9845       {
9846 	/* Handle these 4 together so that they can fall through to the next
9847 	   case if the call is transformed to an _N variant.  */
9848         switch (orig_code)
9849 	{
9850 	  case BUILT_IN_ATOMIC_EXCHANGE:
9851 	    {
9852 	      if (resolve_overloaded_atomic_exchange (loc, function, params,
9853 						      &new_return))
9854 		return new_return;
9855 	      /* Change to the _N variant.  */
9856 	      orig_code = BUILT_IN_ATOMIC_EXCHANGE_N;
9857 	      break;
9858 	    }
9859 
9860 	  case BUILT_IN_ATOMIC_COMPARE_EXCHANGE:
9861 	    {
9862 	      if (resolve_overloaded_atomic_compare_exchange (loc, function,
9863 							      params,
9864 							      &new_return))
9865 		return new_return;
9866 	      /* Change to the _N variant.  */
9867 	      orig_code = BUILT_IN_ATOMIC_COMPARE_EXCHANGE_N;
9868 	      break;
9869 	    }
9870 	  case BUILT_IN_ATOMIC_LOAD:
9871 	    {
9872 	      if (resolve_overloaded_atomic_load (loc, function, params,
9873 						  &new_return))
9874 		return new_return;
9875 	      /* Change to the _N variant.  */
9876 	      orig_code = BUILT_IN_ATOMIC_LOAD_N;
9877 	      break;
9878 	    }
9879 	  case BUILT_IN_ATOMIC_STORE:
9880 	    {
9881 	      if (resolve_overloaded_atomic_store (loc, function, params,
9882 						   &new_return))
9883 		return new_return;
9884 	      /* Change to the _N variant.  */
9885 	      orig_code = BUILT_IN_ATOMIC_STORE_N;
9886 	      break;
9887 	    }
9888 	  default:
9889 	    gcc_unreachable ();
9890 	}
9891 	/* Fallthrough to the normal processing.  */
9892       }
9893     case BUILT_IN_ATOMIC_EXCHANGE_N:
9894     case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_N:
9895     case BUILT_IN_ATOMIC_LOAD_N:
9896     case BUILT_IN_ATOMIC_STORE_N:
9897     case BUILT_IN_ATOMIC_ADD_FETCH_N:
9898     case BUILT_IN_ATOMIC_SUB_FETCH_N:
9899     case BUILT_IN_ATOMIC_AND_FETCH_N:
9900     case BUILT_IN_ATOMIC_NAND_FETCH_N:
9901     case BUILT_IN_ATOMIC_XOR_FETCH_N:
9902     case BUILT_IN_ATOMIC_OR_FETCH_N:
9903     case BUILT_IN_ATOMIC_FETCH_ADD_N:
9904     case BUILT_IN_ATOMIC_FETCH_SUB_N:
9905     case BUILT_IN_ATOMIC_FETCH_AND_N:
9906     case BUILT_IN_ATOMIC_FETCH_NAND_N:
9907     case BUILT_IN_ATOMIC_FETCH_XOR_N:
9908     case BUILT_IN_ATOMIC_FETCH_OR_N:
9909       {
9910         orig_format = false;
9911 	/* Fallthru for parameter processing.  */
9912       }
9913     case BUILT_IN_SYNC_FETCH_AND_ADD_N:
9914     case BUILT_IN_SYNC_FETCH_AND_SUB_N:
9915     case BUILT_IN_SYNC_FETCH_AND_OR_N:
9916     case BUILT_IN_SYNC_FETCH_AND_AND_N:
9917     case BUILT_IN_SYNC_FETCH_AND_XOR_N:
9918     case BUILT_IN_SYNC_FETCH_AND_NAND_N:
9919     case BUILT_IN_SYNC_ADD_AND_FETCH_N:
9920     case BUILT_IN_SYNC_SUB_AND_FETCH_N:
9921     case BUILT_IN_SYNC_OR_AND_FETCH_N:
9922     case BUILT_IN_SYNC_AND_AND_FETCH_N:
9923     case BUILT_IN_SYNC_XOR_AND_FETCH_N:
9924     case BUILT_IN_SYNC_NAND_AND_FETCH_N:
9925     case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_N:
9926     case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_N:
9927     case BUILT_IN_SYNC_LOCK_TEST_AND_SET_N:
9928     case BUILT_IN_SYNC_LOCK_RELEASE_N:
9929       {
9930 	int n = sync_resolve_size (function, params);
9931 	tree new_function, first_param, result;
9932 	enum built_in_function fncode;
9933 
9934 	if (n == 0)
9935 	  return error_mark_node;
9936 
9937 	fncode = (enum built_in_function)((int)orig_code + exact_log2 (n) + 1);
9938 	new_function = builtin_decl_explicit (fncode);
9939 	if (!sync_resolve_params (loc, function, new_function, params,
9940 				  orig_format))
9941 	  return error_mark_node;
9942 
9943 	first_param = VEC_index (tree, params, 0);
9944 	result = build_function_call_vec (loc, new_function, params, NULL);
9945 	if (result == error_mark_node)
9946 	  return result;
9947 	if (orig_code != BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_N
9948 	    && orig_code != BUILT_IN_SYNC_LOCK_RELEASE_N
9949 	    && orig_code != BUILT_IN_ATOMIC_STORE_N)
9950 	  result = sync_resolve_return (first_param, result, orig_format);
9951 
9952 	/* If new_return is set, assign function to that expr and cast the
9953 	   result to void since the generic interface returned void.  */
9954 	if (new_return)
9955 	  {
9956 	    /* Cast function result from I{1,2,4,8,16} to the required type.  */
9957 	    result = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (new_return), result);
9958 	    result = build2 (MODIFY_EXPR, TREE_TYPE (new_return), new_return,
9959 			     result);
9960 	    TREE_SIDE_EFFECTS (result) = 1;
9961 	    protected_set_expr_location (result, loc);
9962 	    result = convert (void_type_node, result);
9963 	  }
9964 	return result;
9965       }
9966 
9967     default:
9968       return NULL_TREE;
9969     }
9970 }
9971 
9972 /* Ignoring their sign, return true if two scalar types are the same.  */
9973 bool
9974 same_scalar_type_ignoring_signedness (tree t1, tree t2)
9975 {
9976   enum tree_code c1 = TREE_CODE (t1), c2 = TREE_CODE (t2);
9977 
9978   gcc_assert ((c1 == INTEGER_TYPE || c1 == REAL_TYPE || c1 == FIXED_POINT_TYPE)
9979 	      && (c2 == INTEGER_TYPE || c2 == REAL_TYPE
9980 		  || c2 == FIXED_POINT_TYPE));
9981 
9982   /* Equality works here because c_common_signed_type uses
9983      TYPE_MAIN_VARIANT.  */
9984   return c_common_signed_type (t1)
9985     == c_common_signed_type (t2);
9986 }
9987 
9988 /* Check for missing format attributes on function pointers.  LTYPE is
9989    the new type or left-hand side type.  RTYPE is the old type or
9990    right-hand side type.  Returns TRUE if LTYPE is missing the desired
9991    attribute.  */
9992 
9993 bool
9994 check_missing_format_attribute (tree ltype, tree rtype)
9995 {
9996   tree const ttr = TREE_TYPE (rtype), ttl = TREE_TYPE (ltype);
9997   tree ra;
9998 
9999   for (ra = TYPE_ATTRIBUTES (ttr); ra; ra = TREE_CHAIN (ra))
10000     if (is_attribute_p ("format", TREE_PURPOSE (ra)))
10001       break;
10002   if (ra)
10003     {
10004       tree la;
10005       for (la = TYPE_ATTRIBUTES (ttl); la; la = TREE_CHAIN (la))
10006 	if (is_attribute_p ("format", TREE_PURPOSE (la)))
10007 	  break;
10008       return !la;
10009     }
10010   else
10011     return false;
10012 }
10013 
10014 /* Subscripting with type char is likely to lose on a machine where
10015    chars are signed.  So warn on any machine, but optionally.  Don't
10016    warn for unsigned char since that type is safe.  Don't warn for
10017    signed char because anyone who uses that must have done so
10018    deliberately. Furthermore, we reduce the false positive load by
10019    warning only for non-constant value of type char.  */
10020 
10021 void
10022 warn_array_subscript_with_type_char (tree index)
10023 {
10024   if (TYPE_MAIN_VARIANT (TREE_TYPE (index)) == char_type_node
10025       && TREE_CODE (index) != INTEGER_CST)
10026     warning (OPT_Wchar_subscripts, "array subscript has type %<char%>");
10027 }
10028 
10029 /* Implement -Wparentheses for the unexpected C precedence rules, to
10030    cover cases like x + y << z which readers are likely to
10031    misinterpret.  We have seen an expression in which CODE is a binary
10032    operator used to combine expressions ARG_LEFT and ARG_RIGHT, which
10033    before folding had CODE_LEFT and CODE_RIGHT.  CODE_LEFT and
10034    CODE_RIGHT may be ERROR_MARK, which means that that side of the
10035    expression was not formed using a binary or unary operator, or it
10036    was enclosed in parentheses.  */
10037 
10038 void
10039 warn_about_parentheses (enum tree_code code,
10040 			enum tree_code code_left, tree arg_left,
10041 			enum tree_code code_right, tree arg_right)
10042 {
10043   if (!warn_parentheses)
10044     return;
10045 
10046   /* This macro tests that the expression ARG with original tree code
10047      CODE appears to be a boolean expression. or the result of folding a
10048      boolean expression.  */
10049 #define APPEARS_TO_BE_BOOLEAN_EXPR_P(CODE, ARG)                             \
10050 	(truth_value_p (TREE_CODE (ARG))                                    \
10051 	 || TREE_CODE (TREE_TYPE (ARG)) == BOOLEAN_TYPE                     \
10052 	 /* Folding may create 0 or 1 integers from other expressions.  */  \
10053 	 || ((CODE) != INTEGER_CST                                          \
10054 	     && (integer_onep (ARG) || integer_zerop (ARG))))
10055 
10056   switch (code)
10057     {
10058     case LSHIFT_EXPR:
10059       if (code_left == PLUS_EXPR || code_right == PLUS_EXPR)
10060 	warning (OPT_Wparentheses,
10061 		 "suggest parentheses around %<+%> inside %<<<%>");
10062       else if (code_left == MINUS_EXPR || code_right == MINUS_EXPR)
10063 	warning (OPT_Wparentheses,
10064 		 "suggest parentheses around %<-%> inside %<<<%>");
10065       return;
10066 
10067     case RSHIFT_EXPR:
10068       if (code_left == PLUS_EXPR || code_right == PLUS_EXPR)
10069 	warning (OPT_Wparentheses,
10070 		 "suggest parentheses around %<+%> inside %<>>%>");
10071       else if (code_left == MINUS_EXPR || code_right == MINUS_EXPR)
10072 	warning (OPT_Wparentheses,
10073 		 "suggest parentheses around %<-%> inside %<>>%>");
10074       return;
10075 
10076     case TRUTH_ORIF_EXPR:
10077       if (code_left == TRUTH_ANDIF_EXPR || code_right == TRUTH_ANDIF_EXPR)
10078 	warning (OPT_Wparentheses,
10079 		 "suggest parentheses around %<&&%> within %<||%>");
10080       return;
10081 
10082     case BIT_IOR_EXPR:
10083       if (code_left == BIT_AND_EXPR || code_left == BIT_XOR_EXPR
10084 	  || code_left == PLUS_EXPR || code_left == MINUS_EXPR
10085 	  || code_right == BIT_AND_EXPR || code_right == BIT_XOR_EXPR
10086 	  || code_right == PLUS_EXPR || code_right == MINUS_EXPR)
10087 	warning (OPT_Wparentheses,
10088 		 "suggest parentheses around arithmetic in operand of %<|%>");
10089       /* Check cases like x|y==z */
10090       else if (TREE_CODE_CLASS (code_left) == tcc_comparison
10091 	       || TREE_CODE_CLASS (code_right) == tcc_comparison)
10092 	warning (OPT_Wparentheses,
10093 		 "suggest parentheses around comparison in operand of %<|%>");
10094       /* Check cases like !x | y */
10095       else if (code_left == TRUTH_NOT_EXPR
10096 	       && !APPEARS_TO_BE_BOOLEAN_EXPR_P (code_right, arg_right))
10097 	warning (OPT_Wparentheses, "suggest parentheses around operand of "
10098 		 "%<!%> or change %<|%> to %<||%> or %<!%> to %<~%>");
10099       return;
10100 
10101     case BIT_XOR_EXPR:
10102       if (code_left == BIT_AND_EXPR
10103 	  || code_left == PLUS_EXPR || code_left == MINUS_EXPR
10104 	  || code_right == BIT_AND_EXPR
10105 	  || code_right == PLUS_EXPR || code_right == MINUS_EXPR)
10106 	warning (OPT_Wparentheses,
10107 		 "suggest parentheses around arithmetic in operand of %<^%>");
10108       /* Check cases like x^y==z */
10109       else if (TREE_CODE_CLASS (code_left) == tcc_comparison
10110 	       || TREE_CODE_CLASS (code_right) == tcc_comparison)
10111 	warning (OPT_Wparentheses,
10112 		 "suggest parentheses around comparison in operand of %<^%>");
10113       return;
10114 
10115     case BIT_AND_EXPR:
10116       if (code_left == PLUS_EXPR || code_right == PLUS_EXPR)
10117 	warning (OPT_Wparentheses,
10118 		 "suggest parentheses around %<+%> in operand of %<&%>");
10119       else if (code_left == MINUS_EXPR || code_right == MINUS_EXPR)
10120 	warning (OPT_Wparentheses,
10121 		 "suggest parentheses around %<-%> in operand of %<&%>");
10122       /* Check cases like x&y==z */
10123       else if (TREE_CODE_CLASS (code_left) == tcc_comparison
10124 	       || TREE_CODE_CLASS (code_right) == tcc_comparison)
10125 	warning (OPT_Wparentheses,
10126 		 "suggest parentheses around comparison in operand of %<&%>");
10127       /* Check cases like !x & y */
10128       else if (code_left == TRUTH_NOT_EXPR
10129 	       && !APPEARS_TO_BE_BOOLEAN_EXPR_P (code_right, arg_right))
10130 	warning (OPT_Wparentheses, "suggest parentheses around operand of "
10131 		 "%<!%> or change %<&%> to %<&&%> or %<!%> to %<~%>");
10132       return;
10133 
10134     case EQ_EXPR:
10135       if (TREE_CODE_CLASS (code_left) == tcc_comparison
10136           || TREE_CODE_CLASS (code_right) == tcc_comparison)
10137 	warning (OPT_Wparentheses,
10138 		 "suggest parentheses around comparison in operand of %<==%>");
10139       return;
10140     case NE_EXPR:
10141       if (TREE_CODE_CLASS (code_left) == tcc_comparison
10142           || TREE_CODE_CLASS (code_right) == tcc_comparison)
10143 	warning (OPT_Wparentheses,
10144 		 "suggest parentheses around comparison in operand of %<!=%>");
10145       return;
10146 
10147     default:
10148       if (TREE_CODE_CLASS (code) == tcc_comparison
10149 	   && ((TREE_CODE_CLASS (code_left) == tcc_comparison
10150 		&& code_left != NE_EXPR && code_left != EQ_EXPR
10151 		&& INTEGRAL_TYPE_P (TREE_TYPE (arg_left)))
10152 	       || (TREE_CODE_CLASS (code_right) == tcc_comparison
10153 		   && code_right != NE_EXPR && code_right != EQ_EXPR
10154 		   && INTEGRAL_TYPE_P (TREE_TYPE (arg_right)))))
10155 	warning (OPT_Wparentheses, "comparisons like %<X<=Y<=Z%> do not "
10156 		 "have their mathematical meaning");
10157       return;
10158     }
10159 #undef NOT_A_BOOLEAN_EXPR_P
10160 }
10161 
10162 /* If LABEL (a LABEL_DECL) has not been used, issue a warning.  */
10163 
10164 void
10165 warn_for_unused_label (tree label)
10166 {
10167   if (!TREE_USED (label))
10168     {
10169       if (DECL_INITIAL (label))
10170 	warning (OPT_Wunused_label, "label %q+D defined but not used", label);
10171       else
10172         warning (OPT_Wunused_label, "label %q+D declared but not defined", label);
10173     }
10174 }
10175 
10176 /* Warn for division by zero according to the value of DIVISOR.  LOC
10177    is the location of the division operator.  */
10178 
10179 void
10180 warn_for_div_by_zero (location_t loc, tree divisor)
10181 {
10182   /* If DIVISOR is zero, and has integral or fixed-point type, issue a warning
10183      about division by zero.  Do not issue a warning if DIVISOR has a
10184      floating-point type, since we consider 0.0/0.0 a valid way of
10185      generating a NaN.  */
10186   if (c_inhibit_evaluation_warnings == 0
10187       && (integer_zerop (divisor) || fixed_zerop (divisor)))
10188     warning_at (loc, OPT_Wdiv_by_zero, "division by zero");
10189 }
10190 
10191 /* Subroutine of build_binary_op. Give warnings for comparisons
10192    between signed and unsigned quantities that may fail. Do the
10193    checking based on the original operand trees ORIG_OP0 and ORIG_OP1,
10194    so that casts will be considered, but default promotions won't
10195    be.
10196 
10197    LOCATION is the location of the comparison operator.
10198 
10199    The arguments of this function map directly to local variables
10200    of build_binary_op.  */
10201 
10202 void
10203 warn_for_sign_compare (location_t location,
10204 		       tree orig_op0, tree orig_op1,
10205 		       tree op0, tree op1,
10206 		       tree result_type, enum tree_code resultcode)
10207 {
10208   int op0_signed = !TYPE_UNSIGNED (TREE_TYPE (orig_op0));
10209   int op1_signed = !TYPE_UNSIGNED (TREE_TYPE (orig_op1));
10210   int unsignedp0, unsignedp1;
10211 
10212   /* In C++, check for comparison of different enum types.  */
10213   if (c_dialect_cxx()
10214       && TREE_CODE (TREE_TYPE (orig_op0)) == ENUMERAL_TYPE
10215       && TREE_CODE (TREE_TYPE (orig_op1)) == ENUMERAL_TYPE
10216       && TYPE_MAIN_VARIANT (TREE_TYPE (orig_op0))
10217 	 != TYPE_MAIN_VARIANT (TREE_TYPE (orig_op1)))
10218     {
10219       warning_at (location,
10220 		  OPT_Wsign_compare, "comparison between types %qT and %qT",
10221 		  TREE_TYPE (orig_op0), TREE_TYPE (orig_op1));
10222     }
10223 
10224   /* Do not warn if the comparison is being done in a signed type,
10225      since the signed type will only be chosen if it can represent
10226      all the values of the unsigned type.  */
10227   if (!TYPE_UNSIGNED (result_type))
10228     /* OK */;
10229   /* Do not warn if both operands are unsigned.  */
10230   else if (op0_signed == op1_signed)
10231     /* OK */;
10232   else
10233     {
10234       tree sop, uop, base_type;
10235       bool ovf;
10236 
10237       if (op0_signed)
10238         sop = orig_op0, uop = orig_op1;
10239       else
10240         sop = orig_op1, uop = orig_op0;
10241 
10242       STRIP_TYPE_NOPS (sop);
10243       STRIP_TYPE_NOPS (uop);
10244       base_type = (TREE_CODE (result_type) == COMPLEX_TYPE
10245 		   ? TREE_TYPE (result_type) : result_type);
10246 
10247       /* Do not warn if the signed quantity is an unsuffixed integer
10248          literal (or some static constant expression involving such
10249          literals or a conditional expression involving such literals)
10250          and it is non-negative.  */
10251       if (tree_expr_nonnegative_warnv_p (sop, &ovf))
10252         /* OK */;
10253       /* Do not warn if the comparison is an equality operation, the
10254          unsigned quantity is an integral constant, and it would fit
10255          in the result if the result were signed.  */
10256       else if (TREE_CODE (uop) == INTEGER_CST
10257                && (resultcode == EQ_EXPR || resultcode == NE_EXPR)
10258 	       && int_fits_type_p (uop, c_common_signed_type (base_type)))
10259         /* OK */;
10260       /* In C, do not warn if the unsigned quantity is an enumeration
10261          constant and its maximum value would fit in the result if the
10262          result were signed.  */
10263       else if (!c_dialect_cxx() && TREE_CODE (uop) == INTEGER_CST
10264                && TREE_CODE (TREE_TYPE (uop)) == ENUMERAL_TYPE
10265                && int_fits_type_p (TYPE_MAX_VALUE (TREE_TYPE (uop)),
10266 				   c_common_signed_type (base_type)))
10267         /* OK */;
10268       else
10269         warning_at (location,
10270 		    OPT_Wsign_compare,
10271 		    "comparison between signed and unsigned integer expressions");
10272     }
10273 
10274   /* Warn if two unsigned values are being compared in a size larger
10275      than their original size, and one (and only one) is the result of
10276      a `~' operator.  This comparison will always fail.
10277 
10278      Also warn if one operand is a constant, and the constant does not
10279      have all bits set that are set in the ~ operand when it is
10280      extended.  */
10281 
10282   op0 = c_common_get_narrower (op0, &unsignedp0);
10283   op1 = c_common_get_narrower (op1, &unsignedp1);
10284 
10285   if ((TREE_CODE (op0) == BIT_NOT_EXPR)
10286       ^ (TREE_CODE (op1) == BIT_NOT_EXPR))
10287     {
10288       if (TREE_CODE (op0) == BIT_NOT_EXPR)
10289 	op0 = c_common_get_narrower (TREE_OPERAND (op0, 0), &unsignedp0);
10290       if (TREE_CODE (op1) == BIT_NOT_EXPR)
10291 	op1 = c_common_get_narrower (TREE_OPERAND (op1, 0), &unsignedp1);
10292 
10293       if (host_integerp (op0, 0) || host_integerp (op1, 0))
10294         {
10295           tree primop;
10296           HOST_WIDE_INT constant, mask;
10297           int unsignedp;
10298           unsigned int bits;
10299 
10300           if (host_integerp (op0, 0))
10301             {
10302               primop = op1;
10303               unsignedp = unsignedp1;
10304               constant = tree_low_cst (op0, 0);
10305             }
10306           else
10307             {
10308               primop = op0;
10309               unsignedp = unsignedp0;
10310               constant = tree_low_cst (op1, 0);
10311             }
10312 
10313           bits = TYPE_PRECISION (TREE_TYPE (primop));
10314           if (bits < TYPE_PRECISION (result_type)
10315               && bits < HOST_BITS_PER_LONG && unsignedp)
10316             {
10317               mask = (~ (HOST_WIDE_INT) 0) << bits;
10318               if ((mask & constant) != mask)
10319 		{
10320 		  if (constant == 0)
10321 		    warning (OPT_Wsign_compare,
10322 			     "promoted ~unsigned is always non-zero");
10323 		  else
10324 		    warning_at (location, OPT_Wsign_compare,
10325 				"comparison of promoted ~unsigned with constant");
10326 		}
10327             }
10328         }
10329       else if (unsignedp0 && unsignedp1
10330                && (TYPE_PRECISION (TREE_TYPE (op0))
10331                    < TYPE_PRECISION (result_type))
10332                && (TYPE_PRECISION (TREE_TYPE (op1))
10333                    < TYPE_PRECISION (result_type)))
10334         warning_at (location, OPT_Wsign_compare,
10335                  "comparison of promoted ~unsigned with unsigned");
10336     }
10337 }
10338 
10339 /* RESULT_TYPE is the result of converting TYPE1 and TYPE2 to a common
10340    type via c_common_type.  If -Wdouble-promotion is in use, and the
10341    conditions for warning have been met, issue a warning.  GMSGID is
10342    the warning message.  It must have two %T specifiers for the type
10343    that was converted (generally "float") and the type to which it was
10344    converted (generally "double), respectively.  LOC is the location
10345    to which the awrning should refer.  */
10346 
10347 void
10348 do_warn_double_promotion (tree result_type, tree type1, tree type2,
10349 			 const char *gmsgid, location_t loc)
10350 {
10351   tree source_type;
10352 
10353   if (!warn_double_promotion)
10354     return;
10355   /* If the conversion will not occur at run-time, there is no need to
10356      warn about it.  */
10357   if (c_inhibit_evaluation_warnings)
10358     return;
10359   if (TYPE_MAIN_VARIANT (result_type) != double_type_node
10360       && TYPE_MAIN_VARIANT (result_type) != complex_double_type_node)
10361     return;
10362   if (TYPE_MAIN_VARIANT (type1) == float_type_node
10363       || TYPE_MAIN_VARIANT (type1) == complex_float_type_node)
10364     source_type = type1;
10365   else if (TYPE_MAIN_VARIANT (type2) == float_type_node
10366 	   || TYPE_MAIN_VARIANT (type2) == complex_float_type_node)
10367     source_type = type2;
10368   else
10369     return;
10370   warning_at (loc, OPT_Wdouble_promotion, gmsgid, source_type, result_type);
10371 }
10372 
10373 /* Setup a TYPE_DECL node as a typedef representation.
10374 
10375    X is a TYPE_DECL for a typedef statement.  Create a brand new
10376    ..._TYPE node (which will be just a variant of the existing
10377    ..._TYPE node with identical properties) and then install X
10378    as the TYPE_NAME of this brand new (duplicate) ..._TYPE node.
10379 
10380    The whole point here is to end up with a situation where each
10381    and every ..._TYPE node the compiler creates will be uniquely
10382    associated with AT MOST one node representing a typedef name.
10383    This way, even though the compiler substitutes corresponding
10384    ..._TYPE nodes for TYPE_DECL (i.e. "typedef name") nodes very
10385    early on, later parts of the compiler can always do the reverse
10386    translation and get back the corresponding typedef name.  For
10387    example, given:
10388 
10389 	typedef struct S MY_TYPE;
10390 	MY_TYPE object;
10391 
10392    Later parts of the compiler might only know that `object' was of
10393    type `struct S' if it were not for code just below.  With this
10394    code however, later parts of the compiler see something like:
10395 
10396 	struct S' == struct S
10397 	typedef struct S' MY_TYPE;
10398 	struct S' object;
10399 
10400     And they can then deduce (from the node for type struct S') that
10401     the original object declaration was:
10402 
10403 		MY_TYPE object;
10404 
10405     Being able to do this is important for proper support of protoize,
10406     and also for generating precise symbolic debugging information
10407     which takes full account of the programmer's (typedef) vocabulary.
10408 
10409     Obviously, we don't want to generate a duplicate ..._TYPE node if
10410     the TYPE_DECL node that we are now processing really represents a
10411     standard built-in type.  */
10412 
10413 void
10414 set_underlying_type (tree x)
10415 {
10416   if (x == error_mark_node)
10417     return;
10418   if (DECL_IS_BUILTIN (x))
10419     {
10420       if (TYPE_NAME (TREE_TYPE (x)) == 0)
10421 	TYPE_NAME (TREE_TYPE (x)) = x;
10422     }
10423   else if (TREE_TYPE (x) != error_mark_node
10424 	   && DECL_ORIGINAL_TYPE (x) == NULL_TREE)
10425     {
10426       tree tt = TREE_TYPE (x);
10427       DECL_ORIGINAL_TYPE (x) = tt;
10428       tt = build_variant_type_copy (tt);
10429       TYPE_STUB_DECL (tt) = TYPE_STUB_DECL (DECL_ORIGINAL_TYPE (x));
10430       TYPE_NAME (tt) = x;
10431       TREE_USED (tt) = TREE_USED (x);
10432       TREE_TYPE (x) = tt;
10433     }
10434 }
10435 
10436 /* Record the types used by the current global variable declaration
10437    being parsed, so that we can decide later to emit their debug info.
10438    Those types are in types_used_by_cur_var_decl, and we are going to
10439    store them in the types_used_by_vars_hash hash table.
10440    DECL is the declaration of the global variable that has been parsed.  */
10441 
10442 void
10443 record_types_used_by_current_var_decl (tree decl)
10444 {
10445   gcc_assert (decl && DECL_P (decl) && TREE_STATIC (decl));
10446 
10447   while (!VEC_empty (tree, types_used_by_cur_var_decl))
10448     {
10449       tree type = VEC_pop (tree, types_used_by_cur_var_decl);
10450       types_used_by_var_decl_insert (type, decl);
10451     }
10452 }
10453 
10454 /* If DECL is a typedef that is declared in the current function,
10455    record it for the purpose of -Wunused-local-typedefs.  */
10456 
10457 void
10458 record_locally_defined_typedef (tree decl)
10459 {
10460   struct c_language_function *l;
10461 
10462   if (!warn_unused_local_typedefs
10463       || cfun == NULL
10464       /* if this is not a locally defined typedef then we are not
10465 	 interested.  */
10466       || !is_typedef_decl (decl)
10467       || !decl_function_context (decl))
10468     return;
10469 
10470   l = (struct c_language_function *) cfun->language;
10471   VEC_safe_push (tree, gc, l->local_typedefs, decl);
10472 }
10473 
10474 /* If T is a TYPE_DECL declared locally, mark it as used.  */
10475 
10476 void
10477 maybe_record_typedef_use (tree t)
10478 {
10479   if (!is_typedef_decl (t))
10480     return;
10481 
10482   TREE_USED (t) = true;
10483 }
10484 
10485 /* Warn if there are some unused locally defined typedefs in the
10486    current function. */
10487 
10488 void
10489 maybe_warn_unused_local_typedefs (void)
10490 {
10491   int i;
10492   tree decl;
10493   /* The number of times we have emitted -Wunused-local-typedefs
10494      warnings.  If this is different from errorcount, that means some
10495      unrelated errors have been issued.  In which case, we'll avoid
10496      emitting "unused-local-typedefs" warnings.  */
10497   static int unused_local_typedefs_warn_count;
10498   struct c_language_function *l;
10499 
10500   if (cfun == NULL)
10501     return;
10502 
10503   if ((l = (struct c_language_function *) cfun->language) == NULL)
10504     return;
10505 
10506   if (warn_unused_local_typedefs
10507       && errorcount == unused_local_typedefs_warn_count)
10508     {
10509       FOR_EACH_VEC_ELT (tree, l->local_typedefs, i, decl)
10510 	if (!TREE_USED (decl))
10511 	  warning_at (DECL_SOURCE_LOCATION (decl),
10512 		      OPT_Wunused_local_typedefs,
10513 		      "typedef %qD locally defined but not used", decl);
10514       unused_local_typedefs_warn_count = errorcount;
10515     }
10516 
10517   if (l->local_typedefs)
10518     {
10519       VEC_free (tree, gc, l->local_typedefs);
10520       l->local_typedefs = NULL;
10521     }
10522 }
10523 
10524 /* The C and C++ parsers both use vectors to hold function arguments.
10525    For efficiency, we keep a cache of unused vectors.  This is the
10526    cache.  */
10527 
10528 typedef VEC(tree,gc)* tree_gc_vec;
10529 DEF_VEC_P(tree_gc_vec);
10530 DEF_VEC_ALLOC_P(tree_gc_vec,gc);
10531 static GTY((deletable)) VEC(tree_gc_vec,gc) *tree_vector_cache;
10532 
10533 /* Return a new vector from the cache.  If the cache is empty,
10534    allocate a new vector.  These vectors are GC'ed, so it is OK if the
10535    pointer is not released..  */
10536 
10537 VEC(tree,gc) *
10538 make_tree_vector (void)
10539 {
10540   if (!VEC_empty (tree_gc_vec, tree_vector_cache))
10541     return VEC_pop (tree_gc_vec, tree_vector_cache);
10542   else
10543     {
10544       /* Passing 0 to VEC_alloc returns NULL, and our callers require
10545 	 that we always return a non-NULL value.  The vector code uses
10546 	 4 when growing a NULL vector, so we do too.  */
10547       return VEC_alloc (tree, gc, 4);
10548     }
10549 }
10550 
10551 /* Release a vector of trees back to the cache.  */
10552 
10553 void
10554 release_tree_vector (VEC(tree,gc) *vec)
10555 {
10556   if (vec != NULL)
10557     {
10558       VEC_truncate (tree, vec, 0);
10559       VEC_safe_push (tree_gc_vec, gc, tree_vector_cache, vec);
10560     }
10561 }
10562 
10563 /* Get a new tree vector holding a single tree.  */
10564 
10565 VEC(tree,gc) *
10566 make_tree_vector_single (tree t)
10567 {
10568   VEC(tree,gc) *ret = make_tree_vector ();
10569   VEC_quick_push (tree, ret, t);
10570   return ret;
10571 }
10572 
10573 /* Get a new tree vector of the TREE_VALUEs of a TREE_LIST chain.  */
10574 
10575 VEC(tree,gc) *
10576 make_tree_vector_from_list (tree list)
10577 {
10578   VEC(tree,gc) *ret = make_tree_vector ();
10579   for (; list; list = TREE_CHAIN (list))
10580     VEC_safe_push (tree, gc, ret, TREE_VALUE (list));
10581   return ret;
10582 }
10583 
10584 /* Get a new tree vector which is a copy of an existing one.  */
10585 
10586 VEC(tree,gc) *
10587 make_tree_vector_copy (const VEC(tree,gc) *orig)
10588 {
10589   VEC(tree,gc) *ret;
10590   unsigned int ix;
10591   tree t;
10592 
10593   ret = make_tree_vector ();
10594   VEC_reserve (tree, gc, ret, VEC_length (tree, orig));
10595   FOR_EACH_VEC_ELT (tree, orig, ix, t)
10596     VEC_quick_push (tree, ret, t);
10597   return ret;
10598 }
10599 
10600 /* Return true if KEYWORD starts a type specifier.  */
10601 
10602 bool
10603 keyword_begins_type_specifier (enum rid keyword)
10604 {
10605   switch (keyword)
10606     {
10607     case RID_INT:
10608     case RID_CHAR:
10609     case RID_FLOAT:
10610     case RID_DOUBLE:
10611     case RID_VOID:
10612     case RID_INT128:
10613     case RID_UNSIGNED:
10614     case RID_LONG:
10615     case RID_SHORT:
10616     case RID_SIGNED:
10617     case RID_DFLOAT32:
10618     case RID_DFLOAT64:
10619     case RID_DFLOAT128:
10620     case RID_FRACT:
10621     case RID_ACCUM:
10622     case RID_BOOL:
10623     case RID_WCHAR:
10624     case RID_CHAR16:
10625     case RID_CHAR32:
10626     case RID_SAT:
10627     case RID_COMPLEX:
10628     case RID_TYPEOF:
10629     case RID_STRUCT:
10630     case RID_CLASS:
10631     case RID_UNION:
10632     case RID_ENUM:
10633       return true;
10634     default:
10635       return false;
10636     }
10637 }
10638 
10639 /* Return true if KEYWORD names a type qualifier.  */
10640 
10641 bool
10642 keyword_is_type_qualifier (enum rid keyword)
10643 {
10644   switch (keyword)
10645     {
10646     case RID_CONST:
10647     case RID_VOLATILE:
10648     case RID_RESTRICT:
10649       return true;
10650     default:
10651       return false;
10652     }
10653 }
10654 
10655 /* Return true if KEYWORD names a storage class specifier.
10656 
10657    RID_TYPEDEF is not included in this list despite `typedef' being
10658    listed in C99 6.7.1.1.  6.7.1.3 indicates that `typedef' is listed as
10659    such for syntactic convenience only.  */
10660 
10661 bool
10662 keyword_is_storage_class_specifier (enum rid keyword)
10663 {
10664   switch (keyword)
10665     {
10666     case RID_STATIC:
10667     case RID_EXTERN:
10668     case RID_REGISTER:
10669     case RID_AUTO:
10670     case RID_MUTABLE:
10671     case RID_THREAD:
10672       return true;
10673     default:
10674       return false;
10675     }
10676 }
10677 
10678 /* Return true if KEYWORD names a function-specifier [dcl.fct.spec].  */
10679 
10680 static bool
10681 keyword_is_function_specifier (enum rid keyword)
10682 {
10683   switch (keyword)
10684     {
10685     case RID_INLINE:
10686     case RID_NORETURN:
10687     case RID_VIRTUAL:
10688     case RID_EXPLICIT:
10689       return true;
10690     default:
10691       return false;
10692     }
10693 }
10694 
10695 /* Return true if KEYWORD names a decl-specifier [dcl.spec] or a
10696    declaration-specifier (C99 6.7).  */
10697 
10698 bool
10699 keyword_is_decl_specifier (enum rid keyword)
10700 {
10701   if (keyword_is_storage_class_specifier (keyword)
10702       || keyword_is_type_qualifier (keyword)
10703       || keyword_is_function_specifier (keyword))
10704     return true;
10705 
10706   switch (keyword)
10707     {
10708     case RID_TYPEDEF:
10709     case RID_FRIEND:
10710     case RID_CONSTEXPR:
10711       return true;
10712     default:
10713       return false;
10714     }
10715 }
10716 
10717 /* Initialize language-specific-bits of tree_contains_struct.  */
10718 
10719 void
10720 c_common_init_ts (void)
10721 {
10722   MARK_TS_TYPED (C_MAYBE_CONST_EXPR);
10723   MARK_TS_TYPED (EXCESS_PRECISION_EXPR);
10724 }
10725 
10726 /* Build a user-defined numeric literal out of an integer constant type VALUE
10727    with identifier SUFFIX.  */
10728 
10729 tree
10730 build_userdef_literal (tree suffix_id, tree value, tree num_string)
10731 {
10732   tree literal = make_node (USERDEF_LITERAL);
10733   USERDEF_LITERAL_SUFFIX_ID (literal) = suffix_id;
10734   USERDEF_LITERAL_VALUE (literal) = value;
10735   USERDEF_LITERAL_NUM_STRING (literal) = num_string;
10736   return literal;
10737 }
10738 
10739 #include "gt-c-family-c-common.h"
10740