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