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