OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [c-family/] [c-common.c] - Blame information for rev 707

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.