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