OSDN Git Service

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