OSDN Git Service

* c-common.c (__GXX_ABI_VERSION): Correct spelling.
[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       cpp_define (pfile, "__GXX_ABI_VERSION=102");
4736     }
4737
4738   /* libgcc needs to know this.  */
4739   if (USING_SJLJ_EXCEPTIONS)
4740     cpp_define (pfile, "__USING_SJLJ_EXCEPTIONS__");
4741
4742   /* stddef.h needs to know these.  */
4743   builtin_define_with_value ("__SIZE_TYPE__", SIZE_TYPE, 0);
4744   builtin_define_with_value ("__PTRDIFF_TYPE__", PTRDIFF_TYPE, 0);
4745   builtin_define_with_value ("__WCHAR_TYPE__", MODIFIED_WCHAR_TYPE, 0);
4746   builtin_define_with_value ("__WINT_TYPE__", WINT_TYPE, 0);
4747
4748   /* limits.h needs to know these.  */
4749   builtin_define_type_max ("__SCHAR_MAX__", signed_char_type_node, 0);
4750   builtin_define_type_max ("__SHRT_MAX__", short_integer_type_node, 0);
4751   builtin_define_type_max ("__INT_MAX__", integer_type_node, 0);
4752   builtin_define_type_max ("__LONG_MAX__", long_integer_type_node, 1);
4753   builtin_define_type_max ("__LONG_LONG_MAX__", long_long_integer_type_node, 2);
4754
4755   {
4756     char buf[8];
4757     sprintf (buf, "%d", (int) TYPE_PRECISION (signed_char_type_node));
4758     builtin_define_with_value ("__CHAR_BIT__", buf, 0);
4759   }
4760
4761   /* For use in assembly language.  */
4762   builtin_define_with_value ("__REGISTER_PREFIX__", REGISTER_PREFIX, 0);
4763   builtin_define_with_value ("__USER_LABEL_PREFIX__", user_label_prefix, 0);
4764
4765   /* Misc.  */
4766   builtin_define_with_value ("__VERSION__", version_string, 1);
4767
4768   /* Other target-independent built-ins determined by command-line
4769      options.  */
4770   if (optimize_size)
4771     cpp_define (pfile, "__OPTIMIZE_SIZE__");
4772   if (optimize)
4773     cpp_define (pfile, "__OPTIMIZE__");
4774
4775   if (flag_hosted)
4776     cpp_define (pfile, "__STDC_HOSTED__=1");
4777   else
4778     cpp_define (pfile, "__STDC_HOSTED__=0");
4779
4780   if (fast_math_flags_set_p ())
4781     cpp_define (pfile, "__FAST_MATH__");
4782   if (flag_no_inline)
4783     cpp_define (pfile, "__NO_INLINE__");
4784   if (flag_signaling_nans)
4785     cpp_define (pfile, "__SUPPORT_SNAN__");
4786   if (flag_finite_math_only)
4787     cpp_define (pfile, "__FINITE_MATH_ONLY__=1");
4788   else
4789     cpp_define (pfile, "__FINITE_MATH_ONLY__=0");
4790
4791   if (flag_iso)
4792     cpp_define (pfile, "__STRICT_ANSI__");
4793
4794   if (!flag_signed_char)
4795     cpp_define (pfile, "__CHAR_UNSIGNED__");
4796
4797   /* A straightforward target hook doesn't work, because of problems
4798      linking that hook's body when part of non-C front ends.  */
4799 # define preprocessing_asm_p() (cpp_get_options (pfile)->lang == CLK_ASM)
4800 # define builtin_define(TXT) cpp_define (pfile, TXT)
4801 # define builtin_assert(TXT) cpp_assert (pfile, TXT)
4802   TARGET_CPU_CPP_BUILTINS ();
4803   TARGET_OS_CPP_BUILTINS ();
4804 }
4805
4806 /* Pass an object-like macro.  If it doesn't lie in the user's
4807    namespace, defines it unconditionally.  Otherwise define a version
4808    with two leading underscores, and another version with two leading
4809    and trailing underscores, and define the original only if an ISO
4810    standard was not nominated.
4811
4812    e.g. passing "unix" defines "__unix", "__unix__" and possibly
4813    "unix".  Passing "_mips" defines "__mips", "__mips__" and possibly
4814    "_mips".  */
4815 void
4816 builtin_define_std (macro)
4817      const char *macro;
4818 {
4819   size_t len = strlen (macro);
4820   char *buff = alloca (len + 5);
4821   char *p = buff + 2;
4822   char *q = p + len;
4823
4824   /* prepend __ (or maybe just _) if in user's namespace.  */
4825   memcpy (p, macro, len + 1);
4826   if (!( *p == '_' && (p[1] == '_' || ISUPPER (p[1]))))
4827     {
4828       if (*p != '_')
4829         *--p = '_';
4830       if (p[1] != '_')
4831         *--p = '_';
4832     }
4833   cpp_define (parse_in, p);
4834
4835   /* If it was in user's namespace...  */
4836   if (p != buff + 2)
4837     {
4838       /* Define the macro with leading and following __.  */
4839       if (q[-1] != '_')
4840         *q++ = '_';
4841       if (q[-2] != '_')
4842         *q++ = '_';
4843       *q = '\0';
4844       cpp_define (parse_in, p);
4845
4846       /* Finally, define the original macro if permitted.  */
4847       if (!flag_iso)
4848         cpp_define (parse_in, macro);
4849     }
4850 }
4851
4852 /* Pass an object-like macro and a value to define it to.  The third
4853    parameter says whether or not to turn the value into a string
4854    constant.  */
4855 static void
4856 builtin_define_with_value (macro, expansion, is_str)
4857      const char *macro;
4858      const char *expansion;
4859      int is_str;
4860 {
4861   char *buf;
4862   size_t mlen = strlen (macro);
4863   size_t elen = strlen (expansion);
4864   size_t extra = 2;  /* space for an = and a NUL */
4865
4866   if (is_str)
4867     extra += 2;  /* space for two quote marks */
4868
4869   buf = alloca (mlen + elen + extra);
4870   if (is_str)
4871     sprintf (buf, "%s=\"%s\"", macro, expansion);
4872   else
4873     sprintf (buf, "%s=%s", macro, expansion);
4874
4875   cpp_define (parse_in, buf);
4876 }
4877
4878 /* Define MAX for TYPE based on the precision of the type, which is assumed
4879    to be signed.  IS_LONG is 1 for type "long" and 2 for "long long".  */
4880
4881 static void
4882 builtin_define_type_max (macro, type, is_long)
4883      const char *macro;
4884      tree type;
4885      int is_long;
4886 {
4887   const char *value;
4888   char *buf;
4889   size_t mlen, vlen, extra;
4890
4891   /* Pre-rendering the values mean we don't have to futz with printing a
4892      multi-word decimal value.  There are also a very limited number of
4893      precisions that we support, so it's really a waste of time.  */
4894   switch (TYPE_PRECISION (type))
4895     {
4896     case 8:
4897       value = "127";
4898       break;
4899     case 16:
4900       value = "32767";
4901       break;
4902     case 32:
4903       value = "2147483647";
4904       break;
4905     case 64:
4906       value = "9223372036854775807";
4907       break;
4908     case 128:
4909       value = "170141183460469231731687303715884105727";
4910       break;
4911     default:
4912       abort ();
4913     }
4914
4915   mlen = strlen (macro);
4916   vlen = strlen (value);
4917   extra = 2 + is_long;
4918   buf = alloca (mlen + vlen + extra);
4919
4920   sprintf (buf, "%s=%s%s", macro, value,
4921            (is_long == 1 ? "L" : is_long == 2 ? "LL" : ""));
4922
4923   cpp_define (parse_in, buf);
4924 }
4925
4926 /* Front end initialization common to C, ObjC and C++.  */
4927 const char *
4928 c_common_init (filename)
4929      const char *filename;
4930 {
4931   cpp_options *options = cpp_get_options (parse_in);
4932
4933   /* Set up preprocessor arithmetic.  Must be done after call to
4934      c_common_nodes_and_builtins for wchar_type_node to be good.  */
4935   options->precision = TYPE_PRECISION (intmax_type_node);
4936   options->char_precision = TYPE_PRECISION (char_type_node);
4937   options->int_precision = TYPE_PRECISION (integer_type_node);
4938   options->wchar_precision = TYPE_PRECISION (wchar_type_node);
4939   options->unsigned_wchar = TREE_UNSIGNED (wchar_type_node);
4940   options->unsigned_char = !flag_signed_char;
4941   options->warn_multichar = warn_multichar;
4942   options->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
4943
4944   /* We want -Wno-long-long to override -pedantic -std=non-c99
4945      whatever the ordering.  */
4946   options->warn_long_long = warn_long_long && !flag_isoc99 && pedantic;
4947
4948   /* Register preprocessor built-ins before calls to
4949      cpp_main_file.  */
4950   cpp_get_callbacks (parse_in)->register_builtins = cb_register_builtins;
4951
4952   /* NULL is passed up to toplev.c and we exit quickly.  */
4953   if (flag_preprocess_only)
4954     {
4955       cpp_preprocess_file (parse_in);
4956       return NULL;
4957     }
4958
4959   /* Do this before initializing pragmas, as then cpplib's hash table
4960      has been set up.  */
4961   filename = init_c_lex (filename);
4962
4963   init_pragma ();
4964
4965   if (!c_attrs_initialized)
4966     c_init_attributes ();
4967
4968   return filename;
4969 }
4970
4971 /* Common finish hook for the C, ObjC and C++ front ends.  */
4972 void
4973 c_common_finish ()
4974 {
4975   cpp_finish (parse_in);
4976
4977   /* For performance, avoid tearing down cpplib's internal structures.
4978      Call cpp_errors () instead of cpp_destroy ().  */
4979   errorcount += cpp_errors (parse_in);
4980 }
4981
4982 static void
4983 c_init_attributes ()
4984 {
4985   /* Fill in the built_in_attributes array.  */
4986 #define DEF_ATTR_NULL_TREE(ENUM)                \
4987   built_in_attributes[(int) ENUM] = NULL_TREE;
4988 #define DEF_ATTR_INT(ENUM, VALUE)                                            \
4989   built_in_attributes[(int) ENUM] = build_int_2 (VALUE, VALUE < 0 ? -1 : 0);
4990 #define DEF_ATTR_IDENT(ENUM, STRING)                            \
4991   built_in_attributes[(int) ENUM] = get_identifier (STRING);
4992 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) \
4993   built_in_attributes[(int) ENUM]                       \
4994     = tree_cons (built_in_attributes[(int) PURPOSE],    \
4995                  built_in_attributes[(int) VALUE],      \
4996                  built_in_attributes[(int) CHAIN]);
4997 #define DEF_FN_ATTR(NAME, ATTRS, PREDICATE) /* No initialization needed.  */
4998 #include "builtin-attrs.def"
4999 #undef DEF_ATTR_NULL_TREE
5000 #undef DEF_ATTR_INT
5001 #undef DEF_ATTR_IDENT
5002 #undef DEF_ATTR_TREE_LIST
5003 #undef DEF_FN_ATTR
5004   c_attrs_initialized = true;
5005 }
5006
5007 /* Depending on the name of DECL, apply default attributes to it.  */
5008
5009 void
5010 c_common_insert_default_attributes (decl)
5011      tree decl;
5012 {
5013   tree name = DECL_NAME (decl);
5014
5015   if (!c_attrs_initialized)
5016     c_init_attributes ();
5017
5018 #define DEF_ATTR_NULL_TREE(ENUM) /* Nothing needed after initialization.  */
5019 #define DEF_ATTR_INT(ENUM, VALUE)
5020 #define DEF_ATTR_IDENT(ENUM, STRING)
5021 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN)
5022 #define DEF_FN_ATTR(NAME, ATTRS, PREDICATE)                     \
5023   if ((PREDICATE) && name == built_in_attributes[(int) NAME])   \
5024     decl_attributes (&decl, built_in_attributes[(int) ATTRS],   \
5025                      ATTR_FLAG_BUILT_IN);
5026 #include "builtin-attrs.def"
5027 #undef DEF_ATTR_NULL_TREE
5028 #undef DEF_ATTR_INT
5029 #undef DEF_ATTR_IDENT
5030 #undef DEF_ATTR_TREE_LIST
5031 #undef DEF_FN_ATTR
5032 }
5033
5034 /* Output a -Wshadow warning MSGID about NAME, an IDENTIFIER_NODE, and
5035    additionally give the location of the previous declaration DECL.  */
5036 void
5037 shadow_warning (msgid, name, decl)
5038      const char *msgid;
5039      tree name, decl;
5040 {
5041   warning ("declaration of `%s' shadows %s", IDENTIFIER_POINTER (name), msgid);
5042   warning_with_file_and_line (DECL_SOURCE_FILE (decl),
5043                               DECL_SOURCE_LINE (decl),
5044                               "shadowed declaration is here");
5045 }
5046
5047 /* Attribute handlers common to C front ends.  */
5048
5049 /* Handle a "packed" attribute; arguments as in
5050    struct attribute_spec.handler.  */
5051
5052 static tree
5053 handle_packed_attribute (node, name, args, flags, no_add_attrs)
5054      tree *node;
5055      tree name;
5056      tree args ATTRIBUTE_UNUSED;
5057      int flags;
5058      bool *no_add_attrs;
5059 {
5060   tree *type = NULL;
5061   if (DECL_P (*node))
5062     {
5063       if (TREE_CODE (*node) == TYPE_DECL)
5064         type = &TREE_TYPE (*node);
5065     }
5066   else
5067     type = node;
5068
5069   if (type)
5070     {
5071       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
5072         *type = build_type_copy (*type);
5073       TYPE_PACKED (*type) = 1;
5074     }
5075   else if (TREE_CODE (*node) == FIELD_DECL)
5076     DECL_PACKED (*node) = 1;
5077   /* We can't set DECL_PACKED for a VAR_DECL, because the bit is
5078      used for DECL_REGISTER.  It wouldn't mean anything anyway.  */
5079   else
5080     {
5081       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5082       *no_add_attrs = true;
5083     }
5084
5085   return NULL_TREE;
5086 }
5087
5088 /* Handle a "nocommon" attribute; arguments as in
5089    struct attribute_spec.handler.  */
5090
5091 static tree
5092 handle_nocommon_attribute (node, name, args, flags, no_add_attrs)
5093      tree *node;
5094      tree name;
5095      tree args ATTRIBUTE_UNUSED;
5096      int flags ATTRIBUTE_UNUSED;
5097      bool *no_add_attrs;
5098 {
5099   if (TREE_CODE (*node) == VAR_DECL)
5100     DECL_COMMON (*node) = 0;
5101   else
5102     {
5103       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5104       *no_add_attrs = true;
5105     }
5106
5107   return NULL_TREE;
5108 }
5109
5110 /* Handle a "common" attribute; arguments as in
5111    struct attribute_spec.handler.  */
5112
5113 static tree
5114 handle_common_attribute (node, name, args, flags, no_add_attrs)
5115      tree *node;
5116      tree name;
5117      tree args ATTRIBUTE_UNUSED;
5118      int flags ATTRIBUTE_UNUSED;
5119      bool *no_add_attrs;
5120 {
5121   if (TREE_CODE (*node) == VAR_DECL)
5122     DECL_COMMON (*node) = 1;
5123   else
5124     {
5125       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5126       *no_add_attrs = true;
5127     }
5128
5129   return NULL_TREE;
5130 }
5131
5132 /* Handle a "noreturn" attribute; arguments as in
5133    struct attribute_spec.handler.  */
5134
5135 static tree
5136 handle_noreturn_attribute (node, name, args, flags, no_add_attrs)
5137      tree *node;
5138      tree name;
5139      tree args ATTRIBUTE_UNUSED;
5140      int flags ATTRIBUTE_UNUSED;
5141      bool *no_add_attrs;
5142 {
5143   tree type = TREE_TYPE (*node);
5144
5145   /* See FIXME comment in c_common_attribute_table.  */
5146   if (TREE_CODE (*node) == FUNCTION_DECL)
5147     TREE_THIS_VOLATILE (*node) = 1;
5148   else if (TREE_CODE (type) == POINTER_TYPE
5149            && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
5150     TREE_TYPE (*node)
5151       = build_pointer_type
5152         (build_type_variant (TREE_TYPE (type),
5153                              TREE_READONLY (TREE_TYPE (type)), 1));
5154   else
5155     {
5156       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5157       *no_add_attrs = true;
5158     }
5159
5160   return NULL_TREE;
5161 }
5162
5163 /* Handle a "noinline" attribute; arguments as in
5164    struct attribute_spec.handler.  */
5165
5166 static tree
5167 handle_noinline_attribute (node, name, args, flags, no_add_attrs)
5168      tree *node;
5169      tree name;
5170      tree args ATTRIBUTE_UNUSED;
5171      int flags ATTRIBUTE_UNUSED;
5172      bool *no_add_attrs;
5173 {
5174   if (TREE_CODE (*node) == FUNCTION_DECL)
5175     DECL_UNINLINABLE (*node) = 1;
5176   else
5177     {
5178       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5179       *no_add_attrs = true;
5180     }
5181
5182   return NULL_TREE;
5183 }
5184
5185 /* Handle a "always_inline" attribute; arguments as in
5186    struct attribute_spec.handler.  */
5187
5188 static tree
5189 handle_always_inline_attribute (node, name, args, flags, no_add_attrs)
5190      tree *node;
5191      tree name;
5192      tree args ATTRIBUTE_UNUSED;
5193      int flags ATTRIBUTE_UNUSED;
5194      bool *no_add_attrs;
5195 {
5196   if (TREE_CODE (*node) == FUNCTION_DECL)
5197     {
5198       /* Do nothing else, just set the attribute.  We'll get at
5199          it later with lookup_attribute.  */
5200     }
5201   else
5202     {
5203       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5204       *no_add_attrs = true;
5205     }
5206
5207   return NULL_TREE;
5208 }
5209
5210 /* Handle a "used" attribute; arguments as in
5211    struct attribute_spec.handler.  */
5212
5213 static tree
5214 handle_used_attribute (node, name, args, flags, no_add_attrs)
5215      tree *node;
5216      tree name;
5217      tree args ATTRIBUTE_UNUSED;
5218      int flags ATTRIBUTE_UNUSED;
5219      bool *no_add_attrs;
5220 {
5221   if (TREE_CODE (*node) == FUNCTION_DECL)
5222     TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (*node))
5223       = TREE_USED (*node) = 1;
5224   else
5225     {
5226       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5227       *no_add_attrs = true;
5228     }
5229
5230   return NULL_TREE;
5231 }
5232
5233 /* Handle a "unused" attribute; arguments as in
5234    struct attribute_spec.handler.  */
5235
5236 static tree
5237 handle_unused_attribute (node, name, args, flags, no_add_attrs)
5238      tree *node;
5239      tree name;
5240      tree args ATTRIBUTE_UNUSED;
5241      int flags;
5242      bool *no_add_attrs;
5243 {
5244   if (DECL_P (*node))
5245     {
5246       tree decl = *node;
5247
5248       if (TREE_CODE (decl) == PARM_DECL
5249           || TREE_CODE (decl) == VAR_DECL
5250           || TREE_CODE (decl) == FUNCTION_DECL
5251           || TREE_CODE (decl) == LABEL_DECL
5252           || TREE_CODE (decl) == TYPE_DECL)
5253         TREE_USED (decl) = 1;
5254       else
5255         {
5256           warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5257           *no_add_attrs = true;
5258         }
5259     }
5260   else
5261     {
5262       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
5263         *node = build_type_copy (*node);
5264       TREE_USED (*node) = 1;
5265     }
5266
5267   return NULL_TREE;
5268 }
5269
5270 /* Handle a "const" attribute; arguments as in
5271    struct attribute_spec.handler.  */
5272
5273 static tree
5274 handle_const_attribute (node, name, args, flags, no_add_attrs)
5275      tree *node;
5276      tree name;
5277      tree args ATTRIBUTE_UNUSED;
5278      int flags ATTRIBUTE_UNUSED;
5279      bool *no_add_attrs;
5280 {
5281   tree type = TREE_TYPE (*node);
5282
5283   /* See FIXME comment on noreturn in c_common_attribute_table.  */
5284   if (TREE_CODE (*node) == FUNCTION_DECL)
5285     TREE_READONLY (*node) = 1;
5286   else if (TREE_CODE (type) == POINTER_TYPE
5287            && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
5288     TREE_TYPE (*node)
5289       = build_pointer_type
5290         (build_type_variant (TREE_TYPE (type), 1,
5291                              TREE_THIS_VOLATILE (TREE_TYPE (type))));
5292   else
5293     {
5294       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5295       *no_add_attrs = true;
5296     }
5297
5298   return NULL_TREE;
5299 }
5300
5301 /* Handle a "transparent_union" attribute; arguments as in
5302    struct attribute_spec.handler.  */
5303
5304 static tree
5305 handle_transparent_union_attribute (node, name, args, flags, no_add_attrs)
5306      tree *node;
5307      tree name;
5308      tree args ATTRIBUTE_UNUSED;
5309      int flags;
5310      bool *no_add_attrs;
5311 {
5312   tree decl = NULL_TREE;
5313   tree *type = NULL;
5314   int is_type = 0;
5315
5316   if (DECL_P (*node))
5317     {
5318       decl = *node;
5319       type = &TREE_TYPE (decl);
5320       is_type = TREE_CODE (*node) == TYPE_DECL;
5321     }
5322   else if (TYPE_P (*node))
5323     type = node, is_type = 1;
5324
5325   if (is_type
5326       && TREE_CODE (*type) == UNION_TYPE
5327       && (decl == 0
5328           || (TYPE_FIELDS (*type) != 0
5329               && TYPE_MODE (*type) == DECL_MODE (TYPE_FIELDS (*type)))))
5330     {
5331       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
5332         *type = build_type_copy (*type);
5333       TYPE_TRANSPARENT_UNION (*type) = 1;
5334     }
5335   else if (decl != 0 && TREE_CODE (decl) == PARM_DECL
5336            && TREE_CODE (*type) == UNION_TYPE
5337            && TYPE_MODE (*type) == DECL_MODE (TYPE_FIELDS (*type)))
5338     DECL_TRANSPARENT_UNION (decl) = 1;
5339   else
5340     {
5341       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5342       *no_add_attrs = true;
5343     }
5344
5345   return NULL_TREE;
5346 }
5347
5348 /* Handle a "constructor" attribute; arguments as in
5349    struct attribute_spec.handler.  */
5350
5351 static tree
5352 handle_constructor_attribute (node, name, args, flags, no_add_attrs)
5353      tree *node;
5354      tree name;
5355      tree args ATTRIBUTE_UNUSED;
5356      int flags ATTRIBUTE_UNUSED;
5357      bool *no_add_attrs;
5358 {
5359   tree decl = *node;
5360   tree type = TREE_TYPE (decl);
5361
5362   if (TREE_CODE (decl) == FUNCTION_DECL
5363       && TREE_CODE (type) == FUNCTION_TYPE
5364       && decl_function_context (decl) == 0)
5365     {
5366       DECL_STATIC_CONSTRUCTOR (decl) = 1;
5367       TREE_USED (decl) = 1;
5368     }
5369   else
5370     {
5371       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5372       *no_add_attrs = true;
5373     }
5374
5375   return NULL_TREE;
5376 }
5377
5378 /* Handle a "destructor" attribute; arguments as in
5379    struct attribute_spec.handler.  */
5380
5381 static tree
5382 handle_destructor_attribute (node, name, args, flags, no_add_attrs)
5383      tree *node;
5384      tree name;
5385      tree args ATTRIBUTE_UNUSED;
5386      int flags ATTRIBUTE_UNUSED;
5387      bool *no_add_attrs;
5388 {
5389   tree decl = *node;
5390   tree type = TREE_TYPE (decl);
5391
5392   if (TREE_CODE (decl) == FUNCTION_DECL
5393       && TREE_CODE (type) == FUNCTION_TYPE
5394       && decl_function_context (decl) == 0)
5395     {
5396       DECL_STATIC_DESTRUCTOR (decl) = 1;
5397       TREE_USED (decl) = 1;
5398     }
5399   else
5400     {
5401       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5402       *no_add_attrs = true;
5403     }
5404
5405   return NULL_TREE;
5406 }
5407
5408 /* Handle a "mode" attribute; arguments as in
5409    struct attribute_spec.handler.  */
5410
5411 static tree
5412 handle_mode_attribute (node, name, args, flags, no_add_attrs)
5413      tree *node;
5414      tree name;
5415      tree args;
5416      int flags ATTRIBUTE_UNUSED;
5417      bool *no_add_attrs;
5418 {
5419   tree type = *node;
5420
5421   *no_add_attrs = true;
5422
5423   if (TREE_CODE (TREE_VALUE (args)) != IDENTIFIER_NODE)
5424     warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5425   else
5426     {
5427       int j;
5428       const char *p = IDENTIFIER_POINTER (TREE_VALUE (args));
5429       int len = strlen (p);
5430       enum machine_mode mode = VOIDmode;
5431       tree typefm;
5432
5433       if (len > 4 && p[0] == '_' && p[1] == '_'
5434           && p[len - 1] == '_' && p[len - 2] == '_')
5435         {
5436           char *newp = (char *) alloca (len - 1);
5437
5438           strcpy (newp, &p[2]);
5439           newp[len - 4] = '\0';
5440           p = newp;
5441         }
5442
5443       /* Change this type to have a type with the specified mode.
5444          First check for the special modes.  */
5445       if (! strcmp (p, "byte"))
5446         mode = byte_mode;
5447       else if (!strcmp (p, "word"))
5448         mode = word_mode;
5449       else if (! strcmp (p, "pointer"))
5450         mode = ptr_mode;
5451       else
5452         for (j = 0; j < NUM_MACHINE_MODES; j++)
5453           if (!strcmp (p, GET_MODE_NAME (j)))
5454             mode = (enum machine_mode) j;
5455
5456       if (mode == VOIDmode)
5457         error ("unknown machine mode `%s'", p);
5458       else if (0 == (typefm = (*lang_hooks.types.type_for_mode)
5459                      (mode, TREE_UNSIGNED (type))))
5460         error ("no data type for mode `%s'", p);
5461       else
5462         {
5463           /* If this is a vector, make sure we either have hardware
5464              support, or we can emulate it.  */
5465           if ((GET_MODE_CLASS (mode) == MODE_VECTOR_INT
5466                || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
5467               && !vector_mode_valid_p (mode))
5468             {
5469               error ("unable to emulate '%s'", GET_MODE_NAME (mode));
5470               return NULL_TREE;
5471             }
5472
5473           *node = typefm;
5474           /* No need to layout the type here.  The caller should do this.  */
5475         }
5476     }
5477
5478   return NULL_TREE;
5479 }
5480
5481 /* Handle a "section" attribute; arguments as in
5482    struct attribute_spec.handler.  */
5483
5484 static tree
5485 handle_section_attribute (node, name, args, flags, no_add_attrs)
5486      tree *node;
5487      tree name ATTRIBUTE_UNUSED;
5488      tree args;
5489      int flags ATTRIBUTE_UNUSED;
5490      bool *no_add_attrs;
5491 {
5492   tree decl = *node;
5493
5494   if (targetm.have_named_sections)
5495     {
5496       if ((TREE_CODE (decl) == FUNCTION_DECL
5497            || TREE_CODE (decl) == VAR_DECL)
5498           && TREE_CODE (TREE_VALUE (args)) == STRING_CST)
5499         {
5500           if (TREE_CODE (decl) == VAR_DECL
5501               && current_function_decl != NULL_TREE
5502               && ! TREE_STATIC (decl))
5503             {
5504               error_with_decl (decl,
5505                                "section attribute cannot be specified for local variables");
5506               *no_add_attrs = true;
5507             }
5508
5509           /* The decl may have already been given a section attribute
5510              from a previous declaration.  Ensure they match.  */
5511           else if (DECL_SECTION_NAME (decl) != NULL_TREE
5512                    && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
5513                               TREE_STRING_POINTER (TREE_VALUE (args))) != 0)
5514             {
5515               error_with_decl (*node,
5516                                "section of `%s' conflicts with previous declaration");
5517               *no_add_attrs = true;
5518             }
5519           else
5520             DECL_SECTION_NAME (decl) = TREE_VALUE (args);
5521         }
5522       else
5523         {
5524           error_with_decl (*node,
5525                            "section attribute not allowed for `%s'");
5526           *no_add_attrs = true;
5527         }
5528     }
5529   else
5530     {
5531       error_with_decl (*node,
5532                        "section attributes are not supported for this target");
5533       *no_add_attrs = true;
5534     }
5535
5536   return NULL_TREE;
5537 }
5538
5539 /* Handle a "aligned" attribute; arguments as in
5540    struct attribute_spec.handler.  */
5541
5542 static tree
5543 handle_aligned_attribute (node, name, args, flags, no_add_attrs)
5544      tree *node;
5545      tree name ATTRIBUTE_UNUSED;
5546      tree args;
5547      int flags;
5548      bool *no_add_attrs;
5549 {
5550   tree decl = NULL_TREE;
5551   tree *type = NULL;
5552   int is_type = 0;
5553   tree align_expr = (args ? TREE_VALUE (args)
5554                      : size_int (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
5555   int i;
5556
5557   if (DECL_P (*node))
5558     {
5559       decl = *node;
5560       type = &TREE_TYPE (decl);
5561       is_type = TREE_CODE (*node) == TYPE_DECL;
5562     }
5563   else if (TYPE_P (*node))
5564     type = node, is_type = 1;
5565
5566   /* Strip any NOPs of any kind.  */
5567   while (TREE_CODE (align_expr) == NOP_EXPR
5568          || TREE_CODE (align_expr) == CONVERT_EXPR
5569          || TREE_CODE (align_expr) == NON_LVALUE_EXPR)
5570     align_expr = TREE_OPERAND (align_expr, 0);
5571
5572   if (TREE_CODE (align_expr) != INTEGER_CST)
5573     {
5574       error ("requested alignment is not a constant");
5575       *no_add_attrs = true;
5576     }
5577   else if ((i = tree_log2 (align_expr)) == -1)
5578     {
5579       error ("requested alignment is not a power of 2");
5580       *no_add_attrs = true;
5581     }
5582   else if (i > HOST_BITS_PER_INT - 2)
5583     {
5584       error ("requested alignment is too large");
5585       *no_add_attrs = true;
5586     }
5587   else if (is_type)
5588     {
5589       /* If we have a TYPE_DECL, then copy the type, so that we
5590          don't accidentally modify a builtin type.  See pushdecl.  */
5591       if (decl && TREE_TYPE (decl) != error_mark_node
5592           && DECL_ORIGINAL_TYPE (decl) == NULL_TREE)
5593         {
5594           tree tt = TREE_TYPE (decl);
5595           *type = build_type_copy (*type);
5596           DECL_ORIGINAL_TYPE (decl) = tt;
5597           TYPE_NAME (*type) = decl;
5598           TREE_USED (*type) = TREE_USED (decl);
5599           TREE_TYPE (decl) = *type;
5600         }
5601       else if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
5602         *type = build_type_copy (*type);
5603
5604       TYPE_ALIGN (*type) = (1 << i) * BITS_PER_UNIT;
5605       TYPE_USER_ALIGN (*type) = 1;
5606     }
5607   else if (TREE_CODE (decl) != VAR_DECL
5608            && TREE_CODE (decl) != FIELD_DECL)
5609     {
5610       error_with_decl (decl,
5611                        "alignment may not be specified for `%s'");
5612       *no_add_attrs = true;
5613     }
5614   else
5615     {
5616       DECL_ALIGN (decl) = (1 << i) * BITS_PER_UNIT;
5617       DECL_USER_ALIGN (decl) = 1;
5618     }
5619
5620   return NULL_TREE;
5621 }
5622
5623 /* Handle a "weak" attribute; arguments as in
5624    struct attribute_spec.handler.  */
5625
5626 static tree
5627 handle_weak_attribute (node, name, args, flags, no_add_attrs)
5628      tree *node;
5629      tree name ATTRIBUTE_UNUSED;
5630      tree args ATTRIBUTE_UNUSED;
5631      int flags ATTRIBUTE_UNUSED;
5632      bool *no_add_attrs ATTRIBUTE_UNUSED;
5633 {
5634   declare_weak (*node);
5635
5636   return NULL_TREE;
5637 }
5638
5639 /* Handle an "alias" attribute; arguments as in
5640    struct attribute_spec.handler.  */
5641
5642 static tree
5643 handle_alias_attribute (node, name, args, flags, no_add_attrs)
5644      tree *node;
5645      tree name;
5646      tree args;
5647      int flags ATTRIBUTE_UNUSED;
5648      bool *no_add_attrs;
5649 {
5650   tree decl = *node;
5651
5652   if ((TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl))
5653       || (TREE_CODE (decl) != FUNCTION_DECL && ! DECL_EXTERNAL (decl)))
5654     {
5655       error_with_decl (decl,
5656                        "`%s' defined both normally and as an alias");
5657       *no_add_attrs = true;
5658     }
5659   else if (decl_function_context (decl) == 0)
5660     {
5661       tree id;
5662
5663       id = TREE_VALUE (args);
5664       if (TREE_CODE (id) != STRING_CST)
5665         {
5666           error ("alias arg not a string");
5667           *no_add_attrs = true;
5668           return NULL_TREE;
5669         }
5670       id = get_identifier (TREE_STRING_POINTER (id));
5671       /* This counts as a use of the object pointed to.  */
5672       TREE_USED (id) = 1;
5673
5674       if (TREE_CODE (decl) == FUNCTION_DECL)
5675         DECL_INITIAL (decl) = error_mark_node;
5676       else
5677         DECL_EXTERNAL (decl) = 0;
5678     }
5679   else
5680     {
5681       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5682       *no_add_attrs = true;
5683     }
5684
5685   return NULL_TREE;
5686 }
5687
5688 /* Handle an "visibility" attribute; arguments as in
5689    struct attribute_spec.handler.  */
5690
5691 static tree
5692 handle_visibility_attribute (node, name, args, flags, no_add_attrs)
5693      tree *node;
5694      tree name;
5695      tree args;
5696      int flags ATTRIBUTE_UNUSED;
5697      bool *no_add_attrs;
5698 {
5699   tree decl = *node;
5700
5701   if (decl_function_context (decl) != 0 || ! TREE_PUBLIC (decl))
5702     {
5703       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5704       *no_add_attrs = true;
5705     }
5706   else
5707     {
5708       tree id;
5709
5710       id = TREE_VALUE (args);
5711       if (TREE_CODE (id) != STRING_CST)
5712         {
5713           error ("visibility arg not a string");
5714           *no_add_attrs = true;
5715           return NULL_TREE;
5716         }
5717       if (strcmp (TREE_STRING_POINTER (id), "hidden")
5718           && strcmp (TREE_STRING_POINTER (id), "protected")
5719           && strcmp (TREE_STRING_POINTER (id), "internal"))
5720         {
5721           error ("visibility arg must be one of \"hidden\", \"protected\" or \"internal\"");
5722           *no_add_attrs = true;
5723           return NULL_TREE;
5724         }
5725     }
5726
5727   return NULL_TREE;
5728 }
5729
5730 /* Handle a "no_instrument_function" attribute; arguments as in
5731    struct attribute_spec.handler.  */
5732
5733 static tree
5734 handle_no_instrument_function_attribute (node, name, args, flags, no_add_attrs)
5735      tree *node;
5736      tree name;
5737      tree args ATTRIBUTE_UNUSED;
5738      int flags ATTRIBUTE_UNUSED;
5739      bool *no_add_attrs;
5740 {
5741   tree decl = *node;
5742
5743   if (TREE_CODE (decl) != FUNCTION_DECL)
5744     {
5745       error_with_decl (decl,
5746                        "`%s' attribute applies only to functions",
5747                        IDENTIFIER_POINTER (name));
5748       *no_add_attrs = true;
5749     }
5750   else if (DECL_INITIAL (decl))
5751     {
5752       error_with_decl (decl,
5753                        "can't set `%s' attribute after definition",
5754                        IDENTIFIER_POINTER (name));
5755       *no_add_attrs = true;
5756     }
5757   else
5758     DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
5759
5760   return NULL_TREE;
5761 }
5762
5763 /* Handle a "malloc" attribute; arguments as in
5764    struct attribute_spec.handler.  */
5765
5766 static tree
5767 handle_malloc_attribute (node, name, args, flags, no_add_attrs)
5768      tree *node;
5769      tree name;
5770      tree args ATTRIBUTE_UNUSED;
5771      int flags ATTRIBUTE_UNUSED;
5772      bool *no_add_attrs;
5773 {
5774   if (TREE_CODE (*node) == FUNCTION_DECL)
5775     DECL_IS_MALLOC (*node) = 1;
5776   /* ??? TODO: Support types.  */
5777   else
5778     {
5779       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5780       *no_add_attrs = true;
5781     }
5782
5783   return NULL_TREE;
5784 }
5785
5786 /* Handle a "no_limit_stack" attribute; arguments as in
5787    struct attribute_spec.handler.  */
5788
5789 static tree
5790 handle_no_limit_stack_attribute (node, name, args, flags, no_add_attrs)
5791      tree *node;
5792      tree name;
5793      tree args ATTRIBUTE_UNUSED;
5794      int flags ATTRIBUTE_UNUSED;
5795      bool *no_add_attrs;
5796 {
5797   tree decl = *node;
5798
5799   if (TREE_CODE (decl) != FUNCTION_DECL)
5800     {
5801       error_with_decl (decl,
5802                        "`%s' attribute applies only to functions",
5803                        IDENTIFIER_POINTER (name));
5804       *no_add_attrs = true;
5805     }
5806   else if (DECL_INITIAL (decl))
5807     {
5808       error_with_decl (decl,
5809                        "can't set `%s' attribute after definition",
5810                        IDENTIFIER_POINTER (name));
5811       *no_add_attrs = true;
5812     }
5813   else
5814     DECL_NO_LIMIT_STACK (decl) = 1;
5815
5816   return NULL_TREE;
5817 }
5818
5819 /* Handle a "pure" attribute; arguments as in
5820    struct attribute_spec.handler.  */
5821
5822 static tree
5823 handle_pure_attribute (node, name, args, flags, no_add_attrs)
5824      tree *node;
5825      tree name;
5826      tree args ATTRIBUTE_UNUSED;
5827      int flags ATTRIBUTE_UNUSED;
5828      bool *no_add_attrs;
5829 {
5830   if (TREE_CODE (*node) == FUNCTION_DECL)
5831     DECL_IS_PURE (*node) = 1;
5832   /* ??? TODO: Support types.  */
5833   else
5834     {
5835       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5836       *no_add_attrs = true;
5837     }
5838
5839   return NULL_TREE;
5840 }
5841
5842 /* Handle a "deprecated" attribute; arguments as in
5843    struct attribute_spec.handler.  */
5844    
5845 static tree
5846 handle_deprecated_attribute (node, name, args, flags, no_add_attrs)
5847      tree *node;
5848      tree name;
5849      tree args ATTRIBUTE_UNUSED;
5850      int flags;
5851      bool *no_add_attrs;
5852 {
5853   tree type = NULL_TREE;
5854   int warn = 0;
5855   const char *what = NULL;
5856   
5857   if (DECL_P (*node))
5858     {
5859       tree decl = *node;
5860       type = TREE_TYPE (decl);
5861       
5862       if (TREE_CODE (decl) == TYPE_DECL
5863           || TREE_CODE (decl) == PARM_DECL
5864           || TREE_CODE (decl) == VAR_DECL
5865           || TREE_CODE (decl) == FUNCTION_DECL
5866           || TREE_CODE (decl) == FIELD_DECL)
5867         TREE_DEPRECATED (decl) = 1;
5868       else
5869         warn = 1;
5870     }
5871   else if (TYPE_P (*node))
5872     {
5873       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
5874         *node = build_type_copy (*node);
5875       TREE_DEPRECATED (*node) = 1;
5876       type = *node;
5877     }
5878   else
5879     warn = 1;
5880   
5881   if (warn)
5882     {
5883       *no_add_attrs = true;
5884       if (type && TYPE_NAME (type))
5885         {
5886           if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
5887             what = IDENTIFIER_POINTER (TYPE_NAME (*node));
5888           else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
5889                    && DECL_NAME (TYPE_NAME (type)))
5890             what = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
5891         }
5892       if (what)
5893         warning ("`%s' attribute ignored for `%s'",
5894                   IDENTIFIER_POINTER (name), what);
5895       else
5896         warning ("`%s' attribute ignored", 
5897                       IDENTIFIER_POINTER (name));
5898     }
5899
5900   return NULL_TREE;
5901 }
5902
5903 /* Keep a list of vector type nodes we created in handle_vector_size_attribute,
5904    to prevent us from duplicating type nodes unnecessarily.
5905    The normal mechanism to prevent duplicates is to use type_hash_canon, but
5906    since we want to distinguish types that are essentially identical (except
5907    for their debug representation), we use a local list here.  */
5908 static tree vector_type_node_list = 0;
5909
5910 /* Handle a "vector_size" attribute; arguments as in
5911    struct attribute_spec.handler.  */
5912
5913 static tree
5914 handle_vector_size_attribute (node, name, args, flags, no_add_attrs)
5915      tree *node;
5916      tree name;
5917      tree args;
5918      int flags ATTRIBUTE_UNUSED;
5919      bool *no_add_attrs;
5920 {
5921   unsigned HOST_WIDE_INT vecsize, nunits;
5922   enum machine_mode mode, orig_mode, new_mode;
5923   tree type = *node, new_type = NULL_TREE;
5924   tree type_list_node;
5925
5926   *no_add_attrs = true;
5927
5928   if (! host_integerp (TREE_VALUE (args), 1))
5929     {
5930       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5931       return NULL_TREE;
5932     }
5933
5934   /* Get the vector size (in bytes).  */
5935   vecsize = tree_low_cst (TREE_VALUE (args), 1);
5936
5937   /* We need to provide for vector pointers, vector arrays, and
5938      functions returning vectors.  For example:
5939
5940        __attribute__((vector_size(16))) short *foo;
5941
5942      In this case, the mode is SI, but the type being modified is
5943      HI, so we need to look further.  */
5944
5945   while (POINTER_TYPE_P (type)
5946          || TREE_CODE (type) == FUNCTION_TYPE
5947          || TREE_CODE (type) == ARRAY_TYPE)
5948     type = TREE_TYPE (type);
5949
5950   /* Get the mode of the type being modified.  */
5951   orig_mode = TYPE_MODE (type);
5952
5953   if (TREE_CODE (type) == RECORD_TYPE
5954       || (GET_MODE_CLASS (orig_mode) != MODE_FLOAT
5955           && GET_MODE_CLASS (orig_mode) != MODE_INT)
5956       || ! host_integerp (TYPE_SIZE_UNIT (type), 1))
5957     {
5958       error ("invalid vector type for attribute `%s'",
5959              IDENTIFIER_POINTER (name));
5960       return NULL_TREE;
5961     }
5962
5963   /* Calculate how many units fit in the vector.  */
5964   nunits = vecsize / tree_low_cst (TYPE_SIZE_UNIT (type), 1);
5965
5966   /* Find a suitably sized vector.  */
5967   new_mode = VOIDmode;
5968   for (mode = GET_CLASS_NARROWEST_MODE (GET_MODE_CLASS (orig_mode) == MODE_INT
5969                                         ? MODE_VECTOR_INT
5970                                         : MODE_VECTOR_FLOAT);
5971        mode != VOIDmode;
5972        mode = GET_MODE_WIDER_MODE (mode))
5973     if (vecsize == GET_MODE_SIZE (mode)
5974         && nunits == (unsigned HOST_WIDE_INT) GET_MODE_NUNITS (mode))
5975       {
5976         new_mode = mode;
5977         break;
5978       }
5979
5980     if (new_mode == VOIDmode)
5981     {
5982       error ("no vector mode with the size and type specified could be found");
5983       return NULL_TREE;
5984     }
5985
5986   for (type_list_node = vector_type_node_list; type_list_node;
5987        type_list_node = TREE_CHAIN (type_list_node))
5988     {
5989       tree other_type = TREE_VALUE (type_list_node);
5990       tree record = TYPE_DEBUG_REPRESENTATION_TYPE (other_type);
5991       tree fields = TYPE_FIELDS (record);
5992       tree field_type = TREE_TYPE (fields);
5993       tree array_type = TREE_TYPE (field_type);
5994       if (TREE_CODE (fields) != FIELD_DECL
5995           || TREE_CODE (field_type) != ARRAY_TYPE)
5996         abort ();
5997
5998       if (TYPE_MODE (other_type) == mode && type == array_type)
5999         {
6000           new_type = other_type;
6001           break;
6002         }
6003     }
6004
6005   if (new_type == NULL_TREE)
6006     {
6007       tree index, array, rt, list_node;
6008
6009       new_type = (*lang_hooks.types.type_for_mode) (new_mode,
6010                                                     TREE_UNSIGNED (type));
6011
6012       if (!new_type)
6013         {
6014           error ("no vector mode with the size and type specified could be found");
6015           return NULL_TREE;
6016         }
6017
6018       new_type = build_type_copy (new_type);
6019
6020       /* If this is a vector, make sure we either have hardware
6021          support, or we can emulate it.  */
6022       if ((GET_MODE_CLASS (mode) == MODE_VECTOR_INT
6023            || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
6024           && !vector_mode_valid_p (mode))
6025         {
6026           error ("unable to emulate '%s'", GET_MODE_NAME (mode));
6027           return NULL_TREE;
6028         }
6029
6030       /* Set the debug information here, because this is the only
6031          place where we know the underlying type for a vector made
6032          with vector_size.  For debugging purposes we pretend a vector
6033          is an array within a structure.  */
6034       index = build_int_2 (TYPE_VECTOR_SUBPARTS (new_type) - 1, 0);
6035       array = build_array_type (type, build_index_type (index));
6036       rt = make_node (RECORD_TYPE);
6037
6038       TYPE_FIELDS (rt) = build_decl (FIELD_DECL, get_identifier ("f"), array);
6039       DECL_CONTEXT (TYPE_FIELDS (rt)) = rt;
6040       layout_type (rt);
6041       TYPE_DEBUG_REPRESENTATION_TYPE (new_type) = rt;
6042
6043       list_node = build_tree_list (NULL, new_type);
6044       TREE_CHAIN (list_node) = vector_type_node_list;
6045       vector_type_node_list = list_node;
6046     }
6047
6048   /* Build back pointers if needed.  */
6049   *node = vector_size_helper (*node, new_type);
6050
6051   return NULL_TREE;
6052 }
6053
6054 /* HACK.  GROSS.  This is absolutely disgusting.  I wish there was a
6055    better way.
6056
6057    If we requested a pointer to a vector, build up the pointers that
6058    we stripped off while looking for the inner type.  Similarly for
6059    return values from functions.
6060
6061    The argument "type" is the top of the chain, and "bottom" is the
6062    new type which we will point to.  */
6063
6064 static tree
6065 vector_size_helper (type, bottom)
6066      tree type, bottom;
6067 {
6068   tree inner, outer;
6069
6070   if (POINTER_TYPE_P (type))
6071     {
6072       inner = vector_size_helper (TREE_TYPE (type), bottom);
6073       outer = build_pointer_type (inner);
6074     }
6075   else if (TREE_CODE (type) == ARRAY_TYPE)
6076     {
6077       inner = vector_size_helper (TREE_TYPE (type), bottom);
6078       outer = build_array_type (inner, TYPE_VALUES (type));
6079     }
6080   else if (TREE_CODE (type) == FUNCTION_TYPE)
6081     {
6082       inner = vector_size_helper (TREE_TYPE (type), bottom);
6083       outer = build_function_type (inner, TYPE_VALUES (type));
6084     }
6085   else
6086     return bottom;
6087   
6088   TREE_READONLY (outer) = TREE_READONLY (type);
6089   TREE_THIS_VOLATILE (outer) = TREE_THIS_VOLATILE (type);
6090
6091   return outer;
6092 }
6093
6094 /* Handle the "nonnull" attribute.  */
6095 static tree
6096 handle_nonnull_attribute (node, name, args, flags, no_add_attrs)
6097      tree *node;
6098      tree name ATTRIBUTE_UNUSED;
6099      tree args;
6100      int flags ATTRIBUTE_UNUSED;
6101      bool *no_add_attrs;
6102 {
6103   tree type = *node;
6104   unsigned HOST_WIDE_INT attr_arg_num;
6105
6106   /* If no arguments are specified, all pointer arguments should be
6107      non-null.  Veryify a full prototype is given so that the arguments
6108      will have the correct types when we actually check them later.  */
6109   if (! args)
6110     {
6111       if (! TYPE_ARG_TYPES (type))
6112         {
6113           error ("nonnull attribute without arguments on a non-prototype");
6114           *no_add_attrs = true;
6115         }
6116       return NULL_TREE;
6117     }
6118
6119   /* Argument list specified.  Verify that each argument number references
6120      a pointer argument.  */
6121   for (attr_arg_num = 1; args; args = TREE_CHAIN (args))
6122     {
6123       tree argument;
6124       unsigned HOST_WIDE_INT arg_num, ck_num;
6125
6126       if (! get_nonnull_operand (TREE_VALUE (args), &arg_num))
6127         {
6128           error ("nonnull argument has invalid operand number (arg %lu)",
6129                  (unsigned long) attr_arg_num);
6130           *no_add_attrs = true;
6131           return NULL_TREE;
6132         }
6133
6134       argument = TYPE_ARG_TYPES (type);
6135       if (argument)
6136         {
6137           for (ck_num = 1; ; ck_num++)
6138             {
6139               if (! argument || ck_num == arg_num)
6140                 break;
6141               argument = TREE_CHAIN (argument);
6142             }
6143
6144           if (! argument
6145               || TREE_CODE (TREE_VALUE (argument)) == VOID_TYPE)
6146             {
6147               error ("nonnull argument with out-of-range operand number (arg %lu, operand %lu)",
6148                      (unsigned long) attr_arg_num, (unsigned long) arg_num);
6149               *no_add_attrs = true;
6150               return NULL_TREE;
6151             }
6152
6153           if (TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE)
6154             {
6155               error ("nonnull argument references non-pointer operand (arg %lu, operand %lu)",
6156                    (unsigned long) attr_arg_num, (unsigned long) arg_num);
6157               *no_add_attrs = true;
6158               return NULL_TREE;
6159             }
6160         }
6161     }
6162
6163   return NULL_TREE;
6164 }
6165
6166 /* Check the argument list of a function call for null in argument slots
6167    that are marked as requiring a non-null pointer argument.  */
6168
6169 static void
6170 check_function_nonnull (attrs, params)
6171      tree attrs;
6172      tree params;
6173 {
6174   tree a, args, param;
6175   int param_num;
6176
6177   for (a = attrs; a; a = TREE_CHAIN (a))
6178     {
6179       if (is_attribute_p ("nonnull", TREE_PURPOSE (a)))
6180         {
6181           args = TREE_VALUE (a);
6182
6183           /* Walk the argument list.  If we encounter an argument number we
6184              should check for non-null, do it.  If the attribute has no args,
6185              then every pointer argument is checked (in which case the check
6186              for pointer type is done in check_nonnull_arg).  */
6187           for (param = params, param_num = 1; ;
6188                param_num++, param = TREE_CHAIN (param))
6189             {
6190               if (! param)
6191                 break;
6192               if (! args || nonnull_check_p (args, param_num))
6193                 check_function_arguments_recurse (check_nonnull_arg, NULL,
6194                                                   TREE_VALUE (param),
6195                                                   param_num);
6196             }
6197         }
6198     }
6199 }
6200
6201 /* Helper for check_function_nonnull; given a list of operands which
6202    must be non-null in ARGS, determine if operand PARAM_NUM should be
6203    checked.  */
6204
6205 static bool
6206 nonnull_check_p (args, param_num)
6207      tree args;
6208      unsigned HOST_WIDE_INT param_num;
6209 {
6210   unsigned HOST_WIDE_INT arg_num;
6211
6212   for (; args; args = TREE_CHAIN (args))
6213     {
6214       if (! get_nonnull_operand (TREE_VALUE (args), &arg_num))
6215         abort ();
6216
6217       if (arg_num == param_num)
6218         return true;
6219     }
6220   return false;
6221 }
6222
6223 /* Check that the function argument PARAM (which is operand number
6224    PARAM_NUM) is non-null.  This is called by check_function_nonnull
6225    via check_function_arguments_recurse.  */
6226
6227 static void
6228 check_nonnull_arg (ctx, param, param_num)
6229      void *ctx ATTRIBUTE_UNUSED;
6230      tree param;
6231      unsigned HOST_WIDE_INT param_num;
6232 {
6233   /* Just skip checking the argument if it's not a pointer.  This can
6234      happen if the "nonnull" attribute was given without an operand
6235      list (which means to check every pointer argument).  */
6236
6237   if (TREE_CODE (TREE_TYPE (param)) != POINTER_TYPE)
6238     return;
6239
6240   if (integer_zerop (param))
6241     warning ("null argument where non-null required (arg %lu)",
6242              (unsigned long) param_num);
6243 }
6244
6245 /* Helper for nonnull attribute handling; fetch the operand number
6246    from the attribute argument list.  */
6247
6248 static bool
6249 get_nonnull_operand (arg_num_expr, valp)
6250      tree arg_num_expr;
6251      unsigned HOST_WIDE_INT *valp;
6252 {
6253   /* Strip any conversions from the arg number and verify they
6254      are constants.  */
6255   while (TREE_CODE (arg_num_expr) == NOP_EXPR
6256          || TREE_CODE (arg_num_expr) == CONVERT_EXPR
6257          || TREE_CODE (arg_num_expr) == NON_LVALUE_EXPR)
6258     arg_num_expr = TREE_OPERAND (arg_num_expr, 0);
6259
6260   if (TREE_CODE (arg_num_expr) != INTEGER_CST
6261       || TREE_INT_CST_HIGH (arg_num_expr) != 0)
6262     return false;
6263
6264   *valp = TREE_INT_CST_LOW (arg_num_expr);
6265   return true;
6266 }
6267
6268 /* Handle a "nothrow" attribute; arguments as in
6269    struct attribute_spec.handler.  */
6270
6271 static tree
6272 handle_nothrow_attribute (node, name, args, flags, no_add_attrs)
6273      tree *node;
6274      tree name;
6275      tree args ATTRIBUTE_UNUSED;
6276      int flags ATTRIBUTE_UNUSED;
6277      bool *no_add_attrs;
6278 {
6279   if (TREE_CODE (*node) == FUNCTION_DECL)
6280     TREE_NOTHROW (*node) = 1;
6281   /* ??? TODO: Support types.  */
6282   else
6283     {
6284       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
6285       *no_add_attrs = true;
6286     }
6287
6288   return NULL_TREE;
6289 }
6290 \f
6291 /* Check for valid arguments being passed to a function.  */
6292 void
6293 check_function_arguments (attrs, params)
6294      tree attrs;
6295      tree params;
6296 {
6297   /* Check for null being passed in a pointer argument that must be
6298      non-null.  We also need to do this if format checking is enabled.  */
6299
6300   if (warn_nonnull)
6301     check_function_nonnull (attrs, params);
6302
6303   /* Check for errors in format strings.  */
6304
6305   if (warn_format)
6306     check_function_format (NULL, attrs, params);
6307 }
6308
6309 /* Generic argument checking recursion routine.  PARAM is the argument to
6310    be checked.  PARAM_NUM is the number of the argument.  CALLBACK is invoked
6311    once the argument is resolved.  CTX is context for the callback.  */
6312 void
6313 check_function_arguments_recurse (callback, ctx, param, param_num)
6314      void (*callback) PARAMS ((void *, tree, unsigned HOST_WIDE_INT));
6315      void *ctx;
6316      tree param;
6317      unsigned HOST_WIDE_INT param_num;
6318 {
6319   if (TREE_CODE (param) == NOP_EXPR)
6320     {
6321       /* Strip coercion.  */
6322       check_function_arguments_recurse (callback, ctx,
6323                                         TREE_OPERAND (param, 0), param_num);
6324       return;
6325     }
6326
6327   if (TREE_CODE (param) == CALL_EXPR)
6328     {
6329       tree type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (param, 0)));
6330       tree attrs;
6331       bool found_format_arg = false;
6332
6333       /* See if this is a call to a known internationalization function
6334          that modifies a format arg.  Such a function may have multiple
6335          format_arg attributes (for example, ngettext).  */
6336
6337       for (attrs = TYPE_ATTRIBUTES (type);
6338            attrs;
6339            attrs = TREE_CHAIN (attrs))
6340         if (is_attribute_p ("format_arg", TREE_PURPOSE (attrs)))
6341           {
6342             tree inner_args;
6343             tree format_num_expr;
6344             int format_num;
6345             int i;
6346
6347             /* Extract the argument number, which was previously checked
6348                to be valid.  */
6349             format_num_expr = TREE_VALUE (TREE_VALUE (attrs));
6350             while (TREE_CODE (format_num_expr) == NOP_EXPR
6351                    || TREE_CODE (format_num_expr) == CONVERT_EXPR
6352                    || TREE_CODE (format_num_expr) == NON_LVALUE_EXPR)
6353               format_num_expr = TREE_OPERAND (format_num_expr, 0);
6354
6355             if (TREE_CODE (format_num_expr) != INTEGER_CST
6356                 || TREE_INT_CST_HIGH (format_num_expr) != 0)
6357               abort ();
6358
6359             format_num = TREE_INT_CST_LOW (format_num_expr);
6360
6361             for (inner_args = TREE_OPERAND (param, 1), i = 1;
6362                  inner_args != 0;
6363                  inner_args = TREE_CHAIN (inner_args), i++)
6364               if (i == format_num)
6365                 {
6366                   check_function_arguments_recurse (callback, ctx,
6367                                                     TREE_VALUE (inner_args),
6368                                                     param_num);
6369                   found_format_arg = true;
6370                   break;
6371                 }
6372           }
6373
6374       /* If we found a format_arg attribute and did a recursive check,
6375          we are done with checking this argument.  Otherwise, we continue
6376          and this will be considered a non-literal.  */
6377       if (found_format_arg)
6378         return;
6379     }
6380
6381   if (TREE_CODE (param) == COND_EXPR)
6382     {
6383       /* Check both halves of the conditional expression.  */
6384       check_function_arguments_recurse (callback, ctx,
6385                                         TREE_OPERAND (param, 1), param_num);
6386       check_function_arguments_recurse (callback, ctx,
6387                                         TREE_OPERAND (param, 2), param_num);
6388       return;
6389     }
6390
6391   (*callback) (ctx, param, param_num);
6392 }
6393
6394 #include "gt-c-common.h"