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