OSDN Git Service

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