c-common.c, [...]: Delete code implementing -traditional mode.
[platform/upstream/gcc.git] / gcc / c-typeck.c
1 /* Build expressions with type checking for C compiler.
2    Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
3    1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.  */
21
22
23 /* This file is part of the C front end.
24    It contains routines to build C expressions given their operands,
25    including computing the types of the result, C-specific error checks,
26    and some optimization.
27
28    There are also routines to build RETURN_STMT nodes and CASE_STMT nodes,
29    and to process initializations in declarations (since they work
30    like a strange sort of assignment).  */
31
32 #include "config.h"
33 #include "system.h"
34 #include "rtl.h"
35 #include "tree.h"
36 #include "c-tree.h"
37 #include "tm_p.h"
38 #include "flags.h"
39 #include "output.h"
40 #include "expr.h"
41 #include "toplev.h"
42 #include "intl.h"
43 #include "ggc.h"
44 #include "target.h"
45
46 /* Nonzero if we've already printed a "missing braces around initializer"
47    message within this initializer.  */
48 static int missing_braces_mentioned;
49
50 /* 1 if we explained undeclared var errors.  */
51 static int undeclared_variable_notice;
52
53 static tree qualify_type                PARAMS ((tree, tree));
54 static int comp_target_types            PARAMS ((tree, tree));
55 static int function_types_compatible_p  PARAMS ((tree, tree));
56 static int type_lists_compatible_p      PARAMS ((tree, tree));
57 static tree decl_constant_value_for_broken_optimization PARAMS ((tree));
58 static tree default_function_array_conversion   PARAMS ((tree));
59 static tree lookup_field                PARAMS ((tree, tree));
60 static tree convert_arguments           PARAMS ((tree, tree, tree, tree));
61 static tree pointer_diff                PARAMS ((tree, tree));
62 static tree unary_complex_lvalue        PARAMS ((enum tree_code, tree, int));
63 static void pedantic_lvalue_warning     PARAMS ((enum tree_code));
64 static tree internal_build_compound_expr PARAMS ((tree, int));
65 static tree convert_for_assignment      PARAMS ((tree, tree, const char *,
66                                                  tree, tree, int));
67 static void warn_for_assignment         PARAMS ((const char *, const char *,
68                                                  tree, int));
69 static tree valid_compound_expr_initializer PARAMS ((tree, tree));
70 static void push_string                 PARAMS ((const char *));
71 static void push_member_name            PARAMS ((tree));
72 static void push_array_bounds           PARAMS ((int));
73 static int spelling_length              PARAMS ((void));
74 static char *print_spelling             PARAMS ((char *));
75 static void warning_init                PARAMS ((const char *));
76 static tree digest_init                 PARAMS ((tree, tree, int, int));
77 static void output_init_element         PARAMS ((tree, tree, tree, int));
78 static void output_pending_init_elements PARAMS ((int));
79 static int set_designator               PARAMS ((int));
80 static void push_range_stack            PARAMS ((tree));
81 static void add_pending_init            PARAMS ((tree, tree));
82 static void set_nonincremental_init     PARAMS ((void));
83 static void set_nonincremental_init_from_string PARAMS ((tree));
84 static tree find_init_member            PARAMS ((tree));
85 \f
86 /* Do `exp = require_complete_type (exp);' to make sure exp
87    does not have an incomplete type.  (That includes void types.)  */
88
89 tree
90 require_complete_type (value)
91      tree value;
92 {
93   tree type = TREE_TYPE (value);
94
95   if (value == error_mark_node || type == error_mark_node)
96     return error_mark_node;
97
98   /* First, detect a valid value with a complete type.  */
99   if (COMPLETE_TYPE_P (type))
100     return value;
101
102   incomplete_type_error (value, type);
103   return error_mark_node;
104 }
105
106 /* Print an error message for invalid use of an incomplete type.
107    VALUE is the expression that was used (or 0 if that isn't known)
108    and TYPE is the type that was invalid.  */
109
110 void
111 incomplete_type_error (value, type)
112      tree value;
113      tree type;
114 {
115   const char *type_code_string;
116
117   /* Avoid duplicate error message.  */
118   if (TREE_CODE (type) == ERROR_MARK)
119     return;
120
121   if (value != 0 && (TREE_CODE (value) == VAR_DECL
122                      || TREE_CODE (value) == PARM_DECL))
123     error ("`%s' has an incomplete type",
124            IDENTIFIER_POINTER (DECL_NAME (value)));
125   else
126     {
127     retry:
128       /* We must print an error message.  Be clever about what it says.  */
129
130       switch (TREE_CODE (type))
131         {
132         case RECORD_TYPE:
133           type_code_string = "struct";
134           break;
135
136         case UNION_TYPE:
137           type_code_string = "union";
138           break;
139
140         case ENUMERAL_TYPE:
141           type_code_string = "enum";
142           break;
143
144         case VOID_TYPE:
145           error ("invalid use of void expression");
146           return;
147
148         case ARRAY_TYPE:
149           if (TYPE_DOMAIN (type))
150             {
151               if (TYPE_MAX_VALUE (TYPE_DOMAIN (type)) == NULL)
152                 {
153                   error ("invalid use of flexible array member");
154                   return;
155                 }
156               type = TREE_TYPE (type);
157               goto retry;
158             }
159           error ("invalid use of array with unspecified bounds");
160           return;
161
162         default:
163           abort ();
164         }
165
166       if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
167         error ("invalid use of undefined type `%s %s'",
168                type_code_string, IDENTIFIER_POINTER (TYPE_NAME (type)));
169       else
170         /* If this type has a typedef-name, the TYPE_NAME is a TYPE_DECL.  */
171         error ("invalid use of incomplete typedef `%s'",
172                IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
173     }
174 }
175
176 /* Return a variant of TYPE which has all the type qualifiers of LIKE
177    as well as those of TYPE.  */
178
179 static tree
180 qualify_type (type, like)
181      tree type, like;
182 {
183   return c_build_qualified_type (type, 
184                                  TYPE_QUALS (type) | TYPE_QUALS (like));
185 }
186 \f
187 /* Return the common type of two types.
188    We assume that comptypes has already been done and returned 1;
189    if that isn't so, this may crash.  In particular, we assume that qualifiers
190    match.
191
192    This is the type for the result of most arithmetic operations
193    if the operands have the given two types.  */
194
195 tree
196 common_type (t1, t2)
197      tree t1, t2;
198 {
199   enum tree_code code1;
200   enum tree_code code2;
201   tree attributes;
202
203   /* Save time if the two types are the same.  */
204
205   if (t1 == t2) return t1;
206
207   /* If one type is nonsense, use the other.  */
208   if (t1 == error_mark_node)
209     return t2;
210   if (t2 == error_mark_node)
211     return t1;
212
213   /* Merge the attributes.  */
214   attributes = (*targetm.merge_type_attributes) (t1, t2);
215
216   /* Treat an enum type as the unsigned integer type of the same width.  */
217
218   if (TREE_CODE (t1) == ENUMERAL_TYPE)
219     t1 = type_for_size (TYPE_PRECISION (t1), 1);
220   if (TREE_CODE (t2) == ENUMERAL_TYPE)
221     t2 = type_for_size (TYPE_PRECISION (t2), 1);
222
223   code1 = TREE_CODE (t1);
224   code2 = TREE_CODE (t2);
225
226   /* If one type is complex, form the common type of the non-complex
227      components, then make that complex.  Use T1 or T2 if it is the
228      required type.  */
229   if (code1 == COMPLEX_TYPE || code2 == COMPLEX_TYPE)
230     {
231       tree subtype1 = code1 == COMPLEX_TYPE ? TREE_TYPE (t1) : t1;
232       tree subtype2 = code2 == COMPLEX_TYPE ? TREE_TYPE (t2) : t2;
233       tree subtype = common_type (subtype1, subtype2);
234
235       if (code1 == COMPLEX_TYPE && TREE_TYPE (t1) == subtype)
236         return build_type_attribute_variant (t1, attributes);
237       else if (code2 == COMPLEX_TYPE && TREE_TYPE (t2) == subtype)
238         return build_type_attribute_variant (t2, attributes);
239       else
240         return build_type_attribute_variant (build_complex_type (subtype),
241                                              attributes);
242     }
243
244   switch (code1)
245     {
246     case INTEGER_TYPE:
247     case REAL_TYPE:
248       /* If only one is real, use it as the result.  */
249
250       if (code1 == REAL_TYPE && code2 != REAL_TYPE)
251         return build_type_attribute_variant (t1, attributes);
252
253       if (code2 == REAL_TYPE && code1 != REAL_TYPE)
254         return build_type_attribute_variant (t2, attributes);
255
256       /* Both real or both integers; use the one with greater precision.  */
257
258       if (TYPE_PRECISION (t1) > TYPE_PRECISION (t2))
259         return build_type_attribute_variant (t1, attributes);
260       else if (TYPE_PRECISION (t2) > TYPE_PRECISION (t1))
261         return build_type_attribute_variant (t2, attributes);
262
263       /* Same precision.  Prefer longs to ints even when same size.  */
264
265       if (TYPE_MAIN_VARIANT (t1) == long_unsigned_type_node
266           || TYPE_MAIN_VARIANT (t2) == long_unsigned_type_node)
267         return build_type_attribute_variant (long_unsigned_type_node,
268                                              attributes);
269
270       if (TYPE_MAIN_VARIANT (t1) == long_integer_type_node
271           || TYPE_MAIN_VARIANT (t2) == long_integer_type_node)
272         {
273           /* But preserve unsignedness from the other type,
274              since long cannot hold all the values of an unsigned int.  */
275           if (TREE_UNSIGNED (t1) || TREE_UNSIGNED (t2))
276              t1 = long_unsigned_type_node;
277           else
278              t1 = long_integer_type_node;
279           return build_type_attribute_variant (t1, attributes);
280         }
281
282       /* Likewise, prefer long double to double even if same size.  */
283       if (TYPE_MAIN_VARIANT (t1) == long_double_type_node
284           || TYPE_MAIN_VARIANT (t2) == long_double_type_node)
285         return build_type_attribute_variant (long_double_type_node,
286                                              attributes);
287
288       /* Otherwise prefer the unsigned one.  */
289
290       if (TREE_UNSIGNED (t1))
291         return build_type_attribute_variant (t1, attributes);
292       else
293         return build_type_attribute_variant (t2, attributes);
294
295     case POINTER_TYPE:
296       /* For two pointers, do this recursively on the target type,
297          and combine the qualifiers of the two types' targets.  */
298       /* This code was turned off; I don't know why.
299          But ANSI C specifies doing this with the qualifiers.
300          So I turned it on again.  */
301       {
302         tree pointed_to_1 = TREE_TYPE (t1);
303         tree pointed_to_2 = TREE_TYPE (t2);
304         tree target = common_type (TYPE_MAIN_VARIANT (pointed_to_1),
305                                    TYPE_MAIN_VARIANT (pointed_to_2));
306         t1 = build_pointer_type (c_build_qualified_type 
307                                  (target, 
308                                   TYPE_QUALS (pointed_to_1) | 
309                                   TYPE_QUALS (pointed_to_2)));
310         return build_type_attribute_variant (t1, attributes);
311       }
312 #if 0
313       t1 = build_pointer_type (common_type (TREE_TYPE (t1), TREE_TYPE (t2)));
314       return build_type_attribute_variant (t1, attributes);
315 #endif
316
317     case ARRAY_TYPE:
318       {
319         tree elt = common_type (TREE_TYPE (t1), TREE_TYPE (t2));
320         /* Save space: see if the result is identical to one of the args.  */
321         if (elt == TREE_TYPE (t1) && TYPE_DOMAIN (t1))
322           return build_type_attribute_variant (t1, attributes);
323         if (elt == TREE_TYPE (t2) && TYPE_DOMAIN (t2))
324           return build_type_attribute_variant (t2, attributes);
325         /* Merge the element types, and have a size if either arg has one.  */
326         t1 = build_array_type (elt, TYPE_DOMAIN (TYPE_DOMAIN (t1) ? t1 : t2));
327         return build_type_attribute_variant (t1, attributes);
328       }
329
330     case FUNCTION_TYPE:
331       /* Function types: prefer the one that specified arg types.
332          If both do, merge the arg types.  Also merge the return types.  */
333       {
334         tree valtype = common_type (TREE_TYPE (t1), TREE_TYPE (t2));
335         tree p1 = TYPE_ARG_TYPES (t1);
336         tree p2 = TYPE_ARG_TYPES (t2);
337         int len;
338         tree newargs, n;
339         int i;
340
341         /* Save space: see if the result is identical to one of the args.  */
342         if (valtype == TREE_TYPE (t1) && ! TYPE_ARG_TYPES (t2))
343           return build_type_attribute_variant (t1, attributes);
344         if (valtype == TREE_TYPE (t2) && ! TYPE_ARG_TYPES (t1))
345           return build_type_attribute_variant (t2, attributes);
346
347         /* Simple way if one arg fails to specify argument types.  */
348         if (TYPE_ARG_TYPES (t1) == 0)
349          {
350            t1 = build_function_type (valtype, TYPE_ARG_TYPES (t2));
351            return build_type_attribute_variant (t1, attributes);
352          }
353         if (TYPE_ARG_TYPES (t2) == 0)
354          {
355            t1 = build_function_type (valtype, TYPE_ARG_TYPES (t1));
356            return build_type_attribute_variant (t1, attributes);
357          }
358
359         /* If both args specify argument types, we must merge the two
360            lists, argument by argument.  */
361
362         pushlevel (0);
363         declare_parm_level (1);
364
365         len = list_length (p1);
366         newargs = 0;
367
368         for (i = 0; i < len; i++)
369           newargs = tree_cons (NULL_TREE, NULL_TREE, newargs);
370
371         n = newargs;
372
373         for (; p1;
374              p1 = TREE_CHAIN (p1), p2 = TREE_CHAIN (p2), n = TREE_CHAIN (n))
375           {
376             /* A null type means arg type is not specified.
377                Take whatever the other function type has.  */
378             if (TREE_VALUE (p1) == 0)
379               {
380                 TREE_VALUE (n) = TREE_VALUE (p2);
381                 goto parm_done;
382               }
383             if (TREE_VALUE (p2) == 0)
384               {
385                 TREE_VALUE (n) = TREE_VALUE (p1);
386                 goto parm_done;
387               }
388               
389             /* Given  wait (union {union wait *u; int *i} *)
390                and  wait (union wait *),
391                prefer  union wait *  as type of parm.  */
392             if (TREE_CODE (TREE_VALUE (p1)) == UNION_TYPE
393                 && TREE_VALUE (p1) != TREE_VALUE (p2))
394               {
395                 tree memb;
396                 for (memb = TYPE_FIELDS (TREE_VALUE (p1));
397                      memb; memb = TREE_CHAIN (memb))
398                   if (comptypes (TREE_TYPE (memb), TREE_VALUE (p2)))
399                     {
400                       TREE_VALUE (n) = TREE_VALUE (p2);
401                       if (pedantic)
402                         pedwarn ("function types not truly compatible in ISO C");
403                       goto parm_done;
404                     }
405               }
406             if (TREE_CODE (TREE_VALUE (p2)) == UNION_TYPE
407                 && TREE_VALUE (p2) != TREE_VALUE (p1))
408               {
409                 tree memb;
410                 for (memb = TYPE_FIELDS (TREE_VALUE (p2));
411                      memb; memb = TREE_CHAIN (memb))
412                   if (comptypes (TREE_TYPE (memb), TREE_VALUE (p1)))
413                     {
414                       TREE_VALUE (n) = TREE_VALUE (p1);
415                       if (pedantic)
416                         pedwarn ("function types not truly compatible in ISO C");
417                       goto parm_done;
418                     }
419               }
420             TREE_VALUE (n) = common_type (TREE_VALUE (p1), TREE_VALUE (p2));
421           parm_done: ;
422           }
423
424         poplevel (0, 0, 0);
425
426         t1 = build_function_type (valtype, newargs);
427         /* ... falls through ...  */
428       }
429
430     default:
431       return build_type_attribute_variant (t1, attributes);
432     }
433
434 }
435 \f
436 /* Return 1 if TYPE1 and TYPE2 are compatible types for assignment
437    or various other operations.  Return 2 if they are compatible
438    but a warning may be needed if you use them together.  */
439
440 int
441 comptypes (type1, type2)
442      tree type1, type2;
443 {
444   tree t1 = type1;
445   tree t2 = type2;
446   int attrval, val;
447
448   /* Suppress errors caused by previously reported errors.  */
449
450   if (t1 == t2 || !t1 || !t2
451       || TREE_CODE (t1) == ERROR_MARK || TREE_CODE (t2) == ERROR_MARK)
452     return 1;
453
454   /* If either type is the internal version of sizetype, return the
455      language version.  */
456   if (TREE_CODE (t1) == INTEGER_TYPE && TYPE_IS_SIZETYPE (t1)
457       && TYPE_DOMAIN (t1) != 0)
458     t1 = TYPE_DOMAIN (t1);
459
460   if (TREE_CODE (t2) == INTEGER_TYPE && TYPE_IS_SIZETYPE (t2)
461       && TYPE_DOMAIN (t2) != 0)
462     t2 = TYPE_DOMAIN (t2);
463
464   /* Treat an enum type as the integer type of the same width and 
465      signedness.  */
466
467   if (TREE_CODE (t1) == ENUMERAL_TYPE)
468     t1 = type_for_size (TYPE_PRECISION (t1), TREE_UNSIGNED (t1));
469   if (TREE_CODE (t2) == ENUMERAL_TYPE)
470     t2 = type_for_size (TYPE_PRECISION (t2), TREE_UNSIGNED (t2));
471
472   if (t1 == t2)
473     return 1;
474
475   /* Different classes of types can't be compatible.  */
476
477   if (TREE_CODE (t1) != TREE_CODE (t2)) return 0;
478
479   /* Qualifiers must match.  */
480
481   if (TYPE_QUALS (t1) != TYPE_QUALS (t2))
482     return 0;
483
484   /* Allow for two different type nodes which have essentially the same
485      definition.  Note that we already checked for equality of the type
486      qualifiers (just above).  */
487
488   if (TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
489     return 1;
490
491   /* 1 if no need for warning yet, 2 if warning cause has been seen.  */
492   if (! (attrval = (*targetm.comp_type_attributes) (t1, t2)))
493      return 0;
494
495   /* 1 if no need for warning yet, 2 if warning cause has been seen.  */
496   val = 0;
497
498   switch (TREE_CODE (t1))
499     {
500     case POINTER_TYPE:
501       val = (TREE_TYPE (t1) == TREE_TYPE (t2)
502               ? 1 : comptypes (TREE_TYPE (t1), TREE_TYPE (t2)));
503       break;
504
505     case FUNCTION_TYPE:
506       val = function_types_compatible_p (t1, t2);
507       break;
508
509     case ARRAY_TYPE:
510       {
511         tree d1 = TYPE_DOMAIN (t1);
512         tree d2 = TYPE_DOMAIN (t2);
513         bool d1_variable, d2_variable;
514         bool d1_zero, d2_zero;
515         val = 1;
516
517         /* Target types must match incl. qualifiers.  */
518         if (TREE_TYPE (t1) != TREE_TYPE (t2)
519             && 0 == (val = comptypes (TREE_TYPE (t1), TREE_TYPE (t2))))
520           return 0;
521
522         /* Sizes must match unless one is missing or variable.  */
523         if (d1 == 0 || d2 == 0 || d1 == d2)
524           break;
525
526         d1_zero = ! TYPE_MAX_VALUE (d1);
527         d2_zero = ! TYPE_MAX_VALUE (d2);
528
529         d1_variable = (! d1_zero
530                        && (TREE_CODE (TYPE_MIN_VALUE (d1)) != INTEGER_CST
531                            || TREE_CODE (TYPE_MAX_VALUE (d1)) != INTEGER_CST));
532         d2_variable = (! d2_zero
533                        && (TREE_CODE (TYPE_MIN_VALUE (d2)) != INTEGER_CST
534                            || TREE_CODE (TYPE_MAX_VALUE (d2)) != INTEGER_CST));
535
536         if (d1_variable || d2_variable)
537           break;
538         if (d1_zero && d2_zero)
539           break;
540         if (d1_zero || d2_zero
541             || ! tree_int_cst_equal (TYPE_MIN_VALUE (d1), TYPE_MIN_VALUE (d2))
542             || ! tree_int_cst_equal (TYPE_MAX_VALUE (d1), TYPE_MAX_VALUE (d2)))
543           val = 0;
544
545         break;
546       }
547
548     case RECORD_TYPE:
549       if (maybe_objc_comptypes (t1, t2, 0) == 1)
550         val = 1;
551       break;
552
553     default:
554       break;
555     }
556   return attrval == 2 && val == 1 ? 2 : val;
557 }
558
559 /* Return 1 if TTL and TTR are pointers to types that are equivalent,
560    ignoring their qualifiers.  */
561
562 static int
563 comp_target_types (ttl, ttr)
564      tree ttl, ttr;
565 {
566   int val;
567
568   /* Give maybe_objc_comptypes a crack at letting these types through.  */
569   if ((val = maybe_objc_comptypes (ttl, ttr, 1)) >= 0)
570     return val;
571
572   val = comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (ttl)),
573                    TYPE_MAIN_VARIANT (TREE_TYPE (ttr)));
574
575   if (val == 2 && pedantic)
576     pedwarn ("types are not quite compatible");
577   return val;
578 }
579 \f
580 /* Subroutines of `comptypes'.  */
581
582 /* Return 1 if two function types F1 and F2 are compatible.
583    If either type specifies no argument types,
584    the other must specify a fixed number of self-promoting arg types.
585    Otherwise, if one type specifies only the number of arguments, 
586    the other must specify that number of self-promoting arg types.
587    Otherwise, the argument types must match.  */
588
589 static int
590 function_types_compatible_p (f1, f2)
591      tree f1, f2;
592 {
593   tree args1, args2;
594   /* 1 if no need for warning yet, 2 if warning cause has been seen.  */
595   int val = 1;
596   int val1;
597
598   if (!(TREE_TYPE (f1) == TREE_TYPE (f2)
599         || (val = comptypes (TREE_TYPE (f1), TREE_TYPE (f2)))))
600     return 0;
601
602   args1 = TYPE_ARG_TYPES (f1);
603   args2 = TYPE_ARG_TYPES (f2);
604
605   /* An unspecified parmlist matches any specified parmlist
606      whose argument types don't need default promotions.  */
607
608   if (args1 == 0)
609     {
610       if (!self_promoting_args_p (args2))
611         return 0;
612       /* If one of these types comes from a non-prototype fn definition,
613          compare that with the other type's arglist.
614          If they don't match, ask for a warning (but no error).  */
615       if (TYPE_ACTUAL_ARG_TYPES (f1)
616           && 1 != type_lists_compatible_p (args2, TYPE_ACTUAL_ARG_TYPES (f1)))
617         val = 2;
618       return val;
619     }
620   if (args2 == 0)
621     {
622       if (!self_promoting_args_p (args1))
623         return 0;
624       if (TYPE_ACTUAL_ARG_TYPES (f2)
625           && 1 != type_lists_compatible_p (args1, TYPE_ACTUAL_ARG_TYPES (f2)))
626         val = 2;
627       return val;
628     }
629
630   /* Both types have argument lists: compare them and propagate results.  */
631   val1 = type_lists_compatible_p (args1, args2);
632   return val1 != 1 ? val1 : val;
633 }
634
635 /* Check two lists of types for compatibility,
636    returning 0 for incompatible, 1 for compatible,
637    or 2 for compatible with warning.  */
638
639 static int
640 type_lists_compatible_p (args1, args2)
641      tree args1, args2;
642 {
643   /* 1 if no need for warning yet, 2 if warning cause has been seen.  */
644   int val = 1;
645   int newval = 0;
646
647   while (1)
648     {
649       if (args1 == 0 && args2 == 0)
650         return val;
651       /* If one list is shorter than the other,
652          they fail to match.  */
653       if (args1 == 0 || args2 == 0)
654         return 0;
655       /* A null pointer instead of a type
656          means there is supposed to be an argument
657          but nothing is specified about what type it has.
658          So match anything that self-promotes.  */
659       if (TREE_VALUE (args1) == 0)
660         {
661           if (simple_type_promotes_to (TREE_VALUE (args2)) != NULL_TREE)
662             return 0;
663         }
664       else if (TREE_VALUE (args2) == 0)
665         {
666           if (simple_type_promotes_to (TREE_VALUE (args1)) != NULL_TREE)
667             return 0;
668         }
669       else if (! (newval = comptypes (TYPE_MAIN_VARIANT (TREE_VALUE (args1)), 
670                                       TYPE_MAIN_VARIANT (TREE_VALUE (args2)))))
671         {
672           /* Allow  wait (union {union wait *u; int *i} *)
673              and  wait (union wait *)  to be compatible.  */
674           if (TREE_CODE (TREE_VALUE (args1)) == UNION_TYPE
675               && (TYPE_NAME (TREE_VALUE (args1)) == 0
676                   || TYPE_TRANSPARENT_UNION (TREE_VALUE (args1)))
677               && TREE_CODE (TYPE_SIZE (TREE_VALUE (args1))) == INTEGER_CST
678               && tree_int_cst_equal (TYPE_SIZE (TREE_VALUE (args1)),
679                                      TYPE_SIZE (TREE_VALUE (args2))))
680             {
681               tree memb;
682               for (memb = TYPE_FIELDS (TREE_VALUE (args1));
683                    memb; memb = TREE_CHAIN (memb))
684                 if (comptypes (TREE_TYPE (memb), TREE_VALUE (args2)))
685                   break;
686               if (memb == 0)
687                 return 0;
688             }
689           else if (TREE_CODE (TREE_VALUE (args2)) == UNION_TYPE
690                    && (TYPE_NAME (TREE_VALUE (args2)) == 0
691                        || TYPE_TRANSPARENT_UNION (TREE_VALUE (args2)))
692                    && TREE_CODE (TYPE_SIZE (TREE_VALUE (args2))) == INTEGER_CST
693                    && tree_int_cst_equal (TYPE_SIZE (TREE_VALUE (args2)),
694                                           TYPE_SIZE (TREE_VALUE (args1))))
695             {
696               tree memb;
697               for (memb = TYPE_FIELDS (TREE_VALUE (args2));
698                    memb; memb = TREE_CHAIN (memb))
699                 if (comptypes (TREE_TYPE (memb), TREE_VALUE (args1)))
700                   break;
701               if (memb == 0)
702                 return 0;
703             }
704           else
705             return 0;
706         }
707
708       /* comptypes said ok, but record if it said to warn.  */
709       if (newval > val)
710         val = newval;
711
712       args1 = TREE_CHAIN (args1);
713       args2 = TREE_CHAIN (args2);
714     }
715 }
716 \f
717 /* Compute the value of the `sizeof' operator.  */
718
719 tree
720 c_sizeof (type)
721      tree type;
722 {
723   enum tree_code code = TREE_CODE (type);
724   tree size;
725
726   if (code == FUNCTION_TYPE)
727     {
728       if (pedantic || warn_pointer_arith)
729         pedwarn ("sizeof applied to a function type");
730       size = size_one_node;
731     }
732   else if (code == VOID_TYPE)
733     {
734       if (pedantic || warn_pointer_arith)
735         pedwarn ("sizeof applied to a void type");
736       size = size_one_node;
737     }
738   else if (code == ERROR_MARK)
739     size = size_one_node;
740   else if (!COMPLETE_TYPE_P (type))
741     {
742       error ("sizeof applied to an incomplete type");
743       size = size_zero_node;
744     }
745   else
746     /* Convert in case a char is more than one unit.  */
747     size = size_binop (CEIL_DIV_EXPR, TYPE_SIZE_UNIT (type),
748                        size_int (TYPE_PRECISION (char_type_node)
749                                  / BITS_PER_UNIT));
750
751   /* SIZE will have an integer type with TYPE_IS_SIZETYPE set.
752      TYPE_IS_SIZETYPE means that certain things (like overflow) will
753      never happen.  However, this node should really have type
754      `size_t', which is just a typedef for an ordinary integer type.  */
755   return fold (build1 (NOP_EXPR, c_size_type_node, size));
756 }
757
758 tree
759 c_sizeof_nowarn (type)
760      tree type;
761 {
762   enum tree_code code = TREE_CODE (type);
763   tree size;
764
765   if (code == FUNCTION_TYPE || code == VOID_TYPE || code == ERROR_MARK)
766     size = size_one_node;
767   else if (!COMPLETE_TYPE_P (type))
768     size = size_zero_node;
769   else
770     /* Convert in case a char is more than one unit.  */
771     size = size_binop (CEIL_DIV_EXPR, TYPE_SIZE_UNIT (type),
772                        size_int (TYPE_PRECISION (char_type_node)
773                                  / BITS_PER_UNIT));
774
775   /* SIZE will have an integer type with TYPE_IS_SIZETYPE set.
776      TYPE_IS_SIZETYPE means that certain things (like overflow) will
777      never happen.  However, this node should really have type
778      `size_t', which is just a typedef for an ordinary integer type.  */
779   return fold (build1 (NOP_EXPR, c_size_type_node, size));
780 }
781
782 /* Compute the size to increment a pointer by.  */
783
784 tree
785 c_size_in_bytes (type)
786      tree type;
787 {
788   enum tree_code code = TREE_CODE (type);
789
790   if (code == FUNCTION_TYPE || code == VOID_TYPE || code == ERROR_MARK)
791     return size_one_node;
792
793   if (!COMPLETE_OR_VOID_TYPE_P (type))
794     {
795       error ("arithmetic on pointer to an incomplete type");
796       return size_one_node;
797     }
798
799   /* Convert in case a char is more than one unit.  */
800   return size_binop (CEIL_DIV_EXPR, TYPE_SIZE_UNIT (type),
801                      size_int (TYPE_PRECISION (char_type_node)
802                                / BITS_PER_UNIT));
803 }
804 \f
805 /* Return either DECL or its known constant value (if it has one).  */
806
807 tree
808 decl_constant_value (decl)
809      tree decl;
810 {
811   if (/* Don't change a variable array bound or initial value to a constant
812          in a place where a variable is invalid.  */
813       current_function_decl != 0
814       && ! TREE_THIS_VOLATILE (decl)
815       && TREE_READONLY (decl)
816       && DECL_INITIAL (decl) != 0
817       && TREE_CODE (DECL_INITIAL (decl)) != ERROR_MARK
818       /* This is invalid if initial value is not constant.
819          If it has either a function call, a memory reference,
820          or a variable, then re-evaluating it could give different results.  */
821       && TREE_CONSTANT (DECL_INITIAL (decl))
822       /* Check for cases where this is sub-optimal, even though valid.  */
823       && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR)
824     return DECL_INITIAL (decl);
825   return decl;
826 }
827
828 /* Return either DECL or its known constant value (if it has one), but
829    return DECL if pedantic or DECL has mode BLKmode.  This is for
830    bug-compatibility with the old behavior of decl_constant_value
831    (before GCC 3.0); every use of this function is a bug and it should
832    be removed before GCC 3.1.  It is not appropriate to use pedantic
833    in a way that affects optimization, and BLKmode is probably not the
834    right test for avoiding misoptimizations either.  */
835
836 static tree
837 decl_constant_value_for_broken_optimization (decl)
838      tree decl;
839 {
840   if (pedantic || DECL_MODE (decl) == BLKmode)
841     return decl;
842   else
843     return decl_constant_value (decl);
844 }
845
846
847 /* Perform the default conversion of arrays and functions to pointers.
848    Return the result of converting EXP.  For any other expression, just
849    return EXP.  */
850
851 static tree
852 default_function_array_conversion (exp)
853      tree exp;
854 {
855   tree orig_exp;
856   tree type = TREE_TYPE (exp);
857   enum tree_code code = TREE_CODE (type);
858   int not_lvalue = 0;
859
860   /* Strip NON_LVALUE_EXPRs and no-op conversions, since we aren't using as
861      an lvalue. 
862
863      Do not use STRIP_NOPS here!  It will remove conversions from pointer
864      to integer and cause infinite recursion.  */
865   orig_exp = exp;
866   while (TREE_CODE (exp) == NON_LVALUE_EXPR
867          || (TREE_CODE (exp) == NOP_EXPR
868              && TREE_TYPE (TREE_OPERAND (exp, 0)) == TREE_TYPE (exp)))
869     {
870       if (TREE_CODE (exp) == NON_LVALUE_EXPR)
871         not_lvalue = 1;
872       exp = TREE_OPERAND (exp, 0);
873     }
874
875   /* Preserve the original expression code.  */
876   if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (exp))))
877     C_SET_EXP_ORIGINAL_CODE (exp, C_EXP_ORIGINAL_CODE (orig_exp));
878
879   if (code == FUNCTION_TYPE)
880     {
881       return build_unary_op (ADDR_EXPR, exp, 0);
882     }
883   if (code == ARRAY_TYPE)
884     {
885       tree adr;
886       tree restype = TREE_TYPE (type);
887       tree ptrtype;
888       int constp = 0;
889       int volatilep = 0;
890       int lvalue_array_p;
891
892       if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'r' || DECL_P (exp))
893         {
894           constp = TREE_READONLY (exp);
895           volatilep = TREE_THIS_VOLATILE (exp);
896         }
897
898       if (TYPE_QUALS (type) || constp || volatilep)
899         restype 
900           = c_build_qualified_type (restype,
901                                     TYPE_QUALS (type) 
902                                     | (constp * TYPE_QUAL_CONST)
903                                     | (volatilep * TYPE_QUAL_VOLATILE));
904
905       if (TREE_CODE (exp) == INDIRECT_REF)
906         return convert (TYPE_POINTER_TO (restype),
907                         TREE_OPERAND (exp, 0));
908
909       if (TREE_CODE (exp) == COMPOUND_EXPR)
910         {
911           tree op1 = default_conversion (TREE_OPERAND (exp, 1));
912           return build (COMPOUND_EXPR, TREE_TYPE (op1),
913                         TREE_OPERAND (exp, 0), op1);
914         }
915
916       lvalue_array_p = !not_lvalue && lvalue_p (exp);
917       if (!flag_isoc99 && !lvalue_array_p)
918         {
919           /* Before C99, non-lvalue arrays do not decay to pointers.
920              Normally, using such an array would be invalid; but it can
921              be used correctly inside sizeof or as a statement expression.
922              Thus, do not give an error here; an error will result later.  */
923           return exp;
924         }
925
926       ptrtype = build_pointer_type (restype);
927
928       if (TREE_CODE (exp) == VAR_DECL)
929         {
930           /* ??? This is not really quite correct
931              in that the type of the operand of ADDR_EXPR
932              is not the target type of the type of the ADDR_EXPR itself.
933              Question is, can this lossage be avoided?  */
934           adr = build1 (ADDR_EXPR, ptrtype, exp);
935           if (mark_addressable (exp) == 0)
936             return error_mark_node;
937           TREE_CONSTANT (adr) = staticp (exp);
938           TREE_SIDE_EFFECTS (adr) = 0;   /* Default would be, same as EXP.  */
939           return adr;
940         }
941       /* This way is better for a COMPONENT_REF since it can
942          simplify the offset for a component.  */
943       adr = build_unary_op (ADDR_EXPR, exp, 1);
944       return convert (ptrtype, adr);
945     }
946   return exp;
947 }
948
949 /* Perform default promotions for C data used in expressions.
950    Arrays and functions are converted to pointers;
951    enumeral types or short or char, to int.
952    In addition, manifest constants symbols are replaced by their values.  */
953
954 tree
955 default_conversion (exp)
956      tree exp;
957 {
958   tree orig_exp;
959   tree type = TREE_TYPE (exp);
960   enum tree_code code = TREE_CODE (type);
961
962   if (code == FUNCTION_TYPE || code == ARRAY_TYPE)
963     return default_function_array_conversion (exp);
964
965   /* Constants can be used directly unless they're not loadable.  */
966   if (TREE_CODE (exp) == CONST_DECL)
967     exp = DECL_INITIAL (exp);
968
969   /* Replace a nonvolatile const static variable with its value unless
970      it is an array, in which case we must be sure that taking the
971      address of the array produces consistent results.  */
972   else if (optimize && TREE_CODE (exp) == VAR_DECL && code != ARRAY_TYPE)
973     {
974       exp = decl_constant_value_for_broken_optimization (exp);
975       type = TREE_TYPE (exp);
976     }
977
978   /* Strip NON_LVALUE_EXPRs and no-op conversions, since we aren't using as
979      an lvalue. 
980
981      Do not use STRIP_NOPS here!  It will remove conversions from pointer
982      to integer and cause infinite recursion.  */
983   orig_exp = exp;
984   while (TREE_CODE (exp) == NON_LVALUE_EXPR
985          || (TREE_CODE (exp) == NOP_EXPR
986              && TREE_TYPE (TREE_OPERAND (exp, 0)) == TREE_TYPE (exp)))
987     exp = TREE_OPERAND (exp, 0);
988
989   /* Preserve the original expression code.  */
990   if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (exp))))
991     C_SET_EXP_ORIGINAL_CODE (exp, C_EXP_ORIGINAL_CODE (orig_exp));
992
993   /* Normally convert enums to int,
994      but convert wide enums to something wider.  */
995   if (code == ENUMERAL_TYPE)
996     {
997       type = type_for_size (MAX (TYPE_PRECISION (type),
998                                  TYPE_PRECISION (integer_type_node)),
999                             ((TYPE_PRECISION (type)
1000                               >= TYPE_PRECISION (integer_type_node))
1001                              && TREE_UNSIGNED (type)));
1002
1003       return convert (type, exp);
1004     }
1005
1006   if (TREE_CODE (exp) == COMPONENT_REF
1007       && DECL_C_BIT_FIELD (TREE_OPERAND (exp, 1))
1008       /* If it's thinner than an int, promote it like a
1009          c_promoting_integer_type_p, otherwise leave it alone.  */
1010       && 0 > compare_tree_int (DECL_SIZE (TREE_OPERAND (exp, 1)),
1011                                TYPE_PRECISION (integer_type_node)))
1012     return convert (integer_type_node, exp);
1013
1014   if (c_promoting_integer_type_p (type))
1015     {
1016       /* Preserve unsignedness if not really getting any wider.  */
1017       if (TREE_UNSIGNED (type)
1018           && TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node))
1019         return convert (unsigned_type_node, exp);
1020
1021       return convert (integer_type_node, exp);
1022     }
1023
1024   if (code == VOID_TYPE)
1025     {
1026       error ("void value not ignored as it ought to be");
1027       return error_mark_node;
1028     }
1029   return exp;
1030 }
1031 \f
1032 /* Look up COMPONENT in a structure or union DECL.
1033
1034    If the component name is not found, returns NULL_TREE.  Otherwise,
1035    the return value is a TREE_LIST, with each TREE_VALUE a FIELD_DECL
1036    stepping down the chain to the component, which is in the last
1037    TREE_VALUE of the list.  Normally the list is of length one, but if
1038    the component is embedded within (nested) anonymous structures or
1039    unions, the list steps down the chain to the component.  */
1040      
1041 static tree
1042 lookup_field (decl, component)
1043      tree decl, component;
1044 {
1045   tree type = TREE_TYPE (decl);
1046   tree field;
1047
1048   /* If TYPE_LANG_SPECIFIC is set, then it is a sorted array of pointers
1049      to the field elements.  Use a binary search on this array to quickly
1050      find the element.  Otherwise, do a linear search.  TYPE_LANG_SPECIFIC
1051      will always be set for structures which have many elements.  */
1052
1053   if (TYPE_LANG_SPECIFIC (type))
1054     {
1055       int bot, top, half;
1056       tree *field_array = &TYPE_LANG_SPECIFIC (type)->elts[0];
1057
1058       field = TYPE_FIELDS (type);
1059       bot = 0;
1060       top = TYPE_LANG_SPECIFIC (type)->len;
1061       while (top - bot > 1)
1062         {
1063           half = (top - bot + 1) >> 1;
1064           field = field_array[bot+half];
1065
1066           if (DECL_NAME (field) == NULL_TREE)
1067             {
1068               /* Step through all anon unions in linear fashion.  */
1069               while (DECL_NAME (field_array[bot]) == NULL_TREE)
1070                 {
1071                   field = field_array[bot++];
1072                   if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE
1073                       || TREE_CODE (TREE_TYPE (field)) == UNION_TYPE)
1074                     {
1075                       tree anon = lookup_field (field, component);
1076
1077                       if (anon)
1078                         return tree_cons (NULL_TREE, field, anon);
1079                     } 
1080                 }
1081
1082               /* Entire record is only anon unions.  */
1083               if (bot > top)
1084                 return NULL_TREE;
1085
1086               /* Restart the binary search, with new lower bound.  */
1087               continue;
1088             }
1089
1090           if (DECL_NAME (field) == component)
1091             break;
1092           if (DECL_NAME (field) < component)
1093             bot += half;
1094           else
1095             top = bot + half;
1096         }
1097
1098       if (DECL_NAME (field_array[bot]) == component)
1099         field = field_array[bot];
1100       else if (DECL_NAME (field) != component)
1101         return NULL_TREE;
1102     }
1103   else
1104     {
1105       for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
1106         {
1107           if (DECL_NAME (field) == NULL_TREE
1108               && (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE
1109                   || TREE_CODE (TREE_TYPE (field)) == UNION_TYPE))
1110             {
1111               tree anon = lookup_field (field, component);
1112
1113               if (anon)
1114                 return tree_cons (NULL_TREE, field, anon);
1115             }
1116
1117           if (DECL_NAME (field) == component)
1118             break;
1119         }
1120
1121       if (field == NULL_TREE)
1122         return NULL_TREE;
1123     }
1124
1125   return tree_cons (NULL_TREE, field, NULL_TREE);
1126 }
1127
1128 /* Make an expression to refer to the COMPONENT field of
1129    structure or union value DATUM.  COMPONENT is an IDENTIFIER_NODE.  */
1130
1131 tree
1132 build_component_ref (datum, component)
1133      tree datum, component;
1134 {
1135   tree type = TREE_TYPE (datum);
1136   enum tree_code code = TREE_CODE (type);
1137   tree field = NULL;
1138   tree ref;
1139
1140   /* If DATUM is a COMPOUND_EXPR, move our reference inside it.
1141      If pedantic ensure that the arguments are not lvalues; otherwise,
1142      if the component is an array, it would wrongly decay to a pointer in
1143      C89 mode.
1144      We cannot do this with a COND_EXPR, because in a conditional expression
1145      the default promotions are applied to both sides, and this would yield
1146      the wrong type of the result; for example, if the components have
1147      type "char".  */
1148   switch (TREE_CODE (datum))
1149     {
1150     case COMPOUND_EXPR:
1151       {
1152         tree value = build_component_ref (TREE_OPERAND (datum, 1), component);
1153         return build (COMPOUND_EXPR, TREE_TYPE (value),
1154                       TREE_OPERAND (datum, 0), pedantic_non_lvalue (value));
1155       }
1156     default:
1157       break;
1158     }
1159
1160   /* See if there is a field or component with name COMPONENT.  */
1161
1162   if (code == RECORD_TYPE || code == UNION_TYPE)
1163     {
1164       if (!COMPLETE_TYPE_P (type))
1165         {
1166           incomplete_type_error (NULL_TREE, type);
1167           return error_mark_node;
1168         }
1169
1170       field = lookup_field (datum, component);
1171
1172       if (!field)
1173         {
1174           error ("%s has no member named `%s'",
1175                  code == RECORD_TYPE ? "structure" : "union",
1176                  IDENTIFIER_POINTER (component));
1177           return error_mark_node;
1178         }
1179
1180       /* Chain the COMPONENT_REFs if necessary down to the FIELD.
1181          This might be better solved in future the way the C++ front
1182          end does it - by giving the anonymous entities each a
1183          separate name and type, and then have build_component_ref
1184          recursively call itself.  We can't do that here.  */
1185       for (; field; field = TREE_CHAIN (field))
1186         {
1187           tree subdatum = TREE_VALUE (field);
1188
1189           if (TREE_TYPE (subdatum) == error_mark_node)
1190             return error_mark_node;
1191
1192           ref = build (COMPONENT_REF, TREE_TYPE (subdatum), datum, subdatum);
1193           if (TREE_READONLY (datum) || TREE_READONLY (subdatum))
1194             TREE_READONLY (ref) = 1;
1195           if (TREE_THIS_VOLATILE (datum) || TREE_THIS_VOLATILE (subdatum))
1196             TREE_THIS_VOLATILE (ref) = 1;
1197
1198           if (TREE_DEPRECATED (subdatum))
1199             warn_deprecated_use (subdatum);
1200
1201           datum = ref;
1202         }
1203
1204       return ref;
1205     }
1206   else if (code != ERROR_MARK)
1207     error ("request for member `%s' in something not a structure or union",
1208             IDENTIFIER_POINTER (component));
1209
1210   return error_mark_node;
1211 }
1212 \f
1213 /* Given an expression PTR for a pointer, return an expression
1214    for the value pointed to.
1215    ERRORSTRING is the name of the operator to appear in error messages.  */
1216
1217 tree
1218 build_indirect_ref (ptr, errorstring)
1219      tree ptr;
1220      const char *errorstring;
1221 {
1222   tree pointer = default_conversion (ptr);
1223   tree type = TREE_TYPE (pointer);
1224
1225   if (TREE_CODE (type) == POINTER_TYPE)
1226     {
1227       if (TREE_CODE (pointer) == ADDR_EXPR
1228           && !flag_volatile
1229           && (TREE_TYPE (TREE_OPERAND (pointer, 0))
1230               == TREE_TYPE (type)))
1231         return TREE_OPERAND (pointer, 0);
1232       else
1233         {
1234           tree t = TREE_TYPE (type);
1235           tree ref = build1 (INDIRECT_REF, TYPE_MAIN_VARIANT (t), pointer);
1236
1237           if (!COMPLETE_OR_VOID_TYPE_P (t) && TREE_CODE (t) != ARRAY_TYPE)
1238             {
1239               error ("dereferencing pointer to incomplete type");
1240               return error_mark_node;
1241             }
1242           if (VOID_TYPE_P (t) && skip_evaluation == 0)
1243             warning ("dereferencing `void *' pointer");
1244
1245           /* We *must* set TREE_READONLY when dereferencing a pointer to const,
1246              so that we get the proper error message if the result is used
1247              to assign to.  Also, &* is supposed to be a no-op.
1248              And ANSI C seems to specify that the type of the result
1249              should be the const type.  */
1250           /* A de-reference of a pointer to const is not a const.  It is valid
1251              to change it via some other pointer.  */
1252           TREE_READONLY (ref) = TYPE_READONLY (t);
1253           TREE_SIDE_EFFECTS (ref)
1254             = TYPE_VOLATILE (t) || TREE_SIDE_EFFECTS (pointer) || flag_volatile;
1255           TREE_THIS_VOLATILE (ref) = TYPE_VOLATILE (t);
1256           return ref;
1257         }
1258     }
1259   else if (TREE_CODE (pointer) != ERROR_MARK)
1260     error ("invalid type argument of `%s'", errorstring);
1261   return error_mark_node;
1262 }
1263
1264 /* This handles expressions of the form "a[i]", which denotes
1265    an array reference.
1266
1267    This is logically equivalent in C to *(a+i), but we may do it differently.
1268    If A is a variable or a member, we generate a primitive ARRAY_REF.
1269    This avoids forcing the array out of registers, and can work on
1270    arrays that are not lvalues (for example, members of structures returned
1271    by functions).  */
1272
1273 tree
1274 build_array_ref (array, index)
1275      tree array, index;
1276 {
1277   if (index == 0)
1278     {
1279       error ("subscript missing in array reference");
1280       return error_mark_node;
1281     }
1282
1283   if (TREE_TYPE (array) == error_mark_node
1284       || TREE_TYPE (index) == error_mark_node)
1285     return error_mark_node;
1286
1287   if (TREE_CODE (TREE_TYPE (array)) == ARRAY_TYPE
1288       && TREE_CODE (array) != INDIRECT_REF)
1289     {
1290       tree rval, type;
1291
1292       /* Subscripting with type char is likely to lose
1293          on a machine where chars are signed.
1294          So warn on any machine, but optionally.
1295          Don't warn for unsigned char since that type is safe.
1296          Don't warn for signed char because anyone who uses that
1297          must have done so deliberately.  */
1298       if (warn_char_subscripts
1299           && TYPE_MAIN_VARIANT (TREE_TYPE (index)) == char_type_node)
1300         warning ("array subscript has type `char'");
1301
1302       /* Apply default promotions *after* noticing character types.  */
1303       index = default_conversion (index);
1304
1305       /* Require integer *after* promotion, for sake of enums.  */
1306       if (TREE_CODE (TREE_TYPE (index)) != INTEGER_TYPE)
1307         {
1308           error ("array subscript is not an integer");
1309           return error_mark_node;
1310         }
1311
1312       /* An array that is indexed by a non-constant
1313          cannot be stored in a register; we must be able to do
1314          address arithmetic on its address.
1315          Likewise an array of elements of variable size.  */
1316       if (TREE_CODE (index) != INTEGER_CST
1317           || (COMPLETE_TYPE_P (TREE_TYPE (TREE_TYPE (array)))
1318               && TREE_CODE (TYPE_SIZE (TREE_TYPE (TREE_TYPE (array)))) != INTEGER_CST))
1319         {
1320           if (mark_addressable (array) == 0)
1321             return error_mark_node;
1322         }
1323       /* An array that is indexed by a constant value which is not within
1324          the array bounds cannot be stored in a register either; because we
1325          would get a crash in store_bit_field/extract_bit_field when trying
1326          to access a non-existent part of the register.  */
1327       if (TREE_CODE (index) == INTEGER_CST
1328           && TYPE_VALUES (TREE_TYPE (array))
1329           && ! int_fits_type_p (index, TYPE_VALUES (TREE_TYPE (array))))
1330         {
1331           if (mark_addressable (array) == 0)
1332             return error_mark_node;
1333         }
1334
1335       if (pedantic)
1336         {
1337           tree foo = array;
1338           while (TREE_CODE (foo) == COMPONENT_REF)
1339             foo = TREE_OPERAND (foo, 0);
1340           if (TREE_CODE (foo) == VAR_DECL && DECL_REGISTER (foo))
1341             pedwarn ("ISO C forbids subscripting `register' array");
1342           else if (! flag_isoc99 && ! lvalue_p (foo))
1343             pedwarn ("ISO C89 forbids subscripting non-lvalue array");
1344         }
1345
1346       type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (array)));
1347       rval = build (ARRAY_REF, type, array, index);
1348       /* Array ref is const/volatile if the array elements are
1349          or if the array is.  */
1350       TREE_READONLY (rval)
1351         |= (TYPE_READONLY (TREE_TYPE (TREE_TYPE (array)))
1352             | TREE_READONLY (array));
1353       TREE_SIDE_EFFECTS (rval)
1354         |= (TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (array)))
1355             | TREE_SIDE_EFFECTS (array));
1356       TREE_THIS_VOLATILE (rval)
1357         |= (TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (array)))
1358             /* This was added by rms on 16 Nov 91.
1359                It fixes  vol struct foo *a;  a->elts[1] 
1360                in an inline function.
1361                Hope it doesn't break something else.  */
1362             | TREE_THIS_VOLATILE (array));
1363       return require_complete_type (fold (rval));
1364     }
1365
1366   {
1367     tree ar = default_conversion (array);
1368     tree ind = default_conversion (index);
1369
1370     /* Do the same warning check as above, but only on the part that's
1371        syntactically the index and only if it is also semantically
1372        the index.  */
1373     if (warn_char_subscripts
1374         && TREE_CODE (TREE_TYPE (index)) == INTEGER_TYPE
1375         && TYPE_MAIN_VARIANT (TREE_TYPE (index)) == char_type_node)
1376       warning ("subscript has type `char'");
1377
1378     /* Put the integer in IND to simplify error checking.  */
1379     if (TREE_CODE (TREE_TYPE (ar)) == INTEGER_TYPE)
1380       {
1381         tree temp = ar;
1382         ar = ind;
1383         ind = temp;
1384       }
1385
1386     if (ar == error_mark_node)
1387       return ar;
1388
1389     if (TREE_CODE (TREE_TYPE (ar)) != POINTER_TYPE
1390         || TREE_CODE (TREE_TYPE (TREE_TYPE (ar))) == FUNCTION_TYPE)
1391       {
1392         error ("subscripted value is neither array nor pointer");
1393         return error_mark_node;
1394       }
1395     if (TREE_CODE (TREE_TYPE (ind)) != INTEGER_TYPE)
1396       {
1397         error ("array subscript is not an integer");
1398         return error_mark_node;
1399       }
1400
1401     return build_indirect_ref (build_binary_op (PLUS_EXPR, ar, ind, 0),
1402                                "array indexing");
1403   }
1404 }
1405 \f
1406 /* Build an external reference to identifier ID.  FUN indicates
1407    whether this will be used for a function call.  */
1408 tree
1409 build_external_ref (id, fun)
1410      tree id;
1411      int fun;
1412 {
1413   tree ref;
1414   tree decl = lookup_name (id);
1415   tree objc_ivar = lookup_objc_ivar (id);
1416
1417   if (decl && TREE_DEPRECATED (decl))
1418     warn_deprecated_use (decl);
1419
1420   if (!decl || decl == error_mark_node || C_DECL_ANTICIPATED (decl))
1421     {
1422       if (objc_ivar)
1423         ref = objc_ivar;
1424       else if (fun)
1425         {
1426           if (!decl || decl == error_mark_node)
1427             /* Ordinary implicit function declaration.  */
1428             ref = implicitly_declare (id);
1429           else
1430             {
1431               /* Implicit declaration of built-in function.  Don't
1432                  change the built-in declaration, but don't let this
1433                  go by silently, either.  */
1434               implicit_decl_warning (id);
1435
1436               /* only issue this warning once */
1437               C_DECL_ANTICIPATED (decl) = 0;
1438               ref = decl;
1439             }
1440         }
1441       else
1442         {
1443           /* Reference to undeclared variable, including reference to
1444              builtin outside of function-call context.  */
1445           if (current_function_decl == 0)
1446             error ("`%s' undeclared here (not in a function)",
1447                    IDENTIFIER_POINTER (id));
1448           else
1449             {
1450               if (IDENTIFIER_GLOBAL_VALUE (id) != error_mark_node
1451                   || IDENTIFIER_ERROR_LOCUS (id) != current_function_decl)
1452                 {
1453                   error ("`%s' undeclared (first use in this function)",
1454                          IDENTIFIER_POINTER (id));
1455
1456                   if (! undeclared_variable_notice)
1457                     {
1458                       error ("(Each undeclared identifier is reported only once");
1459                       error ("for each function it appears in.)");
1460                       undeclared_variable_notice = 1;
1461                     }
1462                 }
1463               IDENTIFIER_GLOBAL_VALUE (id) = error_mark_node;
1464               IDENTIFIER_ERROR_LOCUS (id) = current_function_decl;
1465             }
1466           return error_mark_node;
1467         }
1468     }
1469   else
1470     {
1471       /* Properly declared variable or function reference.  */
1472       if (!objc_ivar)
1473         ref = decl;
1474       else if (decl != objc_ivar && IDENTIFIER_LOCAL_VALUE (id))
1475         {
1476           warning ("local declaration of `%s' hides instance variable",
1477                    IDENTIFIER_POINTER (id));
1478           ref = decl;
1479         }
1480       else
1481         ref = objc_ivar;
1482     }
1483
1484   if (TREE_TYPE (ref) == error_mark_node)
1485     return error_mark_node;
1486
1487   assemble_external (ref);
1488   TREE_USED (ref) = 1;
1489
1490   if (TREE_CODE (ref) == CONST_DECL)
1491     {
1492       ref = DECL_INITIAL (ref);
1493       TREE_CONSTANT (ref) = 1;
1494     }
1495
1496   return ref;
1497 }
1498
1499 /* Build a function call to function FUNCTION with parameters PARAMS.
1500    PARAMS is a list--a chain of TREE_LIST nodes--in which the
1501    TREE_VALUE of each node is a parameter-expression.
1502    FUNCTION's data type may be a function type or a pointer-to-function.  */
1503
1504 tree
1505 build_function_call (function, params)
1506      tree function, params;
1507 {
1508   tree fntype, fundecl = 0;
1509   tree coerced_params;
1510   tree name = NULL_TREE, assembler_name = NULL_TREE, result;
1511
1512   /* Strip NON_LVALUE_EXPRs, etc., since we aren't using as an lvalue.  */
1513   STRIP_TYPE_NOPS (function);
1514
1515   /* Convert anything with function type to a pointer-to-function.  */
1516   if (TREE_CODE (function) == FUNCTION_DECL)
1517     {
1518       name = DECL_NAME (function);
1519       assembler_name = DECL_ASSEMBLER_NAME (function);
1520
1521       /* Differs from default_conversion by not setting TREE_ADDRESSABLE
1522          (because calling an inline function does not mean the function
1523          needs to be separately compiled).  */
1524       fntype = build_type_variant (TREE_TYPE (function),
1525                                    TREE_READONLY (function),
1526                                    TREE_THIS_VOLATILE (function));
1527       fundecl = function;
1528       function = build1 (ADDR_EXPR, build_pointer_type (fntype), function);
1529     }
1530   else
1531     function = default_conversion (function);
1532
1533   fntype = TREE_TYPE (function);
1534
1535   if (TREE_CODE (fntype) == ERROR_MARK)
1536     return error_mark_node;
1537
1538   if (!(TREE_CODE (fntype) == POINTER_TYPE
1539         && TREE_CODE (TREE_TYPE (fntype)) == FUNCTION_TYPE))
1540     {
1541       error ("called object is not a function");
1542       return error_mark_node;
1543     }
1544
1545   if (fundecl && TREE_THIS_VOLATILE (fundecl))
1546     current_function_returns_abnormally = 1;
1547
1548   /* fntype now gets the type of function pointed to.  */
1549   fntype = TREE_TYPE (fntype);
1550
1551   /* Convert the parameters to the types declared in the
1552      function prototype, or apply default promotions.  */
1553
1554   coerced_params
1555     = convert_arguments (TYPE_ARG_TYPES (fntype), params, name, fundecl);
1556
1557   /* Check for errors in format strings.  */
1558
1559   if (warn_format)
1560     check_function_format (NULL, TYPE_ATTRIBUTES (fntype), coerced_params);
1561
1562   /* Recognize certain built-in functions so we can make tree-codes
1563      other than CALL_EXPR.  We do this when it enables fold-const.c
1564      to do something useful.  */
1565
1566   if (TREE_CODE (function) == ADDR_EXPR
1567       && TREE_CODE (TREE_OPERAND (function, 0)) == FUNCTION_DECL
1568       && DECL_BUILT_IN (TREE_OPERAND (function, 0)))
1569     {
1570       result = expand_tree_builtin (TREE_OPERAND (function, 0),
1571                                     params, coerced_params);
1572       if (result)
1573         return result;
1574     }
1575
1576   result = build (CALL_EXPR, TREE_TYPE (fntype),
1577                   function, coerced_params, NULL_TREE);
1578   TREE_SIDE_EFFECTS (result) = 1;
1579   result = fold (result);
1580
1581   if (VOID_TYPE_P (TREE_TYPE (result)))
1582     return result;
1583   return require_complete_type (result);
1584 }
1585 \f
1586 /* Convert the argument expressions in the list VALUES
1587    to the types in the list TYPELIST.  The result is a list of converted
1588    argument expressions.
1589
1590    If TYPELIST is exhausted, or when an element has NULL as its type,
1591    perform the default conversions.
1592
1593    PARMLIST is the chain of parm decls for the function being called.
1594    It may be 0, if that info is not available.
1595    It is used only for generating error messages.
1596
1597    NAME is an IDENTIFIER_NODE or 0.  It is used only for error messages.
1598
1599    This is also where warnings about wrong number of args are generated.
1600
1601    Both VALUES and the returned value are chains of TREE_LIST nodes
1602    with the elements of the list in the TREE_VALUE slots of those nodes.  */
1603
1604 static tree
1605 convert_arguments (typelist, values, name, fundecl)
1606      tree typelist, values, name, fundecl;
1607 {
1608   tree typetail, valtail;
1609   tree result = NULL;
1610   int parmnum;
1611
1612   /* Scan the given expressions and types, producing individual
1613      converted arguments and pushing them on RESULT in reverse order.  */
1614
1615   for (valtail = values, typetail = typelist, parmnum = 0;
1616        valtail;
1617        valtail = TREE_CHAIN (valtail), parmnum++)
1618     {
1619       tree type = typetail ? TREE_VALUE (typetail) : 0;
1620       tree val = TREE_VALUE (valtail);
1621
1622       if (type == void_type_node)
1623         {
1624           if (name)
1625             error ("too many arguments to function `%s'",
1626                    IDENTIFIER_POINTER (name));
1627           else
1628             error ("too many arguments to function");
1629           break;
1630         }
1631
1632       /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
1633       /* Do not use STRIP_NOPS here!  We do not want an enumerator with value 0
1634          to convert automatically to a pointer.  */
1635       if (TREE_CODE (val) == NON_LVALUE_EXPR)
1636         val = TREE_OPERAND (val, 0);
1637
1638       val = default_function_array_conversion (val);
1639
1640       val = require_complete_type (val);
1641
1642       if (type != 0)
1643         {
1644           /* Formal parm type is specified by a function prototype.  */
1645           tree parmval;
1646
1647           if (!COMPLETE_TYPE_P (type))
1648             {
1649               error ("type of formal parameter %d is incomplete", parmnum + 1);
1650               parmval = val;
1651             }
1652           else
1653             {
1654               /* Optionally warn about conversions that
1655                  differ from the default conversions.  */
1656               if (warn_conversion || warn_traditional)
1657                 {
1658                   int formal_prec = TYPE_PRECISION (type);
1659
1660                   if (INTEGRAL_TYPE_P (type)
1661                       && TREE_CODE (TREE_TYPE (val)) == REAL_TYPE)
1662                     warn_for_assignment ("%s as integer rather than floating due to prototype", (char *) 0, name, parmnum + 1);
1663                   if (INTEGRAL_TYPE_P (type)
1664                       && TREE_CODE (TREE_TYPE (val)) == COMPLEX_TYPE)
1665                     warn_for_assignment ("%s as integer rather than complex due to prototype", (char *) 0, name, parmnum + 1);
1666                   else if (TREE_CODE (type) == COMPLEX_TYPE
1667                            && TREE_CODE (TREE_TYPE (val)) == REAL_TYPE)
1668                     warn_for_assignment ("%s as complex rather than floating due to prototype", (char *) 0, name, parmnum + 1);
1669                   else if (TREE_CODE (type) == REAL_TYPE
1670                            && INTEGRAL_TYPE_P (TREE_TYPE (val)))
1671                     warn_for_assignment ("%s as floating rather than integer due to prototype", (char *) 0, name, parmnum + 1);
1672                   else if (TREE_CODE (type) == COMPLEX_TYPE
1673                            && INTEGRAL_TYPE_P (TREE_TYPE (val)))
1674                     warn_for_assignment ("%s as complex rather than integer due to prototype", (char *) 0, name, parmnum + 1);
1675                   else if (TREE_CODE (type) == REAL_TYPE
1676                            && TREE_CODE (TREE_TYPE (val)) == COMPLEX_TYPE)
1677                     warn_for_assignment ("%s as floating rather than complex due to prototype", (char *) 0, name, parmnum + 1);
1678                   /* ??? At some point, messages should be written about
1679                      conversions between complex types, but that's too messy
1680                      to do now.  */
1681                   else if (TREE_CODE (type) == REAL_TYPE
1682                            && TREE_CODE (TREE_TYPE (val)) == REAL_TYPE)
1683                     {
1684                       /* Warn if any argument is passed as `float',
1685                          since without a prototype it would be `double'.  */
1686                       if (formal_prec == TYPE_PRECISION (float_type_node))
1687                         warn_for_assignment ("%s as `float' rather than `double' due to prototype", (char *) 0, name, parmnum + 1);
1688                     }
1689                   /* Detect integer changing in width or signedness.
1690                      These warnings are only activated with
1691                      -Wconversion, not with -Wtraditional.  */
1692                   else if (warn_conversion && INTEGRAL_TYPE_P (type)
1693                            && INTEGRAL_TYPE_P (TREE_TYPE (val)))
1694                     {
1695                       tree would_have_been = default_conversion (val);
1696                       tree type1 = TREE_TYPE (would_have_been);
1697
1698                       if (TREE_CODE (type) == ENUMERAL_TYPE
1699                           && (TYPE_MAIN_VARIANT (type)
1700                               == TYPE_MAIN_VARIANT (TREE_TYPE (val))))
1701                         /* No warning if function asks for enum
1702                            and the actual arg is that enum type.  */
1703                         ;
1704                       else if (formal_prec != TYPE_PRECISION (type1))
1705                         warn_for_assignment ("%s with different width due to prototype", (char *) 0, name, parmnum + 1);
1706                       else if (TREE_UNSIGNED (type) == TREE_UNSIGNED (type1))
1707                         ;
1708                       /* Don't complain if the formal parameter type
1709                          is an enum, because we can't tell now whether
1710                          the value was an enum--even the same enum.  */
1711                       else if (TREE_CODE (type) == ENUMERAL_TYPE)
1712                         ;
1713                       else if (TREE_CODE (val) == INTEGER_CST
1714                                && int_fits_type_p (val, type))
1715                         /* Change in signedness doesn't matter
1716                            if a constant value is unaffected.  */
1717                         ;
1718                       /* Likewise for a constant in a NOP_EXPR.  */
1719                       else if (TREE_CODE (val) == NOP_EXPR
1720                                && TREE_CODE (TREE_OPERAND (val, 0)) == INTEGER_CST
1721                                && int_fits_type_p (TREE_OPERAND (val, 0), type))
1722                         ;
1723 #if 0 /* We never get such tree structure here.  */
1724                       else if (TREE_CODE (TREE_TYPE (val)) == ENUMERAL_TYPE
1725                                && int_fits_type_p (TYPE_MIN_VALUE (TREE_TYPE (val)), type)
1726                                && int_fits_type_p (TYPE_MAX_VALUE (TREE_TYPE (val)), type))
1727                         /* Change in signedness doesn't matter
1728                            if an enum value is unaffected.  */
1729                         ;
1730 #endif
1731                       /* If the value is extended from a narrower
1732                          unsigned type, it doesn't matter whether we
1733                          pass it as signed or unsigned; the value
1734                          certainly is the same either way.  */
1735                       else if (TYPE_PRECISION (TREE_TYPE (val)) < TYPE_PRECISION (type)
1736                                && TREE_UNSIGNED (TREE_TYPE (val)))
1737                         ;
1738                       else if (TREE_UNSIGNED (type))
1739                         warn_for_assignment ("%s as unsigned due to prototype", (char *) 0, name, parmnum + 1);
1740                       else
1741                         warn_for_assignment ("%s as signed due to prototype", (char *) 0, name, parmnum + 1);
1742                     }
1743                 }
1744
1745               parmval = convert_for_assignment (type, val, 
1746                                                 (char *) 0, /* arg passing  */
1747                                                 fundecl, name, parmnum + 1);
1748               
1749               if (PROMOTE_PROTOTYPES
1750                   && INTEGRAL_TYPE_P (type)
1751                   && (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)))
1752                 parmval = default_conversion (parmval);
1753             }
1754           result = tree_cons (NULL_TREE, parmval, result);
1755         }
1756       else if (TREE_CODE (TREE_TYPE (val)) == REAL_TYPE
1757                && (TYPE_PRECISION (TREE_TYPE (val))
1758                    < TYPE_PRECISION (double_type_node)))
1759         /* Convert `float' to `double'.  */
1760         result = tree_cons (NULL_TREE, convert (double_type_node, val), result);
1761       else
1762         /* Convert `short' and `char' to full-size `int'.  */
1763         result = tree_cons (NULL_TREE, default_conversion (val), result);
1764
1765       if (typetail)
1766         typetail = TREE_CHAIN (typetail);
1767     }
1768
1769   if (typetail != 0 && TREE_VALUE (typetail) != void_type_node)
1770     {
1771       if (name)
1772         error ("too few arguments to function `%s'",
1773                IDENTIFIER_POINTER (name));
1774       else
1775         error ("too few arguments to function");
1776     }
1777
1778   return nreverse (result);
1779 }
1780 \f
1781 /* This is the entry point used by the parser
1782    for binary operators in the input.
1783    In addition to constructing the expression,
1784    we check for operands that were written with other binary operators
1785    in a way that is likely to confuse the user.  */
1786
1787 tree
1788 parser_build_binary_op (code, arg1, arg2)
1789      enum tree_code code;
1790      tree arg1, arg2;
1791 {
1792   tree result = build_binary_op (code, arg1, arg2, 1);
1793
1794   char class;
1795   char class1 = TREE_CODE_CLASS (TREE_CODE (arg1));
1796   char class2 = TREE_CODE_CLASS (TREE_CODE (arg2));
1797   enum tree_code code1 = ERROR_MARK;
1798   enum tree_code code2 = ERROR_MARK;
1799
1800   if (TREE_CODE (result) == ERROR_MARK)
1801     return error_mark_node;
1802
1803   if (IS_EXPR_CODE_CLASS (class1))
1804     code1 = C_EXP_ORIGINAL_CODE (arg1);
1805   if (IS_EXPR_CODE_CLASS (class2))
1806     code2 = C_EXP_ORIGINAL_CODE (arg2);
1807
1808   /* Check for cases such as x+y<<z which users are likely
1809      to misinterpret.  If parens are used, C_EXP_ORIGINAL_CODE
1810      is cleared to prevent these warnings.  */
1811   if (warn_parentheses)
1812     {
1813       if (code == LSHIFT_EXPR || code == RSHIFT_EXPR)
1814         {
1815           if (code1 == PLUS_EXPR || code1 == MINUS_EXPR
1816               || code2 == PLUS_EXPR || code2 == MINUS_EXPR)
1817             warning ("suggest parentheses around + or - inside shift");
1818         }
1819
1820       if (code == TRUTH_ORIF_EXPR)
1821         {
1822           if (code1 == TRUTH_ANDIF_EXPR
1823               || code2 == TRUTH_ANDIF_EXPR)
1824             warning ("suggest parentheses around && within ||");
1825         }
1826
1827       if (code == BIT_IOR_EXPR)
1828         {
1829           if (code1 == BIT_AND_EXPR || code1 == BIT_XOR_EXPR
1830               || code1 == PLUS_EXPR || code1 == MINUS_EXPR
1831               || code2 == BIT_AND_EXPR || code2 == BIT_XOR_EXPR
1832               || code2 == PLUS_EXPR || code2 == MINUS_EXPR)
1833             warning ("suggest parentheses around arithmetic in operand of |");
1834           /* Check cases like x|y==z */
1835           if (TREE_CODE_CLASS (code1) == '<' || TREE_CODE_CLASS (code2) == '<')
1836             warning ("suggest parentheses around comparison in operand of |");
1837         }
1838
1839       if (code == BIT_XOR_EXPR)
1840         {
1841           if (code1 == BIT_AND_EXPR
1842               || code1 == PLUS_EXPR || code1 == MINUS_EXPR
1843               || code2 == BIT_AND_EXPR
1844               || code2 == PLUS_EXPR || code2 == MINUS_EXPR)
1845             warning ("suggest parentheses around arithmetic in operand of ^");
1846           /* Check cases like x^y==z */
1847           if (TREE_CODE_CLASS (code1) == '<' || TREE_CODE_CLASS (code2) == '<')
1848             warning ("suggest parentheses around comparison in operand of ^");
1849         }
1850
1851       if (code == BIT_AND_EXPR)
1852         {
1853           if (code1 == PLUS_EXPR || code1 == MINUS_EXPR
1854               || code2 == PLUS_EXPR || code2 == MINUS_EXPR)
1855             warning ("suggest parentheses around + or - in operand of &");
1856           /* Check cases like x&y==z */
1857           if (TREE_CODE_CLASS (code1) == '<' || TREE_CODE_CLASS (code2) == '<')
1858             warning ("suggest parentheses around comparison in operand of &");
1859         }
1860     }
1861
1862   /* Similarly, check for cases like 1<=i<=10 that are probably errors.  */
1863   if (TREE_CODE_CLASS (code) == '<' && extra_warnings
1864       && (TREE_CODE_CLASS (code1) == '<' || TREE_CODE_CLASS (code2) == '<'))
1865     warning ("comparisons like X<=Y<=Z do not have their mathematical meaning");
1866
1867   unsigned_conversion_warning (result, arg1);
1868   unsigned_conversion_warning (result, arg2);
1869   overflow_warning (result);
1870
1871   class = TREE_CODE_CLASS (TREE_CODE (result));
1872
1873   /* Record the code that was specified in the source,
1874      for the sake of warnings about confusing nesting.  */
1875   if (IS_EXPR_CODE_CLASS (class))
1876     C_SET_EXP_ORIGINAL_CODE (result, code);
1877   else
1878     {
1879       int flag = TREE_CONSTANT (result);
1880       /* We used to use NOP_EXPR rather than NON_LVALUE_EXPR
1881          so that convert_for_assignment wouldn't strip it.
1882          That way, we got warnings for things like p = (1 - 1).
1883          But it turns out we should not get those warnings.  */
1884       result = build1 (NON_LVALUE_EXPR, TREE_TYPE (result), result);
1885       C_SET_EXP_ORIGINAL_CODE (result, code);
1886       TREE_CONSTANT (result) = flag;
1887     }
1888
1889   return result;
1890 }
1891
1892 /* Build a binary-operation expression without default conversions.
1893    CODE is the kind of expression to build.
1894    This function differs from `build' in several ways:
1895    the data type of the result is computed and recorded in it,
1896    warnings are generated if arg data types are invalid,
1897    special handling for addition and subtraction of pointers is known,
1898    and some optimization is done (operations on narrow ints
1899    are done in the narrower type when that gives the same result).
1900    Constant folding is also done before the result is returned.
1901
1902    Note that the operands will never have enumeral types, or function
1903    or array types, because either they will have the default conversions
1904    performed or they have both just been converted to some other type in which
1905    the arithmetic is to be done.  */
1906
1907 tree
1908 build_binary_op (code, orig_op0, orig_op1, convert_p)
1909      enum tree_code code;
1910      tree orig_op0, orig_op1;
1911      int convert_p;
1912 {
1913   tree type0, type1;
1914   enum tree_code code0, code1;
1915   tree op0, op1;
1916
1917   /* Expression code to give to the expression when it is built.
1918      Normally this is CODE, which is what the caller asked for,
1919      but in some special cases we change it.  */
1920   enum tree_code resultcode = code;
1921
1922   /* Data type in which the computation is to be performed.
1923      In the simplest cases this is the common type of the arguments.  */
1924   tree result_type = NULL;
1925
1926   /* Nonzero means operands have already been type-converted
1927      in whatever way is necessary.
1928      Zero means they need to be converted to RESULT_TYPE.  */
1929   int converted = 0;
1930
1931   /* Nonzero means create the expression with this type, rather than
1932      RESULT_TYPE.  */
1933   tree build_type = 0;
1934
1935   /* Nonzero means after finally constructing the expression
1936      convert it to this type.  */
1937   tree final_type = 0;
1938
1939   /* Nonzero if this is an operation like MIN or MAX which can
1940      safely be computed in short if both args are promoted shorts.
1941      Also implies COMMON.
1942      -1 indicates a bitwise operation; this makes a difference
1943      in the exact conditions for when it is safe to do the operation
1944      in a narrower mode.  */
1945   int shorten = 0;
1946
1947   /* Nonzero if this is a comparison operation;
1948      if both args are promoted shorts, compare the original shorts.
1949      Also implies COMMON.  */
1950   int short_compare = 0;
1951
1952   /* Nonzero if this is a right-shift operation, which can be computed on the
1953      original short and then promoted if the operand is a promoted short.  */
1954   int short_shift = 0;
1955
1956   /* Nonzero means set RESULT_TYPE to the common type of the args.  */
1957   int common = 0;
1958
1959   if (convert_p)
1960     {
1961       op0 = default_conversion (orig_op0);
1962       op1 = default_conversion (orig_op1);
1963     }
1964   else
1965     {
1966       op0 = orig_op0;
1967       op1 = orig_op1;
1968     }
1969
1970   type0 = TREE_TYPE (op0);
1971   type1 = TREE_TYPE (op1);
1972
1973   /* The expression codes of the data types of the arguments tell us
1974      whether the arguments are integers, floating, pointers, etc.  */
1975   code0 = TREE_CODE (type0);
1976   code1 = TREE_CODE (type1);
1977
1978   /* Strip NON_LVALUE_EXPRs, etc., since we aren't using as an lvalue.  */
1979   STRIP_TYPE_NOPS (op0);
1980   STRIP_TYPE_NOPS (op1);
1981
1982   /* If an error was already reported for one of the arguments,
1983      avoid reporting another error.  */
1984
1985   if (code0 == ERROR_MARK || code1 == ERROR_MARK)
1986     return error_mark_node;
1987
1988   switch (code)
1989     {
1990     case PLUS_EXPR:
1991       /* Handle the pointer + int case.  */
1992       if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
1993         return pointer_int_sum (PLUS_EXPR, op0, op1);
1994       else if (code1 == POINTER_TYPE && code0 == INTEGER_TYPE)
1995         return pointer_int_sum (PLUS_EXPR, op1, op0);
1996       else
1997         common = 1;
1998       break;
1999
2000     case MINUS_EXPR:
2001       /* Subtraction of two similar pointers.
2002          We must subtract them as integers, then divide by object size.  */
2003       if (code0 == POINTER_TYPE && code1 == POINTER_TYPE
2004           && comp_target_types (type0, type1))
2005         return pointer_diff (op0, op1);
2006       /* Handle pointer minus int.  Just like pointer plus int.  */
2007       else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
2008         return pointer_int_sum (MINUS_EXPR, op0, op1);
2009       else
2010         common = 1;
2011       break;
2012
2013     case MULT_EXPR:
2014       common = 1;
2015       break;
2016
2017     case TRUNC_DIV_EXPR:
2018     case CEIL_DIV_EXPR:
2019     case FLOOR_DIV_EXPR:
2020     case ROUND_DIV_EXPR:
2021     case EXACT_DIV_EXPR:
2022       /* Floating point division by zero is a legitimate way to obtain
2023          infinities and NaNs.  */
2024       if (warn_div_by_zero && skip_evaluation == 0 && integer_zerop (op1))
2025         warning ("division by zero");
2026
2027       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
2028            || code0 == COMPLEX_TYPE)
2029           && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
2030               || code1 == COMPLEX_TYPE))
2031         {
2032           if (!(code0 == INTEGER_TYPE && code1 == INTEGER_TYPE))
2033             resultcode = RDIV_EXPR;
2034           else
2035             /* Although it would be tempting to shorten always here, that
2036                loses on some targets, since the modulo instruction is
2037                undefined if the quotient can't be represented in the
2038                computation mode.  We shorten only if unsigned or if
2039                dividing by something we know != -1.  */
2040             shorten = (TREE_UNSIGNED (TREE_TYPE (orig_op0))
2041                        || (TREE_CODE (op1) == INTEGER_CST
2042                            && ! integer_all_onesp (op1)));
2043           common = 1;
2044         }
2045       break;
2046
2047     case BIT_AND_EXPR:
2048     case BIT_ANDTC_EXPR:
2049     case BIT_IOR_EXPR:
2050     case BIT_XOR_EXPR:
2051       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
2052         shorten = -1;
2053       break;
2054
2055     case TRUNC_MOD_EXPR:
2056     case FLOOR_MOD_EXPR:
2057       if (warn_div_by_zero && skip_evaluation == 0 && integer_zerop (op1))
2058         warning ("division by zero");
2059
2060       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
2061         {
2062           /* Although it would be tempting to shorten always here, that loses
2063              on some targets, since the modulo instruction is undefined if the
2064              quotient can't be represented in the computation mode.  We shorten
2065              only if unsigned or if dividing by something we know != -1.  */
2066           shorten = (TREE_UNSIGNED (TREE_TYPE (orig_op0))
2067                      || (TREE_CODE (op1) == INTEGER_CST
2068                          && ! integer_all_onesp (op1)));
2069           common = 1;
2070         }
2071       break;
2072
2073     case TRUTH_ANDIF_EXPR:
2074     case TRUTH_ORIF_EXPR:
2075     case TRUTH_AND_EXPR:
2076     case TRUTH_OR_EXPR:
2077     case TRUTH_XOR_EXPR:
2078       if ((code0 == INTEGER_TYPE || code0 == POINTER_TYPE
2079            || code0 == REAL_TYPE || code0 == COMPLEX_TYPE)
2080           && (code1 == INTEGER_TYPE || code1 == POINTER_TYPE
2081               || code1 == REAL_TYPE || code1 == COMPLEX_TYPE))
2082         {
2083           /* Result of these operations is always an int,
2084              but that does not mean the operands should be
2085              converted to ints!  */
2086           result_type = integer_type_node;
2087           op0 = truthvalue_conversion (op0);
2088           op1 = truthvalue_conversion (op1);
2089           converted = 1;
2090         }
2091       break;
2092
2093       /* Shift operations: result has same type as first operand;
2094          always convert second operand to int.
2095          Also set SHORT_SHIFT if shifting rightward.  */
2096
2097     case RSHIFT_EXPR:
2098       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
2099         {
2100           if (TREE_CODE (op1) == INTEGER_CST && skip_evaluation == 0)
2101             {
2102               if (tree_int_cst_sgn (op1) < 0)
2103                 warning ("right shift count is negative");
2104               else
2105                 {
2106                   if (! integer_zerop (op1))
2107                     short_shift = 1;
2108
2109                   if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0)
2110                     warning ("right shift count >= width of type");
2111                 }
2112             }
2113
2114           /* Use the type of the value to be shifted.  */
2115           result_type = type0;
2116           /* Convert the shift-count to an integer, regardless of size
2117              of value being shifted.  */
2118           if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
2119             op1 = convert (integer_type_node, op1);
2120           /* Avoid converting op1 to result_type later.  */
2121           converted = 1;
2122         }
2123       break;
2124
2125     case LSHIFT_EXPR:
2126       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
2127         {
2128           if (TREE_CODE (op1) == INTEGER_CST && skip_evaluation == 0)
2129             {
2130               if (tree_int_cst_sgn (op1) < 0)
2131                 warning ("left shift count is negative");
2132
2133               else if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0)
2134                 warning ("left shift count >= width of type");
2135             }
2136
2137           /* Use the type of the value to be shifted.  */
2138           result_type = type0;
2139           /* Convert the shift-count to an integer, regardless of size
2140              of value being shifted.  */
2141           if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
2142             op1 = convert (integer_type_node, op1);
2143           /* Avoid converting op1 to result_type later.  */
2144           converted = 1;
2145         }
2146       break;
2147
2148     case RROTATE_EXPR:
2149     case LROTATE_EXPR:
2150       if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
2151         {
2152           if (TREE_CODE (op1) == INTEGER_CST && skip_evaluation == 0)
2153             {
2154               if (tree_int_cst_sgn (op1) < 0)
2155                 warning ("shift count is negative");
2156               else if (compare_tree_int (op1, TYPE_PRECISION (type0)) >= 0)
2157                 warning ("shift count >= width of type");
2158             }
2159
2160           /* Use the type of the value to be shifted.  */
2161           result_type = type0;
2162           /* Convert the shift-count to an integer, regardless of size
2163              of value being shifted.  */
2164           if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
2165             op1 = convert (integer_type_node, op1);
2166           /* Avoid converting op1 to result_type later.  */
2167           converted = 1;
2168         }
2169       break;
2170
2171     case EQ_EXPR:
2172     case NE_EXPR:
2173       if (warn_float_equal && (code0 == REAL_TYPE || code1 == REAL_TYPE))
2174         warning ("comparing floating point with == or != is unsafe");
2175       /* Result of comparison is always int,
2176          but don't convert the args to int!  */
2177       build_type = integer_type_node;
2178       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
2179            || code0 == COMPLEX_TYPE)
2180           && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
2181               || code1 == COMPLEX_TYPE))
2182         short_compare = 1;
2183       else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
2184         {
2185           tree tt0 = TREE_TYPE (type0);
2186           tree tt1 = TREE_TYPE (type1);
2187           /* Anything compares with void *.  void * compares with anything.
2188              Otherwise, the targets must be compatible
2189              and both must be object or both incomplete.  */
2190           if (comp_target_types (type0, type1))
2191             result_type = common_type (type0, type1);
2192           else if (VOID_TYPE_P (tt0))
2193             {
2194               /* op0 != orig_op0 detects the case of something
2195                  whose value is 0 but which isn't a valid null ptr const.  */
2196               if (pedantic && (!integer_zerop (op0) || op0 != orig_op0)
2197                   && TREE_CODE (tt1) == FUNCTION_TYPE)
2198                 pedwarn ("ISO C forbids comparison of `void *' with function pointer");
2199             }
2200           else if (VOID_TYPE_P (tt1))
2201             {
2202               if (pedantic && (!integer_zerop (op1) || op1 != orig_op1)
2203                   && TREE_CODE (tt0) == FUNCTION_TYPE)
2204                 pedwarn ("ISO C forbids comparison of `void *' with function pointer");
2205             }
2206           else
2207             pedwarn ("comparison of distinct pointer types lacks a cast");
2208
2209           if (result_type == NULL_TREE)
2210             result_type = ptr_type_node;
2211         }
2212       else if (code0 == POINTER_TYPE && TREE_CODE (op1) == INTEGER_CST
2213                && integer_zerop (op1))
2214         result_type = type0;
2215       else if (code1 == POINTER_TYPE && TREE_CODE (op0) == INTEGER_CST
2216                && integer_zerop (op0))
2217         result_type = type1;
2218       else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
2219         {
2220           result_type = type0;
2221           pedwarn ("comparison between pointer and integer");
2222         }
2223       else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE)
2224         {
2225           result_type = type1;
2226           pedwarn ("comparison between pointer and integer");
2227         }
2228       break;
2229
2230     case MAX_EXPR:
2231     case MIN_EXPR:
2232       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
2233           && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
2234         shorten = 1;
2235       else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
2236         {
2237           if (comp_target_types (type0, type1))
2238             {
2239               result_type = common_type (type0, type1);
2240               if (pedantic 
2241                   && TREE_CODE (TREE_TYPE (type0)) == FUNCTION_TYPE)
2242                 pedwarn ("ISO C forbids ordered comparisons of pointers to functions");
2243             }
2244           else
2245             {
2246               result_type = ptr_type_node;
2247               pedwarn ("comparison of distinct pointer types lacks a cast");
2248             }
2249         }
2250       break;
2251
2252     case LE_EXPR:
2253     case GE_EXPR:
2254     case LT_EXPR:
2255     case GT_EXPR:
2256       build_type = integer_type_node;
2257       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE)
2258           && (code1 == INTEGER_TYPE || code1 == REAL_TYPE))
2259         short_compare = 1;
2260       else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
2261         {
2262           if (comp_target_types (type0, type1))
2263             {
2264               result_type = common_type (type0, type1);
2265               if (!COMPLETE_TYPE_P (TREE_TYPE (type0))
2266                   != !COMPLETE_TYPE_P (TREE_TYPE (type1)))
2267                 pedwarn ("comparison of complete and incomplete pointers");
2268               else if (pedantic 
2269                        && TREE_CODE (TREE_TYPE (type0)) == FUNCTION_TYPE)
2270                 pedwarn ("ISO C forbids ordered comparisons of pointers to functions");
2271             }
2272           else
2273             {
2274               result_type = ptr_type_node;
2275               pedwarn ("comparison of distinct pointer types lacks a cast");
2276             }
2277         }
2278       else if (code0 == POINTER_TYPE && TREE_CODE (op1) == INTEGER_CST
2279                && integer_zerop (op1))
2280         {
2281           result_type = type0;
2282           if (pedantic || extra_warnings)
2283             pedwarn ("ordered comparison of pointer with integer zero");
2284         }
2285       else if (code1 == POINTER_TYPE && TREE_CODE (op0) == INTEGER_CST
2286                && integer_zerop (op0))
2287         {
2288           result_type = type1;
2289           if (pedantic)
2290             pedwarn ("ordered comparison of pointer with integer zero");
2291         }
2292       else if (code0 == POINTER_TYPE && code1 == INTEGER_TYPE)
2293         {
2294           result_type = type0;
2295           pedwarn ("comparison between pointer and integer");
2296         }
2297       else if (code0 == INTEGER_TYPE && code1 == POINTER_TYPE)
2298         {
2299           result_type = type1;
2300           pedwarn ("comparison between pointer and integer");
2301         }
2302       break;
2303
2304     case UNORDERED_EXPR:
2305     case ORDERED_EXPR:
2306     case UNLT_EXPR:
2307     case UNLE_EXPR:
2308     case UNGT_EXPR:
2309     case UNGE_EXPR:
2310     case UNEQ_EXPR:
2311       build_type = integer_type_node;
2312       if (code0 != REAL_TYPE || code1 != REAL_TYPE)
2313         {
2314           error ("unordered comparison on non-floating point argument");
2315           return error_mark_node;
2316         }
2317       common = 1;
2318       break;
2319
2320     default:
2321       break;
2322     }
2323
2324   if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE || code0 == COMPLEX_TYPE)
2325       &&
2326       (code1 == INTEGER_TYPE || code1 == REAL_TYPE || code1 == COMPLEX_TYPE))
2327     {
2328       int none_complex = (code0 != COMPLEX_TYPE && code1 != COMPLEX_TYPE);
2329
2330       if (shorten || common || short_compare)
2331         result_type = common_type (type0, type1);
2332
2333       /* For certain operations (which identify themselves by shorten != 0)
2334          if both args were extended from the same smaller type,
2335          do the arithmetic in that type and then extend.
2336
2337          shorten !=0 and !=1 indicates a bitwise operation.
2338          For them, this optimization is safe only if
2339          both args are zero-extended or both are sign-extended.
2340          Otherwise, we might change the result.
2341          Eg, (short)-1 | (unsigned short)-1 is (int)-1
2342          but calculated in (unsigned short) it would be (unsigned short)-1.  */
2343
2344       if (shorten && none_complex)
2345         {
2346           int unsigned0, unsigned1;
2347           tree arg0 = get_narrower (op0, &unsigned0);
2348           tree arg1 = get_narrower (op1, &unsigned1);
2349           /* UNS is 1 if the operation to be done is an unsigned one.  */
2350           int uns = TREE_UNSIGNED (result_type);
2351           tree type;
2352
2353           final_type = result_type;
2354
2355           /* Handle the case that OP0 (or OP1) does not *contain* a conversion
2356              but it *requires* conversion to FINAL_TYPE.  */
2357
2358           if ((TYPE_PRECISION (TREE_TYPE (op0))
2359                == TYPE_PRECISION (TREE_TYPE (arg0)))
2360               && TREE_TYPE (op0) != final_type)
2361             unsigned0 = TREE_UNSIGNED (TREE_TYPE (op0));
2362           if ((TYPE_PRECISION (TREE_TYPE (op1))
2363                == TYPE_PRECISION (TREE_TYPE (arg1)))
2364               && TREE_TYPE (op1) != final_type)
2365             unsigned1 = TREE_UNSIGNED (TREE_TYPE (op1));
2366
2367           /* Now UNSIGNED0 is 1 if ARG0 zero-extends to FINAL_TYPE.  */
2368
2369           /* For bitwise operations, signedness of nominal type
2370              does not matter.  Consider only how operands were extended.  */
2371           if (shorten == -1)
2372             uns = unsigned0;
2373
2374           /* Note that in all three cases below we refrain from optimizing
2375              an unsigned operation on sign-extended args.
2376              That would not be valid.  */
2377
2378           /* Both args variable: if both extended in same way
2379              from same width, do it in that width.
2380              Do it unsigned if args were zero-extended.  */
2381           if ((TYPE_PRECISION (TREE_TYPE (arg0))
2382                < TYPE_PRECISION (result_type))
2383               && (TYPE_PRECISION (TREE_TYPE (arg1))
2384                   == TYPE_PRECISION (TREE_TYPE (arg0)))
2385               && unsigned0 == unsigned1
2386               && (unsigned0 || !uns))
2387             result_type
2388               = signed_or_unsigned_type (unsigned0,
2389                                          common_type (TREE_TYPE (arg0), TREE_TYPE (arg1)));
2390           else if (TREE_CODE (arg0) == INTEGER_CST
2391                    && (unsigned1 || !uns)
2392                    && (TYPE_PRECISION (TREE_TYPE (arg1))
2393                        < TYPE_PRECISION (result_type))
2394                    && (type = signed_or_unsigned_type (unsigned1,
2395                                                        TREE_TYPE (arg1)),
2396                        int_fits_type_p (arg0, type)))
2397             result_type = type;
2398           else if (TREE_CODE (arg1) == INTEGER_CST
2399                    && (unsigned0 || !uns)
2400                    && (TYPE_PRECISION (TREE_TYPE (arg0))
2401                        < TYPE_PRECISION (result_type))
2402                    && (type = signed_or_unsigned_type (unsigned0,
2403                                                        TREE_TYPE (arg0)),
2404                        int_fits_type_p (arg1, type)))
2405             result_type = type;
2406         }
2407
2408       /* Shifts can be shortened if shifting right.  */
2409
2410       if (short_shift)
2411         {
2412           int unsigned_arg;
2413           tree arg0 = get_narrower (op0, &unsigned_arg);
2414
2415           final_type = result_type;
2416
2417           if (arg0 == op0 && final_type == TREE_TYPE (op0))
2418             unsigned_arg = TREE_UNSIGNED (TREE_TYPE (op0));
2419
2420           if (TYPE_PRECISION (TREE_TYPE (arg0)) < TYPE_PRECISION (result_type)
2421               /* We can shorten only if the shift count is less than the
2422                  number of bits in the smaller type size.  */
2423               && compare_tree_int (op1, TYPE_PRECISION (TREE_TYPE (arg0))) < 0
2424               /* We cannot drop an unsigned shift after sign-extension.  */
2425               && (!TREE_UNSIGNED (final_type) || unsigned_arg))
2426             {
2427               /* Do an unsigned shift if the operand was zero-extended.  */
2428               result_type
2429                 = signed_or_unsigned_type (unsigned_arg, TREE_TYPE (arg0));
2430               /* Convert value-to-be-shifted to that type.  */
2431               if (TREE_TYPE (op0) != result_type)
2432                 op0 = convert (result_type, op0);
2433               converted = 1;
2434             }
2435         }
2436
2437       /* Comparison operations are shortened too but differently.
2438          They identify themselves by setting short_compare = 1.  */
2439
2440       if (short_compare)
2441         {
2442           /* Don't write &op0, etc., because that would prevent op0
2443              from being kept in a register.
2444              Instead, make copies of the our local variables and
2445              pass the copies by reference, then copy them back afterward.  */
2446           tree xop0 = op0, xop1 = op1, xresult_type = result_type;
2447           enum tree_code xresultcode = resultcode;
2448           tree val 
2449             = shorten_compare (&xop0, &xop1, &xresult_type, &xresultcode);
2450
2451           if (val != 0)
2452             return val;
2453
2454           op0 = xop0, op1 = xop1;
2455           converted = 1;
2456           resultcode = xresultcode;
2457
2458           if ((warn_sign_compare < 0 ? extra_warnings : warn_sign_compare != 0)
2459               && skip_evaluation == 0)
2460             {
2461               int op0_signed = ! TREE_UNSIGNED (TREE_TYPE (orig_op0));
2462               int op1_signed = ! TREE_UNSIGNED (TREE_TYPE (orig_op1));
2463               int unsignedp0, unsignedp1;
2464               tree primop0 = get_narrower (op0, &unsignedp0);
2465               tree primop1 = get_narrower (op1, &unsignedp1);
2466
2467               xop0 = orig_op0;
2468               xop1 = orig_op1;
2469               STRIP_TYPE_NOPS (xop0);
2470               STRIP_TYPE_NOPS (xop1);
2471
2472               /* Give warnings for comparisons between signed and unsigned
2473                  quantities that may fail. 
2474
2475                  Do the checking based on the original operand trees, so that
2476                  casts will be considered, but default promotions won't be.
2477
2478                  Do not warn if the comparison is being done in a signed type,
2479                  since the signed type will only be chosen if it can represent
2480                  all the values of the unsigned type.  */
2481               if (! TREE_UNSIGNED (result_type))
2482                 /* OK */;
2483               /* Do not warn if both operands are the same signedness.  */
2484               else if (op0_signed == op1_signed)
2485                 /* OK */;
2486               else
2487                 {
2488                   tree sop, uop;
2489
2490                   if (op0_signed)
2491                     sop = xop0, uop = xop1;
2492                   else
2493                     sop = xop1, uop = xop0;
2494
2495                   /* Do not warn if the signed quantity is an
2496                      unsuffixed integer literal (or some static
2497                      constant expression involving such literals or a
2498                      conditional expression involving such literals)
2499                      and it is non-negative.  */
2500                   if (tree_expr_nonnegative_p (sop))
2501                     /* OK */;
2502                   /* Do not warn if the comparison is an equality operation,
2503                      the unsigned quantity is an integral constant, and it
2504                      would fit in the result if the result were signed.  */
2505                   else if (TREE_CODE (uop) == INTEGER_CST
2506                            && (resultcode == EQ_EXPR || resultcode == NE_EXPR)
2507                            && int_fits_type_p (uop, signed_type (result_type)))
2508                     /* OK */;
2509                   /* Do not warn if the unsigned quantity is an enumeration
2510                      constant and its maximum value would fit in the result
2511                      if the result were signed.  */
2512                   else if (TREE_CODE (uop) == INTEGER_CST
2513                            && TREE_CODE (TREE_TYPE (uop)) == ENUMERAL_TYPE
2514                            && int_fits_type_p (TYPE_MAX_VALUE (TREE_TYPE(uop)),
2515                                                signed_type (result_type)))
2516                     /* OK */;
2517                   else
2518                     warning ("comparison between signed and unsigned");
2519                 }
2520
2521               /* Warn if two unsigned values are being compared in a size
2522                  larger than their original size, and one (and only one) is the
2523                  result of a `~' operator.  This comparison will always fail.
2524
2525                  Also warn if one operand is a constant, and the constant
2526                  does not have all bits set that are set in the ~ operand
2527                  when it is extended.  */
2528
2529               if ((TREE_CODE (primop0) == BIT_NOT_EXPR)
2530                   != (TREE_CODE (primop1) == BIT_NOT_EXPR))
2531                 {
2532                   if (TREE_CODE (primop0) == BIT_NOT_EXPR)
2533                     primop0 = get_narrower (TREE_OPERAND (primop0, 0),
2534                                             &unsignedp0);
2535                   else
2536                     primop1 = get_narrower (TREE_OPERAND (primop1, 0),
2537                                             &unsignedp1);
2538               
2539                   if (host_integerp (primop0, 0) || host_integerp (primop1, 0))
2540                     {
2541                       tree primop;
2542                       HOST_WIDE_INT constant, mask;
2543                       int unsignedp, bits;
2544
2545                       if (host_integerp (primop0, 0))
2546                         {
2547                           primop = primop1;
2548                           unsignedp = unsignedp1;
2549                           constant = tree_low_cst (primop0, 0);
2550                         }
2551                       else
2552                         {
2553                           primop = primop0;
2554                           unsignedp = unsignedp0;
2555                           constant = tree_low_cst (primop1, 0);
2556                         }
2557
2558                       bits = TYPE_PRECISION (TREE_TYPE (primop));
2559                       if (bits < TYPE_PRECISION (result_type)
2560                           && bits < HOST_BITS_PER_WIDE_INT && unsignedp)
2561                         {
2562                           mask = (~ (HOST_WIDE_INT) 0) << bits;
2563                           if ((mask & constant) != mask)
2564                             warning ("comparison of promoted ~unsigned with constant");
2565                         }
2566                     }
2567                   else if (unsignedp0 && unsignedp1
2568                            && (TYPE_PRECISION (TREE_TYPE (primop0))
2569                                < TYPE_PRECISION (result_type))
2570                            && (TYPE_PRECISION (TREE_TYPE (primop1))
2571                                < TYPE_PRECISION (result_type)))
2572                     warning ("comparison of promoted ~unsigned with unsigned");
2573                 }
2574             }
2575         }
2576     }
2577
2578   /* At this point, RESULT_TYPE must be nonzero to avoid an error message.
2579      If CONVERTED is zero, both args will be converted to type RESULT_TYPE.
2580      Then the expression will be built.
2581      It will be given type FINAL_TYPE if that is nonzero;
2582      otherwise, it will be given type RESULT_TYPE.  */
2583
2584   if (!result_type)
2585     {
2586       binary_op_error (code);
2587       return error_mark_node;
2588     }
2589
2590   if (! converted)
2591     {
2592       if (TREE_TYPE (op0) != result_type)
2593         op0 = convert (result_type, op0); 
2594       if (TREE_TYPE (op1) != result_type)
2595         op1 = convert (result_type, op1); 
2596     }
2597
2598   if (build_type == NULL_TREE)
2599     build_type = result_type;
2600
2601   {
2602     tree result = build (resultcode, build_type, op0, op1);
2603     tree folded;
2604
2605     folded = fold (result);
2606     if (folded == result)
2607       TREE_CONSTANT (folded) = TREE_CONSTANT (op0) & TREE_CONSTANT (op1);
2608     if (final_type != 0)
2609       return convert (final_type, folded);
2610     return folded;
2611   }
2612 }
2613 \f
2614 /* Return a tree for the difference of pointers OP0 and OP1.
2615    The resulting tree has type int.  */
2616
2617 static tree
2618 pointer_diff (op0, op1)
2619      tree op0, op1;
2620 {
2621   tree result, folded;
2622   tree restype = ptrdiff_type_node;
2623
2624   tree target_type = TREE_TYPE (TREE_TYPE (op0));
2625   tree con0, con1, lit0, lit1;
2626   tree orig_op1 = op1;
2627
2628   if (pedantic || warn_pointer_arith)
2629     {
2630       if (TREE_CODE (target_type) == VOID_TYPE)
2631         pedwarn ("pointer of type `void *' used in subtraction");
2632       if (TREE_CODE (target_type) == FUNCTION_TYPE)
2633         pedwarn ("pointer to a function used in subtraction");
2634     }
2635
2636   /* If the conversion to ptrdiff_type does anything like widening or
2637      converting a partial to an integral mode, we get a convert_expression
2638      that is in the way to do any simplifications.
2639      (fold-const.c doesn't know that the extra bits won't be needed.
2640      split_tree uses STRIP_SIGN_NOPS, which leaves conversions to a
2641      different mode in place.)
2642      So first try to find a common term here 'by hand'; we want to cover
2643      at least the cases that occur in legal static initializers.  */
2644   con0 = TREE_CODE (op0) == NOP_EXPR ? TREE_OPERAND (op0, 0) : op0;
2645   con1 = TREE_CODE (op1) == NOP_EXPR ? TREE_OPERAND (op1, 0) : op1;
2646
2647   if (TREE_CODE (con0) == PLUS_EXPR)
2648     {
2649       lit0 = TREE_OPERAND (con0, 1);
2650       con0 = TREE_OPERAND (con0, 0);
2651     }
2652   else
2653     lit0 = integer_zero_node;
2654
2655   if (TREE_CODE (con1) == PLUS_EXPR)
2656     {
2657       lit1 = TREE_OPERAND (con1, 1);
2658       con1 = TREE_OPERAND (con1, 0);
2659     }
2660   else
2661     lit1 = integer_zero_node;
2662
2663   if (operand_equal_p (con0, con1, 0))
2664     {
2665       op0 = lit0;
2666       op1 = lit1;
2667     }
2668
2669
2670   /* First do the subtraction as integers;
2671      then drop through to build the divide operator.
2672      Do not do default conversions on the minus operator
2673      in case restype is a short type.  */
2674
2675   op0 = build_binary_op (MINUS_EXPR, convert (restype, op0),
2676                          convert (restype, op1), 0);
2677   /* This generates an error if op1 is pointer to incomplete type.  */
2678   if (!COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (TREE_TYPE (orig_op1))))
2679     error ("arithmetic on pointer to an incomplete type");
2680
2681   /* This generates an error if op0 is pointer to incomplete type.  */
2682   op1 = c_size_in_bytes (target_type);
2683
2684   /* Divide by the size, in easiest possible way.  */
2685
2686   result = build (EXACT_DIV_EXPR, restype, op0, convert (restype, op1));
2687
2688   folded = fold (result);
2689   if (folded == result)
2690     TREE_CONSTANT (folded) = TREE_CONSTANT (op0) & TREE_CONSTANT (op1);
2691   return folded;
2692 }
2693 \f
2694 /* Construct and perhaps optimize a tree representation
2695    for a unary operation.  CODE, a tree_code, specifies the operation
2696    and XARG is the operand.
2697    For any CODE other than ADDR_EXPR, FLAG nonzero suppresses
2698    the default promotions (such as from short to int).
2699    For ADDR_EXPR, the default promotions are not applied; FLAG nonzero
2700    allows non-lvalues; this is only used to handle conversion of non-lvalue
2701    arrays to pointers in C99.  */
2702
2703 tree
2704 build_unary_op (code, xarg, flag)
2705      enum tree_code code;
2706      tree xarg;
2707      int flag;
2708 {
2709   /* No default_conversion here.  It causes trouble for ADDR_EXPR.  */
2710   tree arg = xarg;
2711   tree argtype = 0;
2712   enum tree_code typecode = TREE_CODE (TREE_TYPE (arg));
2713   tree val;
2714   int noconvert = flag;
2715
2716   if (typecode == ERROR_MARK)
2717     return error_mark_node;
2718   if (typecode == ENUMERAL_TYPE || typecode == BOOLEAN_TYPE)
2719     typecode = INTEGER_TYPE;
2720
2721   switch (code)
2722     {
2723     case CONVERT_EXPR:
2724       /* This is used for unary plus, because a CONVERT_EXPR
2725          is enough to prevent anybody from looking inside for
2726          associativity, but won't generate any code.  */
2727       if (!(typecode == INTEGER_TYPE || typecode == REAL_TYPE
2728             || typecode == COMPLEX_TYPE))
2729         {
2730           error ("wrong type argument to unary plus");
2731           return error_mark_node;
2732         }
2733       else if (!noconvert)
2734         arg = default_conversion (arg);
2735       break;
2736
2737     case NEGATE_EXPR:
2738       if (!(typecode == INTEGER_TYPE || typecode == REAL_TYPE
2739             || typecode == COMPLEX_TYPE))
2740         {
2741           error ("wrong type argument to unary minus");
2742           return error_mark_node;
2743         }
2744       else if (!noconvert)
2745         arg = default_conversion (arg);
2746       break;
2747
2748     case BIT_NOT_EXPR:
2749       if (typecode == COMPLEX_TYPE)
2750         {
2751           code = CONJ_EXPR;
2752           if (pedantic)
2753             pedwarn ("ISO C does not support `~' for complex conjugation");
2754           if (!noconvert)
2755             arg = default_conversion (arg);
2756         }
2757       else if (typecode != INTEGER_TYPE)
2758         {
2759           error ("wrong type argument to bit-complement");
2760           return error_mark_node;
2761         }
2762       else if (!noconvert)
2763         arg = default_conversion (arg);
2764       break;
2765
2766     case ABS_EXPR:
2767       if (!(typecode == INTEGER_TYPE || typecode == REAL_TYPE
2768             || typecode == COMPLEX_TYPE))
2769         {
2770           error ("wrong type argument to abs");
2771           return error_mark_node;
2772         }
2773       else if (!noconvert)
2774         arg = default_conversion (arg);
2775       break;
2776
2777     case CONJ_EXPR:
2778       /* Conjugating a real value is a no-op, but allow it anyway.  */
2779       if (!(typecode == INTEGER_TYPE || typecode == REAL_TYPE
2780             || typecode == COMPLEX_TYPE))
2781         {
2782           error ("wrong type argument to conjugation");
2783           return error_mark_node;
2784         }
2785       else if (!noconvert)
2786         arg = default_conversion (arg);
2787       break;
2788
2789     case TRUTH_NOT_EXPR:
2790       if (typecode != INTEGER_TYPE
2791           && typecode != REAL_TYPE && typecode != POINTER_TYPE
2792           && typecode != COMPLEX_TYPE
2793           /* These will convert to a pointer.  */
2794           && typecode != ARRAY_TYPE && typecode != FUNCTION_TYPE)
2795         {
2796           error ("wrong type argument to unary exclamation mark");
2797           return error_mark_node;
2798         }
2799       arg = truthvalue_conversion (arg);
2800       return invert_truthvalue (arg);
2801
2802     case NOP_EXPR:
2803       break;
2804
2805     case REALPART_EXPR:
2806       if (TREE_CODE (arg) == COMPLEX_CST)
2807         return TREE_REALPART (arg);
2808       else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
2809         return fold (build1 (REALPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg));
2810       else
2811         return arg;
2812
2813     case IMAGPART_EXPR:
2814       if (TREE_CODE (arg) == COMPLEX_CST)
2815         return TREE_IMAGPART (arg);
2816       else if (TREE_CODE (TREE_TYPE (arg)) == COMPLEX_TYPE)
2817         return fold (build1 (IMAGPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg));
2818       else
2819         return convert (TREE_TYPE (arg), integer_zero_node);
2820       
2821     case PREINCREMENT_EXPR:
2822     case POSTINCREMENT_EXPR:
2823     case PREDECREMENT_EXPR:
2824     case POSTDECREMENT_EXPR:
2825       /* Handle complex lvalues (when permitted)
2826          by reduction to simpler cases.  */
2827
2828       val = unary_complex_lvalue (code, arg, 0);
2829       if (val != 0)
2830         return val;
2831
2832       /* Increment or decrement the real part of the value,
2833          and don't change the imaginary part.  */
2834       if (typecode == COMPLEX_TYPE)
2835         {
2836           tree real, imag;
2837
2838           if (pedantic)
2839             pedwarn ("ISO C does not support `++' and `--' on complex types");
2840
2841           arg = stabilize_reference (arg);
2842           real = build_unary_op (REALPART_EXPR, arg, 1);
2843           imag = build_unary_op (IMAGPART_EXPR, arg, 1);
2844           return build (COMPLEX_EXPR, TREE_TYPE (arg),
2845                         build_unary_op (code, real, 1), imag);
2846         }
2847
2848       /* Report invalid types.  */
2849
2850       if (typecode != POINTER_TYPE
2851           && typecode != INTEGER_TYPE && typecode != REAL_TYPE)
2852         {
2853           if (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
2854             error ("wrong type argument to increment");
2855           else
2856             error ("wrong type argument to decrement");
2857
2858           return error_mark_node;
2859         }
2860
2861       {
2862         tree inc;
2863         tree result_type = TREE_TYPE (arg);
2864
2865         arg = get_unwidened (arg, 0);
2866         argtype = TREE_TYPE (arg);
2867
2868         /* Compute the increment.  */
2869
2870         if (typecode == POINTER_TYPE)
2871           {
2872             /* If pointer target is an undefined struct,
2873                we just cannot know how to do the arithmetic.  */
2874             if (!COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (result_type)))
2875               {
2876                 if (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
2877                   error ("increment of pointer to unknown structure");
2878                 else
2879                   error ("decrement of pointer to unknown structure");
2880               }
2881             else if ((pedantic || warn_pointer_arith)
2882                      && (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE
2883                          || TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE))
2884               {
2885                 if (code == PREINCREMENT_EXPR || code == POSTINCREMENT_EXPR)
2886                   pedwarn ("wrong type argument to increment");
2887                 else
2888                   pedwarn ("wrong type argument to decrement");
2889               }
2890
2891             inc = c_size_in_bytes (TREE_TYPE (result_type));
2892           }
2893         else
2894           inc = integer_one_node;
2895
2896         inc = convert (argtype, inc);
2897
2898         /* Handle incrementing a cast-expression.  */
2899
2900         while (1)
2901           switch (TREE_CODE (arg))
2902             {
2903             case NOP_EXPR:
2904             case CONVERT_EXPR:
2905             case FLOAT_EXPR:
2906             case FIX_TRUNC_EXPR:
2907             case FIX_FLOOR_EXPR:
2908             case FIX_ROUND_EXPR:
2909             case FIX_CEIL_EXPR:
2910               pedantic_lvalue_warning (CONVERT_EXPR);
2911               /* If the real type has the same machine representation
2912                  as the type it is cast to, we can make better output
2913                  by adding directly to the inside of the cast.  */
2914               if ((TREE_CODE (TREE_TYPE (arg))
2915                    == TREE_CODE (TREE_TYPE (TREE_OPERAND (arg, 0))))
2916                   && (TYPE_MODE (TREE_TYPE (arg))
2917                       == TYPE_MODE (TREE_TYPE (TREE_OPERAND (arg, 0)))))
2918                 arg = TREE_OPERAND (arg, 0);
2919               else
2920                 {
2921                   tree incremented, modify, value;
2922                   if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
2923                     value = boolean_increment (code, arg);
2924                   else
2925                     {
2926                       arg = stabilize_reference (arg);
2927                       if (code == PREINCREMENT_EXPR || code == PREDECREMENT_EXPR)
2928                         value = arg;
2929                       else
2930                         value = save_expr (arg);
2931                       incremented = build (((code == PREINCREMENT_EXPR
2932                                              || code == POSTINCREMENT_EXPR)
2933                                             ? PLUS_EXPR : MINUS_EXPR),
2934                                            argtype, value, inc);
2935                       TREE_SIDE_EFFECTS (incremented) = 1;
2936                       modify = build_modify_expr (arg, NOP_EXPR, incremented);
2937                       value = build (COMPOUND_EXPR, TREE_TYPE (arg), modify, value);
2938                     }
2939                   TREE_USED (value) = 1;
2940                   return value;
2941                 }
2942               break;
2943
2944             default:
2945               goto give_up;
2946             }
2947       give_up:
2948
2949         /* Complain about anything else that is not a true lvalue.  */
2950         if (!lvalue_or_else (arg, ((code == PREINCREMENT_EXPR
2951                                     || code == POSTINCREMENT_EXPR)
2952                                    ? "invalid lvalue in increment"
2953                                    : "invalid lvalue in decrement")))
2954           return error_mark_node;
2955
2956         /* Report a read-only lvalue.  */
2957         if (TREE_READONLY (arg))
2958           readonly_warning (arg, 
2959                             ((code == PREINCREMENT_EXPR
2960                               || code == POSTINCREMENT_EXPR)
2961                              ? "increment" : "decrement"));
2962
2963         if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE)
2964           val = boolean_increment (code, arg);
2965         else
2966           val = build (code, TREE_TYPE (arg), arg, inc);
2967         TREE_SIDE_EFFECTS (val) = 1;
2968         val = convert (result_type, val);
2969         if (TREE_CODE (val) != code)
2970           TREE_NO_UNUSED_WARNING (val) = 1;
2971         return val;
2972       }
2973
2974     case ADDR_EXPR:
2975       /* Note that this operation never does default_conversion.  */
2976
2977       /* Let &* cancel out to simplify resulting code.  */
2978       if (TREE_CODE (arg) == INDIRECT_REF)
2979         {
2980           /* Don't let this be an lvalue.  */
2981           if (lvalue_p (TREE_OPERAND (arg, 0)))
2982             return non_lvalue (TREE_OPERAND (arg, 0));
2983           return TREE_OPERAND (arg, 0);
2984         }
2985
2986       /* For &x[y], return x+y */
2987       if (TREE_CODE (arg) == ARRAY_REF)
2988         {
2989           if (mark_addressable (TREE_OPERAND (arg, 0)) == 0)
2990             return error_mark_node;
2991           return build_binary_op (PLUS_EXPR, TREE_OPERAND (arg, 0),
2992                                   TREE_OPERAND (arg, 1), 1);
2993         }
2994
2995       /* Handle complex lvalues (when permitted)
2996          by reduction to simpler cases.  */
2997       val = unary_complex_lvalue (code, arg, flag);
2998       if (val != 0)
2999         return val;
3000
3001 #if 0 /* Turned off because inconsistent;
3002          float f; *&(int)f = 3.4 stores in int format
3003          whereas (int)f = 3.4 stores in float format.  */
3004       /* Address of a cast is just a cast of the address
3005          of the operand of the cast.  */
3006       switch (TREE_CODE (arg))
3007         {
3008         case NOP_EXPR:
3009         case CONVERT_EXPR:
3010         case FLOAT_EXPR:
3011         case FIX_TRUNC_EXPR:
3012         case FIX_FLOOR_EXPR:
3013         case FIX_ROUND_EXPR:
3014         case FIX_CEIL_EXPR:
3015           if (pedantic)
3016             pedwarn ("ISO C forbids the address of a cast expression");
3017           return convert (build_pointer_type (TREE_TYPE (arg)),
3018                           build_unary_op (ADDR_EXPR, TREE_OPERAND (arg, 0),
3019                                           0));
3020         }
3021 #endif
3022
3023       /* Anything not already handled and not a true memory reference
3024          or a non-lvalue array is an error.  */
3025       else if (typecode != FUNCTION_TYPE && !flag
3026                && !lvalue_or_else (arg, "invalid lvalue in unary `&'"))
3027         return error_mark_node;
3028
3029       /* Ordinary case; arg is a COMPONENT_REF or a decl.  */
3030       argtype = TREE_TYPE (arg);
3031
3032       /* If the lvalue is const or volatile, merge that into the type
3033          to which the address will point.  Note that you can't get a
3034          restricted pointer by taking the address of something, so we
3035          only have to deal with `const' and `volatile' here.  */
3036       if ((DECL_P (arg) || TREE_CODE_CLASS (TREE_CODE (arg)) == 'r')
3037           && (TREE_READONLY (arg) || TREE_THIS_VOLATILE (arg)))
3038           argtype = c_build_type_variant (argtype,
3039                                           TREE_READONLY (arg),
3040                                           TREE_THIS_VOLATILE (arg));
3041
3042       argtype = build_pointer_type (argtype);
3043
3044       if (mark_addressable (arg) == 0)
3045         return error_mark_node;
3046
3047       {
3048         tree addr;
3049
3050         if (TREE_CODE (arg) == COMPONENT_REF)
3051           {
3052             tree field = TREE_OPERAND (arg, 1);
3053
3054             addr = build_unary_op (ADDR_EXPR, TREE_OPERAND (arg, 0), flag);
3055
3056             if (DECL_C_BIT_FIELD (field))
3057               {
3058                 error ("attempt to take address of bit-field structure member `%s'",
3059                        IDENTIFIER_POINTER (DECL_NAME (field)));
3060                 return error_mark_node;
3061               }
3062
3063             addr = fold (build (PLUS_EXPR, argtype,
3064                                 convert (argtype, addr),
3065                                 convert (argtype, byte_position (field))));
3066           }
3067         else
3068           addr = build1 (code, argtype, arg);
3069
3070         /* Address of a static or external variable or
3071            file-scope function counts as a constant.  */
3072         if (staticp (arg)
3073             && ! (TREE_CODE (arg) == FUNCTION_DECL
3074                   && DECL_CONTEXT (arg) != 0))
3075           TREE_CONSTANT (addr) = 1;
3076         return addr;
3077       }
3078
3079     default:
3080       break;
3081     }
3082
3083   if (argtype == 0)
3084     argtype = TREE_TYPE (arg);
3085   return fold (build1 (code, argtype, arg));
3086 }
3087
3088 #if 0
3089 /* If CONVERSIONS is a conversion expression or a nested sequence of such,
3090    convert ARG with the same conversions in the same order
3091    and return the result.  */
3092
3093 static tree
3094 convert_sequence (conversions, arg)
3095      tree conversions;
3096      tree arg;
3097 {
3098   switch (TREE_CODE (conversions))
3099     {
3100     case NOP_EXPR:
3101     case CONVERT_EXPR:
3102     case FLOAT_EXPR:
3103     case FIX_TRUNC_EXPR:
3104     case FIX_FLOOR_EXPR:
3105     case FIX_ROUND_EXPR:
3106     case FIX_CEIL_EXPR:
3107       return convert (TREE_TYPE (conversions),
3108                       convert_sequence (TREE_OPERAND (conversions, 0),
3109                                         arg));
3110
3111     default:
3112       return arg;
3113     }
3114 }
3115 #endif /* 0 */
3116
3117 /* Return nonzero if REF is an lvalue valid for this language.
3118    Lvalues can be assigned, unless their type has TYPE_READONLY.
3119    Lvalues can have their address taken, unless they have DECL_REGISTER.  */
3120
3121 int
3122 lvalue_p (ref)
3123      tree ref;
3124 {
3125   enum tree_code code = TREE_CODE (ref);
3126
3127   switch (code)
3128     {
3129     case REALPART_EXPR:
3130     case IMAGPART_EXPR:
3131     case COMPONENT_REF:
3132       return lvalue_p (TREE_OPERAND (ref, 0));
3133
3134     case COMPOUND_LITERAL_EXPR:
3135     case STRING_CST:
3136       return 1;
3137
3138     case INDIRECT_REF:
3139     case ARRAY_REF:
3140     case VAR_DECL:
3141     case PARM_DECL:
3142     case RESULT_DECL:
3143     case ERROR_MARK:
3144       return (TREE_CODE (TREE_TYPE (ref)) != FUNCTION_TYPE
3145               && TREE_CODE (TREE_TYPE (ref)) != METHOD_TYPE);
3146
3147     case BIND_EXPR:
3148     case RTL_EXPR:
3149       return TREE_CODE (TREE_TYPE (ref)) == ARRAY_TYPE;
3150
3151     default:
3152       return 0;
3153     }
3154 }
3155
3156 /* Return nonzero if REF is an lvalue valid for this language;
3157    otherwise, print an error message and return zero.  */
3158
3159 int
3160 lvalue_or_else (ref, msgid)
3161      tree ref;
3162      const char *msgid;
3163 {
3164   int win = lvalue_p (ref);
3165
3166   if (! win)
3167     error ("%s", msgid);
3168
3169   return win;
3170 }
3171
3172 /* Apply unary lvalue-demanding operator CODE to the expression ARG
3173    for certain kinds of expressions which are not really lvalues
3174    but which we can accept as lvalues.  If FLAG is nonzero, then
3175    non-lvalues are OK since we may be converting a non-lvalue array to
3176    a pointer in C99.
3177
3178    If ARG is not a kind of expression we can handle, return zero.  */
3179    
3180 static tree
3181 unary_complex_lvalue (code, arg, flag)
3182      enum tree_code code;
3183      tree arg;
3184      int flag;
3185 {
3186   /* Handle (a, b) used as an "lvalue".  */
3187   if (TREE_CODE (arg) == COMPOUND_EXPR)
3188     {
3189       tree real_result = build_unary_op (code, TREE_OPERAND (arg, 1), 0);
3190
3191       /* If this returns a function type, it isn't really being used as
3192          an lvalue, so don't issue a warning about it.  */
3193       if (TREE_CODE (TREE_TYPE (arg)) != FUNCTION_TYPE && !flag)
3194         pedantic_lvalue_warning (COMPOUND_EXPR);
3195
3196       return build (COMPOUND_EXPR, TREE_TYPE (real_result),
3197                     TREE_OPERAND (arg, 0), real_result);
3198     }
3199
3200   /* Handle (a ? b : c) used as an "lvalue".  */
3201   if (TREE_CODE (arg) == COND_EXPR)
3202     {
3203       if (!flag)
3204         pedantic_lvalue_warning (COND_EXPR);
3205       if (TREE_CODE (TREE_TYPE (arg)) != FUNCTION_TYPE && !flag)
3206         pedantic_lvalue_warning (COMPOUND_EXPR);
3207
3208       return (build_conditional_expr
3209               (TREE_OPERAND (arg, 0),
3210                build_unary_op (code, TREE_OPERAND (arg, 1), flag),
3211                build_unary_op (code, TREE_OPERAND (arg, 2), flag)));
3212     }
3213
3214   return 0;
3215 }
3216
3217 /* If pedantic, warn about improper lvalue.   CODE is either COND_EXPR
3218    COMPOUND_EXPR, or CONVERT_EXPR (for casts).  */
3219
3220 static void
3221 pedantic_lvalue_warning (code)
3222      enum tree_code code;
3223 {
3224   if (pedantic)
3225     switch (code)
3226       {
3227       case COND_EXPR:
3228         pedwarn ("ISO C forbids use of conditional expressions as lvalues");
3229         break;
3230       case COMPOUND_EXPR:
3231         pedwarn ("ISO C forbids use of compound expressions as lvalues");
3232         break;
3233       default:
3234         pedwarn ("ISO C forbids use of cast expressions as lvalues");
3235         break;
3236       }
3237 }
3238 \f
3239 /* Warn about storing in something that is `const'.  */
3240
3241 void
3242 readonly_warning (arg, msgid)
3243      tree arg;
3244      const char *msgid;
3245 {
3246   if (TREE_CODE (arg) == COMPONENT_REF)
3247     {
3248       if (TYPE_READONLY (TREE_TYPE (TREE_OPERAND (arg, 0))))
3249         readonly_warning (TREE_OPERAND (arg, 0), msgid);
3250       else
3251         pedwarn ("%s of read-only member `%s'", _(msgid),
3252                  IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (arg, 1))));
3253     }
3254   else if (TREE_CODE (arg) == VAR_DECL)
3255     pedwarn ("%s of read-only variable `%s'", _(msgid),
3256              IDENTIFIER_POINTER (DECL_NAME (arg)));
3257   else
3258     pedwarn ("%s of read-only location", _(msgid));
3259 }
3260 \f
3261 /* Mark EXP saying that we need to be able to take the
3262    address of it; it should not be allocated in a register.
3263    Value is 1 if successful.  */
3264
3265 int
3266 mark_addressable (exp)
3267      tree exp;
3268 {
3269   tree x = exp;
3270   while (1)
3271     switch (TREE_CODE (x))
3272       {
3273       case COMPONENT_REF:
3274         if (DECL_C_BIT_FIELD (TREE_OPERAND (x, 1)))
3275           {
3276             error ("cannot take address of bit-field `%s'",
3277                    IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (x, 1))));
3278             return 0;
3279           }
3280
3281         /* ... fall through ...  */
3282
3283       case ADDR_EXPR:
3284       case ARRAY_REF:
3285       case REALPART_EXPR:
3286       case IMAGPART_EXPR:
3287         x = TREE_OPERAND (x, 0);
3288         break;
3289
3290       case COMPOUND_LITERAL_EXPR:
3291       case CONSTRUCTOR:
3292         TREE_ADDRESSABLE (x) = 1;
3293         return 1;
3294
3295       case VAR_DECL:
3296       case CONST_DECL:
3297       case PARM_DECL:
3298       case RESULT_DECL:
3299         if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x)
3300             && DECL_NONLOCAL (x))
3301           {
3302             if (TREE_PUBLIC (x))
3303               {
3304                 error ("global register variable `%s' used in nested function",
3305                        IDENTIFIER_POINTER (DECL_NAME (x)));
3306                 return 0;
3307               }
3308             pedwarn ("register variable `%s' used in nested function",
3309                      IDENTIFIER_POINTER (DECL_NAME (x)));
3310           }
3311         else if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x))
3312           {
3313             if (TREE_PUBLIC (x))
3314               {
3315                 error ("address of global register variable `%s' requested",
3316                        IDENTIFIER_POINTER (DECL_NAME (x)));
3317                 return 0;
3318               }
3319
3320             /* If we are making this addressable due to its having
3321                volatile components, give a different error message.  Also
3322                handle the case of an unnamed parameter by not trying
3323                to give the name.  */
3324
3325             else if (C_TYPE_FIELDS_VOLATILE (TREE_TYPE (x)))
3326               {
3327                 error ("cannot put object with volatile field into register");
3328                 return 0;
3329               }
3330
3331             pedwarn ("address of register variable `%s' requested",
3332                      IDENTIFIER_POINTER (DECL_NAME (x)));
3333           }
3334         put_var_into_stack (x);
3335
3336         /* drops in */
3337       case FUNCTION_DECL:
3338         TREE_ADDRESSABLE (x) = 1;
3339 #if 0  /* poplevel deals with this now.  */
3340         if (DECL_CONTEXT (x) == 0)
3341           TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (x)) = 1;
3342 #endif
3343
3344       default:
3345         return 1;
3346     }
3347 }
3348 \f
3349 /* Build and return a conditional expression IFEXP ? OP1 : OP2.  */
3350
3351 tree
3352 build_conditional_expr (ifexp, op1, op2)
3353      tree ifexp, op1, op2;
3354 {
3355   tree type1;
3356   tree type2;
3357   enum tree_code code1;
3358   enum tree_code code2;
3359   tree result_type = NULL;
3360   tree orig_op1 = op1, orig_op2 = op2;
3361
3362   ifexp = truthvalue_conversion (default_conversion (ifexp));
3363
3364 #if 0 /* Produces wrong result if within sizeof.  */
3365   /* Don't promote the operands separately if they promote
3366      the same way.  Return the unpromoted type and let the combined
3367      value get promoted if necessary.  */
3368
3369   if (TREE_TYPE (op1) == TREE_TYPE (op2)
3370       && TREE_CODE (TREE_TYPE (op1)) != ARRAY_TYPE
3371       && TREE_CODE (TREE_TYPE (op1)) != ENUMERAL_TYPE
3372       && TREE_CODE (TREE_TYPE (op1)) != FUNCTION_TYPE)
3373     {
3374       if (TREE_CODE (ifexp) == INTEGER_CST)
3375         return pedantic_non_lvalue (integer_zerop (ifexp) ? op2 : op1);
3376
3377       return fold (build (COND_EXPR, TREE_TYPE (op1), ifexp, op1, op2));
3378     }
3379 #endif
3380
3381   /* Promote both alternatives.  */
3382
3383   if (TREE_CODE (TREE_TYPE (op1)) != VOID_TYPE)
3384     op1 = default_conversion (op1);
3385   if (TREE_CODE (TREE_TYPE (op2)) != VOID_TYPE)
3386     op2 = default_conversion (op2);
3387
3388   if (TREE_CODE (ifexp) == ERROR_MARK
3389       || TREE_CODE (TREE_TYPE (op1)) == ERROR_MARK
3390       || TREE_CODE (TREE_TYPE (op2)) == ERROR_MARK)
3391     return error_mark_node;
3392
3393   type1 = TREE_TYPE (op1);
3394   code1 = TREE_CODE (type1);
3395   type2 = TREE_TYPE (op2);
3396   code2 = TREE_CODE (type2);
3397       
3398   /* Quickly detect the usual case where op1 and op2 have the same type
3399      after promotion.  */
3400   if (TYPE_MAIN_VARIANT (type1) == TYPE_MAIN_VARIANT (type2))
3401     {
3402       if (type1 == type2)
3403         result_type = type1;
3404       else
3405         result_type = TYPE_MAIN_VARIANT (type1);
3406     }
3407   else if ((code1 == INTEGER_TYPE || code1 == REAL_TYPE
3408             || code1 == COMPLEX_TYPE)
3409            && (code2 == INTEGER_TYPE || code2 == REAL_TYPE
3410                || code2 == COMPLEX_TYPE))
3411     {
3412       result_type = common_type (type1, type2);
3413
3414       /* If -Wsign-compare, warn here if type1 and type2 have
3415          different signedness.  We'll promote the signed to unsigned
3416          and later code won't know it used to be different.
3417          Do this check on the original types, so that explicit casts
3418          will be considered, but default promotions won't.  */
3419       if ((warn_sign_compare < 0 ? extra_warnings : warn_sign_compare)
3420           && !skip_evaluation)
3421         {
3422           int unsigned_op1 = TREE_UNSIGNED (TREE_TYPE (orig_op1));
3423           int unsigned_op2 = TREE_UNSIGNED (TREE_TYPE (orig_op2));
3424
3425           if (unsigned_op1 ^ unsigned_op2)
3426             {
3427               /* Do not warn if the result type is signed, since the
3428                  signed type will only be chosen if it can represent
3429                  all the values of the unsigned type.  */
3430               if (! TREE_UNSIGNED (result_type))
3431                 /* OK */;
3432               /* Do not warn if the signed quantity is an unsuffixed
3433                  integer literal (or some static constant expression
3434                  involving such literals) and it is non-negative.  */
3435               else if ((unsigned_op2 && tree_expr_nonnegative_p (op1))
3436                        || (unsigned_op1 && tree_expr_nonnegative_p (op2)))
3437                 /* OK */;
3438               else
3439                 warning ("signed and unsigned type in conditional expression");
3440             }
3441         }
3442     }
3443   else if (code1 == VOID_TYPE || code2 == VOID_TYPE)
3444     {
3445       if (pedantic && (code1 != VOID_TYPE || code2 != VOID_TYPE))
3446         pedwarn ("ISO C forbids conditional expr with only one void side");
3447       result_type = void_type_node;
3448     }
3449   else if (code1 == POINTER_TYPE && code2 == POINTER_TYPE)
3450     {
3451       if (comp_target_types (type1, type2))
3452         result_type = common_type (type1, type2);
3453       else if (integer_zerop (op1) && TREE_TYPE (type1) == void_type_node
3454                && TREE_CODE (orig_op1) != NOP_EXPR)
3455         result_type = qualify_type (type2, type1);
3456       else if (integer_zerop (op2) && TREE_TYPE (type2) == void_type_node
3457                && TREE_CODE (orig_op2) != NOP_EXPR)
3458         result_type = qualify_type (type1, type2);
3459       else if (VOID_TYPE_P (TREE_TYPE (type1)))
3460         {
3461           if (pedantic && TREE_CODE (TREE_TYPE (type2)) == FUNCTION_TYPE)
3462             pedwarn ("ISO C forbids conditional expr between `void *' and function pointer");
3463           result_type = build_pointer_type (qualify_type (TREE_TYPE (type1),
3464                                                           TREE_TYPE (type2)));
3465         }
3466       else if (VOID_TYPE_P (TREE_TYPE (type2)))
3467         {
3468           if (pedantic && TREE_CODE (TREE_TYPE (type1)) == FUNCTION_TYPE)
3469             pedwarn ("ISO C forbids conditional expr between `void *' and function pointer");
3470           result_type = build_pointer_type (qualify_type (TREE_TYPE (type2),
3471                                                           TREE_TYPE (type1)));
3472         }
3473       else
3474         {
3475           pedwarn ("pointer type mismatch in conditional expression");
3476           result_type = build_pointer_type (void_type_node);
3477         }
3478     }
3479   else if (code1 == POINTER_TYPE && code2 == INTEGER_TYPE)
3480     {
3481       if (! integer_zerop (op2))
3482         pedwarn ("pointer/integer type mismatch in conditional expression");
3483       else
3484         {
3485           op2 = null_pointer_node;
3486         }
3487       result_type = type1;
3488     }
3489   else if (code2 == POINTER_TYPE && code1 == INTEGER_TYPE)
3490     {
3491       if (!integer_zerop (op1))
3492         pedwarn ("pointer/integer type mismatch in conditional expression");
3493       else
3494         {
3495           op1 = null_pointer_node;
3496         }
3497       result_type = type2;
3498     }
3499
3500   if (!result_type)
3501     {
3502       if (flag_cond_mismatch)
3503         result_type = void_type_node;
3504       else
3505         {
3506           error ("type mismatch in conditional expression");
3507           return error_mark_node;
3508         }
3509     }
3510
3511   /* Merge const and volatile flags of the incoming types.  */
3512   result_type
3513     = build_type_variant (result_type,
3514                           TREE_READONLY (op1) || TREE_READONLY (op2),
3515                           TREE_THIS_VOLATILE (op1) || TREE_THIS_VOLATILE (op2));
3516
3517   if (result_type != TREE_TYPE (op1))
3518     op1 = convert_and_check (result_type, op1);
3519   if (result_type != TREE_TYPE (op2))
3520     op2 = convert_and_check (result_type, op2);
3521     
3522   if (TREE_CODE (ifexp) == INTEGER_CST)
3523     return pedantic_non_lvalue (integer_zerop (ifexp) ? op2 : op1);
3524
3525   return fold (build (COND_EXPR, result_type, ifexp, op1, op2));
3526 }
3527 \f
3528 /* Given a list of expressions, return a compound expression
3529    that performs them all and returns the value of the last of them.  */
3530
3531 tree
3532 build_compound_expr (list)
3533      tree list;
3534 {
3535   return internal_build_compound_expr (list, TRUE);
3536 }
3537
3538 static tree
3539 internal_build_compound_expr (list, first_p)
3540      tree list;
3541      int first_p;
3542 {
3543   tree rest;
3544
3545   if (TREE_CHAIN (list) == 0)
3546     {
3547       /* Convert arrays and functions to pointers when there
3548          really is a comma operator.  */
3549       if (!first_p)
3550         TREE_VALUE (list)
3551           = default_function_array_conversion (TREE_VALUE (list));
3552
3553 #if 0 /* If something inside inhibited lvalueness, we should not override.  */
3554       /* Consider (x, y+0), which is not an lvalue since y+0 is not.  */
3555
3556       /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
3557       if (TREE_CODE (list) == NON_LVALUE_EXPR)
3558         list = TREE_OPERAND (list, 0);
3559 #endif
3560
3561       /* Don't let (0, 0) be null pointer constant.  */
3562       if (!first_p && integer_zerop (TREE_VALUE (list)))
3563         return non_lvalue (TREE_VALUE (list));
3564       return TREE_VALUE (list);
3565     }
3566
3567   rest = internal_build_compound_expr (TREE_CHAIN (list), FALSE);
3568
3569   if (! TREE_SIDE_EFFECTS (TREE_VALUE (list)))
3570     {
3571       /* The left-hand operand of a comma expression is like an expression
3572          statement: with -W or -Wunused, we should warn if it doesn't have
3573          any side-effects, unless it was explicitly cast to (void).  */
3574       if ((extra_warnings || warn_unused_value)
3575            && ! (TREE_CODE (TREE_VALUE (list)) == CONVERT_EXPR
3576                 && VOID_TYPE_P (TREE_TYPE (TREE_VALUE (list)))))
3577         warning ("left-hand operand of comma expression has no effect");
3578
3579       /* When pedantic, a compound expression can be neither an lvalue
3580          nor an integer constant expression.  */
3581       if (! pedantic)
3582         return rest;
3583     }
3584
3585   /* With -Wunused, we should also warn if the left-hand operand does have
3586      side-effects, but computes a value which is not used.  For example, in
3587      `foo() + bar(), baz()' the result of the `+' operator is not used,
3588      so we should issue a warning.  */
3589   else if (warn_unused_value)
3590     warn_if_unused_value (TREE_VALUE (list));
3591
3592   return build (COMPOUND_EXPR, TREE_TYPE (rest), TREE_VALUE (list), rest);
3593 }
3594
3595 /* Build an expression representing a cast to type TYPE of expression EXPR.  */
3596
3597 tree
3598 build_c_cast (type, expr)
3599      tree type;
3600      tree expr;
3601 {
3602   tree value = expr;
3603   
3604   if (type == error_mark_node || expr == error_mark_node)
3605     return error_mark_node;
3606   type = TYPE_MAIN_VARIANT (type);
3607
3608 #if 0
3609   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
3610   if (TREE_CODE (value) == NON_LVALUE_EXPR)
3611     value = TREE_OPERAND (value, 0);
3612 #endif
3613
3614   if (TREE_CODE (type) == ARRAY_TYPE)
3615     {
3616       error ("cast specifies array type");
3617       return error_mark_node;
3618     }
3619
3620   if (TREE_CODE (type) == FUNCTION_TYPE)
3621     {
3622       error ("cast specifies function type");
3623       return error_mark_node;
3624     }
3625
3626   if (type == TYPE_MAIN_VARIANT (TREE_TYPE (value)))
3627     {
3628       if (pedantic)
3629         {
3630           if (TREE_CODE (type) == RECORD_TYPE
3631               || TREE_CODE (type) == UNION_TYPE)
3632             pedwarn ("ISO C forbids casting nonscalar to the same type");
3633         }
3634     }
3635   else if (TREE_CODE (type) == UNION_TYPE)
3636     {
3637       tree field;
3638       value = default_function_array_conversion (value);
3639
3640       for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
3641         if (comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (field)),
3642                        TYPE_MAIN_VARIANT (TREE_TYPE (value))))
3643           break;
3644
3645       if (field)
3646         {
3647           const char *name;
3648           tree t;
3649
3650           if (pedantic)
3651             pedwarn ("ISO C forbids casts to union type");
3652           if (TYPE_NAME (type) != 0)
3653             {
3654               if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
3655                 name = IDENTIFIER_POINTER (TYPE_NAME (type));
3656               else
3657                 name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
3658             }
3659           else
3660             name = "";
3661           t = digest_init (type, build (CONSTRUCTOR, type, NULL_TREE,
3662                                         build_tree_list (field, value)),
3663                            0, 0);
3664           TREE_CONSTANT (t) = TREE_CONSTANT (value);
3665           return t;
3666         }
3667       error ("cast to union type from type not present in union");
3668       return error_mark_node;
3669     }
3670   else
3671     {
3672       tree otype, ovalue;
3673
3674       /* If casting to void, avoid the error that would come
3675          from default_conversion in the case of a non-lvalue array.  */
3676       if (type == void_type_node)
3677         return build1 (CONVERT_EXPR, type, value);
3678
3679       /* Convert functions and arrays to pointers,
3680          but don't convert any other types.  */
3681       value = default_function_array_conversion (value);
3682       otype = TREE_TYPE (value);
3683
3684       /* Optionally warn about potentially worrisome casts.  */
3685
3686       if (warn_cast_qual
3687           && TREE_CODE (type) == POINTER_TYPE
3688           && TREE_CODE (otype) == POINTER_TYPE)
3689         {
3690           tree in_type = type;
3691           tree in_otype = otype;
3692           int added = 0;
3693           int discarded = 0;
3694
3695           /* Check that the qualifiers on IN_TYPE are a superset of
3696              the qualifiers of IN_OTYPE.  The outermost level of
3697              POINTER_TYPE nodes is uninteresting and we stop as soon
3698              as we hit a non-POINTER_TYPE node on either type.  */
3699           do
3700             {
3701               in_otype = TREE_TYPE (in_otype);
3702               in_type = TREE_TYPE (in_type);
3703
3704               /* GNU C allows cv-qualified function types.  'const'
3705                  means the function is very pure, 'volatile' means it
3706                  can't return.  We need to warn when such qualifiers
3707                  are added, not when they're taken away.  */
3708               if (TREE_CODE (in_otype) == FUNCTION_TYPE
3709                   && TREE_CODE (in_type) == FUNCTION_TYPE)
3710                 added |= (TYPE_QUALS (in_type) & ~TYPE_QUALS (in_otype));
3711               else
3712                 discarded |= (TYPE_QUALS (in_otype) & ~TYPE_QUALS (in_type));
3713             }
3714           while (TREE_CODE (in_type) == POINTER_TYPE
3715                  && TREE_CODE (in_otype) == POINTER_TYPE);
3716
3717           if (added)
3718             warning ("cast adds new qualifiers to function type");
3719
3720           if (discarded)
3721             /* There are qualifiers present in IN_OTYPE that are not
3722                present in IN_TYPE.  */
3723             warning ("cast discards qualifiers from pointer target type");
3724         }
3725
3726       /* Warn about possible alignment problems.  */
3727       if (STRICT_ALIGNMENT && warn_cast_align
3728           && TREE_CODE (type) == POINTER_TYPE
3729           && TREE_CODE (otype) == POINTER_TYPE
3730           && TREE_CODE (TREE_TYPE (otype)) != VOID_TYPE
3731           && TREE_CODE (TREE_TYPE (otype)) != FUNCTION_TYPE
3732           /* Don't warn about opaque types, where the actual alignment
3733              restriction is unknown.  */
3734           && !((TREE_CODE (TREE_TYPE (otype)) == UNION_TYPE
3735                 || TREE_CODE (TREE_TYPE (otype)) == RECORD_TYPE)
3736                && TYPE_MODE (TREE_TYPE (otype)) == VOIDmode)
3737           && TYPE_ALIGN (TREE_TYPE (type)) > TYPE_ALIGN (TREE_TYPE (otype)))
3738         warning ("cast increases required alignment of target type");
3739
3740       if (TREE_CODE (type) == INTEGER_TYPE
3741           && TREE_CODE (otype) == POINTER_TYPE
3742           && TYPE_PRECISION (type) != TYPE_PRECISION (otype)
3743           && !TREE_CONSTANT (value))
3744         warning ("cast from pointer to integer of different size");
3745
3746       if (warn_bad_function_cast
3747           && TREE_CODE (value) == CALL_EXPR
3748           && TREE_CODE (type) != TREE_CODE (otype))
3749         warning ("cast does not match function type");
3750
3751       if (TREE_CODE (type) == POINTER_TYPE
3752           && TREE_CODE (otype) == INTEGER_TYPE
3753           && TYPE_PRECISION (type) != TYPE_PRECISION (otype)
3754           /* Don't warn about converting any constant.  */
3755           && !TREE_CONSTANT (value))
3756         warning ("cast to pointer from integer of different size");
3757
3758       ovalue = value;
3759       value = convert (type, value);
3760
3761       /* Ignore any integer overflow caused by the cast.  */
3762       if (TREE_CODE (value) == INTEGER_CST)
3763         {
3764           TREE_OVERFLOW (value) = TREE_OVERFLOW (ovalue);
3765           TREE_CONSTANT_OVERFLOW (value) = TREE_CONSTANT_OVERFLOW (ovalue);
3766         }
3767     }
3768
3769   /* Pedantically, don't let (void *) (FOO *) 0 be a null pointer constant.  */
3770   if (pedantic && TREE_CODE (value) == INTEGER_CST
3771       && TREE_CODE (expr) == INTEGER_CST
3772       && TREE_CODE (TREE_TYPE (expr)) != INTEGER_TYPE)
3773     value = non_lvalue (value);
3774
3775   /* If pedantic, don't let a cast be an lvalue.  */
3776   if (value == expr && pedantic)
3777     value = non_lvalue (value);
3778
3779   return value;
3780 }
3781
3782 /* Interpret a cast of expression EXPR to type TYPE.  */
3783 tree
3784 c_cast_expr (type, expr)
3785      tree type, expr;
3786 {
3787   int saved_wsp = warn_strict_prototypes;
3788
3789   /* This avoids warnings about unprototyped casts on
3790      integers.  E.g. "#define SIG_DFL (void(*)())0".  */
3791   if (TREE_CODE (expr) == INTEGER_CST)
3792     warn_strict_prototypes = 0;
3793   type = groktypename (type);
3794   warn_strict_prototypes = saved_wsp;
3795
3796   return build_c_cast (type, expr);
3797 }
3798
3799 \f
3800 /* Build an assignment expression of lvalue LHS from value RHS.
3801    MODIFYCODE is the code for a binary operator that we use
3802    to combine the old value of LHS with RHS to get the new value.
3803    Or else MODIFYCODE is NOP_EXPR meaning do a simple assignment.  */
3804
3805 tree
3806 build_modify_expr (lhs, modifycode, rhs)
3807      tree lhs, rhs;
3808      enum tree_code modifycode;
3809 {
3810   tree result;
3811   tree newrhs;
3812   tree lhstype = TREE_TYPE (lhs);
3813   tree olhstype = lhstype;
3814
3815   /* Types that aren't fully specified cannot be used in assignments.  */
3816   lhs = require_complete_type (lhs);
3817
3818   /* Avoid duplicate error messages from operands that had errors.  */
3819   if (TREE_CODE (lhs) == ERROR_MARK || TREE_CODE (rhs) == ERROR_MARK)
3820     return error_mark_node;
3821
3822   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
3823   /* Do not use STRIP_NOPS here.  We do not want an enumerator
3824      whose value is 0 to count as a null pointer constant.  */
3825   if (TREE_CODE (rhs) == NON_LVALUE_EXPR)
3826     rhs = TREE_OPERAND (rhs, 0);
3827
3828   newrhs = rhs;
3829
3830   /* Handle control structure constructs used as "lvalues".  */
3831
3832   switch (TREE_CODE (lhs))
3833     {
3834       /* Handle (a, b) used as an "lvalue".  */
3835     case COMPOUND_EXPR:
3836       pedantic_lvalue_warning (COMPOUND_EXPR);
3837       newrhs = build_modify_expr (TREE_OPERAND (lhs, 1), modifycode, rhs);
3838       if (TREE_CODE (newrhs) == ERROR_MARK)
3839         return error_mark_node;
3840       return build (COMPOUND_EXPR, lhstype,
3841                     TREE_OPERAND (lhs, 0), newrhs);
3842  
3843       /* Handle (a ? b : c) used as an "lvalue".  */
3844     case COND_EXPR:
3845       pedantic_lvalue_warning (COND_EXPR);
3846       rhs = save_expr (rhs);
3847       {
3848         /* Produce (a ? (b = rhs) : (c = rhs))
3849            except that the RHS goes through a save-expr
3850            so the code to compute it is only emitted once.  */
3851         tree cond
3852           = build_conditional_expr (TREE_OPERAND (lhs, 0),
3853                                     build_modify_expr (TREE_OPERAND (lhs, 1),
3854                                                        modifycode, rhs),
3855                                     build_modify_expr (TREE_OPERAND (lhs, 2),
3856                                                        modifycode, rhs));
3857         if (TREE_CODE (cond) == ERROR_MARK)
3858           return cond;
3859         /* Make sure the code to compute the rhs comes out
3860            before the split.  */
3861         return build (COMPOUND_EXPR, TREE_TYPE (lhs),
3862                       /* But cast it to void to avoid an "unused" error.  */
3863                       convert (void_type_node, rhs), cond);
3864       }
3865     default:
3866       break;
3867     }
3868
3869   /* If a binary op has been requested, combine the old LHS value with the RHS
3870      producing the value we should actually store into the LHS.  */
3871
3872   if (modifycode != NOP_EXPR)
3873     {
3874       lhs = stabilize_reference (lhs);
3875       newrhs = build_binary_op (modifycode, lhs, rhs, 1);
3876     }
3877
3878   /* Handle a cast used as an "lvalue".
3879      We have already performed any binary operator using the value as cast.
3880      Now convert the result to the cast type of the lhs,
3881      and then true type of the lhs and store it there;
3882      then convert result back to the cast type to be the value
3883      of the assignment.  */
3884
3885   switch (TREE_CODE (lhs))
3886     {
3887     case NOP_EXPR:
3888     case CONVERT_EXPR:
3889     case FLOAT_EXPR:
3890     case FIX_TRUNC_EXPR:
3891     case FIX_FLOOR_EXPR:
3892     case FIX_ROUND_EXPR:
3893     case FIX_CEIL_EXPR:
3894       newrhs = default_function_array_conversion (newrhs);
3895       {
3896         tree inner_lhs = TREE_OPERAND (lhs, 0);
3897         tree result;
3898         result = build_modify_expr (inner_lhs, NOP_EXPR,
3899                                     convert (TREE_TYPE (inner_lhs),
3900                                              convert (lhstype, newrhs)));
3901         if (TREE_CODE (result) == ERROR_MARK)
3902           return result;
3903         pedantic_lvalue_warning (CONVERT_EXPR);
3904         return convert (TREE_TYPE (lhs), result);
3905       }
3906       
3907     default:
3908       break;
3909     }
3910
3911   /* Now we have handled acceptable kinds of LHS that are not truly lvalues.
3912      Reject anything strange now.  */
3913
3914   if (!lvalue_or_else (lhs, "invalid lvalue in assignment"))
3915     return error_mark_node;
3916
3917   /* Warn about storing in something that is `const'.  */
3918
3919   if (TREE_READONLY (lhs) || TYPE_READONLY (lhstype)
3920       || ((TREE_CODE (lhstype) == RECORD_TYPE
3921            || TREE_CODE (lhstype) == UNION_TYPE)
3922           && C_TYPE_FIELDS_READONLY (lhstype)))
3923     readonly_warning (lhs, "assignment");
3924
3925   /* If storing into a structure or union member,
3926      it has probably been given type `int'.
3927      Compute the type that would go with
3928      the actual amount of storage the member occupies.  */
3929
3930   if (TREE_CODE (lhs) == COMPONENT_REF
3931       && (TREE_CODE (lhstype) == INTEGER_TYPE
3932           || TREE_CODE (lhstype) == BOOLEAN_TYPE
3933           || TREE_CODE (lhstype) == REAL_TYPE
3934           || TREE_CODE (lhstype) == ENUMERAL_TYPE))
3935     lhstype = TREE_TYPE (get_unwidened (lhs, 0));
3936
3937   /* If storing in a field that is in actuality a short or narrower than one,
3938      we must store in the field in its actual type.  */
3939
3940   if (lhstype != TREE_TYPE (lhs))
3941     {
3942       lhs = copy_node (lhs);
3943       TREE_TYPE (lhs) = lhstype;
3944     }
3945
3946   /* Convert new value to destination type.  */
3947
3948   newrhs = convert_for_assignment (lhstype, newrhs, _("assignment"),
3949                                    NULL_TREE, NULL_TREE, 0);
3950   if (TREE_CODE (newrhs) == ERROR_MARK)
3951     return error_mark_node;
3952
3953   /* Scan operands */
3954
3955   result = build (MODIFY_EXPR, lhstype, lhs, newrhs);
3956   TREE_SIDE_EFFECTS (result) = 1;
3957
3958   /* If we got the LHS in a different type for storing in,
3959      convert the result back to the nominal type of LHS
3960      so that the value we return always has the same type
3961      as the LHS argument.  */
3962
3963   if (olhstype == TREE_TYPE (result))
3964     return result;
3965   return convert_for_assignment (olhstype, result, _("assignment"),
3966                                  NULL_TREE, NULL_TREE, 0);
3967 }
3968 \f
3969 /* Convert value RHS to type TYPE as preparation for an assignment
3970    to an lvalue of type TYPE.
3971    The real work of conversion is done by `convert'.
3972    The purpose of this function is to generate error messages
3973    for assignments that are not allowed in C.
3974    ERRTYPE is a string to use in error messages:
3975    "assignment", "return", etc.  If it is null, this is parameter passing
3976    for a function call (and different error messages are output).
3977
3978    FUNNAME is the name of the function being called,
3979    as an IDENTIFIER_NODE, or null.
3980    PARMNUM is the number of the argument, for printing in error messages.  */
3981
3982 static tree
3983 convert_for_assignment (type, rhs, errtype, fundecl, funname, parmnum)
3984      tree type, rhs;
3985      const char *errtype;
3986      tree fundecl, funname;
3987      int parmnum;
3988 {
3989   enum tree_code codel = TREE_CODE (type);
3990   tree rhstype;
3991   enum tree_code coder;
3992
3993   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
3994   /* Do not use STRIP_NOPS here.  We do not want an enumerator
3995      whose value is 0 to count as a null pointer constant.  */
3996   if (TREE_CODE (rhs) == NON_LVALUE_EXPR)
3997     rhs = TREE_OPERAND (rhs, 0);
3998
3999   if (TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE
4000       || TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE)
4001     rhs = default_conversion (rhs);
4002   else if (optimize && TREE_CODE (rhs) == VAR_DECL)
4003     rhs = decl_constant_value_for_broken_optimization (rhs);
4004
4005   rhstype = TREE_TYPE (rhs);
4006   coder = TREE_CODE (rhstype);
4007
4008   if (coder == ERROR_MARK)
4009     return error_mark_node;
4010
4011   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (rhstype))
4012     {
4013       overflow_warning (rhs);
4014       /* Check for Objective-C protocols.  This will issue a warning if
4015          there are protocol violations.  No need to use the return value.  */
4016       maybe_objc_comptypes (type, rhstype, 0);
4017       return rhs;
4018     }
4019
4020   if (coder == VOID_TYPE)
4021     {
4022       error ("void value not ignored as it ought to be");
4023       return error_mark_node;
4024     }
4025   /* A type converts to a reference to it.  
4026      This code doesn't fully support references, it's just for the
4027      special case of va_start and va_copy.  */
4028   if (codel == REFERENCE_TYPE
4029       && comptypes (TREE_TYPE (type), TREE_TYPE (rhs)) == 1)
4030     {
4031       if (mark_addressable (rhs) == 0)
4032         return error_mark_node;
4033       rhs = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (rhs)), rhs);
4034
4035       /* We already know that these two types are compatible, but they
4036          may not be exactly identical.  In fact, `TREE_TYPE (type)' is
4037          likely to be __builtin_va_list and `TREE_TYPE (rhs)' is
4038          likely to be va_list, a typedef to __builtin_va_list, which
4039          is different enough that it will cause problems later.  */
4040       if (TREE_TYPE (TREE_TYPE (rhs)) != TREE_TYPE (type))
4041         rhs = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (type)), rhs);
4042
4043       rhs = build1 (NOP_EXPR, type, rhs);
4044       return rhs;
4045     }
4046   /* Arithmetic types all interconvert, and enum is treated like int.  */
4047   else if ((codel == INTEGER_TYPE || codel == REAL_TYPE 
4048             || codel == ENUMERAL_TYPE || codel == COMPLEX_TYPE
4049             || codel == BOOLEAN_TYPE)
4050            && (coder == INTEGER_TYPE || coder == REAL_TYPE 
4051                || coder == ENUMERAL_TYPE || coder == COMPLEX_TYPE
4052                || coder == BOOLEAN_TYPE))
4053     return convert_and_check (type, rhs);
4054
4055   /* Conversion to a transparent union from its member types.
4056      This applies only to function arguments.  */
4057   else if (codel == UNION_TYPE && TYPE_TRANSPARENT_UNION (type) && ! errtype)
4058     {
4059       tree memb_types;
4060       tree marginal_memb_type = 0;
4061
4062       for (memb_types = TYPE_FIELDS (type); memb_types;
4063            memb_types = TREE_CHAIN (memb_types))
4064         {
4065           tree memb_type = TREE_TYPE (memb_types);
4066
4067           if (comptypes (TYPE_MAIN_VARIANT (memb_type),
4068                          TYPE_MAIN_VARIANT (rhstype)))
4069             break;
4070
4071           if (TREE_CODE (memb_type) != POINTER_TYPE)
4072             continue;
4073
4074           if (coder == POINTER_TYPE)
4075             {
4076               tree ttl = TREE_TYPE (memb_type);
4077               tree ttr = TREE_TYPE (rhstype);
4078
4079               /* Any non-function converts to a [const][volatile] void *
4080                  and vice versa; otherwise, targets must be the same.
4081                  Meanwhile, the lhs target must have all the qualifiers of
4082                  the rhs.  */
4083               if (VOID_TYPE_P (ttl) || VOID_TYPE_P (ttr)
4084                   || comp_target_types (memb_type, rhstype))
4085                 {
4086                   /* If this type won't generate any warnings, use it.  */
4087                   if (TYPE_QUALS (ttl) == TYPE_QUALS (ttr)
4088                       || ((TREE_CODE (ttr) == FUNCTION_TYPE
4089                            && TREE_CODE (ttl) == FUNCTION_TYPE)
4090                           ? ((TYPE_QUALS (ttl) | TYPE_QUALS (ttr))
4091                              == TYPE_QUALS (ttr))
4092                           : ((TYPE_QUALS (ttl) | TYPE_QUALS (ttr))
4093                              == TYPE_QUALS (ttl))))
4094                     break;
4095
4096                   /* Keep looking for a better type, but remember this one.  */
4097                   if (! marginal_memb_type)
4098                     marginal_memb_type = memb_type;
4099                 }
4100             }
4101
4102           /* Can convert integer zero to any pointer type.  */
4103           if (integer_zerop (rhs)
4104               || (TREE_CODE (rhs) == NOP_EXPR
4105                   && integer_zerop (TREE_OPERAND (rhs, 0))))
4106             {
4107               rhs = null_pointer_node;
4108               break;
4109             }
4110         }
4111
4112       if (memb_types || marginal_memb_type)
4113         {
4114           if (! memb_types)
4115             {
4116               /* We have only a marginally acceptable member type;
4117                  it needs a warning.  */
4118               tree ttl = TREE_TYPE (marginal_memb_type);
4119               tree ttr = TREE_TYPE (rhstype);
4120
4121               /* Const and volatile mean something different for function
4122                  types, so the usual warnings are not appropriate.  */
4123               if (TREE_CODE (ttr) == FUNCTION_TYPE
4124                   && TREE_CODE (ttl) == FUNCTION_TYPE)
4125                 {
4126                   /* Because const and volatile on functions are
4127                      restrictions that say the function will not do
4128                      certain things, it is okay to use a const or volatile
4129                      function where an ordinary one is wanted, but not
4130                      vice-versa.  */
4131                   if (TYPE_QUALS (ttl) & ~TYPE_QUALS (ttr))
4132                     warn_for_assignment ("%s makes qualified function pointer from unqualified",
4133                                          errtype, funname, parmnum);
4134                 }
4135               else if (TYPE_QUALS (ttr) & ~TYPE_QUALS (ttl))
4136                 warn_for_assignment ("%s discards qualifiers from pointer target type",
4137                                      errtype, funname,
4138                                      parmnum);
4139             }
4140           
4141           if (pedantic && ! DECL_IN_SYSTEM_HEADER (fundecl))
4142             pedwarn ("ISO C prohibits argument conversion to union type");
4143
4144           return build1 (NOP_EXPR, type, rhs);
4145         }
4146     }
4147
4148   /* Conversions among pointers */
4149   else if ((codel == POINTER_TYPE || codel == REFERENCE_TYPE)
4150            && (coder == POINTER_TYPE || coder == REFERENCE_TYPE))
4151     {
4152       tree ttl = TREE_TYPE (type);
4153       tree ttr = TREE_TYPE (rhstype);
4154
4155       /* Any non-function converts to a [const][volatile] void *
4156          and vice versa; otherwise, targets must be the same.
4157          Meanwhile, the lhs target must have all the qualifiers of the rhs.  */
4158       if (VOID_TYPE_P (ttl) || VOID_TYPE_P (ttr)
4159           || comp_target_types (type, rhstype)
4160           || (unsigned_type (TYPE_MAIN_VARIANT (ttl))
4161               == unsigned_type (TYPE_MAIN_VARIANT (ttr))))
4162         {
4163           if (pedantic
4164               && ((VOID_TYPE_P (ttl) && TREE_CODE (ttr) == FUNCTION_TYPE)
4165                   ||
4166                   (VOID_TYPE_P (ttr)
4167                    /* Check TREE_CODE to catch cases like (void *) (char *) 0
4168                       which are not ANSI null ptr constants.  */
4169                    && (!integer_zerop (rhs) || TREE_CODE (rhs) == NOP_EXPR)
4170                    && TREE_CODE (ttl) == FUNCTION_TYPE)))
4171             warn_for_assignment ("ISO C forbids %s between function pointer and `void *'",
4172                                  errtype, funname, parmnum);
4173           /* Const and volatile mean something different for function types,
4174              so the usual warnings are not appropriate.  */
4175           else if (TREE_CODE (ttr) != FUNCTION_TYPE
4176                    && TREE_CODE (ttl) != FUNCTION_TYPE)
4177             {
4178               if (TYPE_QUALS (ttr) & ~TYPE_QUALS (ttl))
4179                 warn_for_assignment ("%s discards qualifiers from pointer target type",
4180                                      errtype, funname, parmnum);
4181               /* If this is not a case of ignoring a mismatch in signedness,
4182                  no warning.  */
4183               else if (VOID_TYPE_P (ttl) || VOID_TYPE_P (ttr)
4184                        || comp_target_types (type, rhstype))
4185                 ;
4186               /* If there is a mismatch, do warn.  */
4187               else if (pedantic)
4188                 warn_for_assignment ("pointer targets in %s differ in signedness",
4189                                      errtype, funname, parmnum);
4190             }
4191           else if (TREE_CODE (ttl) == FUNCTION_TYPE
4192                    && TREE_CODE (ttr) == FUNCTION_TYPE)
4193             {
4194               /* Because const and volatile on functions are restrictions
4195                  that say the function will not do certain things,
4196                  it is okay to use a const or volatile function
4197                  where an ordinary one is wanted, but not vice-versa.  */
4198               if (TYPE_QUALS (ttl) & ~TYPE_QUALS (ttr))
4199                 warn_for_assignment ("%s makes qualified function pointer from unqualified",
4200                                      errtype, funname, parmnum);
4201             }
4202         }
4203       else
4204         warn_for_assignment ("%s from incompatible pointer type",
4205                              errtype, funname, parmnum);
4206       return convert (type, rhs);
4207     }
4208   else if (codel == POINTER_TYPE && coder == INTEGER_TYPE)
4209     {
4210       /* An explicit constant 0 can convert to a pointer,
4211          or one that results from arithmetic, even including
4212          a cast to integer type.  */
4213       if (! (TREE_CODE (rhs) == INTEGER_CST && integer_zerop (rhs))
4214           &&
4215           ! (TREE_CODE (rhs) == NOP_EXPR
4216              && TREE_CODE (TREE_TYPE (rhs)) == INTEGER_TYPE
4217              && TREE_CODE (TREE_OPERAND (rhs, 0)) == INTEGER_CST
4218              && integer_zerop (TREE_OPERAND (rhs, 0))))
4219         {
4220           warn_for_assignment ("%s makes pointer from integer without a cast",
4221                                errtype, funname, parmnum);
4222           return convert (type, rhs);
4223         }
4224       return null_pointer_node;
4225     }
4226   else if (codel == INTEGER_TYPE && coder == POINTER_TYPE)
4227     {
4228       warn_for_assignment ("%s makes integer from pointer without a cast",
4229                            errtype, funname, parmnum);
4230       return convert (type, rhs);
4231     }
4232   else if (codel == BOOLEAN_TYPE && coder == POINTER_TYPE)
4233     return convert (type, rhs);
4234
4235   if (!errtype)
4236     {
4237       if (funname)
4238         {
4239           tree selector = maybe_building_objc_message_expr ();
4240  
4241           if (selector && parmnum > 2)
4242             error ("incompatible type for argument %d of `%s'",
4243                    parmnum - 2, IDENTIFIER_POINTER (selector));
4244           else
4245             error ("incompatible type for argument %d of `%s'",
4246                    parmnum, IDENTIFIER_POINTER (funname));
4247         }
4248       else
4249         error ("incompatible type for argument %d of indirect function call",
4250                parmnum);
4251     }
4252   else
4253     error ("incompatible types in %s", errtype);
4254
4255   return error_mark_node;
4256 }
4257
4258 /* Print a warning using MSGID.
4259    It gets OPNAME as its one parameter.
4260    If OPNAME is null, it is replaced by "passing arg ARGNUM of `FUNCTION'".
4261    FUNCTION and ARGNUM are handled specially if we are building an
4262    Objective-C selector.  */
4263
4264 static void
4265 warn_for_assignment (msgid, opname, function, argnum)
4266      const char *msgid;
4267      const char *opname;
4268      tree function;
4269      int argnum;
4270 {
4271   if (opname == 0)
4272     {
4273       tree selector = maybe_building_objc_message_expr ();
4274       char * new_opname;
4275       
4276       if (selector && argnum > 2)
4277         {
4278           function = selector;
4279           argnum -= 2;
4280         }
4281       if (function)
4282         {
4283           /* Function name is known; supply it.  */
4284           const char *const argstring = _("passing arg %d of `%s'");
4285           new_opname = (char *) alloca (IDENTIFIER_LENGTH (function)
4286                                         + strlen (argstring) + 1 + 25
4287                                         /*%d*/ + 1);
4288           sprintf (new_opname, argstring, argnum,
4289                    IDENTIFIER_POINTER (function));
4290         }
4291       else
4292         {
4293           /* Function name unknown (call through ptr); just give arg number.  */
4294           const char *const argnofun = _("passing arg %d of pointer to function");
4295           new_opname = (char *) alloca (strlen (argnofun) + 1 + 25 /*%d*/ + 1);
4296           sprintf (new_opname, argnofun, argnum);
4297         }
4298       opname = new_opname;
4299     }
4300   pedwarn (msgid, opname);
4301 }
4302 \f
4303 /* If VALUE is a compound expr all of whose expressions are constant, then
4304    return its value.  Otherwise, return error_mark_node.
4305
4306    This is for handling COMPOUND_EXPRs as initializer elements
4307    which is allowed with a warning when -pedantic is specified.  */
4308
4309 static tree
4310 valid_compound_expr_initializer (value, endtype)
4311      tree value;
4312      tree endtype;
4313 {
4314   if (TREE_CODE (value) == COMPOUND_EXPR)
4315     {
4316       if (valid_compound_expr_initializer (TREE_OPERAND (value, 0), endtype)
4317           == error_mark_node)
4318         return error_mark_node;
4319       return valid_compound_expr_initializer (TREE_OPERAND (value, 1),
4320                                               endtype);
4321     }
4322   else if (! TREE_CONSTANT (value)
4323            && ! initializer_constant_valid_p (value, endtype))
4324     return error_mark_node;
4325   else
4326     return value;
4327 }
4328 \f
4329 /* Perform appropriate conversions on the initial value of a variable,
4330    store it in the declaration DECL,
4331    and print any error messages that are appropriate.
4332    If the init is invalid, store an ERROR_MARK.  */
4333
4334 void
4335 store_init_value (decl, init)
4336      tree decl, init;
4337 {
4338   tree value, type;
4339
4340   /* If variable's type was invalidly declared, just ignore it.  */
4341
4342   type = TREE_TYPE (decl);
4343   if (TREE_CODE (type) == ERROR_MARK)
4344     return;
4345
4346   /* Digest the specified initializer into an expression.  */
4347
4348   value = digest_init (type, init, TREE_STATIC (decl),
4349                        TREE_STATIC (decl) || (pedantic && !flag_isoc99));
4350
4351   /* Store the expression if valid; else report error.  */
4352
4353 #if 0
4354   /* Note that this is the only place we can detect the error
4355      in a case such as   struct foo bar = (struct foo) { x, y };
4356      where there is one initial value which is a constructor expression.  */
4357   if (value == error_mark_node)
4358     ;
4359   else if (TREE_STATIC (decl) && ! TREE_CONSTANT (value))
4360     {
4361       error ("initializer for static variable is not constant");
4362       value = error_mark_node;
4363     }
4364   else if (TREE_STATIC (decl)
4365            && initializer_constant_valid_p (value, TREE_TYPE (value)) == 0)
4366     {
4367       error ("initializer for static variable uses complicated arithmetic");
4368       value = error_mark_node;
4369     }
4370   else
4371     {
4372       if (pedantic && TREE_CODE (value) == CONSTRUCTOR)
4373         {
4374           if (! TREE_CONSTANT (value))
4375             pedwarn ("aggregate initializer is not constant");
4376           else if (! TREE_STATIC (value))
4377             pedwarn ("aggregate initializer uses complicated arithmetic");
4378         }
4379     }
4380 #endif
4381
4382   if (warn_traditional && !in_system_header
4383       && AGGREGATE_TYPE_P (TREE_TYPE (decl)) && ! TREE_STATIC (decl))
4384     warning ("traditional C rejects automatic aggregate initialization");
4385
4386   DECL_INITIAL (decl) = value;
4387
4388   /* ANSI wants warnings about out-of-range constant initializers.  */
4389   STRIP_TYPE_NOPS (value);
4390   constant_expression_warning (value);
4391
4392   /* Check if we need to set array size from compound literal size.  */
4393   if (TREE_CODE (type) == ARRAY_TYPE
4394       && TYPE_DOMAIN (type) == 0
4395       && value != error_mark_node)
4396     {
4397       tree inside_init = init;
4398
4399       if (TREE_CODE (init) == NON_LVALUE_EXPR)
4400         inside_init = TREE_OPERAND (init, 0);
4401       inside_init = fold (inside_init);
4402
4403       if (TREE_CODE (inside_init) == COMPOUND_LITERAL_EXPR)
4404         {
4405           tree decl = COMPOUND_LITERAL_EXPR_DECL (inside_init);
4406
4407           if (TYPE_DOMAIN (TREE_TYPE (decl)))
4408             {
4409               /* For int foo[] = (int [3]){1}; we need to set array size
4410                  now since later on array initializer will be just the
4411                  brace enclosed list of the compound literal.  */
4412               TYPE_DOMAIN (type) = TYPE_DOMAIN (TREE_TYPE (decl));
4413               layout_type (type);
4414               layout_decl (decl, 0);
4415             }
4416         }
4417     }
4418 }
4419 \f
4420 /* Methods for storing and printing names for error messages.  */
4421
4422 /* Implement a spelling stack that allows components of a name to be pushed
4423    and popped.  Each element on the stack is this structure.  */
4424
4425 struct spelling
4426 {
4427   int kind;
4428   union
4429     {
4430       int i;
4431       const char *s;
4432     } u;
4433 };
4434
4435 #define SPELLING_STRING 1
4436 #define SPELLING_MEMBER 2
4437 #define SPELLING_BOUNDS 3
4438
4439 static struct spelling *spelling;       /* Next stack element (unused).  */
4440 static struct spelling *spelling_base;  /* Spelling stack base.  */
4441 static int spelling_size;               /* Size of the spelling stack.  */
4442
4443 /* Macros to save and restore the spelling stack around push_... functions.
4444    Alternative to SAVE_SPELLING_STACK.  */
4445
4446 #define SPELLING_DEPTH() (spelling - spelling_base)
4447 #define RESTORE_SPELLING_DEPTH(DEPTH) (spelling = spelling_base + (DEPTH))
4448
4449 /* Save and restore the spelling stack around arbitrary C code.  */
4450
4451 #define SAVE_SPELLING_DEPTH(code)               \
4452 {                                               \
4453   int __depth = SPELLING_DEPTH ();              \
4454   code;                                         \
4455   RESTORE_SPELLING_DEPTH (__depth);             \
4456 }
4457
4458 /* Push an element on the spelling stack with type KIND and assign VALUE
4459    to MEMBER.  */
4460
4461 #define PUSH_SPELLING(KIND, VALUE, MEMBER)                              \
4462 {                                                                       \
4463   int depth = SPELLING_DEPTH ();                                        \
4464                                                                         \
4465   if (depth >= spelling_size)                                           \
4466     {                                                                   \
4467       spelling_size += 10;                                              \
4468       if (spelling_base == 0)                                           \
4469         spelling_base                                                   \
4470           = (struct spelling *) xmalloc (spelling_size * sizeof (struct spelling));     \
4471       else                                                              \
4472         spelling_base                                                   \
4473           = (struct spelling *) xrealloc (spelling_base,                \
4474                                           spelling_size * sizeof (struct spelling));    \
4475       RESTORE_SPELLING_DEPTH (depth);                                   \
4476     }                                                                   \
4477                                                                         \
4478   spelling->kind = (KIND);                                              \
4479   spelling->MEMBER = (VALUE);                                           \
4480   spelling++;                                                           \
4481 }
4482
4483 /* Push STRING on the stack.  Printed literally.  */
4484
4485 static void
4486 push_string (string)
4487      const char *string;
4488 {
4489   PUSH_SPELLING (SPELLING_STRING, string, u.s);
4490 }
4491
4492 /* Push a member name on the stack.  Printed as '.' STRING.  */
4493
4494 static void
4495 push_member_name (decl)
4496      tree decl;
4497      
4498 {
4499   const char *const string
4500     = DECL_NAME (decl) ? IDENTIFIER_POINTER (DECL_NAME (decl)) : "<anonymous>";
4501   PUSH_SPELLING (SPELLING_MEMBER, string, u.s);
4502 }
4503
4504 /* Push an array bounds on the stack.  Printed as [BOUNDS].  */
4505
4506 static void
4507 push_array_bounds (bounds)
4508      int bounds;
4509 {
4510   PUSH_SPELLING (SPELLING_BOUNDS, bounds, u.i);
4511 }
4512
4513 /* Compute the maximum size in bytes of the printed spelling.  */
4514
4515 static int
4516 spelling_length ()
4517 {
4518   int size = 0;
4519   struct spelling *p;
4520
4521   for (p = spelling_base; p < spelling; p++)
4522     {
4523       if (p->kind == SPELLING_BOUNDS)
4524         size += 25;
4525       else
4526         size += strlen (p->u.s) + 1;
4527     }
4528
4529   return size;
4530 }
4531
4532 /* Print the spelling to BUFFER and return it.  */
4533
4534 static char *
4535 print_spelling (buffer)
4536      char *buffer;
4537 {
4538   char *d = buffer;
4539   struct spelling *p;
4540
4541   for (p = spelling_base; p < spelling; p++)
4542     if (p->kind == SPELLING_BOUNDS)
4543       {
4544         sprintf (d, "[%d]", p->u.i);
4545         d += strlen (d);
4546       }
4547     else
4548       {
4549         const char *s;
4550         if (p->kind == SPELLING_MEMBER)
4551           *d++ = '.';
4552         for (s = p->u.s; (*d = *s++); d++)
4553           ;
4554       }
4555   *d++ = '\0';
4556   return buffer;
4557 }
4558
4559 /* Issue an error message for a bad initializer component.
4560    MSGID identifies the message.
4561    The component name is taken from the spelling stack.  */
4562
4563 void
4564 error_init (msgid)
4565      const char *msgid;
4566 {
4567   char *ofwhat;
4568
4569   error ("%s", _(msgid));
4570   ofwhat = print_spelling ((char *) alloca (spelling_length () + 1));
4571   if (*ofwhat)
4572     error ("(near initialization for `%s')", ofwhat);
4573 }
4574
4575 /* Issue a pedantic warning for a bad initializer component.
4576    MSGID identifies the message.
4577    The component name is taken from the spelling stack.  */
4578
4579 void
4580 pedwarn_init (msgid)
4581      const char *msgid;
4582 {
4583   char *ofwhat;
4584
4585   pedwarn ("%s", _(msgid));
4586   ofwhat = print_spelling ((char *) alloca (spelling_length () + 1));
4587   if (*ofwhat)
4588     pedwarn ("(near initialization for `%s')", ofwhat);
4589 }
4590
4591 /* Issue a warning for a bad initializer component.
4592    MSGID identifies the message.
4593    The component name is taken from the spelling stack.  */
4594
4595 static void
4596 warning_init (msgid)
4597      const char *msgid;
4598 {
4599   char *ofwhat;
4600
4601   warning ("%s", _(msgid));
4602   ofwhat = print_spelling ((char *) alloca (spelling_length () + 1));
4603   if (*ofwhat)
4604     warning ("(near initialization for `%s')", ofwhat);
4605 }
4606 \f
4607 /* Digest the parser output INIT as an initializer for type TYPE.
4608    Return a C expression of type TYPE to represent the initial value.
4609
4610    The arguments REQUIRE_CONSTANT and CONSTRUCTOR_CONSTANT request errors
4611    if non-constant initializers or elements are seen.  CONSTRUCTOR_CONSTANT
4612    applies only to elements of constructors.  */
4613
4614 static tree
4615 digest_init (type, init, require_constant, constructor_constant)
4616      tree type, init;
4617      int require_constant, constructor_constant;
4618 {
4619   enum tree_code code = TREE_CODE (type);
4620   tree inside_init = init;
4621
4622   if (type == error_mark_node
4623       || init == error_mark_node
4624       || TREE_TYPE (init) == error_mark_node)
4625     return error_mark_node;
4626
4627   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
4628   /* Do not use STRIP_NOPS here.  We do not want an enumerator
4629      whose value is 0 to count as a null pointer constant.  */
4630   if (TREE_CODE (init) == NON_LVALUE_EXPR)
4631     inside_init = TREE_OPERAND (init, 0);
4632
4633   inside_init = fold (inside_init);
4634
4635   /* Initialization of an array of chars from a string constant
4636      optionally enclosed in braces.  */
4637
4638   if (code == ARRAY_TYPE)
4639     {
4640       tree typ1 = TYPE_MAIN_VARIANT (TREE_TYPE (type));
4641       if ((typ1 == char_type_node
4642            || typ1 == signed_char_type_node
4643            || typ1 == unsigned_char_type_node
4644            || typ1 == unsigned_wchar_type_node
4645            || typ1 == signed_wchar_type_node)
4646           && ((inside_init && TREE_CODE (inside_init) == STRING_CST)))
4647         {
4648           if (comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (inside_init)),
4649                          TYPE_MAIN_VARIANT (type)))
4650             return inside_init;
4651
4652           if ((TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (inside_init)))
4653                != char_type_node)
4654               && TYPE_PRECISION (typ1) == TYPE_PRECISION (char_type_node))
4655             {
4656               error_init ("char-array initialized from wide string");
4657               return error_mark_node;
4658             }
4659           if ((TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (inside_init)))
4660                == char_type_node)
4661               && TYPE_PRECISION (typ1) != TYPE_PRECISION (char_type_node))
4662             {
4663               error_init ("int-array initialized from non-wide string");
4664               return error_mark_node;
4665             }
4666
4667           TREE_TYPE (inside_init) = type;
4668           if (TYPE_DOMAIN (type) != 0
4669               && TYPE_SIZE (type) != 0
4670               && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
4671               /* Subtract 1 (or sizeof (wchar_t))
4672                  because it's ok to ignore the terminating null char
4673                  that is counted in the length of the constant.  */
4674               && 0 > compare_tree_int (TYPE_SIZE_UNIT (type),
4675                                        TREE_STRING_LENGTH (inside_init)
4676                                        - ((TYPE_PRECISION (typ1)
4677                                            != TYPE_PRECISION (char_type_node))
4678                                           ? (TYPE_PRECISION (wchar_type_node)
4679                                              / BITS_PER_UNIT)
4680                                           : 1)))
4681             pedwarn_init ("initializer-string for array of chars is too long");
4682
4683           return inside_init;
4684         }
4685     }
4686
4687   /* Any type can be initialized
4688      from an expression of the same type, optionally with braces.  */
4689
4690   if (inside_init && TREE_TYPE (inside_init) != 0
4691       && (comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (inside_init)),
4692                      TYPE_MAIN_VARIANT (type))
4693           || (code == ARRAY_TYPE
4694               && comptypes (TREE_TYPE (inside_init), type))
4695           || (code == VECTOR_TYPE
4696               && comptypes (TREE_TYPE (inside_init), type))
4697           || (code == POINTER_TYPE
4698               && (TREE_CODE (TREE_TYPE (inside_init)) == ARRAY_TYPE
4699                   || TREE_CODE (TREE_TYPE (inside_init)) == FUNCTION_TYPE)
4700               && comptypes (TREE_TYPE (TREE_TYPE (inside_init)),
4701                             TREE_TYPE (type)))))
4702     {
4703       if (code == POINTER_TYPE)
4704         inside_init = default_function_array_conversion (inside_init);
4705
4706       if (require_constant && !flag_isoc99
4707           && TREE_CODE (inside_init) == COMPOUND_LITERAL_EXPR)
4708         {
4709           /* As an extension, allow initializing objects with static storage
4710              duration with compound literals (which are then treated just as
4711              the brace enclosed list they contain).  */
4712           tree decl = COMPOUND_LITERAL_EXPR_DECL (inside_init);
4713           inside_init = DECL_INITIAL (decl);
4714         }
4715
4716       if (code == ARRAY_TYPE && TREE_CODE (inside_init) != STRING_CST
4717           && TREE_CODE (inside_init) != CONSTRUCTOR)
4718         {
4719           error_init ("array initialized from non-constant array expression");
4720           return error_mark_node;
4721         }
4722
4723       if (optimize && TREE_CODE (inside_init) == VAR_DECL)
4724         inside_init = decl_constant_value_for_broken_optimization (inside_init);
4725
4726       /* Compound expressions can only occur here if -pedantic or
4727          -pedantic-errors is specified.  In the later case, we always want
4728          an error.  In the former case, we simply want a warning.  */
4729       if (require_constant && pedantic
4730           && TREE_CODE (inside_init) == COMPOUND_EXPR)
4731         {
4732           inside_init
4733             = valid_compound_expr_initializer (inside_init,
4734                                                TREE_TYPE (inside_init));
4735           if (inside_init == error_mark_node)
4736             error_init ("initializer element is not constant");
4737           else
4738             pedwarn_init ("initializer element is not constant");
4739           if (flag_pedantic_errors)
4740             inside_init = error_mark_node;
4741         }
4742       else if (require_constant 
4743                && (!TREE_CONSTANT (inside_init)
4744                    /* This test catches things like `7 / 0' which
4745                       result in an expression for which TREE_CONSTANT
4746                       is true, but which is not actually something
4747                       that is a legal constant.  We really should not
4748                       be using this function, because it is a part of
4749                       the back-end.  Instead, the expression should
4750                       already have been turned into ERROR_MARK_NODE.  */
4751                    || !initializer_constant_valid_p (inside_init,
4752                                                      TREE_TYPE (inside_init))))
4753         {
4754           error_init ("initializer element is not constant");
4755           inside_init = error_mark_node;
4756         }
4757
4758       return inside_init;
4759     }
4760
4761   /* Handle scalar types, including conversions.  */
4762
4763   if (code == INTEGER_TYPE || code == REAL_TYPE || code == POINTER_TYPE
4764       || code == ENUMERAL_TYPE || code == BOOLEAN_TYPE || code == COMPLEX_TYPE)
4765     {
4766       /* Note that convert_for_assignment calls default_conversion
4767          for arrays and functions.  We must not call it in the
4768          case where inside_init is a null pointer constant.  */
4769       inside_init
4770         = convert_for_assignment (type, init, _("initialization"),
4771                                   NULL_TREE, NULL_TREE, 0);
4772
4773       if (require_constant && ! TREE_CONSTANT (inside_init))
4774         {
4775           error_init ("initializer element is not constant");
4776           inside_init = error_mark_node;
4777         }
4778       else if (require_constant
4779                && initializer_constant_valid_p (inside_init, TREE_TYPE (inside_init)) == 0)
4780         {
4781           error_init ("initializer element is not computable at load time");
4782           inside_init = error_mark_node;
4783         }
4784
4785       return inside_init;
4786     }
4787
4788   /* Come here only for records and arrays.  */
4789
4790   if (COMPLETE_TYPE_P (type) && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
4791     {
4792       error_init ("variable-sized object may not be initialized");
4793       return error_mark_node;
4794     }
4795
4796   error_init ("invalid initializer");
4797   return error_mark_node;
4798 }
4799 \f
4800 /* Handle initializers that use braces.  */
4801
4802 /* Type of object we are accumulating a constructor for.
4803    This type is always a RECORD_TYPE, UNION_TYPE or ARRAY_TYPE.  */
4804 static tree constructor_type;
4805
4806 /* For a RECORD_TYPE or UNION_TYPE, this is the chain of fields
4807    left to fill.  */
4808 static tree constructor_fields;
4809
4810 /* For an ARRAY_TYPE, this is the specified index
4811    at which to store the next element we get.  */
4812 static tree constructor_index;
4813
4814 /* For an ARRAY_TYPE, this is the maximum index.  */
4815 static tree constructor_max_index;
4816
4817 /* For a RECORD_TYPE, this is the first field not yet written out.  */
4818 static tree constructor_unfilled_fields;
4819
4820 /* For an ARRAY_TYPE, this is the index of the first element
4821    not yet written out.  */
4822 static tree constructor_unfilled_index;
4823
4824 /* In a RECORD_TYPE, the byte index of the next consecutive field.
4825    This is so we can generate gaps between fields, when appropriate.  */
4826 static tree constructor_bit_index;
4827
4828 /* If we are saving up the elements rather than allocating them,
4829    this is the list of elements so far (in reverse order,
4830    most recent first).  */
4831 static tree constructor_elements;
4832
4833 /* 1 if constructor should be incrementally stored into a constructor chain,
4834    0 if all the elements should be kept in AVL tree.  */
4835 static int constructor_incremental;
4836
4837 /* 1 if so far this constructor's elements are all compile-time constants.  */
4838 static int constructor_constant;
4839
4840 /* 1 if so far this constructor's elements are all valid address constants.  */
4841 static int constructor_simple;
4842
4843 /* 1 if this constructor is erroneous so far.  */
4844 static int constructor_erroneous;
4845
4846 /* 1 if have called defer_addressed_constants.  */
4847 static int constructor_subconstants_deferred;
4848
4849 /* Structure for managing pending initializer elements, organized as an
4850    AVL tree.  */
4851
4852 struct init_node
4853 {
4854   struct init_node *left, *right;
4855   struct init_node *parent;
4856   int balance;
4857   tree purpose;
4858   tree value;
4859 };
4860
4861 /* Tree of pending elements at this constructor level.
4862    These are elements encountered out of order
4863    which belong at places we haven't reached yet in actually
4864    writing the output.
4865    Will never hold tree nodes across GC runs.  */
4866 static struct init_node *constructor_pending_elts;
4867
4868 /* The SPELLING_DEPTH of this constructor.  */
4869 static int constructor_depth;
4870
4871 /* 0 if implicitly pushing constructor levels is allowed.  */
4872 int constructor_no_implicit = 0; /* 0 for C; 1 for some other languages.  */
4873
4874 static int require_constant_value;
4875 static int require_constant_elements;
4876
4877 /* DECL node for which an initializer is being read.
4878    0 means we are reading a constructor expression
4879    such as (struct foo) {...}.  */
4880 static tree constructor_decl;
4881
4882 /* start_init saves the ASMSPEC arg here for really_start_incremental_init.  */
4883 static const char *constructor_asmspec;
4884
4885 /* Nonzero if this is an initializer for a top-level decl.  */
4886 static int constructor_top_level;
4887
4888 /* Nonzero if there were any member designators in this initializer.  */
4889 static int constructor_designated;
4890
4891 /* Nesting depth of designator list.  */
4892 static int designator_depth;
4893
4894 /* Nonzero if there were diagnosed errors in this designator list.  */
4895 static int designator_errorneous;
4896
4897 \f
4898 /* This stack has a level for each implicit or explicit level of
4899    structuring in the initializer, including the outermost one.  It
4900    saves the values of most of the variables above.  */
4901
4902 struct constructor_range_stack;
4903
4904 struct constructor_stack
4905 {
4906   struct constructor_stack *next;
4907   tree type;
4908   tree fields;
4909   tree index;
4910   tree max_index;
4911   tree unfilled_index;
4912   tree unfilled_fields;
4913   tree bit_index;
4914   tree elements;
4915   struct init_node *pending_elts;
4916   int offset;
4917   int depth;
4918   /* If nonzero, this value should replace the entire
4919      constructor at this level.  */
4920   tree replacement_value;
4921   struct constructor_range_stack *range_stack;
4922   char constant;
4923   char simple;
4924   char implicit;
4925   char erroneous;
4926   char outer;
4927   char incremental;
4928   char designated;
4929 };
4930
4931 struct constructor_stack *constructor_stack;
4932
4933 /* This stack represents designators from some range designator up to
4934    the last designator in the list.  */
4935
4936 struct constructor_range_stack
4937 {
4938   struct constructor_range_stack *next, *prev;
4939   struct constructor_stack *stack;
4940   tree range_start;
4941   tree index;
4942   tree range_end;
4943   tree fields;
4944 };
4945
4946 struct constructor_range_stack *constructor_range_stack;
4947
4948 /* This stack records separate initializers that are nested.
4949    Nested initializers can't happen in ANSI C, but GNU C allows them
4950    in cases like { ... (struct foo) { ... } ... }.  */
4951
4952 struct initializer_stack
4953 {
4954   struct initializer_stack *next;
4955   tree decl;
4956   const char *asmspec;
4957   struct constructor_stack *constructor_stack;
4958   struct constructor_range_stack *constructor_range_stack;
4959   tree elements;
4960   struct spelling *spelling;
4961   struct spelling *spelling_base;
4962   int spelling_size;
4963   char top_level;
4964   char require_constant_value;
4965   char require_constant_elements;
4966   char deferred;
4967 };
4968
4969 struct initializer_stack *initializer_stack;
4970 \f
4971 /* Prepare to parse and output the initializer for variable DECL.  */
4972
4973 void
4974 start_init (decl, asmspec_tree, top_level)
4975      tree decl;
4976      tree asmspec_tree;
4977      int top_level;
4978 {
4979   const char *locus;
4980   struct initializer_stack *p
4981     = (struct initializer_stack *) xmalloc (sizeof (struct initializer_stack));
4982   const char *asmspec = 0;
4983
4984   if (asmspec_tree)
4985     asmspec = TREE_STRING_POINTER (asmspec_tree);
4986
4987   p->decl = constructor_decl;
4988   p->asmspec = constructor_asmspec;
4989   p->require_constant_value = require_constant_value;
4990   p->require_constant_elements = require_constant_elements;
4991   p->constructor_stack = constructor_stack;
4992   p->constructor_range_stack = constructor_range_stack;
4993   p->elements = constructor_elements;
4994   p->spelling = spelling;
4995   p->spelling_base = spelling_base;
4996   p->spelling_size = spelling_size;
4997   p->deferred = constructor_subconstants_deferred;
4998   p->top_level = constructor_top_level;
4999   p->next = initializer_stack;
5000   initializer_stack = p;
5001
5002   constructor_decl = decl;
5003   constructor_asmspec = asmspec;
5004   constructor_subconstants_deferred = 0;
5005   constructor_designated = 0;
5006   constructor_top_level = top_level;
5007
5008   if (decl != 0)
5009     {
5010       require_constant_value = TREE_STATIC (decl);
5011       require_constant_elements
5012         = ((TREE_STATIC (decl) || (pedantic && !flag_isoc99))
5013            /* For a scalar, you can always use any value to initialize,
5014               even within braces.  */
5015            && (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
5016                || TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
5017                || TREE_CODE (TREE_TYPE (decl)) == UNION_TYPE
5018                || TREE_CODE (TREE_TYPE (decl)) == QUAL_UNION_TYPE));
5019       locus = IDENTIFIER_POINTER (DECL_NAME (decl));
5020     }
5021   else
5022     {
5023       require_constant_value = 0;
5024       require_constant_elements = 0;
5025       locus = "(anonymous)";
5026     }
5027
5028   constructor_stack = 0;
5029   constructor_range_stack = 0;
5030
5031   missing_braces_mentioned = 0;
5032
5033   spelling_base = 0;
5034   spelling_size = 0;
5035   RESTORE_SPELLING_DEPTH (0);
5036
5037   if (locus)
5038     push_string (locus);
5039 }
5040
5041 void
5042 finish_init ()
5043 {
5044   struct initializer_stack *p = initializer_stack;
5045
5046   /* Output subconstants (string constants, usually)
5047      that were referenced within this initializer and saved up.
5048      Must do this if and only if we called defer_addressed_constants.  */
5049   if (constructor_subconstants_deferred)
5050     output_deferred_addressed_constants ();
5051
5052   /* Free the whole constructor stack of this initializer.  */
5053   while (constructor_stack)
5054     {
5055       struct constructor_stack *q = constructor_stack;
5056       constructor_stack = q->next;
5057       free (q);
5058     }
5059
5060   if (constructor_range_stack)
5061     abort ();
5062
5063   /* Pop back to the data of the outer initializer (if any).  */
5064   constructor_decl = p->decl;
5065   constructor_asmspec = p->asmspec;
5066   require_constant_value = p->require_constant_value;
5067   require_constant_elements = p->require_constant_elements;
5068   constructor_stack = p->constructor_stack;
5069   constructor_range_stack = p->constructor_range_stack;
5070   constructor_elements = p->elements;
5071   spelling = p->spelling;
5072   spelling_base = p->spelling_base;
5073   spelling_size = p->spelling_size;
5074   constructor_subconstants_deferred = p->deferred;
5075   constructor_top_level = p->top_level;
5076   initializer_stack = p->next;
5077   free (p);
5078 }
5079 \f
5080 /* Call here when we see the initializer is surrounded by braces.
5081    This is instead of a call to push_init_level;
5082    it is matched by a call to pop_init_level.
5083
5084    TYPE is the type to initialize, for a constructor expression.
5085    For an initializer for a decl, TYPE is zero.  */
5086
5087 void
5088 really_start_incremental_init (type)
5089      tree type;
5090 {
5091   struct constructor_stack *p
5092     = (struct constructor_stack *) xmalloc (sizeof (struct constructor_stack));
5093
5094   if (type == 0)
5095     type = TREE_TYPE (constructor_decl);
5096
5097   p->type = constructor_type;
5098   p->fields = constructor_fields;
5099   p->index = constructor_index;
5100   p->max_index = constructor_max_index;
5101   p->unfilled_index = constructor_unfilled_index;
5102   p->unfilled_fields = constructor_unfilled_fields;
5103   p->bit_index = constructor_bit_index;
5104   p->elements = constructor_elements;
5105   p->constant = constructor_constant;
5106   p->simple = constructor_simple;
5107   p->erroneous = constructor_erroneous;
5108   p->pending_elts = constructor_pending_elts;
5109   p->depth = constructor_depth;
5110   p->replacement_value = 0;
5111   p->implicit = 0;
5112   p->range_stack = 0;
5113   p->outer = 0;
5114   p->incremental = constructor_incremental;
5115   p->designated = constructor_designated;
5116   p->next = 0;
5117   constructor_stack = p;
5118
5119   constructor_constant = 1;
5120   constructor_simple = 1;
5121   constructor_depth = SPELLING_DEPTH ();
5122   constructor_elements = 0;
5123   constructor_pending_elts = 0;
5124   constructor_type = type;
5125   constructor_incremental = 1;
5126   constructor_designated = 0;
5127   designator_depth = 0;
5128   designator_errorneous = 0;
5129
5130   if (TREE_CODE (constructor_type) == RECORD_TYPE
5131       || TREE_CODE (constructor_type) == UNION_TYPE)
5132     {
5133       constructor_fields = TYPE_FIELDS (constructor_type);
5134       /* Skip any nameless bit fields at the beginning.  */
5135       while (constructor_fields != 0 && DECL_C_BIT_FIELD (constructor_fields)
5136              && DECL_NAME (constructor_fields) == 0)
5137         constructor_fields = TREE_CHAIN (constructor_fields);
5138
5139       constructor_unfilled_fields = constructor_fields;
5140       constructor_bit_index = bitsize_zero_node;
5141     }
5142   else if (TREE_CODE (constructor_type) == ARRAY_TYPE)
5143     {
5144       if (TYPE_DOMAIN (constructor_type))
5145         {
5146           constructor_max_index
5147             = TYPE_MAX_VALUE (TYPE_DOMAIN (constructor_type));
5148
5149           /* Detect non-empty initializations of zero-length arrays.  */
5150           if (constructor_max_index == NULL_TREE
5151               && TYPE_SIZE (constructor_type))
5152             constructor_max_index = build_int_2 (-1, -1);
5153
5154           /* constructor_max_index needs to be an INTEGER_CST.  Attempts
5155              to initialize VLAs will cause an proper error; avoid tree
5156              checking errors as well by setting a safe value.  */
5157           if (constructor_max_index
5158               && TREE_CODE (constructor_max_index) != INTEGER_CST)
5159             constructor_max_index = build_int_2 (-1, -1);
5160
5161           constructor_index
5162             = convert (bitsizetype,
5163                        TYPE_MIN_VALUE (TYPE_DOMAIN (constructor_type)));
5164         }
5165       else
5166         constructor_index = bitsize_zero_node;
5167
5168       constructor_unfilled_index = constructor_index;
5169     }
5170   else if (TREE_CODE (constructor_type) == VECTOR_TYPE)
5171     {
5172       /* Vectors are like simple fixed-size arrays.  */
5173       constructor_max_index =
5174         build_int_2 (TYPE_VECTOR_SUBPARTS (constructor_type) - 1, 0);
5175       constructor_index = convert (bitsizetype, bitsize_zero_node);
5176       constructor_unfilled_index = constructor_index;
5177     }
5178   else
5179     {
5180       /* Handle the case of int x = {5}; */
5181       constructor_fields = constructor_type;
5182       constructor_unfilled_fields = constructor_type;
5183     }
5184 }
5185 \f
5186 /* Push down into a subobject, for initialization.
5187    If this is for an explicit set of braces, IMPLICIT is 0.
5188    If it is because the next element belongs at a lower level,
5189    IMPLICIT is 1 (or 2 if the push is because of designator list).  */
5190
5191 void
5192 push_init_level (implicit)
5193      int implicit;
5194 {
5195   struct constructor_stack *p;
5196   tree value = NULL_TREE;
5197
5198   /* If we've exhausted any levels that didn't have braces,
5199      pop them now.  */
5200   while (constructor_stack->implicit)
5201     {
5202       if ((TREE_CODE (constructor_type) == RECORD_TYPE
5203            || TREE_CODE (constructor_type) == UNION_TYPE)
5204           && constructor_fields == 0)
5205         process_init_element (pop_init_level (1));
5206       else if (TREE_CODE (constructor_type) == ARRAY_TYPE
5207                && tree_int_cst_lt (constructor_max_index, constructor_index))
5208         process_init_element (pop_init_level (1));
5209       else
5210         break;
5211     }
5212
5213   /* Unless this is an explicit brace, we need to preserve previous
5214      content if any.  */
5215   if (implicit)
5216     {
5217       if ((TREE_CODE (constructor_type) == RECORD_TYPE
5218            || TREE_CODE (constructor_type) == UNION_TYPE)
5219           && constructor_fields)
5220         value = find_init_member (constructor_fields);
5221       else if (TREE_CODE (constructor_type) == ARRAY_TYPE)
5222         value = find_init_member (constructor_index);
5223     }
5224
5225   p = (struct constructor_stack *) xmalloc (sizeof (struct constructor_stack));
5226   p->type = constructor_type;
5227   p->fields = constructor_fields;
5228   p->index = constructor_index;
5229   p->max_index = constructor_max_index;
5230   p->unfilled_index = constructor_unfilled_index;
5231   p->unfilled_fields = constructor_unfilled_fields;
5232   p->bit_index = constructor_bit_index;
5233   p->elements = constructor_elements;
5234   p->constant = constructor_constant;
5235   p->simple = constructor_simple;
5236   p->erroneous = constructor_erroneous;
5237   p->pending_elts = constructor_pending_elts;
5238   p->depth = constructor_depth;
5239   p->replacement_value = 0;
5240   p->implicit = implicit;
5241   p->outer = 0;
5242   p->incremental = constructor_incremental;
5243   p->designated = constructor_designated;
5244   p->next = constructor_stack;
5245   p->range_stack = 0;
5246   constructor_stack = p;
5247
5248   constructor_constant = 1;
5249   constructor_simple = 1;
5250   constructor_depth = SPELLING_DEPTH ();
5251   constructor_elements = 0;
5252   constructor_incremental = 1;
5253   constructor_designated = 0;
5254   constructor_pending_elts = 0;
5255   if (!implicit)
5256     {
5257       p->range_stack = constructor_range_stack;
5258       constructor_range_stack = 0;
5259       designator_depth = 0;
5260       designator_errorneous = 0;
5261     }
5262
5263   /* Don't die if an entire brace-pair level is superfluous
5264      in the containing level.  */
5265   if (constructor_type == 0)
5266     ;
5267   else if (TREE_CODE (constructor_type) == RECORD_TYPE
5268            || TREE_CODE (constructor_type) == UNION_TYPE)
5269     {
5270       /* Don't die if there are extra init elts at the end.  */
5271       if (constructor_fields == 0)
5272         constructor_type = 0;
5273       else
5274         {
5275           constructor_type = TREE_TYPE (constructor_fields);
5276           push_member_name (constructor_fields);
5277           constructor_depth++;
5278         }
5279     }
5280   else if (TREE_CODE (constructor_type) == ARRAY_TYPE)
5281     {
5282       constructor_type = TREE_TYPE (constructor_type);
5283       push_array_bounds (tree_low_cst (constructor_index, 0));
5284       constructor_depth++;
5285     }
5286
5287   if (constructor_type == 0)
5288     {
5289       error_init ("extra brace group at end of initializer");
5290       constructor_fields = 0;
5291       constructor_unfilled_fields = 0;
5292       return;
5293     }
5294
5295   if (value && TREE_CODE (value) == CONSTRUCTOR)
5296     {
5297       constructor_constant = TREE_CONSTANT (value);
5298       constructor_simple = TREE_STATIC (value);
5299       constructor_elements = TREE_OPERAND (value, 1);
5300       if (constructor_elements
5301           && (TREE_CODE (constructor_type) == RECORD_TYPE
5302               || TREE_CODE (constructor_type) == ARRAY_TYPE))
5303         set_nonincremental_init ();
5304     }
5305
5306   if (implicit == 1 && warn_missing_braces && !missing_braces_mentioned)
5307     {
5308       missing_braces_mentioned = 1;
5309       warning_init ("missing braces around initializer");
5310     }
5311
5312   if (TREE_CODE (constructor_type) == RECORD_TYPE
5313            || TREE_CODE (constructor_type) == UNION_TYPE)
5314     {
5315       constructor_fields = TYPE_FIELDS (constructor_type);
5316       /* Skip any nameless bit fields at the beginning.  */
5317       while (constructor_fields != 0 && DECL_C_BIT_FIELD (constructor_fields)
5318              && DECL_NAME (constructor_fields) == 0)
5319         constructor_fields = TREE_CHAIN (constructor_fields);
5320
5321       constructor_unfilled_fields = constructor_fields;
5322       constructor_bit_index = bitsize_zero_node;
5323     }
5324   else if (TREE_CODE (constructor_type) == VECTOR_TYPE)
5325     {
5326       /* Vectors are like simple fixed-size arrays.  */
5327       constructor_max_index =
5328         build_int_2 (TYPE_VECTOR_SUBPARTS (constructor_type) - 1, 0);
5329       constructor_index = convert (bitsizetype, integer_zero_node);
5330       constructor_unfilled_index = constructor_index;
5331     }
5332   else if (TREE_CODE (constructor_type) == ARRAY_TYPE)
5333     {
5334       if (TYPE_DOMAIN (constructor_type))
5335         {
5336           constructor_max_index
5337             = TYPE_MAX_VALUE (TYPE_DOMAIN (constructor_type));
5338
5339           /* Detect non-empty initializations of zero-length arrays.  */
5340           if (constructor_max_index == NULL_TREE
5341               && TYPE_SIZE (constructor_type))
5342             constructor_max_index = build_int_2 (-1, -1);
5343
5344           /* constructor_max_index needs to be an INTEGER_CST.  Attempts
5345              to initialize VLAs will cause an proper error; avoid tree
5346              checking errors as well by setting a safe value.  */
5347           if (constructor_max_index
5348               && TREE_CODE (constructor_max_index) != INTEGER_CST)
5349             constructor_max_index = build_int_2 (-1, -1);
5350
5351           constructor_index
5352             = convert (bitsizetype, 
5353                        TYPE_MIN_VALUE (TYPE_DOMAIN (constructor_type)));
5354         }
5355       else
5356         constructor_index = bitsize_zero_node;
5357
5358       constructor_unfilled_index = constructor_index;
5359       if (value && TREE_CODE (value) == STRING_CST)
5360         {
5361           /* We need to split the char/wchar array into individual
5362              characters, so that we don't have to special case it
5363              everywhere.  */
5364           set_nonincremental_init_from_string (value);
5365         }
5366     }
5367   else
5368     {
5369       warning_init ("braces around scalar initializer");
5370       constructor_fields = constructor_type;
5371       constructor_unfilled_fields = constructor_type;
5372     }
5373 }
5374
5375 /* At the end of an implicit or explicit brace level, 
5376    finish up that level of constructor.
5377    If we were outputting the elements as they are read, return 0
5378    from inner levels (process_init_element ignores that),
5379    but return error_mark_node from the outermost level
5380    (that's what we want to put in DECL_INITIAL).
5381    Otherwise, return a CONSTRUCTOR expression.  */
5382
5383 tree
5384 pop_init_level (implicit)
5385      int implicit;
5386 {
5387   struct constructor_stack *p;
5388   tree constructor = 0;
5389
5390   if (implicit == 0)
5391     {
5392       /* When we come to an explicit close brace,
5393          pop any inner levels that didn't have explicit braces.  */
5394       while (constructor_stack->implicit)
5395         process_init_element (pop_init_level (1));
5396
5397       if (constructor_range_stack)
5398         abort ();
5399     }
5400
5401   p = constructor_stack;
5402
5403   /* Error for initializing a flexible array member, or a zero-length
5404      array member in an inappropriate context.  */
5405   if (constructor_type && constructor_fields
5406       && TREE_CODE (constructor_type) == ARRAY_TYPE
5407       && TYPE_DOMAIN (constructor_type)
5408       && ! TYPE_MAX_VALUE (TYPE_DOMAIN (constructor_type)))
5409     {
5410       /* Silently discard empty initializations.  The parser will
5411          already have pedwarned for empty brackets.  */
5412       if (integer_zerop (constructor_unfilled_index))
5413         constructor_type = NULL_TREE;
5414       else if (! TYPE_SIZE (constructor_type))
5415         {
5416           if (constructor_depth > 2)
5417             error_init ("initialization of flexible array member in a nested context");
5418           else if (pedantic)
5419             pedwarn_init ("initialization of a flexible array member");
5420
5421           /* We have already issued an error message for the existence
5422              of a flexible array member not at the end of the structure.
5423              Discard the initializer so that we do not abort later.  */
5424           if (TREE_CHAIN (constructor_fields) != NULL_TREE)
5425             constructor_type = NULL_TREE;
5426         }
5427       else
5428         /* Zero-length arrays are no longer special, so we should no longer
5429            get here.  */
5430         abort ();
5431     }
5432
5433   /* Warn when some struct elements are implicitly initialized to zero.  */
5434   if (extra_warnings
5435       && constructor_type
5436       && TREE_CODE (constructor_type) == RECORD_TYPE
5437       && constructor_unfilled_fields)
5438     {
5439         /* Do not warn for flexible array members or zero-length arrays.  */
5440         while (constructor_unfilled_fields
5441                && (! DECL_SIZE (constructor_unfilled_fields)
5442                    || integer_zerop (DECL_SIZE (constructor_unfilled_fields))))
5443           constructor_unfilled_fields = TREE_CHAIN (constructor_unfilled_fields);
5444
5445         /* Do not warn if this level of the initializer uses member
5446            designators; it is likely to be deliberate.  */
5447         if (constructor_unfilled_fields && !constructor_designated)
5448           {
5449             push_member_name (constructor_unfilled_fields);
5450             warning_init ("missing initializer");
5451             RESTORE_SPELLING_DEPTH (constructor_depth);
5452           }
5453     }
5454
5455   /* Now output all pending elements.  */
5456   constructor_incremental = 1;
5457   output_pending_init_elements (1);
5458
5459   /* Pad out the end of the structure.  */
5460   if (p->replacement_value)
5461     /* If this closes a superfluous brace pair,
5462        just pass out the element between them.  */
5463     constructor = p->replacement_value;
5464   else if (constructor_type == 0)
5465     ;
5466   else if (TREE_CODE (constructor_type) != RECORD_TYPE
5467            && TREE_CODE (constructor_type) != UNION_TYPE
5468            && TREE_CODE (constructor_type) != ARRAY_TYPE
5469            && TREE_CODE (constructor_type) != VECTOR_TYPE)
5470     {
5471       /* A nonincremental scalar initializer--just return
5472          the element, after verifying there is just one.  */
5473       if (constructor_elements == 0)
5474         {
5475           if (!constructor_erroneous)
5476             error_init ("empty scalar initializer");
5477           constructor = error_mark_node;
5478         }
5479       else if (TREE_CHAIN (constructor_elements) != 0)
5480         {
5481           error_init ("extra elements in scalar initializer");
5482           constructor = TREE_VALUE (constructor_elements);
5483         }
5484       else
5485         constructor = TREE_VALUE (constructor_elements);
5486     }
5487   else
5488     {
5489       if (constructor_erroneous)
5490         constructor = error_mark_node;
5491       else
5492         {
5493           constructor = build (CONSTRUCTOR, constructor_type, NULL_TREE,
5494                                nreverse (constructor_elements));
5495           if (constructor_constant)
5496             TREE_CONSTANT (constructor) = 1;
5497           if (constructor_constant && constructor_simple)
5498             TREE_STATIC (constructor) = 1;
5499         }
5500     }
5501
5502   constructor_type = p->type;
5503   constructor_fields = p->fields;
5504   constructor_index = p->index;
5505   constructor_max_index = p->max_index;
5506   constructor_unfilled_index = p->unfilled_index;
5507   constructor_unfilled_fields = p->unfilled_fields;
5508   constructor_bit_index = p->bit_index;
5509   constructor_elements = p->elements;
5510   constructor_constant = p->constant;
5511   constructor_simple = p->simple;
5512   constructor_erroneous = p->erroneous;
5513   constructor_incremental = p->incremental;
5514   constructor_designated = p->designated;
5515   constructor_pending_elts = p->pending_elts;
5516   constructor_depth = p->depth;
5517   if (!p->implicit)
5518     constructor_range_stack = p->range_stack;
5519   RESTORE_SPELLING_DEPTH (constructor_depth);
5520
5521   constructor_stack = p->next;
5522   free (p);
5523
5524   if (constructor == 0)
5525     {
5526       if (constructor_stack == 0)
5527         return error_mark_node;
5528       return NULL_TREE;
5529     }
5530   return constructor;
5531 }
5532
5533 /* Common handling for both array range and field name designators.
5534    ARRAY argument is non-zero for array ranges.  Returns zero for success.  */
5535
5536 static int
5537 set_designator (array)
5538      int array;
5539 {
5540   tree subtype;
5541   enum tree_code subcode;
5542
5543   /* Don't die if an entire brace-pair level is superfluous
5544      in the containing level.  */
5545   if (constructor_type == 0)
5546     return 1;
5547
5548   /* If there were errors in this designator list already, bail out silently.  */
5549   if (designator_errorneous)
5550     return 1;
5551
5552   if (!designator_depth)
5553     {
5554       if (constructor_range_stack)
5555         abort ();
5556
5557       /* Designator list starts at the level of closest explicit
5558          braces.  */
5559       while (constructor_stack->implicit)
5560         process_init_element (pop_init_level (1));
5561       constructor_designated = 1;
5562       return 0;
5563     }
5564
5565   if (constructor_no_implicit)
5566     {
5567       error_init ("initialization designators may not nest");
5568       return 1;
5569     }
5570
5571   if (TREE_CODE (constructor_type) == RECORD_TYPE
5572       || TREE_CODE (constructor_type) == UNION_TYPE)
5573     {
5574       subtype = TREE_TYPE (constructor_fields);
5575       if (subtype != error_mark_node)
5576         subtype = TYPE_MAIN_VARIANT (subtype);
5577     }
5578   else if (TREE_CODE (constructor_type) == ARRAY_TYPE)
5579     {
5580       subtype = TYPE_MAIN_VARIANT (TREE_TYPE (constructor_type));
5581     }
5582   else
5583     abort ();
5584
5585   subcode = TREE_CODE (subtype);
5586   if (array && subcode != ARRAY_TYPE)
5587     {
5588       error_init ("array index in non-array initializer");
5589       return 1;
5590     }
5591   else if (!array && subcode != RECORD_TYPE && subcode != UNION_TYPE)
5592     {
5593       error_init ("field name not in record or union initializer");
5594       return 1;
5595     }
5596
5597   constructor_designated = 1;
5598   push_init_level (2);
5599   return 0;
5600 }
5601
5602 /* If there are range designators in designator list, push a new designator
5603    to constructor_range_stack.  RANGE_END is end of such stack range or
5604    NULL_TREE if there is no range designator at this level.  */
5605
5606 static void
5607 push_range_stack (range_end)
5608      tree range_end;
5609 {
5610   struct constructor_range_stack *p;
5611
5612   p = (struct constructor_range_stack *)
5613       ggc_alloc (sizeof (struct constructor_range_stack));
5614   p->prev = constructor_range_stack;
5615   p->next = 0;
5616   p->fields = constructor_fields;
5617   p->range_start = constructor_index;
5618   p->index = constructor_index;
5619   p->stack = constructor_stack;
5620   p->range_end = range_end;
5621   if (constructor_range_stack)
5622     constructor_range_stack->next = p;
5623   constructor_range_stack = p;
5624 }
5625
5626 /* Within an array initializer, specify the next index to be initialized.
5627    FIRST is that index.  If LAST is nonzero, then initialize a range
5628    of indices, running from FIRST through LAST.  */
5629
5630 void
5631 set_init_index (first, last)
5632      tree first, last;
5633 {
5634   if (set_designator (1))
5635     return;
5636
5637   designator_errorneous = 1;
5638
5639   while ((TREE_CODE (first) == NOP_EXPR
5640           || TREE_CODE (first) == CONVERT_EXPR
5641           || TREE_CODE (first) == NON_LVALUE_EXPR)
5642          && (TYPE_MODE (TREE_TYPE (first))
5643              == TYPE_MODE (TREE_TYPE (TREE_OPERAND (first, 0)))))
5644     first = TREE_OPERAND (first, 0);
5645
5646   if (last)
5647     while ((TREE_CODE (last) == NOP_EXPR
5648             || TREE_CODE (last) == CONVERT_EXPR
5649             || TREE_CODE (last) == NON_LVALUE_EXPR)
5650            && (TYPE_MODE (TREE_TYPE (last))
5651                == TYPE_MODE (TREE_TYPE (TREE_OPERAND (last, 0)))))
5652       last = TREE_OPERAND (last, 0);
5653
5654   if (TREE_CODE (first) != INTEGER_CST)
5655     error_init ("nonconstant array index in initializer");
5656   else if (last != 0 && TREE_CODE (last) != INTEGER_CST)
5657     error_init ("nonconstant array index in initializer");
5658   else if (TREE_CODE (constructor_type) != ARRAY_TYPE)
5659     error_init ("array index in non-array initializer");
5660   else if (constructor_max_index
5661            && tree_int_cst_lt (constructor_max_index, first))
5662     error_init ("array index in initializer exceeds array bounds");
5663   else
5664     {
5665       constructor_index = convert (bitsizetype, first);
5666
5667       if (last)
5668         {
5669           if (tree_int_cst_equal (first, last))
5670             last = 0;
5671           else if (tree_int_cst_lt (last, first))
5672             {
5673               error_init ("empty index range in initializer");
5674               last = 0;
5675             }
5676           else
5677             {
5678               last = convert (bitsizetype, last);
5679               if (constructor_max_index != 0
5680                   && tree_int_cst_lt (constructor_max_index, last))
5681                 {
5682                   error_init ("array index range in initializer exceeds array bounds");
5683                   last = 0;
5684                 }
5685             }
5686         }
5687
5688       designator_depth++;
5689       designator_errorneous = 0;
5690       if (constructor_range_stack || last)
5691         push_range_stack (last);
5692     }
5693 }
5694
5695 /* Within a struct initializer, specify the next field to be initialized.  */
5696
5697 void
5698 set_init_label (fieldname)
5699      tree fieldname;
5700 {
5701   tree tail;
5702
5703   if (set_designator (0))
5704     return;
5705
5706   designator_errorneous = 1;
5707
5708   if (TREE_CODE (constructor_type) != RECORD_TYPE
5709       && TREE_CODE (constructor_type) != UNION_TYPE)
5710     {
5711       error_init ("field name not in record or union initializer");
5712       return;
5713     }
5714     
5715   for (tail = TYPE_FIELDS (constructor_type); tail;
5716        tail = TREE_CHAIN (tail))
5717     {
5718       if (DECL_NAME (tail) == fieldname)
5719         break;
5720     }
5721
5722   if (tail == 0)
5723     error ("unknown field `%s' specified in initializer",
5724            IDENTIFIER_POINTER (fieldname));
5725   else
5726     {
5727       constructor_fields = tail;
5728       designator_depth++;
5729       designator_errorneous = 0;
5730       if (constructor_range_stack)
5731         push_range_stack (NULL_TREE);
5732     }
5733 }
5734 \f
5735 /* Add a new initializer to the tree of pending initializers.  PURPOSE
5736    identifies the initializer, either array index or field in a structure. 
5737    VALUE is the value of that index or field.  */
5738
5739 static void
5740 add_pending_init (purpose, value)
5741      tree purpose, value;
5742 {
5743   struct init_node *p, **q, *r;
5744
5745   q = &constructor_pending_elts;
5746   p = 0;
5747
5748   if (TREE_CODE (constructor_type) == ARRAY_TYPE)
5749     {
5750       while (*q != 0)
5751         {
5752           p = *q;
5753           if (tree_int_cst_lt (purpose, p->purpose))
5754             q = &p->left;
5755           else if (tree_int_cst_lt (p->purpose, purpose))
5756             q = &p->right;
5757           else
5758             {
5759               if (TREE_SIDE_EFFECTS (p->value))
5760                 warning_init ("initialized field with side-effects overwritten");
5761               p->value = value;
5762               return;
5763             }
5764         }
5765     }
5766   else
5767     {
5768       tree bitpos;
5769
5770       bitpos = bit_position (purpose);
5771       while (*q != NULL)
5772         {
5773           p = *q;
5774           if (tree_int_cst_lt (bitpos, bit_position (p->purpose)))
5775             q = &p->left;
5776           else if (p->purpose != purpose)
5777             q = &p->right;
5778           else
5779             {
5780               if (TREE_SIDE_EFFECTS (p->value))
5781                 warning_init ("initialized field with side-effects overwritten");
5782               p->value = value;
5783               return;
5784             }
5785         }
5786     }
5787
5788   r = (struct init_node *) ggc_alloc (sizeof (struct init_node));
5789   r->purpose = purpose;
5790   r->value = value;
5791
5792   *q = r;
5793   r->parent = p;
5794   r->left = 0;
5795   r->right = 0;
5796   r->balance = 0;
5797
5798   while (p)
5799     {
5800       struct init_node *s;
5801
5802       if (r == p->left)
5803         {
5804           if (p->balance == 0)
5805             p->balance = -1;
5806           else if (p->balance < 0)
5807             {
5808               if (r->balance < 0)
5809                 {
5810                   /* L rotation.  */
5811                   p->left = r->right;
5812                   if (p->left)
5813                     p->left->parent = p;
5814                   r->right = p;
5815
5816                   p->balance = 0;
5817                   r->balance = 0;
5818
5819                   s = p->parent;
5820                   p->parent = r;
5821                   r->parent = s;
5822                   if (s)
5823                     {
5824                       if (s->left == p)
5825                         s->left = r;
5826                       else
5827                         s->right = r;
5828                     }
5829                   else
5830                     constructor_pending_elts = r;
5831                 }
5832               else
5833                 {
5834                   /* LR rotation.  */
5835                   struct init_node *t = r->right;
5836
5837                   r->right = t->left;
5838                   if (r->right)
5839                     r->right->parent = r;
5840                   t->left = r;
5841
5842                   p->left = t->right;
5843                   if (p->left)
5844                     p->left->parent = p;
5845                   t->right = p;
5846
5847                   p->balance = t->balance < 0;
5848                   r->balance = -(t->balance > 0);
5849                   t->balance = 0;
5850
5851                   s = p->parent;
5852                   p->parent = t;
5853                   r->parent = t;
5854                   t->parent = s;
5855                   if (s)
5856                     {
5857                       if (s->left == p)
5858                         s->left = t;
5859                       else
5860                         s->right = t;
5861                     }
5862                   else
5863                     constructor_pending_elts = t;
5864                 }
5865               break;
5866             }
5867           else
5868             {
5869               /* p->balance == +1; growth of left side balances the node.  */
5870               p->balance = 0;
5871               break;
5872             }
5873         }
5874       else /* r == p->right */
5875         {
5876           if (p->balance == 0)
5877             /* Growth propagation from right side.  */
5878             p->balance++;
5879           else if (p->balance > 0)
5880             {
5881               if (r->balance > 0)
5882                 {
5883                   /* R rotation.  */
5884                   p->right = r->left;
5885                   if (p->right)
5886                     p->right->parent = p;
5887                   r->left = p;
5888
5889                   p->balance = 0;
5890                   r->balance = 0;
5891
5892                   s = p->parent;
5893                   p->parent = r;
5894                   r->parent = s;
5895                   if (s)
5896                     {
5897                       if (s->left == p)
5898                         s->left = r;
5899                       else
5900                         s->right = r;
5901                     }
5902                   else
5903                     constructor_pending_elts = r;
5904                 }
5905               else /* r->balance == -1 */
5906                 {
5907                   /* RL rotation */
5908                   struct init_node *t = r->left;
5909
5910                   r->left = t->right;
5911                   if (r->left)
5912                     r->left->parent = r;
5913                   t->right = r;
5914
5915                   p->right = t->left;
5916                   if (p->right)
5917                     p->right->parent = p;
5918                   t->left = p;
5919
5920                   r->balance = (t->balance < 0);
5921                   p->balance = -(t->balance > 0);
5922                   t->balance = 0;
5923
5924                   s = p->parent;
5925                   p->parent = t;
5926                   r->parent = t;
5927                   t->parent = s;
5928                   if (s)
5929                     {
5930                       if (s->left == p)
5931                         s->left = t;
5932                       else
5933                         s->right = t;
5934                     }
5935                   else
5936                     constructor_pending_elts = t;
5937                 }
5938               break;
5939             }
5940           else
5941             {
5942               /* p->balance == -1; growth of right side balances the node.  */
5943               p->balance = 0;
5944               break;
5945             }
5946         }
5947
5948       r = p;
5949       p = p->parent;
5950     }
5951 }
5952
5953 /* Build AVL tree from a sorted chain.  */
5954
5955 static void
5956 set_nonincremental_init ()
5957 {
5958   tree chain;
5959
5960   if (TREE_CODE (constructor_type) != RECORD_TYPE
5961       && TREE_CODE (constructor_type) != ARRAY_TYPE)
5962     return;
5963
5964   for (chain = constructor_elements; chain; chain = TREE_CHAIN (chain))
5965     add_pending_init (TREE_PURPOSE (chain), TREE_VALUE (chain));
5966   constructor_elements = 0;
5967   if (TREE_CODE (constructor_type) == RECORD_TYPE)
5968     {
5969       constructor_unfilled_fields = TYPE_FIELDS (constructor_type);
5970       /* Skip any nameless bit fields at the beginning.  */
5971       while (constructor_unfilled_fields != 0
5972              && DECL_C_BIT_FIELD (constructor_unfilled_fields)
5973              && DECL_NAME (constructor_unfilled_fields) == 0)
5974         constructor_unfilled_fields = TREE_CHAIN (constructor_unfilled_fields);
5975       
5976     }
5977   else if (TREE_CODE (constructor_type) == ARRAY_TYPE)
5978     {
5979       if (TYPE_DOMAIN (constructor_type))
5980         constructor_unfilled_index
5981             = convert (bitsizetype,
5982                        TYPE_MIN_VALUE (TYPE_DOMAIN (constructor_type)));
5983       else
5984         constructor_unfilled_index = bitsize_zero_node;
5985     }
5986   constructor_incremental = 0;
5987 }
5988
5989 /* Build AVL tree from a string constant.  */
5990
5991 static void
5992 set_nonincremental_init_from_string (str)
5993      tree str;
5994 {
5995   tree value, purpose, type;
5996   HOST_WIDE_INT val[2];
5997   const char *p, *end;
5998   int byte, wchar_bytes, charwidth, bitpos;
5999
6000   if (TREE_CODE (constructor_type) != ARRAY_TYPE)
6001     abort ();
6002
6003   if (TYPE_PRECISION (TREE_TYPE (TREE_TYPE (str)))
6004       == TYPE_PRECISION (char_type_node))
6005     wchar_bytes = 1;
6006   else if (TYPE_PRECISION (TREE_TYPE (TREE_TYPE (str)))
6007            == TYPE_PRECISION (wchar_type_node))
6008     wchar_bytes = TYPE_PRECISION (wchar_type_node) / BITS_PER_UNIT;
6009   else
6010     abort ();
6011
6012   charwidth = TYPE_PRECISION (char_type_node);
6013   type = TREE_TYPE (constructor_type);
6014   p = TREE_STRING_POINTER (str);
6015   end = p + TREE_STRING_LENGTH (str);
6016
6017   for (purpose = bitsize_zero_node;
6018        p < end && !tree_int_cst_lt (constructor_max_index, purpose);
6019        purpose = size_binop (PLUS_EXPR, purpose, bitsize_one_node))
6020     {
6021       if (wchar_bytes == 1)
6022         {
6023           val[1] = (unsigned char) *p++;
6024           val[0] = 0;
6025         }
6026       else
6027         {
6028           val[0] = 0;
6029           val[1] = 0;
6030           for (byte = 0; byte < wchar_bytes; byte++)
6031             {
6032               if (BYTES_BIG_ENDIAN)
6033                 bitpos = (wchar_bytes - byte - 1) * charwidth;
6034               else
6035                 bitpos = byte * charwidth;
6036               val[bitpos < HOST_BITS_PER_WIDE_INT]
6037                 |= ((unsigned HOST_WIDE_INT) ((unsigned char) *p++))
6038                    << (bitpos % HOST_BITS_PER_WIDE_INT);
6039             }
6040         }
6041
6042       if (!TREE_UNSIGNED (type))
6043         {
6044           bitpos = ((wchar_bytes - 1) * charwidth) + HOST_BITS_PER_CHAR;
6045           if (bitpos < HOST_BITS_PER_WIDE_INT)
6046             {
6047               if (val[1] & (((HOST_WIDE_INT) 1) << (bitpos - 1)))
6048                 {
6049                   val[1] |= ((HOST_WIDE_INT) -1) << bitpos;
6050                   val[0] = -1;
6051                 }
6052             }
6053           else if (bitpos == HOST_BITS_PER_WIDE_INT)
6054             {
6055               if (val[1] < 0)
6056                 val[0] = -1;
6057             }
6058           else if (val[0] & (((HOST_WIDE_INT) 1)
6059                              << (bitpos - 1 - HOST_BITS_PER_WIDE_INT)))
6060             val[0] |= ((HOST_WIDE_INT) -1)
6061                       << (bitpos - HOST_BITS_PER_WIDE_INT);
6062         }
6063
6064       value = build_int_2 (val[1], val[0]);
6065       TREE_TYPE (value) = type;
6066       add_pending_init (purpose, value);
6067     }
6068
6069   constructor_incremental = 0;
6070 }
6071
6072 /* Return value of FIELD in pending initializer or zero if the field was
6073    not initialized yet.  */
6074
6075 static tree
6076 find_init_member (field)
6077      tree field;
6078 {
6079   struct init_node *p;
6080
6081   if (TREE_CODE (constructor_type) == ARRAY_TYPE)
6082     {
6083       if (constructor_incremental
6084           && tree_int_cst_lt (field, constructor_unfilled_index))
6085         set_nonincremental_init ();
6086
6087       p = constructor_pending_elts;
6088       while (p)
6089         {
6090           if (tree_int_cst_lt (field, p->purpose))
6091             p = p->left;
6092           else if (tree_int_cst_lt (p->purpose, field))
6093             p = p->right;
6094           else
6095             return p->value;
6096         }
6097     }
6098   else if (TREE_CODE (constructor_type) == RECORD_TYPE)
6099     {
6100       tree bitpos = bit_position (field);
6101
6102       if (constructor_incremental
6103           && (!constructor_unfilled_fields
6104               || tree_int_cst_lt (bitpos,
6105                                   bit_position (constructor_unfilled_fields))))
6106         set_nonincremental_init ();
6107
6108       p = constructor_pending_elts;
6109       while (p)
6110         {
6111           if (field == p->purpose)
6112             return p->value;
6113           else if (tree_int_cst_lt (bitpos, bit_position (p->purpose)))
6114             p = p->left;
6115           else
6116             p = p->right;
6117         }
6118     }
6119   else if (TREE_CODE (constructor_type) == UNION_TYPE)
6120     {
6121       if (constructor_elements
6122           && TREE_PURPOSE (constructor_elements) == field)
6123         return TREE_VALUE (constructor_elements);
6124     }
6125   return 0;
6126 }
6127
6128 /* "Output" the next constructor element.
6129    At top level, really output it to assembler code now.
6130    Otherwise, collect it in a list from which we will make a CONSTRUCTOR.
6131    TYPE is the data type that the containing data type wants here.
6132    FIELD is the field (a FIELD_DECL) or the index that this element fills.
6133
6134    PENDING if non-nil means output pending elements that belong
6135    right after this element.  (PENDING is normally 1;
6136    it is 0 while outputting pending elements, to avoid recursion.)  */
6137
6138 static void
6139 output_init_element (value, type, field, pending)
6140      tree value, type, field;
6141      int pending;
6142 {
6143   if (TREE_CODE (TREE_TYPE (value)) == FUNCTION_TYPE
6144       || (TREE_CODE (TREE_TYPE (value)) == ARRAY_TYPE
6145           && !(TREE_CODE (value) == STRING_CST
6146                && TREE_CODE (type) == ARRAY_TYPE
6147                && TREE_CODE (TREE_TYPE (type)) == INTEGER_TYPE)
6148           && !comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (value)),
6149                          TYPE_MAIN_VARIANT (type))))
6150     value = default_conversion (value);
6151
6152   if (TREE_CODE (value) == COMPOUND_LITERAL_EXPR
6153       && require_constant_value && !flag_isoc99 && pending)
6154     {
6155       /* As an extension, allow initializing objects with static storage
6156          duration with compound literals (which are then treated just as
6157          the brace enclosed list they contain).  */
6158       tree decl = COMPOUND_LITERAL_EXPR_DECL (value);
6159       value = DECL_INITIAL (decl);
6160     }
6161
6162   if (value == error_mark_node)
6163     constructor_erroneous = 1;
6164   else if (!TREE_CONSTANT (value))
6165     constructor_constant = 0;
6166   else if (initializer_constant_valid_p (value, TREE_TYPE (value)) == 0
6167            || ((TREE_CODE (constructor_type) == RECORD_TYPE
6168                 || TREE_CODE (constructor_type) == UNION_TYPE)
6169                && DECL_C_BIT_FIELD (field)
6170                && TREE_CODE (value) != INTEGER_CST))
6171     constructor_simple = 0;
6172
6173   if (require_constant_value && ! TREE_CONSTANT (value))
6174     {
6175       error_init ("initializer element is not constant");
6176       value = error_mark_node;
6177     }
6178   else if (require_constant_elements
6179            && initializer_constant_valid_p (value, TREE_TYPE (value)) == 0)
6180     pedwarn ("initializer element is not computable at load time");
6181
6182   /* If this field is empty (and not at the end of structure),
6183      don't do anything other than checking the initializer.  */
6184   if (field
6185       && (TREE_TYPE (field) == error_mark_node
6186           || (COMPLETE_TYPE_P (TREE_TYPE (field))
6187               && integer_zerop (TYPE_SIZE (TREE_TYPE (field)))
6188               && (TREE_CODE (constructor_type) == ARRAY_TYPE
6189                   || TREE_CHAIN (field)))))
6190     return;
6191
6192   value = digest_init (type, value, require_constant_value,
6193                        require_constant_elements);
6194   if (value == error_mark_node)
6195     {
6196       constructor_erroneous = 1;
6197       return;
6198     }
6199
6200   /* If this element doesn't come next in sequence,
6201      put it on constructor_pending_elts.  */
6202   if (TREE_CODE (constructor_type) == ARRAY_TYPE
6203       && (!constructor_incremental
6204           || !tree_int_cst_equal (field, constructor_unfilled_index)))
6205     {
6206       if (constructor_incremental
6207           && tree_int_cst_lt (field, constructor_unfilled_index))
6208         set_nonincremental_init ();
6209
6210       add_pending_init (field, value);
6211       return;
6212     }
6213   else if (TREE_CODE (constructor_type) == RECORD_TYPE
6214            && (!constructor_incremental
6215                || field != constructor_unfilled_fields))
6216     {
6217       /* We do this for records but not for unions.  In a union,
6218          no matter which field is specified, it can be initialized
6219          right away since it starts at the beginning of the union.  */
6220       if (constructor_incremental)
6221         {
6222           if (!constructor_unfilled_fields)
6223             set_nonincremental_init ();
6224           else
6225             {
6226               tree bitpos, unfillpos;
6227
6228               bitpos = bit_position (field);
6229               unfillpos = bit_position (constructor_unfilled_fields);
6230
6231               if (tree_int_cst_lt (bitpos, unfillpos))
6232                 set_nonincremental_init ();
6233             }
6234         }
6235
6236       add_pending_init (field, value);
6237       return;
6238     }
6239   else if (TREE_CODE (constructor_type) == UNION_TYPE
6240            && constructor_elements)
6241     {
6242       if (TREE_SIDE_EFFECTS (TREE_VALUE (constructor_elements)))
6243         warning_init ("initialized field with side-effects overwritten");
6244
6245       /* We can have just one union field set.  */
6246       constructor_elements = 0;
6247     }
6248
6249   /* Otherwise, output this element either to
6250      constructor_elements or to the assembler file.  */
6251
6252   if (field && TREE_CODE (field) == INTEGER_CST)
6253     field = copy_node (field);
6254   constructor_elements
6255     = tree_cons (field, value, constructor_elements);
6256
6257   /* Advance the variable that indicates sequential elements output.  */
6258   if (TREE_CODE (constructor_type) == ARRAY_TYPE)
6259     constructor_unfilled_index
6260       = size_binop (PLUS_EXPR, constructor_unfilled_index,
6261                     bitsize_one_node);
6262   else if (TREE_CODE (constructor_type) == RECORD_TYPE)
6263     {
6264       constructor_unfilled_fields
6265         = TREE_CHAIN (constructor_unfilled_fields);
6266
6267       /* Skip any nameless bit fields.  */
6268       while (constructor_unfilled_fields != 0
6269              && DECL_C_BIT_FIELD (constructor_unfilled_fields)
6270              && DECL_NAME (constructor_unfilled_fields) == 0)
6271         constructor_unfilled_fields =
6272           TREE_CHAIN (constructor_unfilled_fields);
6273     }
6274   else if (TREE_CODE (constructor_type) == UNION_TYPE)
6275     constructor_unfilled_fields = 0;
6276
6277   /* Now output any pending elements which have become next.  */
6278   if (pending)
6279     output_pending_init_elements (0);
6280 }
6281
6282 /* Output any pending elements which have become next.
6283    As we output elements, constructor_unfilled_{fields,index}
6284    advances, which may cause other elements to become next;
6285    if so, they too are output.
6286
6287    If ALL is 0, we return when there are
6288    no more pending elements to output now.
6289
6290    If ALL is 1, we output space as necessary so that
6291    we can output all the pending elements.  */
6292
6293 static void
6294 output_pending_init_elements (all)
6295      int all;
6296 {
6297   struct init_node *elt = constructor_pending_elts;
6298   tree next;
6299
6300  retry:
6301
6302   /* Look thru the whole pending tree.
6303      If we find an element that should be output now,
6304      output it.  Otherwise, set NEXT to the element
6305      that comes first among those still pending.  */
6306      
6307   next = 0;
6308   while (elt)
6309     {
6310       if (TREE_CODE (constructor_type) == ARRAY_TYPE)
6311         {
6312           if (tree_int_cst_equal (elt->purpose,
6313                                   constructor_unfilled_index))
6314             output_init_element (elt->value,
6315                                  TREE_TYPE (constructor_type),
6316                                  constructor_unfilled_index, 0);
6317           else if (tree_int_cst_lt (constructor_unfilled_index,
6318                                     elt->purpose))
6319             {
6320               /* Advance to the next smaller node.  */
6321               if (elt->left)
6322                 elt = elt->left;
6323               else
6324                 {
6325                   /* We have reached the smallest node bigger than the
6326                      current unfilled index.  Fill the space first.  */
6327                   next = elt->purpose;
6328                   break;
6329                 }
6330             }
6331           else
6332             {
6333               /* Advance to the next bigger node.  */
6334               if (elt->right)
6335                 elt = elt->right;
6336               else
6337                 {
6338                   /* We have reached the biggest node in a subtree.  Find
6339                      the parent of it, which is the next bigger node.  */
6340                   while (elt->parent && elt->parent->right == elt)
6341                     elt = elt->parent;
6342                   elt = elt->parent;
6343                   if (elt && tree_int_cst_lt (constructor_unfilled_index,
6344                                               elt->purpose))
6345                     {
6346                       next = elt->purpose;
6347                       break;
6348                     }
6349                 }
6350             }
6351         }
6352       else if (TREE_CODE (constructor_type) == RECORD_TYPE
6353                || TREE_CODE (constructor_type) == UNION_TYPE)
6354         {
6355           tree ctor_unfilled_bitpos, elt_bitpos;
6356
6357           /* If the current record is complete we are done.  */
6358           if (constructor_unfilled_fields == 0)
6359             break;
6360
6361           ctor_unfilled_bitpos = bit_position (constructor_unfilled_fields);
6362           elt_bitpos = bit_position (elt->purpose);
6363           /* We can't compare fields here because there might be empty
6364              fields in between.  */
6365           if (tree_int_cst_equal (elt_bitpos, ctor_unfilled_bitpos))
6366             {
6367               constructor_unfilled_fields = elt->purpose;
6368               output_init_element (elt->value, TREE_TYPE (elt->purpose),
6369                                    elt->purpose, 0);
6370             }
6371           else if (tree_int_cst_lt (ctor_unfilled_bitpos, elt_bitpos))
6372             {
6373               /* Advance to the next smaller node.  */
6374               if (elt->left)
6375                 elt = elt->left;
6376               else
6377                 {
6378                   /* We have reached the smallest node bigger than the
6379                      current unfilled field.  Fill the space first.  */
6380                   next = elt->purpose;
6381                   break;
6382                 }
6383             }
6384           else
6385             {
6386               /* Advance to the next bigger node.  */
6387               if (elt->right)
6388                 elt = elt->right;
6389               else
6390                 {
6391                   /* We have reached the biggest node in a subtree.  Find
6392                      the parent of it, which is the next bigger node.  */
6393                   while (elt->parent && elt->parent->right == elt)
6394                     elt = elt->parent;
6395                   elt = elt->parent;
6396                   if (elt
6397                       && (tree_int_cst_lt (ctor_unfilled_bitpos,
6398                                            bit_position (elt->purpose))))
6399                     {
6400                       next = elt->purpose;
6401                       break;
6402                     }
6403                 }
6404             }
6405         }
6406     }
6407
6408   /* Ordinarily return, but not if we want to output all
6409      and there are elements left.  */
6410   if (! (all && next != 0))
6411     return;
6412
6413   /* If it's not incremental, just skip over the gap, so that after
6414      jumping to retry we will output the next successive element.  */
6415   if (TREE_CODE (constructor_type) == RECORD_TYPE
6416       || TREE_CODE (constructor_type) == UNION_TYPE)
6417     constructor_unfilled_fields = next;
6418   else if (TREE_CODE (constructor_type) == ARRAY_TYPE)
6419     constructor_unfilled_index = next;
6420
6421   /* ELT now points to the node in the pending tree with the next
6422      initializer to output.  */
6423   goto retry;
6424 }
6425 \f
6426 /* Add one non-braced element to the current constructor level.
6427    This adjusts the current position within the constructor's type.
6428    This may also start or terminate implicit levels
6429    to handle a partly-braced initializer.
6430
6431    Once this has found the correct level for the new element,
6432    it calls output_init_element.  */
6433
6434 void
6435 process_init_element (value)
6436      tree value;
6437 {
6438   tree orig_value = value;
6439   int string_flag = value != 0 && TREE_CODE (value) == STRING_CST;
6440
6441   designator_depth = 0;
6442   designator_errorneous = 0;
6443
6444   /* Handle superfluous braces around string cst as in
6445      char x[] = {"foo"}; */
6446   if (string_flag
6447       && constructor_type
6448       && TREE_CODE (constructor_type) == ARRAY_TYPE
6449       && TREE_CODE (TREE_TYPE (constructor_type)) == INTEGER_TYPE
6450       && integer_zerop (constructor_unfilled_index))
6451     {
6452       if (constructor_stack->replacement_value)
6453         error_init ("excess elements in char array initializer");
6454       constructor_stack->replacement_value = value;
6455       return;
6456     }
6457
6458   if (constructor_stack->replacement_value != 0)
6459     {
6460       error_init ("excess elements in struct initializer");
6461       return;
6462     }
6463
6464   /* Ignore elements of a brace group if it is entirely superfluous
6465      and has already been diagnosed.  */
6466   if (constructor_type == 0)
6467     return;
6468
6469   /* If we've exhausted any levels that didn't have braces,
6470      pop them now.  */
6471   while (constructor_stack->implicit)
6472     {
6473       if ((TREE_CODE (constructor_type) == RECORD_TYPE
6474            || TREE_CODE (constructor_type) == UNION_TYPE)
6475           && constructor_fields == 0)
6476         process_init_element (pop_init_level (1));
6477       else if (TREE_CODE (constructor_type) == ARRAY_TYPE
6478                && (constructor_max_index == 0
6479                    || tree_int_cst_lt (constructor_max_index,
6480                                        constructor_index)))
6481         process_init_element (pop_init_level (1));
6482       else
6483         break;
6484     }
6485
6486   /* In the case of [LO ... HI] = VALUE, only evaluate VALUE once.  */
6487   if (constructor_range_stack)
6488     {
6489       /* If value is a compound literal and we'll be just using its
6490          content, don't put it into a SAVE_EXPR.  */
6491       if (TREE_CODE (value) != COMPOUND_LITERAL_EXPR
6492           || !require_constant_value
6493           || flag_isoc99)
6494         value = save_expr (value);
6495     }
6496
6497   while (1)
6498     {
6499       if (TREE_CODE (constructor_type) == RECORD_TYPE)
6500         {
6501           tree fieldtype;
6502           enum tree_code fieldcode;
6503
6504           if (constructor_fields == 0)
6505             {
6506               pedwarn_init ("excess elements in struct initializer");
6507               break;
6508             }
6509
6510           fieldtype = TREE_TYPE (constructor_fields);
6511           if (fieldtype != error_mark_node)
6512             fieldtype = TYPE_MAIN_VARIANT (fieldtype);
6513           fieldcode = TREE_CODE (fieldtype);
6514
6515           /* Accept a string constant to initialize a subarray.  */
6516           if (value != 0
6517               && fieldcode == ARRAY_TYPE
6518               && TREE_CODE (TREE_TYPE (fieldtype)) == INTEGER_TYPE
6519               && string_flag)
6520             value = orig_value;
6521           /* Otherwise, if we have come to a subaggregate,
6522              and we don't have an element of its type, push into it.  */
6523           else if (value != 0 && !constructor_no_implicit
6524                    && value != error_mark_node
6525                    && TYPE_MAIN_VARIANT (TREE_TYPE (value)) != fieldtype
6526                    && (fieldcode == RECORD_TYPE || fieldcode == ARRAY_TYPE
6527                        || fieldcode == UNION_TYPE))
6528             {
6529               push_init_level (1);
6530               continue;
6531             }
6532
6533           if (value)
6534             {
6535               push_member_name (constructor_fields);
6536               output_init_element (value, fieldtype, constructor_fields, 1);
6537               RESTORE_SPELLING_DEPTH (constructor_depth);
6538             }
6539           else
6540             /* Do the bookkeeping for an element that was
6541                directly output as a constructor.  */
6542             {
6543               /* For a record, keep track of end position of last field.  */
6544               if (DECL_SIZE (constructor_fields))
6545                 constructor_bit_index
6546                   = size_binop (PLUS_EXPR,
6547                                 bit_position (constructor_fields),
6548                                 DECL_SIZE (constructor_fields));
6549
6550               constructor_unfilled_fields = TREE_CHAIN (constructor_fields);
6551               /* Skip any nameless bit fields.  */
6552               while (constructor_unfilled_fields != 0
6553                      && DECL_C_BIT_FIELD (constructor_unfilled_fields)
6554                      && DECL_NAME (constructor_unfilled_fields) == 0)
6555                 constructor_unfilled_fields =
6556                   TREE_CHAIN (constructor_unfilled_fields);
6557             }
6558
6559           constructor_fields = TREE_CHAIN (constructor_fields);
6560           /* Skip any nameless bit fields at the beginning.  */
6561           while (constructor_fields != 0
6562                  && DECL_C_BIT_FIELD (constructor_fields)
6563                  && DECL_NAME (constructor_fields) == 0)
6564             constructor_fields = TREE_CHAIN (constructor_fields);
6565         }
6566       else if (TREE_CODE (constructor_type) == UNION_TYPE)
6567         {
6568           tree fieldtype;
6569           enum tree_code fieldcode;
6570
6571           if (constructor_fields == 0)
6572             {
6573               pedwarn_init ("excess elements in union initializer");
6574               break;
6575             }
6576
6577           fieldtype = TREE_TYPE (constructor_fields);
6578           if (fieldtype != error_mark_node)
6579             fieldtype = TYPE_MAIN_VARIANT (fieldtype);
6580           fieldcode = TREE_CODE (fieldtype);
6581
6582           /* Warn that traditional C rejects initialization of unions.
6583              We skip the warning if the value is zero.  This is done
6584              under the assumption that the zero initializer in user
6585              code appears conditioned on e.g. __STDC__ to avoid
6586              "missing initializer" warnings and relies on default
6587              initialization to zero in the traditional C case.
6588              We also skip the warning if the initializer is designated,
6589              again on the assumption that this must be conditional on
6590              __STDC__ anyway (and we've already complained about the
6591              member-designator already).  */
6592           if (warn_traditional && !in_system_header && !constructor_designated
6593               && !(value && (integer_zerop (value) || real_zerop (value))))
6594             warning ("traditional C rejects initialization of unions");
6595
6596           /* Accept a string constant to initialize a subarray.  */
6597           if (value != 0
6598               && fieldcode == ARRAY_TYPE
6599               && TREE_CODE (TREE_TYPE (fieldtype)) == INTEGER_TYPE
6600               && string_flag)
6601             value = orig_value;
6602           /* Otherwise, if we have come to a subaggregate,
6603              and we don't have an element of its type, push into it.  */
6604           else if (value != 0 && !constructor_no_implicit
6605                    && value != error_mark_node
6606                    && TYPE_MAIN_VARIANT (TREE_TYPE (value)) != fieldtype
6607                    && (fieldcode == RECORD_TYPE || fieldcode == ARRAY_TYPE
6608                        || fieldcode == UNION_TYPE))
6609             {
6610               push_init_level (1);
6611               continue;
6612             }
6613
6614           if (value)
6615             {
6616               push_member_name (constructor_fields);
6617               output_init_element (value, fieldtype, constructor_fields, 1);
6618               RESTORE_SPELLING_DEPTH (constructor_depth);
6619             }
6620           else
6621             /* Do the bookkeeping for an element that was
6622                directly output as a constructor.  */
6623             {
6624               constructor_bit_index = DECL_SIZE (constructor_fields);
6625               constructor_unfilled_fields = TREE_CHAIN (constructor_fields);
6626             }
6627
6628           constructor_fields = 0;
6629         }
6630       else if (TREE_CODE (constructor_type) == ARRAY_TYPE)
6631         {
6632           tree elttype = TYPE_MAIN_VARIANT (TREE_TYPE (constructor_type));
6633           enum tree_code eltcode = TREE_CODE (elttype);
6634
6635           /* Accept a string constant to initialize a subarray.  */
6636           if (value != 0
6637               && eltcode == ARRAY_TYPE
6638               && TREE_CODE (TREE_TYPE (elttype)) == INTEGER_TYPE
6639               && string_flag)
6640             value = orig_value;
6641           /* Otherwise, if we have come to a subaggregate,
6642              and we don't have an element of its type, push into it.  */
6643           else if (value != 0 && !constructor_no_implicit
6644                    && value != error_mark_node
6645                    && TYPE_MAIN_VARIANT (TREE_TYPE (value)) != elttype
6646                    && (eltcode == RECORD_TYPE || eltcode == ARRAY_TYPE
6647                        || eltcode == UNION_TYPE))
6648             {
6649               push_init_level (1);
6650               continue;
6651             }
6652
6653           if (constructor_max_index != 0
6654               && (tree_int_cst_lt (constructor_max_index, constructor_index)
6655                   || integer_all_onesp (constructor_max_index)))
6656             {
6657               pedwarn_init ("excess elements in array initializer");
6658               break;
6659             }
6660
6661           /* Now output the actual element.  */
6662           if (value)
6663             {
6664               push_array_bounds (tree_low_cst (constructor_index, 0));
6665               output_init_element (value, elttype, constructor_index, 1);
6666               RESTORE_SPELLING_DEPTH (constructor_depth);
6667             }
6668
6669           constructor_index
6670             = size_binop (PLUS_EXPR, constructor_index, bitsize_one_node);
6671
6672           if (! value)
6673             /* If we are doing the bookkeeping for an element that was
6674                directly output as a constructor, we must update
6675                constructor_unfilled_index.  */
6676             constructor_unfilled_index = constructor_index;
6677         }
6678       else if (TREE_CODE (constructor_type) == VECTOR_TYPE)
6679         {
6680           tree elttype = TYPE_MAIN_VARIANT (TREE_TYPE (constructor_type));
6681
6682          /* Do a basic check of initializer size.  Note that vectors
6683             always have a fixed size derived from their type.  */
6684           if (tree_int_cst_lt (constructor_max_index, constructor_index))
6685             {
6686               pedwarn_init ("excess elements in vector initializer");
6687               break;
6688             }
6689
6690           /* Now output the actual element.  */
6691           if (value)
6692             output_init_element (value, elttype, constructor_index, 1);
6693
6694           constructor_index
6695             = size_binop (PLUS_EXPR, constructor_index, bitsize_one_node);
6696
6697           if (! value)
6698             /* If we are doing the bookkeeping for an element that was
6699                directly output as a constructor, we must update
6700                constructor_unfilled_index.  */
6701             constructor_unfilled_index = constructor_index;
6702         }
6703
6704       /* Handle the sole element allowed in a braced initializer
6705          for a scalar variable.  */
6706       else if (constructor_fields == 0)
6707         {
6708           pedwarn_init ("excess elements in scalar initializer");
6709           break;
6710         }
6711       else
6712         {
6713           if (value)
6714             output_init_element (value, constructor_type, NULL_TREE, 1);
6715           constructor_fields = 0;
6716         }
6717
6718       /* Handle range initializers either at this level or anywhere higher
6719          in the designator stack.  */
6720       if (constructor_range_stack)
6721         {
6722           struct constructor_range_stack *p, *range_stack;
6723           int finish = 0;
6724
6725           range_stack = constructor_range_stack;
6726           constructor_range_stack = 0;
6727           while (constructor_stack != range_stack->stack)
6728             {
6729               if (!constructor_stack->implicit)
6730                 abort ();
6731               process_init_element (pop_init_level (1));
6732             }
6733           for (p = range_stack;
6734                !p->range_end || tree_int_cst_equal (p->index, p->range_end);
6735                p = p->prev)
6736             {
6737               if (!constructor_stack->implicit)
6738                 abort ();
6739               process_init_element (pop_init_level (1));
6740             }
6741
6742           p->index = size_binop (PLUS_EXPR, p->index, bitsize_one_node);
6743           if (tree_int_cst_equal (p->index, p->range_end) && !p->prev)
6744             finish = 1;
6745
6746           while (1)
6747             {
6748               constructor_index = p->index;
6749               constructor_fields = p->fields;
6750               if (finish && p->range_end && p->index == p->range_start)
6751                 {
6752                   finish = 0;
6753                   p->prev = 0;
6754                 }
6755               p = p->next;
6756               if (!p)
6757                 break;
6758               push_init_level (2);
6759               p->stack = constructor_stack;
6760               if (p->range_end && tree_int_cst_equal (p->index, p->range_end))
6761                 p->index = p->range_start;
6762             }
6763
6764           if (!finish)
6765             constructor_range_stack = range_stack;
6766           continue;
6767         }
6768
6769       break;
6770     }
6771
6772   constructor_range_stack = 0;
6773 }
6774 \f
6775 /* Build a simple asm-statement, from one string literal.  */
6776 tree
6777 simple_asm_stmt (expr)
6778      tree expr;
6779 {
6780   STRIP_NOPS (expr);
6781
6782   if (TREE_CODE (expr) == ADDR_EXPR)
6783     expr = TREE_OPERAND (expr, 0);
6784
6785   if (TREE_CODE (expr) == STRING_CST)
6786     {
6787       tree stmt;
6788
6789       if (TREE_CHAIN (expr))
6790         expr = combine_strings (expr);
6791       stmt = add_stmt (build_stmt (ASM_STMT, NULL_TREE, expr,
6792                                    NULL_TREE, NULL_TREE,
6793                                    NULL_TREE));
6794       ASM_INPUT_P (stmt) = 1;
6795       return stmt;
6796     }
6797
6798   error ("argument of `asm' is not a constant string");
6799   return NULL_TREE;
6800 }
6801
6802 /* Build an asm-statement, whose components are a CV_QUALIFIER, a
6803    STRING, some OUTPUTS, some INPUTS, and some CLOBBERS.  */
6804
6805 tree
6806 build_asm_stmt (cv_qualifier, string, outputs, inputs, clobbers)
6807      tree cv_qualifier;
6808      tree string;
6809      tree outputs;
6810      tree inputs;
6811      tree clobbers;
6812 {
6813   tree tail;
6814
6815   if (TREE_CHAIN (string))
6816     string = combine_strings (string);
6817   if (TREE_CODE (string) != STRING_CST)
6818     {
6819       error ("asm template is not a string constant");
6820       return NULL_TREE;
6821     }
6822
6823   if (cv_qualifier != NULL_TREE
6824       && cv_qualifier != ridpointers[(int) RID_VOLATILE])
6825     {
6826       warning ("%s qualifier ignored on asm",
6827                IDENTIFIER_POINTER (cv_qualifier));
6828       cv_qualifier = NULL_TREE;
6829     }
6830
6831   /* We can remove output conversions that change the type,
6832      but not the mode.  */
6833   for (tail = outputs; tail; tail = TREE_CHAIN (tail))
6834     {
6835       tree output = TREE_VALUE (tail);
6836
6837       STRIP_NOPS (output);
6838       TREE_VALUE (tail) = output;
6839
6840       /* Allow conversions as LHS here.  build_modify_expr as called below
6841          will do the right thing with them.  */
6842       while (TREE_CODE (output) == NOP_EXPR
6843              || TREE_CODE (output) == CONVERT_EXPR
6844              || TREE_CODE (output) == FLOAT_EXPR
6845              || TREE_CODE (output) == FIX_TRUNC_EXPR
6846              || TREE_CODE (output) == FIX_FLOOR_EXPR
6847              || TREE_CODE (output) == FIX_ROUND_EXPR
6848              || TREE_CODE (output) == FIX_CEIL_EXPR)
6849         output = TREE_OPERAND (output, 0);
6850
6851       lvalue_or_else (TREE_VALUE (tail), "invalid lvalue in asm statement");
6852     }
6853
6854   /* Remove output conversions that change the type but not the mode.  */
6855   for (tail = outputs; tail; tail = TREE_CHAIN (tail))
6856     {
6857       tree output = TREE_VALUE (tail);
6858       STRIP_NOPS (output);
6859       TREE_VALUE (tail) = output;
6860     }
6861
6862   /* Perform default conversions on array and function inputs. 
6863      Don't do this for other types as it would screw up operands
6864      expected to be in memory.  */
6865   for (tail = inputs; tail; tail = TREE_CHAIN (tail))
6866     TREE_VALUE (tail) = default_function_array_conversion (TREE_VALUE (tail));
6867
6868   return add_stmt (build_stmt (ASM_STMT, cv_qualifier, string,
6869                                outputs, inputs, clobbers));
6870 }
6871
6872 /* Expand an ASM statement with operands, handling output operands
6873    that are not variables or INDIRECT_REFS by transforming such
6874    cases into cases that expand_asm_operands can handle.
6875
6876    Arguments are same as for expand_asm_operands.  */
6877
6878 void
6879 c_expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
6880      tree string, outputs, inputs, clobbers;
6881      int vol;
6882      const char *filename;
6883      int line;
6884 {
6885   int noutputs = list_length (outputs);
6886   int i;
6887   /* o[I] is the place that output number I should be written.  */
6888   tree *o = (tree *) alloca (noutputs * sizeof (tree));
6889   tree tail;
6890
6891   /* Record the contents of OUTPUTS before it is modified.  */
6892   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
6893     o[i] = TREE_VALUE (tail);
6894
6895   /* Generate the ASM_OPERANDS insn; store into the TREE_VALUEs of
6896      OUTPUTS some trees for where the values were actually stored.  */
6897   expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line);
6898
6899   /* Copy all the intermediate outputs into the specified outputs.  */
6900   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
6901     {
6902       if (o[i] != TREE_VALUE (tail))
6903         {
6904           expand_expr (build_modify_expr (o[i], NOP_EXPR, TREE_VALUE (tail)),
6905                        NULL_RTX, VOIDmode, EXPAND_NORMAL);
6906           free_temp_slots ();
6907
6908           /* Restore the original value so that it's correct the next
6909              time we expand this function.  */
6910           TREE_VALUE (tail) = o[i];
6911         }
6912       /* Detect modification of read-only values.
6913          (Otherwise done by build_modify_expr.)  */
6914       else
6915         {
6916           tree type = TREE_TYPE (o[i]);
6917           if (TREE_READONLY (o[i])
6918               || TYPE_READONLY (type)
6919               || ((TREE_CODE (type) == RECORD_TYPE
6920                    || TREE_CODE (type) == UNION_TYPE)
6921                   && C_TYPE_FIELDS_READONLY (type)))
6922             readonly_warning (o[i], "modification by `asm'");
6923         }
6924     }
6925
6926   /* Those MODIFY_EXPRs could do autoincrements.  */
6927   emit_queue ();
6928 }
6929 \f
6930 /* Expand a C `return' statement.
6931    RETVAL is the expression for what to return,
6932    or a null pointer for `return;' with no value.  */
6933
6934 tree
6935 c_expand_return (retval)
6936      tree retval;
6937 {
6938   tree valtype = TREE_TYPE (TREE_TYPE (current_function_decl));
6939
6940   if (TREE_THIS_VOLATILE (current_function_decl))
6941     warning ("function declared `noreturn' has a `return' statement");
6942
6943   if (!retval)
6944     {
6945       current_function_returns_null = 1;
6946       if ((warn_return_type || flag_isoc99)
6947           && valtype != 0 && TREE_CODE (valtype) != VOID_TYPE)
6948         pedwarn_c99 ("`return' with no value, in function returning non-void");
6949     }
6950   else if (valtype == 0 || TREE_CODE (valtype) == VOID_TYPE)
6951     {
6952       current_function_returns_null = 1;
6953       if (pedantic || TREE_CODE (TREE_TYPE (retval)) != VOID_TYPE)
6954         pedwarn ("`return' with a value, in function returning void");
6955     }
6956   else
6957     {
6958       tree t = convert_for_assignment (valtype, retval, _("return"),
6959                                        NULL_TREE, NULL_TREE, 0);
6960       tree res = DECL_RESULT (current_function_decl);
6961       tree inner;
6962
6963       current_function_returns_value = 1;
6964       if (t == error_mark_node)
6965         return NULL_TREE;
6966
6967       inner = t = convert (TREE_TYPE (res), t);
6968
6969       /* Strip any conversions, additions, and subtractions, and see if
6970          we are returning the address of a local variable.  Warn if so.  */
6971       while (1)
6972         {
6973           switch (TREE_CODE (inner))
6974             {
6975             case NOP_EXPR:   case NON_LVALUE_EXPR:  case CONVERT_EXPR:
6976             case PLUS_EXPR:
6977               inner = TREE_OPERAND (inner, 0);
6978               continue;
6979
6980             case MINUS_EXPR:
6981               /* If the second operand of the MINUS_EXPR has a pointer
6982                  type (or is converted from it), this may be valid, so
6983                  don't give a warning.  */
6984               {
6985                 tree op1 = TREE_OPERAND (inner, 1);
6986
6987                 while (! POINTER_TYPE_P (TREE_TYPE (op1))
6988                        && (TREE_CODE (op1) == NOP_EXPR
6989                            || TREE_CODE (op1) == NON_LVALUE_EXPR
6990                            || TREE_CODE (op1) == CONVERT_EXPR))
6991                   op1 = TREE_OPERAND (op1, 0);
6992
6993                 if (POINTER_TYPE_P (TREE_TYPE (op1)))
6994                   break;
6995
6996                 inner = TREE_OPERAND (inner, 0);
6997                 continue;
6998               }
6999               
7000             case ADDR_EXPR:
7001               inner = TREE_OPERAND (inner, 0);
7002
7003               while (TREE_CODE_CLASS (TREE_CODE (inner)) == 'r')
7004                 inner = TREE_OPERAND (inner, 0);
7005
7006               if (TREE_CODE (inner) == VAR_DECL
7007                   && ! DECL_EXTERNAL (inner)
7008                   && ! TREE_STATIC (inner)
7009                   && DECL_CONTEXT (inner) == current_function_decl)
7010                 warning ("function returns address of local variable");
7011               break;
7012
7013             default:
7014               break;
7015             }
7016
7017           break;
7018         }
7019
7020       retval = build (MODIFY_EXPR, TREE_TYPE (res), res, t);
7021     }
7022
7023  return add_stmt (build_return_stmt (retval));
7024 }
7025 \f
7026 struct c_switch {
7027   /* The SWITCH_STMT being built.  */
7028   tree switch_stmt;
7029   /* A splay-tree mapping the low element of a case range to the high
7030      element, or NULL_TREE if there is no high element.  Used to
7031      determine whether or not a new case label duplicates an old case
7032      label.  We need a tree, rather than simply a hash table, because
7033      of the GNU case range extension.  */
7034   splay_tree cases;
7035   /* The next node on the stack.  */
7036   struct c_switch *next;
7037 };
7038
7039 /* A stack of the currently active switch statements.  The innermost
7040    switch statement is on the top of the stack.  There is no need to
7041    mark the stack for garbage collection because it is only active
7042    during the processing of the body of a function, and we never
7043    collect at that point.  */
7044
7045 static struct c_switch *switch_stack;
7046
7047 /* Start a C switch statement, testing expression EXP.  Return the new
7048    SWITCH_STMT.  */
7049
7050 tree
7051 c_start_case (exp)
7052      tree exp;
7053 {
7054   enum tree_code code;
7055   tree type, orig_type = error_mark_node;
7056   struct c_switch *cs;
7057
7058   if (exp != error_mark_node)
7059     {
7060       code = TREE_CODE (TREE_TYPE (exp));
7061       orig_type = TREE_TYPE (exp);
7062
7063       if (! INTEGRAL_TYPE_P (orig_type)
7064           && code != ERROR_MARK)
7065         {
7066           error ("switch quantity not an integer");
7067           exp = integer_zero_node;
7068         }
7069       else
7070         {
7071           type = TYPE_MAIN_VARIANT (TREE_TYPE (exp));
7072
7073           if (warn_traditional && !in_system_header
7074               && (type == long_integer_type_node
7075                   || type == long_unsigned_type_node))
7076             warning ("`long' switch expression not converted to `int' in ISO C");
7077
7078           exp = default_conversion (exp);
7079           type = TREE_TYPE (exp);
7080         }
7081     }
7082
7083   /* Add this new SWITCH_STMT to the stack.  */
7084   cs = (struct c_switch *) xmalloc (sizeof (*cs));
7085   cs->switch_stmt = build_stmt (SWITCH_STMT, exp, NULL_TREE, orig_type);
7086   cs->cases = splay_tree_new (case_compare, NULL, NULL);
7087   cs->next = switch_stack;
7088   switch_stack = cs;
7089
7090   return add_stmt (switch_stack->switch_stmt);
7091 }
7092
7093 /* Process a case label.  */
7094
7095 tree
7096 do_case (low_value, high_value)
7097      tree low_value;
7098      tree high_value;
7099 {
7100   tree label = NULL_TREE;
7101
7102   if (switch_stack)
7103     {
7104       label = c_add_case_label (switch_stack->cases, 
7105                                 SWITCH_COND (switch_stack->switch_stmt), 
7106                                 low_value, high_value);
7107       if (label == error_mark_node)
7108         label = NULL_TREE;
7109     }
7110   else if (low_value)
7111     error ("case label not within a switch statement");
7112   else
7113     error ("`default' label not within a switch statement");
7114
7115   return label;
7116 }
7117
7118 /* Finish the switch statement.  */
7119
7120 void
7121 c_finish_case ()
7122 {
7123   struct c_switch *cs = switch_stack;
7124
7125   RECHAIN_STMTS (cs->switch_stmt, SWITCH_BODY (cs->switch_stmt)); 
7126
7127   /* Pop the stack.  */
7128   switch_stack = switch_stack->next;
7129   splay_tree_delete (cs->cases);
7130   free (cs);
7131 }