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