Annotation of gcc/c-common.c, revision 1.1.1.5

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.