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