OSDN Git Service

PR c++/10278
[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
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 /* Nonzero if we can read a PCH file now.  */
191
192 int allow_pch = 1;
193 \f
194 /* Switches common to the C front ends.  */
195
196 /* Nonzero if prepreprocessing only.  */
197
198 int flag_preprocess_only;
199
200 /* Nonzero means don't output line number information.  */
201
202 char flag_no_line_commands;
203
204 /* Nonzero causes -E output not to be done, but directives such as
205    #define that have side effects are still obeyed.  */
206
207 char flag_no_output;
208
209 /* Nonzero means dump macros in some fashion.  */
210
211 char flag_dump_macros;
212
213 /* Nonzero means pass #include lines through to the output.  */
214
215 char flag_dump_includes;
216
217 /* The file name to which we should write a precompiled header, or
218    NULL if no header will be written in this compile.  */
219
220 const char *pch_file;
221
222 /* Nonzero if an ISO standard was selected.  It rejects macros in the
223    user's namespace.  */
224 int flag_iso;
225
226 /* Nonzero whenever Objective-C functionality is being used.  */
227 int flag_objc;
228
229 /* Nonzero if -undef was given.  It suppresses target built-in macros
230    and assertions.  */
231 int flag_undef;
232
233 /* Nonzero means don't recognize the non-ANSI builtin functions.  */
234
235 int flag_no_builtin;
236
237 /* Nonzero means don't recognize the non-ANSI builtin functions.
238    -ansi sets this.  */
239
240 int flag_no_nonansi_builtin;
241
242 /* Nonzero means give `double' the same size as `float'.  */
243
244 int flag_short_double;
245
246 /* Nonzero means give `wchar_t' the same size as `short'.  */
247
248 int flag_short_wchar;
249
250 /* Nonzero means allow Microsoft extensions without warnings or errors.  */
251 int flag_ms_extensions;
252
253 /* Nonzero means don't recognize the keyword `asm'.  */
254
255 int flag_no_asm;
256
257 /* Nonzero means give string constants the type `const char *', as mandated
258    by the standard.  */
259
260 int flag_const_strings;
261
262 /* Nonzero means `$' can be in an identifier.  */
263
264 #ifndef DOLLARS_IN_IDENTIFIERS
265 #define DOLLARS_IN_IDENTIFIERS 1
266 #endif
267 int dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
268
269 /* Nonzero means to treat bitfields as signed unless they say `unsigned'.  */
270
271 int flag_signed_bitfields = 1;
272 int explicit_flag_signed_bitfields;
273
274 /* Nonzero means warn about pointer casts that can drop a type qualifier
275    from the pointer target type.  */
276
277 int warn_cast_qual;
278
279 /* Warn about functions which might be candidates for format attributes.  */
280
281 int warn_missing_format_attribute;
282
283 /* Nonzero means warn about sizeof(function) or addition/subtraction
284    of function pointers.  */
285
286 int warn_pointer_arith;
287
288 /* Nonzero means warn for any global function def
289    without separate previous prototype decl.  */
290
291 int warn_missing_prototypes;
292
293 /* Warn if adding () is suggested.  */
294
295 int warn_parentheses;
296
297 /* Warn if initializer is not completely bracketed.  */
298
299 int warn_missing_braces;
300
301 /* Warn about comparison of signed and unsigned values.
302    If -1, neither -Wsign-compare nor -Wno-sign-compare has been specified.  */
303
304 int warn_sign_compare;
305
306 /* Nonzero means warn about usage of long long when `-pedantic'.  */
307
308 int warn_long_long = 1;
309
310 /* Nonzero means warn about deprecated conversion from string constant to
311    `char *'.  */
312
313 int warn_write_strings;
314
315 /* Nonzero means warn about multiple (redundant) decls for the same single
316    variable or function.  */
317
318 int warn_redundant_decls;
319
320 /* Warn about testing equality of floating point numbers.  */
321
322 int warn_float_equal;
323
324 /* Warn about a subscript that has type char.  */
325
326 int warn_char_subscripts;
327
328 /* Warn if a type conversion is done that might have confusing results.  */
329
330 int warn_conversion;
331
332 /* Warn about #pragma directives that are not recognized.  */      
333
334 int warn_unknown_pragmas; /* Tri state variable.  */  
335
336 /* Warn about format/argument anomalies in calls to formatted I/O functions
337    (*printf, *scanf, strftime, strfmon, etc.).  */
338
339 int warn_format;
340
341 /* Warn about Y2K problems with strftime formats.  */
342
343 int warn_format_y2k;
344
345 /* Warn about excess arguments to formats.  */
346
347 int warn_format_extra_args;
348
349 /* Warn about zero-length formats.  */
350
351 int warn_format_zero_length;
352
353 /* Warn about non-literal format arguments.  */
354
355 int warn_format_nonliteral;
356
357 /* Warn about possible security problems with calls to format functions.  */
358
359 int warn_format_security;
360
361
362 /* C/ObjC language option variables.  */
363
364
365 /* Nonzero means message about use of implicit function declarations;
366  1 means warning; 2 means error.  */
367
368 int mesg_implicit_function_declaration = -1;
369
370 /* Nonzero means allow type mismatches in conditional expressions;
371    just make their values `void'.  */
372
373 int flag_cond_mismatch;
374
375 /* Nonzero means enable C89 Amendment 1 features.  */
376
377 int flag_isoc94;
378
379 /* Nonzero means use the ISO C99 dialect of C.  */
380
381 int flag_isoc99;
382
383 /* Nonzero means that we have builtin functions, and main is an int */
384
385 int flag_hosted = 1;
386
387 /* Nonzero means add default format_arg attributes for functions not
388    in ISO C.  */
389
390 int flag_noniso_default_format_attributes = 1;
391
392 /* Nonzero means warn when casting a function call to a type that does
393    not match the return type (e.g. (float)sqrt() or (anything*)malloc()
394    when there is no previous declaration of sqrt or malloc.  */
395
396 int warn_bad_function_cast;
397
398 /* Warn about traditional constructs whose meanings changed in ANSI C.  */
399
400 int warn_traditional;
401
402 /* Nonzero means warn for non-prototype function decls
403    or non-prototyped defs without previous prototype.  */
404
405 int warn_strict_prototypes;
406
407 /* Nonzero means warn for any global function def
408    without separate previous decl.  */
409
410 int warn_missing_declarations;
411
412 /* Nonzero means warn about declarations of objects not at
413    file-scope level and about *all* declarations of functions (whether
414    or static) not at file-scope level.  Note that we exclude
415    implicit function declarations.  To get warnings about those, use
416    -Wimplicit.  */
417
418 int warn_nested_externs;
419
420 /* Warn if main is suspicious.  */
421
422 int warn_main;
423
424 /* Nonzero means warn about possible violations of sequence point rules.  */
425
426 int warn_sequence_point;
427
428 /* Nonzero means to warn about compile-time division by zero.  */
429 int warn_div_by_zero = 1;
430
431 /* Nonzero means warn about use of implicit int.  */
432
433 int warn_implicit_int;
434
435 /* Warn about NULL being passed to argument slots marked as requiring
436    non-NULL.  */ 
437       
438 int warn_nonnull;
439
440
441 /* ObjC language option variables.  */
442
443
444 /* Open and close the file for outputting class declarations, if
445    requested (ObjC).  */
446
447 int flag_gen_declaration;
448
449 /* Generate code for GNU or NeXT runtime environment.  */
450
451 #ifdef NEXT_OBJC_RUNTIME
452 int flag_next_runtime = 1;
453 #else
454 int flag_next_runtime = 0;
455 #endif
456
457 /* Tells the compiler that this is a special run.  Do not perform any
458    compiling, instead we are to test some platform dependent features
459    and output a C header file with appropriate definitions.  */
460
461 int print_struct_values;
462
463 /* ???.  Undocumented.  */
464
465 const char *constant_string_class_name;
466
467 /* Warn if multiple methods are seen for the same selector, but with
468    different argument types.  Performs the check on the whole selector
469    table at the end of compilation.  */
470
471 int warn_selector;
472
473 /* Warn if a @selector() is found, and no method with that selector
474    has been previously declared.  The check is done on each
475    @selector() as soon as it is found - so it warns about forward
476    declarations.  */
477
478 int warn_undeclared_selector;
479
480 /* Warn if methods required by a protocol are not implemented in the 
481    class adopting it.  When turned off, methods inherited to that
482    class are also considered implemented.  */
483
484 int warn_protocol = 1;
485
486
487 /* C++ language option variables.  */
488
489
490 /* Nonzero means don't recognize any extension keywords.  */
491
492 int flag_no_gnu_keywords;
493
494 /* Nonzero means do emit exported implementations of functions even if
495    they can be inlined.  */
496
497 int flag_implement_inlines = 1;
498
499 /* Nonzero means do emit exported implementations of templates, instead of
500    multiple static copies in each file that needs a definition.  */
501
502 int flag_external_templates;
503
504 /* Nonzero means that the decision to emit or not emit the implementation of a
505    template depends on where the template is instantiated, rather than where
506    it is defined.  */
507
508 int flag_alt_external_templates;
509
510 /* Nonzero means that implicit instantiations will be emitted if needed.  */
511
512 int flag_implicit_templates = 1;
513
514 /* Nonzero means that implicit instantiations of inline templates will be
515    emitted if needed, even if instantiations of non-inline templates
516    aren't.  */
517
518 int flag_implicit_inline_templates = 1;
519
520 /* Nonzero means generate separate instantiation control files and
521    juggle them at link time.  */
522
523 int flag_use_repository;
524
525 /* Nonzero if we want to issue diagnostics that the standard says are not
526    required.  */
527
528 int flag_optional_diags = 1;
529
530 /* Nonzero means we should attempt to elide constructors when possible.  */
531
532 int flag_elide_constructors = 1;
533
534 /* Nonzero means that member functions defined in class scope are
535    inline by default.  */
536
537 int flag_default_inline = 1;
538
539 /* Controls whether compiler generates 'type descriptor' that give
540    run-time type information.  */
541
542 int flag_rtti = 1;
543
544 /* Nonzero if we want to conserve space in the .o files.  We do this
545    by putting uninitialized data and runtime initialized data into
546    .common instead of .data at the expense of not flagging multiple
547    definitions.  */
548
549 int flag_conserve_space;
550
551 /* Nonzero if we want to obey access control semantics.  */
552
553 int flag_access_control = 1;
554
555 /* Nonzero if we want to check the return value of new and avoid calling
556    constructors if it is a null pointer.  */
557
558 int flag_check_new;
559
560 /* Nonzero if we want the new ISO rules for pushing a new scope for `for'
561    initialization variables.
562    0: Old rules, set by -fno-for-scope.
563    2: New ISO rules, set by -ffor-scope.
564    1: Try to implement new ISO rules, but with backup compatibility
565    (and warnings).  This is the default, for now.  */
566
567 int flag_new_for_scope = 1;
568
569 /* Nonzero if we want to emit defined symbols with common-like linkage as
570    weak symbols where possible, in order to conform to C++ semantics.
571    Otherwise, emit them as local symbols.  */
572
573 int flag_weak = 1;
574
575 /* Nonzero to use __cxa_atexit, rather than atexit, to register
576    destructors for local statics and global objects.  */
577
578 int flag_use_cxa_atexit = DEFAULT_USE_CXA_ATEXIT;
579
580 /* Nonzero means output .vtable_{entry,inherit} for use in doing vtable gc.  */
581
582 int flag_vtable_gc;
583
584 /* Nonzero means make the default pedwarns warnings instead of errors.
585    The value of this flag is ignored if -pedantic is specified.  */
586
587 int flag_permissive;
588
589 /* Nonzero means to implement standard semantics for exception
590    specifications, calling unexpected if an exception is thrown that
591    doesn't match the specification.  Zero means to treat them as
592    assertions and optimize accordingly, but not check them.  */
593
594 int flag_enforce_eh_specs = 1;
595
596 /*  The version of the C++ ABI in use.  The following values are
597     allowed:
598
599     0: The version of the ABI believed most conformant with the 
600        C++ ABI specification.  This ABI may change as bugs are
601        discovered and fixed.  Therefore, 0 will not necessarily
602        indicate the same ABI in different versions of G++.
603
604     1: The version of the ABI first used in G++ 3.2.
605
606     Additional positive integers will be assigned as new versions of
607     the ABI become the default version of the ABI.  */
608
609 int flag_abi_version = 1;
610
611 /* Nonzero means warn about things that will change when compiling
612    with an ABI-compliant compiler.  */
613
614 int warn_abi = 0;
615
616 /* Nonzero means warn about implicit declarations.  */
617
618 int warn_implicit = 1;
619
620 /* Nonzero means warn when all ctors or dtors are private, and the class
621    has no friends.  */
622
623 int warn_ctor_dtor_privacy = 1;
624
625 /* Nonzero means warn in function declared in derived class has the
626    same name as a virtual in the base class, but fails to match the
627    type signature of any virtual function in the base class.  */
628
629 int warn_overloaded_virtual;
630
631 /* Nonzero means warn when declaring a class that has a non virtual
632    destructor, when it really ought to have a virtual one.  */
633
634 int warn_nonvdtor;
635
636 /* Nonzero means warn when the compiler will reorder code.  */
637
638 int warn_reorder;
639
640 /* Nonzero means warn when synthesis behavior differs from Cfront's.  */
641
642 int warn_synth;
643
644 /* Nonzero means warn when we convert a pointer to member function
645    into a pointer to (void or function).  */
646
647 int warn_pmf2ptr = 1;
648
649 /* Nonzero means warn about violation of some Effective C++ style rules.  */
650
651 int warn_ecpp;
652
653 /* Nonzero means warn where overload resolution chooses a promotion from
654    unsigned to signed over a conversion to an unsigned of the same size.  */
655
656 int warn_sign_promo;
657
658 /* Nonzero means warn when an old-style cast is used.  */
659
660 int warn_old_style_cast;
661
662 /* Nonzero means warn when non-templatized friend functions are
663    declared within a template */
664
665 int warn_nontemplate_friend = 1;
666
667 /* Nonzero means complain about deprecated features.  */
668
669 int warn_deprecated = 1;
670
671 /* Maximum template instantiation depth.  This limit is rather
672    arbitrary, but it exists to limit the time it takes to notice
673    infinite template instantiations.  */
674
675 int max_tinst_depth = 500;
676
677
678
679 /* The elements of `ridpointers' are identifier nodes for the reserved
680    type names and storage classes.  It is indexed by a RID_... value.  */
681 tree *ridpointers;
682
683 tree (*make_fname_decl)                PARAMS ((tree, int));
684
685 /* If non-NULL, the address of a language-specific function that
686    returns 1 for language-specific statement codes.  */
687 int (*lang_statement_code_p)           PARAMS ((enum tree_code));
688
689 /* If non-NULL, the address of a language-specific function that takes
690    any action required right before expand_function_end is called.  */
691 void (*lang_expand_function_end)       PARAMS ((void));
692
693 /* Nonzero means the expression being parsed will never be evaluated.
694    This is a count, since unevaluated expressions can nest.  */
695 int skip_evaluation;
696
697 /* Information about how a function name is generated.  */
698 struct fname_var_t
699 {
700   tree *const decl;     /* pointer to the VAR_DECL.  */
701   const unsigned rid;   /* RID number for the identifier.  */
702   const int pretty;     /* How pretty is it? */
703 };
704
705 /* The three ways of getting then name of the current function.  */
706
707 const struct fname_var_t fname_vars[] =
708 {
709   /* C99 compliant __func__, must be first.  */
710   {&c99_function_name_decl_node, RID_C99_FUNCTION_NAME, 0},
711   /* GCC __FUNCTION__ compliant.  */
712   {&function_name_decl_node, RID_FUNCTION_NAME, 0},
713   /* GCC __PRETTY_FUNCTION__ compliant.  */
714   {&pretty_function_name_decl_node, RID_PRETTY_FUNCTION_NAME, 1},
715   {NULL, 0, 0},
716 };
717
718 static int constant_fits_type_p         PARAMS ((tree, tree));
719
720 /* Keep a stack of if statements.  We record the number of compound
721    statements seen up to the if keyword, as well as the line number
722    and file of the if.  If a potentially ambiguous else is seen, that
723    fact is recorded; the warning is issued when we can be sure that
724    the enclosing if statement does not have an else branch.  */
725 typedef struct
726 {
727   int compstmt_count;
728   int line;
729   const char *file;
730   int needs_warning;
731   tree if_stmt;
732 } if_elt;
733
734 static if_elt *if_stack;
735
736 /* Amount of space in the if statement stack.  */
737 static int if_stack_space = 0;
738
739 /* Stack pointer.  */
740 static int if_stack_pointer = 0;
741
742 static tree handle_packed_attribute     PARAMS ((tree *, tree, tree, int,
743                                                  bool *));
744 static tree handle_nocommon_attribute   PARAMS ((tree *, tree, tree, int,
745                                                  bool *));
746 static tree handle_common_attribute     PARAMS ((tree *, tree, tree, int,
747                                                  bool *));
748 static tree handle_noreturn_attribute   PARAMS ((tree *, tree, tree, int,
749                                                  bool *));
750 static tree handle_noinline_attribute   PARAMS ((tree *, tree, tree, int,
751                                                  bool *));
752 static tree handle_always_inline_attribute PARAMS ((tree *, tree, tree, int,
753                                                     bool *));
754 static tree handle_used_attribute       PARAMS ((tree *, tree, tree, int,
755                                                  bool *));
756 static tree handle_unused_attribute     PARAMS ((tree *, tree, tree, int,
757                                                  bool *));
758 static tree handle_const_attribute      PARAMS ((tree *, tree, tree, int,
759                                                  bool *));
760 static tree handle_transparent_union_attribute PARAMS ((tree *, tree, tree,
761                                                         int, bool *));
762 static tree handle_constructor_attribute PARAMS ((tree *, tree, tree, int,
763                                                   bool *));
764 static tree handle_destructor_attribute PARAMS ((tree *, tree, tree, int,
765                                                  bool *));
766 static tree handle_mode_attribute       PARAMS ((tree *, tree, tree, int,
767                                                  bool *));
768 static tree handle_section_attribute    PARAMS ((tree *, tree, tree, int,
769                                                  bool *));
770 static tree handle_aligned_attribute    PARAMS ((tree *, tree, tree, int,
771                                                  bool *));
772 static tree handle_weak_attribute       PARAMS ((tree *, tree, tree, int,
773                                                  bool *));
774 static tree handle_alias_attribute      PARAMS ((tree *, tree, tree, int,
775                                                  bool *));
776 static tree handle_visibility_attribute PARAMS ((tree *, tree, tree, int,
777                                                  bool *));
778 static tree handle_tls_model_attribute  PARAMS ((tree *, tree, tree, int,
779                                                  bool *));
780 static tree handle_no_instrument_function_attribute PARAMS ((tree *, tree,
781                                                              tree, int,
782                                                              bool *));
783 static tree handle_malloc_attribute     PARAMS ((tree *, tree, tree, int,
784                                                  bool *));
785 static tree handle_no_limit_stack_attribute PARAMS ((tree *, tree, tree, int,
786                                                      bool *));
787 static tree handle_pure_attribute       PARAMS ((tree *, tree, tree, int,
788                                                  bool *));
789 static tree handle_deprecated_attribute PARAMS ((tree *, tree, tree, int,
790                                                  bool *));
791 static tree handle_vector_size_attribute PARAMS ((tree *, tree, tree, int,
792                                                   bool *));
793 static tree handle_nonnull_attribute    PARAMS ((tree *, tree, tree, int,
794                                                  bool *));
795 static tree handle_nothrow_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   { NULL,                     0, 0, false, false, false, NULL }
874 };
875
876 /* Give the specifications for the format attributes, used by C and all
877    descendants.  */
878
879 const struct attribute_spec c_common_format_attribute_table[] =
880 {
881   /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
882   { "format",                 3, 3, false, true,  true,
883                               handle_format_attribute },
884   { "format_arg",             1, 1, false, true,  true,
885                               handle_format_arg_attribute },
886   { NULL,                     0, 0, false, false, false, NULL }
887 };
888
889 /* Record the start of an if-then, and record the start of it
890    for ambiguous else detection.
891
892    COND is the condition for the if-then statement.
893
894    IF_STMT is the statement node that has already been created for
895    this if-then statement.  It is created before parsing the
896    condition to keep line number information accurate.  */
897
898 void
899 c_expand_start_cond (cond, compstmt_count, if_stmt)
900      tree cond;
901      int compstmt_count;
902      tree if_stmt;
903 {
904   /* Make sure there is enough space on the stack.  */
905   if (if_stack_space == 0)
906     {
907       if_stack_space = 10;
908       if_stack = (if_elt *) xmalloc (10 * sizeof (if_elt));
909     }
910   else if (if_stack_space == if_stack_pointer)
911     {
912       if_stack_space += 10;
913       if_stack = (if_elt *) xrealloc (if_stack, if_stack_space * sizeof (if_elt));
914     }
915
916   IF_COND (if_stmt) = cond;
917   add_stmt (if_stmt);
918
919   /* Record this if statement.  */
920   if_stack[if_stack_pointer].compstmt_count = compstmt_count;
921   if_stack[if_stack_pointer].file = input_filename;
922   if_stack[if_stack_pointer].line = lineno;
923   if_stack[if_stack_pointer].needs_warning = 0;
924   if_stack[if_stack_pointer].if_stmt = if_stmt;
925   if_stack_pointer++;
926 }
927
928 /* Called after the then-clause for an if-statement is processed.  */
929
930 void
931 c_finish_then ()
932 {
933   tree if_stmt = if_stack[if_stack_pointer - 1].if_stmt;
934   RECHAIN_STMTS (if_stmt, THEN_CLAUSE (if_stmt));
935 }
936
937 /* Record the end of an if-then.  Optionally warn if a nested
938    if statement had an ambiguous else clause.  */
939
940 void
941 c_expand_end_cond ()
942 {
943   if_stack_pointer--;
944   if (if_stack[if_stack_pointer].needs_warning)
945     warning_with_file_and_line (if_stack[if_stack_pointer].file,
946                                 if_stack[if_stack_pointer].line,
947                                 "suggest explicit braces to avoid ambiguous `else'");
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 = lineno;
1163       lineno = 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       lineno = 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   if (builtin_name != 0)
3694     {
3695       bdecl = builtin_function (builtin_name, builtin_type, function_code,
3696                                 class, library_name_p ? name : NULL,
3697                                 attrs);
3698     }
3699   if (name != 0 && !flag_no_builtin && !builtin_function_disabled_p (name)
3700       && !(nonansi_p && flag_no_nonansi_builtin))
3701     {
3702       decl = builtin_function (name, type, function_code, class, NULL,
3703                                attrs);
3704       if (nonansi_p)
3705         DECL_BUILT_IN_NONANSI (decl) = 1;
3706     }
3707   return (bdecl != 0 ? bdecl : decl);
3708 }
3709 \f
3710 /* Nonzero if the type T promotes to int.  This is (nearly) the
3711    integral promotions defined in ISO C99 6.3.1.1/2.  */
3712
3713 bool
3714 c_promoting_integer_type_p (t)
3715      tree t;
3716 {
3717   switch (TREE_CODE (t))
3718     {
3719     case INTEGER_TYPE:
3720       return (TYPE_MAIN_VARIANT (t) == char_type_node
3721               || TYPE_MAIN_VARIANT (t) == signed_char_type_node
3722               || TYPE_MAIN_VARIANT (t) == unsigned_char_type_node
3723               || TYPE_MAIN_VARIANT (t) == short_integer_type_node
3724               || TYPE_MAIN_VARIANT (t) == short_unsigned_type_node
3725               || TYPE_PRECISION (t) < TYPE_PRECISION (integer_type_node));
3726
3727     case ENUMERAL_TYPE:
3728       /* ??? Technically all enumerations not larger than an int
3729          promote to an int.  But this is used along code paths
3730          that only want to notice a size change.  */
3731       return TYPE_PRECISION (t) < TYPE_PRECISION (integer_type_node);
3732
3733     case BOOLEAN_TYPE:
3734       return 1;
3735
3736     default:
3737       return 0;
3738     }
3739 }
3740
3741 /* Return 1 if PARMS specifies a fixed number of parameters
3742    and none of their types is affected by default promotions.  */
3743
3744 int
3745 self_promoting_args_p (parms)
3746      tree parms;
3747 {
3748   tree t;
3749   for (t = parms; t; t = TREE_CHAIN (t))
3750     {
3751       tree type = TREE_VALUE (t);
3752
3753       if (TREE_CHAIN (t) == 0 && type != void_type_node)
3754         return 0;
3755
3756       if (type == 0)
3757         return 0;
3758
3759       if (TYPE_MAIN_VARIANT (type) == float_type_node)
3760         return 0;
3761
3762       if (c_promoting_integer_type_p (type))
3763         return 0;
3764     }
3765   return 1;
3766 }
3767
3768 /* Recursively examines the array elements of TYPE, until a non-array
3769    element type is found.  */
3770
3771 tree
3772 strip_array_types (type)
3773      tree type;
3774 {
3775   while (TREE_CODE (type) == ARRAY_TYPE)
3776     type = TREE_TYPE (type);
3777
3778   return type;
3779 }
3780
3781 static tree expand_unordered_cmp PARAMS ((tree, tree, enum tree_code,
3782                                           enum tree_code));
3783
3784 /* Expand a call to an unordered comparison function such as
3785    __builtin_isgreater().  FUNCTION is the function's declaration and
3786    PARAMS a list of the values passed.  For __builtin_isunordered(),
3787    UNORDERED_CODE is UNORDERED_EXPR and ORDERED_CODE is NOP_EXPR.  In
3788    other cases, UNORDERED_CODE and ORDERED_CODE are comparison codes
3789    that give the opposite of the desired result.  UNORDERED_CODE is
3790    used for modes that can hold NaNs and ORDERED_CODE is used for the
3791    rest.  */
3792
3793 static tree
3794 expand_unordered_cmp (function, params, unordered_code, ordered_code)
3795      tree function, params;
3796      enum tree_code unordered_code, ordered_code;
3797 {
3798   tree arg0, arg1, type;
3799   enum tree_code code0, code1;
3800
3801   /* Check that we have exactly two arguments.  */
3802   if (params == 0 || TREE_CHAIN (params) == 0)
3803     {
3804       error ("too few arguments to function `%s'",
3805              IDENTIFIER_POINTER (DECL_NAME (function)));
3806       return error_mark_node;
3807     }
3808   else if (TREE_CHAIN (TREE_CHAIN (params)) != 0)
3809     {
3810       error ("too many arguments to function `%s'",
3811              IDENTIFIER_POINTER (DECL_NAME (function)));
3812       return error_mark_node;
3813     }
3814
3815   arg0 = TREE_VALUE (params);
3816   arg1 = TREE_VALUE (TREE_CHAIN (params));
3817
3818   code0 = TREE_CODE (TREE_TYPE (arg0));
3819   code1 = TREE_CODE (TREE_TYPE (arg1));
3820
3821   /* Make sure that the arguments have a common type of REAL.  */
3822   type = 0;
3823   if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
3824       && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
3825     type = common_type (TREE_TYPE (arg0), TREE_TYPE (arg1));
3826
3827   if (type == 0 || TREE_CODE (type) != REAL_TYPE)
3828     {
3829       error ("non-floating-point argument to function `%s'",
3830              IDENTIFIER_POINTER (DECL_NAME (function)));
3831       return error_mark_node;
3832     }
3833
3834   if (unordered_code == UNORDERED_EXPR)
3835     {
3836       if (MODE_HAS_NANS (TYPE_MODE (type)))
3837         return build_binary_op (unordered_code,
3838                                 convert (type, arg0),
3839                                 convert (type, arg1),
3840                                 0);
3841       else
3842         return integer_zero_node;
3843     }
3844
3845   return build_unary_op (TRUTH_NOT_EXPR,
3846                          build_binary_op (MODE_HAS_NANS (TYPE_MODE (type))
3847                                           ? unordered_code
3848                                           : ordered_code,
3849                                           convert (type, arg0),
3850                                           convert (type, arg1),
3851                                           0),
3852                          0);
3853 }
3854
3855
3856 /* Recognize certain built-in functions so we can make tree-codes
3857    other than CALL_EXPR.  We do this when it enables fold-const.c
3858    to do something useful.  */
3859 /* ??? By rights this should go in builtins.c, but only C and C++
3860    implement build_{binary,unary}_op.  Not exactly sure what bits
3861    of functionality are actually needed from those functions, or
3862    where the similar functionality exists in the other front ends.  */
3863
3864 tree
3865 expand_tree_builtin (function, params, coerced_params)
3866      tree function, params, coerced_params;
3867 {
3868   if (DECL_BUILT_IN_CLASS (function) != BUILT_IN_NORMAL)
3869     return NULL_TREE;
3870
3871   switch (DECL_FUNCTION_CODE (function))
3872     {
3873     case BUILT_IN_ABS:
3874     case BUILT_IN_LABS:
3875     case BUILT_IN_LLABS:
3876     case BUILT_IN_IMAXABS:
3877     case BUILT_IN_FABS:
3878     case BUILT_IN_FABSL:
3879     case BUILT_IN_FABSF:
3880       if (coerced_params == 0)
3881         return integer_zero_node;
3882       return build_unary_op (ABS_EXPR, TREE_VALUE (coerced_params), 0);
3883
3884     case BUILT_IN_CONJ:
3885     case BUILT_IN_CONJF:
3886     case BUILT_IN_CONJL:
3887       if (coerced_params == 0)
3888         return integer_zero_node;
3889       return build_unary_op (CONJ_EXPR, TREE_VALUE (coerced_params), 0);
3890
3891     case BUILT_IN_CREAL:
3892     case BUILT_IN_CREALF:
3893     case BUILT_IN_CREALL:
3894       if (coerced_params == 0)
3895         return integer_zero_node;
3896       return build_unary_op (REALPART_EXPR, TREE_VALUE (coerced_params), 0);
3897
3898     case BUILT_IN_CIMAG:
3899     case BUILT_IN_CIMAGF:
3900     case BUILT_IN_CIMAGL:
3901       if (coerced_params == 0)
3902         return integer_zero_node;
3903       return build_unary_op (IMAGPART_EXPR, TREE_VALUE (coerced_params), 0);
3904
3905     case BUILT_IN_ISGREATER:
3906       return expand_unordered_cmp (function, params, UNLE_EXPR, LE_EXPR);
3907
3908     case BUILT_IN_ISGREATEREQUAL:
3909       return expand_unordered_cmp (function, params, UNLT_EXPR, LT_EXPR);
3910
3911     case BUILT_IN_ISLESS:
3912       return expand_unordered_cmp (function, params, UNGE_EXPR, GE_EXPR);
3913
3914     case BUILT_IN_ISLESSEQUAL:
3915       return expand_unordered_cmp (function, params, UNGT_EXPR, GT_EXPR);
3916
3917     case BUILT_IN_ISLESSGREATER:
3918       return expand_unordered_cmp (function, params, UNEQ_EXPR, EQ_EXPR);
3919
3920     case BUILT_IN_ISUNORDERED:
3921       return expand_unordered_cmp (function, params, UNORDERED_EXPR, NOP_EXPR);
3922
3923     default:
3924       break;
3925     }
3926
3927   return NULL_TREE;
3928 }
3929
3930 /* Returns nonzero if CODE is the code for a statement.  */
3931
3932 int
3933 statement_code_p (code)
3934      enum tree_code code;
3935 {
3936   switch (code)
3937     {
3938     case CLEANUP_STMT:
3939     case EXPR_STMT:
3940     case COMPOUND_STMT:
3941     case DECL_STMT:
3942     case IF_STMT:
3943     case FOR_STMT:
3944     case WHILE_STMT:
3945     case DO_STMT:
3946     case RETURN_STMT:
3947     case BREAK_STMT:
3948     case CONTINUE_STMT:
3949     case SCOPE_STMT:
3950     case SWITCH_STMT:
3951     case GOTO_STMT:
3952     case LABEL_STMT:
3953     case ASM_STMT:
3954     case FILE_STMT:
3955     case CASE_LABEL:
3956       return 1;
3957
3958     default:
3959       if (lang_statement_code_p)
3960         return (*lang_statement_code_p) (code);
3961       return 0;
3962     }
3963 }
3964
3965 /* Walk the statement tree, rooted at *tp.  Apply FUNC to all the
3966    sub-trees of *TP in a pre-order traversal.  FUNC is called with the
3967    DATA and the address of each sub-tree.  If FUNC returns a non-NULL
3968    value, the traversal is aborted, and the value returned by FUNC is
3969    returned.  If FUNC sets WALK_SUBTREES to zero, then the subtrees of
3970    the node being visited are not walked.
3971
3972    We don't need a without_duplicates variant of this one because the
3973    statement tree is a tree, not a graph.  */
3974
3975 tree 
3976 walk_stmt_tree (tp, func, data)
3977      tree *tp;
3978      walk_tree_fn func;
3979      void *data;
3980 {
3981   enum tree_code code;
3982   int walk_subtrees;
3983   tree result;
3984   int i, len;
3985
3986 #define WALK_SUBTREE(NODE)                              \
3987   do                                                    \
3988     {                                                   \
3989       result = walk_stmt_tree (&(NODE), func, data);    \
3990       if (result)                                       \
3991         return result;                                  \
3992     }                                                   \
3993   while (0)
3994
3995   /* Skip empty subtrees.  */
3996   if (!*tp)
3997     return NULL_TREE;
3998
3999   /* Skip subtrees below non-statement nodes.  */
4000   if (!statement_code_p (TREE_CODE (*tp)))
4001     return NULL_TREE;
4002
4003   /* Call the function.  */
4004   walk_subtrees = 1;
4005   result = (*func) (tp, &walk_subtrees, data);
4006
4007   /* If we found something, return it.  */
4008   if (result)
4009     return result;
4010
4011   /* FUNC may have modified the tree, recheck that we're looking at a
4012      statement node.  */
4013   code = TREE_CODE (*tp);
4014   if (!statement_code_p (code))
4015     return NULL_TREE;
4016
4017   /* Visit the subtrees unless FUNC decided that there was nothing
4018      interesting below this point in the tree.  */
4019   if (walk_subtrees)
4020     {
4021       /* Walk over all the sub-trees of this operand.  Statement nodes
4022          never contain RTL, and we needn't worry about TARGET_EXPRs.  */
4023       len = TREE_CODE_LENGTH (code);
4024
4025       /* Go through the subtrees.  We need to do this in forward order so
4026          that the scope of a FOR_EXPR is handled properly.  */
4027       for (i = 0; i < len; ++i)
4028         WALK_SUBTREE (TREE_OPERAND (*tp, i));
4029     }
4030
4031   /* Finally visit the chain.  This can be tail-recursion optimized if
4032      we write it this way.  */
4033   return walk_stmt_tree (&TREE_CHAIN (*tp), func, data);
4034
4035 #undef WALK_SUBTREE
4036 }
4037
4038 /* Used to compare case labels.  K1 and K2 are actually tree nodes
4039    representing case labels, or NULL_TREE for a `default' label.
4040    Returns -1 if K1 is ordered before K2, -1 if K1 is ordered after
4041    K2, and 0 if K1 and K2 are equal.  */
4042
4043 int
4044 case_compare (k1, k2)
4045      splay_tree_key k1;
4046      splay_tree_key k2;
4047 {
4048   /* Consider a NULL key (such as arises with a `default' label) to be
4049      smaller than anything else.  */
4050   if (!k1)
4051     return k2 ? -1 : 0;
4052   else if (!k2)
4053     return k1 ? 1 : 0;
4054
4055   return tree_int_cst_compare ((tree) k1, (tree) k2);
4056 }
4057
4058 /* Process a case label for the range LOW_VALUE ... HIGH_VALUE.  If
4059    LOW_VALUE and HIGH_VALUE are both NULL_TREE then this case label is
4060    actually a `default' label.  If only HIGH_VALUE is NULL_TREE, then
4061    case label was declared using the usual C/C++ syntax, rather than
4062    the GNU case range extension.  CASES is a tree containing all the
4063    case ranges processed so far; COND is the condition for the
4064    switch-statement itself.  Returns the CASE_LABEL created, or
4065    ERROR_MARK_NODE if no CASE_LABEL is created.  */
4066
4067 tree
4068 c_add_case_label (cases, cond, low_value, high_value)
4069      splay_tree cases;
4070      tree cond;
4071      tree low_value;
4072      tree high_value;
4073 {
4074   tree type;
4075   tree label;
4076   tree case_label;
4077   splay_tree_node node;
4078
4079   /* Create the LABEL_DECL itself.  */
4080   label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
4081   DECL_CONTEXT (label) = current_function_decl;
4082
4083   /* If there was an error processing the switch condition, bail now
4084      before we get more confused.  */
4085   if (!cond || cond == error_mark_node)
4086     {
4087       /* Add a label anyhow so that the back-end doesn't think that
4088          the beginning of the switch is unreachable.  */
4089       if (!cases->root)
4090         add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
4091       return error_mark_node;
4092     }
4093
4094   if ((low_value && TREE_TYPE (low_value) 
4095        && POINTER_TYPE_P (TREE_TYPE (low_value))) 
4096       || (high_value && TREE_TYPE (high_value)
4097           && POINTER_TYPE_P (TREE_TYPE (high_value))))
4098     error ("pointers are not permitted as case values");
4099
4100   /* Case ranges are a GNU extension.  */
4101   if (high_value && pedantic)
4102     {
4103       if (c_language == clk_cplusplus)
4104         pedwarn ("ISO C++ forbids range expressions in switch statements");
4105       else
4106         pedwarn ("ISO C forbids range expressions in switch statements");
4107     }
4108
4109   type = TREE_TYPE (cond);
4110   if (low_value)
4111     {
4112       low_value = check_case_value (low_value);
4113       low_value = convert_and_check (type, low_value);
4114     }
4115   if (high_value)
4116     {
4117       high_value = check_case_value (high_value);
4118       high_value = convert_and_check (type, high_value);
4119     }
4120
4121   /* If an error has occurred, bail out now.  */
4122   if (low_value == error_mark_node || high_value == error_mark_node)
4123     {
4124       if (!cases->root)
4125         add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
4126       return error_mark_node;
4127     }
4128
4129   /* If the LOW_VALUE and HIGH_VALUE are the same, then this isn't
4130      really a case range, even though it was written that way.  Remove
4131      the HIGH_VALUE to simplify later processing.  */
4132   if (tree_int_cst_equal (low_value, high_value))
4133     high_value = NULL_TREE;
4134   if (low_value && high_value 
4135       && !tree_int_cst_lt (low_value, high_value)) 
4136     warning ("empty range specified");
4137
4138   /* Look up the LOW_VALUE in the table of case labels we already
4139      have.  */
4140   node = splay_tree_lookup (cases, (splay_tree_key) low_value);
4141   /* If there was not an exact match, check for overlapping ranges.
4142      There's no need to do this if there's no LOW_VALUE or HIGH_VALUE;
4143      that's a `default' label and the only overlap is an exact match.  */
4144   if (!node && (low_value || high_value))
4145     {
4146       splay_tree_node low_bound;
4147       splay_tree_node high_bound;
4148
4149       /* Even though there wasn't an exact match, there might be an
4150          overlap between this case range and another case range.
4151          Since we've (inductively) not allowed any overlapping case
4152          ranges, we simply need to find the greatest low case label
4153          that is smaller that LOW_VALUE, and the smallest low case
4154          label that is greater than LOW_VALUE.  If there is an overlap
4155          it will occur in one of these two ranges.  */
4156       low_bound = splay_tree_predecessor (cases,
4157                                           (splay_tree_key) low_value);
4158       high_bound = splay_tree_successor (cases,
4159                                          (splay_tree_key) low_value);
4160
4161       /* Check to see if the LOW_BOUND overlaps.  It is smaller than
4162          the LOW_VALUE, so there is no need to check unless the
4163          LOW_BOUND is in fact itself a case range.  */
4164       if (low_bound
4165           && CASE_HIGH ((tree) low_bound->value)
4166           && tree_int_cst_compare (CASE_HIGH ((tree) low_bound->value),
4167                                     low_value) >= 0)
4168         node = low_bound;
4169       /* Check to see if the HIGH_BOUND overlaps.  The low end of that
4170          range is bigger than the low end of the current range, so we
4171          are only interested if the current range is a real range, and
4172          not an ordinary case label.  */
4173       else if (high_bound 
4174                && high_value
4175                && (tree_int_cst_compare ((tree) high_bound->key,
4176                                          high_value)
4177                    <= 0))
4178         node = high_bound;
4179     }
4180   /* If there was an overlap, issue an error.  */
4181   if (node)
4182     {
4183       tree duplicate = CASE_LABEL_DECL ((tree) node->value);
4184
4185       if (high_value)
4186         {
4187           error ("duplicate (or overlapping) case value");
4188           error_with_decl (duplicate, 
4189                            "this is the first entry overlapping that value");
4190         }
4191       else if (low_value)
4192         {
4193           error ("duplicate case value") ;
4194           error_with_decl (duplicate, "previously used here");
4195         }
4196       else
4197         {
4198           error ("multiple default labels in one switch");
4199           error_with_decl (duplicate, "this is the first default label");
4200         }
4201       if (!cases->root)
4202         add_stmt (build_case_label (NULL_TREE, NULL_TREE, label));
4203     }
4204
4205   /* Add a CASE_LABEL to the statement-tree.  */
4206   case_label = add_stmt (build_case_label (low_value, high_value, label));
4207   /* Register this case label in the splay tree.  */
4208   splay_tree_insert (cases, 
4209                      (splay_tree_key) low_value,
4210                      (splay_tree_value) case_label);
4211
4212   return case_label;
4213 }
4214
4215 /* Finish an expression taking the address of LABEL (an
4216    IDENTIFIER_NODE).  Returns an expression for the address.  */
4217
4218 tree 
4219 finish_label_address_expr (label)
4220      tree label;
4221 {
4222   tree result;
4223
4224   if (pedantic)
4225     {
4226       if (c_language == clk_cplusplus)
4227         pedwarn ("ISO C++ forbids taking the address of a label");
4228       else
4229         pedwarn ("ISO C forbids taking the address of a label");
4230     }
4231
4232   if (label == error_mark_node)
4233     return error_mark_node;
4234
4235   label = lookup_label (label);
4236   if (label == NULL_TREE)
4237     result = null_pointer_node;
4238   else
4239     {
4240       TREE_USED (label) = 1;
4241       result = build1 (ADDR_EXPR, ptr_type_node, label);
4242       TREE_CONSTANT (result) = 1;
4243       /* The current function in not necessarily uninlinable.
4244          Computed gotos are incompatible with inlining, but the value
4245          here could be used only in a diagnostic, for example.  */
4246     }
4247
4248   return result;
4249 }
4250
4251 /* Hook used by expand_expr to expand language-specific tree codes.  */
4252
4253 rtx
4254 c_expand_expr (exp, target, tmode, modifier)
4255      tree exp;
4256      rtx target;
4257      enum machine_mode tmode;
4258      int modifier;  /* Actually enum_modifier.  */
4259 {
4260   switch (TREE_CODE (exp))
4261     {
4262     case STMT_EXPR:
4263       {
4264         tree rtl_expr;
4265         rtx result;
4266         bool preserve_result = false;
4267         bool return_target = false;
4268
4269         /* Since expand_expr_stmt calls free_temp_slots after every
4270            expression statement, we must call push_temp_slots here.
4271            Otherwise, any temporaries in use now would be considered
4272            out-of-scope after the first EXPR_STMT from within the
4273            STMT_EXPR.  */
4274         push_temp_slots ();
4275         rtl_expr = expand_start_stmt_expr (!STMT_EXPR_NO_SCOPE (exp));
4276
4277         /* If we want the result of this expression, find the last
4278            EXPR_STMT in the COMPOUND_STMT and mark it as addressable.  */
4279         if (target != const0_rtx
4280             && TREE_CODE (STMT_EXPR_STMT (exp)) == COMPOUND_STMT
4281             && TREE_CODE (COMPOUND_BODY (STMT_EXPR_STMT (exp))) == SCOPE_STMT)
4282           {
4283             tree expr = COMPOUND_BODY (STMT_EXPR_STMT (exp));
4284             tree last = TREE_CHAIN (expr);
4285
4286             while (TREE_CHAIN (last))
4287               {
4288                 expr = last;
4289                 last = TREE_CHAIN (last);
4290               }
4291
4292             if (TREE_CODE (last) == SCOPE_STMT
4293                 && TREE_CODE (expr) == EXPR_STMT)
4294               {
4295                 if (target && TREE_CODE (EXPR_STMT_EXPR (expr)) == VAR_DECL
4296                     && DECL_RTL_IF_SET (EXPR_STMT_EXPR (expr)) == target)
4297                   /* If the last expression is a variable whose RTL is the
4298                      same as our target, just return the target; if it
4299                      isn't valid expanding the decl would produce different
4300                      RTL, and store_expr would try to do a copy.  */
4301                   return_target = true;
4302                 else
4303                   {
4304                     /* Otherwise, note that we want the value from the last
4305                        expression.  */
4306                     TREE_ADDRESSABLE (expr) = 1;
4307                     preserve_result = true;
4308                   }
4309               }
4310           }
4311
4312         expand_stmt (STMT_EXPR_STMT (exp));
4313         expand_end_stmt_expr (rtl_expr);
4314
4315         result = expand_expr (rtl_expr, target, tmode, modifier);
4316         if (return_target)
4317           result = target;
4318         else if (preserve_result && GET_CODE (result) == MEM)
4319           {
4320             if (GET_MODE (result) != BLKmode)
4321               result = copy_to_reg (result);
4322             else
4323               preserve_temp_slots (result);
4324           }
4325
4326         /* If the statment-expression does not have a scope, then the
4327            new temporaries we created within it must live beyond the
4328            statement-expression.  */
4329         if (STMT_EXPR_NO_SCOPE (exp))
4330           preserve_temp_slots (NULL_RTX);
4331
4332         pop_temp_slots ();
4333         return result;
4334       }
4335       break;
4336       
4337     case CALL_EXPR:
4338       {
4339         if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
4340             && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
4341                 == FUNCTION_DECL)
4342             && DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
4343             && (DECL_BUILT_IN_CLASS (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
4344                 == BUILT_IN_FRONTEND))
4345           return c_expand_builtin (exp, target, tmode, modifier);
4346         else
4347           abort ();
4348       }
4349       break;
4350
4351     case COMPOUND_LITERAL_EXPR:
4352       {
4353         /* Initialize the anonymous variable declared in the compound
4354            literal, then return the variable.  */
4355         tree decl = COMPOUND_LITERAL_EXPR_DECL (exp);
4356         emit_local_var (decl);
4357         return expand_expr (decl, target, tmode, modifier);
4358       }
4359
4360     default:
4361       abort ();
4362     }
4363
4364   abort ();
4365   return NULL;
4366 }
4367
4368 /* Hook used by safe_from_p to handle language-specific tree codes.  */
4369
4370 int
4371 c_safe_from_p (target, exp)
4372      rtx target;
4373      tree exp;
4374 {
4375   /* We can see statements here when processing the body of a
4376      statement-expression.  For a declaration statement declaring a
4377      variable, look at the variable's initializer.  */
4378   if (TREE_CODE (exp) == DECL_STMT) 
4379     {
4380       tree decl = DECL_STMT_DECL (exp);
4381
4382       if (TREE_CODE (decl) == VAR_DECL
4383           && DECL_INITIAL (decl)
4384           && !safe_from_p (target, DECL_INITIAL (decl), /*top_p=*/0))
4385         return 0;
4386     }
4387
4388   /* For any statement, we must follow the statement-chain.  */
4389   if (statement_code_p (TREE_CODE (exp)) && TREE_CHAIN (exp))
4390     return safe_from_p (target, TREE_CHAIN (exp), /*top_p=*/0);
4391
4392   /* Assume everything else is safe.  */
4393   return 1;
4394 }
4395
4396 /* Hook used by unsafe_for_reeval to handle language-specific tree codes.  */
4397
4398 int
4399 c_common_unsafe_for_reeval (exp)
4400      tree exp;
4401 {
4402   /* Statement expressions may not be reevaluated, likewise compound
4403      literals.  */
4404   if (TREE_CODE (exp) == STMT_EXPR
4405       || TREE_CODE (exp) == COMPOUND_LITERAL_EXPR)
4406     return 2;
4407
4408   /* Walk all other expressions.  */
4409   return -1;
4410 }
4411
4412 /* Hook used by staticp to handle language-specific tree codes.  */
4413
4414 int
4415 c_staticp (exp)
4416      tree exp;
4417 {
4418   if (TREE_CODE (exp) == COMPOUND_LITERAL_EXPR
4419       && TREE_STATIC (COMPOUND_LITERAL_EXPR_DECL (exp)))
4420     return 1;
4421   return 0;
4422 }
4423
4424 #define CALLED_AS_BUILT_IN(NODE) \
4425    (!strncmp (IDENTIFIER_POINTER (DECL_NAME (NODE)), "__builtin_", 10))
4426
4427 static rtx
4428 c_expand_builtin (exp, target, tmode, modifier)
4429      tree exp;
4430      rtx target;
4431      enum machine_mode tmode;
4432      enum expand_modifier modifier;
4433 {
4434   tree type = TREE_TYPE (exp);
4435   tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
4436   tree arglist = TREE_OPERAND (exp, 1);
4437   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
4438   enum tree_code code = TREE_CODE (exp);
4439   const int ignore = (target == const0_rtx
4440                       || ((code == NON_LVALUE_EXPR || code == NOP_EXPR
4441                            || code == CONVERT_EXPR || code == REFERENCE_EXPR
4442                            || code == COND_EXPR)
4443                           && TREE_CODE (type) == VOID_TYPE));
4444
4445   if (! optimize && ! CALLED_AS_BUILT_IN (fndecl))
4446     return expand_call (exp, target, ignore);
4447
4448   switch (fcode)
4449     {
4450     case BUILT_IN_PRINTF:
4451       target = c_expand_builtin_printf (arglist, target, tmode,
4452                                         modifier, ignore, /*unlocked=*/ 0);
4453       if (target)
4454         return target;
4455       break;
4456
4457     case BUILT_IN_PRINTF_UNLOCKED:
4458       target = c_expand_builtin_printf (arglist, target, tmode,
4459                                         modifier, ignore, /*unlocked=*/ 1);
4460       if (target)
4461         return target;
4462       break;
4463
4464     case BUILT_IN_FPRINTF:
4465       target = c_expand_builtin_fprintf (arglist, target, tmode,
4466                                          modifier, ignore, /*unlocked=*/ 0);
4467       if (target)
4468         return target;
4469       break;
4470
4471     case BUILT_IN_FPRINTF_UNLOCKED:
4472       target = c_expand_builtin_fprintf (arglist, target, tmode,
4473                                          modifier, ignore, /*unlocked=*/ 1);
4474       if (target)
4475         return target;
4476       break;
4477
4478     default:                    /* just do library call, if unknown builtin */
4479       error ("built-in function `%s' not currently supported",
4480              IDENTIFIER_POINTER (DECL_NAME (fndecl)));
4481     }
4482
4483   /* The switch statement above can drop through to cause the function
4484      to be called normally.  */
4485   return expand_call (exp, target, ignore);
4486 }
4487
4488 /* Check an arglist to *printf for problems.  The arglist should start
4489    at the format specifier, with the remaining arguments immediately
4490    following it.  */
4491 static int
4492 is_valid_printf_arglist (arglist)
4493      tree arglist;
4494 {
4495   /* Save this value so we can restore it later.  */
4496   const int SAVE_pedantic = pedantic;
4497   int diagnostic_occurred = 0;
4498   tree attrs;
4499
4500   /* Set this to a known value so the user setting won't affect code
4501      generation.  */
4502   pedantic = 1;
4503   /* Check to make sure there are no format specifier errors.  */
4504   attrs = tree_cons (get_identifier ("format"),
4505                      tree_cons (NULL_TREE,
4506                                 get_identifier ("printf"),
4507                                 tree_cons (NULL_TREE,
4508                                            integer_one_node,
4509                                            tree_cons (NULL_TREE,
4510                                                       build_int_2 (2, 0),
4511                                                       NULL_TREE))),
4512                      NULL_TREE);
4513   check_function_format (&diagnostic_occurred, attrs, arglist);
4514
4515   /* Restore the value of `pedantic'.  */
4516   pedantic = SAVE_pedantic;
4517
4518   /* If calling `check_function_format_ptr' produces a warning, we
4519      return false, otherwise we return true.  */
4520   return ! diagnostic_occurred;
4521 }
4522
4523 /* If the arguments passed to printf are suitable for optimizations,
4524    we attempt to transform the call.  */
4525 static rtx
4526 c_expand_builtin_printf (arglist, target, tmode, modifier, ignore, unlocked)
4527      tree arglist;
4528      rtx target;
4529      enum machine_mode tmode;
4530      enum expand_modifier modifier;
4531      int ignore;
4532      int unlocked;
4533 {
4534   tree fn_putchar = unlocked ?
4535     implicit_built_in_decls[BUILT_IN_PUTCHAR_UNLOCKED] : implicit_built_in_decls[BUILT_IN_PUTCHAR];
4536   tree fn_puts = unlocked ?
4537     implicit_built_in_decls[BUILT_IN_PUTS_UNLOCKED] : implicit_built_in_decls[BUILT_IN_PUTS];
4538   tree fn, format_arg, stripped_string;
4539
4540   /* If the return value is used, or the replacement _DECL isn't
4541      initialized, don't do the transformation.  */
4542   if (!ignore || !fn_putchar || !fn_puts)
4543     return 0;
4544
4545   /* Verify the required arguments in the original call.  */
4546   if (arglist == 0
4547       || (TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != POINTER_TYPE))
4548     return 0;
4549   
4550   /* Check the specifier vs. the parameters.  */
4551   if (!is_valid_printf_arglist (arglist))
4552     return 0;
4553   
4554   format_arg = TREE_VALUE (arglist);
4555   stripped_string = format_arg;
4556   STRIP_NOPS (stripped_string);
4557   if (stripped_string && TREE_CODE (stripped_string) == ADDR_EXPR)
4558     stripped_string = TREE_OPERAND (stripped_string, 0);
4559
4560   /* If the format specifier isn't a STRING_CST, punt.  */
4561   if (TREE_CODE (stripped_string) != STRING_CST)
4562     return 0;
4563   
4564   /* OK!  We can attempt optimization.  */
4565
4566   /* If the format specifier was "%s\n", call __builtin_puts(arg2).  */
4567   if (strcmp (TREE_STRING_POINTER (stripped_string), "%s\n") == 0)
4568     {
4569       arglist = TREE_CHAIN (arglist);
4570       fn = fn_puts;
4571     }
4572   /* If the format specifier was "%c", call __builtin_putchar (arg2).  */
4573   else if (strcmp (TREE_STRING_POINTER (stripped_string), "%c") == 0)
4574     {
4575       arglist = TREE_CHAIN (arglist);
4576       fn = fn_putchar;
4577     }
4578   else
4579     {
4580       /* We can't handle anything else with % args or %% ... yet.  */
4581       if (strchr (TREE_STRING_POINTER (stripped_string), '%'))
4582         return 0;
4583       
4584       /* If the resulting constant string has a length of 1, call
4585          putchar.  Note, TREE_STRING_LENGTH includes the terminating
4586          NULL in its count.  */
4587       if (TREE_STRING_LENGTH (stripped_string) == 2)
4588         {
4589           /* Given printf("c"), (where c is any one character,)
4590              convert "c"[0] to an int and pass that to the replacement
4591              function.  */
4592           arglist = build_int_2 (TREE_STRING_POINTER (stripped_string)[0], 0);
4593           arglist = build_tree_list (NULL_TREE, arglist);
4594           
4595           fn = fn_putchar;
4596         }
4597       /* If the resulting constant was "string\n", call
4598          __builtin_puts("string").  Ensure "string" has at least one
4599          character besides the trailing \n.  Note, TREE_STRING_LENGTH
4600          includes the terminating NULL in its count.  */
4601       else if (TREE_STRING_LENGTH (stripped_string) > 2
4602                && TREE_STRING_POINTER (stripped_string)
4603                [TREE_STRING_LENGTH (stripped_string) - 2] == '\n')
4604         {
4605           /* Create a NULL-terminated string that's one char shorter
4606              than the original, stripping off the trailing '\n'.  */
4607           const int newlen = TREE_STRING_LENGTH (stripped_string) - 1;
4608           char *newstr = (char *) alloca (newlen);
4609           memcpy (newstr, TREE_STRING_POINTER (stripped_string), newlen - 1);
4610           newstr[newlen - 1] = 0;
4611           
4612           arglist = fix_string_type (build_string (newlen, newstr));
4613           arglist = build_tree_list (NULL_TREE, arglist);
4614           fn = fn_puts;
4615         }
4616       else
4617         /* We'd like to arrange to call fputs(string) here, but we
4618            need stdout and don't have a way to get it ... yet.  */
4619         return 0;
4620     }
4621   
4622   return expand_expr (build_function_call (fn, arglist),
4623                       (ignore ? const0_rtx : target),
4624                       tmode, modifier);
4625 }
4626
4627 /* If the arguments passed to fprintf are suitable for optimizations,
4628    we attempt to transform the call.  */
4629 static rtx
4630 c_expand_builtin_fprintf (arglist, target, tmode, modifier, ignore, unlocked)
4631      tree arglist;
4632      rtx target;
4633      enum machine_mode tmode;
4634      enum expand_modifier modifier;
4635      int ignore;
4636      int unlocked;
4637 {
4638   tree fn_fputc = unlocked ?
4639     implicit_built_in_decls[BUILT_IN_FPUTC_UNLOCKED] : implicit_built_in_decls[BUILT_IN_FPUTC];
4640   tree fn_fputs = unlocked ?
4641     implicit_built_in_decls[BUILT_IN_FPUTS_UNLOCKED] : implicit_built_in_decls[BUILT_IN_FPUTS];
4642   tree fn, format_arg, stripped_string;
4643
4644   /* If the return value is used, or the replacement _DECL isn't
4645      initialized, don't do the transformation.  */
4646   if (!ignore || !fn_fputc || !fn_fputs)
4647     return 0;
4648
4649   /* Verify the required arguments in the original call.  */
4650   if (arglist == 0
4651       || (TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != POINTER_TYPE)
4652       || (TREE_CHAIN (arglist) == 0)
4653       || (TREE_CODE (TREE_TYPE (TREE_VALUE (TREE_CHAIN (arglist)))) !=
4654           POINTER_TYPE))
4655     return 0;
4656   
4657   /* Check the specifier vs. the parameters.  */
4658   if (!is_valid_printf_arglist (TREE_CHAIN (arglist)))
4659     return 0;
4660   
4661   format_arg = TREE_VALUE (TREE_CHAIN (arglist));
4662   stripped_string = format_arg;
4663   STRIP_NOPS (stripped_string);
4664   if (stripped_string && TREE_CODE (stripped_string) == ADDR_EXPR)
4665     stripped_string = TREE_OPERAND (stripped_string, 0);
4666
4667   /* If the format specifier isn't a STRING_CST, punt.  */
4668   if (TREE_CODE (stripped_string) != STRING_CST)
4669     return 0;
4670   
4671   /* OK!  We can attempt optimization.  */
4672
4673   /* If the format specifier was "%s", call __builtin_fputs(arg3, arg1).  */
4674   if (strcmp (TREE_STRING_POINTER (stripped_string), "%s") == 0)
4675     {
4676       tree newarglist = build_tree_list (NULL_TREE, TREE_VALUE (arglist));
4677       arglist = tree_cons (NULL_TREE,
4678                            TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))),
4679                            newarglist);
4680       fn = fn_fputs;
4681     }
4682   /* If the format specifier was "%c", call __builtin_fputc (arg3, arg1).  */
4683   else if (strcmp (TREE_STRING_POINTER (stripped_string), "%c") == 0)
4684     {
4685       tree newarglist = build_tree_list (NULL_TREE, TREE_VALUE (arglist));
4686       arglist = tree_cons (NULL_TREE,
4687                            TREE_VALUE (TREE_CHAIN (TREE_CHAIN (arglist))),
4688                            newarglist);
4689       fn = fn_fputc;
4690     }
4691   else
4692     {
4693       /* We can't handle anything else with % args or %% ... yet.  */
4694       if (strchr (TREE_STRING_POINTER (stripped_string), '%'))
4695         return 0;
4696       
4697       /* When "string" doesn't contain %, replace all cases of
4698          fprintf(stream,string) with fputs(string,stream).  The fputs
4699          builtin will take take of special cases like length==1.  */
4700       arglist = tree_cons (NULL_TREE, TREE_VALUE (TREE_CHAIN (arglist)),
4701                            build_tree_list (NULL_TREE, TREE_VALUE (arglist)));
4702       fn = fn_fputs;
4703     }
4704   
4705   return expand_expr (build_function_call (fn, arglist),
4706                       (ignore ? const0_rtx : target),
4707                       tmode, modifier);
4708 }
4709 \f
4710
4711 /* Given a boolean expression ARG, return a tree representing an increment
4712    or decrement (as indicated by CODE) of ARG.  The front end must check for
4713    invalid cases (e.g., decrement in C++).  */
4714 tree
4715 boolean_increment (code, arg)
4716      enum tree_code code;
4717      tree arg;
4718 {
4719   tree val;
4720   tree true_res = (c_language == clk_cplusplus
4721                    ? boolean_true_node
4722                    : c_bool_true_node);
4723   arg = stabilize_reference (arg);
4724   switch (code)
4725     {
4726     case PREINCREMENT_EXPR:
4727       val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, true_res);
4728       break;
4729     case POSTINCREMENT_EXPR:
4730       val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, true_res);
4731       arg = save_expr (arg);
4732       val = build (COMPOUND_EXPR, TREE_TYPE (arg), val, arg);
4733       val = build (COMPOUND_EXPR, TREE_TYPE (arg), arg, val);
4734       break;
4735     case PREDECREMENT_EXPR:
4736       val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, invert_truthvalue (arg));
4737       break;
4738     case POSTDECREMENT_EXPR:
4739       val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, invert_truthvalue (arg));
4740       arg = save_expr (arg);
4741       val = build (COMPOUND_EXPR, TREE_TYPE (arg), val, arg);
4742       val = build (COMPOUND_EXPR, TREE_TYPE (arg), arg, val);
4743       break;
4744     default:
4745       abort ();
4746     }
4747   TREE_SIDE_EFFECTS (val) = 1;
4748   return val;
4749 }
4750 \f
4751 /* Built-in macros for stddef.h, that require macros defined in this
4752    file.  */
4753 void
4754 c_stddef_cpp_builtins()
4755 {
4756   builtin_define_with_value ("__SIZE_TYPE__", SIZE_TYPE, 0);
4757   builtin_define_with_value ("__PTRDIFF_TYPE__", PTRDIFF_TYPE, 0);
4758   builtin_define_with_value ("__WCHAR_TYPE__", MODIFIED_WCHAR_TYPE, 0);
4759   builtin_define_with_value ("__WINT_TYPE__", WINT_TYPE, 0);
4760 }
4761
4762 static void
4763 c_init_attributes ()
4764 {
4765   /* Fill in the built_in_attributes array.  */
4766 #define DEF_ATTR_NULL_TREE(ENUM)                \
4767   built_in_attributes[(int) ENUM] = NULL_TREE;
4768 #define DEF_ATTR_INT(ENUM, VALUE)                                            \
4769   built_in_attributes[(int) ENUM] = build_int_2 (VALUE, VALUE < 0 ? -1 : 0);
4770 #define DEF_ATTR_IDENT(ENUM, STRING)                            \
4771   built_in_attributes[(int) ENUM] = get_identifier (STRING);
4772 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) \
4773   built_in_attributes[(int) ENUM]                       \
4774     = tree_cons (built_in_attributes[(int) PURPOSE],    \
4775                  built_in_attributes[(int) VALUE],      \
4776                  built_in_attributes[(int) CHAIN]);
4777 #define DEF_FN_ATTR(NAME, ATTRS, PREDICATE) /* No initialization needed.  */
4778 #include "builtin-attrs.def"
4779 #undef DEF_ATTR_NULL_TREE
4780 #undef DEF_ATTR_INT
4781 #undef DEF_ATTR_IDENT
4782 #undef DEF_ATTR_TREE_LIST
4783 #undef DEF_FN_ATTR
4784   c_attrs_initialized = true;
4785 }
4786
4787 /* Depending on the name of DECL, apply default attributes to it.  */
4788
4789 void
4790 c_common_insert_default_attributes (decl)
4791      tree decl;
4792 {
4793   tree name = DECL_NAME (decl);
4794
4795   if (!c_attrs_initialized)
4796     c_init_attributes ();
4797
4798 #define DEF_ATTR_NULL_TREE(ENUM) /* Nothing needed after initialization.  */
4799 #define DEF_ATTR_INT(ENUM, VALUE)
4800 #define DEF_ATTR_IDENT(ENUM, STRING)
4801 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN)
4802 #define DEF_FN_ATTR(NAME, ATTRS, PREDICATE)                     \
4803   if ((PREDICATE) && name == built_in_attributes[(int) NAME])   \
4804     decl_attributes (&decl, built_in_attributes[(int) ATTRS],   \
4805                      ATTR_FLAG_BUILT_IN);
4806 #include "builtin-attrs.def"
4807 #undef DEF_ATTR_NULL_TREE
4808 #undef DEF_ATTR_INT
4809 #undef DEF_ATTR_IDENT
4810 #undef DEF_ATTR_TREE_LIST
4811 #undef DEF_FN_ATTR
4812 }
4813
4814 /* Output a -Wshadow warning MSGCODE about NAME, and give the location
4815    of the previous declaration DECL.  MANDATORY says whether this is a
4816    mandatory warning (i.e. use pedwarn).  */
4817 void
4818 shadow_warning (msgcode, mandatory, name, decl)
4819      enum sw_kind msgcode;
4820      int mandatory;  /* really bool */
4821      const char *name;
4822      tree decl;
4823 {
4824   static const char *const msgs[] = {
4825     /* SW_PARAM  */ N_("declaration of \"%s\" shadows a parameter"),
4826     /* SW_LOCAL  */ N_("declaration of \"%s\" shadows a previous local"),
4827     /* SW_GLOBAL */ N_("declaration of \"%s\" shadows a global declaration")
4828   };
4829
4830   (mandatory ? pedwarn : warning) (msgs[msgcode], name);
4831   warning_with_file_and_line (DECL_SOURCE_FILE (decl),
4832                               DECL_SOURCE_LINE (decl),
4833                               "shadowed declaration is here");
4834 }
4835
4836 /* Attribute handlers common to C front ends.  */
4837
4838 /* Handle a "packed" attribute; arguments as in
4839    struct attribute_spec.handler.  */
4840
4841 static tree
4842 handle_packed_attribute (node, name, args, flags, no_add_attrs)
4843      tree *node;
4844      tree name;
4845      tree args ATTRIBUTE_UNUSED;
4846      int flags;
4847      bool *no_add_attrs;
4848 {
4849   tree *type = NULL;
4850   if (DECL_P (*node))
4851     {
4852       if (TREE_CODE (*node) == TYPE_DECL)
4853         type = &TREE_TYPE (*node);
4854     }
4855   else
4856     type = node;
4857
4858   if (type)
4859     {
4860       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
4861         *type = build_type_copy (*type);
4862       TYPE_PACKED (*type) = 1;
4863     }
4864   else if (TREE_CODE (*node) == FIELD_DECL)
4865     DECL_PACKED (*node) = 1;
4866   /* We can't set DECL_PACKED for a VAR_DECL, because the bit is
4867      used for DECL_REGISTER.  It wouldn't mean anything anyway.  */
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 "nocommon" attribute; arguments as in
4878    struct attribute_spec.handler.  */
4879
4880 static tree
4881 handle_nocommon_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   if (TREE_CODE (*node) == VAR_DECL)
4889     DECL_COMMON (*node) = 0;
4890   else
4891     {
4892       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4893       *no_add_attrs = true;
4894     }
4895
4896   return NULL_TREE;
4897 }
4898
4899 /* Handle a "common" attribute; arguments as in
4900    struct attribute_spec.handler.  */
4901
4902 static tree
4903 handle_common_attribute (node, name, args, flags, no_add_attrs)
4904      tree *node;
4905      tree name;
4906      tree args ATTRIBUTE_UNUSED;
4907      int flags ATTRIBUTE_UNUSED;
4908      bool *no_add_attrs;
4909 {
4910   if (TREE_CODE (*node) == VAR_DECL)
4911     DECL_COMMON (*node) = 1;
4912   else
4913     {
4914       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4915       *no_add_attrs = true;
4916     }
4917
4918   return NULL_TREE;
4919 }
4920
4921 /* Handle a "noreturn" attribute; arguments as in
4922    struct attribute_spec.handler.  */
4923
4924 static tree
4925 handle_noreturn_attribute (node, name, args, flags, no_add_attrs)
4926      tree *node;
4927      tree name;
4928      tree args ATTRIBUTE_UNUSED;
4929      int flags ATTRIBUTE_UNUSED;
4930      bool *no_add_attrs;
4931 {
4932   tree type = TREE_TYPE (*node);
4933
4934   /* See FIXME comment in c_common_attribute_table.  */
4935   if (TREE_CODE (*node) == FUNCTION_DECL)
4936     TREE_THIS_VOLATILE (*node) = 1;
4937   else if (TREE_CODE (type) == POINTER_TYPE
4938            && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
4939     TREE_TYPE (*node)
4940       = build_pointer_type
4941         (build_type_variant (TREE_TYPE (type),
4942                              TREE_READONLY (TREE_TYPE (type)), 1));
4943   else
4944     {
4945       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4946       *no_add_attrs = true;
4947     }
4948
4949   return NULL_TREE;
4950 }
4951
4952 /* Handle a "noinline" attribute; arguments as in
4953    struct attribute_spec.handler.  */
4954
4955 static tree
4956 handle_noinline_attribute (node, name, args, flags, no_add_attrs)
4957      tree *node;
4958      tree name;
4959      tree args ATTRIBUTE_UNUSED;
4960      int flags ATTRIBUTE_UNUSED;
4961      bool *no_add_attrs;
4962 {
4963   if (TREE_CODE (*node) == FUNCTION_DECL)
4964     DECL_UNINLINABLE (*node) = 1;
4965   else
4966     {
4967       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4968       *no_add_attrs = true;
4969     }
4970
4971   return NULL_TREE;
4972 }
4973
4974 /* Handle a "always_inline" attribute; arguments as in
4975    struct attribute_spec.handler.  */
4976
4977 static tree
4978 handle_always_inline_attribute (node, name, args, flags, no_add_attrs)
4979      tree *node;
4980      tree name;
4981      tree args ATTRIBUTE_UNUSED;
4982      int flags ATTRIBUTE_UNUSED;
4983      bool *no_add_attrs;
4984 {
4985   if (TREE_CODE (*node) == FUNCTION_DECL)
4986     {
4987       /* Do nothing else, just set the attribute.  We'll get at
4988          it later with lookup_attribute.  */
4989     }
4990   else
4991     {
4992       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
4993       *no_add_attrs = true;
4994     }
4995
4996   return NULL_TREE;
4997 }
4998
4999 /* Handle a "used" attribute; arguments as in
5000    struct attribute_spec.handler.  */
5001
5002 static tree
5003 handle_used_attribute (pnode, name, args, flags, no_add_attrs)
5004      tree *pnode;
5005      tree name;
5006      tree args ATTRIBUTE_UNUSED;
5007      int flags ATTRIBUTE_UNUSED;
5008      bool *no_add_attrs;
5009 {
5010   tree node = *pnode;
5011
5012   if (TREE_CODE (node) == FUNCTION_DECL
5013       || (TREE_CODE (node) == VAR_DECL && TREE_STATIC (node)))
5014     TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (node))
5015       = TREE_USED (node) = 1;
5016   else
5017     {
5018       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5019       *no_add_attrs = true;
5020     }
5021
5022   return NULL_TREE;
5023 }
5024
5025 /* Handle a "unused" attribute; arguments as in
5026    struct attribute_spec.handler.  */
5027
5028 static tree
5029 handle_unused_attribute (node, name, args, flags, no_add_attrs)
5030      tree *node;
5031      tree name;
5032      tree args ATTRIBUTE_UNUSED;
5033      int flags;
5034      bool *no_add_attrs;
5035 {
5036   if (DECL_P (*node))
5037     {
5038       tree decl = *node;
5039
5040       if (TREE_CODE (decl) == PARM_DECL
5041           || TREE_CODE (decl) == VAR_DECL
5042           || TREE_CODE (decl) == FUNCTION_DECL
5043           || TREE_CODE (decl) == LABEL_DECL
5044           || TREE_CODE (decl) == TYPE_DECL)
5045         TREE_USED (decl) = 1;
5046       else
5047         {
5048           warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5049           *no_add_attrs = true;
5050         }
5051     }
5052   else
5053     {
5054       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
5055         *node = build_type_copy (*node);
5056       TREE_USED (*node) = 1;
5057     }
5058
5059   return NULL_TREE;
5060 }
5061
5062 /* Handle a "const" attribute; arguments as in
5063    struct attribute_spec.handler.  */
5064
5065 static tree
5066 handle_const_attribute (node, name, args, flags, no_add_attrs)
5067      tree *node;
5068      tree name;
5069      tree args ATTRIBUTE_UNUSED;
5070      int flags ATTRIBUTE_UNUSED;
5071      bool *no_add_attrs;
5072 {
5073   tree type = TREE_TYPE (*node);
5074
5075   /* See FIXME comment on noreturn in c_common_attribute_table.  */
5076   if (TREE_CODE (*node) == FUNCTION_DECL)
5077     TREE_READONLY (*node) = 1;
5078   else if (TREE_CODE (type) == POINTER_TYPE
5079            && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
5080     TREE_TYPE (*node)
5081       = build_pointer_type
5082         (build_type_variant (TREE_TYPE (type), 1,
5083                              TREE_THIS_VOLATILE (TREE_TYPE (type))));
5084   else
5085     {
5086       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5087       *no_add_attrs = true;
5088     }
5089
5090   return NULL_TREE;
5091 }
5092
5093 /* Handle a "transparent_union" attribute; arguments as in
5094    struct attribute_spec.handler.  */
5095
5096 static tree
5097 handle_transparent_union_attribute (node, name, args, flags, no_add_attrs)
5098      tree *node;
5099      tree name;
5100      tree args ATTRIBUTE_UNUSED;
5101      int flags;
5102      bool *no_add_attrs;
5103 {
5104   tree decl = NULL_TREE;
5105   tree *type = NULL;
5106   int is_type = 0;
5107
5108   if (DECL_P (*node))
5109     {
5110       decl = *node;
5111       type = &TREE_TYPE (decl);
5112       is_type = TREE_CODE (*node) == TYPE_DECL;
5113     }
5114   else if (TYPE_P (*node))
5115     type = node, is_type = 1;
5116
5117   if (is_type
5118       && TREE_CODE (*type) == UNION_TYPE
5119       && (decl == 0
5120           || (TYPE_FIELDS (*type) != 0
5121               && TYPE_MODE (*type) == DECL_MODE (TYPE_FIELDS (*type)))))
5122     {
5123       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
5124         *type = build_type_copy (*type);
5125       TYPE_TRANSPARENT_UNION (*type) = 1;
5126     }
5127   else if (decl != 0 && TREE_CODE (decl) == PARM_DECL
5128            && TREE_CODE (*type) == UNION_TYPE
5129            && TYPE_MODE (*type) == DECL_MODE (TYPE_FIELDS (*type)))
5130     DECL_TRANSPARENT_UNION (decl) = 1;
5131   else
5132     {
5133       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5134       *no_add_attrs = true;
5135     }
5136
5137   return NULL_TREE;
5138 }
5139
5140 /* Handle a "constructor" attribute; arguments as in
5141    struct attribute_spec.handler.  */
5142
5143 static tree
5144 handle_constructor_attribute (node, name, args, flags, no_add_attrs)
5145      tree *node;
5146      tree name;
5147      tree args ATTRIBUTE_UNUSED;
5148      int flags ATTRIBUTE_UNUSED;
5149      bool *no_add_attrs;
5150 {
5151   tree decl = *node;
5152   tree type = TREE_TYPE (decl);
5153
5154   if (TREE_CODE (decl) == FUNCTION_DECL
5155       && TREE_CODE (type) == FUNCTION_TYPE
5156       && decl_function_context (decl) == 0)
5157     {
5158       DECL_STATIC_CONSTRUCTOR (decl) = 1;
5159       TREE_USED (decl) = 1;
5160     }
5161   else
5162     {
5163       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5164       *no_add_attrs = true;
5165     }
5166
5167   return NULL_TREE;
5168 }
5169
5170 /* Handle a "destructor" attribute; arguments as in
5171    struct attribute_spec.handler.  */
5172
5173 static tree
5174 handle_destructor_attribute (node, name, args, flags, no_add_attrs)
5175      tree *node;
5176      tree name;
5177      tree args ATTRIBUTE_UNUSED;
5178      int flags ATTRIBUTE_UNUSED;
5179      bool *no_add_attrs;
5180 {
5181   tree decl = *node;
5182   tree type = TREE_TYPE (decl);
5183
5184   if (TREE_CODE (decl) == FUNCTION_DECL
5185       && TREE_CODE (type) == FUNCTION_TYPE
5186       && decl_function_context (decl) == 0)
5187     {
5188       DECL_STATIC_DESTRUCTOR (decl) = 1;
5189       TREE_USED (decl) = 1;
5190     }
5191   else
5192     {
5193       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5194       *no_add_attrs = true;
5195     }
5196
5197   return NULL_TREE;
5198 }
5199
5200 /* Handle a "mode" attribute; arguments as in
5201    struct attribute_spec.handler.  */
5202
5203 static tree
5204 handle_mode_attribute (node, name, args, flags, no_add_attrs)
5205      tree *node;
5206      tree name;
5207      tree args;
5208      int flags ATTRIBUTE_UNUSED;
5209      bool *no_add_attrs;
5210 {
5211   tree type = *node;
5212
5213   *no_add_attrs = true;
5214
5215   if (TREE_CODE (TREE_VALUE (args)) != IDENTIFIER_NODE)
5216     warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5217   else
5218     {
5219       int j;
5220       const char *p = IDENTIFIER_POINTER (TREE_VALUE (args));
5221       int len = strlen (p);
5222       enum machine_mode mode = VOIDmode;
5223       tree typefm;
5224       tree ptr_type;
5225
5226       if (len > 4 && p[0] == '_' && p[1] == '_'
5227           && p[len - 1] == '_' && p[len - 2] == '_')
5228         {
5229           char *newp = (char *) alloca (len - 1);
5230
5231           strcpy (newp, &p[2]);
5232           newp[len - 4] = '\0';
5233           p = newp;
5234         }
5235
5236       /* Change this type to have a type with the specified mode.
5237          First check for the special modes.  */
5238       if (! strcmp (p, "byte"))
5239         mode = byte_mode;
5240       else if (!strcmp (p, "word"))
5241         mode = word_mode;
5242       else if (! strcmp (p, "pointer"))
5243         mode = ptr_mode;
5244       else
5245         for (j = 0; j < NUM_MACHINE_MODES; j++)
5246           if (!strcmp (p, GET_MODE_NAME (j)))
5247             mode = (enum machine_mode) j;
5248
5249       if (mode == VOIDmode)
5250         error ("unknown machine mode `%s'", p);
5251       else if (0 == (typefm = (*lang_hooks.types.type_for_mode)
5252                      (mode, TREE_UNSIGNED (type))))
5253         error ("no data type for mode `%s'", p);
5254       else if ((TREE_CODE (type) == POINTER_TYPE
5255                 || TREE_CODE (type) == REFERENCE_TYPE)
5256                && !(*targetm.valid_pointer_mode) (mode))
5257         error ("invalid pointer mode `%s'", p);
5258       else
5259         {
5260           /* If this is a vector, make sure we either have hardware
5261              support, or we can emulate it.  */
5262           if ((GET_MODE_CLASS (mode) == MODE_VECTOR_INT
5263                || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
5264               && !vector_mode_valid_p (mode))
5265             {
5266               error ("unable to emulate '%s'", GET_MODE_NAME (mode));
5267               return NULL_TREE;
5268             }
5269
5270           if (TREE_CODE (type) == POINTER_TYPE)
5271             {
5272               ptr_type = build_pointer_type_for_mode (TREE_TYPE (type),
5273                                                       mode);
5274               *node = ptr_type;
5275             }
5276           else if (TREE_CODE (type) == REFERENCE_TYPE)
5277             {
5278               ptr_type = build_reference_type_for_mode (TREE_TYPE (type),
5279                                                         mode);
5280               *node = ptr_type;
5281             }
5282           else
5283           *node = typefm;
5284           /* No need to layout the type here.  The caller should do this.  */
5285         }
5286     }
5287
5288   return NULL_TREE;
5289 }
5290
5291 /* Handle a "section" attribute; arguments as in
5292    struct attribute_spec.handler.  */
5293
5294 static tree
5295 handle_section_attribute (node, name, args, flags, no_add_attrs)
5296      tree *node;
5297      tree name ATTRIBUTE_UNUSED;
5298      tree args;
5299      int flags ATTRIBUTE_UNUSED;
5300      bool *no_add_attrs;
5301 {
5302   tree decl = *node;
5303
5304   if (targetm.have_named_sections)
5305     {
5306       if ((TREE_CODE (decl) == FUNCTION_DECL
5307            || TREE_CODE (decl) == VAR_DECL)
5308           && TREE_CODE (TREE_VALUE (args)) == STRING_CST)
5309         {
5310           if (TREE_CODE (decl) == VAR_DECL
5311               && current_function_decl != NULL_TREE
5312               && ! TREE_STATIC (decl))
5313             {
5314               error_with_decl (decl,
5315                                "section attribute cannot be specified for local variables");
5316               *no_add_attrs = true;
5317             }
5318
5319           /* The decl may have already been given a section attribute
5320              from a previous declaration.  Ensure they match.  */
5321           else if (DECL_SECTION_NAME (decl) != NULL_TREE
5322                    && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
5323                               TREE_STRING_POINTER (TREE_VALUE (args))) != 0)
5324             {
5325               error_with_decl (*node,
5326                                "section of `%s' conflicts with previous declaration");
5327               *no_add_attrs = true;
5328             }
5329           else
5330             DECL_SECTION_NAME (decl) = TREE_VALUE (args);
5331         }
5332       else
5333         {
5334           error_with_decl (*node,
5335                            "section attribute not allowed for `%s'");
5336           *no_add_attrs = true;
5337         }
5338     }
5339   else
5340     {
5341       error_with_decl (*node,
5342                        "section attributes are not supported for this target");
5343       *no_add_attrs = true;
5344     }
5345
5346   return NULL_TREE;
5347 }
5348
5349 /* Handle a "aligned" attribute; arguments as in
5350    struct attribute_spec.handler.  */
5351
5352 static tree
5353 handle_aligned_attribute (node, name, args, flags, no_add_attrs)
5354      tree *node;
5355      tree name ATTRIBUTE_UNUSED;
5356      tree args;
5357      int flags;
5358      bool *no_add_attrs;
5359 {
5360   tree decl = NULL_TREE;
5361   tree *type = NULL;
5362   int is_type = 0;
5363   tree align_expr = (args ? TREE_VALUE (args)
5364                      : size_int (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
5365   int i;
5366
5367   if (DECL_P (*node))
5368     {
5369       decl = *node;
5370       type = &TREE_TYPE (decl);
5371       is_type = TREE_CODE (*node) == TYPE_DECL;
5372     }
5373   else if (TYPE_P (*node))
5374     type = node, is_type = 1;
5375
5376   /* Strip any NOPs of any kind.  */
5377   while (TREE_CODE (align_expr) == NOP_EXPR
5378          || TREE_CODE (align_expr) == CONVERT_EXPR
5379          || TREE_CODE (align_expr) == NON_LVALUE_EXPR)
5380     align_expr = TREE_OPERAND (align_expr, 0);
5381
5382   if (TREE_CODE (align_expr) != INTEGER_CST)
5383     {
5384       error ("requested alignment is not a constant");
5385       *no_add_attrs = true;
5386     }
5387   else if ((i = tree_log2 (align_expr)) == -1)
5388     {
5389       error ("requested alignment is not a power of 2");
5390       *no_add_attrs = true;
5391     }
5392   else if (i > HOST_BITS_PER_INT - 2)
5393     {
5394       error ("requested alignment is too large");
5395       *no_add_attrs = true;
5396     }
5397   else if (is_type)
5398     {
5399       /* If we have a TYPE_DECL, then copy the type, so that we
5400          don't accidentally modify a builtin type.  See pushdecl.  */
5401       if (decl && TREE_TYPE (decl) != error_mark_node
5402           && DECL_ORIGINAL_TYPE (decl) == NULL_TREE)
5403         {
5404           tree tt = TREE_TYPE (decl);
5405           *type = build_type_copy (*type);
5406           DECL_ORIGINAL_TYPE (decl) = tt;
5407           TYPE_NAME (*type) = decl;
5408           TREE_USED (*type) = TREE_USED (decl);
5409           TREE_TYPE (decl) = *type;
5410         }
5411       else if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
5412         *type = build_type_copy (*type);
5413
5414       TYPE_ALIGN (*type) = (1 << i) * BITS_PER_UNIT;
5415       TYPE_USER_ALIGN (*type) = 1;
5416     }
5417   else if (TREE_CODE (decl) != VAR_DECL
5418            && TREE_CODE (decl) != FIELD_DECL)
5419     {
5420       error_with_decl (decl,
5421                        "alignment may not be specified for `%s'");
5422       *no_add_attrs = true;
5423     }
5424   else
5425     {
5426       DECL_ALIGN (decl) = (1 << i) * BITS_PER_UNIT;
5427       DECL_USER_ALIGN (decl) = 1;
5428     }
5429
5430   return NULL_TREE;
5431 }
5432
5433 /* Handle a "weak" attribute; arguments as in
5434    struct attribute_spec.handler.  */
5435
5436 static tree
5437 handle_weak_attribute (node, name, args, flags, no_add_attrs)
5438      tree *node;
5439      tree name ATTRIBUTE_UNUSED;
5440      tree args ATTRIBUTE_UNUSED;
5441      int flags ATTRIBUTE_UNUSED;
5442      bool *no_add_attrs ATTRIBUTE_UNUSED;
5443 {
5444   declare_weak (*node);
5445
5446   return NULL_TREE;
5447 }
5448
5449 /* Handle an "alias" attribute; arguments as in
5450    struct attribute_spec.handler.  */
5451
5452 static tree
5453 handle_alias_attribute (node, name, args, flags, no_add_attrs)
5454      tree *node;
5455      tree name;
5456      tree args;
5457      int flags ATTRIBUTE_UNUSED;
5458      bool *no_add_attrs;
5459 {
5460   tree decl = *node;
5461
5462   if ((TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl))
5463       || (TREE_CODE (decl) != FUNCTION_DECL && ! DECL_EXTERNAL (decl)))
5464     {
5465       error_with_decl (decl,
5466                        "`%s' defined both normally and as an alias");
5467       *no_add_attrs = true;
5468     }
5469   else if (decl_function_context (decl) == 0)
5470     {
5471       tree id;
5472
5473       id = TREE_VALUE (args);
5474       if (TREE_CODE (id) != STRING_CST)
5475         {
5476           error ("alias arg not a string");
5477           *no_add_attrs = true;
5478           return NULL_TREE;
5479         }
5480       id = get_identifier (TREE_STRING_POINTER (id));
5481       /* This counts as a use of the object pointed to.  */
5482       TREE_USED (id) = 1;
5483
5484       if (TREE_CODE (decl) == FUNCTION_DECL)
5485         DECL_INITIAL (decl) = error_mark_node;
5486       else
5487         DECL_EXTERNAL (decl) = 0;
5488     }
5489   else
5490     {
5491       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5492       *no_add_attrs = true;
5493     }
5494
5495   return NULL_TREE;
5496 }
5497
5498 /* Handle an "visibility" attribute; arguments as in
5499    struct attribute_spec.handler.  */
5500
5501 static tree
5502 handle_visibility_attribute (node, name, args, flags, no_add_attrs)
5503      tree *node;
5504      tree name;
5505      tree args;
5506      int flags ATTRIBUTE_UNUSED;
5507      bool *no_add_attrs;
5508 {
5509   tree decl = *node;
5510
5511   if (decl_function_context (decl) != 0 || ! TREE_PUBLIC (decl))
5512     {
5513       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5514       *no_add_attrs = true;
5515     }
5516   else
5517     {
5518       tree id;
5519
5520       id = TREE_VALUE (args);
5521       if (TREE_CODE (id) != STRING_CST)
5522         {
5523           error ("visibility arg not a string");
5524           *no_add_attrs = true;
5525           return NULL_TREE;
5526         }
5527       if (strcmp (TREE_STRING_POINTER (id), "hidden")
5528           && strcmp (TREE_STRING_POINTER (id), "protected")
5529           && strcmp (TREE_STRING_POINTER (id), "internal")
5530           && strcmp (TREE_STRING_POINTER (id), "default"))
5531         {
5532           error ("visibility arg must be one of \"default\", \"hidden\", \"protected\" or \"internal\"");
5533           *no_add_attrs = true;
5534           return NULL_TREE;
5535         }
5536     }
5537
5538   return NULL_TREE;
5539 }
5540
5541 /* Handle an "tls_model" attribute; arguments as in
5542    struct attribute_spec.handler.  */
5543
5544 static tree
5545 handle_tls_model_attribute (node, name, args, flags, no_add_attrs)
5546      tree *node;
5547      tree name;
5548      tree args;
5549      int flags ATTRIBUTE_UNUSED;
5550      bool *no_add_attrs;
5551 {
5552   tree decl = *node;
5553
5554   if (! DECL_THREAD_LOCAL (decl))
5555     {
5556       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5557       *no_add_attrs = true;
5558     }
5559   else
5560     {
5561       tree id;
5562
5563       id = TREE_VALUE (args);
5564       if (TREE_CODE (id) != STRING_CST)
5565         {
5566           error ("tls_model arg not a string");
5567           *no_add_attrs = true;
5568           return NULL_TREE;
5569         }
5570       if (strcmp (TREE_STRING_POINTER (id), "local-exec")
5571           && strcmp (TREE_STRING_POINTER (id), "initial-exec")
5572           && strcmp (TREE_STRING_POINTER (id), "local-dynamic")
5573           && strcmp (TREE_STRING_POINTER (id), "global-dynamic"))
5574         {
5575           error ("tls_model arg must be one of \"local-exec\", \"initial-exec\", \"local-dynamic\" or \"global-dynamic\"");
5576           *no_add_attrs = true;
5577           return NULL_TREE;
5578         }
5579     }
5580
5581   return NULL_TREE;
5582 }
5583
5584 /* Handle a "no_instrument_function" attribute; arguments as in
5585    struct attribute_spec.handler.  */
5586
5587 static tree
5588 handle_no_instrument_function_attribute (node, name, args, flags, no_add_attrs)
5589      tree *node;
5590      tree name;
5591      tree args ATTRIBUTE_UNUSED;
5592      int flags ATTRIBUTE_UNUSED;
5593      bool *no_add_attrs;
5594 {
5595   tree decl = *node;
5596
5597   if (TREE_CODE (decl) != FUNCTION_DECL)
5598     {
5599       error_with_decl (decl,
5600                        "`%s' attribute applies only to functions",
5601                        IDENTIFIER_POINTER (name));
5602       *no_add_attrs = true;
5603     }
5604   else if (DECL_INITIAL (decl))
5605     {
5606       error_with_decl (decl,
5607                        "can't set `%s' attribute after definition",
5608                        IDENTIFIER_POINTER (name));
5609       *no_add_attrs = true;
5610     }
5611   else
5612     DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
5613
5614   return NULL_TREE;
5615 }
5616
5617 /* Handle a "malloc" attribute; arguments as in
5618    struct attribute_spec.handler.  */
5619
5620 static tree
5621 handle_malloc_attribute (node, name, args, flags, no_add_attrs)
5622      tree *node;
5623      tree name;
5624      tree args ATTRIBUTE_UNUSED;
5625      int flags ATTRIBUTE_UNUSED;
5626      bool *no_add_attrs;
5627 {
5628   if (TREE_CODE (*node) == FUNCTION_DECL)
5629     DECL_IS_MALLOC (*node) = 1;
5630   /* ??? TODO: Support types.  */
5631   else
5632     {
5633       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5634       *no_add_attrs = true;
5635     }
5636
5637   return NULL_TREE;
5638 }
5639
5640 /* Handle a "no_limit_stack" attribute; arguments as in
5641    struct attribute_spec.handler.  */
5642
5643 static tree
5644 handle_no_limit_stack_attribute (node, name, args, flags, no_add_attrs)
5645      tree *node;
5646      tree name;
5647      tree args ATTRIBUTE_UNUSED;
5648      int flags ATTRIBUTE_UNUSED;
5649      bool *no_add_attrs;
5650 {
5651   tree decl = *node;
5652
5653   if (TREE_CODE (decl) != FUNCTION_DECL)
5654     {
5655       error_with_decl (decl,
5656                        "`%s' attribute applies only to functions",
5657                        IDENTIFIER_POINTER (name));
5658       *no_add_attrs = true;
5659     }
5660   else if (DECL_INITIAL (decl))
5661     {
5662       error_with_decl (decl,
5663                        "can't set `%s' attribute after definition",
5664                        IDENTIFIER_POINTER (name));
5665       *no_add_attrs = true;
5666     }
5667   else
5668     DECL_NO_LIMIT_STACK (decl) = 1;
5669
5670   return NULL_TREE;
5671 }
5672
5673 /* Handle a "pure" attribute; arguments as in
5674    struct attribute_spec.handler.  */
5675
5676 static tree
5677 handle_pure_attribute (node, name, args, flags, no_add_attrs)
5678      tree *node;
5679      tree name;
5680      tree args ATTRIBUTE_UNUSED;
5681      int flags ATTRIBUTE_UNUSED;
5682      bool *no_add_attrs;
5683 {
5684   if (TREE_CODE (*node) == FUNCTION_DECL)
5685     DECL_IS_PURE (*node) = 1;
5686   /* ??? TODO: Support types.  */
5687   else
5688     {
5689       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5690       *no_add_attrs = true;
5691     }
5692
5693   return NULL_TREE;
5694 }
5695
5696 /* Handle a "deprecated" attribute; arguments as in
5697    struct attribute_spec.handler.  */
5698    
5699 static tree
5700 handle_deprecated_attribute (node, name, args, flags, no_add_attrs)
5701      tree *node;
5702      tree name;
5703      tree args ATTRIBUTE_UNUSED;
5704      int flags;
5705      bool *no_add_attrs;
5706 {
5707   tree type = NULL_TREE;
5708   int warn = 0;
5709   const char *what = NULL;
5710   
5711   if (DECL_P (*node))
5712     {
5713       tree decl = *node;
5714       type = TREE_TYPE (decl);
5715       
5716       if (TREE_CODE (decl) == TYPE_DECL
5717           || TREE_CODE (decl) == PARM_DECL
5718           || TREE_CODE (decl) == VAR_DECL
5719           || TREE_CODE (decl) == FUNCTION_DECL
5720           || TREE_CODE (decl) == FIELD_DECL)
5721         TREE_DEPRECATED (decl) = 1;
5722       else
5723         warn = 1;
5724     }
5725   else if (TYPE_P (*node))
5726     {
5727       if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
5728         *node = build_type_copy (*node);
5729       TREE_DEPRECATED (*node) = 1;
5730       type = *node;
5731     }
5732   else
5733     warn = 1;
5734   
5735   if (warn)
5736     {
5737       *no_add_attrs = true;
5738       if (type && TYPE_NAME (type))
5739         {
5740           if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
5741             what = IDENTIFIER_POINTER (TYPE_NAME (*node));
5742           else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
5743                    && DECL_NAME (TYPE_NAME (type)))
5744             what = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
5745         }
5746       if (what)
5747         warning ("`%s' attribute ignored for `%s'",
5748                   IDENTIFIER_POINTER (name), what);
5749       else
5750         warning ("`%s' attribute ignored", 
5751                       IDENTIFIER_POINTER (name));
5752     }
5753
5754   return NULL_TREE;
5755 }
5756
5757 /* Keep a list of vector type nodes we created in handle_vector_size_attribute,
5758    to prevent us from duplicating type nodes unnecessarily.
5759    The normal mechanism to prevent duplicates is to use type_hash_canon, but
5760    since we want to distinguish types that are essentially identical (except
5761    for their debug representation), we use a local list here.  */
5762 static GTY(()) tree vector_type_node_list = 0;
5763
5764 /* Handle a "vector_size" attribute; arguments as in
5765    struct attribute_spec.handler.  */
5766
5767 static tree
5768 handle_vector_size_attribute (node, name, args, flags, no_add_attrs)
5769      tree *node;
5770      tree name;
5771      tree args;
5772      int flags ATTRIBUTE_UNUSED;
5773      bool *no_add_attrs;
5774 {
5775   unsigned HOST_WIDE_INT vecsize, nunits;
5776   enum machine_mode mode, orig_mode, new_mode;
5777   tree type = *node, new_type = NULL_TREE;
5778   tree type_list_node;
5779
5780   *no_add_attrs = true;
5781
5782   if (! host_integerp (TREE_VALUE (args), 1))
5783     {
5784       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
5785       return NULL_TREE;
5786     }
5787
5788   /* Get the vector size (in bytes).  */
5789   vecsize = tree_low_cst (TREE_VALUE (args), 1);
5790
5791   /* We need to provide for vector pointers, vector arrays, and
5792      functions returning vectors.  For example:
5793
5794        __attribute__((vector_size(16))) short *foo;
5795
5796      In this case, the mode is SI, but the type being modified is
5797      HI, so we need to look further.  */
5798
5799   while (POINTER_TYPE_P (type)
5800          || TREE_CODE (type) == FUNCTION_TYPE
5801          || TREE_CODE (type) == ARRAY_TYPE)
5802     type = TREE_TYPE (type);
5803
5804   /* Get the mode of the type being modified.  */
5805   orig_mode = TYPE_MODE (type);
5806
5807   if (TREE_CODE (type) == RECORD_TYPE
5808       || (GET_MODE_CLASS (orig_mode) != MODE_FLOAT
5809           && GET_MODE_CLASS (orig_mode) != MODE_INT)
5810       || ! host_integerp (TYPE_SIZE_UNIT (type), 1))
5811     {
5812       error ("invalid vector type for attribute `%s'",
5813              IDENTIFIER_POINTER (name));
5814       return NULL_TREE;
5815     }
5816
5817   /* Calculate how many units fit in the vector.  */
5818   nunits = vecsize / tree_low_cst (TYPE_SIZE_UNIT (type), 1);
5819
5820   /* Find a suitably sized vector.  */
5821   new_mode = VOIDmode;
5822   for (mode = GET_CLASS_NARROWEST_MODE (GET_MODE_CLASS (orig_mode) == MODE_INT
5823                                         ? MODE_VECTOR_INT
5824                                         : MODE_VECTOR_FLOAT);
5825        mode != VOIDmode;
5826        mode = GET_MODE_WIDER_MODE (mode))
5827     if (vecsize == GET_MODE_SIZE (mode)
5828         && nunits == (unsigned HOST_WIDE_INT) GET_MODE_NUNITS (mode))
5829       {
5830         new_mode = mode;
5831         break;
5832       }
5833
5834     if (new_mode == VOIDmode)
5835     {
5836       error ("no vector mode with the size and type specified could be found");
5837       return NULL_TREE;
5838     }
5839
5840   for (type_list_node = vector_type_node_list; type_list_node;
5841        type_list_node = TREE_CHAIN (type_list_node))
5842     {
5843       tree other_type = TREE_VALUE (type_list_node);
5844       tree record = TYPE_DEBUG_REPRESENTATION_TYPE (other_type);
5845       tree fields = TYPE_FIELDS (record);
5846       tree field_type = TREE_TYPE (fields);
5847       tree array_type = TREE_TYPE (field_type);
5848       if (TREE_CODE (fields) != FIELD_DECL
5849           || TREE_CODE (field_type) != ARRAY_TYPE)
5850         abort ();
5851
5852       if (TYPE_MODE (other_type) == mode && type == array_type)
5853         {
5854           new_type = other_type;
5855           break;
5856         }
5857     }
5858
5859   if (new_type == NULL_TREE)
5860     {
5861       tree index, array, rt, list_node;
5862
5863       new_type = (*lang_hooks.types.type_for_mode) (new_mode,
5864                                                     TREE_UNSIGNED (type));
5865
5866       if (!new_type)
5867         {
5868           error ("no vector mode with the size and type specified could be found");
5869           return NULL_TREE;
5870         }
5871
5872       new_type = build_type_copy (new_type);
5873
5874       /* If this is a vector, make sure we either have hardware
5875          support, or we can emulate it.  */
5876       if ((GET_MODE_CLASS (mode) == MODE_VECTOR_INT
5877            || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT)
5878           && !vector_mode_valid_p (mode))
5879         {
5880           error ("unable to emulate '%s'", GET_MODE_NAME (mode));
5881           return NULL_TREE;
5882         }
5883
5884       /* Set the debug information here, because this is the only
5885          place where we know the underlying type for a vector made
5886          with vector_size.  For debugging purposes we pretend a vector
5887          is an array within a structure.  */
5888       index = build_int_2 (TYPE_VECTOR_SUBPARTS (new_type) - 1, 0);
5889       array = build_array_type (type, build_index_type (index));
5890       rt = make_node (RECORD_TYPE);
5891
5892       TYPE_FIELDS (rt) = build_decl (FIELD_DECL, get_identifier ("f"), array);
5893       DECL_CONTEXT (TYPE_FIELDS (rt)) = rt;
5894       layout_type (rt);
5895       TYPE_DEBUG_REPRESENTATION_TYPE (new_type) = rt;
5896
5897       list_node = build_tree_list (NULL, new_type);
5898       TREE_CHAIN (list_node) = vector_type_node_list;
5899       vector_type_node_list = list_node;
5900     }
5901
5902   /* Build back pointers if needed.  */
5903   *node = vector_size_helper (*node, new_type);
5904
5905   return NULL_TREE;
5906 }
5907
5908 /* HACK.  GROSS.  This is absolutely disgusting.  I wish there was a
5909    better way.
5910
5911    If we requested a pointer to a vector, build up the pointers that
5912    we stripped off while looking for the inner type.  Similarly for
5913    return values from functions.
5914
5915    The argument "type" is the top of the chain, and "bottom" is the
5916    new type which we will point to.  */
5917
5918 static tree
5919 vector_size_helper (type, bottom)
5920      tree type, bottom;
5921 {
5922   tree inner, outer;
5923
5924   if (POINTER_TYPE_P (type))
5925     {
5926       inner = vector_size_helper (TREE_TYPE (type), bottom);
5927       outer = build_pointer_type (inner);
5928     }
5929   else if (TREE_CODE (type) == ARRAY_TYPE)
5930     {
5931       inner = vector_size_helper (TREE_TYPE (type), bottom);
5932       outer = build_array_type (inner, TYPE_VALUES (type));
5933     }
5934   else if (TREE_CODE (type) == FUNCTION_TYPE)
5935     {
5936       inner = vector_size_helper (TREE_TYPE (type), bottom);
5937       outer = build_function_type (inner, TYPE_VALUES (type));
5938     }
5939   else
5940     return bottom;
5941   
5942   TREE_READONLY (outer) = TREE_READONLY (type);
5943   TREE_THIS_VOLATILE (outer) = TREE_THIS_VOLATILE (type);
5944
5945   return outer;
5946 }
5947
5948 /* Handle the "nonnull" attribute.  */
5949 static tree
5950 handle_nonnull_attribute (node, name, args, flags, no_add_attrs)
5951      tree *node;
5952      tree name ATTRIBUTE_UNUSED;
5953      tree args;
5954      int flags ATTRIBUTE_UNUSED;
5955      bool *no_add_attrs;
5956 {
5957   tree type = *node;
5958   unsigned HOST_WIDE_INT attr_arg_num;
5959
5960   /* If no arguments are specified, all pointer arguments should be
5961      non-null.  Verify a full prototype is given so that the arguments
5962      will have the correct types when we actually check them later.  */
5963   if (! args)
5964     {
5965       if (! TYPE_ARG_TYPES (type))
5966         {
5967           error ("nonnull attribute without arguments on a non-prototype");
5968           *no_add_attrs = true;
5969         }
5970       return NULL_TREE;
5971     }
5972
5973   /* Argument list specified.  Verify that each argument number references
5974      a pointer argument.  */
5975   for (attr_arg_num = 1; args; args = TREE_CHAIN (args))
5976     {
5977       tree argument;
5978       unsigned HOST_WIDE_INT arg_num, ck_num;
5979
5980       if (! get_nonnull_operand (TREE_VALUE (args), &arg_num))
5981         {
5982           error ("nonnull argument has invalid operand number (arg %lu)",
5983                  (unsigned long) attr_arg_num);
5984           *no_add_attrs = true;
5985           return NULL_TREE;
5986         }
5987
5988       argument = TYPE_ARG_TYPES (type);
5989       if (argument)
5990         {
5991           for (ck_num = 1; ; ck_num++)
5992             {
5993               if (! argument || ck_num == arg_num)
5994                 break;
5995               argument = TREE_CHAIN (argument);
5996             }
5997
5998           if (! argument
5999               || TREE_CODE (TREE_VALUE (argument)) == VOID_TYPE)
6000             {
6001               error ("nonnull argument with out-of-range operand number (arg %lu, operand %lu)",
6002                      (unsigned long) attr_arg_num, (unsigned long) arg_num);
6003               *no_add_attrs = true;
6004               return NULL_TREE;
6005             }
6006
6007           if (TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE)
6008             {
6009               error ("nonnull argument references non-pointer operand (arg %lu, operand %lu)",
6010                    (unsigned long) attr_arg_num, (unsigned long) arg_num);
6011               *no_add_attrs = true;
6012               return NULL_TREE;
6013             }
6014         }
6015     }
6016
6017   return NULL_TREE;
6018 }
6019
6020 /* Check the argument list of a function call for null in argument slots
6021    that are marked as requiring a non-null pointer argument.  */
6022
6023 static void
6024 check_function_nonnull (attrs, params)
6025      tree attrs;
6026      tree params;
6027 {
6028   tree a, args, param;
6029   int param_num;
6030
6031   for (a = attrs; a; a = TREE_CHAIN (a))
6032     {
6033       if (is_attribute_p ("nonnull", TREE_PURPOSE (a)))
6034         {
6035           args = TREE_VALUE (a);
6036
6037           /* Walk the argument list.  If we encounter an argument number we
6038              should check for non-null, do it.  If the attribute has no args,
6039              then every pointer argument is checked (in which case the check
6040              for pointer type is done in check_nonnull_arg).  */
6041           for (param = params, param_num = 1; ;
6042                param_num++, param = TREE_CHAIN (param))
6043             {
6044               if (! param)
6045                 break;
6046               if (! args || nonnull_check_p (args, param_num))
6047                 check_function_arguments_recurse (check_nonnull_arg, NULL,
6048                                                   TREE_VALUE (param),
6049                                                   param_num);
6050             }
6051         }
6052     }
6053 }
6054
6055 /* Helper for check_function_nonnull; given a list of operands which
6056    must be non-null in ARGS, determine if operand PARAM_NUM should be
6057    checked.  */
6058
6059 static bool
6060 nonnull_check_p (args, param_num)
6061      tree args;
6062      unsigned HOST_WIDE_INT param_num;
6063 {
6064   unsigned HOST_WIDE_INT arg_num;
6065
6066   for (; args; args = TREE_CHAIN (args))
6067     {
6068       if (! get_nonnull_operand (TREE_VALUE (args), &arg_num))
6069         abort ();
6070
6071       if (arg_num == param_num)
6072         return true;
6073     }
6074   return false;
6075 }
6076
6077 /* Check that the function argument PARAM (which is operand number
6078    PARAM_NUM) is non-null.  This is called by check_function_nonnull
6079    via check_function_arguments_recurse.  */
6080
6081 static void
6082 check_nonnull_arg (ctx, param, param_num)
6083      void *ctx ATTRIBUTE_UNUSED;
6084      tree param;
6085      unsigned HOST_WIDE_INT param_num;
6086 {
6087   /* Just skip checking the argument if it's not a pointer.  This can
6088      happen if the "nonnull" attribute was given without an operand
6089      list (which means to check every pointer argument).  */
6090
6091   if (TREE_CODE (TREE_TYPE (param)) != POINTER_TYPE)
6092     return;
6093
6094   if (integer_zerop (param))
6095     warning ("null argument where non-null required (arg %lu)",
6096              (unsigned long) param_num);
6097 }
6098
6099 /* Helper for nonnull attribute handling; fetch the operand number
6100    from the attribute argument list.  */
6101
6102 static bool
6103 get_nonnull_operand (arg_num_expr, valp)
6104      tree arg_num_expr;
6105      unsigned HOST_WIDE_INT *valp;
6106 {
6107   /* Strip any conversions from the arg number and verify they
6108      are constants.  */
6109   while (TREE_CODE (arg_num_expr) == NOP_EXPR
6110          || TREE_CODE (arg_num_expr) == CONVERT_EXPR
6111          || TREE_CODE (arg_num_expr) == NON_LVALUE_EXPR)
6112     arg_num_expr = TREE_OPERAND (arg_num_expr, 0);
6113
6114   if (TREE_CODE (arg_num_expr) != INTEGER_CST
6115       || TREE_INT_CST_HIGH (arg_num_expr) != 0)
6116     return false;
6117
6118   *valp = TREE_INT_CST_LOW (arg_num_expr);
6119   return true;
6120 }
6121
6122 /* Handle a "nothrow" attribute; arguments as in
6123    struct attribute_spec.handler.  */
6124
6125 static tree
6126 handle_nothrow_attribute (node, name, args, flags, no_add_attrs)
6127      tree *node;
6128      tree name;
6129      tree args ATTRIBUTE_UNUSED;
6130      int flags ATTRIBUTE_UNUSED;
6131      bool *no_add_attrs;
6132 {
6133   if (TREE_CODE (*node) == FUNCTION_DECL)
6134     TREE_NOTHROW (*node) = 1;
6135   /* ??? TODO: Support types.  */
6136   else
6137     {
6138       warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
6139       *no_add_attrs = true;
6140     }
6141
6142   return NULL_TREE;
6143 }
6144 \f
6145 /* Check for valid arguments being passed to a function.  */
6146 void
6147 check_function_arguments (attrs, params)
6148      tree attrs;
6149      tree params;
6150 {
6151   /* Check for null being passed in a pointer argument that must be
6152      non-null.  We also need to do this if format checking is enabled.  */
6153
6154   if (warn_nonnull)
6155     check_function_nonnull (attrs, params);
6156
6157   /* Check for errors in format strings.  */
6158
6159   if (warn_format)
6160     check_function_format (NULL, attrs, params);
6161 }
6162
6163 /* Generic argument checking recursion routine.  PARAM is the argument to
6164    be checked.  PARAM_NUM is the number of the argument.  CALLBACK is invoked
6165    once the argument is resolved.  CTX is context for the callback.  */
6166 void
6167 check_function_arguments_recurse (callback, ctx, param, param_num)
6168      void (*callback) PARAMS ((void *, tree, unsigned HOST_WIDE_INT));
6169      void *ctx;
6170      tree param;
6171      unsigned HOST_WIDE_INT param_num;
6172 {
6173   if (TREE_CODE (param) == NOP_EXPR)
6174     {
6175       /* Strip coercion.  */
6176       check_function_arguments_recurse (callback, ctx,
6177                                         TREE_OPERAND (param, 0), param_num);
6178       return;
6179     }
6180
6181   if (TREE_CODE (param) == CALL_EXPR)
6182     {
6183       tree type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (param, 0)));
6184       tree attrs;
6185       bool found_format_arg = false;
6186
6187       /* See if this is a call to a known internationalization function
6188          that modifies a format arg.  Such a function may have multiple
6189          format_arg attributes (for example, ngettext).  */
6190
6191       for (attrs = TYPE_ATTRIBUTES (type);
6192            attrs;
6193            attrs = TREE_CHAIN (attrs))
6194         if (is_attribute_p ("format_arg", TREE_PURPOSE (attrs)))
6195           {
6196             tree inner_args;
6197             tree format_num_expr;
6198             int format_num;
6199             int i;
6200
6201             /* Extract the argument number, which was previously checked
6202                to be valid.  */
6203             format_num_expr = TREE_VALUE (TREE_VALUE (attrs));
6204             while (TREE_CODE (format_num_expr) == NOP_EXPR
6205                    || TREE_CODE (format_num_expr) == CONVERT_EXPR
6206                    || TREE_CODE (format_num_expr) == NON_LVALUE_EXPR)
6207               format_num_expr = TREE_OPERAND (format_num_expr, 0);
6208
6209             if (TREE_CODE (format_num_expr) != INTEGER_CST
6210                 || TREE_INT_CST_HIGH (format_num_expr) != 0)
6211               abort ();
6212
6213             format_num = TREE_INT_CST_LOW (format_num_expr);
6214
6215             for (inner_args = TREE_OPERAND (param, 1), i = 1;
6216                  inner_args != 0;
6217                  inner_args = TREE_CHAIN (inner_args), i++)
6218               if (i == format_num)
6219                 {
6220                   check_function_arguments_recurse (callback, ctx,
6221                                                     TREE_VALUE (inner_args),
6222                                                     param_num);
6223                   found_format_arg = true;
6224                   break;
6225                 }
6226           }
6227
6228       /* If we found a format_arg attribute and did a recursive check,
6229          we are done with checking this argument.  Otherwise, we continue
6230          and this will be considered a non-literal.  */
6231       if (found_format_arg)
6232         return;
6233     }
6234
6235   if (TREE_CODE (param) == COND_EXPR)
6236     {
6237       /* Check both halves of the conditional expression.  */
6238       check_function_arguments_recurse (callback, ctx,
6239                                         TREE_OPERAND (param, 1), param_num);
6240       check_function_arguments_recurse (callback, ctx,
6241                                         TREE_OPERAND (param, 2), param_num);
6242       return;
6243     }
6244
6245   (*callback) (ctx, param, param_num);
6246 }
6247
6248 #include "gt-c-common.h"