OSDN Git Service

2004-06-21 Geoffrey Keating <geoffk@apple.com>
[pf3gnuchains/gcc-fork.git] / gcc / c-common.c
1 /* Subroutines shared by all languages that are variants of C.
2    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3    2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "intl.h"
27 #include "tree.h"
28 #include "flags.h"
29 #include "output.h"
30 #include "c-pragma.h"
31 #include "rtl.h"
32 #include "ggc.h"
33 #include "varray.h"
34 #include "expr.h"
35 #include "c-common.h"
36 #include "diagnostic.h"
37 #include "tm_p.h"
38 #include "obstack.h"
39 #include "cpplib.h"
40 #include "target.h"
41 #include "langhooks.h"
42 #include "tree-inline.h"
43 #include "c-tree.h"
44 #include "toplev.h"
45 #include "tree-iterator.h"
46 #include "hashtab.h"
47
48 cpp_reader *parse_in;           /* Declared in c-pragma.h.  */
49
50 /* We let tm.h override the types used here, to handle trivial differences
51    such as the choice of unsigned int or long unsigned int for size_t.
52    When machines start needing nontrivial differences in the size type,
53    it would be best to do something here to figure out automatically
54    from other information what type to use.  */
55
56 #ifndef SIZE_TYPE
57 #define SIZE_TYPE "long unsigned int"
58 #endif
59
60 #ifndef PID_TYPE
61 #define PID_TYPE "int"
62 #endif
63
64 #ifndef WCHAR_TYPE
65 #define WCHAR_TYPE "int"
66 #endif
67
68 /* WCHAR_TYPE gets overridden by -fshort-wchar.  */
69 #define MODIFIED_WCHAR_TYPE \
70         (flag_short_wchar ? "short unsigned int" : WCHAR_TYPE)
71
72 #ifndef PTRDIFF_TYPE
73 #define PTRDIFF_TYPE "long int"
74 #endif
75
76 #ifndef WINT_TYPE
77 #define WINT_TYPE "unsigned int"
78 #endif
79
80 #ifndef INTMAX_TYPE
81 #define INTMAX_TYPE ((INT_TYPE_SIZE == LONG_LONG_TYPE_SIZE)     \
82                      ? "int"                                    \
83                      : ((LONG_TYPE_SIZE == LONG_LONG_TYPE_SIZE) \
84                         ? "long int"                            \
85                         : "long long int"))
86 #endif
87
88 #ifndef UINTMAX_TYPE
89 #define UINTMAX_TYPE ((INT_TYPE_SIZE == LONG_LONG_TYPE_SIZE)    \
90                      ? "unsigned int"                           \
91                      : ((LONG_TYPE_SIZE == LONG_LONG_TYPE_SIZE) \
92                         ? "long unsigned int"                   \
93                         : "long long unsigned int"))
94 #endif
95
96 /* The following symbols are subsumed in the c_global_trees array, and
97    listed here individually for documentation purposes.
98
99    INTEGER_TYPE and REAL_TYPE nodes for the standard data types.
100
101         tree short_integer_type_node;
102         tree long_integer_type_node;
103         tree long_long_integer_type_node;
104
105         tree short_unsigned_type_node;
106         tree long_unsigned_type_node;
107         tree long_long_unsigned_type_node;
108
109         tree truthvalue_type_node;
110         tree truthvalue_false_node;
111         tree truthvalue_true_node;
112
113         tree ptrdiff_type_node;
114
115         tree unsigned_char_type_node;
116         tree signed_char_type_node;
117         tree wchar_type_node;
118         tree signed_wchar_type_node;
119         tree unsigned_wchar_type_node;
120
121         tree float_type_node;
122         tree double_type_node;
123         tree long_double_type_node;
124
125         tree complex_integer_type_node;
126         tree complex_float_type_node;
127         tree complex_double_type_node;
128         tree complex_long_double_type_node;
129
130         tree intQI_type_node;
131         tree intHI_type_node;
132         tree intSI_type_node;
133         tree intDI_type_node;
134         tree intTI_type_node;
135
136         tree unsigned_intQI_type_node;
137         tree unsigned_intHI_type_node;
138         tree unsigned_intSI_type_node;
139         tree unsigned_intDI_type_node;
140         tree unsigned_intTI_type_node;
141
142         tree widest_integer_literal_type_node;
143         tree widest_unsigned_literal_type_node;
144
145    Nodes for types `void *' and `const void *'.
146
147         tree ptr_type_node, const_ptr_type_node;
148
149    Nodes for types `char *' and `const char *'.
150
151         tree string_type_node, const_string_type_node;
152
153    Type `char[SOMENUMBER]'.
154    Used when an array of char is needed and the size is irrelevant.
155
156         tree char_array_type_node;
157
158    Type `int[SOMENUMBER]' or something like it.
159    Used when an array of int needed and the size is irrelevant.
160
161         tree int_array_type_node;
162
163    Type `wchar_t[SOMENUMBER]' or something like it.
164    Used when a wide string literal is created.
165
166         tree wchar_array_type_node;
167
168    Type `int ()' -- used for implicit declaration of functions.
169
170         tree default_function_type;
171
172    A VOID_TYPE node, packaged in a TREE_LIST.
173
174         tree void_list_node;
175
176   The lazily created VAR_DECLs for __FUNCTION__, __PRETTY_FUNCTION__,
177   and __func__. (C doesn't generate __FUNCTION__ and__PRETTY_FUNCTION__
178   VAR_DECLS, but C++ does.)
179
180         tree function_name_decl_node;
181         tree pretty_function_name_decl_node;
182         tree c99_function_name_decl_node;
183
184   Stack of nested function name VAR_DECLs.
185
186         tree saved_function_name_decls;
187
188 */
189
190 tree c_global_trees[CTI_MAX];
191
192 /* TRUE if a code represents a statement.  The front end init
193    langhook should take care of initialization of this array.  */
194
195 bool statement_code_p[MAX_TREE_CODES];
196 \f
197 /* Switches common to the C front ends.  */
198
199 /* Nonzero if prepreprocessing only.  */
200
201 int flag_preprocess_only;
202
203 /* Nonzero means don't output line number information.  */
204
205 char flag_no_line_commands;
206
207 /* Nonzero causes -E output not to be done, but directives such as
208    #define that have side effects are still obeyed.  */
209
210 char flag_no_output;
211
212 /* Nonzero means dump macros in some fashion.  */
213
214 char flag_dump_macros;
215
216 /* Nonzero means pass #include lines through to the output.  */
217
218 char flag_dump_includes;
219
220 /* Nonzero means process PCH files while preprocessing.  */
221
222 bool flag_pch_preprocess;
223
224 /* The file name to which we should write a precompiled header, or
225    NULL if no header will be written in this compile.  */
226
227 const char *pch_file;
228
229 /* Nonzero if an ISO standard was selected.  It rejects macros in the
230    user's namespace.  */
231 int flag_iso;
232
233 /* Nonzero if -undef was given.  It suppresses target built-in macros
234    and assertions.  */
235 int flag_undef;
236
237 /* Nonzero means don't recognize the non-ANSI builtin functions.  */
238
239 int flag_no_builtin;
240
241 /* Nonzero means don't recognize the non-ANSI builtin functions.
242    -ansi sets this.  */
243
244 int flag_no_nonansi_builtin;
245
246 /* Nonzero means give `double' the same size as `float'.  */
247
248 int flag_short_double;
249
250 /* Nonzero means give `wchar_t' the same size as `short'.  */
251
252 int flag_short_wchar;
253
254 /* Nonzero means allow Microsoft extensions without warnings or errors.  */
255 int flag_ms_extensions;
256
257 /* Nonzero means don't recognize the keyword `asm'.  */
258
259 int flag_no_asm;
260
261 /* Nonzero means give string constants the type `const char *', as mandated
262    by the standard.  */
263
264 int flag_const_strings;
265
266 /* Nonzero means to treat bitfields as signed unless they say `unsigned'.  */
267
268 int flag_signed_bitfields = 1;
269 int explicit_flag_signed_bitfields;
270
271 /* Nonzero means warn about pointer casts that can drop a type qualifier
272    from the pointer target type.  */
273
274 int warn_cast_qual;
275
276 /* Warn about functions which might be candidates for format attributes.  */
277
278 int warn_missing_format_attribute;
279
280 /* Nonzero means warn about sizeof(function) or addition/subtraction
281    of function pointers.  */
282
283 int warn_pointer_arith;
284
285 /* Nonzero means warn for any global function def
286    without separate previous prototype decl.  */
287
288 int warn_missing_prototypes;
289
290 /* Warn if adding () is suggested.  */
291
292 int warn_parentheses;
293
294 /* Warn if initializer is not completely bracketed.  */
295
296 int warn_missing_braces;
297
298 /* Warn about comparison of signed and unsigned values.
299    If -1, neither -Wsign-compare nor -Wno-sign-compare has been specified
300    (in which case -Wextra gets to decide).  */
301
302 int warn_sign_compare = -1;
303
304 /* Nonzero means warn about usage of long long when `-pedantic'.  */
305
306 int warn_long_long = 1;
307
308 /* Nonzero means warn about deprecated conversion from string constant to
309    `char *'.  */
310
311 int warn_write_strings;
312
313 /* Nonzero means warn about multiple (redundant) decls for the same single
314    variable or function.  */
315
316 int warn_redundant_decls;
317
318 /* Warn about testing equality of floating point numbers.  */
319
320 int warn_float_equal;
321
322 /* Warn about a subscript that has type char.  */
323
324 int warn_char_subscripts;
325
326 /* Warn if a type conversion is done that might have confusing results.  */
327
328 int warn_conversion;
329
330 /* Warn about #pragma directives that are not recognized.  */
331
332 int warn_unknown_pragmas; /* Tri state variable.  */
333
334 /* Warn about format/argument anomalies in calls to formatted I/O functions
335    (*printf, *scanf, strftime, strfmon, etc.).  */
336
337 int warn_format;
338
339 /* Warn about Y2K problems with strftime formats.  */
340
341 int warn_format_y2k;
342
343 /* Warn about excess arguments to formats.  */
344
345 int warn_format_extra_args;
346
347 /* Warn about zero-length formats.  */
348
349 int warn_format_zero_length;
350
351 /* Warn about non-literal format arguments.  */
352
353 int warn_format_nonliteral;
354
355 /* Warn about possible security problems with calls to format functions.  */
356
357 int warn_format_security;
358
359 /* Zero means that faster, ...NonNil variants of objc_msgSend...
360    calls will be used in ObjC; passing nil receivers to such calls
361    will most likely result in crashes.  */
362 int flag_nil_receivers = 1;
363
364 /* Nonzero means that we will allow new ObjC exception syntax (@throw,
365    @try, etc.) in source code.  */
366 int flag_objc_exceptions = 0;
367
368 /* Nonzero means that we generate NeXT setjmp based exceptions.  */
369 int flag_objc_sjlj_exceptions = -1;
370
371 /* Nonzero means that code generation will be altered to support
372    "zero-link" execution.  This currently affects ObjC only, but may
373    affect other languages in the future.  */
374 int flag_zero_link = 0;
375
376 /* Nonzero means emit an '__OBJC, __image_info' for the current translation
377    unit.  It will inform the ObjC runtime that class definition(s) herein
378    contained are to replace one(s) previously loaded.  */
379 int flag_replace_objc_classes = 0;
380    
381 /* C/ObjC language option variables.  */
382
383
384 /* Nonzero means message about use of implicit function declarations;
385  1 means warning; 2 means error.  */
386
387 int mesg_implicit_function_declaration = -1;
388
389 /* Nonzero means allow type mismatches in conditional expressions;
390    just make their values `void'.  */
391
392 int flag_cond_mismatch;
393
394 /* Nonzero means enable C89 Amendment 1 features.  */
395
396 int flag_isoc94;
397
398 /* Nonzero means use the ISO C99 dialect of C.  */
399
400 int flag_isoc99;
401
402 /* Nonzero means that we have builtin functions, and main is an int.  */
403
404 int flag_hosted = 1;
405
406 /* Nonzero means warn when casting a function call to a type that does
407    not match the return type (e.g. (float)sqrt() or (anything*)malloc()
408    when there is no previous declaration of sqrt or malloc.  */
409
410 int warn_bad_function_cast;
411
412 /* Warn about traditional constructs whose meanings changed in ANSI C.  */
413
414 int warn_traditional;
415
416 /* Nonzero means warn for a declaration found after a statement.  */
417
418 int warn_declaration_after_statement;
419
420 /* Nonzero means warn for non-prototype function decls
421    or non-prototyped defs without previous prototype.  */
422
423 int warn_strict_prototypes;
424
425 /* Nonzero means warn for any global function def
426    without separate previous decl.  */
427
428 int warn_missing_declarations;
429
430 /* Nonzero means warn about declarations of objects not at
431    file-scope level and about *all* declarations of functions (whether
432    or static) not at file-scope level.  Note that we exclude
433    implicit function declarations.  To get warnings about those, use
434    -Wimplicit.  */
435
436 int warn_nested_externs;
437
438 /* Warn if main is suspicious.  */
439
440 int warn_main;
441
442 /* Nonzero means warn about possible violations of sequence point rules.  */
443
444 int warn_sequence_point;
445
446 /* Nonzero means warn about uninitialized variable when it is initialized with itself.
447    For example: int i = i;, GCC will not warn about this when warn_init_self is nonzero.  */
448
449 int warn_init_self;
450
451 /* Nonzero means to warn about compile-time division by zero.  */
452 int warn_div_by_zero = 1;
453
454 /* Nonzero means warn about use of implicit int.  */
455
456 int warn_implicit_int;
457
458 /* Warn about NULL being passed to argument slots marked as requiring
459    non-NULL.  */
460
461 int warn_nonnull;
462
463 /* Warn about old-style parameter declaration.  */
464
465 int warn_old_style_definition;
466
467
468 /* ObjC language option variables.  */
469
470
471 /* Open and close the file for outputting class declarations, if
472    requested (ObjC).  */
473
474 int flag_gen_declaration;
475
476 /* Generate code for GNU or NeXT runtime environment.  */
477
478 #ifdef NEXT_OBJC_RUNTIME
479 int flag_next_runtime = 1;
480 #else
481 int flag_next_runtime = 0;
482 #endif
483
484 /* Tells the compiler that this is a special run.  Do not perform any
485    compiling, instead we are to test some platform dependent features
486    and output a C header file with appropriate definitions.  */
487
488 int print_struct_values;
489
490 /* ???.  Undocumented.  */
491
492 const char *constant_string_class_name;
493
494 /* Warn if multiple methods are seen for the same selector, but with
495    different argument types.  Performs the check on the whole selector
496    table at the end of compilation.  */
497
498 int warn_selector;
499
500 /* Warn if a @selector() is found, and no method with that selector
501    has been previously declared.  The check is done on each
502    @selector() as soon as it is found - so it warns about forward
503    declarations.  */
504
505 int warn_undeclared_selector;
506
507 /* Warn if methods required by a protocol are not implemented in the
508    class adopting it.  When turned off, methods inherited to that
509    class are also considered implemented.  */
510
511 int warn_protocol = 1;
512
513
514 /* C++ language option variables.  */
515
516
517 /* Nonzero means don't recognize any extension keywords.  */
518
519 int flag_no_gnu_keywords;
520
521 /* Nonzero means do emit exported implementations of functions even if
522    they can be inlined.  */
523
524 int flag_implement_inlines = 1;
525
526 /* Nonzero means that implicit instantiations will be emitted if needed.  */
527
528 int flag_implicit_templates = 1;
529
530 /* Nonzero means that implicit instantiations of inline templates will be
531    emitted if needed, even if instantiations of non-inline templates
532    aren't.  */
533
534 int flag_implicit_inline_templates = 1;
535
536 /* Nonzero means generate separate instantiation control files and
537    juggle them at link time.  */
538
539 int flag_use_repository;
540
541 /* Nonzero if we want to issue diagnostics that the standard says are not
542    required.  */
543
544 int flag_optional_diags = 1;
545
546 /* Nonzero means we should attempt to elide constructors when possible.  */
547
548 int flag_elide_constructors = 1;
549
550 /* Nonzero means that member functions defined in class scope are
551    inline by default.  */
552
553 int flag_default_inline = 1;
554
555 /* Controls whether compiler generates 'type descriptor' that give
556    run-time type information.  */
557
558 int flag_rtti = 1;
559
560 /* Nonzero if we want to conserve space in the .o files.  We do this
561    by putting uninitialized data and runtime initialized data into
562    .common instead of .data at the expense of not flagging multiple
563    definitions.  */
564
565 int flag_conserve_space;
566
567 /* Nonzero if we want to obey access control semantics.  */
568
569 int flag_access_control = 1;
570
571 /* Nonzero if we want to check the return value of new and avoid calling
572    constructors if it is a null pointer.  */
573
574 int flag_check_new;
575
576 /* Nonzero if we want the new ISO rules for pushing a new scope for `for'
577    initialization variables.
578    0: Old rules, set by -fno-for-scope.
579    2: New ISO rules, set by -ffor-scope.
580    1: Try to implement new ISO rules, but with backup compatibility
581    (and warnings).  This is the default, for now.  */
582
583 int flag_new_for_scope = 1;
584
585 /* Nonzero if we want to emit defined symbols with common-like linkage as
586    weak symbols where possible, in order to conform to C++ semantics.
587    Otherwise, emit them as local symbols.  */
588
589 int flag_weak = 1;
590
591 /* 0 means we want the preprocessor to not emit line directives for
592    the current working directory.  1 means we want it to do it.  -1
593    means we should decide depending on whether debugging information
594    is being emitted or not.  */
595
596 int flag_working_directory = -1;
597
598 /* Nonzero to use __cxa_atexit, rather than atexit, to register
599    destructors for local statics and global objects.  */
600
601 int flag_use_cxa_atexit = DEFAULT_USE_CXA_ATEXIT;
602
603 /* Nonzero means make the default pedwarns warnings instead of errors.
604    The value of this flag is ignored if -pedantic is specified.  */
605
606 int flag_permissive;
607
608 /* Nonzero means to implement standard semantics for exception
609    specifications, calling unexpected if an exception is thrown that
610    doesn't match the specification.  Zero means to treat them as
611    assertions and optimize accordingly, but not check them.  */
612
613 int flag_enforce_eh_specs = 1;
614
615 /* Nonzero means warn about things that will change when compiling
616    with an ABI-compliant compiler.  */
617
618 int warn_abi = 0;
619
620 /* Nonzero means warn about invalid uses of offsetof.  */
621
622 int warn_invalid_offsetof = 1;
623
624 /* Nonzero means warn about implicit declarations.  */
625
626 int warn_implicit = 1;
627
628 /* Nonzero means warn when all ctors or dtors are private, and the class
629    has no friends.  */
630
631 int warn_ctor_dtor_privacy = 0;
632
633 /* Nonzero means warn in function declared in derived class has the
634    same name as a virtual in the base class, but fails to match the
635    type signature of any virtual function in the base class.  */
636
637 int warn_overloaded_virtual;
638
639 /* Nonzero means warn when declaring a class that has a non virtual
640    destructor, when it really ought to have a virtual one.  */
641
642 int warn_nonvdtor;
643
644 /* Nonzero means warn when the compiler will reorder code.  */
645
646 int warn_reorder;
647
648 /* Nonzero means warn when synthesis behavior differs from Cfront's.  */
649
650 int warn_synth;
651
652 /* Nonzero means warn when we convert a pointer to member function
653    into a pointer to (void or function).  */
654
655 int warn_pmf2ptr = 1;
656
657 /* Nonzero means warn about violation of some Effective C++ style rules.  */
658
659 int warn_ecpp;
660
661 /* Nonzero means warn where overload resolution chooses a promotion from
662    unsigned to signed over a conversion to an unsigned of the same size.  */
663
664 int warn_sign_promo;
665
666 /* Nonzero means warn when an old-style cast is used.  */
667
668 int warn_old_style_cast;
669
670 /* Nonzero means warn when non-templatized friend functions are
671    declared within a template */
672
673 int warn_nontemplate_friend = 1;
674
675 /* Nonzero means complain about deprecated features.  */
676
677 int warn_deprecated = 1;
678
679 /* Maximum template instantiation depth.  This limit is rather
680    arbitrary, but it exists to limit the time it takes to notice
681    infinite template instantiations.  */
682
683 int max_tinst_depth = 500;
684
685
686
687 /* The elements of `ridpointers' are identifier nodes for the reserved
688    type names and storage classes.  It is indexed by a RID_... value.  */
689 tree *ridpointers;
690
691 tree (*make_fname_decl) (tree, int);
692
693 /* If non-NULL, the address of a language-specific function that
694    returns 1 for language-specific statement codes.  */
695 int (*lang_statement_code_p) (enum tree_code);
696
697 /* If non-NULL, the address of a language-specific function that takes
698    any action required right before expand_function_end is called.  */
699 void (*lang_expand_function_end) (void);
700
701 /* Nonzero means the expression being parsed will never be evaluated.
702    This is a count, since unevaluated expressions can nest.  */
703 int skip_evaluation;
704
705 /* Information about how a function name is generated.  */
706 struct fname_var_t
707 {
708   tree *const decl;     /* pointer to the VAR_DECL.  */
709   const unsigned rid;   /* RID number for the identifier.  */
710   const int pretty;     /* How pretty is it? */
711 };
712
713 /* The three ways of getting then name of the current function.  */
714
715 const struct fname_var_t fname_vars[] =
716 {
717   /* C99 compliant __func__, must be first.  */
718   {&c99_function_name_decl_node, RID_C99_FUNCTION_NAME, 0},
719   /* GCC __FUNCTION__ compliant.  */
720   {&function_name_decl_node, RID_FUNCTION_NAME, 0},
721   /* GCC __PRETTY_FUNCTION__ compliant.  */
722   {&pretty_function_name_decl_node, RID_PRETTY_FUNCTION_NAME, 1},
723   {NULL, 0, 0},
724 };
725
726 static int constant_fits_type_p (tree, tree);
727
728 static tree handle_packed_attribute (tree *, tree, tree, int, bool *);
729 static tree handle_nocommon_attribute (tree *, tree, tree, int, bool *);
730 static tree handle_common_attribute (tree *, tree, tree, int, bool *);
731 static tree handle_noreturn_attribute (tree *, tree, tree, int, bool *);
732 static tree handle_noinline_attribute (tree *, tree, tree, int, bool *);
733 static tree handle_always_inline_attribute (tree *, tree, tree, int,
734                                             bool *);
735 static tree handle_used_attribute (tree *, tree, tree, int, bool *);
736 static tree handle_unused_attribute (tree *, tree, tree, int, bool *);
737 static tree handle_const_attribute (tree *, tree, tree, int, bool *);
738 static tree handle_transparent_union_attribute (tree *, tree, tree,
739                                                 int, bool *);
740 static tree handle_constructor_attribute (tree *, tree, tree, int, bool *);
741 static tree handle_destructor_attribute (tree *, tree, tree, int, bool *);
742 static tree handle_mode_attribute (tree *, tree, tree, int, bool *);
743 static tree handle_section_attribute (tree *, tree, tree, int, bool *);
744 static tree handle_aligned_attribute (tree *, tree, tree, int, bool *);
745 static tree handle_weak_attribute (tree *, tree, tree, int, bool *) ;
746 static tree handle_alias_attribute (tree *, tree, tree, int, bool *);
747 static tree handle_visibility_attribute (tree *, tree, tree, int,
748                                          bool *);
749 static tree handle_tls_model_attribute (tree *, tree, tree, int,
750                                         bool *);
751 static tree handle_no_instrument_function_attribute (tree *, tree,
752                                                      tree, int, bool *);
753 static tree handle_malloc_attribute (tree *, tree, tree, int, bool *);
754 static tree handle_no_limit_stack_attribute (tree *, tree, tree, int,
755                                              bool *);
756 static tree handle_pure_attribute (tree *, tree, tree, int, bool *);
757 static tree handle_deprecated_attribute (tree *, tree, tree, int,
758                                          bool *);
759 static tree handle_vector_size_attribute (tree *, tree, tree, int,
760                                           bool *);
761 static tree handle_nonnull_attribute (tree *, tree, tree, int, bool *);
762 static tree handle_nothrow_attribute (tree *, tree, tree, int, bool *);
763 static tree handle_cleanup_attribute (tree *, tree, tree, int, bool *);
764 static tree handle_warn_unused_result_attribute (tree *, tree, tree, int,
765                                                  bool *);
766
767 static void check_function_nonnull (tree, tree);
768 static void check_nonnull_arg (void *, tree, unsigned HOST_WIDE_INT);
769 static bool nonnull_check_p (tree, unsigned HOST_WIDE_INT);
770 static bool get_nonnull_operand (tree, unsigned HOST_WIDE_INT *);
771 static int resort_field_decl_cmp (const void *, const void *);
772
773 /* Table of machine-independent attributes common to all C-like languages.  */
774 const struct attribute_spec c_common_attribute_table[] =
775 {
776   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
777   { "packed",                 0, 0, false, false, false,
778                               handle_packed_attribute },
779   { "nocommon",               0, 0, true,  false, false,
780                               handle_nocommon_attribute },
781   { "common",                 0, 0, true,  false, false,
782                               handle_common_attribute },
783   /* FIXME: logically, noreturn attributes should be listed as
784      "false, true, true" and apply to function types.  But implementing this
785      would require all the places in the compiler that use TREE_THIS_VOLATILE
786      on a decl to identify non-returning functions to be located and fixed
787      to check the function type instead.  */
788   { "noreturn",               0, 0, true,  false, false,
789                               handle_noreturn_attribute },
790   { "volatile",               0, 0, true,  false, false,
791                               handle_noreturn_attribute },
792   { "noinline",               0, 0, true,  false, false,
793                               handle_noinline_attribute },
794   { "always_inline",          0, 0, true,  false, false,
795                               handle_always_inline_attribute },
796   { "used",                   0, 0, true,  false, false,
797                               handle_used_attribute },
798   { "unused",                 0, 0, false, false, false,
799                               handle_unused_attribute },
800   /* The same comments as for noreturn attributes apply to const ones.  */
801   { "const",                  0, 0, true,  false, false,
802                               handle_const_attribute },
803   { "transparent_union",      0, 0, false, false, false,
804                               handle_transparent_union_attribute },
805   { "constructor",            0, 0, true,  false, false,
806                               handle_constructor_attribute },
807   { "destructor",             0, 0, true,  false, false,
808                               handle_destructor_attribute },
809   { "mode",                   1, 1, false,  true, false,
810                               handle_mode_attribute },
811   { "section",                1, 1, true,  false, false,
812                               handle_section_attribute },
813   { "aligned",                0, 1, false, false, false,
814                               handle_aligned_attribute },
815   { "weak",                   0, 0, true,  false, false,
816                               handle_weak_attribute },
817   { "alias",                  1, 1, true,  false, false,
818                               handle_alias_attribute },
819   { "no_instrument_function", 0, 0, true,  false, false,
820                               handle_no_instrument_function_attribute },
821   { "malloc",                 0, 0, true,  false, false,
822                               handle_malloc_attribute },
823   { "no_stack_limit",         0, 0, true,  false, false,
824                               handle_no_limit_stack_attribute },
825   { "pure",                   0, 0, true,  false, false,
826                               handle_pure_attribute },
827   { "deprecated",             0, 0, false, false, false,
828                               handle_deprecated_attribute },
829   { "vector_size",            1, 1, false, true, false,
830                               handle_vector_size_attribute },
831   { "visibility",             1, 1, true,  false, false,
832                               handle_visibility_attribute },
833   { "tls_model",              1, 1, true,  false, false,
834                               handle_tls_model_attribute },
835   { "nonnull",                0, -1, false, true, true,
836                               handle_nonnull_attribute },
837   { "nothrow",                0, 0, true,  false, false,
838                               handle_nothrow_attribute },
839   { "may_alias",              0, 0, false, true, false, NULL },
840   { "cleanup",                1, 1, true, false, false,
841                               handle_cleanup_attribute },
842   { "warn_unused_result",     0, 0, false, true, true,
843                               handle_warn_unused_result_attribute },
844   { NULL,                     0, 0, false, false, false, NULL }
845 };
846
847 /* Give the specifications for the format attributes, used by C and all
848    descendants.  */
849
850 const struct attribute_spec c_common_format_attribute_table[] =
851 {
852   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
853   { "format",                 3, 3, false, true,  true,
854                               handle_format_attribute },
855   { "format_arg",             1, 1, false, true,  true,
856                               handle_format_arg_attribute },
857   { NULL,                     0, 0, false, false, false, NULL }
858 };
859
860 /* Push current bindings for the function name VAR_DECLS.  */
861
862 void
863 start_fname_decls (void)
864 {
865   unsigned ix;
866   tree saved = NULL_TREE;
867
868   for (ix = 0; fname_vars[ix].decl; ix++)
869     {
870       tree decl = *fname_vars[ix].decl;
871
872       if (decl)
873         {
874           saved = tree_cons (decl, build_int_2 (ix, 0), saved);
875           *fname_vars[ix].decl = NULL_TREE;
876         }
877     }
878   if (saved || saved_function_name_decls)
879     /* Normally they'll have been NULL, so only push if we've got a
880        stack, or they are non-NULL.  */
881     saved_function_name_decls = tree_cons (saved, NULL_TREE,
882                                            saved_function_name_decls);
883 }
884
885 /* Finish up the current bindings, adding them into the current function's
886    statement tree.  This must be done _before_ finish_stmt_tree is called.
887    If there is no current function, we must be at file scope and no statements
888    are involved. Pop the previous bindings.  */
889
890 void
891 finish_fname_decls (void)
892 {
893   unsigned ix;
894   tree stmts = NULL_TREE;
895   tree stack = saved_function_name_decls;
896
897   for (; stack && TREE_VALUE (stack); stack = TREE_CHAIN (stack))
898     append_to_statement_list (TREE_VALUE (stack), &stmts);
899
900   if (stmts)
901     {
902       tree *bodyp = &DECL_SAVED_TREE (current_function_decl);
903
904       if (TREE_CODE (*bodyp) == BIND_EXPR)
905         bodyp = &BIND_EXPR_BODY (*bodyp);
906
907       append_to_statement_list (*bodyp, &stmts);
908       *bodyp = stmts;
909     }
910
911   for (ix = 0; fname_vars[ix].decl; ix++)
912     *fname_vars[ix].decl = NULL_TREE;
913
914   if (stack)
915     {
916       /* We had saved values, restore them.  */
917       tree saved;
918
919       for (saved = TREE_PURPOSE (stack); saved; saved = TREE_CHAIN (saved))
920         {
921           tree decl = TREE_PURPOSE (saved);
922           unsigned ix = TREE_INT_CST_LOW (TREE_VALUE (saved));
923
924           *fname_vars[ix].decl = decl;
925         }
926       stack = TREE_CHAIN (stack);
927     }
928   saved_function_name_decls = stack;
929 }
930
931 /* Return the text name of the current function, suitably prettified
932    by PRETTY_P.  Return string must be freed by caller.  */
933
934 const char *
935 fname_as_string (int pretty_p)
936 {
937   const char *name = "top level";
938   char *namep;
939   int vrb = 2;
940
941   if (! pretty_p)
942     {
943       name = "";
944       vrb = 0;
945     }
946
947   if (current_function_decl)
948     name = lang_hooks.decl_printable_name (current_function_decl, vrb);
949
950   if (c_lex_string_translate)
951     {
952       int len = strlen (name) + 3; /* Two for '"'s.  One for NULL.  */
953       cpp_string cstr = { 0, 0 }, strname;
954
955       namep = xmalloc (len);
956       snprintf (namep, len, "\"%s\"", name);
957       strname.text = (unsigned char *) namep;
958       strname.len = len - 1;
959
960       if (cpp_interpret_string (parse_in, &strname, 1, &cstr, false))
961         return (char *) cstr.text;
962     }
963   else
964     namep = xstrdup (name);
965
966   return namep;
967 }
968
969 /* Expand DECL if it declares an entity not handled by the
970    common code.  */
971
972 int
973 c_expand_decl (tree decl)
974 {
975   if (TREE_CODE (decl) == VAR_DECL && !TREE_STATIC (decl))
976     {
977       /* Let the back-end know about this variable.  */
978       if (!anon_aggr_type_p (TREE_TYPE (decl)))
979         emit_local_var (decl);
980       else
981         expand_anon_union_decl (decl, NULL_TREE,
982                                 DECL_ANON_UNION_ELEMS (decl));
983     }
984   else if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
985     make_rtl_for_local_static (decl);
986   else
987     return 0;
988
989   return 1;
990 }
991
992
993 /* Return the VAR_DECL for a const char array naming the current
994    function. If the VAR_DECL has not yet been created, create it
995    now. RID indicates how it should be formatted and IDENTIFIER_NODE
996    ID is its name (unfortunately C and C++ hold the RID values of
997    keywords in different places, so we can't derive RID from ID in
998    this language independent code.  */
999
1000 tree
1001 fname_decl (unsigned int rid, tree id)
1002 {
1003   unsigned ix;
1004   tree decl = NULL_TREE;
1005
1006   for (ix = 0; fname_vars[ix].decl; ix++)
1007     if (fname_vars[ix].rid == rid)
1008       break;
1009
1010   decl = *fname_vars[ix].decl;
1011   if (!decl)
1012     {
1013       /* If a tree is built here, it would normally have the lineno of
1014          the current statement.  Later this tree will be moved to the
1015          beginning of the function and this line number will be wrong.
1016          To avoid this problem set the lineno to 0 here; that prevents
1017          it from appearing in the RTL.  */
1018       tree stmts;
1019       location_t saved_locus = input_location;
1020       input_line = 0;
1021
1022       stmts = push_stmt_list ();
1023       decl = (*make_fname_decl) (id, fname_vars[ix].pretty);
1024       stmts = pop_stmt_list (stmts);
1025       if (!IS_EMPTY_STMT (stmts))
1026         saved_function_name_decls
1027           = tree_cons (decl, stmts, saved_function_name_decls);
1028       *fname_vars[ix].decl = decl;
1029       input_location = saved_locus;
1030     }
1031   if (!ix && !current_function_decl)
1032     pedwarn ("%J'%D' is not defined outside of function scope", decl, decl);
1033
1034   return decl;
1035 }
1036
1037 /* Given a STRING_CST, give it a suitable array-of-chars data type.  */
1038
1039 tree
1040 fix_string_type (tree value)
1041 {
1042   const int wchar_bytes = TYPE_PRECISION (wchar_type_node) / BITS_PER_UNIT;
1043   const int wide_flag = TREE_TYPE (value) == wchar_array_type_node;
1044   const int nchars_max = flag_isoc99 ? 4095 : 509;
1045   int length = TREE_STRING_LENGTH (value);
1046   int nchars;
1047
1048   /* Compute the number of elements, for the array type.  */
1049   nchars = wide_flag ? length / wchar_bytes : length;
1050
1051   if (pedantic && nchars - 1 > nchars_max && !c_dialect_cxx ())
1052     pedwarn ("string length `%d' is greater than the length `%d' ISO C%d compilers are required to support",
1053              nchars - 1, nchars_max, flag_isoc99 ? 99 : 89);
1054
1055   /* Create the array type for the string constant.
1056      -Wwrite-strings says make the string constant an array of const char
1057      so that copying it to a non-const pointer will get a warning.
1058      For C++, this is the standard behavior.  */
1059   if (flag_const_strings)
1060     {
1061       tree elements
1062         = build_type_variant (wide_flag ? wchar_type_node : char_type_node,
1063                               1, 0);
1064       TREE_TYPE (value)
1065         = build_array_type (elements,
1066                             build_index_type (build_int_2 (nchars - 1, 0)));
1067     }
1068   else
1069     TREE_TYPE (value)
1070       = build_array_type (wide_flag ? wchar_type_node : char_type_node,
1071                           build_index_type (build_int_2 (nchars - 1, 0)));
1072
1073   TREE_CONSTANT (value) = 1;
1074   TREE_INVARIANT (value) = 1;
1075   TREE_READONLY (value) = 1;
1076   TREE_STATIC (value) = 1;
1077   return value;
1078 }
1079 \f
1080 /* Print a warning if a constant expression had overflow in folding.
1081    Invoke this function on every expression that the language
1082    requires to be a constant expression.
1083    Note the ANSI C standard says it is erroneous for a
1084    constant expression to overflow.  */
1085
1086 void
1087 constant_expression_warning (tree value)
1088 {
1089   if ((TREE_CODE (value) == INTEGER_CST || TREE_CODE (value) == REAL_CST
1090        || TREE_CODE (value) == VECTOR_CST
1091        || TREE_CODE (value) == COMPLEX_CST)
1092       && TREE_CONSTANT_OVERFLOW (value) && pedantic)
1093     pedwarn ("overflow in constant expression");
1094 }
1095
1096 /* Print a warning if an expression had overflow in folding.
1097    Invoke this function on every expression that
1098    (1) appears in the source code, and
1099    (2) might be a constant expression that overflowed, and
1100    (3) is not already checked by convert_and_check;
1101    however, do not invoke this function on operands of explicit casts.  */
1102
1103 void
1104 overflow_warning (tree value)
1105 {
1106   if ((TREE_CODE (value) == INTEGER_CST
1107        || (TREE_CODE (value) == COMPLEX_CST
1108            && TREE_CODE (TREE_REALPART (value)) == INTEGER_CST))
1109       && TREE_OVERFLOW (value))
1110     {
1111       TREE_OVERFLOW (value) = 0;
1112       if (skip_evaluation == 0)
1113         warning ("integer overflow in expression");
1114     }
1115   else if ((TREE_CODE (value) == REAL_CST
1116             || (TREE_CODE (value) == COMPLEX_CST
1117                 && TREE_CODE (TREE_REALPART (value)) == REAL_CST))
1118            && TREE_OVERFLOW (value))
1119     {
1120       TREE_OVERFLOW (value) = 0;
1121       if (skip_evaluation == 0)
1122         warning ("floating point overflow in expression");
1123     }
1124   else if (TREE_CODE (value) == VECTOR_CST && TREE_OVERFLOW (value))
1125     {
1126       TREE_OVERFLOW (value) = 0;
1127       if (skip_evaluation == 0)
1128         warning ("vector overflow in expression");
1129     }
1130 }
1131
1132 /* Print a warning if a large constant is truncated to unsigned,
1133    or if -Wconversion is used and a constant < 0 is converted to unsigned.
1134    Invoke this function on every expression that might be implicitly
1135    converted to an unsigned type.  */
1136
1137 void
1138 unsigned_conversion_warning (tree result, tree operand)
1139 {
1140   tree type = TREE_TYPE (result);
1141
1142   if (TREE_CODE (operand) == INTEGER_CST
1143       && TREE_CODE (type) == INTEGER_TYPE
1144       && TYPE_UNSIGNED (type)
1145       && skip_evaluation == 0
1146       && !int_fits_type_p (operand, type))
1147     {
1148       if (!int_fits_type_p (operand, c_common_signed_type (type)))
1149         /* This detects cases like converting -129 or 256 to unsigned char.  */
1150         warning ("large integer implicitly truncated to unsigned type");
1151       else if (warn_conversion)
1152         warning ("negative integer implicitly converted to unsigned type");
1153     }
1154 }
1155
1156 /* Nonzero if constant C has a value that is permissible
1157    for type TYPE (an INTEGER_TYPE).  */
1158
1159 static int
1160 constant_fits_type_p (tree c, tree type)
1161 {
1162   if (TREE_CODE (c) == INTEGER_CST)
1163     return int_fits_type_p (c, type);
1164
1165   c = convert (type, c);
1166   return !TREE_OVERFLOW (c);
1167 }
1168
1169 /* Nonzero if vector types T1 and T2 can be converted to each other
1170    without an explicit cast.  */
1171 int
1172 vector_types_convertible_p (tree t1, tree t2)
1173 {
1174   return targetm.vector_opaque_p (t1)
1175          || targetm.vector_opaque_p (t2)
1176          || TYPE_MODE (t1) == TYPE_MODE (t2);
1177 }
1178
1179 /* Convert EXPR to TYPE, warning about conversion problems with constants.
1180    Invoke this function on every expression that is converted implicitly,
1181    i.e. because of language rules and not because of an explicit cast.  */
1182
1183 tree
1184 convert_and_check (tree type, tree expr)
1185 {
1186   tree t = convert (type, expr);
1187   if (TREE_CODE (t) == INTEGER_CST)
1188     {
1189       if (TREE_OVERFLOW (t))
1190         {
1191           TREE_OVERFLOW (t) = 0;
1192
1193           /* Do not diagnose overflow in a constant expression merely
1194              because a conversion overflowed.  */
1195           TREE_CONSTANT_OVERFLOW (t) = TREE_CONSTANT_OVERFLOW (expr);
1196
1197           /* No warning for converting 0x80000000 to int.  */
1198           if (!(TYPE_UNSIGNED (type) < TYPE_UNSIGNED (TREE_TYPE (expr))
1199                 && TREE_CODE (TREE_TYPE (expr)) == INTEGER_TYPE
1200                 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (expr))))
1201             /* If EXPR fits in the unsigned version of TYPE,
1202                don't warn unless pedantic.  */
1203             if ((pedantic
1204                  || TYPE_UNSIGNED (type)
1205                  || ! constant_fits_type_p (expr,
1206                                             c_common_unsigned_type (type)))
1207                 && skip_evaluation == 0)
1208               warning ("overflow in implicit constant conversion");
1209         }
1210       else
1211         unsigned_conversion_warning (t, expr);
1212     }
1213   return t;
1214 }
1215 \f
1216 /* A node in a list that describes references to variables (EXPR), which are
1217    either read accesses if WRITER is zero, or write accesses, in which case
1218    WRITER is the parent of EXPR.  */
1219 struct tlist
1220 {
1221   struct tlist *next;
1222   tree expr, writer;
1223 };
1224
1225 /* Used to implement a cache the results of a call to verify_tree.  We only
1226    use this for SAVE_EXPRs.  */
1227 struct tlist_cache
1228 {
1229   struct tlist_cache *next;
1230   struct tlist *cache_before_sp;
1231   struct tlist *cache_after_sp;
1232   tree expr;
1233 };
1234
1235 /* Obstack to use when allocating tlist structures, and corresponding
1236    firstobj.  */
1237 static struct obstack tlist_obstack;
1238 static char *tlist_firstobj = 0;
1239
1240 /* Keep track of the identifiers we've warned about, so we can avoid duplicate
1241    warnings.  */
1242 static struct tlist *warned_ids;
1243 /* SAVE_EXPRs need special treatment.  We process them only once and then
1244    cache the results.  */
1245 static struct tlist_cache *save_expr_cache;
1246
1247 static void add_tlist (struct tlist **, struct tlist *, tree, int);
1248 static void merge_tlist (struct tlist **, struct tlist *, int);
1249 static void verify_tree (tree, struct tlist **, struct tlist **, tree);
1250 static int warning_candidate_p (tree);
1251 static void warn_for_collisions (struct tlist *);
1252 static void warn_for_collisions_1 (tree, tree, struct tlist *, int);
1253 static struct tlist *new_tlist (struct tlist *, tree, tree);
1254
1255 /* Create a new struct tlist and fill in its fields.  */
1256 static struct tlist *
1257 new_tlist (struct tlist *next, tree t, tree writer)
1258 {
1259   struct tlist *l;
1260   l = obstack_alloc (&tlist_obstack, sizeof *l);
1261   l->next = next;
1262   l->expr = t;
1263   l->writer = writer;
1264   return l;
1265 }
1266
1267 /* Add duplicates of the nodes found in ADD to the list *TO.  If EXCLUDE_WRITER
1268    is nonnull, we ignore any node we find which has a writer equal to it.  */
1269
1270 static void
1271 add_tlist (struct tlist **to, struct tlist *add, tree exclude_writer, int copy)
1272 {
1273   while (add)
1274     {
1275       struct tlist *next = add->next;
1276       if (! copy)
1277         add->next = *to;
1278       if (! exclude_writer || add->writer != exclude_writer)
1279         *to = copy ? new_tlist (*to, add->expr, add->writer) : add;
1280       add = next;
1281     }
1282 }
1283
1284 /* Merge the nodes of ADD into TO.  This merging process is done so that for
1285    each variable that already exists in TO, no new node is added; however if
1286    there is a write access recorded in ADD, and an occurrence on TO is only
1287    a read access, then the occurrence in TO will be modified to record the
1288    write.  */
1289
1290 static void
1291 merge_tlist (struct tlist **to, struct tlist *add, int copy)
1292 {
1293   struct tlist **end = to;
1294
1295   while (*end)
1296     end = &(*end)->next;
1297
1298   while (add)
1299     {
1300       int found = 0;
1301       struct tlist *tmp2;
1302       struct tlist *next = add->next;
1303
1304       for (tmp2 = *to; tmp2; tmp2 = tmp2->next)
1305         if (tmp2->expr == add->expr)
1306           {
1307             found = 1;
1308             if (! tmp2->writer)
1309               tmp2->writer = add->writer;
1310           }
1311       if (! found)
1312         {
1313           *end = copy ? add : new_tlist (NULL, add->expr, add->writer);
1314           end = &(*end)->next;
1315           *end = 0;
1316         }
1317       add = next;
1318     }
1319 }
1320
1321 /* WRITTEN is a variable, WRITER is its parent.  Warn if any of the variable
1322    references in list LIST conflict with it, excluding reads if ONLY writers
1323    is nonzero.  */
1324
1325 static void
1326 warn_for_collisions_1 (tree written, tree writer, struct tlist *list,
1327                        int only_writes)
1328 {
1329   struct tlist *tmp;
1330
1331   /* Avoid duplicate warnings.  */
1332   for (tmp = warned_ids; tmp; tmp = tmp->next)
1333     if (tmp->expr == written)
1334       return;
1335
1336   while (list)
1337     {
1338       if (list->expr == written
1339           && list->writer != writer
1340           && (! only_writes || list->writer))
1341         {
1342           warned_ids = new_tlist (warned_ids, written, NULL_TREE);
1343           warning ("operation on `%s' may be undefined",
1344                    IDENTIFIER_POINTER (DECL_NAME (list->expr)));
1345         }
1346       list = list->next;
1347     }
1348 }
1349
1350 /* Given a list LIST of references to variables, find whether any of these
1351    can cause conflicts due to missing sequence points.  */
1352
1353 static void
1354 warn_for_collisions (struct tlist *list)
1355 {
1356   struct tlist *tmp;
1357
1358   for (tmp = list; tmp; tmp = tmp->next)
1359     {
1360       if (tmp->writer)
1361         warn_for_collisions_1 (tmp->expr, tmp->writer, list, 0);
1362     }
1363 }
1364
1365 /* Return nonzero if X is a tree that can be verified by the sequence point
1366    warnings.  */
1367 static int
1368 warning_candidate_p (tree x)
1369 {
1370   return TREE_CODE (x) == VAR_DECL || TREE_CODE (x) == PARM_DECL;
1371 }
1372
1373 /* Walk the tree X, and record accesses to variables.  If X is written by the
1374    parent tree, WRITER is the parent.
1375    We store accesses in one of the two lists: PBEFORE_SP, and PNO_SP.  If this
1376    expression or its only operand forces a sequence point, then everything up
1377    to the sequence point is stored in PBEFORE_SP.  Everything else gets stored
1378    in PNO_SP.
1379    Once we return, we will have emitted warnings if any subexpression before
1380    such a sequence point could be undefined.  On a higher level, however, the
1381    sequence point may not be relevant, and we'll merge the two lists.
1382
1383    Example: (b++, a) + b;
1384    The call that processes the COMPOUND_EXPR will store the increment of B
1385    in PBEFORE_SP, and the use of A in PNO_SP.  The higher-level call that
1386    processes the PLUS_EXPR will need to merge the two lists so that
1387    eventually, all accesses end up on the same list (and we'll warn about the
1388    unordered subexpressions b++ and b.
1389
1390    A note on merging.  If we modify the former example so that our expression
1391    becomes
1392      (b++, b) + a
1393    care must be taken not simply to add all three expressions into the final
1394    PNO_SP list.  The function merge_tlist takes care of that by merging the
1395    before-SP list of the COMPOUND_EXPR into its after-SP list in a special
1396    way, so that no more than one access to B is recorded.  */
1397
1398 static void
1399 verify_tree (tree x, struct tlist **pbefore_sp, struct tlist **pno_sp,
1400              tree writer)
1401 {
1402   struct tlist *tmp_before, *tmp_nosp, *tmp_list2, *tmp_list3;
1403   enum tree_code code;
1404   char class;
1405
1406   /* X may be NULL if it is the operand of an empty statement expression
1407      ({ }).  */
1408   if (x == NULL)
1409     return;
1410
1411  restart:
1412   code = TREE_CODE (x);
1413   class = TREE_CODE_CLASS (code);
1414
1415   if (warning_candidate_p (x))
1416     {
1417       *pno_sp = new_tlist (*pno_sp, x, writer);
1418       return;
1419     }
1420
1421   switch (code)
1422     {
1423     case CONSTRUCTOR:
1424       return;
1425
1426     case COMPOUND_EXPR:
1427     case TRUTH_ANDIF_EXPR:
1428     case TRUTH_ORIF_EXPR:
1429       tmp_before = tmp_nosp = tmp_list3 = 0;
1430       verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_nosp, NULL_TREE);
1431       warn_for_collisions (tmp_nosp);
1432       merge_tlist (pbefore_sp, tmp_before, 0);
1433       merge_tlist (pbefore_sp, tmp_nosp, 0);
1434       verify_tree (TREE_OPERAND (x, 1), &tmp_list3, pno_sp, NULL_TREE);
1435       merge_tlist (pbefore_sp, tmp_list3, 0);
1436       return;
1437
1438     case COND_EXPR:
1439       tmp_before = tmp_list2 = 0;
1440       verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_list2, NULL_TREE);
1441       warn_for_collisions (tmp_list2);
1442       merge_tlist (pbefore_sp, tmp_before, 0);
1443       merge_tlist (pbefore_sp, tmp_list2, 1);
1444
1445       tmp_list3 = tmp_nosp = 0;
1446       verify_tree (TREE_OPERAND (x, 1), &tmp_list3, &tmp_nosp, NULL_TREE);
1447       warn_for_collisions (tmp_nosp);
1448       merge_tlist (pbefore_sp, tmp_list3, 0);
1449
1450       tmp_list3 = tmp_list2 = 0;
1451       verify_tree (TREE_OPERAND (x, 2), &tmp_list3, &tmp_list2, NULL_TREE);
1452       warn_for_collisions (tmp_list2);
1453       merge_tlist (pbefore_sp, tmp_list3, 0);
1454       /* Rather than add both tmp_nosp and tmp_list2, we have to merge the
1455          two first, to avoid warning for (a ? b++ : b++).  */
1456       merge_tlist (&tmp_nosp, tmp_list2, 0);
1457       add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
1458       return;
1459
1460     case PREDECREMENT_EXPR:
1461     case PREINCREMENT_EXPR:
1462     case POSTDECREMENT_EXPR:
1463     case POSTINCREMENT_EXPR:
1464       verify_tree (TREE_OPERAND (x, 0), pno_sp, pno_sp, x);
1465       return;
1466
1467     case MODIFY_EXPR:
1468       tmp_before = tmp_nosp = tmp_list3 = 0;
1469       verify_tree (TREE_OPERAND (x, 1), &tmp_before, &tmp_nosp, NULL_TREE);
1470       verify_tree (TREE_OPERAND (x, 0), &tmp_list3, &tmp_list3, x);
1471       /* Expressions inside the LHS are not ordered wrt. the sequence points
1472          in the RHS.  Example:
1473            *a = (a++, 2)
1474          Despite the fact that the modification of "a" is in the before_sp
1475          list (tmp_before), it conflicts with the use of "a" in the LHS.
1476          We can handle this by adding the contents of tmp_list3
1477          to those of tmp_before, and redoing the collision warnings for that
1478          list.  */
1479       add_tlist (&tmp_before, tmp_list3, x, 1);
1480       warn_for_collisions (tmp_before);
1481       /* Exclude the LHS itself here; we first have to merge it into the
1482          tmp_nosp list.  This is done to avoid warning for "a = a"; if we
1483          didn't exclude the LHS, we'd get it twice, once as a read and once
1484          as a write.  */
1485       add_tlist (pno_sp, tmp_list3, x, 0);
1486       warn_for_collisions_1 (TREE_OPERAND (x, 0), x, tmp_nosp, 1);
1487
1488       merge_tlist (pbefore_sp, tmp_before, 0);
1489       if (warning_candidate_p (TREE_OPERAND (x, 0)))
1490         merge_tlist (&tmp_nosp, new_tlist (NULL, TREE_OPERAND (x, 0), x), 0);
1491       add_tlist (pno_sp, tmp_nosp, NULL_TREE, 1);
1492       return;
1493
1494     case CALL_EXPR:
1495       /* We need to warn about conflicts among arguments and conflicts between
1496          args and the function address.  Side effects of the function address,
1497          however, are not ordered by the sequence point of the call.  */
1498       tmp_before = tmp_nosp = tmp_list2 = tmp_list3 = 0;
1499       verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_nosp, NULL_TREE);
1500       if (TREE_OPERAND (x, 1))
1501         verify_tree (TREE_OPERAND (x, 1), &tmp_list2, &tmp_list3, NULL_TREE);
1502       merge_tlist (&tmp_list3, tmp_list2, 0);
1503       add_tlist (&tmp_before, tmp_list3, NULL_TREE, 0);
1504       add_tlist (&tmp_before, tmp_nosp, NULL_TREE, 0);
1505       warn_for_collisions (tmp_before);
1506       add_tlist (pbefore_sp, tmp_before, NULL_TREE, 0);
1507       return;
1508
1509     case TREE_LIST:
1510       /* Scan all the list, e.g. indices of multi dimensional array.  */
1511       while (x)
1512         {
1513           tmp_before = tmp_nosp = 0;
1514           verify_tree (TREE_VALUE (x), &tmp_before, &tmp_nosp, NULL_TREE);
1515           merge_tlist (&tmp_nosp, tmp_before, 0);
1516           add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
1517           x = TREE_CHAIN (x);
1518         }
1519       return;
1520
1521     case SAVE_EXPR:
1522       {
1523         struct tlist_cache *t;
1524         for (t = save_expr_cache; t; t = t->next)
1525           if (t->expr == x)
1526             break;
1527
1528         if (! t)
1529           {
1530             t = obstack_alloc (&tlist_obstack, sizeof *t);
1531             t->next = save_expr_cache;
1532             t->expr = x;
1533             save_expr_cache = t;
1534
1535             tmp_before = tmp_nosp = 0;
1536             verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_nosp, NULL_TREE);
1537             warn_for_collisions (tmp_nosp);
1538
1539             tmp_list3 = 0;
1540             while (tmp_nosp)
1541               {
1542                 struct tlist *t = tmp_nosp;
1543                 tmp_nosp = t->next;
1544                 merge_tlist (&tmp_list3, t, 0);
1545               }
1546             t->cache_before_sp = tmp_before;
1547             t->cache_after_sp = tmp_list3;
1548           }
1549         merge_tlist (pbefore_sp, t->cache_before_sp, 1);
1550         add_tlist (pno_sp, t->cache_after_sp, NULL_TREE, 1);
1551         return;
1552       }
1553     default:
1554       break;
1555     }
1556
1557   if (class == '1')
1558     {
1559       if (first_rtl_op (code) == 0)
1560         return;
1561       x = TREE_OPERAND (x, 0);
1562       writer = 0;
1563       goto restart;
1564     }
1565
1566   switch (class)
1567     {
1568     case 'r':
1569     case '<':
1570     case '2':
1571     case 'e':
1572     case 's':
1573     case 'x':
1574       {
1575         int lp;
1576         int max = first_rtl_op (TREE_CODE (x));
1577         for (lp = 0; lp < max; lp++)
1578           {
1579             tmp_before = tmp_nosp = 0;
1580             verify_tree (TREE_OPERAND (x, lp), &tmp_before, &tmp_nosp, NULL_TREE);
1581             merge_tlist (&tmp_nosp, tmp_before, 0);
1582             add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
1583           }
1584         break;
1585       }
1586     }
1587 }
1588
1589 /* Try to warn for undefined behavior in EXPR due to missing sequence
1590    points.  */
1591
1592 void
1593 verify_sequence_points (tree expr)
1594 {
1595   struct tlist *before_sp = 0, *after_sp = 0;
1596
1597   warned_ids = 0;
1598   save_expr_cache = 0;
1599   if (tlist_firstobj == 0)
1600     {
1601       gcc_obstack_init (&tlist_obstack);
1602       tlist_firstobj = obstack_alloc (&tlist_obstack, 0);
1603     }
1604
1605   verify_tree (expr, &before_sp, &after_sp, 0);
1606   warn_for_collisions (after_sp);
1607   obstack_free (&tlist_obstack, tlist_firstobj);
1608 }
1609 \f
1610 /* Validate the expression after `case' and apply default promotions.  */
1611
1612 tree
1613 check_case_value (tree value)
1614 {
1615   if (value == NULL_TREE)
1616     return value;
1617
1618   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
1619   STRIP_TYPE_NOPS (value);
1620   /* In C++, the following is allowed:
1621
1622        const int i = 3;
1623        switch (...) { case i: ... }
1624
1625      So, we try to reduce the VALUE to a constant that way.  */
1626   if (c_dialect_cxx ())
1627     {
1628       value = decl_constant_value (value);
1629       STRIP_TYPE_NOPS (value);
1630       value = fold (value);
1631     }
1632
1633   if (TREE_CODE (value) != INTEGER_CST
1634       && value != error_mark_node)
1635     {
1636       error ("case label does not reduce to an integer constant");
1637       value = error_mark_node;
1638     }
1639   else
1640     /* Promote char or short to int.  */
1641     value = default_conversion (value);
1642
1643   constant_expression_warning (value);
1644
1645   return value;
1646 }
1647 \f
1648 /* Return an integer type with BITS bits of precision,
1649    that is unsigned if UNSIGNEDP is nonzero, otherwise signed.  */
1650
1651 tree
1652 c_common_type_for_size (unsigned int bits, int unsignedp)
1653 {
1654   if (bits == TYPE_PRECISION (integer_type_node))
1655     return unsignedp ? unsigned_type_node : integer_type_node;
1656
1657   if (bits == TYPE_PRECISION (signed_char_type_node))
1658     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
1659
1660   if (bits == TYPE_PRECISION (short_integer_type_node))
1661     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
1662
1663   if (bits == TYPE_PRECISION (long_integer_type_node))
1664     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
1665
1666   if (bits == TYPE_PRECISION (long_long_integer_type_node))
1667     return (unsignedp ? long_long_unsigned_type_node
1668             : long_long_integer_type_node);
1669
1670   if (bits == TYPE_PRECISION (widest_integer_literal_type_node))
1671     return (unsignedp ? widest_unsigned_literal_type_node
1672             : widest_integer_literal_type_node);
1673
1674   if (bits <= TYPE_PRECISION (intQI_type_node))
1675     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
1676
1677   if (bits <= TYPE_PRECISION (intHI_type_node))
1678     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
1679
1680   if (bits <= TYPE_PRECISION (intSI_type_node))
1681     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
1682
1683   if (bits <= TYPE_PRECISION (intDI_type_node))
1684     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
1685
1686   return 0;
1687 }
1688
1689 /* Used for communication between c_common_type_for_mode and
1690    c_register_builtin_type.  */
1691 static GTY(()) tree registered_builtin_types;
1692
1693 /* Return a data type that has machine mode MODE.
1694    If the mode is an integer,
1695    then UNSIGNEDP selects between signed and unsigned types.  */
1696
1697 tree
1698 c_common_type_for_mode (enum machine_mode mode, int unsignedp)
1699 {
1700   tree t;
1701
1702   if (mode == TYPE_MODE (integer_type_node))
1703     return unsignedp ? unsigned_type_node : integer_type_node;
1704
1705   if (mode == TYPE_MODE (signed_char_type_node))
1706     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
1707
1708   if (mode == TYPE_MODE (short_integer_type_node))
1709     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
1710
1711   if (mode == TYPE_MODE (long_integer_type_node))
1712     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
1713
1714   if (mode == TYPE_MODE (long_long_integer_type_node))
1715     return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node;
1716
1717   if (mode == TYPE_MODE (widest_integer_literal_type_node))
1718     return unsignedp ? widest_unsigned_literal_type_node
1719                      : widest_integer_literal_type_node;
1720
1721   if (mode == QImode)
1722     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
1723
1724   if (mode == HImode)
1725     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
1726
1727   if (mode == SImode)
1728     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
1729
1730   if (mode == DImode)
1731     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
1732
1733 #if HOST_BITS_PER_WIDE_INT >= 64
1734   if (mode == TYPE_MODE (intTI_type_node))
1735     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
1736 #endif
1737
1738   if (mode == TYPE_MODE (float_type_node))
1739     return float_type_node;
1740
1741   if (mode == TYPE_MODE (double_type_node))
1742     return double_type_node;
1743
1744   if (mode == TYPE_MODE (long_double_type_node))
1745     return long_double_type_node;
1746
1747   if (mode == TYPE_MODE (void_type_node))
1748     return void_type_node;
1749   
1750   if (mode == TYPE_MODE (build_pointer_type (char_type_node)))
1751     return unsignedp ? make_unsigned_type (mode) : make_signed_type (mode);
1752
1753   if (mode == TYPE_MODE (build_pointer_type (integer_type_node)))
1754     return unsignedp ? make_unsigned_type (mode) : make_signed_type (mode);
1755
1756   if (VECTOR_MODE_P (mode))
1757     {
1758       enum machine_mode inner_mode = GET_MODE_INNER (mode);
1759       tree inner_type = c_common_type_for_mode (inner_mode, unsignedp);
1760       if (inner_type != NULL_TREE)
1761         return build_vector_type_for_mode (inner_type, mode);
1762     }
1763
1764   for (t = registered_builtin_types; t; t = TREE_CHAIN (t))
1765     if (TYPE_MODE (TREE_VALUE (t)) == mode)
1766       return TREE_VALUE (t);
1767
1768   return 0;
1769 }
1770
1771 /* Return an unsigned type the same as TYPE in other respects.  */
1772 tree
1773 c_common_unsigned_type (tree type)
1774 {
1775   tree type1 = TYPE_MAIN_VARIANT (type);
1776   if (type1 == signed_char_type_node || type1 == char_type_node)
1777     return unsigned_char_type_node;
1778   if (type1 == integer_type_node)
1779     return unsigned_type_node;
1780   if (type1 == short_integer_type_node)
1781     return short_unsigned_type_node;
1782   if (type1 == long_integer_type_node)
1783     return long_unsigned_type_node;
1784   if (type1 == long_long_integer_type_node)
1785     return long_long_unsigned_type_node;
1786   if (type1 == widest_integer_literal_type_node)
1787     return widest_unsigned_literal_type_node;
1788 #if HOST_BITS_PER_WIDE_INT >= 64
1789   if (type1 == intTI_type_node)
1790     return unsigned_intTI_type_node;
1791 #endif
1792   if (type1 == intDI_type_node)
1793     return unsigned_intDI_type_node;
1794   if (type1 == intSI_type_node)
1795     return unsigned_intSI_type_node;
1796   if (type1 == intHI_type_node)
1797     return unsigned_intHI_type_node;
1798   if (type1 == intQI_type_node)
1799     return unsigned_intQI_type_node;
1800
1801   return c_common_signed_or_unsigned_type (1, type);
1802 }
1803
1804 /* Return a signed type the same as TYPE in other respects.  */
1805
1806 tree
1807 c_common_signed_type (tree type)
1808 {
1809   tree type1 = TYPE_MAIN_VARIANT (type);
1810   if (type1 == unsigned_char_type_node || type1 == char_type_node)
1811     return signed_char_type_node;
1812   if (type1 == unsigned_type_node)
1813     return integer_type_node;
1814   if (type1 == short_unsigned_type_node)
1815     return short_integer_type_node;
1816   if (type1 == long_unsigned_type_node)
1817     return long_integer_type_node;
1818   if (type1 == long_long_unsigned_type_node)
1819     return long_long_integer_type_node;
1820   if (type1 == widest_unsigned_literal_type_node)
1821     return widest_integer_literal_type_node;
1822 #if HOST_BITS_PER_WIDE_INT >= 64
1823   if (type1 == unsigned_intTI_type_node)
1824     return intTI_type_node;
1825 #endif
1826   if (type1 == unsigned_intDI_type_node)
1827     return intDI_type_node;
1828   if (type1 == unsigned_intSI_type_node)
1829     return intSI_type_node;
1830   if (type1 == unsigned_intHI_type_node)
1831     return intHI_type_node;
1832   if (type1 == unsigned_intQI_type_node)
1833     return intQI_type_node;
1834
1835   return c_common_signed_or_unsigned_type (0, type);
1836 }
1837
1838 /* Return a type the same as TYPE except unsigned or
1839    signed according to UNSIGNEDP.  */
1840
1841 tree
1842 c_common_signed_or_unsigned_type (int unsignedp, tree type)
1843 {
1844   if (! INTEGRAL_TYPE_P (type)
1845       || TYPE_UNSIGNED (type) == unsignedp)
1846     return type;
1847
1848   /* Must check the mode of the types, not the precision.  Enumeral types
1849      in C++ have precision set to match their range, but may use a wider
1850      mode to match an ABI.  If we change modes, we may wind up with bad
1851      conversions.  */
1852
1853   if (TYPE_MODE (type) == TYPE_MODE (signed_char_type_node))
1854     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
1855   if (TYPE_MODE (type) == TYPE_MODE (integer_type_node))
1856     return unsignedp ? unsigned_type_node : integer_type_node;
1857   if (TYPE_MODE (type) == TYPE_MODE (short_integer_type_node))
1858     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
1859   if (TYPE_MODE (type) == TYPE_MODE (long_integer_type_node))
1860     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
1861   if (TYPE_MODE (type) == TYPE_MODE (long_long_integer_type_node))
1862     return (unsignedp ? long_long_unsigned_type_node
1863             : long_long_integer_type_node);
1864   if (TYPE_MODE (type) == TYPE_MODE (widest_integer_literal_type_node))
1865     return (unsignedp ? widest_unsigned_literal_type_node
1866             : widest_integer_literal_type_node);
1867
1868 #if HOST_BITS_PER_WIDE_INT >= 64
1869   if (TYPE_MODE (type) == TYPE_MODE (intTI_type_node))
1870     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
1871 #endif
1872   if (TYPE_MODE (type) == TYPE_MODE (intDI_type_node))
1873     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
1874   if (TYPE_MODE (type) == TYPE_MODE (intSI_type_node))
1875     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
1876   if (TYPE_MODE (type) == TYPE_MODE (intHI_type_node))
1877     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
1878   if (TYPE_MODE (type) == TYPE_MODE (intQI_type_node))
1879     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
1880
1881   return type;
1882 }
1883
1884 /* The C version of the register_builtin_type langhook.  */
1885
1886 void
1887 c_register_builtin_type (tree type, const char* name)
1888 {
1889   tree decl;
1890
1891   decl = build_decl (TYPE_DECL, get_identifier (name), type);
1892   DECL_ARTIFICIAL (decl) = 1;
1893   if (!TYPE_NAME (type))
1894     TYPE_NAME (type) = decl;
1895   pushdecl (decl);
1896
1897   registered_builtin_types = tree_cons (0, type, registered_builtin_types);
1898 }
1899
1900 \f
1901 /* Return the minimum number of bits needed to represent VALUE in a
1902    signed or unsigned type, UNSIGNEDP says which.  */
1903
1904 unsigned int
1905 min_precision (tree value, int unsignedp)
1906 {
1907   int log;
1908
1909   /* If the value is negative, compute its negative minus 1.  The latter
1910      adjustment is because the absolute value of the largest negative value
1911      is one larger than the largest positive value.  This is equivalent to
1912      a bit-wise negation, so use that operation instead.  */
1913
1914   if (tree_int_cst_sgn (value) < 0)
1915     value = fold (build1 (BIT_NOT_EXPR, TREE_TYPE (value), value));
1916
1917   /* Return the number of bits needed, taking into account the fact
1918      that we need one more bit for a signed than unsigned type.  */
1919
1920   if (integer_zerop (value))
1921     log = 0;
1922   else
1923     log = tree_floor_log2 (value);
1924
1925   return log + 1 + ! unsignedp;
1926 }
1927 \f
1928 /* Print an error message for invalid operands to arith operation
1929    CODE.  NOP_EXPR is used as a special case (see
1930    c_common_truthvalue_conversion).  */
1931
1932 void
1933 binary_op_error (enum tree_code code)
1934 {
1935   const char *opname;
1936
1937   switch (code)
1938     {
1939     case NOP_EXPR:
1940       error ("invalid truth-value expression");
1941       return;
1942
1943     case PLUS_EXPR:
1944       opname = "+"; break;
1945     case MINUS_EXPR:
1946       opname = "-"; break;
1947     case MULT_EXPR:
1948       opname = "*"; break;
1949     case MAX_EXPR:
1950       opname = "max"; break;
1951     case MIN_EXPR:
1952       opname = "min"; break;
1953     case EQ_EXPR:
1954       opname = "=="; break;
1955     case NE_EXPR:
1956       opname = "!="; break;
1957     case LE_EXPR:
1958       opname = "<="; break;
1959     case GE_EXPR:
1960       opname = ">="; break;
1961     case LT_EXPR:
1962       opname = "<"; break;
1963     case GT_EXPR:
1964       opname = ">"; break;
1965     case LSHIFT_EXPR:
1966       opname = "<<"; break;
1967     case RSHIFT_EXPR:
1968       opname = ">>"; break;
1969     case TRUNC_MOD_EXPR:
1970     case FLOOR_MOD_EXPR:
1971       opname = "%"; break;
1972     case TRUNC_DIV_EXPR:
1973     case FLOOR_DIV_EXPR:
1974       opname = "/"; break;
1975     case BIT_AND_EXPR:
1976       opname = "&"; break;
1977     case BIT_IOR_EXPR:
1978       opname = "|"; break;
1979     case TRUTH_ANDIF_EXPR:
1980       opname = "&&"; break;
1981     case TRUTH_ORIF_EXPR:
1982       opname = "||"; break;
1983     case BIT_XOR_EXPR:
1984       opname = "^"; break;
1985     case LROTATE_EXPR:
1986     case RROTATE_EXPR:
1987       opname = "rotate"; break;
1988     default:
1989       opname = "unknown"; break;
1990     }
1991   error ("invalid operands to binary %s", opname);
1992 }
1993 \f
1994 /* Subroutine of build_binary_op, used for comparison operations.
1995    See if the operands have both been converted from subword integer types
1996    and, if so, perhaps change them both back to their original type.
1997    This function is also responsible for converting the two operands
1998    to the proper common type for comparison.
1999
2000    The arguments of this function are all pointers to local variables
2001    of build_binary_op: OP0_PTR is &OP0, OP1_PTR is &OP1,
2002    RESTYPE_PTR is &RESULT_TYPE and RESCODE_PTR is &RESULTCODE.
2003
2004    If this function returns nonzero, it means that the comparison has
2005    a constant value.  What this function returns is an expression for
2006    that value.  */
2007
2008 tree
2009 shorten_compare (tree *op0_ptr, tree *op1_ptr, tree *restype_ptr,
2010                  enum tree_code *rescode_ptr)
2011 {
2012   tree type;
2013   tree op0 = *op0_ptr;
2014   tree op1 = *op1_ptr;
2015   int unsignedp0, unsignedp1;
2016   int real1, real2;
2017   tree primop0, primop1;
2018   enum tree_code code = *rescode_ptr;
2019
2020   /* Throw away any conversions to wider types
2021      already present in the operands.  */
2022
2023   primop0 = get_narrower (op0, &unsignedp0);
2024   primop1 = get_narrower (op1, &unsignedp1);
2025
2026   /* Handle the case that OP0 does not *contain* a conversion
2027      but it *requires* conversion to FINAL_TYPE.  */
2028
2029   if (op0 == primop0 && TREE_TYPE (op0) != *restype_ptr)
2030     unsignedp0 = TYPE_UNSIGNED (TREE_TYPE (op0));
2031   if (op1 == primop1 && TREE_TYPE (op1) != *restype_ptr)
2032     unsignedp1 = TYPE_UNSIGNED (TREE_TYPE (op1));
2033
2034   /* If one of the operands must be floated, we cannot optimize.  */
2035   real1 = TREE_CODE (TREE_TYPE (primop0)) == REAL_TYPE;
2036   real2 = TREE_CODE (TREE_TYPE (primop1)) == REAL_TYPE;
2037
2038   /* If first arg is constant, swap the args (changing operation
2039      so value is preserved), for canonicalization.  Don't do this if
2040      the second arg is 0.  */
2041
2042   if (TREE_CONSTANT (primop0)
2043       && ! integer_zerop (primop1) && ! real_zerop (primop1))
2044     {
2045       tree tem = primop0;
2046       int temi = unsignedp0;
2047       primop0 = primop1;
2048       primop1 = tem;
2049       tem = op0;
2050       op0 = op1;
2051       op1 = tem;
2052       *op0_ptr = op0;
2053       *op1_ptr = op1;
2054       unsignedp0 = unsignedp1;
2055       unsignedp1 = temi;
2056       temi = real1;
2057       real1 = real2;
2058       real2 = temi;
2059
2060       switch (code)
2061         {
2062         case LT_EXPR:
2063           code = GT_EXPR;
2064           break;
2065         case GT_EXPR:
2066           code = LT_EXPR;
2067           break;
2068         case LE_EXPR:
2069           code = GE_EXPR;
2070           break;
2071         case GE_EXPR:
2072           code = LE_EXPR;
2073           break;
2074         default:
2075           break;
2076         }
2077       *rescode_ptr = code;
2078     }
2079
2080   /* If comparing an integer against a constant more bits wide,
2081      maybe we can deduce a value of 1 or 0 independent of the data.
2082      Or else truncate the constant now
2083      rather than extend the variable at run time.
2084
2085      This is only interesting if the constant is the wider arg.
2086      Also, it is not safe if the constant is unsigned and the
2087      variable arg is signed, since in this case the variable
2088      would be sign-extended and then regarded as unsigned.
2089      Our technique fails in this case because the lowest/highest
2090      possible unsigned results don't follow naturally from the
2091      lowest/highest possible values of the variable operand.
2092      For just EQ_EXPR and NE_EXPR there is another technique that
2093      could be used: see if the constant can be faithfully represented
2094      in the other operand's type, by truncating it and reextending it
2095      and see if that preserves the constant's value.  */
2096
2097   if (!real1 && !real2
2098       && TREE_CODE (primop1) == INTEGER_CST
2099       && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr))
2100     {
2101       int min_gt, max_gt, min_lt, max_lt;
2102       tree maxval, minval;
2103       /* 1 if comparison is nominally unsigned.  */
2104       int unsignedp = TYPE_UNSIGNED (*restype_ptr);
2105       tree val;
2106
2107       type = c_common_signed_or_unsigned_type (unsignedp0,
2108                                                TREE_TYPE (primop0));
2109
2110       /* In C, if TYPE is an enumeration, then we need to get its
2111          min/max values from its underlying integral type, not the
2112          enumerated type itself.  In C++, TYPE_MAX_VALUE and
2113          TYPE_MIN_VALUE have already been set correctly on the
2114          enumeration type.  */
2115       if (!c_dialect_cxx() && TREE_CODE (type) == ENUMERAL_TYPE)
2116         type = c_common_type_for_size (TYPE_PRECISION (type), unsignedp0);
2117
2118       maxval = TYPE_MAX_VALUE (type);
2119       minval = TYPE_MIN_VALUE (type);
2120
2121       if (unsignedp && !unsignedp0)
2122         *restype_ptr = c_common_signed_type (*restype_ptr);
2123
2124       if (TREE_TYPE (primop1) != *restype_ptr)
2125         primop1 = convert (*restype_ptr, primop1);
2126       if (type != *restype_ptr)
2127         {
2128           minval = convert (*restype_ptr, minval);
2129           maxval = convert (*restype_ptr, maxval);
2130         }
2131
2132       if (unsignedp && unsignedp0)
2133         {
2134           min_gt = INT_CST_LT_UNSIGNED (primop1, minval);
2135           max_gt = INT_CST_LT_UNSIGNED (primop1, maxval);
2136           min_lt = INT_CST_LT_UNSIGNED (minval, primop1);
2137           max_lt = INT_CST_LT_UNSIGNED (maxval, primop1);
2138         }
2139       else
2140         {
2141           min_gt = INT_CST_LT (primop1, minval);
2142           max_gt = INT_CST_LT (primop1, maxval);
2143           min_lt = INT_CST_LT (minval, primop1);
2144           max_lt = INT_CST_LT (maxval, primop1);
2145         }
2146
2147       val = 0;
2148       /* This used to be a switch, but Genix compiler can't handle that.  */
2149       if (code == NE_EXPR)
2150         {
2151           if (max_lt || min_gt)
2152             val = truthvalue_true_node;
2153         }
2154       else if (code == EQ_EXPR)
2155         {
2156           if (max_lt || min_gt)
2157             val = truthvalue_false_node;
2158         }
2159       else if (code == LT_EXPR)
2160         {
2161           if (max_lt)
2162             val = truthvalue_true_node;
2163           if (!min_lt)
2164             val = truthvalue_false_node;
2165         }
2166       else if (code == GT_EXPR)
2167         {
2168           if (min_gt)
2169             val = truthvalue_true_node;
2170           if (!max_gt)
2171             val = truthvalue_false_node;
2172         }
2173       else if (code == LE_EXPR)
2174         {
2175           if (!max_gt)
2176             val = truthvalue_true_node;
2177           if (min_gt)
2178             val = truthvalue_false_node;
2179         }
2180       else if (code == GE_EXPR)
2181         {
2182           if (!min_lt)
2183             val = truthvalue_true_node;
2184           if (max_lt)
2185             val = truthvalue_false_node;
2186         }
2187
2188       /* If primop0 was sign-extended and unsigned comparison specd,
2189          we did a signed comparison above using the signed type bounds.
2190          But the comparison we output must be unsigned.
2191
2192          Also, for inequalities, VAL is no good; but if the signed
2193          comparison had *any* fixed result, it follows that the
2194          unsigned comparison just tests the sign in reverse
2195          (positive values are LE, negative ones GE).
2196          So we can generate an unsigned comparison
2197          against an extreme value of the signed type.  */
2198
2199       if (unsignedp && !unsignedp0)
2200         {
2201           if (val != 0)
2202             switch (code)
2203               {
2204               case LT_EXPR:
2205               case GE_EXPR:
2206                 primop1 = TYPE_MIN_VALUE (type);
2207                 val = 0;
2208                 break;
2209
2210               case LE_EXPR:
2211               case GT_EXPR:
2212                 primop1 = TYPE_MAX_VALUE (type);
2213                 val = 0;
2214                 break;
2215
2216               default:
2217                 break;
2218               }
2219           type = c_common_unsigned_type (type);
2220         }
2221
2222       if (TREE_CODE (primop0) != INTEGER_CST)
2223         {
2224           if (val == truthvalue_false_node)
2225             warning ("comparison is always false due to limited range of data type");
2226           if (val == truthvalue_true_node)
2227             warning ("comparison is always true due to limited range of data type");
2228         }
2229
2230       if (val != 0)
2231         {
2232           /* Don't forget to evaluate PRIMOP0 if it has side effects.  */
2233           if (TREE_SIDE_EFFECTS (primop0))
2234             return build (COMPOUND_EXPR, TREE_TYPE (val), primop0, val);
2235           return val;
2236         }
2237
2238       /* Value is not predetermined, but do the comparison
2239          in the type of the operand that is not constant.
2240          TYPE is already properly set.  */
2241     }
2242   else if (real1 && real2
2243            && (TYPE_PRECISION (TREE_TYPE (primop0))
2244                == TYPE_PRECISION (TREE_TYPE (primop1))))
2245     type = TREE_TYPE (primop0);
2246
2247   /* If args' natural types are both narrower than nominal type
2248      and both extend in the same manner, compare them
2249      in the type of the wider arg.
2250      Otherwise must actually extend both to the nominal
2251      common type lest different ways of extending
2252      alter the result.
2253      (eg, (short)-1 == (unsigned short)-1  should be 0.)  */
2254
2255   else if (unsignedp0 == unsignedp1 && real1 == real2
2256            && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr)
2257            && TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (*restype_ptr))
2258     {
2259       type = common_type (TREE_TYPE (primop0), TREE_TYPE (primop1));
2260       type = c_common_signed_or_unsigned_type (unsignedp0
2261                                                || TYPE_UNSIGNED (*restype_ptr),
2262                                                type);
2263       /* Make sure shorter operand is extended the right way
2264          to match the longer operand.  */
2265       primop0
2266         = convert (c_common_signed_or_unsigned_type (unsignedp0,
2267                                                      TREE_TYPE (primop0)),
2268                    primop0);
2269       primop1
2270         = convert (c_common_signed_or_unsigned_type (unsignedp1,
2271                                                      TREE_TYPE (primop1)),
2272                    primop1);
2273     }
2274   else
2275     {
2276       /* Here we must do the comparison on the nominal type
2277          using the args exactly as we received them.  */
2278       type = *restype_ptr;
2279       primop0 = op0;
2280       primop1 = op1;
2281
2282       if (!real1 && !real2 && integer_zerop (primop1)
2283           && TYPE_UNSIGNED (*restype_ptr))
2284         {
2285           tree value = 0;
2286           switch (code)
2287             {
2288             case GE_EXPR:
2289               /* All unsigned values are >= 0, so we warn if extra warnings
2290                  are requested.  However, if OP0 is a constant that is
2291                  >= 0, the signedness of the comparison isn't an issue,
2292                  so suppress the warning.  */
2293               if (extra_warnings && !in_system_header
2294                   && ! (TREE_CODE (primop0) == INTEGER_CST
2295                         && ! TREE_OVERFLOW (convert (c_common_signed_type (type),
2296                                                      primop0))))
2297                 warning ("comparison of unsigned expression >= 0 is always true");
2298               value = truthvalue_true_node;
2299               break;
2300
2301             case LT_EXPR:
2302               if (extra_warnings && !in_system_header
2303                   && ! (TREE_CODE (primop0) == INTEGER_CST
2304                         && ! TREE_OVERFLOW (convert (c_common_signed_type (type),
2305                                                      primop0))))
2306                 warning ("comparison of unsigned expression < 0 is always false");
2307               value = truthvalue_false_node;
2308               break;
2309
2310             default:
2311               break;
2312             }
2313
2314           if (value != 0)
2315             {
2316               /* Don't forget to evaluate PRIMOP0 if it has side effects.  */
2317               if (TREE_SIDE_EFFECTS (primop0))
2318                 return build (COMPOUND_EXPR, TREE_TYPE (value),
2319                               primop0, value);
2320               return value;
2321             }
2322         }
2323     }
2324
2325   *op0_ptr = convert (type, primop0);
2326   *op1_ptr = convert (type, primop1);
2327
2328   *restype_ptr = truthvalue_type_node;
2329
2330   return 0;
2331 }
2332 \f
2333 /* Return a tree for the sum or difference (RESULTCODE says which)
2334    of pointer PTROP and integer INTOP.  */
2335
2336 tree
2337 pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop)
2338 {
2339   tree size_exp;
2340
2341   /* The result is a pointer of the same type that is being added.  */
2342
2343   tree result_type = TREE_TYPE (ptrop);
2344
2345   if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE)
2346     {
2347       if (pedantic || warn_pointer_arith)
2348         pedwarn ("pointer of type `void *' used in arithmetic");
2349       size_exp = integer_one_node;
2350     }
2351   else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE)
2352     {
2353       if (pedantic || warn_pointer_arith)
2354         pedwarn ("pointer to a function used in arithmetic");
2355       size_exp = integer_one_node;
2356     }
2357   else if (TREE_CODE (TREE_TYPE (result_type)) == METHOD_TYPE)
2358     {
2359       if (pedantic || warn_pointer_arith)
2360         pedwarn ("pointer to member function used in arithmetic");
2361       size_exp = integer_one_node;
2362     }
2363   else
2364     size_exp = size_in_bytes (TREE_TYPE (result_type));
2365
2366   /* If what we are about to multiply by the size of the elements
2367      contains a constant term, apply distributive law
2368      and multiply that constant term separately.
2369      This helps produce common subexpressions.  */
2370
2371   if ((TREE_CODE (intop) == PLUS_EXPR || TREE_CODE (intop) == MINUS_EXPR)
2372       && ! TREE_CONSTANT (intop)
2373       && TREE_CONSTANT (TREE_OPERAND (intop, 1))
2374       && TREE_CONSTANT (size_exp)
2375       /* If the constant comes from pointer subtraction,
2376          skip this optimization--it would cause an error.  */
2377       && TREE_CODE (TREE_TYPE (TREE_OPERAND (intop, 0))) == INTEGER_TYPE
2378       /* If the constant is unsigned, and smaller than the pointer size,
2379          then we must skip this optimization.  This is because it could cause
2380          an overflow error if the constant is negative but INTOP is not.  */
2381       && (! TYPE_UNSIGNED (TREE_TYPE (intop))
2382           || (TYPE_PRECISION (TREE_TYPE (intop))
2383               == TYPE_PRECISION (TREE_TYPE (ptrop)))))
2384     {
2385       enum tree_code subcode = resultcode;
2386       tree int_type = TREE_TYPE (intop);
2387       if (TREE_CODE (intop) == MINUS_EXPR)
2388         subcode = (subcode == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR);
2389       /* Convert both subexpression types to the type of intop,
2390          because weird cases involving pointer arithmetic
2391          can result in a sum or difference with different type args.  */
2392       ptrop = build_binary_op (subcode, ptrop,
2393                                convert (int_type, TREE_OPERAND (intop, 1)), 1);
2394       intop = convert (int_type, TREE_OPERAND (intop, 0));
2395     }
2396
2397   /* Convert the integer argument to a type the same size as sizetype
2398      so the multiply won't overflow spuriously.  */
2399
2400   if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype)
2401       || TYPE_UNSIGNED (TREE_TYPE (intop)) != TYPE_UNSIGNED (sizetype))
2402     intop = convert (c_common_type_for_size (TYPE_PRECISION (sizetype),
2403                                              TYPE_UNSIGNED (sizetype)), intop);
2404
2405   /* Replace the integer argument with a suitable product by the object size.
2406      Do this multiplication as signed, then convert to the appropriate
2407      pointer type (actually unsigned integral).  */
2408
2409   intop = convert (result_type,
2410                    build_binary_op (MULT_EXPR, intop,
2411                                     convert (TREE_TYPE (intop), size_exp), 1));
2412
2413   /* Create the sum or difference.  */
2414   return fold (build (resultcode, result_type, ptrop, intop));
2415 }
2416 \f
2417 /* Prepare expr to be an argument of a TRUTH_NOT_EXPR,
2418    or validate its data type for an `if' or `while' statement or ?..: exp.
2419
2420    This preparation consists of taking the ordinary
2421    representation of an expression expr and producing a valid tree
2422    boolean expression describing whether expr is nonzero.  We could
2423    simply always do build_binary_op (NE_EXPR, expr, truthvalue_false_node, 1),
2424    but we optimize comparisons, &&, ||, and !.
2425
2426    The resulting type should always be `truthvalue_type_node'.  */
2427
2428 tree
2429 c_common_truthvalue_conversion (tree expr)
2430 {
2431   if (TREE_CODE (expr) == ERROR_MARK)
2432     return expr;
2433
2434   if (TREE_CODE (expr) == FUNCTION_DECL)
2435     expr = build_unary_op (ADDR_EXPR, expr, 0);
2436
2437   switch (TREE_CODE (expr))
2438     {
2439     case EQ_EXPR:   case NE_EXPR:   case UNEQ_EXPR: case LTGT_EXPR:
2440     case LE_EXPR:   case GE_EXPR:   case LT_EXPR:   case GT_EXPR:
2441     case UNLE_EXPR: case UNGE_EXPR: case UNLT_EXPR: case UNGT_EXPR:
2442     case ORDERED_EXPR: case UNORDERED_EXPR:
2443     case TRUTH_ANDIF_EXPR:
2444     case TRUTH_ORIF_EXPR:
2445     case TRUTH_AND_EXPR:
2446     case TRUTH_OR_EXPR:
2447     case TRUTH_XOR_EXPR:
2448     case TRUTH_NOT_EXPR:
2449       TREE_TYPE (expr) = truthvalue_type_node;
2450       return expr;
2451
2452     case ERROR_MARK:
2453       return expr;
2454
2455     case INTEGER_CST:
2456       return integer_zerop (expr) ? truthvalue_false_node : truthvalue_true_node;
2457
2458     case REAL_CST:
2459       return real_zerop (expr) ? truthvalue_false_node : truthvalue_true_node;
2460
2461     case ADDR_EXPR:
2462       {
2463         if (TREE_CODE (TREE_OPERAND (expr, 0)) == FUNCTION_DECL
2464             && ! DECL_WEAK (TREE_OPERAND (expr, 0)))
2465           {
2466             /* Common Ada/Pascal programmer's mistake.  We always warn
2467                about this since it is so bad.  */
2468             warning ("the address of `%D', will always evaluate as `true'",
2469                      TREE_OPERAND (expr, 0));
2470             return truthvalue_true_node;
2471           }
2472
2473         /* If we are taking the address of an external decl, it might be
2474            zero if it is weak, so we cannot optimize.  */
2475         if (DECL_P (TREE_OPERAND (expr, 0))
2476             && DECL_EXTERNAL (TREE_OPERAND (expr, 0)))
2477           break;
2478
2479         if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 0)))
2480           return build (COMPOUND_EXPR, truthvalue_type_node,
2481                         TREE_OPERAND (expr, 0), truthvalue_true_node);
2482         else
2483           return truthvalue_true_node;
2484       }
2485
2486     case COMPLEX_EXPR:
2487       return build_binary_op ((TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1))
2488                                ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
2489                 lang_hooks.truthvalue_conversion (TREE_OPERAND (expr, 0)),
2490                 lang_hooks.truthvalue_conversion (TREE_OPERAND (expr, 1)),
2491                               0);
2492
2493     case NEGATE_EXPR:
2494     case ABS_EXPR:
2495     case FLOAT_EXPR:
2496       /* These don't change whether an object is nonzero or zero.  */
2497       return lang_hooks.truthvalue_conversion (TREE_OPERAND (expr, 0));
2498
2499     case LROTATE_EXPR:
2500     case RROTATE_EXPR:
2501       /* These don't change whether an object is zero or nonzero, but
2502          we can't ignore them if their second arg has side-effects.  */
2503       if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
2504         return build (COMPOUND_EXPR, truthvalue_type_node, TREE_OPERAND (expr, 1),
2505                       lang_hooks.truthvalue_conversion (TREE_OPERAND (expr, 0)));
2506       else
2507         return lang_hooks.truthvalue_conversion (TREE_OPERAND (expr, 0));
2508
2509     case COND_EXPR:
2510       /* Distribute the conversion into the arms of a COND_EXPR.  */
2511       return fold (build (COND_EXPR, truthvalue_type_node, TREE_OPERAND (expr, 0),
2512                 lang_hooks.truthvalue_conversion (TREE_OPERAND (expr, 1)),
2513                 lang_hooks.truthvalue_conversion (TREE_OPERAND (expr, 2))));
2514
2515     case CONVERT_EXPR:
2516       /* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE,
2517          since that affects how `default_conversion' will behave.  */
2518       if (TREE_CODE (TREE_TYPE (expr)) == REFERENCE_TYPE
2519           || TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == REFERENCE_TYPE)
2520         break;
2521       /* Fall through....  */
2522     case NOP_EXPR:
2523       /* If this is widening the argument, we can ignore it.  */
2524       if (TYPE_PRECISION (TREE_TYPE (expr))
2525           >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (expr, 0))))
2526         return lang_hooks.truthvalue_conversion (TREE_OPERAND (expr, 0));
2527       break;
2528
2529     case MINUS_EXPR:
2530       /* Perhaps reduce (x - y) != 0 to (x != y).  The expressions
2531          aren't guaranteed to the be same for modes that can represent
2532          infinity, since if x and y are both +infinity, or both
2533          -infinity, then x - y is not a number.
2534
2535          Note that this transformation is safe when x or y is NaN.
2536          (x - y) is then NaN, and both (x - y) != 0 and x != y will
2537          be false.  */
2538       if (HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (TREE_OPERAND (expr, 0)))))
2539         break;
2540       /* Fall through....  */
2541     case BIT_XOR_EXPR:
2542       /* This and MINUS_EXPR can be changed into a comparison of the
2543          two objects.  */
2544       if (TREE_TYPE (TREE_OPERAND (expr, 0))
2545           == TREE_TYPE (TREE_OPERAND (expr, 1)))
2546         return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
2547                                 TREE_OPERAND (expr, 1), 1);
2548       return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
2549                               fold (build1 (NOP_EXPR,
2550                                             TREE_TYPE (TREE_OPERAND (expr, 0)),
2551                                             TREE_OPERAND (expr, 1))), 1);
2552
2553     case BIT_AND_EXPR:
2554       if (integer_onep (TREE_OPERAND (expr, 1))
2555           && TREE_TYPE (expr) != truthvalue_type_node)
2556         /* Using convert here would cause infinite recursion.  */
2557         return build1 (NOP_EXPR, truthvalue_type_node, expr);
2558       break;
2559
2560     case MODIFY_EXPR:
2561       if (warn_parentheses && C_EXP_ORIGINAL_CODE (expr) == MODIFY_EXPR)
2562         warning ("suggest parentheses around assignment used as truth value");
2563       break;
2564
2565     default:
2566       break;
2567     }
2568
2569   if (TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
2570     {
2571       tree t = save_expr (expr);
2572       return (build_binary_op
2573               ((TREE_SIDE_EFFECTS (expr)
2574                 ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
2575         lang_hooks.truthvalue_conversion (build_unary_op (REALPART_EXPR, t, 0)),
2576         lang_hooks.truthvalue_conversion (build_unary_op (IMAGPART_EXPR, t, 0)),
2577                0));
2578     }
2579
2580   return build_binary_op (NE_EXPR, expr, integer_zero_node, 1);
2581 }
2582 \f
2583 static tree builtin_function_2 (const char *, const char *, tree, tree,
2584                                 int, enum built_in_class, int, int,
2585                                 tree);
2586
2587 /* Make a variant type in the proper way for C/C++, propagating qualifiers
2588    down to the element type of an array.  */
2589
2590 tree
2591 c_build_qualified_type (tree type, int type_quals)
2592 {
2593   if (type == error_mark_node)
2594     return type;
2595   
2596   if (TREE_CODE (type) == ARRAY_TYPE)
2597     return build_array_type (c_build_qualified_type (TREE_TYPE (type),
2598                                                      type_quals),
2599                              TYPE_DOMAIN (type));
2600
2601   /* A restrict-qualified pointer type must be a pointer to object or
2602      incomplete type.  Note that the use of POINTER_TYPE_P also allows
2603      REFERENCE_TYPEs, which is appropriate for C++.  */
2604   if ((type_quals & TYPE_QUAL_RESTRICT)
2605       && (!POINTER_TYPE_P (type)
2606           || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (type))))
2607     {
2608       error ("invalid use of `restrict'");
2609       type_quals &= ~TYPE_QUAL_RESTRICT;
2610     }
2611
2612   return build_qualified_type (type, type_quals);
2613 }
2614
2615 /* Apply the TYPE_QUALS to the new DECL.  */
2616
2617 void
2618 c_apply_type_quals_to_decl (int type_quals, tree decl)
2619 {
2620   tree type = TREE_TYPE (decl);
2621   
2622   if (type == error_mark_node)
2623     return;
2624
2625   if (((type_quals & TYPE_QUAL_CONST)
2626        || (type && TREE_CODE (type) == REFERENCE_TYPE))
2627       /* An object declared 'const' is only readonly after it is
2628          initialized.  We don't have any way of expressing this currently,
2629          so we need to be conservative and unset TREE_READONLY for types
2630          with constructors.  Otherwise aliasing code will ignore stores in
2631          an inline constructor.  */
2632       && !(type && TYPE_NEEDS_CONSTRUCTING (type)))
2633     TREE_READONLY (decl) = 1;
2634   if (type_quals & TYPE_QUAL_VOLATILE)
2635     {
2636       TREE_SIDE_EFFECTS (decl) = 1;
2637       TREE_THIS_VOLATILE (decl) = 1;
2638     }
2639   if (type_quals & TYPE_QUAL_RESTRICT)
2640     {
2641       while (type && TREE_CODE (type) == ARRAY_TYPE)
2642         /* Allow 'restrict' on arrays of pointers.
2643            FIXME currently we just ignore it.  */
2644         type = TREE_TYPE (type);
2645       if (!type
2646           || !POINTER_TYPE_P (type)
2647           || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (type)))
2648         error ("invalid use of `restrict'");
2649       else if (flag_strict_aliasing && type == TREE_TYPE (decl))
2650         /* Indicate we need to make a unique alias set for this pointer.
2651            We can't do it here because it might be pointing to an
2652            incomplete type.  */
2653         DECL_POINTER_ALIAS_SET (decl) = -2;
2654     }
2655 }
2656
2657 /* Hash function for the problem of multiple type definitions in
2658    different files.  This must hash all types that will compare
2659    equal via comptypes to the same value.  In practice it hashes
2660    on some of the simple stuff and leaves the details to comptypes.  */
2661
2662 static hashval_t
2663 c_type_hash (const void *p)
2664 {
2665   int i = 0;
2666   int shift, size;
2667   tree t = (tree)p;
2668   tree t2;
2669   switch (TREE_CODE (t))
2670     {
2671     /* For pointers, hash on pointee type plus some swizzling. */
2672     case POINTER_TYPE:
2673       return c_type_hash (TREE_TYPE (t)) ^ 0x3003003;
2674     /* Hash on number of elements and total size.  */
2675     case ENUMERAL_TYPE:
2676       shift = 3;
2677       t2 = TYPE_VALUES (t);
2678       break;
2679     case RECORD_TYPE:
2680       shift = 0;
2681       t2 = TYPE_FIELDS (t);
2682       break;
2683     case QUAL_UNION_TYPE:
2684       shift = 1;
2685       t2 = TYPE_FIELDS (t);
2686       break;
2687     case UNION_TYPE:
2688       shift = 2;
2689       t2 = TYPE_FIELDS (t);
2690       break;
2691     default:
2692       abort ();
2693     }
2694   for (; t2; t2 = TREE_CHAIN (t2))
2695     i++;
2696   size = TREE_INT_CST_LOW (TYPE_SIZE (t));
2697   return ((size << 24) | (i << shift));
2698 }
2699
2700 /* Return the typed-based alias set for T, which may be an expression
2701    or a type.  Return -1 if we don't do anything special.  */
2702
2703 HOST_WIDE_INT
2704 c_common_get_alias_set (tree t)
2705 {
2706   tree u;
2707   PTR *slot;
2708   static htab_t type_hash_table;
2709
2710   /* Permit type-punning when accessing a union, provided the access
2711      is directly through the union.  For example, this code does not
2712      permit taking the address of a union member and then storing
2713      through it.  Even the type-punning allowed here is a GCC
2714      extension, albeit a common and useful one; the C standard says
2715      that such accesses have implementation-defined behavior.  */
2716   for (u = t;
2717        TREE_CODE (u) == COMPONENT_REF || TREE_CODE (u) == ARRAY_REF;
2718        u = TREE_OPERAND (u, 0))
2719     if (TREE_CODE (u) == COMPONENT_REF
2720         && TREE_CODE (TREE_TYPE (TREE_OPERAND (u, 0))) == UNION_TYPE)
2721       return 0;
2722
2723   /* That's all the expressions we handle specially.  */
2724   if (! TYPE_P (t))
2725     return -1;
2726
2727   /* The C standard guarantees that any object may be accessed via an
2728      lvalue that has character type.  */
2729   if (t == char_type_node
2730       || t == signed_char_type_node
2731       || t == unsigned_char_type_node)
2732     return 0;
2733
2734   /* If it has the may_alias attribute, it can alias anything.  */
2735   if (lookup_attribute ("may_alias", TYPE_ATTRIBUTES (t)))
2736     return 0;
2737
2738   /* The C standard specifically allows aliasing between signed and
2739      unsigned variants of the same type.  We treat the signed
2740      variant as canonical.  */
2741   if (TREE_CODE (t) == INTEGER_TYPE && TYPE_UNSIGNED (t))
2742     {
2743       tree t1 = c_common_signed_type (t);
2744
2745       /* t1 == t can happen for boolean nodes which are always unsigned.  */
2746       if (t1 != t)
2747         return get_alias_set (t1);
2748     }
2749   else if (POINTER_TYPE_P (t))
2750     {
2751       tree t1;
2752
2753       /* Unfortunately, there is no canonical form of a pointer type.
2754          In particular, if we have `typedef int I', then `int *', and
2755          `I *' are different types.  So, we have to pick a canonical
2756          representative.  We do this below.
2757
2758          Technically, this approach is actually more conservative that
2759          it needs to be.  In particular, `const int *' and `int *'
2760          should be in different alias sets, according to the C and C++
2761          standard, since their types are not the same, and so,
2762          technically, an `int **' and `const int **' cannot point at
2763          the same thing.
2764
2765          But, the standard is wrong.  In particular, this code is
2766          legal C++:
2767
2768             int *ip;
2769             int **ipp = &ip;
2770             const int* const* cipp = ipp;
2771
2772          And, it doesn't make sense for that to be legal unless you
2773          can dereference IPP and CIPP.  So, we ignore cv-qualifiers on
2774          the pointed-to types.  This issue has been reported to the
2775          C++ committee.  */
2776       t1 = build_type_no_quals (t);
2777       if (t1 != t)
2778         return get_alias_set (t1);
2779     }
2780
2781   /* Handle the case of multiple type nodes referring to "the same" type,
2782      which occurs with IMA.  These share an alias set.  FIXME:  Currently only
2783      C90 is handled.  (In C99 type compatibility is not transitive, which
2784      complicates things mightily. The alias set splay trees can theoretically
2785      represent this, but insertion is tricky when you consider all the
2786      different orders things might arrive in.) */
2787
2788   if (c_language != clk_c || flag_isoc99)
2789     return -1;
2790
2791   /* Save time if there's only one input file.  */
2792   if (!current_file_decl || TREE_CHAIN (current_file_decl) == NULL_TREE)
2793     return -1;
2794
2795   /* Pointers need special handling if they point to any type that
2796      needs special handling (below).  */
2797   if (TREE_CODE (t) == POINTER_TYPE)
2798     {
2799       tree t2;
2800       /* Find bottom type under any nested POINTERs.  */
2801       for (t2 = TREE_TYPE (t); 
2802      TREE_CODE (t2) == POINTER_TYPE;
2803      t2 = TREE_TYPE (t2))
2804   ;
2805       if (TREE_CODE (t2) != RECORD_TYPE 
2806     && TREE_CODE (t2) != ENUMERAL_TYPE
2807     && TREE_CODE (t2) != QUAL_UNION_TYPE
2808     && TREE_CODE (t2) != UNION_TYPE)
2809   return -1;
2810       if (TYPE_SIZE (t2) == 0)
2811   return -1;
2812     }
2813   /* These are the only cases that need special handling.  */
2814   if (TREE_CODE (t) != RECORD_TYPE 
2815       && TREE_CODE (t) != ENUMERAL_TYPE
2816       && TREE_CODE (t) != QUAL_UNION_TYPE
2817       && TREE_CODE (t) != UNION_TYPE
2818       && TREE_CODE (t) != POINTER_TYPE)
2819     return -1;
2820   /* Undefined? */
2821   if (TYPE_SIZE (t) == 0)
2822     return -1;
2823
2824   /* Look up t in hash table.  Only one of the compatible types within each 
2825      alias set is recorded in the table.  */
2826   if (!type_hash_table)
2827     type_hash_table = htab_create (1021, c_type_hash,
2828             (htab_eq) lang_hooks.types_compatible_p,
2829             NULL);
2830   slot = htab_find_slot (type_hash_table, t, INSERT);
2831   if (*slot != NULL)
2832     return TYPE_ALIAS_SET ((tree)*slot);
2833   else
2834     /* Our caller will assign and record (in t) a new alias set; all we need
2835        to do is remember t in the hash table.  */
2836     *slot = t;
2837
2838   return -1;
2839 }
2840 \f
2841 /* Compute the value of 'sizeof (TYPE)' or '__alignof__ (TYPE)', where the
2842    second parameter indicates which OPERATOR is being applied.  The COMPLAIN
2843    flag controls whether we should diagnose possibly ill-formed
2844    constructs or not.  */
2845 tree
2846 c_sizeof_or_alignof_type (tree type, enum tree_code op, int complain)
2847 {
2848   const char *op_name;
2849   tree value = NULL;
2850   enum tree_code type_code = TREE_CODE (type);
2851
2852   my_friendly_assert (op == SIZEOF_EXPR || op == ALIGNOF_EXPR, 20020720);
2853   op_name = op == SIZEOF_EXPR ? "sizeof" : "__alignof__";
2854
2855   if (type_code == FUNCTION_TYPE)
2856     {
2857       if (op == SIZEOF_EXPR)
2858         {
2859           if (complain && (pedantic || warn_pointer_arith))
2860             pedwarn ("invalid application of `sizeof' to a function type");
2861           value = size_one_node;
2862         }
2863       else
2864         value = size_int (FUNCTION_BOUNDARY / BITS_PER_UNIT);
2865     }
2866   else if (type_code == VOID_TYPE || type_code == ERROR_MARK)
2867     {
2868       if (type_code == VOID_TYPE
2869           && complain && (pedantic || warn_pointer_arith))
2870         pedwarn ("invalid application of `%s' to a void type", op_name);
2871       value = size_one_node;
2872     }
2873   else if (!COMPLETE_TYPE_P (type))
2874     {
2875       if (complain)
2876         error ("invalid application of `%s' to incomplete type `%T' ", 
2877                op_name, type);
2878       value = size_zero_node;
2879     }
2880   else
2881     {
2882       if (op == SIZEOF_EXPR)
2883         /* Convert in case a char is more than one unit.  */
2884         value = size_binop (CEIL_DIV_EXPR, TYPE_SIZE_UNIT (type),
2885                             size_int (TYPE_PRECISION (char_type_node)
2886                                       / BITS_PER_UNIT));
2887       else
2888         value = size_int (TYPE_ALIGN (type) / BITS_PER_UNIT);
2889     }
2890
2891   /* VALUE will have an integer type with TYPE_IS_SIZETYPE set.
2892      TYPE_IS_SIZETYPE means that certain things (like overflow) will
2893      never happen.  However, this node should really have type
2894      `size_t', which is just a typedef for an ordinary integer type.  */
2895   value = fold (build1 (NOP_EXPR, size_type_node, value));
2896   my_friendly_assert (!TYPE_IS_SIZETYPE (TREE_TYPE (value)), 20001021);
2897
2898   return value;
2899 }
2900
2901 /* Implement the __alignof keyword: Return the minimum required
2902    alignment of EXPR, measured in bytes.  For VAR_DECL's and
2903    FIELD_DECL's return DECL_ALIGN (which can be set from an
2904    "aligned" __attribute__ specification).  */
2905
2906 tree
2907 c_alignof_expr (tree expr)
2908 {
2909   tree t;
2910
2911   if (TREE_CODE (expr) == VAR_DECL)
2912     t = size_int (DECL_ALIGN (expr) / BITS_PER_UNIT);
2913
2914   else if (TREE_CODE (expr) == COMPONENT_REF
2915            && DECL_C_BIT_FIELD (TREE_OPERAND (expr, 1)))
2916     {
2917       error ("`__alignof' applied to a bit-field");
2918       t = size_one_node;
2919     }
2920   else if (TREE_CODE (expr) == COMPONENT_REF
2921            && TREE_CODE (TREE_OPERAND (expr, 1)) == FIELD_DECL)
2922     t = size_int (DECL_ALIGN (TREE_OPERAND (expr, 1)) / BITS_PER_UNIT);
2923
2924   else if (TREE_CODE (expr) == INDIRECT_REF)
2925     {
2926       tree t = TREE_OPERAND (expr, 0);
2927       tree best = t;
2928       int bestalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t)));
2929
2930       while (TREE_CODE (t) == NOP_EXPR
2931              && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == POINTER_TYPE)
2932         {
2933           int thisalign;
2934
2935           t = TREE_OPERAND (t, 0);
2936           thisalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t)));
2937           if (thisalign > bestalign)
2938             best = t, bestalign = thisalign;
2939         }
2940       return c_alignof (TREE_TYPE (TREE_TYPE (best)));
2941     }
2942   else
2943     return c_alignof (TREE_TYPE (expr));
2944
2945   return fold (build1 (NOP_EXPR, size_type_node, t));
2946 }
2947 \f
2948 /* Handle C and C++ default attributes.  */
2949
2950 enum built_in_attribute
2951 {
2952 #define DEF_ATTR_NULL_TREE(ENUM) ENUM,
2953 #define DEF_ATTR_INT(ENUM, VALUE) ENUM,
2954 #define DEF_ATTR_IDENT(ENUM, STRING) ENUM,
2955 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) ENUM,
2956 #include "builtin-attrs.def"
2957 #undef DEF_ATTR_NULL_TREE
2958 #undef DEF_ATTR_INT
2959 #undef DEF_ATTR_IDENT
2960 #undef DEF_ATTR_TREE_LIST
2961   ATTR_LAST
2962 };
2963
2964 static GTY(()) tree built_in_attributes[(int) ATTR_LAST];
2965
2966 static void c_init_attributes (void);
2967
2968 /* Build tree nodes and builtin functions common to both C and C++ language
2969    frontends.  */
2970
2971 void
2972 c_common_nodes_and_builtins (void)
2973 {
2974   enum builtin_type
2975   {
2976 #define DEF_PRIMITIVE_TYPE(NAME, VALUE) NAME,
2977 #define DEF_FUNCTION_TYPE_0(NAME, RETURN) NAME,
2978 #define DEF_FUNCTION_TYPE_1(NAME, RETURN, ARG1) NAME,
2979 #define DEF_FUNCTION_TYPE_2(NAME, RETURN, ARG1, ARG2) NAME,
2980 #define DEF_FUNCTION_TYPE_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
2981 #define DEF_FUNCTION_TYPE_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
2982 #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME,
2983 #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME,
2984 #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME,
2985 #define DEF_FUNCTION_TYPE_VAR_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
2986 #define DEF_POINTER_TYPE(NAME, TYPE) NAME,
2987 #include "builtin-types.def"
2988 #undef DEF_PRIMITIVE_TYPE
2989 #undef DEF_FUNCTION_TYPE_0
2990 #undef DEF_FUNCTION_TYPE_1
2991 #undef DEF_FUNCTION_TYPE_2
2992 #undef DEF_FUNCTION_TYPE_3
2993 #undef DEF_FUNCTION_TYPE_4
2994 #undef DEF_FUNCTION_TYPE_VAR_0
2995 #undef DEF_FUNCTION_TYPE_VAR_1
2996 #undef DEF_FUNCTION_TYPE_VAR_2
2997 #undef DEF_FUNCTION_TYPE_VAR_3
2998 #undef DEF_POINTER_TYPE
2999     BT_LAST
3000   };
3001
3002   typedef enum builtin_type builtin_type;
3003
3004   tree builtin_types[(int) BT_LAST];
3005   int wchar_type_size;
3006   tree array_domain_type;
3007   tree va_list_ref_type_node;
3008   tree va_list_arg_type_node;
3009
3010   /* Define `int' and `char' first so that dbx will output them first.  */
3011   record_builtin_type (RID_INT, NULL, integer_type_node);
3012   record_builtin_type (RID_CHAR, "char", char_type_node);
3013
3014   /* `signed' is the same as `int'.  FIXME: the declarations of "signed",
3015      "unsigned long", "long long unsigned" and "unsigned short" were in C++
3016      but not C.  Are the conditionals here needed?  */
3017   if (c_dialect_cxx ())
3018     record_builtin_type (RID_SIGNED, NULL, integer_type_node);
3019   record_builtin_type (RID_LONG, "long int", long_integer_type_node);
3020   record_builtin_type (RID_UNSIGNED, "unsigned int", unsigned_type_node);
3021   record_builtin_type (RID_MAX, "long unsigned int",
3022                        long_unsigned_type_node);
3023   if (c_dialect_cxx ())
3024     record_builtin_type (RID_MAX, "unsigned long", long_unsigned_type_node);
3025   record_builtin_type (RID_MAX, "long long int",
3026                        long_long_integer_type_node);
3027   record_builtin_type (RID_MAX, "long long unsigned int",
3028                        long_long_unsigned_type_node);
3029   if (c_dialect_cxx ())
3030     record_builtin_type (RID_MAX, "long long unsigned",
3031                          long_long_unsigned_type_node);
3032   record_builtin_type (RID_SHORT, "short int", short_integer_type_node);
3033   record_builtin_type (RID_MAX, "short unsigned int",
3034                        short_unsigned_type_node);
3035   if (c_dialect_cxx ())
3036     record_builtin_type (RID_MAX, "unsigned short",
3037                          short_unsigned_type_node);
3038
3039   /* Define both `signed char' and `unsigned char'.  */
3040   record_builtin_type (RID_MAX, "signed char", signed_char_type_node);
3041   record_builtin_type (RID_MAX, "unsigned char", unsigned_char_type_node);
3042
3043   /* These are types that c_common_type_for_size and
3044      c_common_type_for_mode use.  */
3045   lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE,
3046                                          intQI_type_node));
3047   lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE,
3048                                          intHI_type_node));
3049   lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE,
3050                                          intSI_type_node));
3051   lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE,
3052                                          intDI_type_node));
3053 #if HOST_BITS_PER_WIDE_INT >= 64
3054   lang_hooks.decls.pushdecl (build_decl (TYPE_DECL,
3055                                          get_identifier ("__int128_t"),
3056                                          intTI_type_node));
3057 #endif
3058   lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE,
3059                                          unsigned_intQI_type_node));
3060   lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE,
3061                                          unsigned_intHI_type_node));
3062   lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE,
3063                                          unsigned_intSI_type_node));
3064   lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE,
3065                                          unsigned_intDI_type_node));
3066 #if HOST_BITS_PER_WIDE_INT >= 64
3067   lang_hooks.decls.pushdecl (build_decl (TYPE_DECL,
3068                                          get_identifier ("__uint128_t"),
3069                                          unsigned_intTI_type_node));
3070 #endif
3071
3072   /* Create the widest literal types.  */
3073   widest_integer_literal_type_node
3074     = make_signed_type (HOST_BITS_PER_WIDE_INT * 2);
3075   lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE,
3076                                          widest_integer_literal_type_node));
3077
3078   widest_unsigned_literal_type_node
3079     = make_unsigned_type (HOST_BITS_PER_WIDE_INT * 2);
3080   lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE,
3081                                          widest_unsigned_literal_type_node));
3082
3083   /* `unsigned long' is the standard type for sizeof.
3084      Note that stddef.h uses `unsigned long',
3085      and this must agree, even if long and int are the same size.  */
3086   size_type_node =
3087     TREE_TYPE (identifier_global_value (get_identifier (SIZE_TYPE)));
3088   signed_size_type_node = c_common_signed_type (size_type_node);
3089   set_sizetype (size_type_node);
3090
3091   pid_type_node =
3092     TREE_TYPE (identifier_global_value (get_identifier (PID_TYPE)));
3093
3094   build_common_tree_nodes_2 (flag_short_double);
3095
3096   record_builtin_type (RID_FLOAT, NULL, float_type_node);
3097   record_builtin_type (RID_DOUBLE, NULL, double_type_node);
3098   record_builtin_type (RID_MAX, "long double", long_double_type_node);
3099
3100   lang_hooks.decls.pushdecl (build_decl (TYPE_DECL,
3101                                          get_identifier ("complex int"),
3102                                          complex_integer_type_node));
3103   lang_hooks.decls.pushdecl (build_decl (TYPE_DECL,
3104                                          get_identifier ("complex float"),
3105                                          complex_float_type_node));
3106   lang_hooks.decls.pushdecl (build_decl (TYPE_DECL,
3107                                          get_identifier ("complex double"),
3108                                          complex_double_type_node));
3109   lang_hooks.decls.pushdecl
3110     (build_decl (TYPE_DECL, get_identifier ("complex long double"),
3111                  complex_long_double_type_node));
3112
3113   if (c_dialect_cxx ())
3114     /* For C++, make fileptr_type_node a distinct void * type until
3115        FILE type is defined.  */
3116     fileptr_type_node = build_type_copy (ptr_type_node);
3117
3118   record_builtin_type (RID_VOID, NULL, void_type_node);
3119
3120   void_zero_node = build_int_2 (0, 0);
3121   TREE_TYPE (void_zero_node) = void_type_node;
3122
3123   void_list_node = build_void_list_node ();
3124
3125   /* Make a type to be the domain of a few array types
3126      whose domains don't really matter.
3127      200 is small enough that it always fits in size_t
3128      and large enough that it can hold most function names for the
3129      initializations of __FUNCTION__ and __PRETTY_FUNCTION__.  */
3130   array_domain_type = build_index_type (size_int (200));
3131
3132   /* Make a type for arrays of characters.
3133      With luck nothing will ever really depend on the length of this
3134      array type.  */
3135   char_array_type_node
3136     = build_array_type (char_type_node, array_domain_type);
3137
3138   /* Likewise for arrays of ints.  */
3139   int_array_type_node
3140     = build_array_type (integer_type_node, array_domain_type);
3141
3142   string_type_node = build_pointer_type (char_type_node);
3143   const_string_type_node
3144     = build_pointer_type (build_qualified_type
3145                           (char_type_node, TYPE_QUAL_CONST));
3146
3147   /* This is special for C++ so functions can be overloaded.  */
3148   wchar_type_node = get_identifier (MODIFIED_WCHAR_TYPE);
3149   wchar_type_node = TREE_TYPE (identifier_global_value (wchar_type_node));
3150   wchar_type_size = TYPE_PRECISION (wchar_type_node);
3151   if (c_dialect_cxx ())
3152     {
3153       if (TYPE_UNSIGNED (wchar_type_node))
3154         wchar_type_node = make_unsigned_type (wchar_type_size);
3155       else
3156         wchar_type_node = make_signed_type (wchar_type_size);
3157       record_builtin_type (RID_WCHAR, "wchar_t", wchar_type_node);
3158     }
3159   else
3160     {
3161       signed_wchar_type_node = c_common_signed_type (wchar_type_node);
3162       unsigned_wchar_type_node = c_common_unsigned_type (wchar_type_node);
3163     }
3164
3165   /* This is for wide string constants.  */
3166   wchar_array_type_node
3167     = build_array_type (wchar_type_node, array_domain_type);
3168
3169   wint_type_node =
3170     TREE_TYPE (identifier_global_value (get_identifier (WINT_TYPE)));
3171
3172   intmax_type_node =
3173     TREE_TYPE (identifier_global_value (get_identifier (INTMAX_TYPE)));
3174   uintmax_type_node =
3175     TREE_TYPE (identifier_global_value (get_identifier (UINTMAX_TYPE)));
3176
3177   default_function_type = build_function_type (integer_type_node, NULL_TREE);
3178   ptrdiff_type_node
3179     = TREE_TYPE (identifier_global_value (get_identifier (PTRDIFF_TYPE)));
3180   unsigned_ptrdiff_type_node = c_common_unsigned_type (ptrdiff_type_node);
3181
3182   lang_hooks.decls.pushdecl
3183     (build_decl (TYPE_DECL, get_identifier ("__builtin_va_list"),
3184                  va_list_type_node));
3185
3186   lang_hooks.decls.pushdecl
3187     (build_decl (TYPE_DECL, get_identifier ("__builtin_ptrdiff_t"),
3188                  ptrdiff_type_node));
3189
3190   lang_hooks.decls.pushdecl
3191     (build_decl (TYPE_DECL, get_identifier ("__builtin_size_t"),
3192                  sizetype));
3193
3194   if (TREE_CODE (va_list_type_node) == ARRAY_TYPE)
3195     {
3196       va_list_arg_type_node = va_list_ref_type_node =
3197         build_pointer_type (TREE_TYPE (va_list_type_node));
3198     }
3199   else
3200     {
3201       va_list_arg_type_node = va_list_type_node;
3202       va_list_ref_type_node = build_reference_type (va_list_type_node);
3203     }
3204
3205 #define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \
3206   builtin_types[(int) ENUM] = VALUE;
3207 #define DEF_FUNCTION_TYPE_0(ENUM, RETURN)               \
3208   builtin_types[(int) ENUM]                             \
3209     = build_function_type (builtin_types[(int) RETURN], \
3210                            void_list_node);
3211 #define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1)                         \
3212   builtin_types[(int) ENUM]                                             \
3213     = build_function_type (builtin_types[(int) RETURN],                 \
3214                            tree_cons (NULL_TREE,                        \
3215                                       builtin_types[(int) ARG1],        \
3216                                       void_list_node));
3217 #define DEF_FUNCTION_TYPE_2(ENUM, RETURN, ARG1, ARG2)   \
3218   builtin_types[(int) ENUM]                             \
3219     = build_function_type                               \
3220       (builtin_types[(int) RETURN],                     \
3221        tree_cons (NULL_TREE,                            \
3222                   builtin_types[(int) ARG1],            \
3223                   tree_cons (NULL_TREE,                 \
3224                              builtin_types[(int) ARG2], \
3225                              void_list_node)));
3226 #define DEF_FUNCTION_TYPE_3(ENUM, RETURN, ARG1, ARG2, ARG3)              \
3227   builtin_types[(int) ENUM]                                              \
3228     = build_function_type                                                \
3229       (builtin_types[(int) RETURN],                                      \
3230        tree_cons (NULL_TREE,                                             \
3231                   builtin_types[(int) ARG1],                             \
3232                   tree_cons (NULL_TREE,                                  \
3233                              builtin_types[(int) ARG2],                  \
3234                              tree_cons (NULL_TREE,                       \
3235                                         builtin_types[(int) ARG3],       \
3236                                         void_list_node))));
3237 #define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4)       \
3238   builtin_types[(int) ENUM]                                             \
3239     = build_function_type                                               \
3240       (builtin_types[(int) RETURN],                                     \
3241        tree_cons (NULL_TREE,                                            \
3242                   builtin_types[(int) ARG1],                            \
3243                   tree_cons (NULL_TREE,                                 \
3244                              builtin_types[(int) ARG2],                 \
3245                              tree_cons                                  \
3246                              (NULL_TREE,                                \
3247                               builtin_types[(int) ARG3],                \
3248                               tree_cons (NULL_TREE,                     \
3249                                          builtin_types[(int) ARG4],     \
3250                                          void_list_node)))));
3251 #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN)                           \
3252   builtin_types[(int) ENUM]                                             \
3253     = build_function_type (builtin_types[(int) RETURN], NULL_TREE);
3254 #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1)                      \
3255    builtin_types[(int) ENUM]                                             \
3256     = build_function_type (builtin_types[(int) RETURN],          \
3257                            tree_cons (NULL_TREE,                         \
3258                                       builtin_types[(int) ARG1],         \
3259                                       NULL_TREE));
3260
3261 #define DEF_FUNCTION_TYPE_VAR_2(ENUM, RETURN, ARG1, ARG2)       \
3262    builtin_types[(int) ENUM]                                    \
3263     = build_function_type                                       \
3264       (builtin_types[(int) RETURN],                             \
3265        tree_cons (NULL_TREE,                                    \
3266                   builtin_types[(int) ARG1],                    \
3267                   tree_cons (NULL_TREE,                         \
3268                              builtin_types[(int) ARG2],         \
3269                              NULL_TREE)));
3270
3271 #define DEF_FUNCTION_TYPE_VAR_3(ENUM, RETURN, ARG1, ARG2, ARG3)         \
3272    builtin_types[(int) ENUM]                                            \
3273     = build_function_type                                               \
3274       (builtin_types[(int) RETURN],                                     \
3275        tree_cons (NULL_TREE,                                            \
3276                   builtin_types[(int) ARG1],                            \
3277                   tree_cons (NULL_TREE,                                 \
3278                              builtin_types[(int) ARG2],                 \
3279                              tree_cons (NULL_TREE,                      \
3280                                         builtin_types[(int) ARG3],      \
3281                                         NULL_TREE))));
3282
3283 #define DEF_POINTER_TYPE(ENUM, TYPE)                    \
3284   builtin_types[(int) ENUM]                             \
3285     = build_pointer_type (builtin_types[(int) TYPE]);
3286 #include "builtin-types.def"
3287 #undef DEF_PRIMITIVE_TYPE
3288 #undef DEF_FUNCTION_TYPE_1
3289 #undef DEF_FUNCTION_TYPE_2
3290 #undef DEF_FUNCTION_TYPE_3
3291 #undef DEF_FUNCTION_TYPE_4
3292 #undef DEF_FUNCTION_TYPE_VAR_0
3293 #undef DEF_FUNCTION_TYPE_VAR_1
3294 #undef DEF_FUNCTION_TYPE_VAR_2
3295 #undef DEF_FUNCTION_TYPE_VAR_3
3296 #undef DEF_POINTER_TYPE
3297
3298   c_init_attributes ();
3299
3300 #define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE,                   \
3301                     BOTH_P, FALLBACK_P, NONANSI_P, ATTRS, IMPLICIT)     \
3302   if (NAME)                                                             \
3303     {                                                                   \
3304       tree decl;                                                        \
3305                                                                         \
3306       if (strncmp (NAME, "__builtin_", strlen ("__builtin_")) != 0)     \
3307         abort ();                                                       \
3308                                                                         \
3309       if (!BOTH_P)                                                      \
3310         decl = builtin_function (NAME, builtin_types[TYPE], ENUM,       \
3311                                  CLASS,                                 \
3312                                  (FALLBACK_P                            \
3313                                   ? (NAME + strlen ("__builtin_"))      \
3314                                   : NULL),                              \
3315                                  built_in_attributes[(int) ATTRS]);     \
3316       else                                                              \
3317         decl = builtin_function_2 (NAME,                                \
3318                                    NAME + strlen ("__builtin_"),        \
3319                                    builtin_types[TYPE],                 \
3320                                    builtin_types[LIBTYPE],              \
3321                                    ENUM,                                \
3322                                    CLASS,                               \
3323                                    FALLBACK_P,                          \
3324                                    NONANSI_P,                           \
3325                                    built_in_attributes[(int) ATTRS]);   \
3326                                                                         \
3327       built_in_decls[(int) ENUM] = decl;                                \
3328       if (IMPLICIT)                                                     \
3329         implicit_built_in_decls[(int) ENUM] = decl;                     \
3330     }
3331 #include "builtins.def"
3332 #undef DEF_BUILTIN
3333
3334   targetm.init_builtins ();
3335
3336   main_identifier_node = get_identifier ("main");
3337 }
3338
3339 tree
3340 build_va_arg (tree expr, tree type)
3341 {
3342   return build1 (VA_ARG_EXPR, type, expr);
3343 }
3344
3345
3346 /* Linked list of disabled built-in functions.  */
3347
3348 typedef struct disabled_builtin
3349 {
3350   const char *name;
3351   struct disabled_builtin *next;
3352 } disabled_builtin;
3353 static disabled_builtin *disabled_builtins = NULL;
3354
3355 static bool builtin_function_disabled_p (const char *);
3356
3357 /* Disable a built-in function specified by -fno-builtin-NAME.  If NAME
3358    begins with "__builtin_", give an error.  */
3359
3360 void
3361 disable_builtin_function (const char *name)
3362 {
3363   if (strncmp (name, "__builtin_", strlen ("__builtin_")) == 0)
3364     error ("cannot disable built-in function `%s'", name);
3365   else
3366     {
3367       disabled_builtin *new = xmalloc (sizeof (disabled_builtin));
3368       new->name = name;
3369       new->next = disabled_builtins;
3370       disabled_builtins = new;
3371     }
3372 }
3373
3374
3375 /* Return true if the built-in function NAME has been disabled, false
3376    otherwise.  */
3377
3378 static bool
3379 builtin_function_disabled_p (const char *name)
3380 {
3381   disabled_builtin *p;
3382   for (p = disabled_builtins; p != NULL; p = p->next)
3383     {
3384       if (strcmp (name, p->name) == 0)
3385         return true;
3386     }
3387   return false;
3388 }
3389
3390
3391 /* Possibly define a builtin function with one or two names.  BUILTIN_NAME
3392    is an __builtin_-prefixed name; NAME is the ordinary name; one or both
3393    of these may be NULL (though both being NULL is useless).
3394    BUILTIN_TYPE is the type of the __builtin_-prefixed function;
3395    TYPE is the type of the function with the ordinary name.  These
3396    may differ if the ordinary name is declared with a looser type to avoid
3397    conflicts with headers.  FUNCTION_CODE and CLASS are as for
3398    builtin_function.  If LIBRARY_NAME_P is nonzero, NAME is passed as
3399    the LIBRARY_NAME parameter to builtin_function when declaring BUILTIN_NAME.
3400    If NONANSI_P is nonzero, the name NAME is treated as a non-ANSI name;
3401    ATTRS is the tree list representing the builtin's function attributes.
3402    Returns the declaration of BUILTIN_NAME, if any, otherwise
3403    the declaration of NAME.  Does not declare NAME if flag_no_builtin,
3404    or if NONANSI_P and flag_no_nonansi_builtin.  */
3405
3406 static tree
3407 builtin_function_2 (const char *builtin_name, const char *name,
3408                     tree builtin_type, tree type, int function_code,
3409                     enum built_in_class class, int library_name_p,
3410                     int nonansi_p, tree attrs)
3411 {
3412   tree bdecl = NULL_TREE;
3413   tree decl = NULL_TREE;
3414
3415   if (builtin_name != 0)
3416     bdecl = builtin_function (builtin_name, builtin_type, function_code,
3417                               class, library_name_p ? name : NULL, attrs);
3418
3419   if (name != 0 && !flag_no_builtin && !builtin_function_disabled_p (name)
3420       && !(nonansi_p && flag_no_nonansi_builtin))
3421     decl = builtin_function (name, type, function_code, class, NULL, attrs);
3422
3423   return (bdecl != 0 ? bdecl : decl);
3424 }
3425 \f
3426 /* Nonzero if the type T promotes to int.  This is (nearly) the
3427    integral promotions defined in ISO C99 6.3.1.1/2.  */
3428
3429 bool
3430 c_promoting_integer_type_p (tree t)
3431 {
3432   switch (TREE_CODE (t))
3433     {
3434     case INTEGER_TYPE:
3435       return (TYPE_MAIN_VARIANT (t) == char_type_node
3436               || TYPE_MAIN_VARIANT (t) == signed_char_type_node
3437               || TYPE_MAIN_VARIANT (t) == unsigned_char_type_node
3438               || TYPE_MAIN_VARIANT (t) == short_integer_type_node
3439               || TYPE_MAIN_VARIANT (t) == short_unsigned_type_node
3440               || TYPE_PRECISION (t) < TYPE_PRECISION (integer_type_node));
3441
3442     case ENUMERAL_TYPE:
3443       /* ??? Technically all enumerations not larger than an int
3444          promote to an int.  But this is used along code paths
3445          that only want to notice a size change.  */
3446       return TYPE_PRECISION (t) < TYPE_PRECISION (integer_type_node);
3447
3448     case BOOLEAN_TYPE:
3449       return 1;
3450
3451     default:
3452       return 0;
3453     }
3454 }
3455
3456 /* Return 1 if PARMS specifies a fixed number of parameters
3457    and none of their types is affected by default promotions.  */
3458
3459 int
3460 self_promoting_args_p (tree parms)
3461 {
3462   tree t;
3463   for (t = parms; t; t = TREE_CHAIN (t))
3464     {
3465       tree type = TREE_VALUE (t);
3466
3467       if (TREE_CHAIN (t) == 0 && type != void_type_node)
3468         return 0;
3469
3470       if (type == 0)
3471         return 0;
3472
3473       if (TYPE_MAIN_VARIANT (type) == float_type_node)
3474         return 0;
3475
3476       if (c_promoting_integer_type_p (type))
3477         return 0;
3478     }
3479   return 1;
3480 }
3481
3482 /* Recursively examines the array elements of TYPE, until a non-array
3483    element type is found.  */
3484
3485 tree
3486 strip_array_types (tree type)
3487 {
3488   while (TREE_CODE (type) == ARRAY_TYPE)
3489     type = TREE_TYPE (type);
3490
3491   return type;
3492 }
3493
3494 /* Recursively remove any '*' or '&' operator from TYPE.  */
3495 tree
3496 strip_pointer_operator (tree t)
3497 {
3498   while (POINTER_TYPE_P (t))
3499     t = TREE_TYPE (t);
3500   return t;
3501 }
3502
3503 static tree expand_unordered_cmp (tree, tree, enum tree_code, enum tree_code);
3504
3505 /* Expand a call to an unordered comparison function such as
3506    __builtin_isgreater().  FUNCTION is the function's declaration and
3507    PARAMS a list of the values passed.  For __builtin_isunordered(),
3508    UNORDERED_CODE is UNORDERED_EXPR and ORDERED_CODE is NOP_EXPR.  In
3509    other cases, UNORDERED_CODE and ORDERED_CODE are comparison codes
3510    that give the opposite of the desired result.  UNORDERED_CODE is
3511    used for modes that can hold NaNs and ORDERED_CODE is used for the
3512    rest.  */
3513
3514 static tree
3515 expand_unordered_cmp (tree function, tree params,
3516                       enum tree_code unordered_code,
3517                       enum tree_code ordered_code)
3518 {
3519   tree arg0, arg1, type;
3520   enum tree_code code0, code1;
3521
3522   /* Check that we have exactly two arguments.  */
3523   if (params == 0 || TREE_CHAIN (params) == 0)
3524     {
3525       error ("too few arguments to function `%s'",
3526              IDENTIFIER_POINTER (DECL_NAME (function)));
3527       return error_mark_node;
3528     }
3529   else if (TREE_CHAIN (TREE_CHAIN (params)) != 0)
3530     {
3531       error ("too many arguments to function `%s'",
3532              IDENTIFIER_POINTER (DECL_NAME (function)));
3533       return error_mark_node;
3534     }
3535
3536   arg0 = TREE_VALUE (params);
3537   arg1 = TREE_VALUE (TREE_CHAIN (params));
3538
3539   code0 = TREE_CODE (TREE_TYPE (arg0));
3540   code1 = TREE_CODE (TREE_TYPE (arg1));
3541
3542   /* Make sure that the arguments have a common type of REAL.  */
3543   type = 0;
3544   if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3545       && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3546     type = common_type (TREE_TYPE (arg0), TREE_TYPE (arg1));
3547
3548   if (type == 0 || TREE_CODE (type) != REAL_TYPE)
3549     {
3550       error ("non-floating-point argument to function `%s'",
3551              IDENTIFIER_POINTER (DECL_NAME (function)));
3552       return error_mark_node;
3553     }
3554
3555   if (unordered_code == UNORDERED_EXPR)
3556     {
3557       if (MODE_HAS_NANS (TYPE_MODE (type)))
3558         return build_binary_op (unordered_code,
3559                                 convert (type, arg0),
3560                                 convert (type, arg1),
3561                                 0);
3562       else
3563         return integer_zero_node;
3564     }
3565
3566   return build_unary_op (TRUTH_NOT_EXPR,
3567                          build_binary_op (MODE_HAS_NANS (TYPE_MODE (type))
3568                                           ? unordered_code
3569                                           : ordered_code,
3570                                           convert (type, arg0),
3571                                           convert (type, arg1),
3572                                           0),
3573                          0);
3574 }
3575
3576
3577 /* Recognize certain built-in functions so we can make tree-codes
3578    other than CALL_EXPR.  We do this when it enables fold-const.c
3579    to do something useful.  */
3580 /* ??? By rights this should go in builtins.c, but only C and C++
3581    implement build_{binary,unary}_op.  Not exactly sure what bits
3582    of functionality are actually needed from those functions, or
3583    where the similar functionality exists in the other front ends.  */
3584
3585 tree
3586 expand_tree_builtin (tree function, tree params, tree coerced_params)
3587 {
3588   if (DECL_BUILT_IN_CLASS (function) != BUILT_IN_NORMAL)
3589     return NULL_TREE;
3590
3591   switch (DECL_FUNCTION_CODE (function))
3592     {
3593     case BUILT_IN_ABS:
3594     case BUILT_IN_LABS:
3595     case BUILT_IN_LLABS:
3596     case BUILT_IN_IMAXABS:
3597     case BUILT_IN_FABS:
3598     case BUILT_IN_FABSL:
3599     case BUILT_IN_FABSF:
3600       if (coerced_params == 0)
3601         return integer_zero_node;
3602       return build_unary_op (ABS_EXPR, TREE_VALUE (coerced_params), 0);
3603
3604     case BUILT_IN_CONJ:
3605     case BUILT_IN_CONJF:
3606     case BUILT_IN_CONJL:
3607       if (coerced_params == 0)
3608         return integer_zero_node;
3609       return build_unary_op (CONJ_EXPR, TREE_VALUE (coerced_params), 0);
3610
3611     case BUILT_IN_CREAL:
3612     case BUILT_IN_CREALF:
3613     case BUILT_IN_CREALL:
3614       if (coerced_params == 0)
3615         return integer_zero_node;
3616       return non_lvalue (build_unary_op (REALPART_EXPR,
3617                                          TREE_VALUE (coerced_params), 0));
3618
3619     case BUILT_IN_CIMAG:
3620     case BUILT_IN_CIMAGF:
3621     case BUILT_IN_CIMAGL:
3622       if (coerced_params == 0)
3623         return integer_zero_node;
3624       return non_lvalue (build_unary_op (IMAGPART_EXPR,
3625                                          TREE_VALUE (coerced_params), 0));
3626
3627     case BUILT_IN_ISGREATER:
3628       return expand_unordered_cmp (function, params, UNLE_EXPR, LE_EXPR);
3629
3630     case BUILT_IN_ISGREATEREQUAL:
3631       return expand_unordered_cmp (function, params, UNLT_EXPR, LT_EXPR);
3632
3633     case BUILT_IN_ISLESS:
3634       return expand_unordered_cmp (function, params, UNGE_EXPR, GE_EXPR);
3635
3636     case BUILT_IN_ISLESSEQUAL:
3637       return expand_unordered_cmp (function, params, UNGT_EXPR, GT_EXPR);
3638
3639     case BUILT_IN_ISLESSGREATER:
3640       return expand_unordered_cmp (function, params, UNEQ_EXPR, EQ_EXPR);
3641
3642     case BUILT_IN_ISUNORDERED:
3643       return expand_unordered_cmp (function, params, UNORDERED_EXPR, NOP_EXPR);
3644
3645     default:
3646       break;
3647     }
3648
3649   return NULL_TREE;
3650 }
3651
3652 /* Walk the statement tree, rooted at *tp.  Apply FUNC to all the
3653    sub-trees of *TP in a pre-order traversal.  FUNC is called with the
3654    DATA and the address of each sub-tree.  If FUNC returns a non-NULL
3655    value, the traversal is aborted, and the value returned by FUNC is
3656    returned.  If FUNC sets WALK_SUBTREES to zero, then the subtrees of
3657    the node being visited are not walked.
3658
3659    We don't need a without_duplicates variant of this one because the
3660    statement tree is a tree, not a graph.  */
3661
3662 tree
3663 walk_stmt_tree (tree *tp, walk_tree_fn func, void *data)
3664 {
3665   enum tree_code code;
3666   int walk_subtrees;
3667   tree result;
3668   int i, len;
3669
3670 #define WALK_SUBTREE(NODE)                              \
3671   do                                                    \
3672     {                                                   \
3673       result = walk_stmt_tree (&(NODE), func, data);    \
3674       if (result)                                       \
3675         return result;                                  \
3676     }                                                   \
3677   while (0)
3678
3679   /* Skip empty subtrees.  */
3680   if (!*tp)
3681     return NULL_TREE;
3682
3683   /* Skip subtrees below non-statement nodes.  */
3684   if (!STATEMENT_CODE_P (TREE_CODE (*tp)))
3685     return NULL_TREE;
3686
3687   /* Call the function.  */
3688   walk_subtrees = 1;
3689   result = (*func) (tp, &walk_subtrees, data);
3690
3691   /* If we found something, return it.  */
3692   if (result)
3693     return result;
3694
3695   /* FUNC may have modified the tree, recheck that we're looking at a
3696      statement node.  */
3697   code = TREE_CODE (*tp);
3698   if (!STATEMENT_CODE_P (code))
3699     return NULL_TREE;
3700
3701   /* Visit the subtrees unless FUNC decided that there was nothing
3702      interesting below this point in the tree.  */
3703   if (walk_subtrees)
3704     {
3705       /* Walk over all the sub-trees of this operand.  Statement nodes
3706          never contain RTL, and we needn't worry about TARGET_EXPRs.  */
3707       len = TREE_CODE_LENGTH (code);
3708
3709       /* Go through the subtrees.  We need to do this in forward order so
3710          that the scope of a FOR_EXPR is handled properly.  */
3711       for (i = 0; i < len; ++i)
3712         WALK_SUBTREE (TREE_OPERAND (*tp, i));
3713     }
3714
3715   /* Finally visit the chain.  This can be tail-recursion optimized if
3716      we write it this way.  */
3717   return walk_stmt_tree (&TREE_CHAIN (*tp), func, data);
3718
3719 #undef WALK_SUBTREE
3720 }
3721
3722 /* Used to compare case labels.  K1 and K2 are actually tree nodes
3723    representing case labels, or NULL_TREE for a `default' label.
3724    Returns -1 if K1 is ordered before K2, -1 if K1 is ordered after
3725    K2, and 0 if K1 and K2 are equal.  */
3726
3727 int
3728 case_compare (splay_tree_key k1, splay_tree_key k2)
3729 {
3730   /* Consider a NULL key (such as arises with a `default' label) to be
3731      smaller than anything else.  */
3732   if (!k1)
3733     return k2 ? -1 : 0;
3734   else if (!k2)
3735     return k1 ? 1 : 0;
3736
3737   return tree_int_cst_compare ((tree) k1, (tree) k2);
3738 }
3739
3740 /* Process a case label for the range LOW_VALUE ... HIGH_VALUE.  If
3741    LOW_VALUE and HIGH_VALUE are both NULL_TREE then this case label is
3742    actually a `default' label.  If only HIGH_VALUE is NULL_TREE, then
3743    case label was declared using the usual C/C++ syntax, rather than
3744    the GNU case range extension.  CASES is a tree containing all the
3745    case ranges processed so far; COND is the condition for the
3746    switch-statement itself.  Returns the CASE_LABEL_EXPR created, or
3747    ERROR_MARK_NODE if no CASE_LABEL_EXPR is created.  */
3748
3749 tree
3750 c_add_case_label (splay_tree cases, tree cond, tree low_value,
3751                   tree high_value)
3752 {
3753   tree type;
3754   tree label;
3755   tree case_label;
3756   splay_tree_node node;
3757
3758   /* Create the LABEL_DECL itself.  */
3759   label = create_artificial_label ();
3760
3761   /* If there was an error processing the switch condition, bail now
3762      before we get more confused.  */
3763   if (!cond || cond == error_mark_node)
3764     goto error_out;
3765
3766   if ((low_value && TREE_TYPE (low_value)
3767        && POINTER_TYPE_P (TREE_TYPE (low_value)))
3768       || (high_value && TREE_TYPE (high_value)
3769           && POINTER_TYPE_P (TREE_TYPE (high_value))))
3770     error ("pointers are not permitted as case values");
3771
3772   /* Case ranges are a GNU extension.  */
3773   if (high_value && pedantic)
3774     pedwarn ("range expressions in switch statements are non-standard");
3775
3776   type = TREE_TYPE (cond);
3777   if (low_value)
3778     {
3779       low_value = check_case_value (low_value);
3780       low_value = convert_and_check (type, low_value);
3781     }
3782   if (high_value)
3783     {
3784       high_value = check_case_value (high_value);
3785       high_value = convert_and_check (type, high_value);
3786     }
3787
3788   /* If an error has occurred, bail out now.  */
3789   if (low_value == error_mark_node || high_value == error_mark_node)
3790     goto error_out;
3791
3792   /* If the LOW_VALUE and HIGH_VALUE are the same, then this isn't
3793      really a case range, even though it was written that way.  Remove
3794      the HIGH_VALUE to simplify later processing.  */
3795   if (tree_int_cst_equal (low_value, high_value))
3796     high_value = NULL_TREE;
3797   if (low_value && high_value
3798       && !tree_int_cst_lt (low_value, high_value))
3799     warning ("empty range specified");
3800
3801   /* Look up the LOW_VALUE in the table of case labels we already
3802      have.  */
3803   node = splay_tree_lookup (cases, (splay_tree_key) low_value);
3804   /* If there was not an exact match, check for overlapping ranges.
3805      There's no need to do this if there's no LOW_VALUE or HIGH_VALUE;
3806      that's a `default' label and the only overlap is an exact match.  */
3807   if (!node && (low_value || high_value))
3808     {
3809       splay_tree_node low_bound;
3810       splay_tree_node high_bound;
3811
3812       /* Even though there wasn't an exact match, there might be an
3813          overlap between this case range and another case range.
3814          Since we've (inductively) not allowed any overlapping case
3815          ranges, we simply need to find the greatest low case label
3816          that is smaller that LOW_VALUE, and the smallest low case
3817          label that is greater than LOW_VALUE.  If there is an overlap
3818          it will occur in one of these two ranges.  */
3819       low_bound = splay_tree_predecessor (cases,
3820                                           (splay_tree_key) low_value);
3821       high_bound = splay_tree_successor (cases,
3822                                          (splay_tree_key) low_value);
3823
3824       /* Check to see if the LOW_BOUND overlaps.  It is smaller than
3825          the LOW_VALUE, so there is no need to check unless the
3826          LOW_BOUND is in fact itself a case range.  */
3827       if (low_bound
3828           && CASE_HIGH ((tree) low_bound->value)
3829           && tree_int_cst_compare (CASE_HIGH ((tree) low_bound->value),
3830                                     low_value) >= 0)
3831         node = low_bound;
3832       /* Check to see if the HIGH_BOUND overlaps.  The low end of that
3833          range is bigger than the low end of the current range, so we
3834          are only interested if the current range is a real range, and
3835          not an ordinary case label.  */
3836       else if (high_bound
3837                && high_value
3838                && (tree_int_cst_compare ((tree) high_bound->key,
3839                                          high_value)
3840                    <= 0))
3841         node = high_bound;
3842     }
3843   /* If there was an overlap, issue an error.  */
3844   if (node)
3845     {
3846       tree duplicate = CASE_LABEL ((tree) node->value);
3847
3848       if (high_value)
3849         {
3850           error ("duplicate (or overlapping) case value");
3851           error ("%Jthis is the first entry overlapping that value", duplicate);
3852         }
3853       else if (low_value)
3854         {
3855           error ("duplicate case value") ;
3856           error ("%Jpreviously used here", duplicate);
3857         }
3858       else
3859         {
3860           error ("multiple default labels in one switch");
3861           error ("%Jthis is the first default label", duplicate);
3862         }
3863       goto error_out;
3864     }
3865
3866   /* Add a CASE_LABEL to the statement-tree.  */
3867   case_label = add_stmt (build_case_label (low_value, high_value, label));
3868   /* Register this case label in the splay tree.  */
3869   splay_tree_insert (cases,
3870                      (splay_tree_key) low_value,
3871                      (splay_tree_value) case_label);
3872
3873   return case_label;
3874
3875  error_out:
3876   /* Add a label so that the back-end doesn't think that the beginning of
3877      the switch is unreachable.  Note that we do not add a case label, as
3878      that just leads to duplicates and thence to aborts later on.  */
3879   if (!cases->root)
3880     {
3881       tree t = create_artificial_label ();
3882       add_stmt (build_stmt (LABEL_EXPR, t));
3883     }
3884   return error_mark_node;
3885 }
3886
3887 /* Subroutines of c_do_switch_warnings, called via splay_tree_foreach.
3888    Used to verify that case values match up with enumerator values.  */
3889
3890 static void
3891 match_case_to_enum_1 (tree key, tree type, tree label)
3892 {
3893   char buf[2 + 2*HOST_BITS_PER_WIDE_INT/4 + 1];
3894
3895   /* ??? Not working too hard to print the double-word value.
3896      Should perhaps be done with %lwd in the diagnostic routines?  */
3897   if (TREE_INT_CST_HIGH (key) == 0)
3898     snprintf (buf, sizeof (buf), HOST_WIDE_INT_PRINT_UNSIGNED,
3899               TREE_INT_CST_LOW (key));
3900   else if (!TYPE_UNSIGNED (type)
3901            && TREE_INT_CST_HIGH (key) == -1
3902            && TREE_INT_CST_LOW (key) != 0)
3903     snprintf (buf, sizeof (buf), "-" HOST_WIDE_INT_PRINT_UNSIGNED,
3904               -TREE_INT_CST_LOW (key));
3905   else
3906     snprintf (buf, sizeof (buf), HOST_WIDE_INT_PRINT_DOUBLE_HEX,
3907               TREE_INT_CST_HIGH (key), TREE_INT_CST_LOW (key));
3908
3909   if (TYPE_NAME (type) == 0)
3910     warning ("%Jcase value `%s' not in enumerated type",
3911              CASE_LABEL (label), buf);
3912   else
3913     warning ("%Jcase value `%s' not in enumerated type `%T'",
3914              CASE_LABEL (label), buf, type);
3915 }
3916
3917 static int
3918 match_case_to_enum (splay_tree_node node, void *data)
3919 {
3920   tree label = (tree) node->value;
3921   tree type = data;
3922
3923   /* Skip default case.  */
3924   if (!CASE_LOW (label))
3925     return 0;
3926
3927   /* If TREE_ADDRESSABLE is not set, that means CASE_LOW did not appear
3928      when we did our enum->case scan.  Reset our scratch bit after.  */
3929   if (!TREE_ADDRESSABLE (label))
3930     match_case_to_enum_1 (CASE_LOW (label), type, label);
3931   else
3932     TREE_ADDRESSABLE (label) = 0;
3933
3934   /* If CASE_HIGH is non-null, we have a range.  Here we must search.
3935      Note that the old code in stmt.c did not check for the values in
3936      the range either, just the endpoints.  */
3937   if (CASE_HIGH (label))
3938     {
3939       tree chain, key = CASE_HIGH (label);
3940
3941       for (chain = TYPE_VALUES (type);
3942            chain && !tree_int_cst_equal (key, TREE_VALUE (chain));
3943            chain = TREE_CHAIN (chain))
3944         continue;
3945       if (!chain)
3946         match_case_to_enum_1 (key, type, label);
3947     }
3948
3949   return 0;
3950 }
3951
3952 /* Handle -Wswitch*.  Called from the front end after parsing the switch
3953    construct.  */
3954 /* ??? Should probably be somewhere generic, since other languages besides
3955    C and C++ would want this.  We'd want to agree on the datastructure,
3956    however, which is a problem.  Alternately, we operate on gimplified
3957    switch_exprs, which I don't especially like.  At the moment, however,
3958    C/C++ are the only tree-ssa languages that support enumerations at all,
3959    so the point is moot.  */
3960
3961 void
3962 c_do_switch_warnings (splay_tree cases, tree switch_stmt)
3963 {
3964   splay_tree_node default_node;  
3965   location_t *switch_locus;
3966   tree type;
3967
3968   if (!warn_switch && !warn_switch_enum && !warn_switch_default)
3969     return;
3970
3971   switch_locus = EXPR_LOCUS (switch_stmt);
3972   if (!switch_locus)
3973     switch_locus = &input_location;
3974   type = SWITCH_TYPE (switch_stmt);
3975
3976   default_node = splay_tree_lookup (cases, (splay_tree_key) NULL);
3977   if (warn_switch_default && !default_node)
3978     warning ("%Hswitch missing default case", switch_locus);
3979
3980   /* If the switch expression was an enumerated type, check that
3981      exactly all enumeration literals are covered by the cases.
3982      The check is made when -Wswitch was specified and there is no
3983      default case, or when -Wswitch-enum was specified.  */
3984   if (((warn_switch && !default_node) || warn_switch_enum)
3985       && type && TREE_CODE (type) == ENUMERAL_TYPE
3986       && TREE_CODE (SWITCH_COND (switch_stmt)) != INTEGER_CST)
3987     {
3988       tree chain;
3989
3990       /* The time complexity here is O(N*lg(N)) worst case, but for the
3991          common case of monotonically increasing enumerators, it is 
3992          O(N), since the nature of the splay tree will keep the next
3993          element adjacent to the root at all times.  */
3994
3995       for (chain = TYPE_VALUES (type); chain; chain = TREE_CHAIN (chain))
3996         {
3997           splay_tree_node node
3998             = splay_tree_lookup (cases, (splay_tree_key) TREE_VALUE (chain));
3999
4000           if (node)
4001             {
4002               /* Mark the CASE_LOW part of the case entry as seen, so
4003                  that we save time later.  Choose TREE_ADDRESSABLE 
4004                  randomly as a bit that won't have been set to-date.  */
4005               tree label = (tree) node->value;
4006               TREE_ADDRESSABLE (label) = 1;
4007             }
4008           else
4009             {
4010               /* Warn if there are enumerators that don't correspond to
4011                  case expressions.  */
4012               warning ("%Henumeration value `%E' not handled in switch",
4013                        switch_locus, TREE_PURPOSE (chain));
4014             }
4015         }
4016
4017       /* Warn if there are case expressions that don't correspond to
4018          enumerators.  This can occur since C and C++ don't enforce
4019          type-checking of assignments to enumeration variables.
4020
4021          The time complexity here is O(N**2) worst case, since we've
4022          not sorted the enumeration values.  However, in the absence
4023          of case ranges this is O(N), since all single cases that 
4024          corresponded to enumerations have been marked above.  */
4025
4026       splay_tree_foreach (cases, match_case_to_enum, type);
4027     }
4028 }
4029
4030 /* Finish an expression taking the address of LABEL (an
4031    IDENTIFIER_NODE).  Returns an expression for the address.  */
4032
4033 tree
4034 finish_label_address_expr (tree label)
4035 {
4036   tree result;
4037
4038   if (pedantic)
4039     pedwarn ("taking the address of a label is non-standard");
4040
4041   if (label == error_mark_node)
4042     return error_mark_node;
4043
4044   label = lookup_label (label);
4045   if (label == NULL_TREE)
4046     result = null_pointer_node;
4047   else
4048     {
4049       TREE_USED (label) = 1;
4050       result = build1 (ADDR_EXPR, ptr_type_node, label);
4051       /* The current function in not necessarily uninlinable.
4052          Computed gotos are incompatible with inlining, but the value
4053          here could be used only in a diagnostic, for example.  */
4054     }
4055
4056   return result;
4057 }
4058
4059 /* Hook used by expand_expr to expand language-specific tree codes.  */
4060 /* The only things that should go here are bits needed to expand 
4061    constant initializers.  Everything else should be handled by the
4062    gimplification routines.  */
4063
4064 rtx
4065 c_expand_expr (tree exp, rtx target, enum machine_mode tmode, 
4066                int modifier /* Actually enum_modifier.  */,
4067                rtx *alt_rtl)
4068 {
4069   switch (TREE_CODE (exp))
4070     {
4071     case COMPOUND_LITERAL_EXPR:
4072       {
4073         /* Initialize the anonymous variable declared in the compound
4074            literal, then return the variable.  */
4075         tree decl = COMPOUND_LITERAL_EXPR_DECL (exp);
4076         emit_local_var (decl);
4077         return expand_expr_real (decl, target, tmode, modifier, alt_rtl);
4078       }
4079
4080     default:
4081       abort ();
4082     }
4083 }
4084
4085 /* Hook used by safe_from_p to handle language-specific tree codes.  */
4086
4087 int
4088 c_safe_from_p (rtx target, tree exp)
4089 {
4090   /* We can see statements here when processing the body of a
4091      statement-expression.  For a declaration statement declaring a
4092      variable, look at the variable's initializer.  */
4093   if (TREE_CODE (exp) == DECL_STMT)
4094     {
4095       tree decl = DECL_STMT_DECL (exp);
4096
4097       if (TREE_CODE (decl) == VAR_DECL
4098           && DECL_INITIAL (decl)
4099           && !safe_from_p (target, DECL_INITIAL (decl), /*top_p=*/0))
4100         return 0;
4101     }
4102
4103   /* Assume everything else is safe.  */
4104   return 1;
4105 }
4106
4107 /* Hook used by unsafe_for_reeval to handle language-specific tree codes.  */
4108
4109 int
4110 c_common_unsafe_for_reeval (tree exp)
4111 {
4112   /* Statement expressions may not be reevaluated, likewise compound
4113      literals.  */
4114   if (TREE_CODE (exp) == STMT_EXPR
4115       || TREE_CODE (exp) == COMPOUND_LITERAL_EXPR)
4116     return 2;
4117
4118   /* Walk all other expressions.  */
4119   return -1;
4120 }
4121
4122 /* Hook used by staticp to handle language-specific tree codes.  */
4123
4124 int
4125 c_staticp (tree exp)
4126 {
4127   if (TREE_CODE (exp) == COMPOUND_LITERAL_EXPR
4128       && TREE_STATIC (COMPOUND_LITERAL_EXPR_DECL (exp)))
4129     return 1;
4130   return 0;
4131 }
4132 \f
4133
4134 /* Given a boolean expression ARG, return a tree representing an increment
4135    or decrement (as indicated by CODE) of ARG.  The front end must check for
4136    invalid cases (e.g., decrement in C++).  */
4137 tree
4138 boolean_increment (enum tree_code code, tree arg)
4139 {
4140   tree val;
4141   tree true_res = boolean_true_node;
4142
4143   arg = stabilize_reference (arg);
4144   switch (code)
4145     {
4146     case PREINCREMENT_EXPR:
4147       val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, true_res);
4148       break;
4149     case POSTINCREMENT_EXPR:
4150       val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, true_res);
4151       arg = save_expr (arg);
4152       val = build (COMPOUND_EXPR, TREE_TYPE (arg), val, arg);
4153       val = build (COMPOUND_EXPR, TREE_TYPE (arg), arg, val);
4154       break;
4155     case PREDECREMENT_EXPR:
4156       val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, invert_truthvalue (arg));
4157       break;
4158     case POSTDECREMENT_EXPR:
4159       val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, invert_truthvalue (arg));
4160       arg = save_expr (arg);
4161       val = build (COMPOUND_EXPR, TREE_TYPE (arg), val, arg);
4162       val = build (COMPOUND_EXPR, TREE_TYPE (arg), arg, val);
4163       break;
4164     default:
4165       abort ();
4166     }
4167   TREE_SIDE_EFFECTS (val) = 1;
4168   return val;
4169 }
4170 \f
4171 /* Built-in macros for stddef.h, that require macros defined in this
4172    file.  */
4173 void
4174 c_stddef_cpp_builtins(void)
4175 {
4176   builtin_define_with_value ("__SIZE_TYPE__", SIZE_TYPE, 0);
4177   builtin_define_with_value ("__PTRDIFF_TYPE__", PTRDIFF_TYPE, 0);
4178   builtin_define_with_value ("__WCHAR_TYPE__", MODIFIED_WCHAR_TYPE, 0);
4179   builtin_define_with_value ("__WINT_TYPE__", WINT_TYPE, 0);
4180 }
4181
4182 static void
4183 c_init_attributes (void)
4184 {
4185   /* Fill in the built_in_attributes array.  */
4186 #define DEF_ATTR_NULL_TREE(ENUM)                \
4187   built_in_attributes[(int) ENUM] = NULL_TREE;
4188 #define DEF_ATTR_INT(ENUM, VALUE)                                            \
4189   built_in_attributes[(int) ENUM] = build_int_2 (VALUE, VALUE < 0 ? -1 : 0);
4190 #define DEF_ATTR_IDENT(ENUM, STRING)                            \
4191   built_in_attributes[(int) ENUM] = get_identifier (STRING);
4192 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) \
4193   built_in_attributes[(int) ENUM]                       \
4194     = tree_cons (built_in_attributes[(int) PURPOSE],    \
4195                  built_in_attributes[(int) VALUE],      \
4196                  built_in_attributes[(int) CHAIN]);
4197 #include "builtin-attrs.def"
4198 #undef DEF_ATTR_NULL_TREE
4199 #undef DEF_ATTR_INT
4200 #undef DEF_ATTR_IDENT
4201 #undef DEF_ATTR_TREE_LIST
4202 }
4203
4204 /* Attribute handlers common to C front ends.  */
4205
4206 /* Handle a "packed" attribute; arguments as in
4207    struct attribute_spec.handler.  */
4208
4209 static tree
4210 handle_packed_attribute (tree *node, tree name, tree args  ATTRIBUTE_UNUSED,
4211                          int flags, bool *no_add_attrs)
4212 {
4213   if (TYPE_P (*node))
4214     {
4215       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
4216         *node = build_type_copy (*node);
4217       TYPE_PACKED (*node) = 1;
4218       if (TYPE_MAIN_VARIANT (*node) == *node)
4219         {
4220           /* If it is the main variant, then pack the other variants
4221              too. This happens in,
4222              
4223              struct Foo {
4224                struct Foo const *ptr; // creates a variant w/o packed flag
4225                } __ attribute__((packed)); // packs it now.
4226           */
4227           tree probe;
4228           
4229           for (probe = *node; probe; probe = TYPE_NEXT_VARIANT (probe))
4230             TYPE_PACKED (probe) = 1;
4231         }
4232       
4233     }
4234   else if (TREE_CODE (*node) == FIELD_DECL)
4235     DECL_PACKED (*node) = 1;
4236   /* We can't set DECL_PACKED for a VAR_DECL, because the bit is
4237      used for DECL_REGISTER.  It wouldn't mean anything anyway.
4238      We can't set DECL_PACKED on the type of a TYPE_DECL, because
4239      that changes what the typedef is typing.  */
4240   else
4241     {
4242       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4243       *no_add_attrs = true;
4244     }
4245
4246   return NULL_TREE;
4247 }
4248
4249 /* Handle a "nocommon" attribute; arguments as in
4250    struct attribute_spec.handler.  */
4251
4252 static tree
4253 handle_nocommon_attribute (tree *node, tree name,
4254                            tree args ATTRIBUTE_UNUSED,
4255                            int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
4256 {
4257   if (TREE_CODE (*node) == VAR_DECL)
4258     DECL_COMMON (*node) = 0;
4259   else
4260     {
4261       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4262       *no_add_attrs = true;
4263     }
4264
4265   return NULL_TREE;
4266 }
4267
4268 /* Handle a "common" attribute; arguments as in
4269    struct attribute_spec.handler.  */
4270
4271 static tree
4272 handle_common_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED,
4273                          int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
4274 {
4275   if (TREE_CODE (*node) == VAR_DECL)
4276     DECL_COMMON (*node) = 1;
4277   else
4278     {
4279       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4280       *no_add_attrs = true;
4281     }
4282
4283   return NULL_TREE;
4284 }
4285
4286 /* Handle a "noreturn" attribute; arguments as in
4287    struct attribute_spec.handler.  */
4288
4289 static tree
4290 handle_noreturn_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED,
4291                            int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
4292 {
4293   tree type = TREE_TYPE (*node);
4294
4295   /* See FIXME comment in c_common_attribute_table.  */
4296   if (TREE_CODE (*node) == FUNCTION_DECL)
4297     TREE_THIS_VOLATILE (*node) = 1;
4298   else if (TREE_CODE (type) == POINTER_TYPE
4299            && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
4300     TREE_TYPE (*node)
4301       = build_pointer_type
4302         (build_type_variant (TREE_TYPE (type),
4303                              TYPE_READONLY (TREE_TYPE (type)), 1));
4304   else
4305     {
4306       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4307       *no_add_attrs = true;
4308     }
4309
4310   return NULL_TREE;
4311 }
4312
4313 /* Handle a "noinline" attribute; arguments as in
4314    struct attribute_spec.handler.  */
4315
4316 static tree
4317 handle_noinline_attribute (tree *node, tree name,
4318                            tree args ATTRIBUTE_UNUSED,
4319                            int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
4320 {
4321   if (TREE_CODE (*node) == FUNCTION_DECL)
4322     DECL_UNINLINABLE (*node) = 1;
4323   else
4324     {
4325       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4326       *no_add_attrs = true;
4327     }
4328
4329   return NULL_TREE;
4330 }
4331
4332 /* Handle a "always_inline" attribute; arguments as in
4333    struct attribute_spec.handler.  */
4334
4335 static tree
4336 handle_always_inline_attribute (tree *node, tree name,
4337                                 tree args ATTRIBUTE_UNUSED,
4338                                 int flags ATTRIBUTE_UNUSED,
4339                                 bool *no_add_attrs)
4340 {
4341   if (TREE_CODE (*node) == FUNCTION_DECL)
4342     {
4343       /* Do nothing else, just set the attribute.  We'll get at
4344          it later with lookup_attribute.  */
4345     }
4346   else
4347     {
4348       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4349       *no_add_attrs = true;
4350     }
4351
4352   return NULL_TREE;
4353 }
4354
4355 /* Handle a "used" attribute; arguments as in
4356    struct attribute_spec.handler.  */
4357
4358 static tree
4359 handle_used_attribute (tree *pnode, tree name, tree args ATTRIBUTE_UNUSED,
4360                        int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
4361 {
4362   tree node = *pnode;
4363
4364   if (TREE_CODE (node) == FUNCTION_DECL
4365       || (TREE_CODE (node) == VAR_DECL && TREE_STATIC (node)))
4366     {
4367       TREE_USED (node) = 1;
4368     }
4369   else
4370     {
4371       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4372       *no_add_attrs = true;
4373     }
4374
4375   return NULL_TREE;
4376 }
4377
4378 /* Handle a "unused" attribute; arguments as in
4379    struct attribute_spec.handler.  */
4380
4381 static tree
4382 handle_unused_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED,
4383                          int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
4384 {
4385   if (DECL_P (*node))
4386     {
4387       tree decl = *node;
4388
4389       if (TREE_CODE (decl) == PARM_DECL
4390           || TREE_CODE (decl) == VAR_DECL
4391           || TREE_CODE (decl) == FUNCTION_DECL
4392           || TREE_CODE (decl) == LABEL_DECL
4393           || TREE_CODE (decl) == TYPE_DECL)
4394         TREE_USED (decl) = 1;
4395       else
4396         {
4397           warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4398           *no_add_attrs = true;
4399         }
4400     }
4401   else
4402     {
4403       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
4404         *node = build_type_copy (*node);
4405       TREE_USED (*node) = 1;
4406     }
4407
4408   return NULL_TREE;
4409 }
4410
4411 /* Handle a "const" attribute; arguments as in
4412    struct attribute_spec.handler.  */
4413
4414 static tree
4415 handle_const_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED,
4416                         int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
4417 {
4418   tree type = TREE_TYPE (*node);
4419
4420   /* See FIXME comment on noreturn in c_common_attribute_table.  */
4421   if (TREE_CODE (*node) == FUNCTION_DECL)
4422     TREE_READONLY (*node) = 1;
4423   else if (TREE_CODE (type) == POINTER_TYPE
4424            && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
4425     TREE_TYPE (*node)
4426       = build_pointer_type
4427         (build_type_variant (TREE_TYPE (type), 1,
4428                              TREE_THIS_VOLATILE (TREE_TYPE (type))));
4429   else
4430     {
4431       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4432       *no_add_attrs = true;
4433     }
4434
4435   return NULL_TREE;
4436 }
4437
4438 /* Handle a "transparent_union" attribute; arguments as in
4439    struct attribute_spec.handler.  */
4440
4441 static tree
4442 handle_transparent_union_attribute (tree *node, tree name,
4443                                     tree args ATTRIBUTE_UNUSED, int flags,
4444                                     bool *no_add_attrs)
4445 {
4446   tree decl = NULL_TREE;
4447   tree *type = NULL;
4448   int is_type = 0;
4449
4450   if (DECL_P (*node))
4451     {
4452       decl = *node;
4453       type = &TREE_TYPE (decl);
4454       is_type = TREE_CODE (*node) == TYPE_DECL;
4455     }
4456   else if (TYPE_P (*node))
4457     type = node, is_type = 1;
4458
4459   if (is_type
4460       && TREE_CODE (*type) == UNION_TYPE
4461       && (decl == 0
4462           || (TYPE_FIELDS (*type) != 0
4463               && TYPE_MODE (*type) == DECL_MODE (TYPE_FIELDS (*type)))))
4464     {
4465       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
4466         *type = build_type_copy (*type);
4467       TYPE_TRANSPARENT_UNION (*type) = 1;
4468     }
4469   else if (decl != 0 && TREE_CODE (decl) == PARM_DECL
4470            && TREE_CODE (*type) == UNION_TYPE
4471            && TYPE_MODE (*type) == DECL_MODE (TYPE_FIELDS (*type)))
4472     DECL_TRANSPARENT_UNION (decl) = 1;
4473   else
4474     {
4475       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4476       *no_add_attrs = true;
4477     }
4478
4479   return NULL_TREE;
4480 }
4481
4482 /* Handle a "constructor" attribute; arguments as in
4483    struct attribute_spec.handler.  */
4484
4485 static tree
4486 handle_constructor_attribute (tree *node, tree name,
4487                               tree args ATTRIBUTE_UNUSED,
4488                               int flags ATTRIBUTE_UNUSED,
4489                               bool *no_add_attrs)
4490 {
4491   tree decl = *node;
4492   tree type = TREE_TYPE (decl);
4493
4494   if (TREE_CODE (decl) == FUNCTION_DECL
4495       && TREE_CODE (type) == FUNCTION_TYPE
4496       && decl_function_context (decl) == 0)
4497     {
4498       DECL_STATIC_CONSTRUCTOR (decl) = 1;
4499       TREE_USED (decl) = 1;
4500     }
4501   else
4502     {
4503       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4504       *no_add_attrs = true;
4505     }
4506
4507   return NULL_TREE;
4508 }
4509
4510 /* Handle a "destructor" attribute; arguments as in
4511    struct attribute_spec.handler.  */
4512
4513 static tree
4514 handle_destructor_attribute (tree *node, tree name,
4515                              tree args ATTRIBUTE_UNUSED,
4516                              int flags ATTRIBUTE_UNUSED,
4517                              bool *no_add_attrs)
4518 {
4519   tree decl = *node;
4520   tree type = TREE_TYPE (decl);
4521
4522   if (TREE_CODE (decl) == FUNCTION_DECL
4523       && TREE_CODE (type) == FUNCTION_TYPE
4524       && decl_function_context (decl) == 0)
4525     {
4526       DECL_STATIC_DESTRUCTOR (decl) = 1;
4527       TREE_USED (decl) = 1;
4528     }
4529   else
4530     {
4531       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4532       *no_add_attrs = true;
4533     }
4534
4535   return NULL_TREE;
4536 }
4537
4538 /* Handle a "mode" attribute; arguments as in
4539    struct attribute_spec.handler.  */
4540
4541 static tree
4542 handle_mode_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED,
4543                        int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
4544 {
4545   tree type = *node;
4546
4547   *no_add_attrs = true;
4548
4549   if (TREE_CODE (TREE_VALUE (args)) != IDENTIFIER_NODE)
4550     warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4551   else
4552     {
4553       int j;
4554       const char *p = IDENTIFIER_POINTER (TREE_VALUE (args));
4555       int len = strlen (p);
4556       enum machine_mode mode = VOIDmode;
4557       tree typefm;
4558       tree ptr_type;
4559
4560       if (len > 4 && p[0] == '_' && p[1] == '_'
4561           && p[len - 1] == '_' && p[len - 2] == '_')
4562         {
4563           char *newp = alloca (len - 1);
4564
4565           strcpy (newp, &p[2]);
4566           newp[len - 4] = '\0';
4567           p = newp;
4568         }
4569
4570       /* Change this type to have a type with the specified mode.
4571          First check for the special modes.  */
4572       if (! strcmp (p, "byte"))
4573         mode = byte_mode;
4574       else if (!strcmp (p, "word"))
4575         mode = word_mode;
4576       else if (! strcmp (p, "pointer"))
4577         mode = ptr_mode;
4578       else
4579         for (j = 0; j < NUM_MACHINE_MODES; j++)
4580           if (!strcmp (p, GET_MODE_NAME (j)))
4581             mode = (enum machine_mode) j;
4582
4583       if (mode == VOIDmode)
4584         {
4585           error ("unknown machine mode `%s'", p);
4586           return NULL_TREE;
4587         }
4588
4589       if (VECTOR_MODE_P (mode))
4590         {
4591           warning ("specifying vector types with __attribute__ ((mode)) "
4592                    "is deprecated");
4593           warning ("use __attribute__ ((vector_size)) instead");
4594         }
4595
4596       typefm = lang_hooks.types.type_for_mode (mode, TYPE_UNSIGNED (type));
4597       if (typefm == NULL_TREE)
4598         error ("no data type for mode `%s'", p);
4599
4600       else if ((TREE_CODE (type) == POINTER_TYPE
4601                 || TREE_CODE (type) == REFERENCE_TYPE)
4602                && !targetm.valid_pointer_mode (mode))
4603         error ("invalid pointer mode `%s'", p);
4604       else
4605         {
4606           /* If this is a vector, make sure we either have hardware
4607              support, or we can emulate it.  */
4608           if (VECTOR_MODE_P (mode) && !vector_mode_valid_p (mode))
4609             {
4610               error ("unable to emulate '%s'", GET_MODE_NAME (mode));
4611               return NULL_TREE;
4612             }
4613
4614           if (TREE_CODE (type) == POINTER_TYPE)
4615             {
4616               ptr_type = build_pointer_type_for_mode (TREE_TYPE (type),
4617                                                       mode, false);
4618               *node = ptr_type;
4619             }
4620           else if (TREE_CODE (type) == REFERENCE_TYPE)
4621             {
4622               ptr_type = build_reference_type_for_mode (TREE_TYPE (type),
4623                                                         mode, false);
4624               *node = ptr_type;
4625             }
4626           else
4627             *node = typefm;
4628           /* No need to layout the type here.  The caller should do this.  */
4629         }
4630     }
4631
4632   return NULL_TREE;
4633 }
4634
4635 /* Handle a "section" attribute; arguments as in
4636    struct attribute_spec.handler.  */
4637
4638 static tree
4639 handle_section_attribute (tree *node, tree name ATTRIBUTE_UNUSED, tree args,
4640                           int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
4641 {
4642   tree decl = *node;
4643
4644   if (targetm.have_named_sections)
4645     {
4646       if ((TREE_CODE (decl) == FUNCTION_DECL
4647            || TREE_CODE (decl) == VAR_DECL)
4648           && TREE_CODE (TREE_VALUE (args)) == STRING_CST)
4649         {
4650           if (TREE_CODE (decl) == VAR_DECL
4651               && current_function_decl != NULL_TREE
4652               && ! TREE_STATIC (decl))
4653             {
4654               error ("%Jsection attribute cannot be specified for "
4655                      "local variables", decl);
4656               *no_add_attrs = true;
4657             }
4658
4659           /* The decl may have already been given a section attribute
4660              from a previous declaration.  Ensure they match.  */
4661           else if (DECL_SECTION_NAME (decl) != NULL_TREE
4662                    && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
4663                               TREE_STRING_POINTER (TREE_VALUE (args))) != 0)
4664             {
4665               error ("%Jsection of '%D' conflicts with previous declaration",
4666                      *node, *node);
4667               *no_add_attrs = true;
4668             }
4669           else
4670             DECL_SECTION_NAME (decl) = TREE_VALUE (args);
4671         }
4672       else
4673         {
4674           error ("%Jsection attribute not allowed for '%D'", *node, *node);
4675           *no_add_attrs = true;
4676         }
4677     }
4678   else
4679     {
4680       error ("%Jsection attributes are not supported for this target", *node);
4681       *no_add_attrs = true;
4682     }
4683
4684   return NULL_TREE;
4685 }
4686
4687 /* Handle a "aligned" attribute; arguments as in
4688    struct attribute_spec.handler.  */
4689
4690 static tree
4691 handle_aligned_attribute (tree *node, tree name ATTRIBUTE_UNUSED, tree args,
4692                           int flags, bool *no_add_attrs)
4693 {
4694   tree decl = NULL_TREE;
4695   tree *type = NULL;
4696   int is_type = 0;
4697   tree align_expr = (args ? TREE_VALUE (args)
4698                      : size_int (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
4699   int i;
4700
4701   if (DECL_P (*node))
4702     {
4703       decl = *node;
4704       type = &TREE_TYPE (decl);
4705       is_type = TREE_CODE (*node) == TYPE_DECL;
4706     }
4707   else if (TYPE_P (*node))
4708     type = node, is_type = 1;
4709
4710   /* Strip any NOPs of any kind.  */
4711   while (TREE_CODE (align_expr) == NOP_EXPR
4712          || TREE_CODE (align_expr) == CONVERT_EXPR
4713          || TREE_CODE (align_expr) == NON_LVALUE_EXPR)
4714     align_expr = TREE_OPERAND (align_expr, 0);
4715
4716   if (TREE_CODE (align_expr) != INTEGER_CST)
4717     {
4718       error ("requested alignment is not a constant");
4719       *no_add_attrs = true;
4720     }
4721   else if ((i = tree_log2 (align_expr)) == -1)
4722     {
4723       error ("requested alignment is not a power of 2");
4724       *no_add_attrs = true;
4725     }
4726   else if (i > HOST_BITS_PER_INT - 2)
4727     {
4728       error ("requested alignment is too large");
4729       *no_add_attrs = true;
4730     }
4731   else if (is_type)
4732     {
4733       /* If we have a TYPE_DECL, then copy the type, so that we
4734          don't accidentally modify a builtin type.  See pushdecl.  */
4735       if (decl && TREE_TYPE (decl) != error_mark_node
4736           && DECL_ORIGINAL_TYPE (decl) == NULL_TREE)
4737         {
4738           tree tt = TREE_TYPE (decl);
4739           *type = build_type_copy (*type);
4740           DECL_ORIGINAL_TYPE (decl) = tt;
4741           TYPE_NAME (*type) = decl;
4742           TREE_USED (*type) = TREE_USED (decl);
4743           TREE_TYPE (decl) = *type;
4744         }
4745       else if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
4746         *type = build_type_copy (*type);
4747
4748       TYPE_ALIGN (*type) = (1 << i) * BITS_PER_UNIT;
4749       TYPE_USER_ALIGN (*type) = 1;
4750     }
4751   else if (TREE_CODE (decl) != VAR_DECL
4752            && TREE_CODE (decl) != FIELD_DECL)
4753     {
4754       error ("%Jalignment may not be specified for '%D'", decl, decl);
4755       *no_add_attrs = true;
4756     }
4757   else
4758     {
4759       DECL_ALIGN (decl) = (1 << i) * BITS_PER_UNIT;
4760       DECL_USER_ALIGN (decl) = 1;
4761     }
4762
4763   return NULL_TREE;
4764 }
4765
4766 /* Handle a "weak" attribute; arguments as in
4767    struct attribute_spec.handler.  */
4768
4769 static tree
4770 handle_weak_attribute (tree *node, tree name ATTRIBUTE_UNUSED,
4771                        tree args ATTRIBUTE_UNUSED,
4772                        int flags ATTRIBUTE_UNUSED,
4773                        bool *no_add_attrs ATTRIBUTE_UNUSED)
4774 {
4775   declare_weak (*node);
4776
4777   return NULL_TREE;
4778 }
4779
4780 /* Handle an "alias" attribute; arguments as in
4781    struct attribute_spec.handler.  */
4782
4783 static tree
4784 handle_alias_attribute (tree *node, tree name, tree args,
4785                         int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
4786 {
4787   tree decl = *node;
4788
4789   if ((TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl))
4790       || (TREE_CODE (decl) != FUNCTION_DECL && ! DECL_EXTERNAL (decl)))
4791     {
4792       error ("%J'%D' defined both normally and as an alias", decl, decl);
4793       *no_add_attrs = true;
4794     }
4795
4796   /* Note that the very first time we process a nested declaration,
4797      decl_function_context will not be set.  Indeed, *would* never
4798      be set except for the DECL_INITIAL/DECL_EXTERNAL frobbery that
4799      we do below.  After such frobbery, pushdecl would set the context.
4800      In any case, this is never what we want.  */
4801   else if (decl_function_context (decl) == 0 && current_function_decl == NULL)
4802     {
4803       tree id;
4804
4805       id = TREE_VALUE (args);
4806       if (TREE_CODE (id) != STRING_CST)
4807         {
4808           error ("alias arg not a string");
4809           *no_add_attrs = true;
4810           return NULL_TREE;
4811         }
4812       id = get_identifier (TREE_STRING_POINTER (id));
4813       /* This counts as a use of the object pointed to.  */
4814       TREE_USED (id) = 1;
4815
4816       if (TREE_CODE (decl) == FUNCTION_DECL)
4817         DECL_INITIAL (decl) = error_mark_node;
4818       else
4819         {
4820           DECL_EXTERNAL (decl) = 0;
4821           TREE_STATIC (decl) = 1;
4822         }
4823     }
4824   else
4825     {
4826       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4827       *no_add_attrs = true;
4828     }
4829
4830   return NULL_TREE;
4831 }
4832
4833 /* Handle an "visibility" attribute; arguments as in
4834    struct attribute_spec.handler.  */
4835
4836 static tree
4837 handle_visibility_attribute (tree *node, tree name, tree args,
4838                              int flags ATTRIBUTE_UNUSED,
4839                              bool *no_add_attrs)
4840 {
4841   tree decl = *node;
4842   tree id = TREE_VALUE (args);
4843
4844   *no_add_attrs = true;
4845
4846   if (decl_function_context (decl) != 0 || ! TREE_PUBLIC (decl))
4847     {
4848       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4849       return NULL_TREE;
4850     }
4851
4852   if (TREE_CODE (id) != STRING_CST)
4853     {
4854       error ("visibility arg not a string");
4855       return NULL_TREE;
4856     }
4857
4858   if (strcmp (TREE_STRING_POINTER (id), "default") == 0)
4859     DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
4860   else if (strcmp (TREE_STRING_POINTER (id), "internal") == 0)
4861     DECL_VISIBILITY (decl) = VISIBILITY_INTERNAL;
4862   else if (strcmp (TREE_STRING_POINTER (id), "hidden") == 0)
4863     DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;  
4864   else if (strcmp (TREE_STRING_POINTER (id), "protected") == 0)
4865     DECL_VISIBILITY (decl) = VISIBILITY_PROTECTED;
4866   else
4867     error ("visibility arg must be one of \"default\", \"hidden\", \"protected\" or \"internal\"");
4868
4869   return NULL_TREE;
4870 }
4871
4872 /* Handle an "tls_model" attribute; arguments as in
4873    struct attribute_spec.handler.  */
4874
4875 static tree
4876 handle_tls_model_attribute (tree *node, tree name, tree args,
4877                             int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
4878 {
4879   tree decl = *node;
4880
4881   if (! DECL_THREAD_LOCAL (decl))
4882     {
4883       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4884       *no_add_attrs = true;
4885     }
4886   else
4887     {
4888       tree id;
4889
4890       id = TREE_VALUE (args);
4891       if (TREE_CODE (id) != STRING_CST)
4892         {
4893           error ("tls_model arg not a string");
4894           *no_add_attrs = true;
4895           return NULL_TREE;
4896         }
4897       if (strcmp (TREE_STRING_POINTER (id), "local-exec")
4898           && strcmp (TREE_STRING_POINTER (id), "initial-exec")
4899           && strcmp (TREE_STRING_POINTER (id), "local-dynamic")
4900           && strcmp (TREE_STRING_POINTER (id), "global-dynamic"))
4901         {
4902           error ("tls_model arg must be one of \"local-exec\", \"initial-exec\", \"local-dynamic\" or \"global-dynamic\"");
4903           *no_add_attrs = true;
4904           return NULL_TREE;
4905         }
4906     }
4907
4908   return NULL_TREE;
4909 }
4910
4911 /* Handle a "no_instrument_function" attribute; arguments as in
4912    struct attribute_spec.handler.  */
4913
4914 static tree
4915 handle_no_instrument_function_attribute (tree *node, tree name,
4916                                          tree args ATTRIBUTE_UNUSED,
4917                                          int flags ATTRIBUTE_UNUSED,
4918                                          bool *no_add_attrs)
4919 {
4920   tree decl = *node;
4921
4922   if (TREE_CODE (decl) != FUNCTION_DECL)
4923     {
4924       error ("%J'%E' attribute applies only to functions", decl, name);
4925       *no_add_attrs = true;
4926     }
4927   else if (DECL_INITIAL (decl))
4928     {
4929       error ("%Jcan't set '%E' attribute after definition", decl, name);
4930       *no_add_attrs = true;
4931     }
4932   else
4933     DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
4934
4935   return NULL_TREE;
4936 }
4937
4938 /* Handle a "malloc" attribute; arguments as in
4939    struct attribute_spec.handler.  */
4940
4941 static tree
4942 handle_malloc_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED,
4943                          int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
4944 {
4945   if (TREE_CODE (*node) == FUNCTION_DECL)
4946     DECL_IS_MALLOC (*node) = 1;
4947   /* ??? TODO: Support types.  */
4948   else
4949     {
4950       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4951       *no_add_attrs = true;
4952     }
4953
4954   return NULL_TREE;
4955 }
4956
4957 /* Handle a "no_limit_stack" attribute; arguments as in
4958    struct attribute_spec.handler.  */
4959
4960 static tree
4961 handle_no_limit_stack_attribute (tree *node, tree name,
4962                                  tree args ATTRIBUTE_UNUSED,
4963                                  int flags ATTRIBUTE_UNUSED,
4964                                  bool *no_add_attrs)
4965 {
4966   tree decl = *node;
4967
4968   if (TREE_CODE (decl) != FUNCTION_DECL)
4969     {
4970       error ("%J'%E' attribute applies only to functions", decl, name);
4971       *no_add_attrs = true;
4972     }
4973   else if (DECL_INITIAL (decl))
4974     {
4975       error ("%Jcan't set '%E' attribute after definition", decl, name);
4976       *no_add_attrs = true;
4977     }
4978   else
4979     DECL_NO_LIMIT_STACK (decl) = 1;
4980
4981   return NULL_TREE;
4982 }
4983
4984 /* Handle a "pure" attribute; arguments as in
4985    struct attribute_spec.handler.  */
4986
4987 static tree
4988 handle_pure_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED,
4989                        int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
4990 {
4991   if (TREE_CODE (*node) == FUNCTION_DECL)
4992     DECL_IS_PURE (*node) = 1;
4993   /* ??? TODO: Support types.  */
4994   else
4995     {
4996       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4997       *no_add_attrs = true;
4998     }
4999
5000   return NULL_TREE;
5001 }
5002
5003 /* Handle a "deprecated" attribute; arguments as in
5004    struct attribute_spec.handler.  */
5005
5006 static tree
5007 handle_deprecated_attribute (tree *node, tree name,
5008                              tree args ATTRIBUTE_UNUSED, int flags,
5009                              bool *no_add_attrs)
5010 {
5011   tree type = NULL_TREE;
5012   int warn = 0;
5013   const char *what = NULL;
5014
5015   if (DECL_P (*node))
5016     {
5017       tree decl = *node;
5018       type = TREE_TYPE (decl);
5019
5020       if (TREE_CODE (decl) == TYPE_DECL
5021           || TREE_CODE (decl) == PARM_DECL
5022           || TREE_CODE (decl) == VAR_DECL
5023           || TREE_CODE (decl) == FUNCTION_DECL
5024           || TREE_CODE (decl) == FIELD_DECL)
5025         TREE_DEPRECATED (decl) = 1;
5026       else
5027         warn = 1;
5028     }
5029   else if (TYPE_P (*node))
5030     {
5031       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
5032         *node = build_type_copy (*node);
5033       TREE_DEPRECATED (*node) = 1;
5034       type = *node;
5035     }
5036   else
5037     warn = 1;
5038
5039   if (warn)
5040     {
5041       *no_add_attrs = true;
5042       if (type && TYPE_NAME (type))
5043         {
5044           if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
5045             what = IDENTIFIER_POINTER (TYPE_NAME (*node));
5046           else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
5047                    && DECL_NAME (TYPE_NAME (type)))
5048             what = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
5049         }
5050       if (what)
5051         warning ("`%s' attribute ignored for `%s'",
5052                   IDENTIFIER_POINTER (name), what);
5053       else
5054         warning ("`%s' attribute ignored",
5055                       IDENTIFIER_POINTER (name));
5056     }
5057
5058   return NULL_TREE;
5059 }
5060
5061 /* Handle a "vector_size" attribute; arguments as in
5062    struct attribute_spec.handler.  */
5063
5064 static tree
5065 handle_vector_size_attribute (tree *node, tree name, tree args,
5066                               int flags ATTRIBUTE_UNUSED,
5067                               bool *no_add_attrs)
5068 {
5069   unsigned HOST_WIDE_INT vecsize, nunits;
5070   enum machine_mode mode, orig_mode, new_mode;
5071   tree type = *node, new_type, size;
5072
5073   *no_add_attrs = true;
5074
5075   /* Stripping NON_LVALUE_EXPR allows declarations such as
5076      typedef short v4si __attribute__((vector_size (4 * sizeof(short)))).  */
5077   size = TREE_VALUE (args);
5078   if (TREE_CODE (size) == NON_LVALUE_EXPR)
5079     size = TREE_OPERAND (size, 0);
5080
5081   if (! host_integerp (size, 1))
5082     {
5083       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5084       return NULL_TREE;
5085     }
5086
5087   /* Get the vector size (in bytes).  */
5088   vecsize = tree_low_cst (size, 1);
5089
5090   /* We need to provide for vector pointers, vector arrays, and
5091      functions returning vectors.  For example:
5092
5093        __attribute__((vector_size(16))) short *foo;
5094
5095      In this case, the mode is SI, but the type being modified is
5096      HI, so we need to look further.  */
5097
5098   while (POINTER_TYPE_P (type)
5099          || TREE_CODE (type) == FUNCTION_TYPE
5100          || TREE_CODE (type) == METHOD_TYPE
5101          || TREE_CODE (type) == ARRAY_TYPE)
5102     type = TREE_TYPE (type);
5103
5104   /* Get the mode of the type being modified.  */
5105   orig_mode = TYPE_MODE (type);
5106
5107   if (TREE_CODE (type) == RECORD_TYPE
5108       || (GET_MODE_CLASS (orig_mode) != MODE_FLOAT
5109           && GET_MODE_CLASS (orig_mode) != MODE_INT)
5110       || ! host_integerp (TYPE_SIZE_UNIT (type), 1))
5111     {
5112       error ("invalid vector type for attribute `%s'",
5113              IDENTIFIER_POINTER (name));
5114       return NULL_TREE;
5115     }
5116
5117   /* Calculate how many units fit in the vector.  */
5118   nunits = vecsize / tree_low_cst (TYPE_SIZE_UNIT (type), 1);
5119
5120   /* Find a suitably sized vector.  */
5121   new_mode = VOIDmode;
5122   for (mode = GET_CLASS_NARROWEST_MODE (GET_MODE_CLASS (orig_mode) == MODE_INT
5123                                         ? MODE_VECTOR_INT
5124                                         : MODE_VECTOR_FLOAT);
5125        mode != VOIDmode;
5126        mode = GET_MODE_WIDER_MODE (mode))
5127     if (vecsize == GET_MODE_SIZE (mode)
5128         && nunits == (unsigned HOST_WIDE_INT) GET_MODE_NUNITS (mode))
5129       {
5130         new_mode = mode;
5131         break;
5132       }
5133
5134   if (new_mode == VOIDmode)
5135     {
5136       error ("no vector mode with the size and type specified could be found");
5137       return NULL_TREE;
5138     }
5139
5140   new_type = build_vector_type_for_mode (type, new_mode);
5141
5142   /* Build back pointers if needed.  */
5143   *node = reconstruct_complex_type (*node, new_type);
5144
5145   return NULL_TREE;
5146 }
5147
5148 /* Handle the "nonnull" attribute.  */
5149 static tree
5150 handle_nonnull_attribute (tree *node, tree name ATTRIBUTE_UNUSED,
5151                           tree args, int flags ATTRIBUTE_UNUSED,
5152                           bool *no_add_attrs)
5153 {
5154   tree type = *node;
5155   unsigned HOST_WIDE_INT attr_arg_num;
5156
5157   /* If no arguments are specified, all pointer arguments should be
5158      non-null.  Verify a full prototype is given so that the arguments
5159      will have the correct types when we actually check them later.  */
5160   if (! args)
5161     {
5162       if (! TYPE_ARG_TYPES (type))
5163         {
5164           error ("nonnull attribute without arguments on a non-prototype");
5165           *no_add_attrs = true;
5166         }
5167       return NULL_TREE;
5168     }
5169
5170   /* Argument list specified.  Verify that each argument number references
5171      a pointer argument.  */
5172   for (attr_arg_num = 1; args; args = TREE_CHAIN (args))
5173     {
5174       tree argument;
5175       unsigned HOST_WIDE_INT arg_num = 0, ck_num;
5176
5177       if (! get_nonnull_operand (TREE_VALUE (args), &arg_num))
5178         {
5179           error ("nonnull argument has invalid operand number (arg %lu)",
5180                  (unsigned long) attr_arg_num);
5181           *no_add_attrs = true;
5182           return NULL_TREE;
5183         }
5184
5185       argument = TYPE_ARG_TYPES (type);
5186       if (argument)
5187         {
5188           for (ck_num = 1; ; ck_num++)
5189             {
5190               if (! argument || ck_num == arg_num)
5191                 break;
5192               argument = TREE_CHAIN (argument);
5193             }
5194
5195           if (! argument
5196               || TREE_CODE (TREE_VALUE (argument)) == VOID_TYPE)
5197             {
5198               error ("nonnull argument with out-of-range operand number (arg %lu, operand %lu)",
5199                      (unsigned long) attr_arg_num, (unsigned long) arg_num);
5200               *no_add_attrs = true;
5201               return NULL_TREE;
5202             }
5203
5204           if (TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE)
5205             {
5206               error ("nonnull argument references non-pointer operand (arg %lu, operand %lu)",
5207                    (unsigned long) attr_arg_num, (unsigned long) arg_num);
5208               *no_add_attrs = true;
5209               return NULL_TREE;
5210             }
5211         }
5212     }
5213
5214   return NULL_TREE;
5215 }
5216
5217 /* Check the argument list of a function call for null in argument slots
5218    that are marked as requiring a non-null pointer argument.  */
5219
5220 static void
5221 check_function_nonnull (tree attrs, tree params)
5222 {
5223   tree a, args, param;
5224   int param_num;
5225
5226   for (a = attrs; a; a = TREE_CHAIN (a))
5227     {
5228       if (is_attribute_p ("nonnull", TREE_PURPOSE (a)))
5229         {
5230           args = TREE_VALUE (a);
5231
5232           /* Walk the argument list.  If we encounter an argument number we
5233              should check for non-null, do it.  If the attribute has no args,
5234              then every pointer argument is checked (in which case the check
5235              for pointer type is done in check_nonnull_arg).  */
5236           for (param = params, param_num = 1; ;
5237                param_num++, param = TREE_CHAIN (param))
5238             {
5239               if (! param)
5240         break;
5241               if (! args || nonnull_check_p (args, param_num))
5242         check_function_arguments_recurse (check_nonnull_arg, NULL,
5243                                           TREE_VALUE (param),
5244                                           param_num);
5245             }
5246         }
5247     }
5248 }
5249
5250 /* Helper for check_function_nonnull; given a list of operands which
5251    must be non-null in ARGS, determine if operand PARAM_NUM should be
5252    checked.  */
5253
5254 static bool
5255 nonnull_check_p (tree args, unsigned HOST_WIDE_INT param_num)
5256 {
5257   unsigned HOST_WIDE_INT arg_num = 0;
5258
5259   for (; args; args = TREE_CHAIN (args))
5260     {
5261       if (! get_nonnull_operand (TREE_VALUE (args), &arg_num))
5262         abort ();
5263
5264       if (arg_num == param_num)
5265         return true;
5266     }
5267   return false;
5268 }
5269
5270 /* Check that the function argument PARAM (which is operand number
5271    PARAM_NUM) is non-null.  This is called by check_function_nonnull
5272    via check_function_arguments_recurse.  */
5273
5274 static void
5275 check_nonnull_arg (void *ctx ATTRIBUTE_UNUSED, tree param,
5276                    unsigned HOST_WIDE_INT param_num)
5277 {
5278   /* Just skip checking the argument if it's not a pointer.  This can
5279      happen if the "nonnull" attribute was given without an operand
5280      list (which means to check every pointer argument).  */
5281
5282   if (TREE_CODE (TREE_TYPE (param)) != POINTER_TYPE)
5283     return;
5284
5285   if (integer_zerop (param))
5286     warning ("null argument where non-null required (arg %lu)",
5287              (unsigned long) param_num);
5288 }
5289
5290 /* Helper for nonnull attribute handling; fetch the operand number
5291    from the attribute argument list.  */
5292
5293 static bool
5294 get_nonnull_operand (tree arg_num_expr, unsigned HOST_WIDE_INT *valp)
5295 {
5296   /* Strip any conversions from the arg number and verify they
5297      are constants.  */
5298   while (TREE_CODE (arg_num_expr) == NOP_EXPR
5299          || TREE_CODE (arg_num_expr) == CONVERT_EXPR
5300          || TREE_CODE (arg_num_expr) == NON_LVALUE_EXPR)
5301     arg_num_expr = TREE_OPERAND (arg_num_expr, 0);
5302
5303   if (TREE_CODE (arg_num_expr) != INTEGER_CST
5304       || TREE_INT_CST_HIGH (arg_num_expr) != 0)
5305     return false;
5306
5307   *valp = TREE_INT_CST_LOW (arg_num_expr);
5308   return true;
5309 }
5310
5311 /* Handle a "nothrow" attribute; arguments as in
5312    struct attribute_spec.handler.  */
5313
5314 static tree
5315 handle_nothrow_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED,
5316                           int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
5317 {
5318   if (TREE_CODE (*node) == FUNCTION_DECL)
5319     TREE_NOTHROW (*node) = 1;
5320   /* ??? TODO: Support types.  */
5321   else
5322     {
5323       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5324       *no_add_attrs = true;
5325     }
5326
5327   return NULL_TREE;
5328 }
5329
5330 /* Handle a "cleanup" attribute; arguments as in
5331    struct attribute_spec.handler.  */
5332
5333 static tree
5334 handle_cleanup_attribute (tree *node, tree name, tree args,
5335                           int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
5336 {
5337   tree decl = *node;
5338   tree cleanup_id, cleanup_decl;
5339
5340   /* ??? Could perhaps support cleanups on TREE_STATIC, much like we do
5341      for global destructors in C++.  This requires infrastructure that
5342      we don't have generically at the moment.  It's also not a feature
5343      we'd be missing too much, since we do have attribute constructor.  */
5344   if (TREE_CODE (decl) != VAR_DECL || TREE_STATIC (decl))
5345     {
5346       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5347       *no_add_attrs = true;
5348       return NULL_TREE;
5349     }
5350
5351   /* Verify that the argument is a function in scope.  */
5352   /* ??? We could support pointers to functions here as well, if
5353      that was considered desirable.  */
5354   cleanup_id = TREE_VALUE (args);
5355   if (TREE_CODE (cleanup_id) != IDENTIFIER_NODE)
5356     {
5357       error ("cleanup arg not an identifier");
5358       *no_add_attrs = true;
5359       return NULL_TREE;
5360     }
5361   cleanup_decl = lookup_name (cleanup_id);
5362   if (!cleanup_decl || TREE_CODE (cleanup_decl) != FUNCTION_DECL)
5363     {
5364       error ("cleanup arg not a function");
5365       *no_add_attrs = true;
5366       return NULL_TREE;
5367     }
5368
5369   /* That the function has proper type is checked with the
5370      eventual call to build_function_call.  */
5371
5372   return NULL_TREE;
5373 }
5374
5375 /* Handle a "warn_unused_result" attribute.  No special handling.  */
5376
5377 static tree
5378 handle_warn_unused_result_attribute (tree *node, tree name,
5379                                tree args ATTRIBUTE_UNUSED,
5380                                int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
5381 {
5382   /* Ignore the attribute for functions not returning any value.  */
5383   if (VOID_TYPE_P (TREE_TYPE (*node)))
5384     {
5385       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5386       *no_add_attrs = true;
5387     }
5388
5389   return NULL_TREE;
5390 }
5391 \f
5392 /* Check for valid arguments being passed to a function.  */
5393 void
5394 check_function_arguments (tree attrs, tree params)
5395 {
5396   /* Check for null being passed in a pointer argument that must be
5397      non-null.  We also need to do this if format checking is enabled.  */
5398
5399   if (warn_nonnull)
5400     check_function_nonnull (attrs, params);
5401
5402   /* Check for errors in format strings.  */
5403
5404   if (warn_format)
5405     check_function_format (NULL, attrs, params);
5406 }
5407
5408 /* Generic argument checking recursion routine.  PARAM is the argument to
5409    be checked.  PARAM_NUM is the number of the argument.  CALLBACK is invoked
5410    once the argument is resolved.  CTX is context for the callback.  */
5411 void
5412 check_function_arguments_recurse (void (*callback)
5413                                   (void *, tree, unsigned HOST_WIDE_INT),
5414                                   void *ctx, tree param,
5415                                   unsigned HOST_WIDE_INT param_num)
5416 {
5417   if (TREE_CODE (param) == NOP_EXPR)
5418     {
5419       /* Strip coercion.  */
5420       check_function_arguments_recurse (callback, ctx,
5421                                         TREE_OPERAND (param, 0), param_num);
5422       return;
5423     }
5424
5425   if (TREE_CODE (param) == CALL_EXPR)
5426     {
5427       tree type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (param, 0)));
5428       tree attrs;
5429       bool found_format_arg = false;
5430
5431       /* See if this is a call to a known internationalization function
5432          that modifies a format arg.  Such a function may have multiple
5433          format_arg attributes (for example, ngettext).  */
5434
5435       for (attrs = TYPE_ATTRIBUTES (type);
5436            attrs;
5437            attrs = TREE_CHAIN (attrs))
5438         if (is_attribute_p ("format_arg", TREE_PURPOSE (attrs)))
5439           {
5440             tree inner_args;
5441             tree format_num_expr;
5442             int format_num;
5443             int i;
5444
5445             /* Extract the argument number, which was previously checked
5446                to be valid.  */
5447             format_num_expr = TREE_VALUE (TREE_VALUE (attrs));
5448             while (TREE_CODE (format_num_expr) == NOP_EXPR
5449                    || TREE_CODE (format_num_expr) == CONVERT_EXPR
5450                    || TREE_CODE (format_num_expr) == NON_LVALUE_EXPR)
5451               format_num_expr = TREE_OPERAND (format_num_expr, 0);
5452
5453             if (TREE_CODE (format_num_expr) != INTEGER_CST
5454                 || TREE_INT_CST_HIGH (format_num_expr) != 0)
5455               abort ();
5456
5457             format_num = TREE_INT_CST_LOW (format_num_expr);
5458
5459             for (inner_args = TREE_OPERAND (param, 1), i = 1;
5460                  inner_args != 0;
5461                  inner_args = TREE_CHAIN (inner_args), i++)
5462               if (i == format_num)
5463                 {
5464                   check_function_arguments_recurse (callback, ctx,
5465                                                     TREE_VALUE (inner_args),
5466                                                     param_num);
5467                   found_format_arg = true;
5468                   break;
5469                 }
5470           }
5471
5472       /* If we found a format_arg attribute and did a recursive check,
5473          we are done with checking this argument.  Otherwise, we continue
5474          and this will be considered a non-literal.  */
5475       if (found_format_arg)
5476         return;
5477     }
5478
5479   if (TREE_CODE (param) == COND_EXPR)
5480     {
5481       /* Check both halves of the conditional expression.  */
5482       check_function_arguments_recurse (callback, ctx,
5483                                         TREE_OPERAND (param, 1), param_num);
5484       check_function_arguments_recurse (callback, ctx,
5485                                         TREE_OPERAND (param, 2), param_num);
5486       return;
5487     }
5488
5489   (*callback) (ctx, param, param_num);
5490 }
5491
5492 /* C implementation of lang_hooks.tree_inlining.walk_subtrees.  Tracks the
5493    locus from EXPR_LOCUS and handles DECL_STMT specially.  */
5494
5495 tree 
5496 c_walk_subtrees (tree *tp, int *walk_subtrees_p ATTRIBUTE_UNUSED,
5497                  walk_tree_fn func, void *data, void *htab)
5498 {
5499   enum tree_code code = TREE_CODE (*tp);
5500   location_t save_locus;
5501   tree result;
5502
5503 #define WALK_SUBTREE(NODE)                              \
5504   do                                                    \
5505     {                                                   \
5506       result = walk_tree (&(NODE), func, data, htab);   \
5507       if (result) goto out;                             \
5508     }                                                   \
5509   while (0)
5510
5511   if (code != DECL_STMT)
5512     return NULL_TREE;
5513
5514   /* Set input_location here so we get the right instantiation context
5515      if we call instantiate_decl from inlinable_function_p.  */
5516   save_locus = input_location;
5517   if (EXPR_LOCUS (*tp))
5518     input_location = *EXPR_LOCUS (*tp);
5519
5520   /* Walk the DECL_INITIAL and DECL_SIZE.  We don't want to walk
5521      into declarations that are just mentioned, rather than
5522      declared; they don't really belong to this part of the tree.
5523      And, we can see cycles: the initializer for a declaration can
5524      refer to the declaration itself.  */
5525   WALK_SUBTREE (DECL_INITIAL (DECL_STMT_DECL (*tp)));
5526   WALK_SUBTREE (DECL_SIZE (DECL_STMT_DECL (*tp)));
5527   WALK_SUBTREE (DECL_SIZE_UNIT (DECL_STMT_DECL (*tp)));
5528   WALK_SUBTREE (TREE_CHAIN (*tp));
5529   *walk_subtrees_p = 0;
5530
5531   /* We didn't find what we were looking for.  */
5532  out:
5533   input_location = save_locus;
5534   return result;
5535
5536 #undef WALK_SUBTREE
5537 }
5538
5539 /* Function to help qsort sort FIELD_DECLs by name order.  */
5540
5541 int
5542 field_decl_cmp (const void *x_p, const void *y_p)
5543 {
5544   const tree *const x = x_p;
5545   const tree *const y = y_p;
5546   if (DECL_NAME (*x) == DECL_NAME (*y))
5547     /* A nontype is "greater" than a type.  */
5548     return (TREE_CODE (*y) == TYPE_DECL) - (TREE_CODE (*x) == TYPE_DECL);
5549   if (DECL_NAME (*x) == NULL_TREE)
5550     return -1;
5551   if (DECL_NAME (*y) == NULL_TREE)
5552     return 1;
5553   if (DECL_NAME (*x) < DECL_NAME (*y))
5554     return -1;
5555   return 1;
5556 }
5557
5558 static struct {
5559   gt_pointer_operator new_value;
5560   void *cookie;
5561 } resort_data;
5562
5563 /* This routine compares two fields like field_decl_cmp but using the
5564 pointer operator in resort_data.  */
5565
5566 static int
5567 resort_field_decl_cmp (const void *x_p, const void *y_p)
5568 {
5569   const tree *const x = x_p;
5570   const tree *const y = y_p;
5571
5572   if (DECL_NAME (*x) == DECL_NAME (*y))
5573     /* A nontype is "greater" than a type.  */
5574     return (TREE_CODE (*y) == TYPE_DECL) - (TREE_CODE (*x) == TYPE_DECL);
5575   if (DECL_NAME (*x) == NULL_TREE)
5576     return -1;
5577   if (DECL_NAME (*y) == NULL_TREE)
5578     return 1;
5579   {
5580     tree d1 = DECL_NAME (*x);
5581     tree d2 = DECL_NAME (*y);
5582     resort_data.new_value (&d1, resort_data.cookie);
5583     resort_data.new_value (&d2, resort_data.cookie);
5584     if (d1 < d2)
5585       return -1;
5586   }
5587   return 1;
5588 }
5589
5590 /* Resort DECL_SORTED_FIELDS because pointers have been reordered.  */
5591
5592 void
5593 resort_sorted_fields (void *obj,
5594                       void *orig_obj ATTRIBUTE_UNUSED ,
5595                       gt_pointer_operator new_value,
5596                       void *cookie)
5597 {
5598   struct sorted_fields_type *sf = obj;
5599   resort_data.new_value = new_value;
5600   resort_data.cookie = cookie;
5601   qsort (&sf->elts[0], sf->len, sizeof (tree),
5602          resort_field_decl_cmp);
5603 }
5604
5605 /* Issue the error given by MSGID, indicating that it occurred before
5606    TOKEN, which had the associated VALUE.  */
5607
5608 void
5609 c_parse_error (const char *msgid, enum cpp_ttype token, tree value)
5610 {
5611   const char *string = _(msgid);
5612
5613   if (token == CPP_EOF)
5614     error ("%s at end of input", string);
5615   else if (token == CPP_CHAR || token == CPP_WCHAR)
5616     {
5617       unsigned int val = TREE_INT_CST_LOW (value);
5618       const char *const ell = (token == CPP_CHAR) ? "" : "L";
5619       if (val <= UCHAR_MAX && ISGRAPH (val))
5620         error ("%s before %s'%c'", string, ell, val);
5621       else
5622         error ("%s before %s'\\x%x'", string, ell, val);
5623     }
5624   else if (token == CPP_STRING
5625            || token == CPP_WSTRING)
5626     error ("%s before string constant", string);
5627   else if (token == CPP_NUMBER)
5628     error ("%s before numeric constant", string);
5629   else if (token == CPP_NAME)
5630     error ("%s before \"%s\"", string, IDENTIFIER_POINTER (value));
5631   else if (token < N_TTYPES)
5632     error ("%s before '%s' token", string, cpp_type2name (token));
5633   else
5634     error ("%s", string);
5635 }
5636
5637 /* Walk a gimplified function and warn for functions whose return value is
5638    ignored and attribute((warn_unused_result)) is set.  This is done before
5639    inlining, so we don't have to worry about that.  */  
5640    
5641 void
5642 c_warn_unused_result (tree *top_p)
5643 {
5644   tree t = *top_p;
5645   tree_stmt_iterator i;
5646   tree fdecl, ftype;
5647
5648   switch (TREE_CODE (t))
5649     {
5650     case STATEMENT_LIST:
5651       for (i = tsi_start (*top_p); !tsi_end_p (i); tsi_next (&i))
5652         c_warn_unused_result (tsi_stmt_ptr (i));
5653       break;
5654
5655     case COND_EXPR:
5656       c_warn_unused_result (&COND_EXPR_THEN (t));
5657       c_warn_unused_result (&COND_EXPR_ELSE (t));
5658       break;
5659     case BIND_EXPR:
5660       c_warn_unused_result (&BIND_EXPR_BODY (t));
5661       break;
5662     case TRY_FINALLY_EXPR:
5663     case TRY_CATCH_EXPR:
5664       c_warn_unused_result (&TREE_OPERAND (t, 0));
5665       c_warn_unused_result (&TREE_OPERAND (t, 1));
5666       break;
5667     case CATCH_EXPR:
5668       c_warn_unused_result (&CATCH_BODY (t));
5669       break;
5670     case EH_FILTER_EXPR:
5671       c_warn_unused_result (&EH_FILTER_FAILURE (t));
5672       break;
5673
5674     case CALL_EXPR:
5675       /* This is a naked call, as opposed to a CALL_EXPR nested inside
5676          a MODIFY_EXPR.  All calls whose value is ignored should be
5677          represented like this.  Look for the attribute.  */
5678       fdecl = get_callee_fndecl (t);
5679       if (fdecl)
5680         ftype = TREE_TYPE (fdecl);
5681       else
5682         {
5683           ftype = TREE_TYPE (TREE_OPERAND (t, 0));
5684           /* Look past pointer-to-function to the function type itself.  */
5685           ftype = TREE_TYPE (ftype);
5686         }
5687
5688       if (lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (ftype)))
5689         {
5690           if (fdecl)
5691             warning ("%Hignoring return value of `%D', "
5692                      "declared with attribute warn_unused_result",
5693                      EXPR_LOCUS (t), fdecl);
5694           else
5695             warning ("%Hignoring return value of function "
5696                      "declared with attribute warn_unused_result",
5697                      EXPR_LOCUS (t));
5698         }
5699       break;
5700
5701     default:
5702       /* Not a container, not a call, or a call whose value is used.  */
5703       break;
5704     }
5705 }
5706
5707 #include "gt-c-common.h"