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

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

unix.superglobalmegacorp.com

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