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