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