OSDN Git Service

b71a4252eaf43923c3cebe91a8f725d17a04bcd6
[pf3gnuchains/gcc-fork.git] / gcc / c-common.c
1 /* Subroutines shared by all languages that are variants of C.
2    Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
19
20 #include "config.h"
21 #include "tree.h"
22 #include "c-lex.h"
23 #include "c-tree.h"
24 #include "flags.h"
25 #include "obstack.h"
26 #include <stdio.h>
27 #include <ctype.h>
28
29 extern struct obstack permanent_obstack;
30
31 static void declare_hidden_char_array PROTO((char *, char *));
32
33 /* Make bindings for __FUNCTION__ and __PRETTY_FUNCTION__.  */
34
35 void
36 declare_function_name ()
37 {
38   char *name, *printable_name;
39
40   if (current_function_decl == NULL)
41     {
42       name = "";
43       printable_name = "top level";
44     }
45   else
46     {
47       char *kind = "function";
48       if (TREE_CODE (TREE_TYPE (current_function_decl)) == METHOD_TYPE)
49         kind = "method";
50       /* Allow functions to be nameless (such as artificial ones).  */
51       if (DECL_NAME (current_function_decl))
52         name = IDENTIFIER_POINTER (DECL_NAME (current_function_decl));
53       else
54         name = "";
55       printable_name = (*decl_printable_name) (current_function_decl, &kind);
56     }
57
58   declare_hidden_char_array ("__FUNCTION__", name);
59   declare_hidden_char_array ("__PRETTY_FUNCTION__", printable_name);
60 }
61
62 static void
63 declare_hidden_char_array (name, value)
64      char *name, *value;
65 {
66   tree decl, type, init;
67   int vlen;
68
69   /* If the default size of char arrays isn't big enough for the name,
70      or if we want to give warnings for large objects, make a bigger one.  */
71   vlen = strlen (value) + 1;
72   type = char_array_type_node;
73   if (TREE_INT_CST_LOW (TYPE_MAX_VALUE (TREE_TYPE (type))) < vlen
74       || warn_larger_than)
75     type = build_array_type (char_type_node,
76                              build_index_type (build_int_2 (vlen, 0)));
77   push_obstacks_nochange ();
78   decl = build_decl (VAR_DECL, get_identifier (name), type);
79   TREE_STATIC (decl) = 1;
80   TREE_READONLY (decl) = 1;
81   TREE_ASM_WRITTEN (decl) = 1;
82   DECL_SOURCE_LINE (decl) = 0;
83   DECL_IN_SYSTEM_HEADER (decl) = 1;
84   DECL_IGNORED_P (decl) = 1;
85   init = build_string (vlen, value);
86   TREE_TYPE (init) = type;
87   DECL_INITIAL (decl) = init;
88   finish_decl (pushdecl (decl), init, NULL_TREE);
89 }
90
91 /* Given a chain of STRING_CST nodes,
92    concatenate them into one STRING_CST
93    and give it a suitable array-of-chars data type.  */
94
95 tree
96 combine_strings (strings)
97      tree strings;
98 {
99   register tree value, t;
100   register int length = 1;
101   int wide_length = 0;
102   int wide_flag = 0;
103   int wchar_bytes = TYPE_PRECISION (wchar_type_node) / BITS_PER_UNIT;
104   int nchars;
105
106   if (TREE_CHAIN (strings))
107     {
108       /* More than one in the chain, so concatenate.  */
109       register char *p, *q;
110
111       /* Don't include the \0 at the end of each substring,
112          except for the last one.
113          Count wide strings and ordinary strings separately.  */
114       for (t = strings; t; t = TREE_CHAIN (t))
115         {
116           if (TREE_TYPE (t) == wchar_array_type_node)
117             {
118               wide_length += (TREE_STRING_LENGTH (t) - wchar_bytes);
119               wide_flag = 1;
120             }
121           else
122             length += (TREE_STRING_LENGTH (t) - 1);
123         }
124
125       /* If anything is wide, the non-wides will be converted,
126          which makes them take more space.  */
127       if (wide_flag)
128         length = length * wchar_bytes + wide_length;
129
130       p = savealloc (length);
131
132       /* Copy the individual strings into the new combined string.
133          If the combined string is wide, convert the chars to ints
134          for any individual strings that are not wide.  */
135
136       q = p;
137       for (t = strings; t; t = TREE_CHAIN (t))
138         {
139           int len = (TREE_STRING_LENGTH (t)
140                      - ((TREE_TYPE (t) == wchar_array_type_node)
141                         ? wchar_bytes : 1));
142           if ((TREE_TYPE (t) == wchar_array_type_node) == wide_flag)
143             {
144               bcopy (TREE_STRING_POINTER (t), q, len);
145               q += len;
146             }
147           else
148             {
149               int i;
150               for (i = 0; i < len; i++)
151                 ((int *) q)[i] = TREE_STRING_POINTER (t)[i];
152               q += len * wchar_bytes;
153             }
154         }
155       if (wide_flag)
156         {
157           int i;
158           for (i = 0; i < wchar_bytes; i++)
159             *q++ = 0;
160         }
161       else
162         *q = 0;
163
164       value = make_node (STRING_CST);
165       TREE_STRING_POINTER (value) = p;
166       TREE_STRING_LENGTH (value) = length;
167       TREE_CONSTANT (value) = 1;
168     }
169   else
170     {
171       value = strings;
172       length = TREE_STRING_LENGTH (value);
173       if (TREE_TYPE (value) == wchar_array_type_node)
174         wide_flag = 1;
175     }
176
177   /* Compute the number of elements, for the array type.  */ 
178   nchars = wide_flag ? length / wchar_bytes : length;
179
180   /* Create the array type for the string constant.
181      -Wwrite-strings says make the string constant an array of const char
182      so that copying it to a non-const pointer will get a warning.  */
183   if (warn_write_strings
184       && (! flag_traditional  && ! flag_writable_strings))
185     {
186       tree elements
187         = build_type_variant (wide_flag ? wchar_type_node : char_type_node,
188                               1, 0);
189       TREE_TYPE (value)
190         = build_array_type (elements,
191                             build_index_type (build_int_2 (nchars - 1, 0)));
192     }
193   else
194     TREE_TYPE (value)
195       = build_array_type (wide_flag ? wchar_type_node : char_type_node,
196                           build_index_type (build_int_2 (nchars - 1, 0)));
197   TREE_CONSTANT (value) = 1;
198   TREE_STATIC (value) = 1;
199   return value;
200 }
201 \f
202 /* Process the attributes listed in ATTRIBUTES
203    and install them in DECL.  */
204
205 void
206 decl_attributes (decl, attributes)
207      tree decl, attributes;
208 {
209   tree a;
210
211   for (a = attributes; a; a = TREE_CHAIN (a))
212     if (TREE_VALUE (a) == get_identifier ("packed"))
213       {
214         if (TREE_CODE (decl) == FIELD_DECL)
215           DECL_PACKED (decl) = 1;
216         /* We can't set DECL_PACKED for a VAR_DECL, because the bit is
217            used for DECL_REGISTER.  It wouldn't mean anything anyway.  */
218         else
219           warning_with_decl (decl, "`packed' attribute ignore");
220
221       }
222     else if (TREE_VALUE (a) == get_identifier ("noreturn")
223              || TREE_VALUE (a) == get_identifier ("volatile"))
224       {
225         tree type = TREE_TYPE (decl);
226
227         if (TREE_CODE (decl) == FUNCTION_DECL)
228           TREE_THIS_VOLATILE (decl) = 1;
229         else if (TREE_CODE (type) == POINTER_TYPE
230                  && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
231           TREE_TYPE (decl)
232             = build_pointer_type
233               (build_type_variant (TREE_TYPE (type),
234                                    TREE_READONLY (TREE_TYPE (type)), 1));
235         else
236           warning_with_decl (decl, "`%s' attribute ignored",
237                              IDENTIFIER_POINTER (TREE_VALUE (a)));
238       }
239     else if (TREE_VALUE (a) == get_identifier ("const"))
240       {
241         tree type = TREE_TYPE (decl);
242
243         if (TREE_CODE (decl) == FUNCTION_DECL)
244           TREE_READONLY (decl) = 1;
245         else if (TREE_CODE (type) == POINTER_TYPE
246                  && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
247           TREE_TYPE (decl)
248             = build_pointer_type
249               (build_type_variant (TREE_TYPE (type), 1,
250                                    TREE_THIS_VOLATILE (TREE_TYPE (type))));
251         else
252           warning_with_decl (decl, "`const' attribute ignored");
253       }
254     else if (TREE_VALUE (a) != 0
255              && TREE_CODE (TREE_VALUE (a)) == TREE_LIST
256              && TREE_PURPOSE (TREE_VALUE (a)) == get_identifier ("mode"))
257       {
258         int i;
259         char *specified_name
260           = IDENTIFIER_POINTER (TREE_VALUE (TREE_VALUE (a)));
261
262         /* Give this decl a type with the specified mode.  */
263         for (i = 0; i < NUM_MACHINE_MODES; i++)
264           if (!strcmp (specified_name, GET_MODE_NAME (i)))
265             {
266               tree type
267                 = type_for_mode (i, TREE_UNSIGNED (TREE_TYPE (decl)));
268               if (type != 0)
269                 {
270                   TREE_TYPE (decl) = type;
271                   DECL_SIZE (decl) = 0;
272                   layout_decl (decl, 0);
273                 }
274               else
275                 error ("no data type for mode `%s'", specified_name);
276               break;
277             }
278         if (i == NUM_MACHINE_MODES)
279           error_with_decl (decl, "unknown machine mode `%s'", specified_name);
280       }
281     else if (TREE_VALUE (a) != 0
282              && TREE_CODE (TREE_VALUE (a)) == TREE_LIST
283              && TREE_PURPOSE (TREE_VALUE (a)) == get_identifier ("section"))
284       {
285 #ifdef ASM_OUTPUT_SECTION_NAME
286         if (TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == VAR_DECL)
287           {
288             if (TREE_CODE (decl) == VAR_DECL && current_function_decl != NULL_TREE)
289               error_with_decl (decl,
290                                "section attribute cannot be specified for local variables");
291             /* The decl may have already been given a section attribute from
292                a previous declaration.  Ensure they match.  */
293             else if (DECL_SECTION_NAME (decl) != NULL_TREE
294                      && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
295                                 TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (a)))) != 0)
296               error_with_decl (decl,
297                                "section of `%s' conflicts with previous declaration");
298             else
299               DECL_SECTION_NAME (decl) = TREE_VALUE (TREE_VALUE (a));
300           }
301         else
302           error_with_decl (decl,
303                            "section attribute not allowed for `%s'");
304 #else
305         error_with_decl (decl, "section attributes are not supported for this target");
306 #endif
307       }
308     else if (TREE_VALUE (a) != 0
309              && TREE_CODE (TREE_VALUE (a)) == TREE_LIST
310              && TREE_PURPOSE (TREE_VALUE (a)) == get_identifier ("aligned"))
311       {
312         tree align_expr = TREE_VALUE (TREE_VALUE (a));
313         int align;
314
315         /* Strip any NOPs of any kind.  */
316         while (TREE_CODE (align_expr) == NOP_EXPR
317                || TREE_CODE (align_expr) == CONVERT_EXPR
318                || TREE_CODE (align_expr) == NON_LVALUE_EXPR)
319           align_expr = TREE_OPERAND (align_expr, 0);
320
321         if (TREE_CODE (align_expr) != INTEGER_CST)
322           {
323             error_with_decl (decl,
324                              "requested alignment of `%s' is not a constant");
325             continue;
326           }
327
328         align = TREE_INT_CST_LOW (align_expr) * BITS_PER_UNIT;
329         
330         if (exact_log2 (align) == -1)
331           error_with_decl (decl,
332                            "requested alignment of `%s' is not a power of 2");
333         else if (TREE_CODE (decl) != VAR_DECL
334                  && TREE_CODE (decl) != FIELD_DECL)
335           error_with_decl (decl,
336                            "alignment specified for `%s'");
337         else
338           DECL_ALIGN (decl) = align;
339       }
340     else if (TREE_VALUE (a) != 0
341              && TREE_CODE (TREE_VALUE (a)) == TREE_LIST
342              && TREE_PURPOSE (TREE_VALUE (a)) == get_identifier ("format"))
343       {
344         tree list = TREE_VALUE (TREE_VALUE (a));
345         tree format_type = TREE_PURPOSE (list);
346         tree format_num_expr = TREE_PURPOSE (TREE_VALUE (list));
347         tree first_arg_num_expr = TREE_VALUE (TREE_VALUE (list));
348         int format_num;
349         int first_arg_num;
350         int is_scan;
351         tree argument;
352         int arg_num;
353         
354         if (TREE_CODE (decl) != FUNCTION_DECL)
355           {
356             error_with_decl (decl,
357                              "argument format specified for non-function `%s'");
358             continue;
359           }
360         
361         if (format_type == get_identifier ("printf"))
362           is_scan = 0;
363         else if (format_type == get_identifier ("scanf"))
364           is_scan = 1;
365         else
366           {
367             error_with_decl (decl, "unrecognized format specifier for `%s'");
368             continue;
369           }
370         
371         /* Strip any conversions from the string index and first arg number
372            and verify they are constants.  */
373         while (TREE_CODE (format_num_expr) == NOP_EXPR
374                || TREE_CODE (format_num_expr) == CONVERT_EXPR
375                || TREE_CODE (format_num_expr) == NON_LVALUE_EXPR)
376           format_num_expr = TREE_OPERAND (format_num_expr, 0);
377
378         while (TREE_CODE (first_arg_num_expr) == NOP_EXPR
379                || TREE_CODE (first_arg_num_expr) == CONVERT_EXPR
380                || TREE_CODE (first_arg_num_expr) == NON_LVALUE_EXPR)
381           first_arg_num_expr = TREE_OPERAND (first_arg_num_expr, 0);
382
383         if (TREE_CODE (format_num_expr) != INTEGER_CST
384             || TREE_CODE (first_arg_num_expr) != INTEGER_CST)
385           {
386             error_with_decl (decl,
387                    "format string for `%s' has non-constant operand number");
388             continue;
389           }
390
391         format_num = TREE_INT_CST_LOW (format_num_expr);
392         first_arg_num = TREE_INT_CST_LOW (first_arg_num_expr);
393         if (first_arg_num != 0 && first_arg_num <= format_num)
394           {
395             error_with_decl (decl,
396               "format string arg follows the args to be formatted, for `%s'");
397             continue;
398           }
399
400         /* If a parameter list is specified, verify that the format_num
401            argument is actually a string, in case the format attribute
402            is in error.  */
403         argument = TYPE_ARG_TYPES (TREE_TYPE (decl));
404         if (argument)
405           {
406             for (arg_num = 1; ; ++arg_num)
407               {
408                 if (argument == 0 || arg_num == format_num)
409                   break;
410                 argument = TREE_CHAIN (argument);
411               }
412             if (! argument
413                 || TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE
414                 || (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_VALUE (argument)))
415                     != char_type_node))
416               {
417                 error_with_decl (decl,
418                              "format string arg not a string type, for `%s'");
419                 continue;
420               }
421             if (first_arg_num != 0)
422               {
423                 /* Verify that first_arg_num points to the last arg, the ... */
424                 while (argument)
425                   arg_num++, argument = TREE_CHAIN (argument);
426                 if (arg_num != first_arg_num)
427                   {
428                     error_with_decl (decl,
429                                  "args to be formatted is not ..., for `%s'");
430                     continue;
431                   }
432               }
433           }
434
435         record_function_format (DECL_NAME (decl), DECL_ASSEMBLER_NAME (decl),
436                                 is_scan, format_num, first_arg_num);
437       }
438 }
439 \f
440 /* Check a printf/fprintf/sprintf/scanf/fscanf/sscanf format against
441    a parameter list.  */
442
443 #define T_I     &integer_type_node
444 #define T_L     &long_integer_type_node
445 #define T_S     &short_integer_type_node
446 #define T_UI    &unsigned_type_node
447 #define T_UL    &long_unsigned_type_node
448 #define T_US    &short_unsigned_type_node
449 #define T_F     &float_type_node
450 #define T_D     &double_type_node
451 #define T_LD    &long_double_type_node
452 #define T_C     &char_type_node
453 #define T_V     &void_type_node
454 #define T_W     &wchar_type_node
455 #define T_ST    &sizetype
456
457 typedef struct {
458   char *format_chars;
459   int pointer_count;
460   /* Type of argument if no length modifier is used.  */
461   tree *nolen;
462   /* Type of argument if length modifier for shortening is used.
463      If NULL, then this modifier is not allowed.  */
464   tree *hlen;
465   /* Type of argument if length modifier `l' is used.
466      If NULL, then this modifier is not allowed.  */
467   tree *llen;
468   /* Type of argument if length modifier `L' is used.
469      If NULL, then this modifier is not allowed.  */
470   tree *bigllen;
471   /* List of other modifier characters allowed with these options.  */
472   char *flag_chars;
473 } format_char_info;
474
475 static format_char_info print_char_table[] = {
476   { "di",       0,      T_I,    T_I,    T_L,    NULL,   "-wp0 +"        },
477   { "oxX",      0,      T_UI,   T_UI,   T_UL,   NULL,   "-wp0#"         },
478   { "u",        0,      T_UI,   T_UI,   T_UL,   NULL,   "-wp0"          },
479 /* Two GNU extensions.  */
480   { "Z",        0,      T_ST,   NULL,   NULL,   NULL,   "-wp0"          },
481   { "m",        0,      T_UI,   T_UI,   T_UL,   NULL,   "-wp"           },
482   { "feEgG",    0,      T_D,    NULL,   NULL,   T_LD,   "-wp0 +#"       },
483   { "c",        0,      T_I,    NULL,   T_W,    NULL,   "-w"            },
484   { "C",        0,      T_W,    NULL,   NULL,   NULL,   "-w"            },
485   { "s",        1,      T_C,    NULL,   T_W,    NULL,   "-wp"           },
486   { "S",        1,      T_W,    NULL,   NULL,   NULL,   "-wp"           },
487   { "p",        1,      T_V,    NULL,   NULL,   NULL,   "-w"            },
488   { "n",        1,      T_I,    T_S,    T_L,    NULL,   ""              },
489   { NULL }
490 };
491
492 static format_char_info scan_char_table[] = {
493   { "di",       1,      T_I,    T_S,    T_L,    NULL,   "*"     },
494   { "ouxX",     1,      T_UI,   T_US,   T_UL,   NULL,   "*"     },      
495   { "efgEG",    1,      T_F,    NULL,   T_D,    T_LD,   "*"     },
496   { "sc",       1,      T_C,    NULL,   T_W,    NULL,   "*a"    },
497   { "[",        1,      T_C,    NULL,   NULL,   NULL,   "*a"    },
498   { "C",        1,      T_W,    NULL,   NULL,   NULL,   "*"     },
499   { "S",        1,      T_W,    NULL,   NULL,   NULL,   "*"     },
500   { "p",        2,      T_V,    NULL,   NULL,   NULL,   "*"     },
501   { "n",        1,      T_I,    T_S,    T_L,    NULL,   ""      },
502   { NULL }
503 };
504
505 typedef struct function_format_info {
506   struct function_format_info *next;  /* next structure on the list */
507   tree name;                    /* identifier such as "printf" */
508   tree assembler_name;          /* optional mangled identifier (for C++) */
509   int is_scan;                  /* TRUE if *scanf */
510   int format_num;               /* number of format argument */
511   int first_arg_num;            /* number of first arg (zero for varargs) */
512 } function_format_info;
513
514 static function_format_info *function_format_list = NULL;
515
516 static void check_format_info PROTO((function_format_info *, tree));
517
518 /* Initialize the table of functions to perform format checking on.
519    The ANSI functions are always checked (whether <stdio.h> is
520    included or not), since it is common to call printf without
521    including <stdio.h>.  There shouldn't be a problem with this,
522    since ANSI reserves these function names whether you include the
523    header file or not.  In any case, the checking is harmless.  */
524
525 void
526 init_function_format_info ()
527 {
528   record_function_format (get_identifier ("printf"), NULL_TREE, 0, 1, 2);
529   record_function_format (get_identifier ("fprintf"), NULL_TREE, 0, 2, 3);
530   record_function_format (get_identifier ("sprintf"), NULL_TREE, 0, 2, 3);
531   record_function_format (get_identifier ("scanf"), NULL_TREE, 1, 1, 2);
532   record_function_format (get_identifier ("fscanf"), NULL_TREE, 1, 2, 3);
533   record_function_format (get_identifier ("sscanf"), NULL_TREE, 1, 2, 3);
534   record_function_format (get_identifier ("vprintf"), NULL_TREE, 0, 1, 0);
535   record_function_format (get_identifier ("vfprintf"), NULL_TREE, 0, 2, 0);
536   record_function_format (get_identifier ("vsprintf"), NULL_TREE, 0, 2, 0);
537 }
538
539 /* Record information for argument format checking.  FUNCTION_IDENT is
540    the identifier node for the name of the function to check (its decl
541    need not exist yet).  IS_SCAN is true for scanf-type format checking;
542    false indicates printf-style format checking.  FORMAT_NUM is the number
543    of the argument which is the format control string (starting from 1).
544    FIRST_ARG_NUM is the number of the first actual argument to check
545    against teh format string, or zero if no checking is not be done
546    (e.g. for varargs such as vfprintf).  */
547
548 void
549 record_function_format (name, assembler_name, is_scan,
550                         format_num, first_arg_num)
551       tree name;
552       tree assembler_name;
553       int is_scan;
554       int format_num;
555       int first_arg_num;
556 {
557   function_format_info *info;
558
559   /* Re-use existing structure if it's there.  */
560
561   for (info = function_format_list; info; info = info->next)
562     {
563       if (info->name == name && info->assembler_name == assembler_name)
564         break;
565     }
566   if (! info)
567     {
568       info = (function_format_info *) xmalloc (sizeof (function_format_info));
569       info->next = function_format_list;
570       function_format_list = info;
571
572       info->name = name;
573       info->assembler_name = assembler_name;
574     }
575
576   info->is_scan = is_scan;
577   info->format_num = format_num;
578   info->first_arg_num = first_arg_num;
579 }
580
581 static char     tfaff[] = "too few arguments for format";
582 \f
583 /* Check the argument list of a call to printf, scanf, etc.
584    NAME is the function identifier.
585    ASSEMBLER_NAME is the function's assembler identifier.
586    (Either NAME or ASSEMBLER_NAME, but not both, may be NULL_TREE.)
587    PARAMS is the list of argument values.  */
588
589 void
590 check_function_format (name, assembler_name, params)
591      tree name;
592      tree assembler_name;
593      tree params;
594 {
595   function_format_info *info;
596
597   /* See if this function is a format function.  */
598   for (info = function_format_list; info; info = info->next)
599     {
600       if (info->assembler_name
601           ? (info->assembler_name == assembler_name)
602           : (info->name == name))
603         {
604           /* Yup; check it.  */
605           check_format_info (info, params);
606           break;
607         }
608     }
609 }
610
611 /* Check the argument list of a call to printf, scanf, etc.
612    INFO points to the function_format_info structure.
613    PARAMS is the list of argument values.  */
614
615 static void
616 check_format_info (info, params)
617      function_format_info *info;
618      tree params;
619 {
620   int i;
621   int arg_num;
622   int suppressed, wide, precise;
623   int length_char;
624   int format_char;
625   int format_length;
626   tree format_tree;
627   tree cur_param;
628   tree cur_type;
629   tree wanted_type;
630   tree first_fillin_param;
631   char *format_chars;
632   format_char_info *fci;
633   static char message[132];
634   char flag_chars[8];
635   int has_operand_number = 0;
636
637   /* Skip to format argument.  If the argument isn't available, there's
638      no work for us to do; prototype checking will catch the problem.  */
639   for (arg_num = 1; ; ++arg_num)
640     {
641       if (params == 0)
642         return;
643       if (arg_num == info->format_num)
644         break;
645       params = TREE_CHAIN (params);
646     }
647   format_tree = TREE_VALUE (params);
648   params = TREE_CHAIN (params);
649   if (format_tree == 0)
650     return;
651   /* We can only check the format if it's a string constant.  */
652   while (TREE_CODE (format_tree) == NOP_EXPR)
653     format_tree = TREE_OPERAND (format_tree, 0); /* strip coercion */
654   if (format_tree == null_pointer_node)
655     {
656       warning ("null format string");
657       return;
658     }
659   if (TREE_CODE (format_tree) != ADDR_EXPR)
660     return;
661   format_tree = TREE_OPERAND (format_tree, 0);
662   if (TREE_CODE (format_tree) != STRING_CST)
663     return;
664   format_chars = TREE_STRING_POINTER (format_tree);
665   format_length = TREE_STRING_LENGTH (format_tree);
666   if (format_length <= 1)
667     warning ("zero-length format string");
668   if (format_chars[--format_length] != 0)
669     {
670       warning ("unterminated format string");
671       return;
672     }
673   /* Skip to first argument to check.  */
674   while (arg_num + 1 < info->first_arg_num)
675     {
676       if (params == 0)
677         return;
678       params = TREE_CHAIN (params);
679       ++arg_num;
680     }
681
682   first_fillin_param = params;
683   while (1)
684     {
685       int aflag;
686       if (*format_chars == 0)
687         {
688           if (format_chars - TREE_STRING_POINTER (format_tree) != format_length)
689             warning ("embedded `\\0' in format");
690           if (info->first_arg_num != 0 && params != 0 && ! has_operand_number)
691             warning ("too many arguments for format");
692           return;
693         }
694       if (*format_chars++ != '%')
695         continue;
696       if (*format_chars == 0)
697         {
698           warning ("spurious trailing `%%' in format");
699           continue;
700         }
701       if (*format_chars == '%')
702         {
703           ++format_chars;
704           continue;
705         }
706       flag_chars[0] = 0;
707       suppressed = wide = precise = FALSE;
708       if (info->is_scan)
709         {
710           suppressed = *format_chars == '*';
711           if (suppressed)
712             ++format_chars;
713           while (isdigit (*format_chars))
714             ++format_chars;
715         }
716       else
717         {
718           /* See if we have a number followed by a dollar sign.  If we do,
719              it is an operand number, so set PARAMS to that operand.  */
720           if (*format_chars >= '0' && *format_chars <= '9')
721             {
722               char *p = format_chars;
723
724               while (*p >= '0' && *p++ <= '9')
725                 ;
726
727               if (*p == '$')
728                 {
729                   int opnum = atoi (format_chars);
730
731                   params = first_fillin_param;
732                   format_chars = p + 1;
733                   has_operand_number = 1;
734
735                   for (i = 1; i < opnum && params != 0; i++)
736                     params = TREE_CHAIN (params);
737
738                   if (opnum == 0 || params == 0)
739                     {
740                       warning ("operand number out of range in format");
741                       return;
742                     }
743                 }
744             }
745
746           while (*format_chars != 0 && index (" +#0-", *format_chars) != 0)
747             {
748               if (index (flag_chars, *format_chars) != 0)
749                 {
750                   sprintf (message, "repeated `%c' flag in format",
751                            *format_chars);
752                   warning (message);
753                 }
754               i = strlen (flag_chars);
755               flag_chars[i++] = *format_chars++;
756               flag_chars[i] = 0;
757             }
758           /* "If the space and + flags both appear, 
759              the space flag will be ignored."  */
760           if (index (flag_chars, ' ') != 0
761               && index (flag_chars, '+') != 0)
762             warning ("use of both ` ' and `+' flags in format");
763           /* "If the 0 and - flags both appear,
764              the 0 flag will be ignored."  */
765           if (index (flag_chars, '0') != 0
766               && index (flag_chars, '-') != 0)
767             warning ("use of both `0' and `-' flags in format");
768           if (*format_chars == '*')
769             {
770               wide = TRUE;
771               /* "...a field width...may be indicated by an asterisk.
772                  In this case, an int argument supplies the field width..."  */
773               ++format_chars;
774               if (params == 0)
775                 {
776                   warning (tfaff);
777                   return;
778                 }
779               if (info->first_arg_num != 0)
780                 {
781                   cur_param = TREE_VALUE (params);
782                   params = TREE_CHAIN (params);
783                   ++arg_num;
784                   /* size_t is generally not valid here.
785                      It will work on most machines, because size_t and int
786                      have the same mode.  But might as well warn anyway,
787                      since it will fail on other machines.  */
788                   if ((TYPE_MAIN_VARIANT (TREE_TYPE (cur_param))
789                        != integer_type_node)
790                       &&
791                       (TYPE_MAIN_VARIANT (TREE_TYPE (cur_param))
792                        != unsigned_type_node))
793                     {
794                       sprintf (message,
795                                "field width is not type int (arg %d)",
796                                arg_num);
797                       warning (message);
798                     }
799                 }
800             }
801           else
802             {
803               while (isdigit (*format_chars))
804                 {
805                   wide = TRUE;
806                   ++format_chars;
807                 }
808             }
809           if (*format_chars == '.')
810             {
811               precise = TRUE;
812               ++format_chars;
813               if (*format_chars != '*' && !isdigit (*format_chars))
814                 warning ("`.' not followed by `*' or digit in format");
815               /* "...a...precision...may be indicated by an asterisk.
816                  In this case, an int argument supplies the...precision."  */
817               if (*format_chars == '*')
818                 {
819                   if (info->first_arg_num != 0)
820                     {
821                       ++format_chars;
822                       if (params == 0)
823                         {
824                           warning (tfaff);
825                           return;
826                         }
827                       cur_param = TREE_VALUE (params);
828                       params = TREE_CHAIN (params);
829                       ++arg_num;
830                       if (TYPE_MAIN_VARIANT (TREE_TYPE (cur_param))
831                           != integer_type_node)
832                         {
833                           sprintf (message,
834                                    "field width is not type int (arg %d)",
835                                    arg_num);
836                           warning (message);
837                         }
838                     }
839                 }
840               else
841                 {
842                   while (isdigit (*format_chars))
843                     ++format_chars;
844                 }
845             }
846         }
847       if (*format_chars == 'h' || *format_chars == 'l' || *format_chars == 'L')
848         length_char = *format_chars++;
849       else
850         length_char = 0;
851       aflag = 0;
852       if (*format_chars == 'a')
853         {
854           aflag = 1;
855           format_chars++;
856         }
857       if (suppressed && length_char != 0)
858         {
859           sprintf (message,
860                    "use of `*' and `%c' together in format",
861                    length_char);
862           warning (message);
863         }
864       format_char = *format_chars;
865       if (format_char == 0)
866         {
867           warning ("conversion lacks type at end of format");
868           continue;
869         }
870       format_chars++;
871       fci = info->is_scan ? scan_char_table : print_char_table;
872       while (fci->format_chars != 0
873              && index (fci->format_chars, format_char) == 0)
874           ++fci;
875       if (fci->format_chars == 0)
876         {
877           if (format_char >= 040 && format_char < 0177)
878             sprintf (message,
879                      "unknown conversion type character `%c' in format",
880                      format_char);
881           else
882             sprintf (message,
883                      "unknown conversion type character 0x%x in format",
884                      format_char);
885           warning (message);
886           continue;
887         }
888       if (wide && index (fci->flag_chars, 'w') == 0)
889         {
890           sprintf (message, "width used with `%c' format",
891                    format_char);
892           warning (message);
893         }
894       if (precise && index (fci->flag_chars, 'p') == 0)
895         {
896           sprintf (message, "precision used with `%c' format",
897                    format_char);
898           warning (message);
899         }
900       if (aflag && index (fci->flag_chars, 'a') == 0)
901         {
902           sprintf (message, "`a' flag used with `%c' format",
903                    format_char);
904           warning (message);
905         }
906       if (info->is_scan && format_char == '[')
907         {
908           /* Skip over scan set, in case it happens to have '%' in it.  */
909           if (*format_chars == '^')
910             ++format_chars;
911           /* Find closing bracket; if one is hit immediately, then
912              it's part of the scan set rather than a terminator.  */
913           if (*format_chars == ']')
914             ++format_chars;
915           while (*format_chars && *format_chars != ']')
916             ++format_chars;
917           if (*format_chars != ']')
918               /* The end of the format string was reached.  */
919               warning ("no closing `]' for `%%[' format");
920         }
921       if (suppressed)
922         {
923           if (index (fci->flag_chars, '*') == 0)
924             {
925               sprintf (message,
926                        "suppression of `%c' conversion in format",
927                        format_char);
928               warning (message);
929             }
930           continue;
931         }
932       for (i = 0; flag_chars[i] != 0; ++i)
933         {
934           if (index (fci->flag_chars, flag_chars[i]) == 0)
935             {
936               sprintf (message, "flag `%c' used with type `%c'",
937                        flag_chars[i], format_char);
938               warning (message);
939             }
940         }
941       if (precise && index (flag_chars, '0') != 0
942           && (format_char == 'd' || format_char == 'i'
943               || format_char == 'o' || format_char == 'u'
944               || format_char == 'x' || format_char == 'x'))
945         {
946           sprintf (message,
947                    "precision and `0' flag not both allowed with `%c' format",
948                    format_char);
949           warning (message);
950         }
951       switch (length_char)
952         {
953         default: wanted_type = fci->nolen ? *(fci->nolen) : 0; break;
954         case 'h': wanted_type = fci->hlen ? *(fci->hlen) : 0; break;
955         case 'l': wanted_type = fci->llen ? *(fci->llen) : 0; break;
956         case 'L': wanted_type = fci->bigllen ? *(fci->bigllen) : 0; break;
957         }
958       if (wanted_type == 0)
959         {
960           sprintf (message,
961                    "use of `%c' length character with `%c' type character",
962                    length_char, format_char);
963           warning (message);
964         }
965
966       /*
967        ** XXX -- should kvetch about stuff such as
968        **       {
969        **               const int       i;
970        **
971        **               scanf ("%d", &i);
972        **       }
973        */
974
975       /* Finally. . .check type of argument against desired type!  */
976       if (info->first_arg_num == 0)
977         continue;
978       if (params == 0)
979         {
980           warning (tfaff);
981           return;
982         }
983       cur_param = TREE_VALUE (params);
984       params = TREE_CHAIN (params);
985       ++arg_num;
986       cur_type = TREE_TYPE (cur_param);
987
988       /* Check the types of any additional pointer arguments
989          that precede the "real" argument.  */
990       for (i = 0; i < fci->pointer_count; ++i)
991         {
992           if (TREE_CODE (cur_type) == POINTER_TYPE)
993             {
994               cur_type = TREE_TYPE (cur_type);
995               continue;
996             }
997           sprintf (message,
998                    "format argument is not a %s (arg %d)",
999                    ((fci->pointer_count == 1) ? "pointer" : "pointer to a pointer"),
1000                    arg_num);
1001           warning (message);
1002           break;
1003         }
1004
1005       /* Check the type of the "real" argument, if there's a type we want.  */
1006       if (i == fci->pointer_count && wanted_type != 0
1007           && wanted_type != TYPE_MAIN_VARIANT (cur_type)
1008           /* If we want `void *', allow any pointer type.
1009              (Anything else would already have got a warning.)  */
1010           && ! (wanted_type == void_type_node
1011                 && fci->pointer_count > 0)
1012           /* Don't warn about differences merely in signedness.  */
1013           && !(TREE_CODE (wanted_type) == INTEGER_TYPE
1014                && TREE_CODE (TYPE_MAIN_VARIANT (cur_type)) == INTEGER_TYPE
1015                && (TREE_UNSIGNED (wanted_type)
1016                    ? wanted_type == (cur_type = unsigned_type (cur_type))
1017                    : wanted_type == (cur_type = signed_type (cur_type))))
1018           /* Likewise, "signed char", "unsigned char" and "char" are
1019              equivalent but the above test won't consider them equivalent.  */
1020           && ! (wanted_type == char_type_node
1021                 && (TYPE_MAIN_VARIANT (cur_type) == signed_char_type_node
1022                     || TYPE_MAIN_VARIANT (cur_type) == unsigned_char_type_node)))
1023         {
1024           register char *this;
1025           register char *that;
1026   
1027           this = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (wanted_type)));
1028           that = 0;
1029           if (TREE_CODE (cur_type) != ERROR_MARK
1030               && TYPE_NAME (cur_type) != 0
1031               && TREE_CODE (cur_type) != INTEGER_TYPE
1032               && !(TREE_CODE (cur_type) == POINTER_TYPE
1033                    && TREE_CODE (TREE_TYPE (cur_type)) == INTEGER_TYPE))
1034             {
1035               if (TREE_CODE (TYPE_NAME (cur_type)) == TYPE_DECL
1036                   && DECL_NAME (TYPE_NAME (cur_type)) != 0)
1037                 that = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (cur_type)));
1038               else
1039                 that = IDENTIFIER_POINTER (TYPE_NAME (cur_type));
1040             }
1041
1042           /* A nameless type can't possibly match what the format wants.
1043              So there will be a warning for it.
1044              Make up a string to describe vaguely what it is.  */
1045           if (that == 0)
1046             {
1047               if (TREE_CODE (cur_type) == POINTER_TYPE)
1048                 that = "pointer";
1049               else
1050                 that = "different type";
1051             }
1052
1053           /* Make the warning better in case of mismatch of int vs long.  */
1054           if (TREE_CODE (cur_type) == INTEGER_TYPE
1055               && TREE_CODE (wanted_type) == INTEGER_TYPE
1056               && TYPE_PRECISION (cur_type) == TYPE_PRECISION (wanted_type)
1057               && TYPE_NAME (cur_type) != 0
1058               && TREE_CODE (TYPE_NAME (cur_type)) == TYPE_DECL)
1059             that = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (cur_type)));
1060
1061           if (strcmp (this, that) != 0)
1062             {
1063               sprintf (message, "%s format, %s arg (arg %d)",
1064                         this, that, arg_num);
1065               warning (message);
1066             }
1067         }
1068     }
1069 }
1070 \f
1071 /* Print a warning if a constant expression had overflow in folding.
1072    Invoke this function on every expression that the language
1073    requires to be a constant expression.
1074    Note the ANSI C standard says it is erroneous for a
1075    constant expression to overflow.  */
1076
1077 void
1078 constant_expression_warning (value)
1079      tree value;
1080 {
1081   if (TREE_CODE (value) == INTEGER_CST && TREE_CONSTANT_OVERFLOW (value))
1082     if (pedantic)
1083       pedwarn ("overflow in constant expression");
1084 }
1085
1086 /* Print a warning if an expression had overflow in folding.
1087    Invoke this function on every expression that
1088    (1) appears in the source code, and
1089    (2) might be a constant expression that overflowed, and
1090    (3) is not already checked by convert_and_check;
1091    however, do not invoke this function on operands of explicit casts.  */
1092
1093 void
1094 overflow_warning (value)
1095      tree value;
1096 {
1097   if (TREE_CODE (value) == INTEGER_CST && TREE_OVERFLOW (value))
1098     {
1099       TREE_OVERFLOW (value) = 0;
1100       warning ("integer overflow in expression");
1101     }
1102 }
1103
1104 /* Print a warning if a large constant is truncated to unsigned,
1105    or if -Wconversion is used and a constant < 0 is converted to unsigned.
1106    Invoke this function on every expression that might be implicitly
1107    converted to an unsigned type.  */
1108
1109 void
1110 unsigned_conversion_warning (result, operand)
1111      tree result, operand;
1112 {
1113   if (TREE_CODE (operand) == INTEGER_CST
1114       && TREE_CODE (TREE_TYPE (result)) == INTEGER_TYPE
1115       && TREE_UNSIGNED (TREE_TYPE (result))
1116       && !int_fits_type_p (operand, TREE_TYPE (result)))
1117     {
1118       if (!int_fits_type_p (operand, signed_type (TREE_TYPE (result))))
1119         /* This detects cases like converting -129 or 256 to unsigned char.  */
1120         warning ("large integer implicitly truncated to unsigned type");
1121       else if (warn_conversion)
1122         warning ("negative integer implicitly converted to unsigned type");
1123     }
1124 }
1125
1126 /* Convert EXPR to TYPE, warning about conversion problems with constants.
1127    Invoke this function on every expression that is converted implicitly,
1128    i.e. because of language rules and not because of an explicit cast.  */
1129
1130 tree
1131 convert_and_check (type, expr)
1132      tree type, expr;
1133 {
1134   tree t = convert (type, expr);
1135   if (TREE_CODE (t) == INTEGER_CST)
1136     {
1137       if (TREE_OVERFLOW (t))
1138         {
1139           TREE_OVERFLOW (t) = 0;
1140
1141           /* No warning for converting 0x80000000 to int.  */
1142           if (!(TREE_UNSIGNED (type) < TREE_UNSIGNED (TREE_TYPE (expr))
1143                 && TREE_CODE (TREE_TYPE (expr)) == INTEGER_TYPE
1144                 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (expr))))
1145             /* If EXPR fits in the unsigned version of TYPE,
1146                don't warn unless pedantic.  */
1147             if (pedantic
1148                 || TREE_UNSIGNED (type)
1149                 || ! int_fits_type_p (expr, unsigned_type (type)))
1150               warning ("overflow in implicit constant conversion");
1151         }
1152       else
1153         unsigned_conversion_warning (t, expr);
1154     }
1155   return t;
1156 }
1157 \f
1158 void
1159 c_expand_expr_stmt (expr)
1160      tree expr;
1161 {
1162   /* Do default conversion if safe and possibly important,
1163      in case within ({...}).  */
1164   if ((TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE && lvalue_p (expr))
1165       || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE)
1166     expr = default_conversion (expr);
1167
1168   if (TREE_TYPE (expr) != error_mark_node
1169       && TYPE_SIZE (TREE_TYPE (expr)) == 0
1170       && TREE_CODE (TREE_TYPE (expr)) != ARRAY_TYPE)
1171     error ("expression statement has incomplete type");
1172
1173   expand_expr_stmt (expr);
1174 }
1175 \f
1176 /* Validate the expression after `case' and apply default promotions.  */
1177
1178 tree
1179 check_case_value (value)
1180      tree value;
1181 {
1182   if (value == NULL_TREE)
1183     return value;
1184
1185   /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue.  */
1186   STRIP_TYPE_NOPS (value);
1187
1188   if (TREE_CODE (value) != INTEGER_CST
1189       && value != error_mark_node)
1190     {
1191       error ("case label does not reduce to an integer constant");
1192       value = error_mark_node;
1193     }
1194   else
1195     /* Promote char or short to int.  */
1196     value = default_conversion (value);
1197
1198   constant_expression_warning (value);
1199
1200   return value;
1201 }
1202 \f
1203 /* Return an integer type with BITS bits of precision,
1204    that is unsigned if UNSIGNEDP is nonzero, otherwise signed.  */
1205
1206 tree
1207 type_for_size (bits, unsignedp)
1208      unsigned bits;
1209      int unsignedp;
1210 {
1211   if (bits == TYPE_PRECISION (signed_char_type_node))
1212     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
1213
1214   if (bits == TYPE_PRECISION (short_integer_type_node))
1215     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
1216
1217   if (bits == TYPE_PRECISION (integer_type_node))
1218     return unsignedp ? unsigned_type_node : integer_type_node;
1219
1220   if (bits == TYPE_PRECISION (long_integer_type_node))
1221     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
1222
1223   if (bits == TYPE_PRECISION (long_long_integer_type_node))
1224     return (unsignedp ? long_long_unsigned_type_node
1225             : long_long_integer_type_node);
1226
1227   if (bits <= TYPE_PRECISION (intQI_type_node))
1228     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
1229
1230   if (bits <= TYPE_PRECISION (intHI_type_node))
1231     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
1232
1233   if (bits <= TYPE_PRECISION (intSI_type_node))
1234     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
1235
1236   if (bits <= TYPE_PRECISION (intDI_type_node))
1237     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
1238
1239   return 0;
1240 }
1241
1242 /* Return a data type that has machine mode MODE.
1243    If the mode is an integer,
1244    then UNSIGNEDP selects between signed and unsigned types.  */
1245
1246 tree
1247 type_for_mode (mode, unsignedp)
1248      enum machine_mode mode;
1249      int unsignedp;
1250 {
1251   if (mode == TYPE_MODE (signed_char_type_node))
1252     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
1253
1254   if (mode == TYPE_MODE (short_integer_type_node))
1255     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
1256
1257   if (mode == TYPE_MODE (integer_type_node))
1258     return unsignedp ? unsigned_type_node : integer_type_node;
1259
1260   if (mode == TYPE_MODE (long_integer_type_node))
1261     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
1262
1263   if (mode == TYPE_MODE (long_long_integer_type_node))
1264     return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node;
1265
1266   if (mode == TYPE_MODE (intQI_type_node))
1267     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
1268
1269   if (mode == TYPE_MODE (intHI_type_node))
1270     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
1271
1272   if (mode == TYPE_MODE (intSI_type_node))
1273     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
1274
1275   if (mode == TYPE_MODE (intDI_type_node))
1276     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
1277
1278   if (mode == TYPE_MODE (float_type_node))
1279     return float_type_node;
1280
1281   if (mode == TYPE_MODE (double_type_node))
1282     return double_type_node;
1283
1284   if (mode == TYPE_MODE (long_double_type_node))
1285     return long_double_type_node;
1286
1287   if (mode == TYPE_MODE (build_pointer_type (char_type_node)))
1288     return build_pointer_type (char_type_node);
1289
1290   if (mode == TYPE_MODE (build_pointer_type (integer_type_node)))
1291     return build_pointer_type (integer_type_node);
1292
1293   return 0;
1294 }
1295 \f
1296 /* Print an error message for invalid operands to arith operation CODE.
1297    NOP_EXPR is used as a special case (see truthvalue_conversion).  */
1298
1299 void
1300 binary_op_error (code)
1301      enum tree_code code;
1302 {
1303   register char *opname = "unknown";
1304
1305   switch (code)
1306     {
1307     case NOP_EXPR:
1308       error ("invalid truth-value expression");
1309       return;
1310
1311     case PLUS_EXPR:
1312       opname = "+"; break;
1313     case MINUS_EXPR:
1314       opname = "-"; break;
1315     case MULT_EXPR:
1316       opname = "*"; break;
1317     case MAX_EXPR:
1318       opname = "max"; break;
1319     case MIN_EXPR:
1320       opname = "min"; break;
1321     case EQ_EXPR:
1322       opname = "=="; break;
1323     case NE_EXPR:
1324       opname = "!="; break;
1325     case LE_EXPR:
1326       opname = "<="; break;
1327     case GE_EXPR:
1328       opname = ">="; break;
1329     case LT_EXPR:
1330       opname = "<"; break;
1331     case GT_EXPR:
1332       opname = ">"; break;
1333     case LSHIFT_EXPR:
1334       opname = "<<"; break;
1335     case RSHIFT_EXPR:
1336       opname = ">>"; break;
1337     case TRUNC_MOD_EXPR:
1338     case FLOOR_MOD_EXPR:
1339       opname = "%"; break;
1340     case TRUNC_DIV_EXPR:
1341     case FLOOR_DIV_EXPR:
1342       opname = "/"; break;
1343     case BIT_AND_EXPR:
1344       opname = "&"; break;
1345     case BIT_IOR_EXPR:
1346       opname = "|"; break;
1347     case TRUTH_ANDIF_EXPR:
1348       opname = "&&"; break;
1349     case TRUTH_ORIF_EXPR:
1350       opname = "||"; break;
1351     case BIT_XOR_EXPR:
1352       opname = "^"; break;
1353     case LROTATE_EXPR:
1354     case RROTATE_EXPR:
1355       opname = "rotate"; break;
1356     }
1357   error ("invalid operands to binary %s", opname);
1358 }
1359 \f
1360 /* Subroutine of build_binary_op, used for comparison operations.
1361    See if the operands have both been converted from subword integer types
1362    and, if so, perhaps change them both back to their original type.
1363    This function is also responsible for converting the two operands
1364    to the proper common type for comparison.
1365
1366    The arguments of this function are all pointers to local variables
1367    of build_binary_op: OP0_PTR is &OP0, OP1_PTR is &OP1,
1368    RESTYPE_PTR is &RESULT_TYPE and RESCODE_PTR is &RESULTCODE.
1369
1370    If this function returns nonzero, it means that the comparison has
1371    a constant value.  What this function returns is an expression for
1372    that value.  */
1373
1374 tree
1375 shorten_compare (op0_ptr, op1_ptr, restype_ptr, rescode_ptr)
1376      tree *op0_ptr, *op1_ptr;
1377      tree *restype_ptr;
1378      enum tree_code *rescode_ptr;
1379 {
1380   register tree type;
1381   tree op0 = *op0_ptr;
1382   tree op1 = *op1_ptr;
1383   int unsignedp0, unsignedp1;
1384   int real1, real2;
1385   tree primop0, primop1;
1386   enum tree_code code = *rescode_ptr;
1387
1388   /* Throw away any conversions to wider types
1389      already present in the operands.  */
1390
1391   primop0 = get_narrower (op0, &unsignedp0);
1392   primop1 = get_narrower (op1, &unsignedp1);
1393
1394   /* Handle the case that OP0 does not *contain* a conversion
1395      but it *requires* conversion to FINAL_TYPE.  */
1396
1397   if (op0 == primop0 && TREE_TYPE (op0) != *restype_ptr)
1398     unsignedp0 = TREE_UNSIGNED (TREE_TYPE (op0));
1399   if (op1 == primop1 && TREE_TYPE (op1) != *restype_ptr)
1400     unsignedp1 = TREE_UNSIGNED (TREE_TYPE (op1));
1401
1402   /* If one of the operands must be floated, we cannot optimize.  */
1403   real1 = TREE_CODE (TREE_TYPE (primop0)) == REAL_TYPE;
1404   real2 = TREE_CODE (TREE_TYPE (primop1)) == REAL_TYPE;
1405
1406   /* If first arg is constant, swap the args (changing operation
1407      so value is preserved), for canonicalization.  */
1408
1409   if (TREE_CONSTANT (primop0))
1410     {
1411       register tree tem = primop0;
1412       register int temi = unsignedp0;
1413       primop0 = primop1;
1414       primop1 = tem;
1415       tem = op0;
1416       op0 = op1;
1417       op1 = tem;
1418       *op0_ptr = op0;
1419       *op1_ptr = op1;
1420       unsignedp0 = unsignedp1;
1421       unsignedp1 = temi;
1422       temi = real1;
1423       real1 = real2;
1424       real2 = temi;
1425
1426       switch (code)
1427         {
1428         case LT_EXPR:
1429           code = GT_EXPR;
1430           break;
1431         case GT_EXPR:
1432           code = LT_EXPR;
1433           break;
1434         case LE_EXPR:
1435           code = GE_EXPR;
1436           break;
1437         case GE_EXPR:
1438           code = LE_EXPR;
1439           break;
1440         }
1441       *rescode_ptr = code;
1442     }
1443
1444   /* If comparing an integer against a constant more bits wide,
1445      maybe we can deduce a value of 1 or 0 independent of the data.
1446      Or else truncate the constant now
1447      rather than extend the variable at run time.
1448
1449      This is only interesting if the constant is the wider arg.
1450      Also, it is not safe if the constant is unsigned and the
1451      variable arg is signed, since in this case the variable
1452      would be sign-extended and then regarded as unsigned.
1453      Our technique fails in this case because the lowest/highest
1454      possible unsigned results don't follow naturally from the
1455      lowest/highest possible values of the variable operand.
1456      For just EQ_EXPR and NE_EXPR there is another technique that
1457      could be used: see if the constant can be faithfully represented
1458      in the other operand's type, by truncating it and reextending it
1459      and see if that preserves the constant's value.  */
1460
1461   if (!real1 && !real2
1462       && TREE_CODE (primop1) == INTEGER_CST
1463       && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr))
1464     {
1465       int min_gt, max_gt, min_lt, max_lt;
1466       tree maxval, minval;
1467       /* 1 if comparison is nominally unsigned.  */
1468       int unsignedp = TREE_UNSIGNED (*restype_ptr);
1469       tree val;
1470
1471       type = signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0));
1472
1473       maxval = TYPE_MAX_VALUE (type);
1474       minval = TYPE_MIN_VALUE (type);
1475
1476       if (unsignedp && !unsignedp0)
1477         *restype_ptr = signed_type (*restype_ptr);
1478
1479       if (TREE_TYPE (primop1) != *restype_ptr)
1480         primop1 = convert (*restype_ptr, primop1);
1481       if (type != *restype_ptr)
1482         {
1483           minval = convert (*restype_ptr, minval);
1484           maxval = convert (*restype_ptr, maxval);
1485         }
1486
1487       if (unsignedp && unsignedp0)
1488         {
1489           min_gt = INT_CST_LT_UNSIGNED (primop1, minval);
1490           max_gt = INT_CST_LT_UNSIGNED (primop1, maxval);
1491           min_lt = INT_CST_LT_UNSIGNED (minval, primop1);
1492           max_lt = INT_CST_LT_UNSIGNED (maxval, primop1);
1493         }
1494       else
1495         {
1496           min_gt = INT_CST_LT (primop1, minval);
1497           max_gt = INT_CST_LT (primop1, maxval);
1498           min_lt = INT_CST_LT (minval, primop1);
1499           max_lt = INT_CST_LT (maxval, primop1);
1500         }
1501
1502       val = 0;
1503       /* This used to be a switch, but Genix compiler can't handle that.  */
1504       if (code == NE_EXPR)
1505         {
1506           if (max_lt || min_gt)
1507             val = integer_one_node;
1508         }
1509       else if (code == EQ_EXPR)
1510         {
1511           if (max_lt || min_gt)
1512             val = integer_zero_node;
1513         }
1514       else if (code == LT_EXPR)
1515         {
1516           if (max_lt)
1517             val = integer_one_node;
1518           if (!min_lt)
1519             val = integer_zero_node;
1520         }
1521       else if (code == GT_EXPR)
1522         {
1523           if (min_gt)
1524             val = integer_one_node;
1525           if (!max_gt)
1526             val = integer_zero_node;
1527         }
1528       else if (code == LE_EXPR)
1529         {
1530           if (!max_gt)
1531             val = integer_one_node;
1532           if (min_gt)
1533             val = integer_zero_node;
1534         }
1535       else if (code == GE_EXPR)
1536         {
1537           if (!min_lt)
1538             val = integer_one_node;
1539           if (max_lt)
1540             val = integer_zero_node;
1541         }
1542
1543       /* If primop0 was sign-extended and unsigned comparison specd,
1544          we did a signed comparison above using the signed type bounds.
1545          But the comparison we output must be unsigned.
1546
1547          Also, for inequalities, VAL is no good; but if the signed
1548          comparison had *any* fixed result, it follows that the
1549          unsigned comparison just tests the sign in reverse
1550          (positive values are LE, negative ones GE).
1551          So we can generate an unsigned comparison
1552          against an extreme value of the signed type.  */
1553
1554       if (unsignedp && !unsignedp0)
1555         {
1556           if (val != 0)
1557             switch (code)
1558               {
1559               case LT_EXPR:
1560               case GE_EXPR:
1561                 primop1 = TYPE_MIN_VALUE (type);
1562                 val = 0;
1563                 break;
1564
1565               case LE_EXPR:
1566               case GT_EXPR:
1567                 primop1 = TYPE_MAX_VALUE (type);
1568                 val = 0;
1569                 break;
1570               }
1571           type = unsigned_type (type);
1572         }
1573
1574       if (!max_gt && !unsignedp0 && TREE_CODE (primop0) != INTEGER_CST)
1575         {
1576           /* This is the case of (char)x >?< 0x80, which people used to use
1577              expecting old C compilers to change the 0x80 into -0x80.  */
1578           if (val == integer_zero_node)
1579             warning ("comparison is always 0 due to limited range of data type");
1580           if (val == integer_one_node)
1581             warning ("comparison is always 1 due to limited range of data type");
1582         }
1583
1584       if (!min_lt && unsignedp0 && TREE_CODE (primop0) != INTEGER_CST)
1585         {
1586           /* This is the case of (unsigned char)x >?< -1 or < 0.  */
1587           if (val == integer_zero_node)
1588             warning ("comparison is always 0 due to limited range of data type");
1589           if (val == integer_one_node)
1590             warning ("comparison is always 1 due to limited range of data type");
1591         }
1592
1593       if (val != 0)
1594         {
1595           /* Don't forget to evaluate PRIMOP0 if it has side effects.  */
1596           if (TREE_SIDE_EFFECTS (primop0))
1597             return build (COMPOUND_EXPR, TREE_TYPE (val), primop0, val);
1598           return val;
1599         }
1600
1601       /* Value is not predetermined, but do the comparison
1602          in the type of the operand that is not constant.
1603          TYPE is already properly set.  */
1604     }
1605   else if (real1 && real2
1606            && (TYPE_PRECISION (TREE_TYPE (primop0))
1607                == TYPE_PRECISION (TREE_TYPE (primop1))))
1608     type = TREE_TYPE (primop0);
1609
1610   /* If args' natural types are both narrower than nominal type
1611      and both extend in the same manner, compare them
1612      in the type of the wider arg.
1613      Otherwise must actually extend both to the nominal
1614      common type lest different ways of extending
1615      alter the result.
1616      (eg, (short)-1 == (unsigned short)-1  should be 0.)  */
1617
1618   else if (unsignedp0 == unsignedp1 && real1 == real2
1619            && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr)
1620            && TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (*restype_ptr))
1621     {
1622       type = common_type (TREE_TYPE (primop0), TREE_TYPE (primop1));
1623       type = signed_or_unsigned_type (unsignedp0
1624                                       || TREE_UNSIGNED (*restype_ptr),
1625                                       type);
1626       /* Make sure shorter operand is extended the right way
1627          to match the longer operand.  */
1628       primop0 = convert (signed_or_unsigned_type (unsignedp0, TREE_TYPE (primop0)),
1629                          primop0);
1630       primop1 = convert (signed_or_unsigned_type (unsignedp1, TREE_TYPE (primop1)),
1631                          primop1);
1632     }
1633   else
1634     {
1635       /* Here we must do the comparison on the nominal type
1636          using the args exactly as we received them.  */
1637       type = *restype_ptr;
1638       primop0 = op0;
1639       primop1 = op1;
1640
1641       if (!real1 && !real2 && integer_zerop (primop1)
1642           && TREE_UNSIGNED (TREE_TYPE (primop0)))
1643         {
1644           tree value = 0;
1645           switch (code)
1646             {
1647             case GE_EXPR:
1648               if (extra_warnings)
1649                 warning ("unsigned value >= 0 is always 1");
1650               value = integer_one_node;
1651               break;
1652
1653             case LT_EXPR:
1654               if (extra_warnings)
1655                 warning ("unsigned value < 0 is always 0");
1656               value = integer_zero_node;
1657             }
1658
1659           if (value != 0)
1660             {
1661               /* Don't forget to evaluate PRIMOP0 if it has side effects.  */
1662               if (TREE_SIDE_EFFECTS (primop0))
1663                 return build (COMPOUND_EXPR, TREE_TYPE (value),
1664                               primop0, value);
1665               return value;
1666             }
1667         }
1668     }
1669
1670   *op0_ptr = convert (type, primop0);
1671   *op1_ptr = convert (type, primop1);
1672
1673   *restype_ptr = integer_type_node;
1674
1675   return 0;
1676 }
1677 \f
1678 /* Prepare expr to be an argument of a TRUTH_NOT_EXPR,
1679    or validate its data type for an `if' or `while' statement or ?..: exp.
1680
1681    This preparation consists of taking the ordinary
1682    representation of an expression expr and producing a valid tree
1683    boolean expression describing whether expr is nonzero.  We could
1684    simply always do build_binary_op (NE_EXPR, expr, integer_zero_node, 1),
1685    but we optimize comparisons, &&, ||, and !.
1686
1687    The resulting type should always be `integer_type_node'.  */
1688
1689 tree
1690 truthvalue_conversion (expr)
1691      tree expr;
1692 {
1693   register enum tree_code code;
1694
1695   if (TREE_CODE (expr) == ERROR_MARK)
1696     return expr;
1697
1698 #if 0 /* This appears to be wrong for C++.  */
1699   /* These really should return error_mark_node after 2.4 is stable.
1700      But not all callers handle ERROR_MARK properly.  */
1701   switch (TREE_CODE (TREE_TYPE (expr)))
1702     {
1703     case RECORD_TYPE:
1704       error ("struct type value used where scalar is required");
1705       return integer_zero_node;
1706
1707     case UNION_TYPE:
1708       error ("union type value used where scalar is required");
1709       return integer_zero_node;
1710
1711     case ARRAY_TYPE:
1712       error ("array type value used where scalar is required");
1713       return integer_zero_node;
1714
1715     default:
1716       break;
1717     }
1718 #endif /* 0 */
1719
1720   switch (TREE_CODE (expr))
1721     {
1722       /* It is simpler and generates better code to have only TRUTH_*_EXPR
1723          or comparison expressions as truth values at this level.  */
1724 #if 0
1725     case COMPONENT_REF:
1726       /* A one-bit unsigned bit-field is already acceptable.  */
1727       if (1 == TREE_INT_CST_LOW (DECL_SIZE (TREE_OPERAND (expr, 1)))
1728           && TREE_UNSIGNED (TREE_OPERAND (expr, 1)))
1729         return expr;
1730       break;
1731 #endif
1732
1733     case EQ_EXPR:
1734       /* It is simpler and generates better code to have only TRUTH_*_EXPR
1735          or comparison expressions as truth values at this level.  */
1736 #if 0
1737       if (integer_zerop (TREE_OPERAND (expr, 1)))
1738         return build_unary_op (TRUTH_NOT_EXPR, TREE_OPERAND (expr, 0), 0);
1739 #endif
1740     case NE_EXPR: case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR:
1741     case TRUTH_ANDIF_EXPR:
1742     case TRUTH_ORIF_EXPR:
1743     case TRUTH_AND_EXPR:
1744     case TRUTH_OR_EXPR:
1745     case TRUTH_XOR_EXPR:
1746     case ERROR_MARK:
1747       return expr;
1748
1749     case INTEGER_CST:
1750       return integer_zerop (expr) ? integer_zero_node : integer_one_node;
1751
1752     case REAL_CST:
1753       return real_zerop (expr) ? integer_zero_node : integer_one_node;
1754
1755     case ADDR_EXPR:
1756       if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 0)))
1757         return build (COMPOUND_EXPR, integer_type_node,
1758                       TREE_OPERAND (expr, 0), integer_one_node);
1759       else
1760         return integer_one_node;
1761
1762     case COMPLEX_EXPR:
1763       return build_binary_op ((TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1))
1764                                ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
1765                               truthvalue_conversion (TREE_OPERAND (expr, 0)),
1766                               truthvalue_conversion (TREE_OPERAND (expr, 1)),
1767                               0);
1768
1769     case NEGATE_EXPR:
1770     case ABS_EXPR:
1771     case FLOAT_EXPR:
1772     case FFS_EXPR:
1773       /* These don't change whether an object is non-zero or zero.  */
1774       return truthvalue_conversion (TREE_OPERAND (expr, 0));
1775
1776     case LROTATE_EXPR:
1777     case RROTATE_EXPR:
1778       /* These don't change whether an object is zero or non-zero, but
1779          we can't ignore them if their second arg has side-effects.  */
1780       if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)))
1781         return build (COMPOUND_EXPR, integer_type_node, TREE_OPERAND (expr, 1),
1782                       truthvalue_conversion (TREE_OPERAND (expr, 0)));
1783       else
1784         return truthvalue_conversion (TREE_OPERAND (expr, 0));
1785       
1786     case COND_EXPR:
1787       /* Distribute the conversion into the arms of a COND_EXPR.  */
1788       return fold (build (COND_EXPR, integer_type_node, TREE_OPERAND (expr, 0),
1789                           truthvalue_conversion (TREE_OPERAND (expr, 1)),
1790                           truthvalue_conversion (TREE_OPERAND (expr, 2))));
1791
1792     case CONVERT_EXPR:
1793       /* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE,
1794          since that affects how `default_conversion' will behave.  */
1795       if (TREE_CODE (TREE_TYPE (expr)) == REFERENCE_TYPE
1796           || TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == REFERENCE_TYPE)
1797         break;
1798       /* fall through... */
1799     case NOP_EXPR:
1800       /* If this is widening the argument, we can ignore it.  */
1801       if (TYPE_PRECISION (TREE_TYPE (expr))
1802           >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (expr, 0))))
1803         return truthvalue_conversion (TREE_OPERAND (expr, 0));
1804       break;
1805
1806     case MINUS_EXPR:
1807       /* With IEEE arithmetic, x - x may not equal 0, so we can't optimize
1808          this case.  */
1809       if (TARGET_FLOAT_FORMAT == IEEE_FLOAT_FORMAT
1810           && TREE_CODE (TREE_TYPE (expr)) == REAL_TYPE)
1811         break;
1812       /* fall through... */
1813     case BIT_XOR_EXPR:
1814       /* This and MINUS_EXPR can be changed into a comparison of the
1815          two objects.  */
1816       if (TREE_TYPE (TREE_OPERAND (expr, 0))
1817           == TREE_TYPE (TREE_OPERAND (expr, 1)))
1818         return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
1819                                 TREE_OPERAND (expr, 1), 1);
1820       return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0),
1821                               fold (build1 (NOP_EXPR,
1822                                             TREE_TYPE (TREE_OPERAND (expr, 0)),
1823                                             TREE_OPERAND (expr, 1))), 1);
1824
1825     case MODIFY_EXPR:
1826       if (warn_parentheses && C_EXP_ORIGINAL_CODE (expr) == MODIFY_EXPR)
1827         warning ("suggest parentheses around assignment used as truth value");
1828       break;
1829     }
1830
1831   if (TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE)
1832     return (build_binary_op
1833             ((TREE_SIDE_EFFECTS (expr)
1834               ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR),
1835              truthvalue_conversion (build_unary_op (REALPART_EXPR, expr, 0)),
1836              truthvalue_conversion (build_unary_op (IMAGPART_EXPR, expr, 0)),
1837              0));
1838
1839   return build_binary_op (NE_EXPR, expr, integer_zero_node, 1);
1840 }
1841 \f
1842 /* Read the rest of a #-directive from input stream FINPUT.
1843    In normal use, the directive name and the white space after it
1844    have already been read, so they won't be included in the result.
1845    We allow for the fact that the directive line may contain
1846    a newline embedded within a character or string literal which forms
1847    a part of the directive.
1848
1849    The value is a string in a reusable buffer.  It remains valid
1850    only until the next time this function is called.  */
1851
1852 char *
1853 get_directive_line (finput)
1854      register FILE *finput;
1855 {
1856   static char *directive_buffer = NULL;
1857   static unsigned buffer_length = 0;
1858   register char *p;
1859   register char *buffer_limit;
1860   register int looking_for = 0;
1861   register int char_escaped = 0;
1862
1863   if (buffer_length == 0)
1864     {
1865       directive_buffer = (char *)xmalloc (128);
1866       buffer_length = 128;
1867     }
1868
1869   buffer_limit = &directive_buffer[buffer_length];
1870
1871   for (p = directive_buffer; ; )
1872     {
1873       int c;
1874
1875       /* Make buffer bigger if it is full.  */
1876       if (p >= buffer_limit)
1877         {
1878           register unsigned bytes_used = (p - directive_buffer);
1879
1880           buffer_length *= 2;
1881           directive_buffer
1882             = (char *)xrealloc (directive_buffer, buffer_length);
1883           p = &directive_buffer[bytes_used];
1884           buffer_limit = &directive_buffer[buffer_length];
1885         }
1886
1887       c = getc (finput);
1888
1889       /* Discard initial whitespace.  */
1890       if ((c == ' ' || c == '\t') && p == directive_buffer)
1891         continue;
1892
1893       /* Detect the end of the directive.  */
1894       if (c == '\n' && looking_for == 0)
1895         {
1896           ungetc (c, finput);
1897           c = '\0';
1898         }
1899
1900       *p++ = c;
1901
1902       if (c == 0)
1903         return directive_buffer;
1904
1905       /* Handle string and character constant syntax.  */
1906       if (looking_for)
1907         {
1908           if (looking_for == c && !char_escaped)
1909             looking_for = 0;    /* Found terminator... stop looking.  */
1910         }
1911       else
1912         if (c == '\'' || c == '"')
1913           looking_for = c;      /* Don't stop buffering until we see another
1914                                    another one of these (or an EOF).  */
1915
1916       /* Handle backslash.  */
1917       char_escaped = (c == '\\' && ! char_escaped);
1918     }
1919 }
1920 \f
1921 /* Make a variant type in the proper way for C/C++, propagating qualifiers
1922    down to the element type of an array.  */
1923
1924 tree
1925 c_build_type_variant (type, constp, volatilep)
1926      tree type;
1927      int constp, volatilep;
1928 {
1929   if (TREE_CODE (type) == ARRAY_TYPE)
1930     {
1931       tree real_main_variant = TYPE_MAIN_VARIANT (type);
1932
1933       push_obstacks (TYPE_OBSTACK (type), TYPE_OBSTACK (type));
1934       type = build_array_type (c_build_type_variant (TREE_TYPE (type),
1935                                                      constp, volatilep),
1936                                TYPE_DOMAIN (type));
1937       TYPE_MAIN_VARIANT (type) = real_main_variant;
1938       pop_obstacks ();
1939     }
1940   return build_type_variant (type, constp, volatilep);
1941 }