OSDN Git Service

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