OSDN Git Service

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