OSDN Git Service

PR target/6087
[pf3gnuchains/gcc-fork.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));
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)), 0);
3663           TREE_CONSTANT (t) = TREE_CONSTANT (value);
3664           return t;
3665         }
3666       error ("cast to union type from type not present in union");
3667       return error_mark_node;
3668     }
3669   else
3670     {
3671       tree otype, ovalue;
3672
3673       /* If casting to void, avoid the error that would come
3674          from default_conversion in the case of a non-lvalue array.  */
3675       if (type == void_type_node)
3676         return build1 (CONVERT_EXPR, type, value);
3677
3678       /* Convert functions and arrays to pointers,
3679          but don't convert any other types.  */
3680       value = default_function_array_conversion (value);
3681       otype = TREE_TYPE (value);
3682
3683       /* Optionally warn about potentially worrisome casts.  */
3684
3685       if (warn_cast_qual
3686           && TREE_CODE (type) == POINTER_TYPE
3687           && TREE_CODE (otype) == POINTER_TYPE)
3688         {
3689           tree in_type = type;
3690           tree in_otype = otype;
3691           int added = 0;
3692           int discarded = 0;
3693
3694           /* Check that the qualifiers on IN_TYPE are a superset of
3695              the qualifiers of IN_OTYPE.  The outermost level of
3696              POINTER_TYPE nodes is uninteresting and we stop as soon
3697              as we hit a non-POINTER_TYPE node on either type.  */
3698           do
3699             {
3700               in_otype = TREE_TYPE (in_otype);
3701               in_type = TREE_TYPE (in_type);
3702
3703               /* GNU C allows cv-qualified function types.  'const'
3704                  means the function is very pure, 'volatile' means it
3705                  can't return.  We need to warn when such qualifiers
3706                  are added, not when they're taken away.  */
3707               if (TREE_CODE (in_otype) == FUNCTION_TYPE
3708                   && TREE_CODE (in_type) == FUNCTION_TYPE)
3709                 added |= (TYPE_QUALS (in_type) & ~TYPE_QUALS (in_otype));
3710               else
3711                 discarded |= (TYPE_QUALS (in_otype) & ~TYPE_QUALS (in_type));
3712             }
3713           while (TREE_CODE (in_type) == POINTER_TYPE
3714                  && TREE_CODE (in_otype) == POINTER_TYPE);
3715
3716           if (added)
3717             warning ("cast adds new qualifiers to function type");
3718
3719           if (discarded)
3720             /* There are qualifiers present in IN_OTYPE that are not
3721                present in IN_TYPE.  */
3722             warning ("cast discards qualifiers from pointer target type");
3723         }
3724
3725       /* Warn about possible alignment problems.  */
3726       if (STRICT_ALIGNMENT && warn_cast_align
3727           && TREE_CODE (type) == POINTER_TYPE
3728           && TREE_CODE (otype) == POINTER_TYPE
3729           && TREE_CODE (TREE_TYPE (otype)) != VOID_TYPE
3730           && TREE_CODE (TREE_TYPE (otype)) != FUNCTION_TYPE
3731           /* Don't warn about opaque types, where the actual alignment
3732              restriction is unknown.  */
3733           && !((TREE_CODE (TREE_TYPE (otype)) == UNION_TYPE
3734                 || TREE_CODE (TREE_TYPE (otype)) == RECORD_TYPE)
3735                && TYPE_MODE (TREE_TYPE (otype)) == VOIDmode)
3736           && TYPE_ALIGN (TREE_TYPE (type)) > TYPE_ALIGN (TREE_TYPE (otype)))
3737         warning ("cast increases required alignment of target type");
3738
3739       if (TREE_CODE (type) == INTEGER_TYPE
3740           && TREE_CODE (otype) == POINTER_TYPE
3741           && TYPE_PRECISION (type) != TYPE_PRECISION (otype)
3742           && !TREE_CONSTANT (value))
3743         warning ("cast from pointer to integer of different size");
3744
3745       if (warn_bad_function_cast
3746           && TREE_CODE (value) == CALL_EXPR
3747           && TREE_CODE (type) != TREE_CODE (otype))
3748         warning ("cast does not match function type");
3749
3750       if (TREE_CODE (type) == POINTER_TYPE
3751           && TREE_CODE (otype) == INTEGER_TYPE
3752           && TYPE_PRECISION (type) != TYPE_PRECISION (otype)
3753           /* Don't warn about converting any constant.  */
3754           && !TREE_CONSTANT (value))
3755         warning ("cast to pointer from integer of different size");
3756
3757       ovalue = value;
3758       value = convert (type, value);
3759
3760       /* Ignore any integer overflow caused by the cast.  */
3761       if (TREE_CODE (value) == INTEGER_CST)
3762         {
3763           TREE_OVERFLOW (value) = TREE_OVERFLOW (ovalue);
3764           TREE_CONSTANT_OVERFLOW (value) = TREE_CONSTANT_OVERFLOW (ovalue);
3765         }
3766     }
3767
3768   /* Pedantically, don't let (void *) (FOO *) 0 be a null pointer constant.  */
3769   if (pedantic && TREE_CODE (value) == INTEGER_CST
3770       && TREE_CODE (expr) == INTEGER_CST
3771       && TREE_CODE (TREE_TYPE (expr)) != INTEGER_TYPE)
3772     value = non_lvalue (value);
3773
3774   /* If pedantic, don't let a cast be an lvalue.  */
3775   if (value == expr && pedantic)
3776     value = non_lvalue (value);
3777
3778   return value;
3779 }
3780
3781 /* Interpret a cast of expression EXPR to type TYPE.  */
3782 tree
3783 c_cast_expr (type, expr)
3784      tree type, expr;
3785 {
3786   int saved_wsp = warn_strict_prototypes;
3787
3788   /* This avoids warnings about unprototyped casts on
3789      integers.  E.g. "#define SIG_DFL (void(*)())0".  */
3790   if (TREE_CODE (expr) == INTEGER_CST)
3791     warn_strict_prototypes = 0;
3792   type = groktypename (type);
3793   warn_strict_prototypes = saved_wsp;
3794
3795   return build_c_cast (type, expr);
3796 }
3797
3798 \f
3799 /* Build an assignment expression of lvalue LHS from value RHS.
3800    MODIFYCODE is the code for a binary operator that we use
3801    to combine the old value of LHS with RHS to get the new value.
3802    Or else MODIFYCODE is NOP_EXPR meaning do a simple assignment.  */
3803
3804 tree
3805 build_modify_expr (lhs, modifycode, rhs)
3806      tree lhs, rhs;
3807      enum tree_code modifycode;
3808 {
3809   tree result;
3810   tree newrhs;
3811   tree lhstype = TREE_TYPE (lhs);
3812   tree olhstype = lhstype;
3813
3814   /* Types that aren't fully specified cannot be used in assignments.  */
3815   lhs = require_complete_type (lhs);
3816
3817   /* Avoid duplicate error messages from operands that had errors.  */
3818   if (TREE_CODE (lhs) == ERROR_MARK || TREE_CODE (rhs) == ERROR_MARK)
3819     return error_mark_node;
3820
3821   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
3822   /* Do not use STRIP_NOPS here.  We do not want an enumerator
3823      whose value is 0 to count as a null pointer constant.  */
3824   if (TREE_CODE (rhs) == NON_LVALUE_EXPR)
3825     rhs = TREE_OPERAND (rhs, 0);
3826
3827   newrhs = rhs;
3828
3829   /* Handle control structure constructs used as "lvalues".  */
3830
3831   switch (TREE_CODE (lhs))
3832     {
3833       /* Handle (a, b) used as an "lvalue".  */
3834     case COMPOUND_EXPR:
3835       pedantic_lvalue_warning (COMPOUND_EXPR);
3836       newrhs = build_modify_expr (TREE_OPERAND (lhs, 1), modifycode, rhs);
3837       if (TREE_CODE (newrhs) == ERROR_MARK)
3838         return error_mark_node;
3839       return build (COMPOUND_EXPR, lhstype,
3840                     TREE_OPERAND (lhs, 0), newrhs);
3841  
3842       /* Handle (a ? b : c) used as an "lvalue".  */
3843     case COND_EXPR:
3844       pedantic_lvalue_warning (COND_EXPR);
3845       rhs = save_expr (rhs);
3846       {
3847         /* Produce (a ? (b = rhs) : (c = rhs))
3848            except that the RHS goes through a save-expr
3849            so the code to compute it is only emitted once.  */
3850         tree cond
3851           = build_conditional_expr (TREE_OPERAND (lhs, 0),
3852                                     build_modify_expr (TREE_OPERAND (lhs, 1),
3853                                                        modifycode, rhs),
3854                                     build_modify_expr (TREE_OPERAND (lhs, 2),
3855                                                        modifycode, rhs));
3856         if (TREE_CODE (cond) == ERROR_MARK)
3857           return cond;
3858         /* Make sure the code to compute the rhs comes out
3859            before the split.  */
3860         return build (COMPOUND_EXPR, TREE_TYPE (lhs),
3861                       /* But cast it to void to avoid an "unused" error.  */
3862                       convert (void_type_node, rhs), cond);
3863       }
3864     default:
3865       break;
3866     }
3867
3868   /* If a binary op has been requested, combine the old LHS value with the RHS
3869      producing the value we should actually store into the LHS.  */
3870
3871   if (modifycode != NOP_EXPR)
3872     {
3873       lhs = stabilize_reference (lhs);
3874       newrhs = build_binary_op (modifycode, lhs, rhs, 1);
3875     }
3876
3877   /* Handle a cast used as an "lvalue".
3878      We have already performed any binary operator using the value as cast.
3879      Now convert the result to the cast type of the lhs,
3880      and then true type of the lhs and store it there;
3881      then convert result back to the cast type to be the value
3882      of the assignment.  */
3883
3884   switch (TREE_CODE (lhs))
3885     {
3886     case NOP_EXPR:
3887     case CONVERT_EXPR:
3888     case FLOAT_EXPR:
3889     case FIX_TRUNC_EXPR:
3890     case FIX_FLOOR_EXPR:
3891     case FIX_ROUND_EXPR:
3892     case FIX_CEIL_EXPR:
3893       newrhs = default_function_array_conversion (newrhs);
3894       {
3895         tree inner_lhs = TREE_OPERAND (lhs, 0);
3896         tree result;
3897         result = build_modify_expr (inner_lhs, NOP_EXPR,
3898                                     convert (TREE_TYPE (inner_lhs),
3899                                              convert (lhstype, newrhs)));
3900         if (TREE_CODE (result) == ERROR_MARK)
3901           return result;
3902         pedantic_lvalue_warning (CONVERT_EXPR);
3903         return convert (TREE_TYPE (lhs), result);
3904       }
3905       
3906     default:
3907       break;
3908     }
3909
3910   /* Now we have handled acceptable kinds of LHS that are not truly lvalues.
3911      Reject anything strange now.  */
3912
3913   if (!lvalue_or_else (lhs, "invalid lvalue in assignment"))
3914     return error_mark_node;
3915
3916   /* Warn about storing in something that is `const'.  */
3917
3918   if (TREE_READONLY (lhs) || TYPE_READONLY (lhstype)
3919       || ((TREE_CODE (lhstype) == RECORD_TYPE
3920            || TREE_CODE (lhstype) == UNION_TYPE)
3921           && C_TYPE_FIELDS_READONLY (lhstype)))
3922     readonly_warning (lhs, "assignment");
3923
3924   /* If storing into a structure or union member,
3925      it has probably been given type `int'.
3926      Compute the type that would go with
3927      the actual amount of storage the member occupies.  */
3928
3929   if (TREE_CODE (lhs) == COMPONENT_REF
3930       && (TREE_CODE (lhstype) == INTEGER_TYPE
3931           || TREE_CODE (lhstype) == BOOLEAN_TYPE
3932           || TREE_CODE (lhstype) == REAL_TYPE
3933           || TREE_CODE (lhstype) == ENUMERAL_TYPE))
3934     lhstype = TREE_TYPE (get_unwidened (lhs, 0));
3935
3936   /* If storing in a field that is in actuality a short or narrower than one,
3937      we must store in the field in its actual type.  */
3938
3939   if (lhstype != TREE_TYPE (lhs))
3940     {
3941       lhs = copy_node (lhs);
3942       TREE_TYPE (lhs) = lhstype;
3943     }
3944
3945   /* Convert new value to destination type.  */
3946
3947   newrhs = convert_for_assignment (lhstype, newrhs, _("assignment"),
3948                                    NULL_TREE, NULL_TREE, 0);
3949   if (TREE_CODE (newrhs) == ERROR_MARK)
3950     return error_mark_node;
3951
3952   /* Scan operands */
3953
3954   result = build (MODIFY_EXPR, lhstype, lhs, newrhs);
3955   TREE_SIDE_EFFECTS (result) = 1;
3956
3957   /* If we got the LHS in a different type for storing in,
3958      convert the result back to the nominal type of LHS
3959      so that the value we return always has the same type
3960      as the LHS argument.  */
3961
3962   if (olhstype == TREE_TYPE (result))
3963     return result;
3964   return convert_for_assignment (olhstype, result, _("assignment"),
3965                                  NULL_TREE, NULL_TREE, 0);
3966 }
3967 \f
3968 /* Convert value RHS to type TYPE as preparation for an assignment
3969    to an lvalue of type TYPE.
3970    The real work of conversion is done by `convert'.
3971    The purpose of this function is to generate error messages
3972    for assignments that are not allowed in C.
3973    ERRTYPE is a string to use in error messages:
3974    "assignment", "return", etc.  If it is null, this is parameter passing
3975    for a function call (and different error messages are output).
3976
3977    FUNNAME is the name of the function being called,
3978    as an IDENTIFIER_NODE, or null.
3979    PARMNUM is the number of the argument, for printing in error messages.  */
3980
3981 static tree
3982 convert_for_assignment (type, rhs, errtype, fundecl, funname, parmnum)
3983      tree type, rhs;
3984      const char *errtype;
3985      tree fundecl, funname;
3986      int parmnum;
3987 {
3988   enum tree_code codel = TREE_CODE (type);
3989   tree rhstype;
3990   enum tree_code coder;
3991
3992   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
3993   /* Do not use STRIP_NOPS here.  We do not want an enumerator
3994      whose value is 0 to count as a null pointer constant.  */
3995   if (TREE_CODE (rhs) == NON_LVALUE_EXPR)
3996     rhs = TREE_OPERAND (rhs, 0);
3997
3998   if (TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE
3999       || TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE)
4000     rhs = default_conversion (rhs);
4001   else if (optimize && TREE_CODE (rhs) == VAR_DECL)
4002     rhs = decl_constant_value_for_broken_optimization (rhs);
4003
4004   rhstype = TREE_TYPE (rhs);
4005   coder = TREE_CODE (rhstype);
4006
4007   if (coder == ERROR_MARK)
4008     return error_mark_node;
4009
4010   if (TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (rhstype))
4011     {
4012       overflow_warning (rhs);
4013       /* Check for Objective-C protocols.  This will issue a warning if
4014          there are protocol violations.  No need to use the return value.  */
4015       maybe_objc_comptypes (type, rhstype, 0);
4016       return rhs;
4017     }
4018
4019   if (coder == VOID_TYPE)
4020     {
4021       error ("void value not ignored as it ought to be");
4022       return error_mark_node;
4023     }
4024   /* A type converts to a reference to it.  
4025      This code doesn't fully support references, it's just for the
4026      special case of va_start and va_copy.  */
4027   if (codel == REFERENCE_TYPE
4028       && comptypes (TREE_TYPE (type), TREE_TYPE (rhs)) == 1)
4029     {
4030       if (!lvalue_p (rhs))
4031         {
4032           error ("cannot pass rvalue to reference parameter");
4033           return error_mark_node;
4034         }
4035       if (mark_addressable (rhs) == 0)
4036         return error_mark_node;
4037       rhs = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (rhs)), rhs);
4038
4039       /* We already know that these two types are compatible, but they
4040          may not be exactly identical.  In fact, `TREE_TYPE (type)' is
4041          likely to be __builtin_va_list and `TREE_TYPE (rhs)' is
4042          likely to be va_list, a typedef to __builtin_va_list, which
4043          is different enough that it will cause problems later.  */
4044       if (TREE_TYPE (TREE_TYPE (rhs)) != TREE_TYPE (type))
4045         rhs = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (type)), rhs);
4046
4047       rhs = build1 (NOP_EXPR, type, rhs);
4048       return rhs;
4049     }
4050   /* Arithmetic types all interconvert, and enum is treated like int.  */
4051   else if ((codel == INTEGER_TYPE || codel == REAL_TYPE 
4052             || codel == ENUMERAL_TYPE || codel == COMPLEX_TYPE
4053             || codel == BOOLEAN_TYPE)
4054            && (coder == INTEGER_TYPE || coder == REAL_TYPE 
4055                || coder == ENUMERAL_TYPE || coder == COMPLEX_TYPE
4056                || coder == BOOLEAN_TYPE))
4057     return convert_and_check (type, rhs);
4058
4059   /* Conversion to a transparent union from its member types.
4060      This applies only to function arguments.  */
4061   else if (codel == UNION_TYPE && TYPE_TRANSPARENT_UNION (type) && ! errtype)
4062     {
4063       tree memb_types;
4064       tree marginal_memb_type = 0;
4065
4066       for (memb_types = TYPE_FIELDS (type); memb_types;
4067            memb_types = TREE_CHAIN (memb_types))
4068         {
4069           tree memb_type = TREE_TYPE (memb_types);
4070
4071           if (comptypes (TYPE_MAIN_VARIANT (memb_type),
4072                          TYPE_MAIN_VARIANT (rhstype)))
4073             break;
4074
4075           if (TREE_CODE (memb_type) != POINTER_TYPE)
4076             continue;
4077
4078           if (coder == POINTER_TYPE)
4079             {
4080               tree ttl = TREE_TYPE (memb_type);
4081               tree ttr = TREE_TYPE (rhstype);
4082
4083               /* Any non-function converts to a [const][volatile] void *
4084                  and vice versa; otherwise, targets must be the same.
4085                  Meanwhile, the lhs target must have all the qualifiers of
4086                  the rhs.  */
4087               if (VOID_TYPE_P (ttl) || VOID_TYPE_P (ttr)
4088                   || comp_target_types (memb_type, rhstype))
4089                 {
4090                   /* If this type won't generate any warnings, use it.  */
4091                   if (TYPE_QUALS (ttl) == TYPE_QUALS (ttr)
4092                       || ((TREE_CODE (ttr) == FUNCTION_TYPE
4093                            && TREE_CODE (ttl) == FUNCTION_TYPE)
4094                           ? ((TYPE_QUALS (ttl) | TYPE_QUALS (ttr))
4095                              == TYPE_QUALS (ttr))
4096                           : ((TYPE_QUALS (ttl) | TYPE_QUALS (ttr))
4097                              == TYPE_QUALS (ttl))))
4098                     break;
4099
4100                   /* Keep looking for a better type, but remember this one.  */
4101                   if (! marginal_memb_type)
4102                     marginal_memb_type = memb_type;
4103                 }
4104             }
4105
4106           /* Can convert integer zero to any pointer type.  */
4107           if (integer_zerop (rhs)
4108               || (TREE_CODE (rhs) == NOP_EXPR
4109                   && integer_zerop (TREE_OPERAND (rhs, 0))))
4110             {
4111               rhs = null_pointer_node;
4112               break;
4113             }
4114         }
4115
4116       if (memb_types || marginal_memb_type)
4117         {
4118           if (! memb_types)
4119             {
4120               /* We have only a marginally acceptable member type;
4121                  it needs a warning.  */
4122               tree ttl = TREE_TYPE (marginal_memb_type);
4123               tree ttr = TREE_TYPE (rhstype);
4124
4125               /* Const and volatile mean something different for function
4126                  types, so the usual warnings are not appropriate.  */
4127               if (TREE_CODE (ttr) == FUNCTION_TYPE
4128                   && TREE_CODE (ttl) == FUNCTION_TYPE)
4129                 {
4130                   /* Because const and volatile on functions are
4131                      restrictions that say the function will not do
4132                      certain things, it is okay to use a const or volatile
4133                      function where an ordinary one is wanted, but not
4134                      vice-versa.  */
4135                   if (TYPE_QUALS (ttl) & ~TYPE_QUALS (ttr))
4136                     warn_for_assignment ("%s makes qualified function pointer from unqualified",
4137                                          errtype, funname, parmnum);
4138                 }
4139               else if (TYPE_QUALS (ttr) & ~TYPE_QUALS (ttl))
4140                 warn_for_assignment ("%s discards qualifiers from pointer target type",
4141                                      errtype, funname,
4142                                      parmnum);
4143             }
4144           
4145           if (pedantic && ! DECL_IN_SYSTEM_HEADER (fundecl))
4146             pedwarn ("ISO C prohibits argument conversion to union type");
4147
4148           return build1 (NOP_EXPR, type, rhs);
4149         }
4150     }
4151
4152   /* Conversions among pointers */
4153   else if ((codel == POINTER_TYPE || codel == REFERENCE_TYPE)
4154            && (coder == codel))
4155     {
4156       tree ttl = TREE_TYPE (type);
4157       tree ttr = TREE_TYPE (rhstype);
4158
4159       /* Any non-function converts to a [const][volatile] void *
4160          and vice versa; otherwise, targets must be the same.
4161          Meanwhile, the lhs target must have all the qualifiers of the rhs.  */
4162       if (VOID_TYPE_P (ttl) || VOID_TYPE_P (ttr)
4163           || comp_target_types (type, rhstype)
4164           || (unsigned_type (TYPE_MAIN_VARIANT (ttl))
4165               == unsigned_type (TYPE_MAIN_VARIANT (ttr))))
4166         {
4167           if (pedantic
4168               && ((VOID_TYPE_P (ttl) && TREE_CODE (ttr) == FUNCTION_TYPE)
4169                   ||
4170                   (VOID_TYPE_P (ttr)
4171                    /* Check TREE_CODE to catch cases like (void *) (char *) 0
4172                       which are not ANSI null ptr constants.  */
4173                    && (!integer_zerop (rhs) || TREE_CODE (rhs) == NOP_EXPR)
4174                    && TREE_CODE (ttl) == FUNCTION_TYPE)))
4175             warn_for_assignment ("ISO C forbids %s between function pointer and `void *'",
4176                                  errtype, funname, parmnum);
4177           /* Const and volatile mean something different for function types,
4178              so the usual warnings are not appropriate.  */
4179           else if (TREE_CODE (ttr) != FUNCTION_TYPE
4180                    && TREE_CODE (ttl) != FUNCTION_TYPE)
4181             {
4182               if (TYPE_QUALS (ttr) & ~TYPE_QUALS (ttl))
4183                 warn_for_assignment ("%s discards qualifiers from pointer target type",
4184                                      errtype, funname, parmnum);
4185               /* If this is not a case of ignoring a mismatch in signedness,
4186                  no warning.  */
4187               else if (VOID_TYPE_P (ttl) || VOID_TYPE_P (ttr)
4188                        || comp_target_types (type, rhstype))
4189                 ;
4190               /* If there is a mismatch, do warn.  */
4191               else if (pedantic)
4192                 warn_for_assignment ("pointer targets in %s differ in signedness",
4193                                      errtype, funname, parmnum);
4194             }
4195           else if (TREE_CODE (ttl) == FUNCTION_TYPE
4196                    && TREE_CODE (ttr) == FUNCTION_TYPE)
4197             {
4198               /* Because const and volatile on functions are restrictions
4199                  that say the function will not do certain things,
4200                  it is okay to use a const or volatile function
4201                  where an ordinary one is wanted, but not vice-versa.  */
4202               if (TYPE_QUALS (ttl) & ~TYPE_QUALS (ttr))
4203                 warn_for_assignment ("%s makes qualified function pointer from unqualified",
4204                                      errtype, funname, parmnum);
4205             }
4206         }
4207       else
4208         warn_for_assignment ("%s from incompatible pointer type",
4209                              errtype, funname, parmnum);
4210       return convert (type, rhs);
4211     }
4212   else if (codel == POINTER_TYPE && coder == INTEGER_TYPE)
4213     {
4214       /* An explicit constant 0 can convert to a pointer,
4215          or one that results from arithmetic, even including
4216          a cast to integer type.  */
4217       if (! (TREE_CODE (rhs) == INTEGER_CST && integer_zerop (rhs))
4218           &&
4219           ! (TREE_CODE (rhs) == NOP_EXPR
4220              && TREE_CODE (TREE_TYPE (rhs)) == INTEGER_TYPE
4221              && TREE_CODE (TREE_OPERAND (rhs, 0)) == INTEGER_CST
4222              && integer_zerop (TREE_OPERAND (rhs, 0))))
4223         {
4224           warn_for_assignment ("%s makes pointer from integer without a cast",
4225                                errtype, funname, parmnum);
4226           return convert (type, rhs);
4227         }
4228       return null_pointer_node;
4229     }
4230   else if (codel == INTEGER_TYPE && coder == POINTER_TYPE)
4231     {
4232       warn_for_assignment ("%s makes integer from pointer without a cast",
4233                            errtype, funname, parmnum);
4234       return convert (type, rhs);
4235     }
4236   else if (codel == BOOLEAN_TYPE && coder == POINTER_TYPE)
4237     return convert (type, rhs);
4238
4239   if (!errtype)
4240     {
4241       if (funname)
4242         {
4243           tree selector = maybe_building_objc_message_expr ();
4244  
4245           if (selector && parmnum > 2)
4246             error ("incompatible type for argument %d of `%s'",
4247                    parmnum - 2, IDENTIFIER_POINTER (selector));
4248           else
4249             error ("incompatible type for argument %d of `%s'",
4250                    parmnum, IDENTIFIER_POINTER (funname));
4251         }
4252       else
4253         error ("incompatible type for argument %d of indirect function call",
4254                parmnum);
4255     }
4256   else
4257     error ("incompatible types in %s", errtype);
4258
4259   return error_mark_node;
4260 }
4261
4262 /* Convert VALUE for assignment into inlined parameter PARM.  */
4263
4264 tree
4265 c_convert_parm_for_inlining (parm, value, fn)
4266      tree parm, value, fn;
4267 {
4268   tree ret, type;
4269
4270   /* If FN was prototyped, the value has been converted already
4271      in convert_arguments.  */
4272   if (! value || TYPE_ARG_TYPES (TREE_TYPE (fn)))
4273     return value;
4274
4275   type = TREE_TYPE (parm);
4276   ret = convert_for_assignment (type, value, 
4277                                 (char *) 0 /* arg passing  */, fn,
4278                                 DECL_NAME (fn), 0);
4279   if (PROMOTE_PROTOTYPES
4280       && INTEGRAL_TYPE_P (type)
4281       && (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)))
4282     ret = default_conversion (ret);
4283   return ret;
4284 }
4285
4286 /* Print a warning using MSGID.
4287    It gets OPNAME as its one parameter.
4288    If OPNAME is null, it is replaced by "passing arg ARGNUM of `FUNCTION'".
4289    FUNCTION and ARGNUM are handled specially if we are building an
4290    Objective-C selector.  */
4291
4292 static void
4293 warn_for_assignment (msgid, opname, function, argnum)
4294      const char *msgid;
4295      const char *opname;
4296      tree function;
4297      int argnum;
4298 {
4299   if (opname == 0)
4300     {
4301       tree selector = maybe_building_objc_message_expr ();
4302       char * new_opname;
4303       
4304       if (selector && argnum > 2)
4305         {
4306           function = selector;
4307           argnum -= 2;
4308         }
4309       if (function)
4310         {
4311           /* Function name is known; supply it.  */
4312           const char *const argstring = _("passing arg %d of `%s'");
4313           new_opname = (char *) alloca (IDENTIFIER_LENGTH (function)
4314                                         + strlen (argstring) + 1 + 25
4315                                         /*%d*/ + 1);
4316           sprintf (new_opname, argstring, argnum,
4317                    IDENTIFIER_POINTER (function));
4318         }
4319       else
4320         {
4321           /* Function name unknown (call through ptr); just give arg number.  */
4322           const char *const argnofun = _("passing arg %d of pointer to function");
4323           new_opname = (char *) alloca (strlen (argnofun) + 1 + 25 /*%d*/ + 1);
4324           sprintf (new_opname, argnofun, argnum);
4325         }
4326       opname = new_opname;
4327     }
4328   pedwarn (msgid, opname);
4329 }
4330 \f
4331 /* If VALUE is a compound expr all of whose expressions are constant, then
4332    return its value.  Otherwise, return error_mark_node.
4333
4334    This is for handling COMPOUND_EXPRs as initializer elements
4335    which is allowed with a warning when -pedantic is specified.  */
4336
4337 static tree
4338 valid_compound_expr_initializer (value, endtype)
4339      tree value;
4340      tree endtype;
4341 {
4342   if (TREE_CODE (value) == COMPOUND_EXPR)
4343     {
4344       if (valid_compound_expr_initializer (TREE_OPERAND (value, 0), endtype)
4345           == error_mark_node)
4346         return error_mark_node;
4347       return valid_compound_expr_initializer (TREE_OPERAND (value, 1),
4348                                               endtype);
4349     }
4350   else if (! TREE_CONSTANT (value)
4351            && ! initializer_constant_valid_p (value, endtype))
4352     return error_mark_node;
4353   else
4354     return value;
4355 }
4356 \f
4357 /* Perform appropriate conversions on the initial value of a variable,
4358    store it in the declaration DECL,
4359    and print any error messages that are appropriate.
4360    If the init is invalid, store an ERROR_MARK.  */
4361
4362 void
4363 store_init_value (decl, init)
4364      tree decl, init;
4365 {
4366   tree value, type;
4367
4368   /* If variable's type was invalidly declared, just ignore it.  */
4369
4370   type = TREE_TYPE (decl);
4371   if (TREE_CODE (type) == ERROR_MARK)
4372     return;
4373
4374   /* Digest the specified initializer into an expression.  */
4375
4376   value = digest_init (type, init, TREE_STATIC (decl));
4377
4378   /* Store the expression if valid; else report error.  */
4379
4380 #if 0
4381   /* Note that this is the only place we can detect the error
4382      in a case such as   struct foo bar = (struct foo) { x, y };
4383      where there is one initial value which is a constructor expression.  */
4384   if (value == error_mark_node)
4385     ;
4386   else if (TREE_STATIC (decl) && ! TREE_CONSTANT (value))
4387     {
4388       error ("initializer for static variable is not constant");
4389       value = error_mark_node;
4390     }
4391   else if (TREE_STATIC (decl)
4392            && initializer_constant_valid_p (value, TREE_TYPE (value)) == 0)
4393     {
4394       error ("initializer for static variable uses complicated arithmetic");
4395       value = error_mark_node;
4396     }
4397   else
4398     {
4399       if (pedantic && TREE_CODE (value) == CONSTRUCTOR)
4400         {
4401           if (! TREE_CONSTANT (value))
4402             pedwarn ("aggregate initializer is not constant");
4403           else if (! TREE_STATIC (value))
4404             pedwarn ("aggregate initializer uses complicated arithmetic");
4405         }
4406     }
4407 #endif
4408
4409   if (warn_traditional && !in_system_header
4410       && AGGREGATE_TYPE_P (TREE_TYPE (decl)) && ! TREE_STATIC (decl))
4411     warning ("traditional C rejects automatic aggregate initialization");
4412
4413   DECL_INITIAL (decl) = value;
4414
4415   /* ANSI wants warnings about out-of-range constant initializers.  */
4416   STRIP_TYPE_NOPS (value);
4417   constant_expression_warning (value);
4418
4419   /* Check if we need to set array size from compound literal size.  */
4420   if (TREE_CODE (type) == ARRAY_TYPE
4421       && TYPE_DOMAIN (type) == 0
4422       && value != error_mark_node)
4423     {
4424       tree inside_init = init;
4425
4426       if (TREE_CODE (init) == NON_LVALUE_EXPR)
4427         inside_init = TREE_OPERAND (init, 0);
4428       inside_init = fold (inside_init);
4429
4430       if (TREE_CODE (inside_init) == COMPOUND_LITERAL_EXPR)
4431         {
4432           tree decl = COMPOUND_LITERAL_EXPR_DECL (inside_init);
4433
4434           if (TYPE_DOMAIN (TREE_TYPE (decl)))
4435             {
4436               /* For int foo[] = (int [3]){1}; we need to set array size
4437                  now since later on array initializer will be just the
4438                  brace enclosed list of the compound literal.  */
4439               TYPE_DOMAIN (type) = TYPE_DOMAIN (TREE_TYPE (decl));
4440               layout_type (type);
4441               layout_decl (decl, 0);
4442             }
4443         }
4444     }
4445 }
4446 \f
4447 /* Methods for storing and printing names for error messages.  */
4448
4449 /* Implement a spelling stack that allows components of a name to be pushed
4450    and popped.  Each element on the stack is this structure.  */
4451
4452 struct spelling
4453 {
4454   int kind;
4455   union
4456     {
4457       int i;
4458       const char *s;
4459     } u;
4460 };
4461
4462 #define SPELLING_STRING 1
4463 #define SPELLING_MEMBER 2
4464 #define SPELLING_BOUNDS 3
4465
4466 static struct spelling *spelling;       /* Next stack element (unused).  */
4467 static struct spelling *spelling_base;  /* Spelling stack base.  */
4468 static int spelling_size;               /* Size of the spelling stack.  */
4469
4470 /* Macros to save and restore the spelling stack around push_... functions.
4471    Alternative to SAVE_SPELLING_STACK.  */
4472
4473 #define SPELLING_DEPTH() (spelling - spelling_base)
4474 #define RESTORE_SPELLING_DEPTH(DEPTH) (spelling = spelling_base + (DEPTH))
4475
4476 /* Save and restore the spelling stack around arbitrary C code.  */
4477
4478 #define SAVE_SPELLING_DEPTH(code)               \
4479 {                                               \
4480   int __depth = SPELLING_DEPTH ();              \
4481   code;                                         \
4482   RESTORE_SPELLING_DEPTH (__depth);             \
4483 }
4484
4485 /* Push an element on the spelling stack with type KIND and assign VALUE
4486    to MEMBER.  */
4487
4488 #define PUSH_SPELLING(KIND, VALUE, MEMBER)                              \
4489 {                                                                       \
4490   int depth = SPELLING_DEPTH ();                                        \
4491                                                                         \
4492   if (depth >= spelling_size)                                           \
4493     {                                                                   \
4494       spelling_size += 10;                                              \
4495       if (spelling_base == 0)                                           \
4496         spelling_base                                                   \
4497           = (struct spelling *) xmalloc (spelling_size * sizeof (struct spelling));     \
4498       else                                                              \
4499         spelling_base                                                   \
4500           = (struct spelling *) xrealloc (spelling_base,                \
4501                                           spelling_size * sizeof (struct spelling));    \
4502       RESTORE_SPELLING_DEPTH (depth);                                   \
4503     }                                                                   \
4504                                                                         \
4505   spelling->kind = (KIND);                                              \
4506   spelling->MEMBER = (VALUE);                                           \
4507   spelling++;                                                           \
4508 }
4509
4510 /* Push STRING on the stack.  Printed literally.  */
4511
4512 static void
4513 push_string (string)
4514      const char *string;
4515 {
4516   PUSH_SPELLING (SPELLING_STRING, string, u.s);
4517 }
4518
4519 /* Push a member name on the stack.  Printed as '.' STRING.  */
4520
4521 static void
4522 push_member_name (decl)
4523      tree decl;
4524      
4525 {
4526   const char *const string
4527     = DECL_NAME (decl) ? IDENTIFIER_POINTER (DECL_NAME (decl)) : "<anonymous>";
4528   PUSH_SPELLING (SPELLING_MEMBER, string, u.s);
4529 }
4530
4531 /* Push an array bounds on the stack.  Printed as [BOUNDS].  */
4532
4533 static void
4534 push_array_bounds (bounds)
4535      int bounds;
4536 {
4537   PUSH_SPELLING (SPELLING_BOUNDS, bounds, u.i);
4538 }
4539
4540 /* Compute the maximum size in bytes of the printed spelling.  */
4541
4542 static int
4543 spelling_length ()
4544 {
4545   int size = 0;
4546   struct spelling *p;
4547
4548   for (p = spelling_base; p < spelling; p++)
4549     {
4550       if (p->kind == SPELLING_BOUNDS)
4551         size += 25;
4552       else
4553         size += strlen (p->u.s) + 1;
4554     }
4555
4556   return size;
4557 }
4558
4559 /* Print the spelling to BUFFER and return it.  */
4560
4561 static char *
4562 print_spelling (buffer)
4563      char *buffer;
4564 {
4565   char *d = buffer;
4566   struct spelling *p;
4567
4568   for (p = spelling_base; p < spelling; p++)
4569     if (p->kind == SPELLING_BOUNDS)
4570       {
4571         sprintf (d, "[%d]", p->u.i);
4572         d += strlen (d);
4573       }
4574     else
4575       {
4576         const char *s;
4577         if (p->kind == SPELLING_MEMBER)
4578           *d++ = '.';
4579         for (s = p->u.s; (*d = *s++); d++)
4580           ;
4581       }
4582   *d++ = '\0';
4583   return buffer;
4584 }
4585
4586 /* Issue an error message for a bad initializer component.
4587    MSGID identifies the message.
4588    The component name is taken from the spelling stack.  */
4589
4590 void
4591 error_init (msgid)
4592      const char *msgid;
4593 {
4594   char *ofwhat;
4595
4596   error ("%s", _(msgid));
4597   ofwhat = print_spelling ((char *) alloca (spelling_length () + 1));
4598   if (*ofwhat)
4599     error ("(near initialization for `%s')", ofwhat);
4600 }
4601
4602 /* Issue a pedantic warning for a bad initializer component.
4603    MSGID identifies the message.
4604    The component name is taken from the spelling stack.  */
4605
4606 void
4607 pedwarn_init (msgid)
4608      const char *msgid;
4609 {
4610   char *ofwhat;
4611
4612   pedwarn ("%s", _(msgid));
4613   ofwhat = print_spelling ((char *) alloca (spelling_length () + 1));
4614   if (*ofwhat)
4615     pedwarn ("(near initialization for `%s')", ofwhat);
4616 }
4617
4618 /* Issue a warning for a bad initializer component.
4619    MSGID identifies the message.
4620    The component name is taken from the spelling stack.  */
4621
4622 static void
4623 warning_init (msgid)
4624      const char *msgid;
4625 {
4626   char *ofwhat;
4627
4628   warning ("%s", _(msgid));
4629   ofwhat = print_spelling ((char *) alloca (spelling_length () + 1));
4630   if (*ofwhat)
4631     warning ("(near initialization for `%s')", ofwhat);
4632 }
4633 \f
4634 /* Digest the parser output INIT as an initializer for type TYPE.
4635    Return a C expression of type TYPE to represent the initial value.
4636
4637    REQUIRE_CONSTANT requests an error if non-constant initializers or
4638    elements are seen.  */
4639
4640 static tree
4641 digest_init (type, init, require_constant)
4642      tree type, init;
4643      int require_constant;
4644 {
4645   enum tree_code code = TREE_CODE (type);
4646   tree inside_init = init;
4647
4648   if (type == error_mark_node
4649       || init == error_mark_node
4650       || TREE_TYPE (init) == error_mark_node)
4651     return error_mark_node;
4652
4653   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
4654   /* Do not use STRIP_NOPS here.  We do not want an enumerator
4655      whose value is 0 to count as a null pointer constant.  */
4656   if (TREE_CODE (init) == NON_LVALUE_EXPR)
4657     inside_init = TREE_OPERAND (init, 0);
4658
4659   inside_init = fold (inside_init);
4660
4661   /* Initialization of an array of chars from a string constant
4662      optionally enclosed in braces.  */
4663
4664   if (code == ARRAY_TYPE)
4665     {
4666       tree typ1 = TYPE_MAIN_VARIANT (TREE_TYPE (type));
4667       if ((typ1 == char_type_node
4668            || typ1 == signed_char_type_node
4669            || typ1 == unsigned_char_type_node
4670            || typ1 == unsigned_wchar_type_node
4671            || typ1 == signed_wchar_type_node)
4672           && ((inside_init && TREE_CODE (inside_init) == STRING_CST)))
4673         {
4674           if (comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (inside_init)),
4675                          TYPE_MAIN_VARIANT (type)))
4676             return inside_init;
4677
4678           if ((TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (inside_init)))
4679                != char_type_node)
4680               && TYPE_PRECISION (typ1) == TYPE_PRECISION (char_type_node))
4681             {
4682               error_init ("char-array initialized from wide string");
4683               return error_mark_node;
4684             }
4685           if ((TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (inside_init)))
4686                == char_type_node)
4687               && TYPE_PRECISION (typ1) != TYPE_PRECISION (char_type_node))
4688             {
4689               error_init ("int-array initialized from non-wide string");
4690               return error_mark_node;
4691             }
4692
4693           TREE_TYPE (inside_init) = type;
4694           if (TYPE_DOMAIN (type) != 0
4695               && TYPE_SIZE (type) != 0
4696               && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
4697               /* Subtract 1 (or sizeof (wchar_t))
4698                  because it's ok to ignore the terminating null char
4699                  that is counted in the length of the constant.  */
4700               && 0 > compare_tree_int (TYPE_SIZE_UNIT (type),
4701                                        TREE_STRING_LENGTH (inside_init)
4702                                        - ((TYPE_PRECISION (typ1)
4703                                            != TYPE_PRECISION (char_type_node))
4704                                           ? (TYPE_PRECISION (wchar_type_node)
4705                                              / BITS_PER_UNIT)
4706                                           : 1)))
4707             pedwarn_init ("initializer-string for array of chars is too long");
4708
4709           return inside_init;
4710         }
4711     }
4712
4713   /* Any type can be initialized
4714      from an expression of the same type, optionally with braces.  */
4715
4716   if (inside_init && TREE_TYPE (inside_init) != 0
4717       && (comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (inside_init)),
4718                      TYPE_MAIN_VARIANT (type))
4719           || (code == ARRAY_TYPE
4720               && comptypes (TREE_TYPE (inside_init), type))
4721           || (code == VECTOR_TYPE
4722               && comptypes (TREE_TYPE (inside_init), type))
4723           || (code == POINTER_TYPE
4724               && (TREE_CODE (TREE_TYPE (inside_init)) == ARRAY_TYPE
4725                   || TREE_CODE (TREE_TYPE (inside_init)) == FUNCTION_TYPE)
4726               && comptypes (TREE_TYPE (TREE_TYPE (inside_init)),
4727                             TREE_TYPE (type)))))
4728     {
4729       if (code == POINTER_TYPE)
4730         inside_init = default_function_array_conversion (inside_init);
4731
4732       if (require_constant && !flag_isoc99
4733           && TREE_CODE (inside_init) == COMPOUND_LITERAL_EXPR)
4734         {
4735           /* As an extension, allow initializing objects with static storage
4736              duration with compound literals (which are then treated just as
4737              the brace enclosed list they contain).  */
4738           tree decl = COMPOUND_LITERAL_EXPR_DECL (inside_init);
4739           inside_init = DECL_INITIAL (decl);
4740         }
4741
4742       if (code == ARRAY_TYPE && TREE_CODE (inside_init) != STRING_CST
4743           && TREE_CODE (inside_init) != CONSTRUCTOR)
4744         {
4745           error_init ("array initialized from non-constant array expression");
4746           return error_mark_node;
4747         }
4748
4749       if (optimize && TREE_CODE (inside_init) == VAR_DECL)
4750         inside_init = decl_constant_value_for_broken_optimization (inside_init);
4751
4752       /* Compound expressions can only occur here if -pedantic or
4753          -pedantic-errors is specified.  In the later case, we always want
4754          an error.  In the former case, we simply want a warning.  */
4755       if (require_constant && pedantic
4756           && TREE_CODE (inside_init) == COMPOUND_EXPR)
4757         {
4758           inside_init
4759             = valid_compound_expr_initializer (inside_init,
4760                                                TREE_TYPE (inside_init));
4761           if (inside_init == error_mark_node)
4762             error_init ("initializer element is not constant");
4763           else
4764             pedwarn_init ("initializer element is not constant");
4765           if (flag_pedantic_errors)
4766             inside_init = error_mark_node;
4767         }
4768       else if (require_constant 
4769                && (!TREE_CONSTANT (inside_init)
4770                    /* This test catches things like `7 / 0' which
4771                       result in an expression for which TREE_CONSTANT
4772                       is true, but which is not actually something
4773                       that is a legal constant.  We really should not
4774                       be using this function, because it is a part of
4775                       the back-end.  Instead, the expression should
4776                       already have been turned into ERROR_MARK_NODE.  */
4777                    || !initializer_constant_valid_p (inside_init,
4778                                                      TREE_TYPE (inside_init))))
4779         {
4780           error_init ("initializer element is not constant");
4781           inside_init = error_mark_node;
4782         }
4783
4784       return inside_init;
4785     }
4786
4787   /* Handle scalar types, including conversions.  */
4788
4789   if (code == INTEGER_TYPE || code == REAL_TYPE || code == POINTER_TYPE
4790       || code == ENUMERAL_TYPE || code == BOOLEAN_TYPE || code == COMPLEX_TYPE)
4791     {
4792       /* Note that convert_for_assignment calls default_conversion
4793          for arrays and functions.  We must not call it in the
4794          case where inside_init is a null pointer constant.  */
4795       inside_init
4796         = convert_for_assignment (type, init, _("initialization"),
4797                                   NULL_TREE, NULL_TREE, 0);
4798
4799       if (require_constant && ! TREE_CONSTANT (inside_init))
4800         {
4801           error_init ("initializer element is not constant");
4802           inside_init = error_mark_node;
4803         }
4804       else if (require_constant
4805                && initializer_constant_valid_p (inside_init, TREE_TYPE (inside_init)) == 0)
4806         {
4807           error_init ("initializer element is not computable at load time");
4808           inside_init = error_mark_node;
4809         }
4810
4811       return inside_init;
4812     }
4813
4814   /* Come here only for records and arrays.  */
4815
4816   if (COMPLETE_TYPE_P (type) && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
4817     {
4818       error_init ("variable-sized object may not be initialized");
4819       return error_mark_node;
4820     }
4821
4822   error_init ("invalid initializer");
4823   return error_mark_node;
4824 }
4825 \f
4826 /* Handle initializers that use braces.  */
4827
4828 /* Type of object we are accumulating a constructor for.
4829    This type is always a RECORD_TYPE, UNION_TYPE or ARRAY_TYPE.  */
4830 static tree constructor_type;
4831
4832 /* For a RECORD_TYPE or UNION_TYPE, this is the chain of fields
4833    left to fill.  */
4834 static tree constructor_fields;
4835
4836 /* For an ARRAY_TYPE, this is the specified index
4837    at which to store the next element we get.  */
4838 static tree constructor_index;
4839
4840 /* For an ARRAY_TYPE, this is the maximum index.  */
4841 static tree constructor_max_index;
4842
4843 /* For a RECORD_TYPE, this is the first field not yet written out.  */
4844 static tree constructor_unfilled_fields;
4845
4846 /* For an ARRAY_TYPE, this is the index of the first element
4847    not yet written out.  */
4848 static tree constructor_unfilled_index;
4849
4850 /* In a RECORD_TYPE, the byte index of the next consecutive field.
4851    This is so we can generate gaps between fields, when appropriate.  */
4852 static tree constructor_bit_index;
4853
4854 /* If we are saving up the elements rather than allocating them,
4855    this is the list of elements so far (in reverse order,
4856    most recent first).  */
4857 static tree constructor_elements;
4858
4859 /* 1 if constructor should be incrementally stored into a constructor chain,
4860    0 if all the elements should be kept in AVL tree.  */
4861 static int constructor_incremental;
4862
4863 /* 1 if so far this constructor's elements are all compile-time constants.  */
4864 static int constructor_constant;
4865
4866 /* 1 if so far this constructor's elements are all valid address constants.  */
4867 static int constructor_simple;
4868
4869 /* 1 if this constructor is erroneous so far.  */
4870 static int constructor_erroneous;
4871
4872 /* 1 if have called defer_addressed_constants.  */
4873 static int constructor_subconstants_deferred;
4874
4875 /* Structure for managing pending initializer elements, organized as an
4876    AVL tree.  */
4877
4878 struct init_node
4879 {
4880   struct init_node *left, *right;
4881   struct init_node *parent;
4882   int balance;
4883   tree purpose;
4884   tree value;
4885 };
4886
4887 /* Tree of pending elements at this constructor level.
4888    These are elements encountered out of order
4889    which belong at places we haven't reached yet in actually
4890    writing the output.
4891    Will never hold tree nodes across GC runs.  */
4892 static struct init_node *constructor_pending_elts;
4893
4894 /* The SPELLING_DEPTH of this constructor.  */
4895 static int constructor_depth;
4896
4897 /* 0 if implicitly pushing constructor levels is allowed.  */
4898 int constructor_no_implicit = 0; /* 0 for C; 1 for some other languages.  */
4899
4900 static int require_constant_value;
4901 static int require_constant_elements;
4902
4903 /* DECL node for which an initializer is being read.
4904    0 means we are reading a constructor expression
4905    such as (struct foo) {...}.  */
4906 static tree constructor_decl;
4907
4908 /* start_init saves the ASMSPEC arg here for really_start_incremental_init.  */
4909 static const char *constructor_asmspec;
4910
4911 /* Nonzero if this is an initializer for a top-level decl.  */
4912 static int constructor_top_level;
4913
4914 /* Nonzero if there were any member designators in this initializer.  */
4915 static int constructor_designated;
4916
4917 /* Nesting depth of designator list.  */
4918 static int designator_depth;
4919
4920 /* Nonzero if there were diagnosed errors in this designator list.  */
4921 static int designator_errorneous;
4922
4923 \f
4924 /* This stack has a level for each implicit or explicit level of
4925    structuring in the initializer, including the outermost one.  It
4926    saves the values of most of the variables above.  */
4927
4928 struct constructor_range_stack;
4929
4930 struct constructor_stack
4931 {
4932   struct constructor_stack *next;
4933   tree type;
4934   tree fields;
4935   tree index;
4936   tree max_index;
4937   tree unfilled_index;
4938   tree unfilled_fields;
4939   tree bit_index;
4940   tree elements;
4941   struct init_node *pending_elts;
4942   int offset;
4943   int depth;
4944   /* If nonzero, this value should replace the entire
4945      constructor at this level.  */
4946   tree replacement_value;
4947   struct constructor_range_stack *range_stack;
4948   char constant;
4949   char simple;
4950   char implicit;
4951   char erroneous;
4952   char outer;
4953   char incremental;
4954   char designated;
4955 };
4956
4957 struct constructor_stack *constructor_stack;
4958
4959 /* This stack represents designators from some range designator up to
4960    the last designator in the list.  */
4961
4962 struct constructor_range_stack
4963 {
4964   struct constructor_range_stack *next, *prev;
4965   struct constructor_stack *stack;
4966   tree range_start;
4967   tree index;
4968   tree range_end;
4969   tree fields;
4970 };
4971
4972 struct constructor_range_stack *constructor_range_stack;
4973
4974 /* This stack records separate initializers that are nested.
4975    Nested initializers can't happen in ANSI C, but GNU C allows them
4976    in cases like { ... (struct foo) { ... } ... }.  */
4977
4978 struct initializer_stack
4979 {
4980   struct initializer_stack *next;
4981   tree decl;
4982   const char *asmspec;
4983   struct constructor_stack *constructor_stack;
4984   struct constructor_range_stack *constructor_range_stack;
4985   tree elements;
4986   struct spelling *spelling;
4987   struct spelling *spelling_base;
4988   int spelling_size;
4989   char top_level;
4990   char require_constant_value;
4991   char require_constant_elements;
4992   char deferred;
4993 };
4994
4995 struct initializer_stack *initializer_stack;
4996 \f
4997 /* Prepare to parse and output the initializer for variable DECL.  */
4998
4999 void
5000 start_init (decl, asmspec_tree, top_level)
5001      tree decl;
5002      tree asmspec_tree;
5003      int top_level;
5004 {
5005   const char *locus;
5006   struct initializer_stack *p
5007     = (struct initializer_stack *) xmalloc (sizeof (struct initializer_stack));
5008   const char *asmspec = 0;
5009
5010   if (asmspec_tree)
5011     asmspec = TREE_STRING_POINTER (asmspec_tree);
5012
5013   p->decl = constructor_decl;
5014   p->asmspec = constructor_asmspec;
5015   p->require_constant_value = require_constant_value;
5016   p->require_constant_elements = require_constant_elements;
5017   p->constructor_stack = constructor_stack;
5018   p->constructor_range_stack = constructor_range_stack;
5019   p->elements = constructor_elements;
5020   p->spelling = spelling;
5021   p->spelling_base = spelling_base;
5022   p->spelling_size = spelling_size;
5023   p->deferred = constructor_subconstants_deferred;
5024   p->top_level = constructor_top_level;
5025   p->next = initializer_stack;
5026   initializer_stack = p;
5027
5028   constructor_decl = decl;
5029   constructor_asmspec = asmspec;
5030   constructor_subconstants_deferred = 0;
5031   constructor_designated = 0;
5032   constructor_top_level = top_level;
5033
5034   if (decl != 0)
5035     {
5036       require_constant_value = TREE_STATIC (decl);
5037       require_constant_elements
5038         = ((TREE_STATIC (decl) || (pedantic && !flag_isoc99))
5039            /* For a scalar, you can always use any value to initialize,
5040               even within braces.  */
5041            && (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
5042                || TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
5043                || TREE_CODE (TREE_TYPE (decl)) == UNION_TYPE
5044                || TREE_CODE (TREE_TYPE (decl)) == QUAL_UNION_TYPE));
5045       locus = IDENTIFIER_POINTER (DECL_NAME (decl));
5046     }
5047   else
5048     {
5049       require_constant_value = 0;
5050       require_constant_elements = 0;
5051       locus = "(anonymous)";
5052     }
5053
5054   constructor_stack = 0;
5055   constructor_range_stack = 0;
5056
5057   missing_braces_mentioned = 0;
5058
5059   spelling_base = 0;
5060   spelling_size = 0;
5061   RESTORE_SPELLING_DEPTH (0);
5062
5063   if (locus)
5064     push_string (locus);
5065 }
5066
5067 void
5068 finish_init ()
5069 {
5070   struct initializer_stack *p = initializer_stack;
5071
5072   /* Output subconstants (string constants, usually)
5073      that were referenced within this initializer and saved up.
5074      Must do this if and only if we called defer_addressed_constants.  */
5075   if (constructor_subconstants_deferred)
5076     output_deferred_addressed_constants ();
5077
5078   /* Free the whole constructor stack of this initializer.  */
5079   while (constructor_stack)
5080     {
5081       struct constructor_stack *q = constructor_stack;
5082       constructor_stack = q->next;
5083       free (q);
5084     }
5085
5086   if (constructor_range_stack)
5087     abort ();
5088
5089   /* Pop back to the data of the outer initializer (if any).  */
5090   constructor_decl = p->decl;
5091   constructor_asmspec = p->asmspec;
5092   require_constant_value = p->require_constant_value;
5093   require_constant_elements = p->require_constant_elements;
5094   constructor_stack = p->constructor_stack;
5095   constructor_range_stack = p->constructor_range_stack;
5096   constructor_elements = p->elements;
5097   spelling = p->spelling;
5098   spelling_base = p->spelling_base;
5099   spelling_size = p->spelling_size;
5100   constructor_subconstants_deferred = p->deferred;
5101   constructor_top_level = p->top_level;
5102   initializer_stack = p->next;
5103   free (p);
5104 }
5105 \f
5106 /* Call here when we see the initializer is surrounded by braces.
5107    This is instead of a call to push_init_level;
5108    it is matched by a call to pop_init_level.
5109
5110    TYPE is the type to initialize, for a constructor expression.
5111    For an initializer for a decl, TYPE is zero.  */
5112
5113 void
5114 really_start_incremental_init (type)
5115      tree type;
5116 {
5117   struct constructor_stack *p
5118     = (struct constructor_stack *) xmalloc (sizeof (struct constructor_stack));
5119
5120   if (type == 0)
5121     type = TREE_TYPE (constructor_decl);
5122
5123   p->type = constructor_type;
5124   p->fields = constructor_fields;
5125   p->index = constructor_index;
5126   p->max_index = constructor_max_index;
5127   p->unfilled_index = constructor_unfilled_index;
5128   p->unfilled_fields = constructor_unfilled_fields;
5129   p->bit_index = constructor_bit_index;
5130   p->elements = constructor_elements;
5131   p->constant = constructor_constant;
5132   p->simple = constructor_simple;
5133   p->erroneous = constructor_erroneous;
5134   p->pending_elts = constructor_pending_elts;
5135   p->depth = constructor_depth;
5136   p->replacement_value = 0;
5137   p->implicit = 0;
5138   p->range_stack = 0;
5139   p->outer = 0;
5140   p->incremental = constructor_incremental;
5141   p->designated = constructor_designated;
5142   p->next = 0;
5143   constructor_stack = p;
5144
5145   constructor_constant = 1;
5146   constructor_simple = 1;
5147   constructor_depth = SPELLING_DEPTH ();
5148   constructor_elements = 0;
5149   constructor_pending_elts = 0;
5150   constructor_type = type;
5151   constructor_incremental = 1;
5152   constructor_designated = 0;
5153   designator_depth = 0;
5154   designator_errorneous = 0;
5155
5156   if (TREE_CODE (constructor_type) == RECORD_TYPE
5157       || TREE_CODE (constructor_type) == UNION_TYPE)
5158     {
5159       constructor_fields = TYPE_FIELDS (constructor_type);
5160       /* Skip any nameless bit fields at the beginning.  */
5161       while (constructor_fields != 0 && DECL_C_BIT_FIELD (constructor_fields)
5162              && DECL_NAME (constructor_fields) == 0)
5163         constructor_fields = TREE_CHAIN (constructor_fields);
5164
5165       constructor_unfilled_fields = constructor_fields;
5166       constructor_bit_index = bitsize_zero_node;
5167     }
5168   else if (TREE_CODE (constructor_type) == ARRAY_TYPE)
5169     {
5170       if (TYPE_DOMAIN (constructor_type))
5171         {
5172           constructor_max_index
5173             = TYPE_MAX_VALUE (TYPE_DOMAIN (constructor_type));
5174
5175           /* Detect non-empty initializations of zero-length arrays.  */
5176           if (constructor_max_index == NULL_TREE
5177               && TYPE_SIZE (constructor_type))
5178             constructor_max_index = build_int_2 (-1, -1);
5179
5180           /* constructor_max_index needs to be an INTEGER_CST.  Attempts
5181              to initialize VLAs will cause an proper error; avoid tree
5182              checking errors as well by setting a safe value.  */
5183           if (constructor_max_index
5184               && TREE_CODE (constructor_max_index) != INTEGER_CST)
5185             constructor_max_index = build_int_2 (-1, -1);
5186
5187           constructor_index
5188             = convert (bitsizetype,
5189                        TYPE_MIN_VALUE (TYPE_DOMAIN (constructor_type)));
5190         }
5191       else
5192         constructor_index = bitsize_zero_node;
5193
5194       constructor_unfilled_index = constructor_index;
5195     }
5196   else if (TREE_CODE (constructor_type) == VECTOR_TYPE)
5197     {
5198       /* Vectors are like simple fixed-size arrays.  */
5199       constructor_max_index =
5200         build_int_2 (TYPE_VECTOR_SUBPARTS (constructor_type) - 1, 0);
5201       constructor_index = convert (bitsizetype, bitsize_zero_node);
5202       constructor_unfilled_index = constructor_index;
5203     }
5204   else
5205     {
5206       /* Handle the case of int x = {5}; */
5207       constructor_fields = constructor_type;
5208       constructor_unfilled_fields = constructor_type;
5209     }
5210 }
5211 \f
5212 /* Push down into a subobject, for initialization.
5213    If this is for an explicit set of braces, IMPLICIT is 0.
5214    If it is because the next element belongs at a lower level,
5215    IMPLICIT is 1 (or 2 if the push is because of designator list).  */
5216
5217 void
5218 push_init_level (implicit)
5219      int implicit;
5220 {
5221   struct constructor_stack *p;
5222   tree value = NULL_TREE;
5223
5224   /* If we've exhausted any levels that didn't have braces,
5225      pop them now.  */
5226   while (constructor_stack->implicit)
5227     {
5228       if ((TREE_CODE (constructor_type) == RECORD_TYPE
5229            || TREE_CODE (constructor_type) == UNION_TYPE)
5230           && constructor_fields == 0)
5231         process_init_element (pop_init_level (1));
5232       else if (TREE_CODE (constructor_type) == ARRAY_TYPE
5233                && tree_int_cst_lt (constructor_max_index, constructor_index))
5234         process_init_element (pop_init_level (1));
5235       else
5236         break;
5237     }
5238
5239   /* Unless this is an explicit brace, we need to preserve previous
5240      content if any.  */
5241   if (implicit)
5242     {
5243       if ((TREE_CODE (constructor_type) == RECORD_TYPE
5244            || TREE_CODE (constructor_type) == UNION_TYPE)
5245           && constructor_fields)
5246         value = find_init_member (constructor_fields);
5247       else if (TREE_CODE (constructor_type) == ARRAY_TYPE)
5248         value = find_init_member (constructor_index);
5249     }
5250
5251   p = (struct constructor_stack *) xmalloc (sizeof (struct constructor_stack));
5252   p->type = constructor_type;
5253   p->fields = constructor_fields;
5254   p->index = constructor_index;
5255   p->max_index = constructor_max_index;
5256   p->unfilled_index = constructor_unfilled_index;
5257   p->unfilled_fields = constructor_unfilled_fields;
5258   p->bit_index = constructor_bit_index;
5259   p->elements = constructor_elements;
5260   p->constant = constructor_constant;
5261   p->simple = constructor_simple;
5262   p->erroneous = constructor_erroneous;
5263   p->pending_elts = constructor_pending_elts;
5264   p->depth = constructor_depth;
5265   p->replacement_value = 0;
5266   p->implicit = implicit;
5267   p->outer = 0;
5268   p->incremental = constructor_incremental;
5269   p->designated = constructor_designated;
5270   p->next = constructor_stack;
5271   p->range_stack = 0;
5272   constructor_stack = p;
5273
5274   constructor_constant = 1;
5275   constructor_simple = 1;
5276   constructor_depth = SPELLING_DEPTH ();
5277   constructor_elements = 0;
5278   constructor_incremental = 1;
5279   constructor_designated = 0;
5280   constructor_pending_elts = 0;
5281   if (!implicit)
5282     {
5283       p->range_stack = constructor_range_stack;
5284       constructor_range_stack = 0;
5285       designator_depth = 0;
5286       designator_errorneous = 0;
5287     }
5288
5289   /* Don't die if an entire brace-pair level is superfluous
5290      in the containing level.  */
5291   if (constructor_type == 0)
5292     ;
5293   else if (TREE_CODE (constructor_type) == RECORD_TYPE
5294            || TREE_CODE (constructor_type) == UNION_TYPE)
5295     {
5296       /* Don't die if there are extra init elts at the end.  */
5297       if (constructor_fields == 0)
5298         constructor_type = 0;
5299       else
5300         {
5301           constructor_type = TREE_TYPE (constructor_fields);
5302           push_member_name (constructor_fields);
5303           constructor_depth++;
5304         }
5305     }
5306   else if (TREE_CODE (constructor_type) == ARRAY_TYPE)
5307     {
5308       constructor_type = TREE_TYPE (constructor_type);
5309       push_array_bounds (tree_low_cst (constructor_index, 0));
5310       constructor_depth++;
5311     }
5312
5313   if (constructor_type == 0)
5314     {
5315       error_init ("extra brace group at end of initializer");
5316       constructor_fields = 0;
5317       constructor_unfilled_fields = 0;
5318       return;
5319     }
5320
5321   if (value && TREE_CODE (value) == CONSTRUCTOR)
5322     {
5323       constructor_constant = TREE_CONSTANT (value);
5324       constructor_simple = TREE_STATIC (value);
5325       constructor_elements = TREE_OPERAND (value, 1);
5326       if (constructor_elements
5327           && (TREE_CODE (constructor_type) == RECORD_TYPE
5328               || TREE_CODE (constructor_type) == ARRAY_TYPE))
5329         set_nonincremental_init ();
5330     }
5331
5332   if (implicit == 1 && warn_missing_braces && !missing_braces_mentioned)
5333     {
5334       missing_braces_mentioned = 1;
5335       warning_init ("missing braces around initializer");
5336     }
5337
5338   if (TREE_CODE (constructor_type) == RECORD_TYPE
5339            || TREE_CODE (constructor_type) == UNION_TYPE)
5340     {
5341       constructor_fields = TYPE_FIELDS (constructor_type);
5342       /* Skip any nameless bit fields at the beginning.  */
5343       while (constructor_fields != 0 && DECL_C_BIT_FIELD (constructor_fields)
5344              && DECL_NAME (constructor_fields) == 0)
5345         constructor_fields = TREE_CHAIN (constructor_fields);
5346
5347       constructor_unfilled_fields = constructor_fields;
5348       constructor_bit_index = bitsize_zero_node;
5349     }
5350   else if (TREE_CODE (constructor_type) == VECTOR_TYPE)
5351     {
5352       /* Vectors are like simple fixed-size arrays.  */
5353       constructor_max_index =
5354         build_int_2 (TYPE_VECTOR_SUBPARTS (constructor_type) - 1, 0);
5355       constructor_index = convert (bitsizetype, integer_zero_node);
5356       constructor_unfilled_index = constructor_index;
5357     }
5358   else if (TREE_CODE (constructor_type) == ARRAY_TYPE)
5359     {
5360       if (TYPE_DOMAIN (constructor_type))
5361         {
5362           constructor_max_index
5363             = TYPE_MAX_VALUE (TYPE_DOMAIN (constructor_type));
5364
5365           /* Detect non-empty initializations of zero-length arrays.  */
5366           if (constructor_max_index == NULL_TREE
5367               && TYPE_SIZE (constructor_type))
5368             constructor_max_index = build_int_2 (-1, -1);
5369
5370           /* constructor_max_index needs to be an INTEGER_CST.  Attempts
5371              to initialize VLAs will cause an proper error; avoid tree
5372              checking errors as well by setting a safe value.  */
5373           if (constructor_max_index
5374               && TREE_CODE (constructor_max_index) != INTEGER_CST)
5375             constructor_max_index = build_int_2 (-1, -1);
5376
5377           constructor_index
5378             = convert (bitsizetype, 
5379                        TYPE_MIN_VALUE (TYPE_DOMAIN (constructor_type)));
5380         }
5381       else
5382         constructor_index = bitsize_zero_node;
5383
5384       constructor_unfilled_index = constructor_index;
5385       if (value && TREE_CODE (value) == STRING_CST)
5386         {
5387           /* We need to split the char/wchar array into individual
5388              characters, so that we don't have to special case it
5389              everywhere.  */
5390           set_nonincremental_init_from_string (value);
5391         }
5392     }
5393   else
5394     {
5395       warning_init ("braces around scalar initializer");
5396       constructor_fields = constructor_type;
5397       constructor_unfilled_fields = constructor_type;
5398     }
5399 }
5400
5401 /* At the end of an implicit or explicit brace level, 
5402    finish up that level of constructor.
5403    If we were outputting the elements as they are read, return 0
5404    from inner levels (process_init_element ignores that),
5405    but return error_mark_node from the outermost level
5406    (that's what we want to put in DECL_INITIAL).
5407    Otherwise, return a CONSTRUCTOR expression.  */
5408
5409 tree
5410 pop_init_level (implicit)
5411      int implicit;
5412 {
5413   struct constructor_stack *p;
5414   tree constructor = 0;
5415
5416   if (implicit == 0)
5417     {
5418       /* When we come to an explicit close brace,
5419          pop any inner levels that didn't have explicit braces.  */
5420       while (constructor_stack->implicit)
5421         process_init_element (pop_init_level (1));
5422
5423       if (constructor_range_stack)
5424         abort ();
5425     }
5426
5427   p = constructor_stack;
5428
5429   /* Error for initializing a flexible array member, or a zero-length
5430      array member in an inappropriate context.  */
5431   if (constructor_type && constructor_fields
5432       && TREE_CODE (constructor_type) == ARRAY_TYPE
5433       && TYPE_DOMAIN (constructor_type)
5434       && ! TYPE_MAX_VALUE (TYPE_DOMAIN (constructor_type)))
5435     {
5436       /* Silently discard empty initializations.  The parser will
5437          already have pedwarned for empty brackets.  */
5438       if (integer_zerop (constructor_unfilled_index))
5439         constructor_type = NULL_TREE;
5440       else if (! TYPE_SIZE (constructor_type))
5441         {
5442           if (constructor_depth > 2)
5443             error_init ("initialization of flexible array member in a nested context");
5444           else if (pedantic)
5445             pedwarn_init ("initialization of a flexible array member");
5446
5447           /* We have already issued an error message for the existence
5448              of a flexible array member not at the end of the structure.
5449              Discard the initializer so that we do not abort later.  */
5450           if (TREE_CHAIN (constructor_fields) != NULL_TREE)
5451             constructor_type = NULL_TREE;
5452         }
5453       else
5454         /* Zero-length arrays are no longer special, so we should no longer
5455            get here.  */
5456         abort ();
5457     }
5458
5459   /* Warn when some struct elements are implicitly initialized to zero.  */
5460   if (extra_warnings
5461       && constructor_type
5462       && TREE_CODE (constructor_type) == RECORD_TYPE
5463       && constructor_unfilled_fields)
5464     {
5465         /* Do not warn for flexible array members or zero-length arrays.  */
5466         while (constructor_unfilled_fields
5467                && (! DECL_SIZE (constructor_unfilled_fields)
5468                    || integer_zerop (DECL_SIZE (constructor_unfilled_fields))))
5469           constructor_unfilled_fields = TREE_CHAIN (constructor_unfilled_fields);
5470
5471         /* Do not warn if this level of the initializer uses member
5472            designators; it is likely to be deliberate.  */
5473         if (constructor_unfilled_fields && !constructor_designated)
5474           {
5475             push_member_name (constructor_unfilled_fields);
5476             warning_init ("missing initializer");
5477             RESTORE_SPELLING_DEPTH (constructor_depth);
5478           }
5479     }
5480
5481   /* Now output all pending elements.  */
5482   constructor_incremental = 1;
5483   output_pending_init_elements (1);
5484
5485   /* Pad out the end of the structure.  */
5486   if (p->replacement_value)
5487     /* If this closes a superfluous brace pair,
5488        just pass out the element between them.  */
5489     constructor = p->replacement_value;
5490   else if (constructor_type == 0)
5491     ;
5492   else if (TREE_CODE (constructor_type) != RECORD_TYPE
5493            && TREE_CODE (constructor_type) != UNION_TYPE
5494            && TREE_CODE (constructor_type) != ARRAY_TYPE
5495            && TREE_CODE (constructor_type) != VECTOR_TYPE)
5496     {
5497       /* A nonincremental scalar initializer--just return
5498          the element, after verifying there is just one.  */
5499       if (constructor_elements == 0)
5500         {
5501           if (!constructor_erroneous)
5502             error_init ("empty scalar initializer");
5503           constructor = error_mark_node;
5504         }
5505       else if (TREE_CHAIN (constructor_elements) != 0)
5506         {
5507           error_init ("extra elements in scalar initializer");
5508           constructor = TREE_VALUE (constructor_elements);
5509         }
5510       else
5511         constructor = TREE_VALUE (constructor_elements);
5512     }
5513   else
5514     {
5515       if (constructor_erroneous)
5516         constructor = error_mark_node;
5517       else
5518         {
5519           constructor = build (CONSTRUCTOR, constructor_type, NULL_TREE,
5520                                nreverse (constructor_elements));
5521           if (constructor_constant)
5522             TREE_CONSTANT (constructor) = 1;
5523           if (constructor_constant && constructor_simple)
5524             TREE_STATIC (constructor) = 1;
5525         }
5526     }
5527
5528   constructor_type = p->type;
5529   constructor_fields = p->fields;
5530   constructor_index = p->index;
5531   constructor_max_index = p->max_index;
5532   constructor_unfilled_index = p->unfilled_index;
5533   constructor_unfilled_fields = p->unfilled_fields;
5534   constructor_bit_index = p->bit_index;
5535   constructor_elements = p->elements;
5536   constructor_constant = p->constant;
5537   constructor_simple = p->simple;
5538   constructor_erroneous = p->erroneous;
5539   constructor_incremental = p->incremental;
5540   constructor_designated = p->designated;
5541   constructor_pending_elts = p->pending_elts;
5542   constructor_depth = p->depth;
5543   if (!p->implicit)
5544     constructor_range_stack = p->range_stack;
5545   RESTORE_SPELLING_DEPTH (constructor_depth);
5546
5547   constructor_stack = p->next;
5548   free (p);
5549
5550   if (constructor == 0)
5551     {
5552       if (constructor_stack == 0)
5553         return error_mark_node;
5554       return NULL_TREE;
5555     }
5556   return constructor;
5557 }
5558
5559 /* Common handling for both array range and field name designators.
5560    ARRAY argument is non-zero for array ranges.  Returns zero for success.  */
5561
5562 static int
5563 set_designator (array)
5564      int array;
5565 {
5566   tree subtype;
5567   enum tree_code subcode;
5568
5569   /* Don't die if an entire brace-pair level is superfluous
5570      in the containing level.  */
5571   if (constructor_type == 0)
5572     return 1;
5573
5574   /* If there were errors in this designator list already, bail out silently.  */
5575   if (designator_errorneous)
5576     return 1;
5577
5578   if (!designator_depth)
5579     {
5580       if (constructor_range_stack)
5581         abort ();
5582
5583       /* Designator list starts at the level of closest explicit
5584          braces.  */
5585       while (constructor_stack->implicit)
5586         process_init_element (pop_init_level (1));
5587       constructor_designated = 1;
5588       return 0;
5589     }
5590
5591   if (constructor_no_implicit)
5592     {
5593       error_init ("initialization designators may not nest");
5594       return 1;
5595     }
5596
5597   if (TREE_CODE (constructor_type) == RECORD_TYPE
5598       || TREE_CODE (constructor_type) == UNION_TYPE)
5599     {
5600       subtype = TREE_TYPE (constructor_fields);
5601       if (subtype != error_mark_node)
5602         subtype = TYPE_MAIN_VARIANT (subtype);
5603     }
5604   else if (TREE_CODE (constructor_type) == ARRAY_TYPE)
5605     {
5606       subtype = TYPE_MAIN_VARIANT (TREE_TYPE (constructor_type));
5607     }
5608   else
5609     abort ();
5610
5611   subcode = TREE_CODE (subtype);
5612   if (array && subcode != ARRAY_TYPE)
5613     {
5614       error_init ("array index in non-array initializer");
5615       return 1;
5616     }
5617   else if (!array && subcode != RECORD_TYPE && subcode != UNION_TYPE)
5618     {
5619       error_init ("field name not in record or union initializer");
5620       return 1;
5621     }
5622
5623   constructor_designated = 1;
5624   push_init_level (2);
5625   return 0;
5626 }
5627
5628 /* If there are range designators in designator list, push a new designator
5629    to constructor_range_stack.  RANGE_END is end of such stack range or
5630    NULL_TREE if there is no range designator at this level.  */
5631
5632 static void
5633 push_range_stack (range_end)
5634      tree range_end;
5635 {
5636   struct constructor_range_stack *p;
5637
5638   p = (struct constructor_range_stack *)
5639       ggc_alloc (sizeof (struct constructor_range_stack));
5640   p->prev = constructor_range_stack;
5641   p->next = 0;
5642   p->fields = constructor_fields;
5643   p->range_start = constructor_index;
5644   p->index = constructor_index;
5645   p->stack = constructor_stack;
5646   p->range_end = range_end;
5647   if (constructor_range_stack)
5648     constructor_range_stack->next = p;
5649   constructor_range_stack = p;
5650 }
5651
5652 /* Within an array initializer, specify the next index to be initialized.
5653    FIRST is that index.  If LAST is nonzero, then initialize a range
5654    of indices, running from FIRST through LAST.  */
5655
5656 void
5657 set_init_index (first, last)
5658      tree first, last;
5659 {
5660   if (set_designator (1))
5661     return;
5662
5663   designator_errorneous = 1;
5664
5665   while ((TREE_CODE (first) == NOP_EXPR
5666           || TREE_CODE (first) == CONVERT_EXPR
5667           || TREE_CODE (first) == NON_LVALUE_EXPR)
5668          && (TYPE_MODE (TREE_TYPE (first))
5669              == TYPE_MODE (TREE_TYPE (TREE_OPERAND (first, 0)))))
5670     first = TREE_OPERAND (first, 0);
5671
5672   if (last)
5673     while ((TREE_CODE (last) == NOP_EXPR
5674             || TREE_CODE (last) == CONVERT_EXPR
5675             || TREE_CODE (last) == NON_LVALUE_EXPR)
5676            && (TYPE_MODE (TREE_TYPE (last))
5677                == TYPE_MODE (TREE_TYPE (TREE_OPERAND (last, 0)))))
5678       last = TREE_OPERAND (last, 0);
5679
5680   if (TREE_CODE (first) != INTEGER_CST)
5681     error_init ("nonconstant array index in initializer");
5682   else if (last != 0 && TREE_CODE (last) != INTEGER_CST)
5683     error_init ("nonconstant array index in initializer");
5684   else if (TREE_CODE (constructor_type) != ARRAY_TYPE)
5685     error_init ("array index in non-array initializer");
5686   else if (constructor_max_index
5687            && tree_int_cst_lt (constructor_max_index, first))
5688     error_init ("array index in initializer exceeds array bounds");
5689   else
5690     {
5691       constructor_index = convert (bitsizetype, first);
5692
5693       if (last)
5694         {
5695           if (tree_int_cst_equal (first, last))
5696             last = 0;
5697           else if (tree_int_cst_lt (last, first))
5698             {
5699               error_init ("empty index range in initializer");
5700               last = 0;
5701             }
5702           else
5703             {
5704               last = convert (bitsizetype, last);
5705               if (constructor_max_index != 0
5706                   && tree_int_cst_lt (constructor_max_index, last))
5707                 {
5708                   error_init ("array index range in initializer exceeds array bounds");
5709                   last = 0;
5710                 }
5711             }
5712         }
5713
5714       designator_depth++;
5715       designator_errorneous = 0;
5716       if (constructor_range_stack || last)
5717         push_range_stack (last);
5718     }
5719 }
5720
5721 /* Within a struct initializer, specify the next field to be initialized.  */
5722
5723 void
5724 set_init_label (fieldname)
5725      tree fieldname;
5726 {
5727   tree tail;
5728
5729   if (set_designator (0))
5730     return;
5731
5732   designator_errorneous = 1;
5733
5734   if (TREE_CODE (constructor_type) != RECORD_TYPE
5735       && TREE_CODE (constructor_type) != UNION_TYPE)
5736     {
5737       error_init ("field name not in record or union initializer");
5738       return;
5739     }
5740     
5741   for (tail = TYPE_FIELDS (constructor_type); tail;
5742        tail = TREE_CHAIN (tail))
5743     {
5744       if (DECL_NAME (tail) == fieldname)
5745         break;
5746     }
5747
5748   if (tail == 0)
5749     error ("unknown field `%s' specified in initializer",
5750            IDENTIFIER_POINTER (fieldname));
5751   else
5752     {
5753       constructor_fields = tail;
5754       designator_depth++;
5755       designator_errorneous = 0;
5756       if (constructor_range_stack)
5757         push_range_stack (NULL_TREE);
5758     }
5759 }
5760 \f
5761 /* Add a new initializer to the tree of pending initializers.  PURPOSE
5762    identifies the initializer, either array index or field in a structure. 
5763    VALUE is the value of that index or field.  */
5764
5765 static void
5766 add_pending_init (purpose, value)
5767      tree purpose, value;
5768 {
5769   struct init_node *p, **q, *r;
5770
5771   q = &constructor_pending_elts;
5772   p = 0;
5773
5774   if (TREE_CODE (constructor_type) == ARRAY_TYPE)
5775     {
5776       while (*q != 0)
5777         {
5778           p = *q;
5779           if (tree_int_cst_lt (purpose, p->purpose))
5780             q = &p->left;
5781           else if (tree_int_cst_lt (p->purpose, purpose))
5782             q = &p->right;
5783           else
5784             {
5785               if (TREE_SIDE_EFFECTS (p->value))
5786                 warning_init ("initialized field with side-effects overwritten");
5787               p->value = value;
5788               return;
5789             }
5790         }
5791     }
5792   else
5793     {
5794       tree bitpos;
5795
5796       bitpos = bit_position (purpose);
5797       while (*q != NULL)
5798         {
5799           p = *q;
5800           if (tree_int_cst_lt (bitpos, bit_position (p->purpose)))
5801             q = &p->left;
5802           else if (p->purpose != purpose)
5803             q = &p->right;
5804           else
5805             {
5806               if (TREE_SIDE_EFFECTS (p->value))
5807                 warning_init ("initialized field with side-effects overwritten");
5808               p->value = value;
5809               return;
5810             }
5811         }
5812     }
5813
5814   r = (struct init_node *) ggc_alloc (sizeof (struct init_node));
5815   r->purpose = purpose;
5816   r->value = value;
5817
5818   *q = r;
5819   r->parent = p;
5820   r->left = 0;
5821   r->right = 0;
5822   r->balance = 0;
5823
5824   while (p)
5825     {
5826       struct init_node *s;
5827
5828       if (r == p->left)
5829         {
5830           if (p->balance == 0)
5831             p->balance = -1;
5832           else if (p->balance < 0)
5833             {
5834               if (r->balance < 0)
5835                 {
5836                   /* L rotation.  */
5837                   p->left = r->right;
5838                   if (p->left)
5839                     p->left->parent = p;
5840                   r->right = p;
5841
5842                   p->balance = 0;
5843                   r->balance = 0;
5844
5845                   s = p->parent;
5846                   p->parent = r;
5847                   r->parent = s;
5848                   if (s)
5849                     {
5850                       if (s->left == p)
5851                         s->left = r;
5852                       else
5853                         s->right = r;
5854                     }
5855                   else
5856                     constructor_pending_elts = r;
5857                 }
5858               else
5859                 {
5860                   /* LR rotation.  */
5861                   struct init_node *t = r->right;
5862
5863                   r->right = t->left;
5864                   if (r->right)
5865                     r->right->parent = r;
5866                   t->left = r;
5867
5868                   p->left = t->right;
5869                   if (p->left)
5870                     p->left->parent = p;
5871                   t->right = p;
5872
5873                   p->balance = t->balance < 0;
5874                   r->balance = -(t->balance > 0);
5875                   t->balance = 0;
5876
5877                   s = p->parent;
5878                   p->parent = t;
5879                   r->parent = t;
5880                   t->parent = s;
5881                   if (s)
5882                     {
5883                       if (s->left == p)
5884                         s->left = t;
5885                       else
5886                         s->right = t;
5887                     }
5888                   else
5889                     constructor_pending_elts = t;
5890                 }
5891               break;
5892             }
5893           else
5894             {
5895               /* p->balance == +1; growth of left side balances the node.  */
5896               p->balance = 0;
5897               break;
5898             }
5899         }
5900       else /* r == p->right */
5901         {
5902           if (p->balance == 0)
5903             /* Growth propagation from right side.  */
5904             p->balance++;
5905           else if (p->balance > 0)
5906             {
5907               if (r->balance > 0)
5908                 {
5909                   /* R rotation.  */
5910                   p->right = r->left;
5911                   if (p->right)
5912                     p->right->parent = p;
5913                   r->left = p;
5914
5915                   p->balance = 0;
5916                   r->balance = 0;
5917
5918                   s = p->parent;
5919                   p->parent = r;
5920                   r->parent = s;
5921                   if (s)
5922                     {
5923                       if (s->left == p)
5924                         s->left = r;
5925                       else
5926                         s->right = r;
5927                     }
5928                   else
5929                     constructor_pending_elts = r;
5930                 }
5931               else /* r->balance == -1 */
5932                 {
5933                   /* RL rotation */
5934                   struct init_node *t = r->left;
5935
5936                   r->left = t->right;
5937                   if (r->left)
5938                     r->left->parent = r;
5939                   t->right = r;
5940
5941                   p->right = t->left;
5942                   if (p->right)
5943                     p->right->parent = p;
5944                   t->left = p;
5945
5946                   r->balance = (t->balance < 0);
5947                   p->balance = -(t->balance > 0);
5948                   t->balance = 0;
5949
5950                   s = p->parent;
5951                   p->parent = t;
5952                   r->parent = t;
5953                   t->parent = s;
5954                   if (s)
5955                     {
5956                       if (s->left == p)
5957                         s->left = t;
5958                       else
5959                         s->right = t;
5960                     }
5961                   else
5962                     constructor_pending_elts = t;
5963                 }
5964               break;
5965             }
5966           else
5967             {
5968               /* p->balance == -1; growth of right side balances the node.  */
5969               p->balance = 0;
5970               break;
5971             }
5972         }
5973
5974       r = p;
5975       p = p->parent;
5976     }
5977 }
5978
5979 /* Build AVL tree from a sorted chain.  */
5980
5981 static void
5982 set_nonincremental_init ()
5983 {
5984   tree chain;
5985
5986   if (TREE_CODE (constructor_type) != RECORD_TYPE
5987       && TREE_CODE (constructor_type) != ARRAY_TYPE)
5988     return;
5989
5990   for (chain = constructor_elements; chain; chain = TREE_CHAIN (chain))
5991     add_pending_init (TREE_PURPOSE (chain), TREE_VALUE (chain));
5992   constructor_elements = 0;
5993   if (TREE_CODE (constructor_type) == RECORD_TYPE)
5994     {
5995       constructor_unfilled_fields = TYPE_FIELDS (constructor_type);
5996       /* Skip any nameless bit fields at the beginning.  */
5997       while (constructor_unfilled_fields != 0
5998              && DECL_C_BIT_FIELD (constructor_unfilled_fields)
5999              && DECL_NAME (constructor_unfilled_fields) == 0)
6000         constructor_unfilled_fields = TREE_CHAIN (constructor_unfilled_fields);
6001       
6002     }
6003   else if (TREE_CODE (constructor_type) == ARRAY_TYPE)
6004     {
6005       if (TYPE_DOMAIN (constructor_type))
6006         constructor_unfilled_index
6007             = convert (bitsizetype,
6008                        TYPE_MIN_VALUE (TYPE_DOMAIN (constructor_type)));
6009       else
6010         constructor_unfilled_index = bitsize_zero_node;
6011     }
6012   constructor_incremental = 0;
6013 }
6014
6015 /* Build AVL tree from a string constant.  */
6016
6017 static void
6018 set_nonincremental_init_from_string (str)
6019      tree str;
6020 {
6021   tree value, purpose, type;
6022   HOST_WIDE_INT val[2];
6023   const char *p, *end;
6024   int byte, wchar_bytes, charwidth, bitpos;
6025
6026   if (TREE_CODE (constructor_type) != ARRAY_TYPE)
6027     abort ();
6028
6029   if (TYPE_PRECISION (TREE_TYPE (TREE_TYPE (str)))
6030       == TYPE_PRECISION (char_type_node))
6031     wchar_bytes = 1;
6032   else if (TYPE_PRECISION (TREE_TYPE (TREE_TYPE (str)))
6033            == TYPE_PRECISION (wchar_type_node))
6034     wchar_bytes = TYPE_PRECISION (wchar_type_node) / BITS_PER_UNIT;
6035   else
6036     abort ();
6037
6038   charwidth = TYPE_PRECISION (char_type_node);
6039   type = TREE_TYPE (constructor_type);
6040   p = TREE_STRING_POINTER (str);
6041   end = p + TREE_STRING_LENGTH (str);
6042
6043   for (purpose = bitsize_zero_node;
6044        p < end && !tree_int_cst_lt (constructor_max_index, purpose);
6045        purpose = size_binop (PLUS_EXPR, purpose, bitsize_one_node))
6046     {
6047       if (wchar_bytes == 1)
6048         {
6049           val[1] = (unsigned char) *p++;
6050           val[0] = 0;
6051         }
6052       else
6053         {
6054           val[0] = 0;
6055           val[1] = 0;
6056           for (byte = 0; byte < wchar_bytes; byte++)
6057             {
6058               if (BYTES_BIG_ENDIAN)
6059                 bitpos = (wchar_bytes - byte - 1) * charwidth;
6060               else
6061                 bitpos = byte * charwidth;
6062               val[bitpos < HOST_BITS_PER_WIDE_INT]
6063                 |= ((unsigned HOST_WIDE_INT) ((unsigned char) *p++))
6064                    << (bitpos % HOST_BITS_PER_WIDE_INT);
6065             }
6066         }
6067
6068       if (!TREE_UNSIGNED (type))
6069         {
6070           bitpos = ((wchar_bytes - 1) * charwidth) + HOST_BITS_PER_CHAR;
6071           if (bitpos < HOST_BITS_PER_WIDE_INT)
6072             {
6073               if (val[1] & (((HOST_WIDE_INT) 1) << (bitpos - 1)))
6074                 {
6075                   val[1] |= ((HOST_WIDE_INT) -1) << bitpos;
6076                   val[0] = -1;
6077                 }
6078             }
6079           else if (bitpos == HOST_BITS_PER_WIDE_INT)
6080             {
6081               if (val[1] < 0)
6082                 val[0] = -1;
6083             }
6084           else if (val[0] & (((HOST_WIDE_INT) 1)
6085                              << (bitpos - 1 - HOST_BITS_PER_WIDE_INT)))
6086             val[0] |= ((HOST_WIDE_INT) -1)
6087                       << (bitpos - HOST_BITS_PER_WIDE_INT);
6088         }
6089
6090       value = build_int_2 (val[1], val[0]);
6091       TREE_TYPE (value) = type;
6092       add_pending_init (purpose, value);
6093     }
6094
6095   constructor_incremental = 0;
6096 }
6097
6098 /* Return value of FIELD in pending initializer or zero if the field was
6099    not initialized yet.  */
6100
6101 static tree
6102 find_init_member (field)
6103      tree field;
6104 {
6105   struct init_node *p;
6106
6107   if (TREE_CODE (constructor_type) == ARRAY_TYPE)
6108     {
6109       if (constructor_incremental
6110           && tree_int_cst_lt (field, constructor_unfilled_index))
6111         set_nonincremental_init ();
6112
6113       p = constructor_pending_elts;
6114       while (p)
6115         {
6116           if (tree_int_cst_lt (field, p->purpose))
6117             p = p->left;
6118           else if (tree_int_cst_lt (p->purpose, field))
6119             p = p->right;
6120           else
6121             return p->value;
6122         }
6123     }
6124   else if (TREE_CODE (constructor_type) == RECORD_TYPE)
6125     {
6126       tree bitpos = bit_position (field);
6127
6128       if (constructor_incremental
6129           && (!constructor_unfilled_fields
6130               || tree_int_cst_lt (bitpos,
6131                                   bit_position (constructor_unfilled_fields))))
6132         set_nonincremental_init ();
6133
6134       p = constructor_pending_elts;
6135       while (p)
6136         {
6137           if (field == p->purpose)
6138             return p->value;
6139           else if (tree_int_cst_lt (bitpos, bit_position (p->purpose)))
6140             p = p->left;
6141           else
6142             p = p->right;
6143         }
6144     }
6145   else if (TREE_CODE (constructor_type) == UNION_TYPE)
6146     {
6147       if (constructor_elements
6148           && TREE_PURPOSE (constructor_elements) == field)
6149         return TREE_VALUE (constructor_elements);
6150     }
6151   return 0;
6152 }
6153
6154 /* "Output" the next constructor element.
6155    At top level, really output it to assembler code now.
6156    Otherwise, collect it in a list from which we will make a CONSTRUCTOR.
6157    TYPE is the data type that the containing data type wants here.
6158    FIELD is the field (a FIELD_DECL) or the index that this element fills.
6159
6160    PENDING if non-nil means output pending elements that belong
6161    right after this element.  (PENDING is normally 1;
6162    it is 0 while outputting pending elements, to avoid recursion.)  */
6163
6164 static void
6165 output_init_element (value, type, field, pending)
6166      tree value, type, field;
6167      int pending;
6168 {
6169   if (TREE_CODE (TREE_TYPE (value)) == FUNCTION_TYPE
6170       || (TREE_CODE (TREE_TYPE (value)) == ARRAY_TYPE
6171           && !(TREE_CODE (value) == STRING_CST
6172                && TREE_CODE (type) == ARRAY_TYPE
6173                && TREE_CODE (TREE_TYPE (type)) == INTEGER_TYPE)
6174           && !comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (value)),
6175                          TYPE_MAIN_VARIANT (type))))
6176     value = default_conversion (value);
6177
6178   if (TREE_CODE (value) == COMPOUND_LITERAL_EXPR
6179       && require_constant_value && !flag_isoc99 && pending)
6180     {
6181       /* As an extension, allow initializing objects with static storage
6182          duration with compound literals (which are then treated just as
6183          the brace enclosed list they contain).  */
6184       tree decl = COMPOUND_LITERAL_EXPR_DECL (value);
6185       value = DECL_INITIAL (decl);
6186     }
6187
6188   if (value == error_mark_node)
6189     constructor_erroneous = 1;
6190   else if (!TREE_CONSTANT (value))
6191     constructor_constant = 0;
6192   else if (initializer_constant_valid_p (value, TREE_TYPE (value)) == 0
6193            || ((TREE_CODE (constructor_type) == RECORD_TYPE
6194                 || TREE_CODE (constructor_type) == UNION_TYPE)
6195                && DECL_C_BIT_FIELD (field)
6196                && TREE_CODE (value) != INTEGER_CST))
6197     constructor_simple = 0;
6198
6199   if (require_constant_value && ! TREE_CONSTANT (value))
6200     {
6201       error_init ("initializer element is not constant");
6202       value = error_mark_node;
6203     }
6204   else if (require_constant_elements
6205            && initializer_constant_valid_p (value, TREE_TYPE (value)) == 0)
6206     pedwarn ("initializer element is not computable at load time");
6207
6208   /* If this field is empty (and not at the end of structure),
6209      don't do anything other than checking the initializer.  */
6210   if (field
6211       && (TREE_TYPE (field) == error_mark_node
6212           || (COMPLETE_TYPE_P (TREE_TYPE (field))
6213               && integer_zerop (TYPE_SIZE (TREE_TYPE (field)))
6214               && (TREE_CODE (constructor_type) == ARRAY_TYPE
6215                   || TREE_CHAIN (field)))))
6216     return;
6217
6218   value = digest_init (type, value, require_constant_value);
6219   if (value == error_mark_node)
6220     {
6221       constructor_erroneous = 1;
6222       return;
6223     }
6224
6225   /* If this element doesn't come next in sequence,
6226      put it on constructor_pending_elts.  */
6227   if (TREE_CODE (constructor_type) == ARRAY_TYPE
6228       && (!constructor_incremental
6229           || !tree_int_cst_equal (field, constructor_unfilled_index)))
6230     {
6231       if (constructor_incremental
6232           && tree_int_cst_lt (field, constructor_unfilled_index))
6233         set_nonincremental_init ();
6234
6235       add_pending_init (field, value);
6236       return;
6237     }
6238   else if (TREE_CODE (constructor_type) == RECORD_TYPE
6239            && (!constructor_incremental
6240                || field != constructor_unfilled_fields))
6241     {
6242       /* We do this for records but not for unions.  In a union,
6243          no matter which field is specified, it can be initialized
6244          right away since it starts at the beginning of the union.  */
6245       if (constructor_incremental)
6246         {
6247           if (!constructor_unfilled_fields)
6248             set_nonincremental_init ();
6249           else
6250             {
6251               tree bitpos, unfillpos;
6252
6253               bitpos = bit_position (field);
6254               unfillpos = bit_position (constructor_unfilled_fields);
6255
6256               if (tree_int_cst_lt (bitpos, unfillpos))
6257                 set_nonincremental_init ();
6258             }
6259         }
6260
6261       add_pending_init (field, value);
6262       return;
6263     }
6264   else if (TREE_CODE (constructor_type) == UNION_TYPE
6265            && constructor_elements)
6266     {
6267       if (TREE_SIDE_EFFECTS (TREE_VALUE (constructor_elements)))
6268         warning_init ("initialized field with side-effects overwritten");
6269
6270       /* We can have just one union field set.  */
6271       constructor_elements = 0;
6272     }
6273
6274   /* Otherwise, output this element either to
6275      constructor_elements or to the assembler file.  */
6276
6277   if (field && TREE_CODE (field) == INTEGER_CST)
6278     field = copy_node (field);
6279   constructor_elements
6280     = tree_cons (field, value, constructor_elements);
6281
6282   /* Advance the variable that indicates sequential elements output.  */
6283   if (TREE_CODE (constructor_type) == ARRAY_TYPE)
6284     constructor_unfilled_index
6285       = size_binop (PLUS_EXPR, constructor_unfilled_index,
6286                     bitsize_one_node);
6287   else if (TREE_CODE (constructor_type) == RECORD_TYPE)
6288     {
6289       constructor_unfilled_fields
6290         = TREE_CHAIN (constructor_unfilled_fields);
6291
6292       /* Skip any nameless bit fields.  */
6293       while (constructor_unfilled_fields != 0
6294              && DECL_C_BIT_FIELD (constructor_unfilled_fields)
6295              && DECL_NAME (constructor_unfilled_fields) == 0)
6296         constructor_unfilled_fields =
6297           TREE_CHAIN (constructor_unfilled_fields);
6298     }
6299   else if (TREE_CODE (constructor_type) == UNION_TYPE)
6300     constructor_unfilled_fields = 0;
6301
6302   /* Now output any pending elements which have become next.  */
6303   if (pending)
6304     output_pending_init_elements (0);
6305 }
6306
6307 /* Output any pending elements which have become next.
6308    As we output elements, constructor_unfilled_{fields,index}
6309    advances, which may cause other elements to become next;
6310    if so, they too are output.
6311
6312    If ALL is 0, we return when there are
6313    no more pending elements to output now.
6314
6315    If ALL is 1, we output space as necessary so that
6316    we can output all the pending elements.  */
6317
6318 static void
6319 output_pending_init_elements (all)
6320      int all;
6321 {
6322   struct init_node *elt = constructor_pending_elts;
6323   tree next;
6324
6325  retry:
6326
6327   /* Look thru the whole pending tree.
6328      If we find an element that should be output now,
6329      output it.  Otherwise, set NEXT to the element
6330      that comes first among those still pending.  */
6331      
6332   next = 0;
6333   while (elt)
6334     {
6335       if (TREE_CODE (constructor_type) == ARRAY_TYPE)
6336         {
6337           if (tree_int_cst_equal (elt->purpose,
6338                                   constructor_unfilled_index))
6339             output_init_element (elt->value,
6340                                  TREE_TYPE (constructor_type),
6341                                  constructor_unfilled_index, 0);
6342           else if (tree_int_cst_lt (constructor_unfilled_index,
6343                                     elt->purpose))
6344             {
6345               /* Advance to the next smaller node.  */
6346               if (elt->left)
6347                 elt = elt->left;
6348               else
6349                 {
6350                   /* We have reached the smallest node bigger than the
6351                      current unfilled index.  Fill the space first.  */
6352                   next = elt->purpose;
6353                   break;
6354                 }
6355             }
6356           else
6357             {
6358               /* Advance to the next bigger node.  */
6359               if (elt->right)
6360                 elt = elt->right;
6361               else
6362                 {
6363                   /* We have reached the biggest node in a subtree.  Find
6364                      the parent of it, which is the next bigger node.  */
6365                   while (elt->parent && elt->parent->right == elt)
6366                     elt = elt->parent;
6367                   elt = elt->parent;
6368                   if (elt && tree_int_cst_lt (constructor_unfilled_index,
6369                                               elt->purpose))
6370                     {
6371                       next = elt->purpose;
6372                       break;
6373                     }
6374                 }
6375             }
6376         }
6377       else if (TREE_CODE (constructor_type) == RECORD_TYPE
6378                || TREE_CODE (constructor_type) == UNION_TYPE)
6379         {
6380           tree ctor_unfilled_bitpos, elt_bitpos;
6381
6382           /* If the current record is complete we are done.  */
6383           if (constructor_unfilled_fields == 0)
6384             break;
6385
6386           ctor_unfilled_bitpos = bit_position (constructor_unfilled_fields);
6387           elt_bitpos = bit_position (elt->purpose);
6388           /* We can't compare fields here because there might be empty
6389              fields in between.  */
6390           if (tree_int_cst_equal (elt_bitpos, ctor_unfilled_bitpos))
6391             {
6392               constructor_unfilled_fields = elt->purpose;
6393               output_init_element (elt->value, TREE_TYPE (elt->purpose),
6394                                    elt->purpose, 0);
6395             }
6396           else if (tree_int_cst_lt (ctor_unfilled_bitpos, elt_bitpos))
6397             {
6398               /* Advance to the next smaller node.  */
6399               if (elt->left)
6400                 elt = elt->left;
6401               else
6402                 {
6403                   /* We have reached the smallest node bigger than the
6404                      current unfilled field.  Fill the space first.  */
6405                   next = elt->purpose;
6406                   break;
6407                 }
6408             }
6409           else
6410             {
6411               /* Advance to the next bigger node.  */
6412               if (elt->right)
6413                 elt = elt->right;
6414               else
6415                 {
6416                   /* We have reached the biggest node in a subtree.  Find
6417                      the parent of it, which is the next bigger node.  */
6418                   while (elt->parent && elt->parent->right == elt)
6419                     elt = elt->parent;
6420                   elt = elt->parent;
6421                   if (elt
6422                       && (tree_int_cst_lt (ctor_unfilled_bitpos,
6423                                            bit_position (elt->purpose))))
6424                     {
6425                       next = elt->purpose;
6426                       break;
6427                     }
6428                 }
6429             }
6430         }
6431     }
6432
6433   /* Ordinarily return, but not if we want to output all
6434      and there are elements left.  */
6435   if (! (all && next != 0))
6436     return;
6437
6438   /* If it's not incremental, just skip over the gap, so that after
6439      jumping to retry we will output the next successive element.  */
6440   if (TREE_CODE (constructor_type) == RECORD_TYPE
6441       || TREE_CODE (constructor_type) == UNION_TYPE)
6442     constructor_unfilled_fields = next;
6443   else if (TREE_CODE (constructor_type) == ARRAY_TYPE)
6444     constructor_unfilled_index = next;
6445
6446   /* ELT now points to the node in the pending tree with the next
6447      initializer to output.  */
6448   goto retry;
6449 }
6450 \f
6451 /* Add one non-braced element to the current constructor level.
6452    This adjusts the current position within the constructor's type.
6453    This may also start or terminate implicit levels
6454    to handle a partly-braced initializer.
6455
6456    Once this has found the correct level for the new element,
6457    it calls output_init_element.  */
6458
6459 void
6460 process_init_element (value)
6461      tree value;
6462 {
6463   tree orig_value = value;
6464   int string_flag = value != 0 && TREE_CODE (value) == STRING_CST;
6465
6466   designator_depth = 0;
6467   designator_errorneous = 0;
6468
6469   /* Handle superfluous braces around string cst as in
6470      char x[] = {"foo"}; */
6471   if (string_flag
6472       && constructor_type
6473       && TREE_CODE (constructor_type) == ARRAY_TYPE
6474       && TREE_CODE (TREE_TYPE (constructor_type)) == INTEGER_TYPE
6475       && integer_zerop (constructor_unfilled_index))
6476     {
6477       if (constructor_stack->replacement_value)
6478         error_init ("excess elements in char array initializer");
6479       constructor_stack->replacement_value = value;
6480       return;
6481     }
6482
6483   if (constructor_stack->replacement_value != 0)
6484     {
6485       error_init ("excess elements in struct initializer");
6486       return;
6487     }
6488
6489   /* Ignore elements of a brace group if it is entirely superfluous
6490      and has already been diagnosed.  */
6491   if (constructor_type == 0)
6492     return;
6493
6494   /* If we've exhausted any levels that didn't have braces,
6495      pop them now.  */
6496   while (constructor_stack->implicit)
6497     {
6498       if ((TREE_CODE (constructor_type) == RECORD_TYPE
6499            || TREE_CODE (constructor_type) == UNION_TYPE)
6500           && constructor_fields == 0)
6501         process_init_element (pop_init_level (1));
6502       else if (TREE_CODE (constructor_type) == ARRAY_TYPE
6503                && (constructor_max_index == 0
6504                    || tree_int_cst_lt (constructor_max_index,
6505                                        constructor_index)))
6506         process_init_element (pop_init_level (1));
6507       else
6508         break;
6509     }
6510
6511   /* In the case of [LO ... HI] = VALUE, only evaluate VALUE once.  */
6512   if (constructor_range_stack)
6513     {
6514       /* If value is a compound literal and we'll be just using its
6515          content, don't put it into a SAVE_EXPR.  */
6516       if (TREE_CODE (value) != COMPOUND_LITERAL_EXPR
6517           || !require_constant_value
6518           || flag_isoc99)
6519         value = save_expr (value);
6520     }
6521
6522   while (1)
6523     {
6524       if (TREE_CODE (constructor_type) == RECORD_TYPE)
6525         {
6526           tree fieldtype;
6527           enum tree_code fieldcode;
6528
6529           if (constructor_fields == 0)
6530             {
6531               pedwarn_init ("excess elements in struct initializer");
6532               break;
6533             }
6534
6535           fieldtype = TREE_TYPE (constructor_fields);
6536           if (fieldtype != error_mark_node)
6537             fieldtype = TYPE_MAIN_VARIANT (fieldtype);
6538           fieldcode = TREE_CODE (fieldtype);
6539
6540           /* Error for non-static initialization of a flexible array member.  */
6541           if (fieldcode == ARRAY_TYPE
6542               && !require_constant_value
6543               && TYPE_SIZE (fieldtype) == NULL_TREE
6544               && TREE_CHAIN (constructor_fields) == NULL_TREE)
6545             {
6546               error_init ("non-static initialization of a flexible array member");
6547               break;
6548             }
6549
6550           /* Accept a string constant to initialize a subarray.  */
6551           if (value != 0
6552               && fieldcode == ARRAY_TYPE
6553               && TREE_CODE (TREE_TYPE (fieldtype)) == INTEGER_TYPE
6554               && string_flag)
6555             value = orig_value;
6556           /* Otherwise, if we have come to a subaggregate,
6557              and we don't have an element of its type, push into it.  */
6558           else if (value != 0 && !constructor_no_implicit
6559                    && value != error_mark_node
6560                    && TYPE_MAIN_VARIANT (TREE_TYPE (value)) != fieldtype
6561                    && (fieldcode == RECORD_TYPE || fieldcode == ARRAY_TYPE
6562                        || fieldcode == UNION_TYPE))
6563             {
6564               push_init_level (1);
6565               continue;
6566             }
6567
6568           if (value)
6569             {
6570               push_member_name (constructor_fields);
6571               output_init_element (value, fieldtype, constructor_fields, 1);
6572               RESTORE_SPELLING_DEPTH (constructor_depth);
6573             }
6574           else
6575             /* Do the bookkeeping for an element that was
6576                directly output as a constructor.  */
6577             {
6578               /* For a record, keep track of end position of last field.  */
6579               if (DECL_SIZE (constructor_fields))
6580                 constructor_bit_index
6581                   = size_binop (PLUS_EXPR,
6582                                 bit_position (constructor_fields),
6583                                 DECL_SIZE (constructor_fields));
6584
6585               constructor_unfilled_fields = TREE_CHAIN (constructor_fields);
6586               /* Skip any nameless bit fields.  */
6587               while (constructor_unfilled_fields != 0
6588                      && DECL_C_BIT_FIELD (constructor_unfilled_fields)
6589                      && DECL_NAME (constructor_unfilled_fields) == 0)
6590                 constructor_unfilled_fields =
6591                   TREE_CHAIN (constructor_unfilled_fields);
6592             }
6593
6594           constructor_fields = TREE_CHAIN (constructor_fields);
6595           /* Skip any nameless bit fields at the beginning.  */
6596           while (constructor_fields != 0
6597                  && DECL_C_BIT_FIELD (constructor_fields)
6598                  && DECL_NAME (constructor_fields) == 0)
6599             constructor_fields = TREE_CHAIN (constructor_fields);
6600         }
6601       else if (TREE_CODE (constructor_type) == UNION_TYPE)
6602         {
6603           tree fieldtype;
6604           enum tree_code fieldcode;
6605
6606           if (constructor_fields == 0)
6607             {
6608               pedwarn_init ("excess elements in union initializer");
6609               break;
6610             }
6611
6612           fieldtype = TREE_TYPE (constructor_fields);
6613           if (fieldtype != error_mark_node)
6614             fieldtype = TYPE_MAIN_VARIANT (fieldtype);
6615           fieldcode = TREE_CODE (fieldtype);
6616
6617           /* Warn that traditional C rejects initialization of unions.
6618              We skip the warning if the value is zero.  This is done
6619              under the assumption that the zero initializer in user
6620              code appears conditioned on e.g. __STDC__ to avoid
6621              "missing initializer" warnings and relies on default
6622              initialization to zero in the traditional C case.
6623              We also skip the warning if the initializer is designated,
6624              again on the assumption that this must be conditional on
6625              __STDC__ anyway (and we've already complained about the
6626              member-designator already).  */
6627           if (warn_traditional && !in_system_header && !constructor_designated
6628               && !(value && (integer_zerop (value) || real_zerop (value))))
6629             warning ("traditional C rejects initialization of unions");
6630
6631           /* Accept a string constant to initialize a subarray.  */
6632           if (value != 0
6633               && fieldcode == ARRAY_TYPE
6634               && TREE_CODE (TREE_TYPE (fieldtype)) == INTEGER_TYPE
6635               && string_flag)
6636             value = orig_value;
6637           /* Otherwise, if we have come to a subaggregate,
6638              and we don't have an element of its type, push into it.  */
6639           else if (value != 0 && !constructor_no_implicit
6640                    && value != error_mark_node
6641                    && TYPE_MAIN_VARIANT (TREE_TYPE (value)) != fieldtype
6642                    && (fieldcode == RECORD_TYPE || fieldcode == ARRAY_TYPE
6643                        || fieldcode == UNION_TYPE))
6644             {
6645               push_init_level (1);
6646               continue;
6647             }
6648
6649           if (value)
6650             {
6651               push_member_name (constructor_fields);
6652               output_init_element (value, fieldtype, constructor_fields, 1);
6653               RESTORE_SPELLING_DEPTH (constructor_depth);
6654             }
6655           else
6656             /* Do the bookkeeping for an element that was
6657                directly output as a constructor.  */
6658             {
6659               constructor_bit_index = DECL_SIZE (constructor_fields);
6660               constructor_unfilled_fields = TREE_CHAIN (constructor_fields);
6661             }
6662
6663           constructor_fields = 0;
6664         }
6665       else if (TREE_CODE (constructor_type) == ARRAY_TYPE)
6666         {
6667           tree elttype = TYPE_MAIN_VARIANT (TREE_TYPE (constructor_type));
6668           enum tree_code eltcode = TREE_CODE (elttype);
6669
6670           /* Accept a string constant to initialize a subarray.  */
6671           if (value != 0
6672               && eltcode == ARRAY_TYPE
6673               && TREE_CODE (TREE_TYPE (elttype)) == INTEGER_TYPE
6674               && string_flag)
6675             value = orig_value;
6676           /* Otherwise, if we have come to a subaggregate,
6677              and we don't have an element of its type, push into it.  */
6678           else if (value != 0 && !constructor_no_implicit
6679                    && value != error_mark_node
6680                    && TYPE_MAIN_VARIANT (TREE_TYPE (value)) != elttype
6681                    && (eltcode == RECORD_TYPE || eltcode == ARRAY_TYPE
6682                        || eltcode == UNION_TYPE))
6683             {
6684               push_init_level (1);
6685               continue;
6686             }
6687
6688           if (constructor_max_index != 0
6689               && (tree_int_cst_lt (constructor_max_index, constructor_index)
6690                   || integer_all_onesp (constructor_max_index)))
6691             {
6692               pedwarn_init ("excess elements in array initializer");
6693               break;
6694             }
6695
6696           /* Now output the actual element.  */
6697           if (value)
6698             {
6699               push_array_bounds (tree_low_cst (constructor_index, 0));
6700               output_init_element (value, elttype, constructor_index, 1);
6701               RESTORE_SPELLING_DEPTH (constructor_depth);
6702             }
6703
6704           constructor_index
6705             = size_binop (PLUS_EXPR, constructor_index, bitsize_one_node);
6706
6707           if (! value)
6708             /* If we are doing the bookkeeping for an element that was
6709                directly output as a constructor, we must update
6710                constructor_unfilled_index.  */
6711             constructor_unfilled_index = constructor_index;
6712         }
6713       else if (TREE_CODE (constructor_type) == VECTOR_TYPE)
6714         {
6715           tree elttype = TYPE_MAIN_VARIANT (TREE_TYPE (constructor_type));
6716
6717          /* Do a basic check of initializer size.  Note that vectors
6718             always have a fixed size derived from their type.  */
6719           if (tree_int_cst_lt (constructor_max_index, constructor_index))
6720             {
6721               pedwarn_init ("excess elements in vector initializer");
6722               break;
6723             }
6724
6725           /* Now output the actual element.  */
6726           if (value)
6727             output_init_element (value, elttype, constructor_index, 1);
6728
6729           constructor_index
6730             = size_binop (PLUS_EXPR, constructor_index, bitsize_one_node);
6731
6732           if (! value)
6733             /* If we are doing the bookkeeping for an element that was
6734                directly output as a constructor, we must update
6735                constructor_unfilled_index.  */
6736             constructor_unfilled_index = constructor_index;
6737         }
6738
6739       /* Handle the sole element allowed in a braced initializer
6740          for a scalar variable.  */
6741       else if (constructor_fields == 0)
6742         {
6743           pedwarn_init ("excess elements in scalar initializer");
6744           break;
6745         }
6746       else
6747         {
6748           if (value)
6749             output_init_element (value, constructor_type, NULL_TREE, 1);
6750           constructor_fields = 0;
6751         }
6752
6753       /* Handle range initializers either at this level or anywhere higher
6754          in the designator stack.  */
6755       if (constructor_range_stack)
6756         {
6757           struct constructor_range_stack *p, *range_stack;
6758           int finish = 0;
6759
6760           range_stack = constructor_range_stack;
6761           constructor_range_stack = 0;
6762           while (constructor_stack != range_stack->stack)
6763             {
6764               if (!constructor_stack->implicit)
6765                 abort ();
6766               process_init_element (pop_init_level (1));
6767             }
6768           for (p = range_stack;
6769                !p->range_end || tree_int_cst_equal (p->index, p->range_end);
6770                p = p->prev)
6771             {
6772               if (!constructor_stack->implicit)
6773                 abort ();
6774               process_init_element (pop_init_level (1));
6775             }
6776
6777           p->index = size_binop (PLUS_EXPR, p->index, bitsize_one_node);
6778           if (tree_int_cst_equal (p->index, p->range_end) && !p->prev)
6779             finish = 1;
6780
6781           while (1)
6782             {
6783               constructor_index = p->index;
6784               constructor_fields = p->fields;
6785               if (finish && p->range_end && p->index == p->range_start)
6786                 {
6787                   finish = 0;
6788                   p->prev = 0;
6789                 }
6790               p = p->next;
6791               if (!p)
6792                 break;
6793               push_init_level (2);
6794               p->stack = constructor_stack;
6795               if (p->range_end && tree_int_cst_equal (p->index, p->range_end))
6796                 p->index = p->range_start;
6797             }
6798
6799           if (!finish)
6800             constructor_range_stack = range_stack;
6801           continue;
6802         }
6803
6804       break;
6805     }
6806
6807   constructor_range_stack = 0;
6808 }
6809 \f
6810 /* Build a simple asm-statement, from one string literal.  */
6811 tree
6812 simple_asm_stmt (expr)
6813      tree expr;
6814 {
6815   STRIP_NOPS (expr);
6816
6817   if (TREE_CODE (expr) == ADDR_EXPR)
6818     expr = TREE_OPERAND (expr, 0);
6819
6820   if (TREE_CODE (expr) == STRING_CST)
6821     {
6822       tree stmt;
6823
6824       if (TREE_CHAIN (expr))
6825         expr = combine_strings (expr);
6826       stmt = add_stmt (build_stmt (ASM_STMT, NULL_TREE, expr,
6827                                    NULL_TREE, NULL_TREE,
6828                                    NULL_TREE));
6829       ASM_INPUT_P (stmt) = 1;
6830       return stmt;
6831     }
6832
6833   error ("argument of `asm' is not a constant string");
6834   return NULL_TREE;
6835 }
6836
6837 /* Build an asm-statement, whose components are a CV_QUALIFIER, a
6838    STRING, some OUTPUTS, some INPUTS, and some CLOBBERS.  */
6839
6840 tree
6841 build_asm_stmt (cv_qualifier, string, outputs, inputs, clobbers)
6842      tree cv_qualifier;
6843      tree string;
6844      tree outputs;
6845      tree inputs;
6846      tree clobbers;
6847 {
6848   tree tail;
6849
6850   if (TREE_CHAIN (string))
6851     string = combine_strings (string);
6852   if (TREE_CODE (string) != STRING_CST)
6853     {
6854       error ("asm template is not a string constant");
6855       return NULL_TREE;
6856     }
6857
6858   if (cv_qualifier != NULL_TREE
6859       && cv_qualifier != ridpointers[(int) RID_VOLATILE])
6860     {
6861       warning ("%s qualifier ignored on asm",
6862                IDENTIFIER_POINTER (cv_qualifier));
6863       cv_qualifier = NULL_TREE;
6864     }
6865
6866   /* We can remove output conversions that change the type,
6867      but not the mode.  */
6868   for (tail = outputs; tail; tail = TREE_CHAIN (tail))
6869     {
6870       tree output = TREE_VALUE (tail);
6871
6872       STRIP_NOPS (output);
6873       TREE_VALUE (tail) = output;
6874
6875       /* Allow conversions as LHS here.  build_modify_expr as called below
6876          will do the right thing with them.  */
6877       while (TREE_CODE (output) == NOP_EXPR
6878              || TREE_CODE (output) == CONVERT_EXPR
6879              || TREE_CODE (output) == FLOAT_EXPR
6880              || TREE_CODE (output) == FIX_TRUNC_EXPR
6881              || TREE_CODE (output) == FIX_FLOOR_EXPR
6882              || TREE_CODE (output) == FIX_ROUND_EXPR
6883              || TREE_CODE (output) == FIX_CEIL_EXPR)
6884         output = TREE_OPERAND (output, 0);
6885
6886       lvalue_or_else (TREE_VALUE (tail), "invalid lvalue in asm statement");
6887     }
6888
6889   /* Remove output conversions that change the type but not the mode.  */
6890   for (tail = outputs; tail; tail = TREE_CHAIN (tail))
6891     {
6892       tree output = TREE_VALUE (tail);
6893       STRIP_NOPS (output);
6894       TREE_VALUE (tail) = output;
6895     }
6896
6897   /* Perform default conversions on array and function inputs. 
6898      Don't do this for other types as it would screw up operands
6899      expected to be in memory.  */
6900   for (tail = inputs; tail; tail = TREE_CHAIN (tail))
6901     TREE_VALUE (tail) = default_function_array_conversion (TREE_VALUE (tail));
6902
6903   return add_stmt (build_stmt (ASM_STMT, cv_qualifier, string,
6904                                outputs, inputs, clobbers));
6905 }
6906
6907 /* Expand an ASM statement with operands, handling output operands
6908    that are not variables or INDIRECT_REFS by transforming such
6909    cases into cases that expand_asm_operands can handle.
6910
6911    Arguments are same as for expand_asm_operands.  */
6912
6913 void
6914 c_expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line)
6915      tree string, outputs, inputs, clobbers;
6916      int vol;
6917      const char *filename;
6918      int line;
6919 {
6920   int noutputs = list_length (outputs);
6921   int i;
6922   /* o[I] is the place that output number I should be written.  */
6923   tree *o = (tree *) alloca (noutputs * sizeof (tree));
6924   tree tail;
6925
6926   /* Record the contents of OUTPUTS before it is modified.  */
6927   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
6928     o[i] = TREE_VALUE (tail);
6929
6930   /* Generate the ASM_OPERANDS insn; store into the TREE_VALUEs of
6931      OUTPUTS some trees for where the values were actually stored.  */
6932   expand_asm_operands (string, outputs, inputs, clobbers, vol, filename, line);
6933
6934   /* Copy all the intermediate outputs into the specified outputs.  */
6935   for (i = 0, tail = outputs; tail; tail = TREE_CHAIN (tail), i++)
6936     {
6937       if (o[i] != TREE_VALUE (tail))
6938         {
6939           expand_expr (build_modify_expr (o[i], NOP_EXPR, TREE_VALUE (tail)),
6940                        NULL_RTX, VOIDmode, EXPAND_NORMAL);
6941           free_temp_slots ();
6942
6943           /* Restore the original value so that it's correct the next
6944              time we expand this function.  */
6945           TREE_VALUE (tail) = o[i];
6946         }
6947       /* Detect modification of read-only values.
6948          (Otherwise done by build_modify_expr.)  */
6949       else
6950         {
6951           tree type = TREE_TYPE (o[i]);
6952           if (TREE_READONLY (o[i])
6953               || TYPE_READONLY (type)
6954               || ((TREE_CODE (type) == RECORD_TYPE
6955                    || TREE_CODE (type) == UNION_TYPE)
6956                   && C_TYPE_FIELDS_READONLY (type)))
6957             readonly_warning (o[i], "modification by `asm'");
6958         }
6959     }
6960
6961   /* Those MODIFY_EXPRs could do autoincrements.  */
6962   emit_queue ();
6963 }
6964 \f
6965 /* Expand a C `return' statement.
6966    RETVAL is the expression for what to return,
6967    or a null pointer for `return;' with no value.  */
6968
6969 tree
6970 c_expand_return (retval)
6971      tree retval;
6972 {
6973   tree valtype = TREE_TYPE (TREE_TYPE (current_function_decl));
6974
6975   if (TREE_THIS_VOLATILE (current_function_decl))
6976     warning ("function declared `noreturn' has a `return' statement");
6977
6978   if (!retval)
6979     {
6980       current_function_returns_null = 1;
6981       if ((warn_return_type || flag_isoc99)
6982           && valtype != 0 && TREE_CODE (valtype) != VOID_TYPE)
6983         pedwarn_c99 ("`return' with no value, in function returning non-void");
6984     }
6985   else if (valtype == 0 || TREE_CODE (valtype) == VOID_TYPE)
6986     {
6987       current_function_returns_null = 1;
6988       if (pedantic || TREE_CODE (TREE_TYPE (retval)) != VOID_TYPE)
6989         pedwarn ("`return' with a value, in function returning void");
6990     }
6991   else
6992     {
6993       tree t = convert_for_assignment (valtype, retval, _("return"),
6994                                        NULL_TREE, NULL_TREE, 0);
6995       tree res = DECL_RESULT (current_function_decl);
6996       tree inner;
6997
6998       current_function_returns_value = 1;
6999       if (t == error_mark_node)
7000         return NULL_TREE;
7001
7002       inner = t = convert (TREE_TYPE (res), t);
7003
7004       /* Strip any conversions, additions, and subtractions, and see if
7005          we are returning the address of a local variable.  Warn if so.  */
7006       while (1)
7007         {
7008           switch (TREE_CODE (inner))
7009             {
7010             case NOP_EXPR:   case NON_LVALUE_EXPR:  case CONVERT_EXPR:
7011             case PLUS_EXPR:
7012               inner = TREE_OPERAND (inner, 0);
7013               continue;
7014
7015             case MINUS_EXPR:
7016               /* If the second operand of the MINUS_EXPR has a pointer
7017                  type (or is converted from it), this may be valid, so
7018                  don't give a warning.  */
7019               {
7020                 tree op1 = TREE_OPERAND (inner, 1);
7021
7022                 while (! POINTER_TYPE_P (TREE_TYPE (op1))
7023                        && (TREE_CODE (op1) == NOP_EXPR
7024                            || TREE_CODE (op1) == NON_LVALUE_EXPR
7025                            || TREE_CODE (op1) == CONVERT_EXPR))
7026                   op1 = TREE_OPERAND (op1, 0);
7027
7028                 if (POINTER_TYPE_P (TREE_TYPE (op1)))
7029                   break;
7030
7031                 inner = TREE_OPERAND (inner, 0);
7032                 continue;
7033               }
7034               
7035             case ADDR_EXPR:
7036               inner = TREE_OPERAND (inner, 0);
7037
7038               while (TREE_CODE_CLASS (TREE_CODE (inner)) == 'r')
7039                 inner = TREE_OPERAND (inner, 0);
7040
7041               if (TREE_CODE (inner) == VAR_DECL
7042                   && ! DECL_EXTERNAL (inner)
7043                   && ! TREE_STATIC (inner)
7044                   && DECL_CONTEXT (inner) == current_function_decl)
7045                 warning ("function returns address of local variable");
7046               break;
7047
7048             default:
7049               break;
7050             }
7051
7052           break;
7053         }
7054
7055       retval = build (MODIFY_EXPR, TREE_TYPE (res), res, t);
7056     }
7057
7058  return add_stmt (build_return_stmt (retval));
7059 }
7060 \f
7061 struct c_switch {
7062   /* The SWITCH_STMT being built.  */
7063   tree switch_stmt;
7064   /* A splay-tree mapping the low element of a case range to the high
7065      element, or NULL_TREE if there is no high element.  Used to
7066      determine whether or not a new case label duplicates an old case
7067      label.  We need a tree, rather than simply a hash table, because
7068      of the GNU case range extension.  */
7069   splay_tree cases;
7070   /* The next node on the stack.  */
7071   struct c_switch *next;
7072 };
7073
7074 /* A stack of the currently active switch statements.  The innermost
7075    switch statement is on the top of the stack.  There is no need to
7076    mark the stack for garbage collection because it is only active
7077    during the processing of the body of a function, and we never
7078    collect at that point.  */
7079
7080 static struct c_switch *switch_stack;
7081
7082 /* Start a C switch statement, testing expression EXP.  Return the new
7083    SWITCH_STMT.  */
7084
7085 tree
7086 c_start_case (exp)
7087      tree exp;
7088 {
7089   enum tree_code code;
7090   tree type, orig_type = error_mark_node;
7091   struct c_switch *cs;
7092
7093   if (exp != error_mark_node)
7094     {
7095       code = TREE_CODE (TREE_TYPE (exp));
7096       orig_type = TREE_TYPE (exp);
7097
7098       if (! INTEGRAL_TYPE_P (orig_type)
7099           && code != ERROR_MARK)
7100         {
7101           error ("switch quantity not an integer");
7102           exp = integer_zero_node;
7103         }
7104       else
7105         {
7106           type = TYPE_MAIN_VARIANT (TREE_TYPE (exp));
7107
7108           if (warn_traditional && !in_system_header
7109               && (type == long_integer_type_node
7110                   || type == long_unsigned_type_node))
7111             warning ("`long' switch expression not converted to `int' in ISO C");
7112
7113           exp = default_conversion (exp);
7114           type = TREE_TYPE (exp);
7115         }
7116     }
7117
7118   /* Add this new SWITCH_STMT to the stack.  */
7119   cs = (struct c_switch *) xmalloc (sizeof (*cs));
7120   cs->switch_stmt = build_stmt (SWITCH_STMT, exp, NULL_TREE, orig_type);
7121   cs->cases = splay_tree_new (case_compare, NULL, NULL);
7122   cs->next = switch_stack;
7123   switch_stack = cs;
7124
7125   return add_stmt (switch_stack->switch_stmt);
7126 }
7127
7128 /* Process a case label.  */
7129
7130 tree
7131 do_case (low_value, high_value)
7132      tree low_value;
7133      tree high_value;
7134 {
7135   tree label = NULL_TREE;
7136
7137   if (switch_stack)
7138     {
7139       label = c_add_case_label (switch_stack->cases, 
7140                                 SWITCH_COND (switch_stack->switch_stmt), 
7141                                 low_value, high_value);
7142       if (label == error_mark_node)
7143         label = NULL_TREE;
7144     }
7145   else if (low_value)
7146     error ("case label not within a switch statement");
7147   else
7148     error ("`default' label not within a switch statement");
7149
7150   return label;
7151 }
7152
7153 /* Finish the switch statement.  */
7154
7155 void
7156 c_finish_case ()
7157 {
7158   struct c_switch *cs = switch_stack;
7159
7160   RECHAIN_STMTS (cs->switch_stmt, SWITCH_BODY (cs->switch_stmt)); 
7161
7162   /* Pop the stack.  */
7163   switch_stack = switch_stack->next;
7164   splay_tree_delete (cs->cases);
7165   free (cs);
7166 }