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