| 1 | 684 | jeremybenn | /* Process declarations and variables for C compiler.
 | 
      
         | 2 |  |  |    Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
 | 
      
         | 3 |  |  |    2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
 | 
      
         | 4 |  |  |    Free Software Foundation, Inc.
 | 
      
         | 5 |  |  |  
 | 
      
         | 6 |  |  | This file is part of GCC.
 | 
      
         | 7 |  |  |  
 | 
      
         | 8 |  |  | GCC is free software; you can redistribute it and/or modify it under
 | 
      
         | 9 |  |  | the terms of the GNU General Public License as published by the Free
 | 
      
         | 10 |  |  | Software Foundation; either version 3, or (at your option) any later
 | 
      
         | 11 |  |  | version.
 | 
      
         | 12 |  |  |  
 | 
      
         | 13 |  |  | GCC is distributed in the hope that it will be useful, but WITHOUT ANY
 | 
      
         | 14 |  |  | WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | 
      
         | 15 |  |  | FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 | 
      
         | 16 |  |  | for more details.
 | 
      
         | 17 |  |  |  
 | 
      
         | 18 |  |  | You should have received a copy of the GNU General Public License
 | 
      
         | 19 |  |  | along with GCC; see the file COPYING3.  If not see
 | 
      
         | 20 |  |  | <http://www.gnu.org/licenses/>.  */
 | 
      
         | 21 |  |  |  
 | 
      
         | 22 |  |  | /* Process declarations and symbol lookup for C front end.
 | 
      
         | 23 |  |  |    Also constructs types; the standard scalar types at initialization,
 | 
      
         | 24 |  |  |    and structure, union, array and enum types when they are declared.  */
 | 
      
         | 25 |  |  |  
 | 
      
         | 26 |  |  | /* ??? not all decl nodes are given the most useful possible
 | 
      
         | 27 |  |  |    line numbers.  For example, the CONST_DECLs for enum values.  */
 | 
      
         | 28 |  |  |  
 | 
      
         | 29 |  |  | #include "config.h"
 | 
      
         | 30 |  |  | #include "system.h"
 | 
      
         | 31 |  |  | #include "coretypes.h"
 | 
      
         | 32 |  |  | #include "input.h"
 | 
      
         | 33 |  |  | #include "tm.h"
 | 
      
         | 34 |  |  | #include "intl.h"
 | 
      
         | 35 |  |  | #include "tree.h"
 | 
      
         | 36 |  |  | #include "tree-inline.h"
 | 
      
         | 37 |  |  | #include "flags.h"
 | 
      
         | 38 |  |  | #include "function.h"
 | 
      
         | 39 |  |  | #include "output.h"
 | 
      
         | 40 |  |  | #include "c-tree.h"
 | 
      
         | 41 |  |  | #include "toplev.h"
 | 
      
         | 42 |  |  | #include "tm_p.h"
 | 
      
         | 43 |  |  | #include "cpplib.h"
 | 
      
         | 44 |  |  | #include "target.h"
 | 
      
         | 45 |  |  | #include "debug.h"
 | 
      
         | 46 |  |  | #include "opts.h"
 | 
      
         | 47 |  |  | #include "timevar.h"
 | 
      
         | 48 |  |  | #include "c-family/c-common.h"
 | 
      
         | 49 |  |  | #include "c-family/c-objc.h"
 | 
      
         | 50 |  |  | #include "c-family/c-pragma.h"
 | 
      
         | 51 |  |  | #include "c-lang.h"
 | 
      
         | 52 |  |  | #include "langhooks.h"
 | 
      
         | 53 |  |  | #include "tree-iterator.h"
 | 
      
         | 54 |  |  | #include "diagnostic-core.h"
 | 
      
         | 55 |  |  | #include "tree-dump.h"
 | 
      
         | 56 |  |  | #include "cgraph.h"
 | 
      
         | 57 |  |  | #include "hashtab.h"
 | 
      
         | 58 |  |  | #include "langhooks-def.h"
 | 
      
         | 59 |  |  | #include "pointer-set.h"
 | 
      
         | 60 |  |  | #include "plugin.h"
 | 
      
         | 61 |  |  | #include "c-family/c-ada-spec.h"
 | 
      
         | 62 |  |  |  
 | 
      
         | 63 |  |  | /* In grokdeclarator, distinguish syntactic contexts of declarators.  */
 | 
      
         | 64 |  |  | enum decl_context
 | 
      
         | 65 |  |  | { NORMAL,                       /* Ordinary declaration */
 | 
      
         | 66 |  |  |   FUNCDEF,                      /* Function definition */
 | 
      
         | 67 |  |  |   PARM,                         /* Declaration of parm before function body */
 | 
      
         | 68 |  |  |   FIELD,                        /* Declaration inside struct or union */
 | 
      
         | 69 |  |  |   TYPENAME};                    /* Typename (inside cast or sizeof)  */
 | 
      
         | 70 |  |  |  
 | 
      
         | 71 |  |  | /* States indicating how grokdeclarator() should handle declspecs marked
 | 
      
         | 72 |  |  |    with __attribute__((deprecated)).  An object declared as
 | 
      
         | 73 |  |  |    __attribute__((deprecated)) suppresses warnings of uses of other
 | 
      
         | 74 |  |  |    deprecated items.  */
 | 
      
         | 75 |  |  |  
 | 
      
         | 76 |  |  | enum deprecated_states {
 | 
      
         | 77 |  |  |   DEPRECATED_NORMAL,
 | 
      
         | 78 |  |  |   DEPRECATED_SUPPRESS
 | 
      
         | 79 |  |  | };
 | 
      
         | 80 |  |  |  
 | 
      
         | 81 |  |  |  
 | 
      
         | 82 |  |  | /* Nonzero if we have seen an invalid cross reference
 | 
      
         | 83 |  |  |    to a struct, union, or enum, but not yet printed the message.  */
 | 
      
         | 84 |  |  | tree pending_invalid_xref;
 | 
      
         | 85 |  |  |  
 | 
      
         | 86 |  |  | /* File and line to appear in the eventual error message.  */
 | 
      
         | 87 |  |  | location_t pending_invalid_xref_location;
 | 
      
         | 88 |  |  |  
 | 
      
         | 89 |  |  | /* The file and line that the prototype came from if this is an
 | 
      
         | 90 |  |  |    old-style definition; used for diagnostics in
 | 
      
         | 91 |  |  |    store_parm_decls_oldstyle.  */
 | 
      
         | 92 |  |  |  
 | 
      
         | 93 |  |  | static location_t current_function_prototype_locus;
 | 
      
         | 94 |  |  |  
 | 
      
         | 95 |  |  | /* Whether this prototype was built-in.  */
 | 
      
         | 96 |  |  |  
 | 
      
         | 97 |  |  | static bool current_function_prototype_built_in;
 | 
      
         | 98 |  |  |  
 | 
      
         | 99 |  |  | /* The argument type information of this prototype.  */
 | 
      
         | 100 |  |  |  
 | 
      
         | 101 |  |  | static tree current_function_prototype_arg_types;
 | 
      
         | 102 |  |  |  
 | 
      
         | 103 |  |  | /* The argument information structure for the function currently being
 | 
      
         | 104 |  |  |    defined.  */
 | 
      
         | 105 |  |  |  
 | 
      
         | 106 |  |  | static struct c_arg_info *current_function_arg_info;
 | 
      
         | 107 |  |  |  
 | 
      
         | 108 |  |  | /* The obstack on which parser and related data structures, which are
 | 
      
         | 109 |  |  |    not live beyond their top-level declaration or definition, are
 | 
      
         | 110 |  |  |    allocated.  */
 | 
      
         | 111 |  |  | struct obstack parser_obstack;
 | 
      
         | 112 |  |  |  
 | 
      
         | 113 |  |  | /* The current statement tree.  */
 | 
      
         | 114 |  |  |  
 | 
      
         | 115 |  |  | static GTY(()) struct stmt_tree_s c_stmt_tree;
 | 
      
         | 116 |  |  |  
 | 
      
         | 117 |  |  | /* State saving variables.  */
 | 
      
         | 118 |  |  | tree c_break_label;
 | 
      
         | 119 |  |  | tree c_cont_label;
 | 
      
         | 120 |  |  |  
 | 
      
         | 121 |  |  | /* A list of decls to be made automatically visible in each file scope.  */
 | 
      
         | 122 |  |  | static GTY(()) tree visible_builtins;
 | 
      
         | 123 |  |  |  
 | 
      
         | 124 |  |  | /* Set to 0 at beginning of a function definition, set to 1 if
 | 
      
         | 125 |  |  |    a return statement that specifies a return value is seen.  */
 | 
      
         | 126 |  |  |  
 | 
      
         | 127 |  |  | int current_function_returns_value;
 | 
      
         | 128 |  |  |  
 | 
      
         | 129 |  |  | /* Set to 0 at beginning of a function definition, set to 1 if
 | 
      
         | 130 |  |  |    a return statement with no argument is seen.  */
 | 
      
         | 131 |  |  |  
 | 
      
         | 132 |  |  | int current_function_returns_null;
 | 
      
         | 133 |  |  |  
 | 
      
         | 134 |  |  | /* Set to 0 at beginning of a function definition, set to 1 if
 | 
      
         | 135 |  |  |    a call to a noreturn function is seen.  */
 | 
      
         | 136 |  |  |  
 | 
      
         | 137 |  |  | int current_function_returns_abnormally;
 | 
      
         | 138 |  |  |  
 | 
      
         | 139 |  |  | /* Set to nonzero by `grokdeclarator' for a function
 | 
      
         | 140 |  |  |    whose return type is defaulted, if warnings for this are desired.  */
 | 
      
         | 141 |  |  |  
 | 
      
         | 142 |  |  | static int warn_about_return_type;
 | 
      
         | 143 |  |  |  
 | 
      
         | 144 |  |  | /* Nonzero when the current toplevel function contains a declaration
 | 
      
         | 145 |  |  |    of a nested function which is never defined.  */
 | 
      
         | 146 |  |  |  
 | 
      
         | 147 |  |  | static bool undef_nested_function;
 | 
      
         | 148 |  |  |  
 | 
      
         | 149 |  |  |  
 | 
      
         | 150 |  |  | /* Each c_binding structure describes one binding of an identifier to
 | 
      
         | 151 |  |  |    a decl.  All the decls in a scope - irrespective of namespace - are
 | 
      
         | 152 |  |  |    chained together by the ->prev field, which (as the name implies)
 | 
      
         | 153 |  |  |    runs in reverse order.  All the decls in a given namespace bound to
 | 
      
         | 154 |  |  |    a given identifier are chained by the ->shadowed field, which runs
 | 
      
         | 155 |  |  |    from inner to outer scopes.
 | 
      
         | 156 |  |  |  
 | 
      
         | 157 |  |  |    The ->decl field usually points to a DECL node, but there are two
 | 
      
         | 158 |  |  |    exceptions.  In the namespace of type tags, the bound entity is a
 | 
      
         | 159 |  |  |    RECORD_TYPE, UNION_TYPE, or ENUMERAL_TYPE node.  If an undeclared
 | 
      
         | 160 |  |  |    identifier is encountered, it is bound to error_mark_node to
 | 
      
         | 161 |  |  |    suppress further errors about that identifier in the current
 | 
      
         | 162 |  |  |    function.
 | 
      
         | 163 |  |  |  
 | 
      
         | 164 |  |  |    The ->u.type field stores the type of the declaration in this scope;
 | 
      
         | 165 |  |  |    if NULL, the type is the type of the ->decl field.  This is only of
 | 
      
         | 166 |  |  |    relevance for objects with external or internal linkage which may
 | 
      
         | 167 |  |  |    be redeclared in inner scopes, forming composite types that only
 | 
      
         | 168 |  |  |    persist for the duration of those scopes.  In the external scope,
 | 
      
         | 169 |  |  |    this stores the composite of all the types declared for this
 | 
      
         | 170 |  |  |    object, visible or not.  The ->inner_comp field (used only at file
 | 
      
         | 171 |  |  |    scope) stores whether an incomplete array type at file scope was
 | 
      
         | 172 |  |  |    completed at an inner scope to an array size other than 1.
 | 
      
         | 173 |  |  |  
 | 
      
         | 174 |  |  |    The ->u.label field is used for labels.  It points to a structure
 | 
      
         | 175 |  |  |    which stores additional information used for warnings.
 | 
      
         | 176 |  |  |  
 | 
      
         | 177 |  |  |    The depth field is copied from the scope structure that holds this
 | 
      
         | 178 |  |  |    decl.  It is used to preserve the proper ordering of the ->shadowed
 | 
      
         | 179 |  |  |    field (see bind()) and also for a handful of special-case checks.
 | 
      
         | 180 |  |  |    Finally, the invisible bit is true for a decl which should be
 | 
      
         | 181 |  |  |    ignored for purposes of normal name lookup, and the nested bit is
 | 
      
         | 182 |  |  |    true for a decl that's been bound a second time in an inner scope;
 | 
      
         | 183 |  |  |    in all such cases, the binding in the outer scope will have its
 | 
      
         | 184 |  |  |    invisible bit true.  */
 | 
      
         | 185 |  |  |  
 | 
      
         | 186 |  |  | struct GTY((chain_next ("%h.prev"))) c_binding {
 | 
      
         | 187 |  |  |   union GTY(()) {               /* first so GTY desc can use decl */
 | 
      
         | 188 |  |  |     tree GTY((tag ("0"))) type; /* the type in this scope */
 | 
      
         | 189 |  |  |     struct c_label_vars * GTY((tag ("1"))) label; /* for warnings */
 | 
      
         | 190 |  |  |   } GTY((desc ("TREE_CODE (%0.decl) == LABEL_DECL"))) u;
 | 
      
         | 191 |  |  |   tree decl;                    /* the decl bound */
 | 
      
         | 192 |  |  |   tree id;                      /* the identifier it's bound to */
 | 
      
         | 193 |  |  |   struct c_binding *prev;       /* the previous decl in this scope */
 | 
      
         | 194 |  |  |   struct c_binding *shadowed;   /* the innermost decl shadowed by this one */
 | 
      
         | 195 |  |  |   unsigned int depth : 28;      /* depth of this scope */
 | 
      
         | 196 |  |  |   BOOL_BITFIELD invisible : 1;  /* normal lookup should ignore this binding */
 | 
      
         | 197 |  |  |   BOOL_BITFIELD nested : 1;     /* do not set DECL_CONTEXT when popping */
 | 
      
         | 198 |  |  |   BOOL_BITFIELD inner_comp : 1; /* incomplete array completed in inner scope */
 | 
      
         | 199 |  |  |   BOOL_BITFIELD in_struct : 1;  /* currently defined as struct field */
 | 
      
         | 200 |  |  |   location_t locus;             /* location for nested bindings */
 | 
      
         | 201 |  |  | };
 | 
      
         | 202 |  |  | #define B_IN_SCOPE(b1, b2) ((b1)->depth == (b2)->depth)
 | 
      
         | 203 |  |  | #define B_IN_CURRENT_SCOPE(b) ((b)->depth == current_scope->depth)
 | 
      
         | 204 |  |  | #define B_IN_FILE_SCOPE(b) ((b)->depth == 1 /*file_scope->depth*/)
 | 
      
         | 205 |  |  | #define B_IN_EXTERNAL_SCOPE(b) ((b)->depth == 0 /*external_scope->depth*/)
 | 
      
         | 206 |  |  |  
 | 
      
         | 207 |  |  | #define I_SYMBOL_BINDING(node) \
 | 
      
         | 208 |  |  |   (((struct lang_identifier *) IDENTIFIER_NODE_CHECK(node))->symbol_binding)
 | 
      
         | 209 |  |  | #define I_SYMBOL_DECL(node) \
 | 
      
         | 210 |  |  |  (I_SYMBOL_BINDING(node) ? I_SYMBOL_BINDING(node)->decl : 0)
 | 
      
         | 211 |  |  |  
 | 
      
         | 212 |  |  | #define I_TAG_BINDING(node) \
 | 
      
         | 213 |  |  |   (((struct lang_identifier *) IDENTIFIER_NODE_CHECK(node))->tag_binding)
 | 
      
         | 214 |  |  | #define I_TAG_DECL(node) \
 | 
      
         | 215 |  |  |  (I_TAG_BINDING(node) ? I_TAG_BINDING(node)->decl : 0)
 | 
      
         | 216 |  |  |  
 | 
      
         | 217 |  |  | #define I_LABEL_BINDING(node) \
 | 
      
         | 218 |  |  |   (((struct lang_identifier *) IDENTIFIER_NODE_CHECK(node))->label_binding)
 | 
      
         | 219 |  |  | #define I_LABEL_DECL(node) \
 | 
      
         | 220 |  |  |  (I_LABEL_BINDING(node) ? I_LABEL_BINDING(node)->decl : 0)
 | 
      
         | 221 |  |  |  
 | 
      
         | 222 |  |  | /* Each C symbol points to three linked lists of c_binding structures.
 | 
      
         | 223 |  |  |    These describe the values of the identifier in the three different
 | 
      
         | 224 |  |  |    namespaces defined by the language.  */
 | 
      
         | 225 |  |  |  
 | 
      
         | 226 |  |  | struct GTY(()) lang_identifier {
 | 
      
         | 227 |  |  |   struct c_common_identifier common_id;
 | 
      
         | 228 |  |  |   struct c_binding *symbol_binding; /* vars, funcs, constants, typedefs */
 | 
      
         | 229 |  |  |   struct c_binding *tag_binding;    /* struct/union/enum tags */
 | 
      
         | 230 |  |  |   struct c_binding *label_binding;  /* labels */
 | 
      
         | 231 |  |  | };
 | 
      
         | 232 |  |  |  
 | 
      
         | 233 |  |  | /* Validate c-lang.c's assumptions.  */
 | 
      
         | 234 |  |  | extern char C_SIZEOF_STRUCT_LANG_IDENTIFIER_isnt_accurate
 | 
      
         | 235 |  |  | [(sizeof(struct lang_identifier) == C_SIZEOF_STRUCT_LANG_IDENTIFIER) ? 1 : -1];
 | 
      
         | 236 |  |  |  
 | 
      
         | 237 |  |  | /* The resulting tree type.  */
 | 
      
         | 238 |  |  |  
 | 
      
         | 239 |  |  | union GTY((desc ("TREE_CODE (&%h.generic) == IDENTIFIER_NODE"),
 | 
      
         | 240 |  |  |        chain_next ("(union lang_tree_node *) c_tree_chain_next (&%h.generic)"))) lang_tree_node
 | 
      
         | 241 |  |  |  {
 | 
      
         | 242 |  |  |   union tree_node GTY ((tag ("0"),
 | 
      
         | 243 |  |  |                         desc ("tree_node_structure (&%h)")))
 | 
      
         | 244 |  |  |     generic;
 | 
      
         | 245 |  |  |   struct lang_identifier GTY ((tag ("1"))) identifier;
 | 
      
         | 246 |  |  | };
 | 
      
         | 247 |  |  |  
 | 
      
         | 248 |  |  | /* Track bindings and other things that matter for goto warnings.  For
 | 
      
         | 249 |  |  |    efficiency, we do not gather all the decls at the point of
 | 
      
         | 250 |  |  |    definition.  Instead, we point into the bindings structure.  As
 | 
      
         | 251 |  |  |    scopes are popped, we update these structures and gather the decls
 | 
      
         | 252 |  |  |    that matter at that time.  */
 | 
      
         | 253 |  |  |  
 | 
      
         | 254 |  |  | struct GTY(()) c_spot_bindings {
 | 
      
         | 255 |  |  |   /* The currently open scope which holds bindings defined when the
 | 
      
         | 256 |  |  |      label was defined or the goto statement was found.  */
 | 
      
         | 257 |  |  |   struct c_scope *scope;
 | 
      
         | 258 |  |  |   /* The bindings in the scope field which were defined at the point
 | 
      
         | 259 |  |  |      of the label or goto.  This lets us look at older or newer
 | 
      
         | 260 |  |  |      bindings in the scope, as appropriate.  */
 | 
      
         | 261 |  |  |   struct c_binding *bindings_in_scope;
 | 
      
         | 262 |  |  |   /* The number of statement expressions that have started since this
 | 
      
         | 263 |  |  |      label or goto statement was defined.  This is zero if we are at
 | 
      
         | 264 |  |  |      the same statement expression level.  It is positive if we are in
 | 
      
         | 265 |  |  |      a statement expression started since this spot.  It is negative
 | 
      
         | 266 |  |  |      if this spot was in a statement expression and we have left
 | 
      
         | 267 |  |  |      it.  */
 | 
      
         | 268 |  |  |   int stmt_exprs;
 | 
      
         | 269 |  |  |   /* Whether we started in a statement expression but are no longer in
 | 
      
         | 270 |  |  |      it.  This is set to true if stmt_exprs ever goes negative.  */
 | 
      
         | 271 |  |  |   bool left_stmt_expr;
 | 
      
         | 272 |  |  | };
 | 
      
         | 273 |  |  |  
 | 
      
         | 274 |  |  | /* This structure is used to keep track of bindings seen when a goto
 | 
      
         | 275 |  |  |    statement is defined.  This is only used if we see the goto
 | 
      
         | 276 |  |  |    statement before we see the label.  */
 | 
      
         | 277 |  |  |  
 | 
      
         | 278 |  |  | struct GTY(()) c_goto_bindings {
 | 
      
         | 279 |  |  |   /* The location of the goto statement.  */
 | 
      
         | 280 |  |  |   location_t loc;
 | 
      
         | 281 |  |  |   /* The bindings of the goto statement.  */
 | 
      
         | 282 |  |  |   struct c_spot_bindings goto_bindings;
 | 
      
         | 283 |  |  | };
 | 
      
         | 284 |  |  |  
 | 
      
         | 285 |  |  | typedef struct c_goto_bindings *c_goto_bindings_p;
 | 
      
         | 286 |  |  | DEF_VEC_P(c_goto_bindings_p);
 | 
      
         | 287 |  |  | DEF_VEC_ALLOC_P(c_goto_bindings_p,gc);
 | 
      
         | 288 |  |  |  
 | 
      
         | 289 |  |  | /* The additional information we keep track of for a label binding.
 | 
      
         | 290 |  |  |    These fields are updated as scopes are popped.  */
 | 
      
         | 291 |  |  |  
 | 
      
         | 292 |  |  | struct GTY(()) c_label_vars {
 | 
      
         | 293 |  |  |   /* The shadowed c_label_vars, when one label shadows another (which
 | 
      
         | 294 |  |  |      can only happen using a __label__ declaration).  */
 | 
      
         | 295 |  |  |   struct c_label_vars *shadowed;
 | 
      
         | 296 |  |  |   /* The bindings when the label was defined.  */
 | 
      
         | 297 |  |  |   struct c_spot_bindings label_bindings;
 | 
      
         | 298 |  |  |   /* A list of decls that we care about: decls about which we should
 | 
      
         | 299 |  |  |      warn if a goto branches to this label from later in the function.
 | 
      
         | 300 |  |  |      Decls are added to this list as scopes are popped.  We only add
 | 
      
         | 301 |  |  |      the decls that matter.  */
 | 
      
         | 302 |  |  |   VEC(tree,gc) *decls_in_scope;
 | 
      
         | 303 |  |  |   /* A list of goto statements to this label.  This is only used for
 | 
      
         | 304 |  |  |      goto statements seen before the label was defined, so that we can
 | 
      
         | 305 |  |  |      issue appropriate warnings for them.  */
 | 
      
         | 306 |  |  |   VEC(c_goto_bindings_p,gc) *gotos;
 | 
      
         | 307 |  |  | };
 | 
      
         | 308 |  |  |  
 | 
      
         | 309 |  |  | /* Each c_scope structure describes the complete contents of one
 | 
      
         | 310 |  |  |    scope.  Four scopes are distinguished specially: the innermost or
 | 
      
         | 311 |  |  |    current scope, the innermost function scope, the file scope (always
 | 
      
         | 312 |  |  |    the second to outermost) and the outermost or external scope.
 | 
      
         | 313 |  |  |  
 | 
      
         | 314 |  |  |    Most declarations are recorded in the current scope.
 | 
      
         | 315 |  |  |  
 | 
      
         | 316 |  |  |    All normal label declarations are recorded in the innermost
 | 
      
         | 317 |  |  |    function scope, as are bindings of undeclared identifiers to
 | 
      
         | 318 |  |  |    error_mark_node.  (GCC permits nested functions as an extension,
 | 
      
         | 319 |  |  |    hence the 'innermost' qualifier.)  Explicitly declared labels
 | 
      
         | 320 |  |  |    (using the __label__ extension) appear in the current scope.
 | 
      
         | 321 |  |  |  
 | 
      
         | 322 |  |  |    Being in the file scope (current_scope == file_scope) causes
 | 
      
         | 323 |  |  |    special behavior in several places below.  Also, under some
 | 
      
         | 324 |  |  |    conditions the Objective-C front end records declarations in the
 | 
      
         | 325 |  |  |    file scope even though that isn't the current scope.
 | 
      
         | 326 |  |  |  
 | 
      
         | 327 |  |  |    All declarations with external linkage are recorded in the external
 | 
      
         | 328 |  |  |    scope, even if they aren't visible there; this models the fact that
 | 
      
         | 329 |  |  |    such declarations are visible to the entire program, and (with a
 | 
      
         | 330 |  |  |    bit of cleverness, see pushdecl) allows diagnosis of some violations
 | 
      
         | 331 |  |  |    of C99 6.2.2p7 and 6.2.7p2:
 | 
      
         | 332 |  |  |  
 | 
      
         | 333 |  |  |      If, within the same translation unit, the same identifier appears
 | 
      
         | 334 |  |  |      with both internal and external linkage, the behavior is
 | 
      
         | 335 |  |  |      undefined.
 | 
      
         | 336 |  |  |  
 | 
      
         | 337 |  |  |      All declarations that refer to the same object or function shall
 | 
      
         | 338 |  |  |      have compatible type; otherwise, the behavior is undefined.
 | 
      
         | 339 |  |  |  
 | 
      
         | 340 |  |  |    Initially only the built-in declarations, which describe compiler
 | 
      
         | 341 |  |  |    intrinsic functions plus a subset of the standard library, are in
 | 
      
         | 342 |  |  |    this scope.
 | 
      
         | 343 |  |  |  
 | 
      
         | 344 |  |  |    The order of the blocks list matters, and it is frequently appended
 | 
      
         | 345 |  |  |    to.  To avoid having to walk all the way to the end of the list on
 | 
      
         | 346 |  |  |    each insertion, or reverse the list later, we maintain a pointer to
 | 
      
         | 347 |  |  |    the last list entry.  (FIXME: It should be feasible to use a reversed
 | 
      
         | 348 |  |  |    list here.)
 | 
      
         | 349 |  |  |  
 | 
      
         | 350 |  |  |    The bindings list is strictly in reverse order of declarations;
 | 
      
         | 351 |  |  |    pop_scope relies on this.  */
 | 
      
         | 352 |  |  |  
 | 
      
         | 353 |  |  |  
 | 
      
         | 354 |  |  | struct GTY((chain_next ("%h.outer"))) c_scope {
 | 
      
         | 355 |  |  |   /* The scope containing this one.  */
 | 
      
         | 356 |  |  |   struct c_scope *outer;
 | 
      
         | 357 |  |  |  
 | 
      
         | 358 |  |  |   /* The next outermost function scope.  */
 | 
      
         | 359 |  |  |   struct c_scope *outer_function;
 | 
      
         | 360 |  |  |  
 | 
      
         | 361 |  |  |   /* All bindings in this scope.  */
 | 
      
         | 362 |  |  |   struct c_binding *bindings;
 | 
      
         | 363 |  |  |  
 | 
      
         | 364 |  |  |   /* For each scope (except the global one), a chain of BLOCK nodes
 | 
      
         | 365 |  |  |      for all the scopes that were entered and exited one level down.  */
 | 
      
         | 366 |  |  |   tree blocks;
 | 
      
         | 367 |  |  |   tree blocks_last;
 | 
      
         | 368 |  |  |  
 | 
      
         | 369 |  |  |   /* The depth of this scope.  Used to keep the ->shadowed chain of
 | 
      
         | 370 |  |  |      bindings sorted innermost to outermost.  */
 | 
      
         | 371 |  |  |   unsigned int depth : 28;
 | 
      
         | 372 |  |  |  
 | 
      
         | 373 |  |  |   /* True if we are currently filling this scope with parameter
 | 
      
         | 374 |  |  |      declarations.  */
 | 
      
         | 375 |  |  |   BOOL_BITFIELD parm_flag : 1;
 | 
      
         | 376 |  |  |  
 | 
      
         | 377 |  |  |   /* True if we saw [*] in this scope.  Used to give an error messages
 | 
      
         | 378 |  |  |      if these appears in a function definition.  */
 | 
      
         | 379 |  |  |   BOOL_BITFIELD had_vla_unspec : 1;
 | 
      
         | 380 |  |  |  
 | 
      
         | 381 |  |  |   /* True if we already complained about forward parameter decls
 | 
      
         | 382 |  |  |      in this scope.  This prevents double warnings on
 | 
      
         | 383 |  |  |      foo (int a; int b; ...)  */
 | 
      
         | 384 |  |  |   BOOL_BITFIELD warned_forward_parm_decls : 1;
 | 
      
         | 385 |  |  |  
 | 
      
         | 386 |  |  |   /* True if this is the outermost block scope of a function body.
 | 
      
         | 387 |  |  |      This scope contains the parameters, the local variables declared
 | 
      
         | 388 |  |  |      in the outermost block, and all the labels (except those in
 | 
      
         | 389 |  |  |      nested functions, or declared at block scope with __label__).  */
 | 
      
         | 390 |  |  |   BOOL_BITFIELD function_body : 1;
 | 
      
         | 391 |  |  |  
 | 
      
         | 392 |  |  |   /* True means make a BLOCK for this scope no matter what.  */
 | 
      
         | 393 |  |  |   BOOL_BITFIELD keep : 1;
 | 
      
         | 394 |  |  |  
 | 
      
         | 395 |  |  |   /* True means that an unsuffixed float constant is _Decimal64.  */
 | 
      
         | 396 |  |  |   BOOL_BITFIELD float_const_decimal64 : 1;
 | 
      
         | 397 |  |  |  
 | 
      
         | 398 |  |  |   /* True if this scope has any label bindings.  This is used to speed
 | 
      
         | 399 |  |  |      up searching for labels when popping scopes, particularly since
 | 
      
         | 400 |  |  |      labels are normally only found at function scope.  */
 | 
      
         | 401 |  |  |   BOOL_BITFIELD has_label_bindings : 1;
 | 
      
         | 402 |  |  |  
 | 
      
         | 403 |  |  |   /* True if we should issue a warning if a goto statement crosses any
 | 
      
         | 404 |  |  |      of the bindings.  We still need to check the list of bindings to
 | 
      
         | 405 |  |  |      find the specific ones we need to warn about.  This is true if
 | 
      
         | 406 |  |  |      decl_jump_unsafe would return true for any of the bindings.  This
 | 
      
         | 407 |  |  |      is used to avoid looping over all the bindings unnecessarily.  */
 | 
      
         | 408 |  |  |   BOOL_BITFIELD has_jump_unsafe_decl : 1;
 | 
      
         | 409 |  |  | };
 | 
      
         | 410 |  |  |  
 | 
      
         | 411 |  |  | /* The scope currently in effect.  */
 | 
      
         | 412 |  |  |  
 | 
      
         | 413 |  |  | static GTY(()) struct c_scope *current_scope;
 | 
      
         | 414 |  |  |  
 | 
      
         | 415 |  |  | /* The innermost function scope.  Ordinary (not explicitly declared)
 | 
      
         | 416 |  |  |    labels, bindings to error_mark_node, and the lazily-created
 | 
      
         | 417 |  |  |    bindings of __func__ and its friends get this scope.  */
 | 
      
         | 418 |  |  |  
 | 
      
         | 419 |  |  | static GTY(()) struct c_scope *current_function_scope;
 | 
      
         | 420 |  |  |  
 | 
      
         | 421 |  |  | /* The C file scope.  This is reset for each input translation unit.  */
 | 
      
         | 422 |  |  |  
 | 
      
         | 423 |  |  | static GTY(()) struct c_scope *file_scope;
 | 
      
         | 424 |  |  |  
 | 
      
         | 425 |  |  | /* The outermost scope.  This is used for all declarations with
 | 
      
         | 426 |  |  |    external linkage, and only these, hence the name.  */
 | 
      
         | 427 |  |  |  
 | 
      
         | 428 |  |  | static GTY(()) struct c_scope *external_scope;
 | 
      
         | 429 |  |  |  
 | 
      
         | 430 |  |  | /* A chain of c_scope structures awaiting reuse.  */
 | 
      
         | 431 |  |  |  
 | 
      
         | 432 |  |  | static GTY((deletable)) struct c_scope *scope_freelist;
 | 
      
         | 433 |  |  |  
 | 
      
         | 434 |  |  | /* A chain of c_binding structures awaiting reuse.  */
 | 
      
         | 435 |  |  |  
 | 
      
         | 436 |  |  | static GTY((deletable)) struct c_binding *binding_freelist;
 | 
      
         | 437 |  |  |  
 | 
      
         | 438 |  |  | /* Append VAR to LIST in scope SCOPE.  */
 | 
      
         | 439 |  |  | #define SCOPE_LIST_APPEND(scope, list, decl) do {       \
 | 
      
         | 440 |  |  |   struct c_scope *s_ = (scope);                         \
 | 
      
         | 441 |  |  |   tree d_ = (decl);                                     \
 | 
      
         | 442 |  |  |   if (s_->list##_last)                                  \
 | 
      
         | 443 |  |  |     BLOCK_CHAIN (s_->list##_last) = d_;                 \
 | 
      
         | 444 |  |  |   else                                                  \
 | 
      
         | 445 |  |  |     s_->list = d_;                                      \
 | 
      
         | 446 |  |  |   s_->list##_last = d_;                                 \
 | 
      
         | 447 |  |  | } while (0)
 | 
      
         | 448 |  |  |  
 | 
      
         | 449 |  |  | /* Concatenate FROM in scope FSCOPE onto TO in scope TSCOPE.  */
 | 
      
         | 450 |  |  | #define SCOPE_LIST_CONCAT(tscope, to, fscope, from) do {        \
 | 
      
         | 451 |  |  |   struct c_scope *t_ = (tscope);                                \
 | 
      
         | 452 |  |  |   struct c_scope *f_ = (fscope);                                \
 | 
      
         | 453 |  |  |   if (t_->to##_last)                                            \
 | 
      
         | 454 |  |  |     BLOCK_CHAIN (t_->to##_last) = f_->from;                     \
 | 
      
         | 455 |  |  |   else                                                          \
 | 
      
         | 456 |  |  |     t_->to = f_->from;                                          \
 | 
      
         | 457 |  |  |   t_->to##_last = f_->from##_last;                              \
 | 
      
         | 458 |  |  | } while (0)
 | 
      
         | 459 |  |  |  
 | 
      
         | 460 |  |  | /* A c_inline_static structure stores details of a static identifier
 | 
      
         | 461 |  |  |    referenced in a definition of a function that may be an inline
 | 
      
         | 462 |  |  |    definition if no subsequent declaration of that function uses
 | 
      
         | 463 |  |  |    "extern" or does not use "inline".  */
 | 
      
         | 464 |  |  |  
 | 
      
         | 465 |  |  | struct GTY((chain_next ("%h.next"))) c_inline_static {
 | 
      
         | 466 |  |  |   /* The location for a diagnostic.  */
 | 
      
         | 467 |  |  |   location_t location;
 | 
      
         | 468 |  |  |  
 | 
      
         | 469 |  |  |   /* The function that may be an inline definition.  */
 | 
      
         | 470 |  |  |   tree function;
 | 
      
         | 471 |  |  |  
 | 
      
         | 472 |  |  |   /* The object or function referenced.  */
 | 
      
         | 473 |  |  |   tree static_decl;
 | 
      
         | 474 |  |  |  
 | 
      
         | 475 |  |  |   /* What sort of reference this is.  */
 | 
      
         | 476 |  |  |   enum c_inline_static_type type;
 | 
      
         | 477 |  |  |  
 | 
      
         | 478 |  |  |   /* The next such structure or NULL.  */
 | 
      
         | 479 |  |  |   struct c_inline_static *next;
 | 
      
         | 480 |  |  | };
 | 
      
         | 481 |  |  |  
 | 
      
         | 482 |  |  | /* List of static identifiers used or referenced in functions that may
 | 
      
         | 483 |  |  |    be inline definitions.  */
 | 
      
         | 484 |  |  | static GTY(()) struct c_inline_static *c_inline_statics;
 | 
      
         | 485 |  |  |  
 | 
      
         | 486 |  |  | /* True means unconditionally make a BLOCK for the next scope pushed.  */
 | 
      
         | 487 |  |  |  
 | 
      
         | 488 |  |  | static bool keep_next_level_flag;
 | 
      
         | 489 |  |  |  
 | 
      
         | 490 |  |  | /* True means the next call to push_scope will be the outermost scope
 | 
      
         | 491 |  |  |    of a function body, so do not push a new scope, merely cease
 | 
      
         | 492 |  |  |    expecting parameter decls.  */
 | 
      
         | 493 |  |  |  
 | 
      
         | 494 |  |  | static bool next_is_function_body;
 | 
      
         | 495 |  |  |  
 | 
      
         | 496 |  |  | /* A VEC of pointers to c_binding structures.  */
 | 
      
         | 497 |  |  |  
 | 
      
         | 498 |  |  | typedef struct c_binding *c_binding_ptr;
 | 
      
         | 499 |  |  | DEF_VEC_P(c_binding_ptr);
 | 
      
         | 500 |  |  | DEF_VEC_ALLOC_P(c_binding_ptr,heap);
 | 
      
         | 501 |  |  |  
 | 
      
         | 502 |  |  | /* Information that we keep for a struct or union while it is being
 | 
      
         | 503 |  |  |    parsed.  */
 | 
      
         | 504 |  |  |  
 | 
      
         | 505 |  |  | struct c_struct_parse_info
 | 
      
         | 506 |  |  | {
 | 
      
         | 507 |  |  |   /* If warn_cxx_compat, a list of types defined within this
 | 
      
         | 508 |  |  |      struct.  */
 | 
      
         | 509 |  |  |   VEC(tree,heap) *struct_types;
 | 
      
         | 510 |  |  |   /* If warn_cxx_compat, a list of field names which have bindings,
 | 
      
         | 511 |  |  |      and which are defined in this struct, but which are not defined
 | 
      
         | 512 |  |  |      in any enclosing struct.  This is used to clear the in_struct
 | 
      
         | 513 |  |  |      field of the c_bindings structure.  */
 | 
      
         | 514 |  |  |   VEC(c_binding_ptr,heap) *fields;
 | 
      
         | 515 |  |  |   /* If warn_cxx_compat, a list of typedef names used when defining
 | 
      
         | 516 |  |  |      fields in this struct.  */
 | 
      
         | 517 |  |  |   VEC(tree,heap) *typedefs_seen;
 | 
      
         | 518 |  |  | };
 | 
      
         | 519 |  |  |  
 | 
      
         | 520 |  |  | /* Information for the struct or union currently being parsed, or
 | 
      
         | 521 |  |  |    NULL if not parsing a struct or union.  */
 | 
      
         | 522 |  |  | static struct c_struct_parse_info *struct_parse_info;
 | 
      
         | 523 |  |  |  
 | 
      
         | 524 |  |  | /* Forward declarations.  */
 | 
      
         | 525 |  |  | static tree lookup_name_in_scope (tree, struct c_scope *);
 | 
      
         | 526 |  |  | static tree c_make_fname_decl (location_t, tree, int);
 | 
      
         | 527 |  |  | static tree grokdeclarator (const struct c_declarator *,
 | 
      
         | 528 |  |  |                             struct c_declspecs *,
 | 
      
         | 529 |  |  |                             enum decl_context, bool, tree *, tree *, tree *,
 | 
      
         | 530 |  |  |                             bool *, enum deprecated_states);
 | 
      
         | 531 |  |  | static tree grokparms (struct c_arg_info *, bool);
 | 
      
         | 532 |  |  | static void layout_array_type (tree);
 | 
      
         | 533 |  |  |  
 | 
      
         | 534 |  |  | /* T is a statement.  Add it to the statement-tree.  This is the
 | 
      
         | 535 |  |  |    C/ObjC version--C++ has a slightly different version of this
 | 
      
         | 536 |  |  |    function.  */
 | 
      
         | 537 |  |  |  
 | 
      
         | 538 |  |  | tree
 | 
      
         | 539 |  |  | add_stmt (tree t)
 | 
      
         | 540 |  |  | {
 | 
      
         | 541 |  |  |   enum tree_code code = TREE_CODE (t);
 | 
      
         | 542 |  |  |  
 | 
      
         | 543 |  |  |   if (CAN_HAVE_LOCATION_P (t) && code != LABEL_EXPR)
 | 
      
         | 544 |  |  |     {
 | 
      
         | 545 |  |  |       if (!EXPR_HAS_LOCATION (t))
 | 
      
         | 546 |  |  |         SET_EXPR_LOCATION (t, input_location);
 | 
      
         | 547 |  |  |     }
 | 
      
         | 548 |  |  |  
 | 
      
         | 549 |  |  |   if (code == LABEL_EXPR || code == CASE_LABEL_EXPR)
 | 
      
         | 550 |  |  |     STATEMENT_LIST_HAS_LABEL (cur_stmt_list) = 1;
 | 
      
         | 551 |  |  |  
 | 
      
         | 552 |  |  |   /* Add T to the statement-tree.  Non-side-effect statements need to be
 | 
      
         | 553 |  |  |      recorded during statement expressions.  */
 | 
      
         | 554 |  |  |   if (!building_stmt_list_p ())
 | 
      
         | 555 |  |  |     push_stmt_list ();
 | 
      
         | 556 |  |  |   append_to_statement_list_force (t, &cur_stmt_list);
 | 
      
         | 557 |  |  |  
 | 
      
         | 558 |  |  |   return t;
 | 
      
         | 559 |  |  | }
 | 
      
         | 560 |  |  |  
 | 
      
         | 561 |  |  | /* Return true if we will want to say something if a goto statement
 | 
      
         | 562 |  |  |    crosses DECL.  */
 | 
      
         | 563 |  |  |  
 | 
      
         | 564 |  |  | static bool
 | 
      
         | 565 |  |  | decl_jump_unsafe (tree decl)
 | 
      
         | 566 |  |  | {
 | 
      
         | 567 |  |  |   if (error_operand_p (decl))
 | 
      
         | 568 |  |  |     return false;
 | 
      
         | 569 |  |  |  
 | 
      
         | 570 |  |  |   /* Always warn about crossing variably modified types.  */
 | 
      
         | 571 |  |  |   if ((TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == TYPE_DECL)
 | 
      
         | 572 |  |  |       && variably_modified_type_p (TREE_TYPE (decl), NULL_TREE))
 | 
      
         | 573 |  |  |     return true;
 | 
      
         | 574 |  |  |  
 | 
      
         | 575 |  |  |   /* Otherwise, only warn if -Wgoto-misses-init and this is an
 | 
      
         | 576 |  |  |      initialized automatic decl.  */
 | 
      
         | 577 |  |  |   if (warn_jump_misses_init
 | 
      
         | 578 |  |  |       && TREE_CODE (decl) == VAR_DECL
 | 
      
         | 579 |  |  |       && !TREE_STATIC (decl)
 | 
      
         | 580 |  |  |       && DECL_INITIAL (decl) != NULL_TREE)
 | 
      
         | 581 |  |  |     return true;
 | 
      
         | 582 |  |  |  
 | 
      
         | 583 |  |  |   return false;
 | 
      
         | 584 |  |  | }
 | 
      
         | 585 |  |  |  
 | 
      
         | 586 |  |  |  
 | 
      
         | 587 |  |  | void
 | 
      
         | 588 |  |  | c_print_identifier (FILE *file, tree node, int indent)
 | 
      
         | 589 |  |  | {
 | 
      
         | 590 |  |  |   print_node (file, "symbol", I_SYMBOL_DECL (node), indent + 4);
 | 
      
         | 591 |  |  |   print_node (file, "tag", I_TAG_DECL (node), indent + 4);
 | 
      
         | 592 |  |  |   print_node (file, "label", I_LABEL_DECL (node), indent + 4);
 | 
      
         | 593 |  |  |   if (C_IS_RESERVED_WORD (node) && C_RID_CODE (node) != RID_CXX_COMPAT_WARN)
 | 
      
         | 594 |  |  |     {
 | 
      
         | 595 |  |  |       tree rid = ridpointers[C_RID_CODE (node)];
 | 
      
         | 596 |  |  |       indent_to (file, indent + 4);
 | 
      
         | 597 |  |  |       fprintf (file, "rid " HOST_PTR_PRINTF " \"%s\"",
 | 
      
         | 598 |  |  |                (void *) rid, IDENTIFIER_POINTER (rid));
 | 
      
         | 599 |  |  |     }
 | 
      
         | 600 |  |  | }
 | 
      
         | 601 |  |  |  
 | 
      
         | 602 |  |  | /* Establish a binding between NAME, an IDENTIFIER_NODE, and DECL,
 | 
      
         | 603 |  |  |    which may be any of several kinds of DECL or TYPE or error_mark_node,
 | 
      
         | 604 |  |  |    in the scope SCOPE.  */
 | 
      
         | 605 |  |  | static void
 | 
      
         | 606 |  |  | bind (tree name, tree decl, struct c_scope *scope, bool invisible,
 | 
      
         | 607 |  |  |       bool nested, location_t locus)
 | 
      
         | 608 |  |  | {
 | 
      
         | 609 |  |  |   struct c_binding *b, **here;
 | 
      
         | 610 |  |  |  
 | 
      
         | 611 |  |  |   if (binding_freelist)
 | 
      
         | 612 |  |  |     {
 | 
      
         | 613 |  |  |       b = binding_freelist;
 | 
      
         | 614 |  |  |       binding_freelist = b->prev;
 | 
      
         | 615 |  |  |     }
 | 
      
         | 616 |  |  |   else
 | 
      
         | 617 |  |  |     b = ggc_alloc_c_binding ();
 | 
      
         | 618 |  |  |  
 | 
      
         | 619 |  |  |   b->shadowed = 0;
 | 
      
         | 620 |  |  |   b->decl = decl;
 | 
      
         | 621 |  |  |   b->id = name;
 | 
      
         | 622 |  |  |   b->depth = scope->depth;
 | 
      
         | 623 |  |  |   b->invisible = invisible;
 | 
      
         | 624 |  |  |   b->nested = nested;
 | 
      
         | 625 |  |  |   b->inner_comp = 0;
 | 
      
         | 626 |  |  |   b->in_struct = 0;
 | 
      
         | 627 |  |  |   b->locus = locus;
 | 
      
         | 628 |  |  |  
 | 
      
         | 629 |  |  |   b->u.type = NULL;
 | 
      
         | 630 |  |  |  
 | 
      
         | 631 |  |  |   b->prev = scope->bindings;
 | 
      
         | 632 |  |  |   scope->bindings = b;
 | 
      
         | 633 |  |  |  
 | 
      
         | 634 |  |  |   if (decl_jump_unsafe (decl))
 | 
      
         | 635 |  |  |     scope->has_jump_unsafe_decl = 1;
 | 
      
         | 636 |  |  |  
 | 
      
         | 637 |  |  |   if (!name)
 | 
      
         | 638 |  |  |     return;
 | 
      
         | 639 |  |  |  
 | 
      
         | 640 |  |  |   switch (TREE_CODE (decl))
 | 
      
         | 641 |  |  |     {
 | 
      
         | 642 |  |  |     case LABEL_DECL:     here = &I_LABEL_BINDING (name);   break;
 | 
      
         | 643 |  |  |     case ENUMERAL_TYPE:
 | 
      
         | 644 |  |  |     case UNION_TYPE:
 | 
      
         | 645 |  |  |     case RECORD_TYPE:    here = &I_TAG_BINDING (name);     break;
 | 
      
         | 646 |  |  |     case VAR_DECL:
 | 
      
         | 647 |  |  |     case FUNCTION_DECL:
 | 
      
         | 648 |  |  |     case TYPE_DECL:
 | 
      
         | 649 |  |  |     case CONST_DECL:
 | 
      
         | 650 |  |  |     case PARM_DECL:
 | 
      
         | 651 |  |  |     case ERROR_MARK:     here = &I_SYMBOL_BINDING (name);  break;
 | 
      
         | 652 |  |  |  
 | 
      
         | 653 |  |  |     default:
 | 
      
         | 654 |  |  |       gcc_unreachable ();
 | 
      
         | 655 |  |  |     }
 | 
      
         | 656 |  |  |  
 | 
      
         | 657 |  |  |   /* Locate the appropriate place in the chain of shadowed decls
 | 
      
         | 658 |  |  |      to insert this binding.  Normally, scope == current_scope and
 | 
      
         | 659 |  |  |      this does nothing.  */
 | 
      
         | 660 |  |  |   while (*here && (*here)->depth > scope->depth)
 | 
      
         | 661 |  |  |     here = &(*here)->shadowed;
 | 
      
         | 662 |  |  |  
 | 
      
         | 663 |  |  |   b->shadowed = *here;
 | 
      
         | 664 |  |  |   *here = b;
 | 
      
         | 665 |  |  | }
 | 
      
         | 666 |  |  |  
 | 
      
         | 667 |  |  | /* Clear the binding structure B, stick it on the binding_freelist,
 | 
      
         | 668 |  |  |    and return the former value of b->prev.  This is used by pop_scope
 | 
      
         | 669 |  |  |    and get_parm_info to iterate destructively over all the bindings
 | 
      
         | 670 |  |  |    from a given scope.  */
 | 
      
         | 671 |  |  | static struct c_binding *
 | 
      
         | 672 |  |  | free_binding_and_advance (struct c_binding *b)
 | 
      
         | 673 |  |  | {
 | 
      
         | 674 |  |  |   struct c_binding *prev = b->prev;
 | 
      
         | 675 |  |  |  
 | 
      
         | 676 |  |  |   memset (b, 0, sizeof (struct c_binding));
 | 
      
         | 677 |  |  |   b->prev = binding_freelist;
 | 
      
         | 678 |  |  |   binding_freelist = b;
 | 
      
         | 679 |  |  |  
 | 
      
         | 680 |  |  |   return prev;
 | 
      
         | 681 |  |  | }
 | 
      
         | 682 |  |  |  
 | 
      
         | 683 |  |  | /* Bind a label.  Like bind, but skip fields which aren't used for
 | 
      
         | 684 |  |  |    labels, and add the LABEL_VARS value.  */
 | 
      
         | 685 |  |  | static void
 | 
      
         | 686 |  |  | bind_label (tree name, tree label, struct c_scope *scope,
 | 
      
         | 687 |  |  |             struct c_label_vars *label_vars)
 | 
      
         | 688 |  |  | {
 | 
      
         | 689 |  |  |   struct c_binding *b;
 | 
      
         | 690 |  |  |  
 | 
      
         | 691 |  |  |   bind (name, label, scope, /*invisible=*/false, /*nested=*/false,
 | 
      
         | 692 |  |  |         UNKNOWN_LOCATION);
 | 
      
         | 693 |  |  |  
 | 
      
         | 694 |  |  |   scope->has_label_bindings = true;
 | 
      
         | 695 |  |  |  
 | 
      
         | 696 |  |  |   b = scope->bindings;
 | 
      
         | 697 |  |  |   gcc_assert (b->decl == label);
 | 
      
         | 698 |  |  |   label_vars->shadowed = b->u.label;
 | 
      
         | 699 |  |  |   b->u.label = label_vars;
 | 
      
         | 700 |  |  | }
 | 
      
         | 701 |  |  |  
 | 
      
         | 702 |  |  | /* Hook called at end of compilation to assume 1 elt
 | 
      
         | 703 |  |  |    for a file-scope tentative array defn that wasn't complete before.  */
 | 
      
         | 704 |  |  |  
 | 
      
         | 705 |  |  | void
 | 
      
         | 706 |  |  | c_finish_incomplete_decl (tree decl)
 | 
      
         | 707 |  |  | {
 | 
      
         | 708 |  |  |   if (TREE_CODE (decl) == VAR_DECL)
 | 
      
         | 709 |  |  |     {
 | 
      
         | 710 |  |  |       tree type = TREE_TYPE (decl);
 | 
      
         | 711 |  |  |       if (type != error_mark_node
 | 
      
         | 712 |  |  |           && TREE_CODE (type) == ARRAY_TYPE
 | 
      
         | 713 |  |  |           && !DECL_EXTERNAL (decl)
 | 
      
         | 714 |  |  |           && TYPE_DOMAIN (type) == 0)
 | 
      
         | 715 |  |  |         {
 | 
      
         | 716 |  |  |           warning_at (DECL_SOURCE_LOCATION (decl),
 | 
      
         | 717 |  |  |                       0, "array %q+D assumed to have one element", decl);
 | 
      
         | 718 |  |  |  
 | 
      
         | 719 |  |  |           complete_array_type (&TREE_TYPE (decl), NULL_TREE, true);
 | 
      
         | 720 |  |  |  
 | 
      
         | 721 |  |  |           relayout_decl (decl);
 | 
      
         | 722 |  |  |         }
 | 
      
         | 723 |  |  |     }
 | 
      
         | 724 |  |  | }
 | 
      
         | 725 |  |  |  
 | 
      
         | 726 |  |  | /* Record that inline function FUNC contains a reference (location
 | 
      
         | 727 |  |  |    LOC) to static DECL (file-scope or function-local according to
 | 
      
         | 728 |  |  |    TYPE).  */
 | 
      
         | 729 |  |  |  
 | 
      
         | 730 |  |  | void
 | 
      
         | 731 |  |  | record_inline_static (location_t loc, tree func, tree decl,
 | 
      
         | 732 |  |  |                       enum c_inline_static_type type)
 | 
      
         | 733 |  |  | {
 | 
      
         | 734 |  |  |   struct c_inline_static *csi = ggc_alloc_c_inline_static ();
 | 
      
         | 735 |  |  |   csi->location = loc;
 | 
      
         | 736 |  |  |   csi->function = func;
 | 
      
         | 737 |  |  |   csi->static_decl = decl;
 | 
      
         | 738 |  |  |   csi->type = type;
 | 
      
         | 739 |  |  |   csi->next = c_inline_statics;
 | 
      
         | 740 |  |  |   c_inline_statics = csi;
 | 
      
         | 741 |  |  | }
 | 
      
         | 742 |  |  |  
 | 
      
         | 743 |  |  | /* Check for references to static declarations in inline functions at
 | 
      
         | 744 |  |  |    the end of the translation unit and diagnose them if the functions
 | 
      
         | 745 |  |  |    are still inline definitions.  */
 | 
      
         | 746 |  |  |  
 | 
      
         | 747 |  |  | static void
 | 
      
         | 748 |  |  | check_inline_statics (void)
 | 
      
         | 749 |  |  | {
 | 
      
         | 750 |  |  |   struct c_inline_static *csi;
 | 
      
         | 751 |  |  |   for (csi = c_inline_statics; csi; csi = csi->next)
 | 
      
         | 752 |  |  |     {
 | 
      
         | 753 |  |  |       if (DECL_EXTERNAL (csi->function))
 | 
      
         | 754 |  |  |         switch (csi->type)
 | 
      
         | 755 |  |  |           {
 | 
      
         | 756 |  |  |           case csi_internal:
 | 
      
         | 757 |  |  |             pedwarn (csi->location, 0,
 | 
      
         | 758 |  |  |                      "%qD is static but used in inline function %qD "
 | 
      
         | 759 |  |  |                      "which is not static", csi->static_decl, csi->function);
 | 
      
         | 760 |  |  |             break;
 | 
      
         | 761 |  |  |           case csi_modifiable:
 | 
      
         | 762 |  |  |             pedwarn (csi->location, 0,
 | 
      
         | 763 |  |  |                      "%q+D is static but declared in inline function %qD "
 | 
      
         | 764 |  |  |                      "which is not static", csi->static_decl, csi->function);
 | 
      
         | 765 |  |  |             break;
 | 
      
         | 766 |  |  |           default:
 | 
      
         | 767 |  |  |             gcc_unreachable ();
 | 
      
         | 768 |  |  |           }
 | 
      
         | 769 |  |  |     }
 | 
      
         | 770 |  |  |   c_inline_statics = NULL;
 | 
      
         | 771 |  |  | }
 | 
      
         | 772 |  |  |  
 | 
      
         | 773 |  |  | /* Fill in a c_spot_bindings structure.  If DEFINING is true, set it
 | 
      
         | 774 |  |  |    for the current state, otherwise set it to uninitialized.  */
 | 
      
         | 775 |  |  |  
 | 
      
         | 776 |  |  | static void
 | 
      
         | 777 |  |  | set_spot_bindings (struct c_spot_bindings *p, bool defining)
 | 
      
         | 778 |  |  | {
 | 
      
         | 779 |  |  |   if (defining)
 | 
      
         | 780 |  |  |     {
 | 
      
         | 781 |  |  |       p->scope = current_scope;
 | 
      
         | 782 |  |  |       p->bindings_in_scope = current_scope->bindings;
 | 
      
         | 783 |  |  |     }
 | 
      
         | 784 |  |  |   else
 | 
      
         | 785 |  |  |     {
 | 
      
         | 786 |  |  |       p->scope = NULL;
 | 
      
         | 787 |  |  |       p->bindings_in_scope = NULL;
 | 
      
         | 788 |  |  |     }
 | 
      
         | 789 |  |  |   p->stmt_exprs = 0;
 | 
      
         | 790 |  |  |   p->left_stmt_expr = false;
 | 
      
         | 791 |  |  | }
 | 
      
         | 792 |  |  |  
 | 
      
         | 793 |  |  | /* Update spot bindings P as we pop out of SCOPE.  Return true if we
 | 
      
         | 794 |  |  |    should push decls for a label.  */
 | 
      
         | 795 |  |  |  
 | 
      
         | 796 |  |  | static bool
 | 
      
         | 797 |  |  | update_spot_bindings (struct c_scope *scope, struct c_spot_bindings *p)
 | 
      
         | 798 |  |  | {
 | 
      
         | 799 |  |  |   if (p->scope != scope)
 | 
      
         | 800 |  |  |     {
 | 
      
         | 801 |  |  |       /* This label or goto is defined in some other scope, or it is a
 | 
      
         | 802 |  |  |          label which is not yet defined.  There is nothing to
 | 
      
         | 803 |  |  |          update.  */
 | 
      
         | 804 |  |  |       return false;
 | 
      
         | 805 |  |  |     }
 | 
      
         | 806 |  |  |  
 | 
      
         | 807 |  |  |   /* Adjust the spot bindings to refer to the bindings already defined
 | 
      
         | 808 |  |  |      in the enclosing scope.  */
 | 
      
         | 809 |  |  |   p->scope = scope->outer;
 | 
      
         | 810 |  |  |   p->bindings_in_scope = p->scope->bindings;
 | 
      
         | 811 |  |  |  
 | 
      
         | 812 |  |  |   return true;
 | 
      
         | 813 |  |  | }
 | 
      
         | 814 |  |  |  
 | 
      
         | 815 |  |  | /* The Objective-C front-end often needs to determine the current scope.  */
 | 
      
         | 816 |  |  |  
 | 
      
         | 817 |  |  | void *
 | 
      
         | 818 |  |  | objc_get_current_scope (void)
 | 
      
         | 819 |  |  | {
 | 
      
         | 820 |  |  |   return current_scope;
 | 
      
         | 821 |  |  | }
 | 
      
         | 822 |  |  |  
 | 
      
         | 823 |  |  | /* The following function is used only by Objective-C.  It needs to live here
 | 
      
         | 824 |  |  |    because it accesses the innards of c_scope.  */
 | 
      
         | 825 |  |  |  
 | 
      
         | 826 |  |  | void
 | 
      
         | 827 |  |  | objc_mark_locals_volatile (void *enclosing_blk)
 | 
      
         | 828 |  |  | {
 | 
      
         | 829 |  |  |   struct c_scope *scope;
 | 
      
         | 830 |  |  |   struct c_binding *b;
 | 
      
         | 831 |  |  |  
 | 
      
         | 832 |  |  |   for (scope = current_scope;
 | 
      
         | 833 |  |  |        scope && scope != enclosing_blk;
 | 
      
         | 834 |  |  |        scope = scope->outer)
 | 
      
         | 835 |  |  |     {
 | 
      
         | 836 |  |  |       for (b = scope->bindings; b; b = b->prev)
 | 
      
         | 837 |  |  |         objc_volatilize_decl (b->decl);
 | 
      
         | 838 |  |  |  
 | 
      
         | 839 |  |  |       /* Do not climb up past the current function.  */
 | 
      
         | 840 |  |  |       if (scope->function_body)
 | 
      
         | 841 |  |  |         break;
 | 
      
         | 842 |  |  |     }
 | 
      
         | 843 |  |  | }
 | 
      
         | 844 |  |  |  
 | 
      
         | 845 |  |  | /* Return true if we are in the global binding level.  */
 | 
      
         | 846 |  |  |  
 | 
      
         | 847 |  |  | bool
 | 
      
         | 848 |  |  | global_bindings_p (void)
 | 
      
         | 849 |  |  | {
 | 
      
         | 850 |  |  |   return current_scope == file_scope;
 | 
      
         | 851 |  |  | }
 | 
      
         | 852 |  |  |  
 | 
      
         | 853 |  |  | void
 | 
      
         | 854 |  |  | keep_next_level (void)
 | 
      
         | 855 |  |  | {
 | 
      
         | 856 |  |  |   keep_next_level_flag = true;
 | 
      
         | 857 |  |  | }
 | 
      
         | 858 |  |  |  
 | 
      
         | 859 |  |  | /* Set the flag for the FLOAT_CONST_DECIMAL64 pragma being ON.  */
 | 
      
         | 860 |  |  |  
 | 
      
         | 861 |  |  | void
 | 
      
         | 862 |  |  | set_float_const_decimal64 (void)
 | 
      
         | 863 |  |  | {
 | 
      
         | 864 |  |  |   current_scope->float_const_decimal64 = true;
 | 
      
         | 865 |  |  | }
 | 
      
         | 866 |  |  |  
 | 
      
         | 867 |  |  | /* Clear the flag for the FLOAT_CONST_DECIMAL64 pragma.  */
 | 
      
         | 868 |  |  |  
 | 
      
         | 869 |  |  | void
 | 
      
         | 870 |  |  | clear_float_const_decimal64 (void)
 | 
      
         | 871 |  |  | {
 | 
      
         | 872 |  |  |   current_scope->float_const_decimal64 = false;
 | 
      
         | 873 |  |  | }
 | 
      
         | 874 |  |  |  
 | 
      
         | 875 |  |  | /* Return nonzero if an unsuffixed float constant is _Decimal64.  */
 | 
      
         | 876 |  |  |  
 | 
      
         | 877 |  |  | bool
 | 
      
         | 878 |  |  | float_const_decimal64_p (void)
 | 
      
         | 879 |  |  | {
 | 
      
         | 880 |  |  |   return current_scope->float_const_decimal64;
 | 
      
         | 881 |  |  | }
 | 
      
         | 882 |  |  |  
 | 
      
         | 883 |  |  | /* Identify this scope as currently being filled with parameters.  */
 | 
      
         | 884 |  |  |  
 | 
      
         | 885 |  |  | void
 | 
      
         | 886 |  |  | declare_parm_level (void)
 | 
      
         | 887 |  |  | {
 | 
      
         | 888 |  |  |   current_scope->parm_flag = true;
 | 
      
         | 889 |  |  | }
 | 
      
         | 890 |  |  |  
 | 
      
         | 891 |  |  | void
 | 
      
         | 892 |  |  | push_scope (void)
 | 
      
         | 893 |  |  | {
 | 
      
         | 894 |  |  |   if (next_is_function_body)
 | 
      
         | 895 |  |  |     {
 | 
      
         | 896 |  |  |       /* This is the transition from the parameters to the top level
 | 
      
         | 897 |  |  |          of the function body.  These are the same scope
 | 
      
         | 898 |  |  |          (C99 6.2.1p4,6) so we do not push another scope structure.
 | 
      
         | 899 |  |  |          next_is_function_body is set only by store_parm_decls, which
 | 
      
         | 900 |  |  |          in turn is called when and only when we are about to
 | 
      
         | 901 |  |  |          encounter the opening curly brace for the function body.
 | 
      
         | 902 |  |  |  
 | 
      
         | 903 |  |  |          The outermost block of a function always gets a BLOCK node,
 | 
      
         | 904 |  |  |          because the debugging output routines expect that each
 | 
      
         | 905 |  |  |          function has at least one BLOCK.  */
 | 
      
         | 906 |  |  |       current_scope->parm_flag         = false;
 | 
      
         | 907 |  |  |       current_scope->function_body     = true;
 | 
      
         | 908 |  |  |       current_scope->keep              = true;
 | 
      
         | 909 |  |  |       current_scope->outer_function    = current_function_scope;
 | 
      
         | 910 |  |  |       current_function_scope           = current_scope;
 | 
      
         | 911 |  |  |  
 | 
      
         | 912 |  |  |       keep_next_level_flag = false;
 | 
      
         | 913 |  |  |       next_is_function_body = false;
 | 
      
         | 914 |  |  |  
 | 
      
         | 915 |  |  |       /* The FLOAT_CONST_DECIMAL64 pragma applies to nested scopes.  */
 | 
      
         | 916 |  |  |       if (current_scope->outer)
 | 
      
         | 917 |  |  |         current_scope->float_const_decimal64
 | 
      
         | 918 |  |  |           = current_scope->outer->float_const_decimal64;
 | 
      
         | 919 |  |  |       else
 | 
      
         | 920 |  |  |         current_scope->float_const_decimal64 = false;
 | 
      
         | 921 |  |  |     }
 | 
      
         | 922 |  |  |   else
 | 
      
         | 923 |  |  |     {
 | 
      
         | 924 |  |  |       struct c_scope *scope;
 | 
      
         | 925 |  |  |       if (scope_freelist)
 | 
      
         | 926 |  |  |         {
 | 
      
         | 927 |  |  |           scope = scope_freelist;
 | 
      
         | 928 |  |  |           scope_freelist = scope->outer;
 | 
      
         | 929 |  |  |         }
 | 
      
         | 930 |  |  |       else
 | 
      
         | 931 |  |  |         scope = ggc_alloc_cleared_c_scope ();
 | 
      
         | 932 |  |  |  
 | 
      
         | 933 |  |  |       /* The FLOAT_CONST_DECIMAL64 pragma applies to nested scopes.  */
 | 
      
         | 934 |  |  |       if (current_scope)
 | 
      
         | 935 |  |  |         scope->float_const_decimal64 = current_scope->float_const_decimal64;
 | 
      
         | 936 |  |  |       else
 | 
      
         | 937 |  |  |         scope->float_const_decimal64 = false;
 | 
      
         | 938 |  |  |  
 | 
      
         | 939 |  |  |       scope->keep          = keep_next_level_flag;
 | 
      
         | 940 |  |  |       scope->outer         = current_scope;
 | 
      
         | 941 |  |  |       scope->depth         = current_scope ? (current_scope->depth + 1) : 0;
 | 
      
         | 942 |  |  |  
 | 
      
         | 943 |  |  |       /* Check for scope depth overflow.  Unlikely (2^28 == 268,435,456) but
 | 
      
         | 944 |  |  |          possible.  */
 | 
      
         | 945 |  |  |       if (current_scope && scope->depth == 0)
 | 
      
         | 946 |  |  |         {
 | 
      
         | 947 |  |  |           scope->depth--;
 | 
      
         | 948 |  |  |           sorry ("GCC supports only %u nested scopes", scope->depth);
 | 
      
         | 949 |  |  |         }
 | 
      
         | 950 |  |  |  
 | 
      
         | 951 |  |  |       current_scope        = scope;
 | 
      
         | 952 |  |  |       keep_next_level_flag = false;
 | 
      
         | 953 |  |  |     }
 | 
      
         | 954 |  |  | }
 | 
      
         | 955 |  |  |  
 | 
      
         | 956 |  |  | /* This is called when we are leaving SCOPE.  For each label defined
 | 
      
         | 957 |  |  |    in SCOPE, add any appropriate decls to its decls_in_scope fields.
 | 
      
         | 958 |  |  |    These are the decls whose initialization will be skipped by a goto
 | 
      
         | 959 |  |  |    later in the function.  */
 | 
      
         | 960 |  |  |  
 | 
      
         | 961 |  |  | static void
 | 
      
         | 962 |  |  | update_label_decls (struct c_scope *scope)
 | 
      
         | 963 |  |  | {
 | 
      
         | 964 |  |  |   struct c_scope *s;
 | 
      
         | 965 |  |  |  
 | 
      
         | 966 |  |  |   s = scope;
 | 
      
         | 967 |  |  |   while (s != NULL)
 | 
      
         | 968 |  |  |     {
 | 
      
         | 969 |  |  |       if (s->has_label_bindings)
 | 
      
         | 970 |  |  |         {
 | 
      
         | 971 |  |  |           struct c_binding *b;
 | 
      
         | 972 |  |  |  
 | 
      
         | 973 |  |  |           for (b = s->bindings; b != NULL; b = b->prev)
 | 
      
         | 974 |  |  |             {
 | 
      
         | 975 |  |  |               struct c_label_vars *label_vars;
 | 
      
         | 976 |  |  |               struct c_binding *b1;
 | 
      
         | 977 |  |  |               bool hjud;
 | 
      
         | 978 |  |  |               unsigned int ix;
 | 
      
         | 979 |  |  |               struct c_goto_bindings *g;
 | 
      
         | 980 |  |  |  
 | 
      
         | 981 |  |  |               if (TREE_CODE (b->decl) != LABEL_DECL)
 | 
      
         | 982 |  |  |                 continue;
 | 
      
         | 983 |  |  |               label_vars = b->u.label;
 | 
      
         | 984 |  |  |  
 | 
      
         | 985 |  |  |               b1 = label_vars->label_bindings.bindings_in_scope;
 | 
      
         | 986 |  |  |               if (label_vars->label_bindings.scope == NULL)
 | 
      
         | 987 |  |  |                 hjud = false;
 | 
      
         | 988 |  |  |               else
 | 
      
         | 989 |  |  |                 hjud = label_vars->label_bindings.scope->has_jump_unsafe_decl;
 | 
      
         | 990 |  |  |               if (update_spot_bindings (scope, &label_vars->label_bindings))
 | 
      
         | 991 |  |  |                 {
 | 
      
         | 992 |  |  |                   /* This label is defined in this scope.  */
 | 
      
         | 993 |  |  |                   if (hjud)
 | 
      
         | 994 |  |  |                     {
 | 
      
         | 995 |  |  |                       for (; b1 != NULL; b1 = b1->prev)
 | 
      
         | 996 |  |  |                         {
 | 
      
         | 997 |  |  |                           /* A goto from later in the function to this
 | 
      
         | 998 |  |  |                              label will never see the initialization
 | 
      
         | 999 |  |  |                              of B1, if any.  Save it to issue a
 | 
      
         | 1000 |  |  |                              warning if needed.  */
 | 
      
         | 1001 |  |  |                           if (decl_jump_unsafe (b1->decl))
 | 
      
         | 1002 |  |  |                             VEC_safe_push (tree, gc,
 | 
      
         | 1003 |  |  |                                            label_vars->decls_in_scope,
 | 
      
         | 1004 |  |  |                                            b1->decl);
 | 
      
         | 1005 |  |  |                         }
 | 
      
         | 1006 |  |  |                     }
 | 
      
         | 1007 |  |  |                 }
 | 
      
         | 1008 |  |  |  
 | 
      
         | 1009 |  |  |               /* Update the bindings of any goto statements associated
 | 
      
         | 1010 |  |  |                  with this label.  */
 | 
      
         | 1011 |  |  |               FOR_EACH_VEC_ELT (c_goto_bindings_p, label_vars->gotos, ix, g)
 | 
      
         | 1012 |  |  |                 update_spot_bindings (scope, &g->goto_bindings);
 | 
      
         | 1013 |  |  |             }
 | 
      
         | 1014 |  |  |         }
 | 
      
         | 1015 |  |  |  
 | 
      
         | 1016 |  |  |       /* Don't search beyond the current function.  */
 | 
      
         | 1017 |  |  |       if (s == current_function_scope)
 | 
      
         | 1018 |  |  |         break;
 | 
      
         | 1019 |  |  |  
 | 
      
         | 1020 |  |  |       s = s->outer;
 | 
      
         | 1021 |  |  |     }
 | 
      
         | 1022 |  |  | }
 | 
      
         | 1023 |  |  |  
 | 
      
         | 1024 |  |  | /* Set the TYPE_CONTEXT of all of TYPE's variants to CONTEXT.  */
 | 
      
         | 1025 |  |  |  
 | 
      
         | 1026 |  |  | static void
 | 
      
         | 1027 |  |  | set_type_context (tree type, tree context)
 | 
      
         | 1028 |  |  | {
 | 
      
         | 1029 |  |  |   for (type = TYPE_MAIN_VARIANT (type); type;
 | 
      
         | 1030 |  |  |        type = TYPE_NEXT_VARIANT (type))
 | 
      
         | 1031 |  |  |     TYPE_CONTEXT (type) = context;
 | 
      
         | 1032 |  |  | }
 | 
      
         | 1033 |  |  |  
 | 
      
         | 1034 |  |  | /* Exit a scope.  Restore the state of the identifier-decl mappings
 | 
      
         | 1035 |  |  |    that were in effect when this scope was entered.  Return a BLOCK
 | 
      
         | 1036 |  |  |    node containing all the DECLs in this scope that are of interest
 | 
      
         | 1037 |  |  |    to debug info generation.  */
 | 
      
         | 1038 |  |  |  
 | 
      
         | 1039 |  |  | tree
 | 
      
         | 1040 |  |  | pop_scope (void)
 | 
      
         | 1041 |  |  | {
 | 
      
         | 1042 |  |  |   struct c_scope *scope = current_scope;
 | 
      
         | 1043 |  |  |   tree block, context, p;
 | 
      
         | 1044 |  |  |   struct c_binding *b;
 | 
      
         | 1045 |  |  |  
 | 
      
         | 1046 |  |  |   bool functionbody = scope->function_body;
 | 
      
         | 1047 |  |  |   bool keep = functionbody || scope->keep || scope->bindings;
 | 
      
         | 1048 |  |  |  
 | 
      
         | 1049 |  |  |   update_label_decls (scope);
 | 
      
         | 1050 |  |  |  
 | 
      
         | 1051 |  |  |   /* If appropriate, create a BLOCK to record the decls for the life
 | 
      
         | 1052 |  |  |      of this function.  */
 | 
      
         | 1053 |  |  |   block = 0;
 | 
      
         | 1054 |  |  |   if (keep)
 | 
      
         | 1055 |  |  |     {
 | 
      
         | 1056 |  |  |       block = make_node (BLOCK);
 | 
      
         | 1057 |  |  |       BLOCK_SUBBLOCKS (block) = scope->blocks;
 | 
      
         | 1058 |  |  |       TREE_USED (block) = 1;
 | 
      
         | 1059 |  |  |  
 | 
      
         | 1060 |  |  |       /* In each subblock, record that this is its superior.  */
 | 
      
         | 1061 |  |  |       for (p = scope->blocks; p; p = BLOCK_CHAIN (p))
 | 
      
         | 1062 |  |  |         BLOCK_SUPERCONTEXT (p) = block;
 | 
      
         | 1063 |  |  |  
 | 
      
         | 1064 |  |  |       BLOCK_VARS (block) = 0;
 | 
      
         | 1065 |  |  |     }
 | 
      
         | 1066 |  |  |  
 | 
      
         | 1067 |  |  |   /* The TYPE_CONTEXTs for all of the tagged types belonging to this
 | 
      
         | 1068 |  |  |      scope must be set so that they point to the appropriate
 | 
      
         | 1069 |  |  |      construct, i.e.  either to the current FUNCTION_DECL node, or
 | 
      
         | 1070 |  |  |      else to the BLOCK node we just constructed.
 | 
      
         | 1071 |  |  |  
 | 
      
         | 1072 |  |  |      Note that for tagged types whose scope is just the formal
 | 
      
         | 1073 |  |  |      parameter list for some function type specification, we can't
 | 
      
         | 1074 |  |  |      properly set their TYPE_CONTEXTs here, because we don't have a
 | 
      
         | 1075 |  |  |      pointer to the appropriate FUNCTION_TYPE node readily available
 | 
      
         | 1076 |  |  |      to us.  For those cases, the TYPE_CONTEXTs of the relevant tagged
 | 
      
         | 1077 |  |  |      type nodes get set in `grokdeclarator' as soon as we have created
 | 
      
         | 1078 |  |  |      the FUNCTION_TYPE node which will represent the "scope" for these
 | 
      
         | 1079 |  |  |      "parameter list local" tagged types.  */
 | 
      
         | 1080 |  |  |   if (scope->function_body)
 | 
      
         | 1081 |  |  |     context = current_function_decl;
 | 
      
         | 1082 |  |  |   else if (scope == file_scope)
 | 
      
         | 1083 |  |  |     {
 | 
      
         | 1084 |  |  |       tree file_decl = build_translation_unit_decl (NULL_TREE);
 | 
      
         | 1085 |  |  |       context = file_decl;
 | 
      
         | 1086 |  |  |     }
 | 
      
         | 1087 |  |  |   else
 | 
      
         | 1088 |  |  |     context = block;
 | 
      
         | 1089 |  |  |  
 | 
      
         | 1090 |  |  |   /* Clear all bindings in this scope.  */
 | 
      
         | 1091 |  |  |   for (b = scope->bindings; b; b = free_binding_and_advance (b))
 | 
      
         | 1092 |  |  |     {
 | 
      
         | 1093 |  |  |       p = b->decl;
 | 
      
         | 1094 |  |  |       switch (TREE_CODE (p))
 | 
      
         | 1095 |  |  |         {
 | 
      
         | 1096 |  |  |         case LABEL_DECL:
 | 
      
         | 1097 |  |  |           /* Warnings for unused labels, errors for undefined labels.  */
 | 
      
         | 1098 |  |  |           if (TREE_USED (p) && !DECL_INITIAL (p))
 | 
      
         | 1099 |  |  |             {
 | 
      
         | 1100 |  |  |               error ("label %q+D used but not defined", p);
 | 
      
         | 1101 |  |  |               DECL_INITIAL (p) = error_mark_node;
 | 
      
         | 1102 |  |  |             }
 | 
      
         | 1103 |  |  |           else
 | 
      
         | 1104 |  |  |             warn_for_unused_label (p);
 | 
      
         | 1105 |  |  |  
 | 
      
         | 1106 |  |  |           /* Labels go in BLOCK_VARS.  */
 | 
      
         | 1107 |  |  |           DECL_CHAIN (p) = BLOCK_VARS (block);
 | 
      
         | 1108 |  |  |           BLOCK_VARS (block) = p;
 | 
      
         | 1109 |  |  |           gcc_assert (I_LABEL_BINDING (b->id) == b);
 | 
      
         | 1110 |  |  |           I_LABEL_BINDING (b->id) = b->shadowed;
 | 
      
         | 1111 |  |  |  
 | 
      
         | 1112 |  |  |           /* Also pop back to the shadowed label_vars.  */
 | 
      
         | 1113 |  |  |           release_tree_vector (b->u.label->decls_in_scope);
 | 
      
         | 1114 |  |  |           b->u.label = b->u.label->shadowed;
 | 
      
         | 1115 |  |  |           break;
 | 
      
         | 1116 |  |  |  
 | 
      
         | 1117 |  |  |         case ENUMERAL_TYPE:
 | 
      
         | 1118 |  |  |         case UNION_TYPE:
 | 
      
         | 1119 |  |  |         case RECORD_TYPE:
 | 
      
         | 1120 |  |  |           set_type_context (p, context);
 | 
      
         | 1121 |  |  |  
 | 
      
         | 1122 |  |  |           /* Types may not have tag-names, in which case the type
 | 
      
         | 1123 |  |  |              appears in the bindings list with b->id NULL.  */
 | 
      
         | 1124 |  |  |           if (b->id)
 | 
      
         | 1125 |  |  |             {
 | 
      
         | 1126 |  |  |               gcc_assert (I_TAG_BINDING (b->id) == b);
 | 
      
         | 1127 |  |  |               I_TAG_BINDING (b->id) = b->shadowed;
 | 
      
         | 1128 |  |  |             }
 | 
      
         | 1129 |  |  |           break;
 | 
      
         | 1130 |  |  |  
 | 
      
         | 1131 |  |  |         case FUNCTION_DECL:
 | 
      
         | 1132 |  |  |           /* Propagate TREE_ADDRESSABLE from nested functions to their
 | 
      
         | 1133 |  |  |              containing functions.  */
 | 
      
         | 1134 |  |  |           if (!TREE_ASM_WRITTEN (p)
 | 
      
         | 1135 |  |  |               && DECL_INITIAL (p) != 0
 | 
      
         | 1136 |  |  |               && TREE_ADDRESSABLE (p)
 | 
      
         | 1137 |  |  |               && DECL_ABSTRACT_ORIGIN (p) != 0
 | 
      
         | 1138 |  |  |               && DECL_ABSTRACT_ORIGIN (p) != p)
 | 
      
         | 1139 |  |  |             TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (p)) = 1;
 | 
      
         | 1140 |  |  |           if (!DECL_EXTERNAL (p)
 | 
      
         | 1141 |  |  |               && !DECL_INITIAL (p)
 | 
      
         | 1142 |  |  |               && scope != file_scope
 | 
      
         | 1143 |  |  |               && scope != external_scope)
 | 
      
         | 1144 |  |  |             {
 | 
      
         | 1145 |  |  |               error ("nested function %q+D declared but never defined", p);
 | 
      
         | 1146 |  |  |               undef_nested_function = true;
 | 
      
         | 1147 |  |  |             }
 | 
      
         | 1148 |  |  |           else if (DECL_DECLARED_INLINE_P (p)
 | 
      
         | 1149 |  |  |                    && TREE_PUBLIC (p)
 | 
      
         | 1150 |  |  |                    && !DECL_INITIAL (p))
 | 
      
         | 1151 |  |  |             {
 | 
      
         | 1152 |  |  |               /* C99 6.7.4p6: "a function with external linkage... declared
 | 
      
         | 1153 |  |  |                  with an inline function specifier ... shall also be defined
 | 
      
         | 1154 |  |  |                  in the same translation unit."  */
 | 
      
         | 1155 |  |  |               if (!flag_gnu89_inline)
 | 
      
         | 1156 |  |  |                 pedwarn (input_location, 0,
 | 
      
         | 1157 |  |  |                          "inline function %q+D declared but never defined", p);
 | 
      
         | 1158 |  |  |               DECL_EXTERNAL (p) = 1;
 | 
      
         | 1159 |  |  |             }
 | 
      
         | 1160 |  |  |  
 | 
      
         | 1161 |  |  |           goto common_symbol;
 | 
      
         | 1162 |  |  |  
 | 
      
         | 1163 |  |  |         case VAR_DECL:
 | 
      
         | 1164 |  |  |           /* Warnings for unused variables.  */
 | 
      
         | 1165 |  |  |           if ((!TREE_USED (p) || !DECL_READ_P (p))
 | 
      
         | 1166 |  |  |               && !TREE_NO_WARNING (p)
 | 
      
         | 1167 |  |  |               && !DECL_IN_SYSTEM_HEADER (p)
 | 
      
         | 1168 |  |  |               && DECL_NAME (p)
 | 
      
         | 1169 |  |  |               && !DECL_ARTIFICIAL (p)
 | 
      
         | 1170 |  |  |               && scope != file_scope
 | 
      
         | 1171 |  |  |               && scope != external_scope)
 | 
      
         | 1172 |  |  |             {
 | 
      
         | 1173 |  |  |               if (!TREE_USED (p))
 | 
      
         | 1174 |  |  |                 warning (OPT_Wunused_variable, "unused variable %q+D", p);
 | 
      
         | 1175 |  |  |               else if (DECL_CONTEXT (p) == current_function_decl)
 | 
      
         | 1176 |  |  |                 warning_at (DECL_SOURCE_LOCATION (p),
 | 
      
         | 1177 |  |  |                             OPT_Wunused_but_set_variable,
 | 
      
         | 1178 |  |  |                             "variable %qD set but not used", p);
 | 
      
         | 1179 |  |  |             }
 | 
      
         | 1180 |  |  |  
 | 
      
         | 1181 |  |  |           if (b->inner_comp)
 | 
      
         | 1182 |  |  |             {
 | 
      
         | 1183 |  |  |               error ("type of array %q+D completed incompatibly with"
 | 
      
         | 1184 |  |  |                      " implicit initialization", p);
 | 
      
         | 1185 |  |  |             }
 | 
      
         | 1186 |  |  |  
 | 
      
         | 1187 |  |  |           /* Fall through.  */
 | 
      
         | 1188 |  |  |         case TYPE_DECL:
 | 
      
         | 1189 |  |  |         case CONST_DECL:
 | 
      
         | 1190 |  |  |         common_symbol:
 | 
      
         | 1191 |  |  |           /* All of these go in BLOCK_VARS, but only if this is the
 | 
      
         | 1192 |  |  |              binding in the home scope.  */
 | 
      
         | 1193 |  |  |           if (!b->nested)
 | 
      
         | 1194 |  |  |             {
 | 
      
         | 1195 |  |  |               DECL_CHAIN (p) = BLOCK_VARS (block);
 | 
      
         | 1196 |  |  |               BLOCK_VARS (block) = p;
 | 
      
         | 1197 |  |  |             }
 | 
      
         | 1198 |  |  |           else if (VAR_OR_FUNCTION_DECL_P (p) && scope != file_scope)
 | 
      
         | 1199 |  |  |             {
 | 
      
         | 1200 |  |  |               /* For block local externs add a special
 | 
      
         | 1201 |  |  |                  DECL_EXTERNAL decl for debug info generation.  */
 | 
      
         | 1202 |  |  |               tree extp = copy_node (p);
 | 
      
         | 1203 |  |  |  
 | 
      
         | 1204 |  |  |               DECL_EXTERNAL (extp) = 1;
 | 
      
         | 1205 |  |  |               TREE_STATIC (extp) = 0;
 | 
      
         | 1206 |  |  |               TREE_PUBLIC (extp) = 1;
 | 
      
         | 1207 |  |  |               DECL_INITIAL (extp) = NULL_TREE;
 | 
      
         | 1208 |  |  |               DECL_LANG_SPECIFIC (extp) = NULL;
 | 
      
         | 1209 |  |  |               DECL_CONTEXT (extp) = current_function_decl;
 | 
      
         | 1210 |  |  |               if (TREE_CODE (p) == FUNCTION_DECL)
 | 
      
         | 1211 |  |  |                 {
 | 
      
         | 1212 |  |  |                   DECL_RESULT (extp) = NULL_TREE;
 | 
      
         | 1213 |  |  |                   DECL_SAVED_TREE (extp) = NULL_TREE;
 | 
      
         | 1214 |  |  |                   DECL_STRUCT_FUNCTION (extp) = NULL;
 | 
      
         | 1215 |  |  |                 }
 | 
      
         | 1216 |  |  |               if (b->locus != UNKNOWN_LOCATION)
 | 
      
         | 1217 |  |  |                 DECL_SOURCE_LOCATION (extp) = b->locus;
 | 
      
         | 1218 |  |  |               DECL_CHAIN (extp) = BLOCK_VARS (block);
 | 
      
         | 1219 |  |  |               BLOCK_VARS (block) = extp;
 | 
      
         | 1220 |  |  |             }
 | 
      
         | 1221 |  |  |           /* If this is the file scope set DECL_CONTEXT of each decl to
 | 
      
         | 1222 |  |  |              the TRANSLATION_UNIT_DECL.  This makes same_translation_unit_p
 | 
      
         | 1223 |  |  |              work.  */
 | 
      
         | 1224 |  |  |           if (scope == file_scope)
 | 
      
         | 1225 |  |  |             {
 | 
      
         | 1226 |  |  |               DECL_CONTEXT (p) = context;
 | 
      
         | 1227 |  |  |               if (TREE_CODE (p) == TYPE_DECL
 | 
      
         | 1228 |  |  |                   && TREE_TYPE (p) != error_mark_node)
 | 
      
         | 1229 |  |  |                 set_type_context (TREE_TYPE (p), context);
 | 
      
         | 1230 |  |  |             }
 | 
      
         | 1231 |  |  |  
 | 
      
         | 1232 |  |  |           /* Fall through.  */
 | 
      
         | 1233 |  |  |           /* Parameters go in DECL_ARGUMENTS, not BLOCK_VARS, and have
 | 
      
         | 1234 |  |  |              already been put there by store_parm_decls.  Unused-
 | 
      
         | 1235 |  |  |              parameter warnings are handled by function.c.
 | 
      
         | 1236 |  |  |              error_mark_node obviously does not go in BLOCK_VARS and
 | 
      
         | 1237 |  |  |              does not get unused-variable warnings.  */
 | 
      
         | 1238 |  |  |         case PARM_DECL:
 | 
      
         | 1239 |  |  |         case ERROR_MARK:
 | 
      
         | 1240 |  |  |           /* It is possible for a decl not to have a name.  We get
 | 
      
         | 1241 |  |  |              here with b->id NULL in this case.  */
 | 
      
         | 1242 |  |  |           if (b->id)
 | 
      
         | 1243 |  |  |             {
 | 
      
         | 1244 |  |  |               gcc_assert (I_SYMBOL_BINDING (b->id) == b);
 | 
      
         | 1245 |  |  |               I_SYMBOL_BINDING (b->id) = b->shadowed;
 | 
      
         | 1246 |  |  |               if (b->shadowed && b->shadowed->u.type)
 | 
      
         | 1247 |  |  |                 TREE_TYPE (b->shadowed->decl) = b->shadowed->u.type;
 | 
      
         | 1248 |  |  |             }
 | 
      
         | 1249 |  |  |           break;
 | 
      
         | 1250 |  |  |  
 | 
      
         | 1251 |  |  |         default:
 | 
      
         | 1252 |  |  |           gcc_unreachable ();
 | 
      
         | 1253 |  |  |         }
 | 
      
         | 1254 |  |  |     }
 | 
      
         | 1255 |  |  |  
 | 
      
         | 1256 |  |  |  
 | 
      
         | 1257 |  |  |   /* Dispose of the block that we just made inside some higher level.  */
 | 
      
         | 1258 |  |  |   if ((scope->function_body || scope == file_scope) && context)
 | 
      
         | 1259 |  |  |     {
 | 
      
         | 1260 |  |  |       DECL_INITIAL (context) = block;
 | 
      
         | 1261 |  |  |       BLOCK_SUPERCONTEXT (block) = context;
 | 
      
         | 1262 |  |  |     }
 | 
      
         | 1263 |  |  |   else if (scope->outer)
 | 
      
         | 1264 |  |  |     {
 | 
      
         | 1265 |  |  |       if (block)
 | 
      
         | 1266 |  |  |         SCOPE_LIST_APPEND (scope->outer, blocks, block);
 | 
      
         | 1267 |  |  |       /* If we did not make a block for the scope just exited, any
 | 
      
         | 1268 |  |  |          blocks made for inner scopes must be carried forward so they
 | 
      
         | 1269 |  |  |          will later become subblocks of something else.  */
 | 
      
         | 1270 |  |  |       else if (scope->blocks)
 | 
      
         | 1271 |  |  |         SCOPE_LIST_CONCAT (scope->outer, blocks, scope, blocks);
 | 
      
         | 1272 |  |  |     }
 | 
      
         | 1273 |  |  |  
 | 
      
         | 1274 |  |  |   /* Pop the current scope, and free the structure for reuse.  */
 | 
      
         | 1275 |  |  |   current_scope = scope->outer;
 | 
      
         | 1276 |  |  |   if (scope->function_body)
 | 
      
         | 1277 |  |  |     current_function_scope = scope->outer_function;
 | 
      
         | 1278 |  |  |  
 | 
      
         | 1279 |  |  |   memset (scope, 0, sizeof (struct c_scope));
 | 
      
         | 1280 |  |  |   scope->outer = scope_freelist;
 | 
      
         | 1281 |  |  |   scope_freelist = scope;
 | 
      
         | 1282 |  |  |  
 | 
      
         | 1283 |  |  |   return block;
 | 
      
         | 1284 |  |  | }
 | 
      
         | 1285 |  |  |  
 | 
      
         | 1286 |  |  | void
 | 
      
         | 1287 |  |  | push_file_scope (void)
 | 
      
         | 1288 |  |  | {
 | 
      
         | 1289 |  |  |   tree decl;
 | 
      
         | 1290 |  |  |  
 | 
      
         | 1291 |  |  |   if (file_scope)
 | 
      
         | 1292 |  |  |     return;
 | 
      
         | 1293 |  |  |  
 | 
      
         | 1294 |  |  |   push_scope ();
 | 
      
         | 1295 |  |  |   file_scope = current_scope;
 | 
      
         | 1296 |  |  |  
 | 
      
         | 1297 |  |  |   start_fname_decls ();
 | 
      
         | 1298 |  |  |  
 | 
      
         | 1299 |  |  |   for (decl = visible_builtins; decl; decl = DECL_CHAIN (decl))
 | 
      
         | 1300 |  |  |     bind (DECL_NAME (decl), decl, file_scope,
 | 
      
         | 1301 |  |  |           /*invisible=*/false, /*nested=*/true, DECL_SOURCE_LOCATION (decl));
 | 
      
         | 1302 |  |  | }
 | 
      
         | 1303 |  |  |  
 | 
      
         | 1304 |  |  | void
 | 
      
         | 1305 |  |  | pop_file_scope (void)
 | 
      
         | 1306 |  |  | {
 | 
      
         | 1307 |  |  |   /* In case there were missing closebraces, get us back to the global
 | 
      
         | 1308 |  |  |      binding level.  */
 | 
      
         | 1309 |  |  |   while (current_scope != file_scope)
 | 
      
         | 1310 |  |  |     pop_scope ();
 | 
      
         | 1311 |  |  |  
 | 
      
         | 1312 |  |  |   /* __FUNCTION__ is defined at file scope ("").  This
 | 
      
         | 1313 |  |  |      call may not be necessary as my tests indicate it
 | 
      
         | 1314 |  |  |      still works without it.  */
 | 
      
         | 1315 |  |  |   finish_fname_decls ();
 | 
      
         | 1316 |  |  |  
 | 
      
         | 1317 |  |  |   check_inline_statics ();
 | 
      
         | 1318 |  |  |  
 | 
      
         | 1319 |  |  |   /* This is the point to write out a PCH if we're doing that.
 | 
      
         | 1320 |  |  |      In that case we do not want to do anything else.  */
 | 
      
         | 1321 |  |  |   if (pch_file)
 | 
      
         | 1322 |  |  |     {
 | 
      
         | 1323 |  |  |       c_common_write_pch ();
 | 
      
         | 1324 |  |  |       return;
 | 
      
         | 1325 |  |  |     }
 | 
      
         | 1326 |  |  |  
 | 
      
         | 1327 |  |  |   /* Pop off the file scope and close this translation unit.  */
 | 
      
         | 1328 |  |  |   pop_scope ();
 | 
      
         | 1329 |  |  |   file_scope = 0;
 | 
      
         | 1330 |  |  |  
 | 
      
         | 1331 |  |  |   maybe_apply_pending_pragma_weaks ();
 | 
      
         | 1332 |  |  | }
 | 
      
         | 1333 |  |  |  
 | 
      
         | 1334 |  |  | /* Adjust the bindings for the start of a statement expression.  */
 | 
      
         | 1335 |  |  |  
 | 
      
         | 1336 |  |  | void
 | 
      
         | 1337 |  |  | c_bindings_start_stmt_expr (struct c_spot_bindings* switch_bindings)
 | 
      
         | 1338 |  |  | {
 | 
      
         | 1339 |  |  |   struct c_scope *scope;
 | 
      
         | 1340 |  |  |  
 | 
      
         | 1341 |  |  |   for (scope = current_scope; scope != NULL; scope = scope->outer)
 | 
      
         | 1342 |  |  |     {
 | 
      
         | 1343 |  |  |       struct c_binding *b;
 | 
      
         | 1344 |  |  |  
 | 
      
         | 1345 |  |  |       if (!scope->has_label_bindings)
 | 
      
         | 1346 |  |  |         continue;
 | 
      
         | 1347 |  |  |  
 | 
      
         | 1348 |  |  |       for (b = scope->bindings; b != NULL; b = b->prev)
 | 
      
         | 1349 |  |  |         {
 | 
      
         | 1350 |  |  |           struct c_label_vars *label_vars;
 | 
      
         | 1351 |  |  |           unsigned int ix;
 | 
      
         | 1352 |  |  |           struct c_goto_bindings *g;
 | 
      
         | 1353 |  |  |  
 | 
      
         | 1354 |  |  |           if (TREE_CODE (b->decl) != LABEL_DECL)
 | 
      
         | 1355 |  |  |             continue;
 | 
      
         | 1356 |  |  |           label_vars = b->u.label;
 | 
      
         | 1357 |  |  |           ++label_vars->label_bindings.stmt_exprs;
 | 
      
         | 1358 |  |  |           FOR_EACH_VEC_ELT (c_goto_bindings_p, label_vars->gotos, ix, g)
 | 
      
         | 1359 |  |  |             ++g->goto_bindings.stmt_exprs;
 | 
      
         | 1360 |  |  |         }
 | 
      
         | 1361 |  |  |     }
 | 
      
         | 1362 |  |  |  
 | 
      
         | 1363 |  |  |   if (switch_bindings != NULL)
 | 
      
         | 1364 |  |  |     ++switch_bindings->stmt_exprs;
 | 
      
         | 1365 |  |  | }
 | 
      
         | 1366 |  |  |  
 | 
      
         | 1367 |  |  | /* Adjust the bindings for the end of a statement expression.  */
 | 
      
         | 1368 |  |  |  
 | 
      
         | 1369 |  |  | void
 | 
      
         | 1370 |  |  | c_bindings_end_stmt_expr (struct c_spot_bindings *switch_bindings)
 | 
      
         | 1371 |  |  | {
 | 
      
         | 1372 |  |  |   struct c_scope *scope;
 | 
      
         | 1373 |  |  |  
 | 
      
         | 1374 |  |  |   for (scope = current_scope; scope != NULL; scope = scope->outer)
 | 
      
         | 1375 |  |  |     {
 | 
      
         | 1376 |  |  |       struct c_binding *b;
 | 
      
         | 1377 |  |  |  
 | 
      
         | 1378 |  |  |       if (!scope->has_label_bindings)
 | 
      
         | 1379 |  |  |         continue;
 | 
      
         | 1380 |  |  |  
 | 
      
         | 1381 |  |  |       for (b = scope->bindings; b != NULL; b = b->prev)
 | 
      
         | 1382 |  |  |         {
 | 
      
         | 1383 |  |  |           struct c_label_vars *label_vars;
 | 
      
         | 1384 |  |  |           unsigned int ix;
 | 
      
         | 1385 |  |  |           struct c_goto_bindings *g;
 | 
      
         | 1386 |  |  |  
 | 
      
         | 1387 |  |  |           if (TREE_CODE (b->decl) != LABEL_DECL)
 | 
      
         | 1388 |  |  |             continue;
 | 
      
         | 1389 |  |  |           label_vars = b->u.label;
 | 
      
         | 1390 |  |  |           --label_vars->label_bindings.stmt_exprs;
 | 
      
         | 1391 |  |  |           if (label_vars->label_bindings.stmt_exprs < 0)
 | 
      
         | 1392 |  |  |             {
 | 
      
         | 1393 |  |  |               label_vars->label_bindings.left_stmt_expr = true;
 | 
      
         | 1394 |  |  |               label_vars->label_bindings.stmt_exprs = 0;
 | 
      
         | 1395 |  |  |             }
 | 
      
         | 1396 |  |  |           FOR_EACH_VEC_ELT (c_goto_bindings_p, label_vars->gotos, ix, g)
 | 
      
         | 1397 |  |  |             {
 | 
      
         | 1398 |  |  |               --g->goto_bindings.stmt_exprs;
 | 
      
         | 1399 |  |  |               if (g->goto_bindings.stmt_exprs < 0)
 | 
      
         | 1400 |  |  |                 {
 | 
      
         | 1401 |  |  |                   g->goto_bindings.left_stmt_expr = true;
 | 
      
         | 1402 |  |  |                   g->goto_bindings.stmt_exprs = 0;
 | 
      
         | 1403 |  |  |                 }
 | 
      
         | 1404 |  |  |             }
 | 
      
         | 1405 |  |  |         }
 | 
      
         | 1406 |  |  |     }
 | 
      
         | 1407 |  |  |  
 | 
      
         | 1408 |  |  |   if (switch_bindings != NULL)
 | 
      
         | 1409 |  |  |     {
 | 
      
         | 1410 |  |  |       --switch_bindings->stmt_exprs;
 | 
      
         | 1411 |  |  |       gcc_assert (switch_bindings->stmt_exprs >= 0);
 | 
      
         | 1412 |  |  |     }
 | 
      
         | 1413 |  |  | }
 | 
      
         | 1414 |  |  |  
 | 
      
         | 1415 |  |  | /* Push a definition or a declaration of struct, union or enum tag "name".
 | 
      
         | 1416 |  |  |    "type" should be the type node.
 | 
      
         | 1417 |  |  |    We assume that the tag "name" is not already defined, and has a location
 | 
      
         | 1418 |  |  |    of LOC.
 | 
      
         | 1419 |  |  |  
 | 
      
         | 1420 |  |  |    Note that the definition may really be just a forward reference.
 | 
      
         | 1421 |  |  |    In that case, the TYPE_SIZE will be zero.  */
 | 
      
         | 1422 |  |  |  
 | 
      
         | 1423 |  |  | static void
 | 
      
         | 1424 |  |  | pushtag (location_t loc, tree name, tree type)
 | 
      
         | 1425 |  |  | {
 | 
      
         | 1426 |  |  |   /* Record the identifier as the type's name if it has none.  */
 | 
      
         | 1427 |  |  |   if (name && !TYPE_NAME (type))
 | 
      
         | 1428 |  |  |     TYPE_NAME (type) = name;
 | 
      
         | 1429 |  |  |   bind (name, type, current_scope, /*invisible=*/false, /*nested=*/false, loc);
 | 
      
         | 1430 |  |  |  
 | 
      
         | 1431 |  |  |   /* Create a fake NULL-named TYPE_DECL node whose TREE_TYPE will be the
 | 
      
         | 1432 |  |  |      tagged type we just added to the current scope.  This fake
 | 
      
         | 1433 |  |  |      NULL-named TYPE_DECL node helps dwarfout.c to know when it needs
 | 
      
         | 1434 |  |  |      to output a representation of a tagged type, and it also gives
 | 
      
         | 1435 |  |  |      us a convenient place to record the "scope start" address for the
 | 
      
         | 1436 |  |  |      tagged type.  */
 | 
      
         | 1437 |  |  |  
 | 
      
         | 1438 |  |  |   TYPE_STUB_DECL (type) = pushdecl (build_decl (loc,
 | 
      
         | 1439 |  |  |                                                 TYPE_DECL, NULL_TREE, type));
 | 
      
         | 1440 |  |  |  
 | 
      
         | 1441 |  |  |   /* An approximation for now, so we can tell this is a function-scope tag.
 | 
      
         | 1442 |  |  |      This will be updated in pop_scope.  */
 | 
      
         | 1443 |  |  |   TYPE_CONTEXT (type) = DECL_CONTEXT (TYPE_STUB_DECL (type));
 | 
      
         | 1444 |  |  |  
 | 
      
         | 1445 |  |  |   if (warn_cxx_compat && name != NULL_TREE)
 | 
      
         | 1446 |  |  |     {
 | 
      
         | 1447 |  |  |       struct c_binding *b = I_SYMBOL_BINDING (name);
 | 
      
         | 1448 |  |  |  
 | 
      
         | 1449 |  |  |       if (b != NULL
 | 
      
         | 1450 |  |  |           && b->decl != NULL_TREE
 | 
      
         | 1451 |  |  |           && TREE_CODE (b->decl) == TYPE_DECL
 | 
      
         | 1452 |  |  |           && (B_IN_CURRENT_SCOPE (b)
 | 
      
         | 1453 |  |  |               || (current_scope == file_scope && B_IN_EXTERNAL_SCOPE (b)))
 | 
      
         | 1454 |  |  |           && (TYPE_MAIN_VARIANT (TREE_TYPE (b->decl))
 | 
      
         | 1455 |  |  |               != TYPE_MAIN_VARIANT (type)))
 | 
      
         | 1456 |  |  |         {
 | 
      
         | 1457 |  |  |           warning_at (loc, OPT_Wc___compat,
 | 
      
         | 1458 |  |  |                       ("using %qD as both a typedef and a tag is "
 | 
      
         | 1459 |  |  |                        "invalid in C++"),
 | 
      
         | 1460 |  |  |                       b->decl);
 | 
      
         | 1461 |  |  |           if (b->locus != UNKNOWN_LOCATION)
 | 
      
         | 1462 |  |  |             inform (b->locus, "originally defined here");
 | 
      
         | 1463 |  |  |         }
 | 
      
         | 1464 |  |  |     }
 | 
      
         | 1465 |  |  | }
 | 
      
         | 1466 |  |  |  
 | 
      
         | 1467 |  |  | /* Subroutine of compare_decls.  Allow harmless mismatches in return
 | 
      
         | 1468 |  |  |    and argument types provided that the type modes match.  This function
 | 
      
         | 1469 |  |  |    return a unified type given a suitable match, and 0 otherwise.  */
 | 
      
         | 1470 |  |  |  
 | 
      
         | 1471 |  |  | static tree
 | 
      
         | 1472 |  |  | match_builtin_function_types (tree newtype, tree oldtype)
 | 
      
         | 1473 |  |  | {
 | 
      
         | 1474 |  |  |   tree newrettype, oldrettype;
 | 
      
         | 1475 |  |  |   tree newargs, oldargs;
 | 
      
         | 1476 |  |  |   tree trytype, tryargs;
 | 
      
         | 1477 |  |  |  
 | 
      
         | 1478 |  |  |   /* Accept the return type of the new declaration if same modes.  */
 | 
      
         | 1479 |  |  |   oldrettype = TREE_TYPE (oldtype);
 | 
      
         | 1480 |  |  |   newrettype = TREE_TYPE (newtype);
 | 
      
         | 1481 |  |  |  
 | 
      
         | 1482 |  |  |   if (TYPE_MODE (oldrettype) != TYPE_MODE (newrettype))
 | 
      
         | 1483 |  |  |     return 0;
 | 
      
         | 1484 |  |  |  
 | 
      
         | 1485 |  |  |   oldargs = TYPE_ARG_TYPES (oldtype);
 | 
      
         | 1486 |  |  |   newargs = TYPE_ARG_TYPES (newtype);
 | 
      
         | 1487 |  |  |   tryargs = newargs;
 | 
      
         | 1488 |  |  |  
 | 
      
         | 1489 |  |  |   while (oldargs || newargs)
 | 
      
         | 1490 |  |  |     {
 | 
      
         | 1491 |  |  |       if (!oldargs
 | 
      
         | 1492 |  |  |           || !newargs
 | 
      
         | 1493 |  |  |           || !TREE_VALUE (oldargs)
 | 
      
         | 1494 |  |  |           || !TREE_VALUE (newargs)
 | 
      
         | 1495 |  |  |           || TYPE_MODE (TREE_VALUE (oldargs))
 | 
      
         | 1496 |  |  |              != TYPE_MODE (TREE_VALUE (newargs)))
 | 
      
         | 1497 |  |  |         return 0;
 | 
      
         | 1498 |  |  |  
 | 
      
         | 1499 |  |  |       oldargs = TREE_CHAIN (oldargs);
 | 
      
         | 1500 |  |  |       newargs = TREE_CHAIN (newargs);
 | 
      
         | 1501 |  |  |     }
 | 
      
         | 1502 |  |  |  
 | 
      
         | 1503 |  |  |   trytype = build_function_type (newrettype, tryargs);
 | 
      
         | 1504 |  |  |   return build_type_attribute_variant (trytype, TYPE_ATTRIBUTES (oldtype));
 | 
      
         | 1505 |  |  | }
 | 
      
         | 1506 |  |  |  
 | 
      
         | 1507 |  |  | /* Subroutine of diagnose_mismatched_decls.  Check for function type
 | 
      
         | 1508 |  |  |    mismatch involving an empty arglist vs a nonempty one and give clearer
 | 
      
         | 1509 |  |  |    diagnostics.  */
 | 
      
         | 1510 |  |  | static void
 | 
      
         | 1511 |  |  | diagnose_arglist_conflict (tree newdecl, tree olddecl,
 | 
      
         | 1512 |  |  |                            tree newtype, tree oldtype)
 | 
      
         | 1513 |  |  | {
 | 
      
         | 1514 |  |  |   tree t;
 | 
      
         | 1515 |  |  |  
 | 
      
         | 1516 |  |  |   if (TREE_CODE (olddecl) != FUNCTION_DECL
 | 
      
         | 1517 |  |  |       || !comptypes (TREE_TYPE (oldtype), TREE_TYPE (newtype))
 | 
      
         | 1518 |  |  |       || !((!prototype_p (oldtype) && DECL_INITIAL (olddecl) == 0)
 | 
      
         | 1519 |  |  |            || (!prototype_p (newtype) && DECL_INITIAL (newdecl) == 0)))
 | 
      
         | 1520 |  |  |     return;
 | 
      
         | 1521 |  |  |  
 | 
      
         | 1522 |  |  |   t = TYPE_ARG_TYPES (oldtype);
 | 
      
         | 1523 |  |  |   if (t == 0)
 | 
      
         | 1524 |  |  |     t = TYPE_ARG_TYPES (newtype);
 | 
      
         | 1525 |  |  |   for (; t; t = TREE_CHAIN (t))
 | 
      
         | 1526 |  |  |     {
 | 
      
         | 1527 |  |  |       tree type = TREE_VALUE (t);
 | 
      
         | 1528 |  |  |  
 | 
      
         | 1529 |  |  |       if (TREE_CHAIN (t) == 0
 | 
      
         | 1530 |  |  |           && TYPE_MAIN_VARIANT (type) != void_type_node)
 | 
      
         | 1531 |  |  |         {
 | 
      
         | 1532 |  |  |           inform (input_location, "a parameter list with an ellipsis can%'t match "
 | 
      
         | 1533 |  |  |                   "an empty parameter name list declaration");
 | 
      
         | 1534 |  |  |           break;
 | 
      
         | 1535 |  |  |         }
 | 
      
         | 1536 |  |  |  
 | 
      
         | 1537 |  |  |       if (c_type_promotes_to (type) != type)
 | 
      
         | 1538 |  |  |         {
 | 
      
         | 1539 |  |  |           inform (input_location, "an argument type that has a default promotion can%'t match "
 | 
      
         | 1540 |  |  |                   "an empty parameter name list declaration");
 | 
      
         | 1541 |  |  |           break;
 | 
      
         | 1542 |  |  |         }
 | 
      
         | 1543 |  |  |     }
 | 
      
         | 1544 |  |  | }
 | 
      
         | 1545 |  |  |  
 | 
      
         | 1546 |  |  | /* Another subroutine of diagnose_mismatched_decls.  OLDDECL is an
 | 
      
         | 1547 |  |  |    old-style function definition, NEWDECL is a prototype declaration.
 | 
      
         | 1548 |  |  |    Diagnose inconsistencies in the argument list.  Returns TRUE if
 | 
      
         | 1549 |  |  |    the prototype is compatible, FALSE if not.  */
 | 
      
         | 1550 |  |  | static bool
 | 
      
         | 1551 |  |  | validate_proto_after_old_defn (tree newdecl, tree newtype, tree oldtype)
 | 
      
         | 1552 |  |  | {
 | 
      
         | 1553 |  |  |   tree newargs, oldargs;
 | 
      
         | 1554 |  |  |   int i;
 | 
      
         | 1555 |  |  |  
 | 
      
         | 1556 |  |  | #define END_OF_ARGLIST(t) ((t) == void_type_node)
 | 
      
         | 1557 |  |  |  
 | 
      
         | 1558 |  |  |   oldargs = TYPE_ACTUAL_ARG_TYPES (oldtype);
 | 
      
         | 1559 |  |  |   newargs = TYPE_ARG_TYPES (newtype);
 | 
      
         | 1560 |  |  |   i = 1;
 | 
      
         | 1561 |  |  |  
 | 
      
         | 1562 |  |  |   for (;;)
 | 
      
         | 1563 |  |  |     {
 | 
      
         | 1564 |  |  |       tree oldargtype = TREE_VALUE (oldargs);
 | 
      
         | 1565 |  |  |       tree newargtype = TREE_VALUE (newargs);
 | 
      
         | 1566 |  |  |  
 | 
      
         | 1567 |  |  |       if (oldargtype == error_mark_node || newargtype == error_mark_node)
 | 
      
         | 1568 |  |  |         return false;
 | 
      
         | 1569 |  |  |  
 | 
      
         | 1570 |  |  |       oldargtype = TYPE_MAIN_VARIANT (oldargtype);
 | 
      
         | 1571 |  |  |       newargtype = TYPE_MAIN_VARIANT (newargtype);
 | 
      
         | 1572 |  |  |  
 | 
      
         | 1573 |  |  |       if (END_OF_ARGLIST (oldargtype) && END_OF_ARGLIST (newargtype))
 | 
      
         | 1574 |  |  |         break;
 | 
      
         | 1575 |  |  |  
 | 
      
         | 1576 |  |  |       /* Reaching the end of just one list means the two decls don't
 | 
      
         | 1577 |  |  |          agree on the number of arguments.  */
 | 
      
         | 1578 |  |  |       if (END_OF_ARGLIST (oldargtype))
 | 
      
         | 1579 |  |  |         {
 | 
      
         | 1580 |  |  |           error ("prototype for %q+D declares more arguments "
 | 
      
         | 1581 |  |  |                  "than previous old-style definition", newdecl);
 | 
      
         | 1582 |  |  |           return false;
 | 
      
         | 1583 |  |  |         }
 | 
      
         | 1584 |  |  |       else if (END_OF_ARGLIST (newargtype))
 | 
      
         | 1585 |  |  |         {
 | 
      
         | 1586 |  |  |           error ("prototype for %q+D declares fewer arguments "
 | 
      
         | 1587 |  |  |                  "than previous old-style definition", newdecl);
 | 
      
         | 1588 |  |  |           return false;
 | 
      
         | 1589 |  |  |         }
 | 
      
         | 1590 |  |  |  
 | 
      
         | 1591 |  |  |       /* Type for passing arg must be consistent with that declared
 | 
      
         | 1592 |  |  |          for the arg.  */
 | 
      
         | 1593 |  |  |       else if (!comptypes (oldargtype, newargtype))
 | 
      
         | 1594 |  |  |         {
 | 
      
         | 1595 |  |  |           error ("prototype for %q+D declares argument %d"
 | 
      
         | 1596 |  |  |                  " with incompatible type",
 | 
      
         | 1597 |  |  |                  newdecl, i);
 | 
      
         | 1598 |  |  |           return false;
 | 
      
         | 1599 |  |  |         }
 | 
      
         | 1600 |  |  |  
 | 
      
         | 1601 |  |  |       oldargs = TREE_CHAIN (oldargs);
 | 
      
         | 1602 |  |  |       newargs = TREE_CHAIN (newargs);
 | 
      
         | 1603 |  |  |       i++;
 | 
      
         | 1604 |  |  |     }
 | 
      
         | 1605 |  |  |  
 | 
      
         | 1606 |  |  |   /* If we get here, no errors were found, but do issue a warning
 | 
      
         | 1607 |  |  |      for this poor-style construct.  */
 | 
      
         | 1608 |  |  |   warning (0, "prototype for %q+D follows non-prototype definition",
 | 
      
         | 1609 |  |  |            newdecl);
 | 
      
         | 1610 |  |  |   return true;
 | 
      
         | 1611 |  |  | #undef END_OF_ARGLIST
 | 
      
         | 1612 |  |  | }
 | 
      
         | 1613 |  |  |  
 | 
      
         | 1614 |  |  | /* Subroutine of diagnose_mismatched_decls.  Report the location of DECL,
 | 
      
         | 1615 |  |  |    first in a pair of mismatched declarations, using the diagnostic
 | 
      
         | 1616 |  |  |    function DIAG.  */
 | 
      
         | 1617 |  |  | static void
 | 
      
         | 1618 |  |  | locate_old_decl (tree decl)
 | 
      
         | 1619 |  |  | {
 | 
      
         | 1620 |  |  |   if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl))
 | 
      
         | 1621 |  |  |     ;
 | 
      
         | 1622 |  |  |   else if (DECL_INITIAL (decl))
 | 
      
         | 1623 |  |  |     inform (input_location, "previous definition of %q+D was here", decl);
 | 
      
         | 1624 |  |  |   else if (C_DECL_IMPLICIT (decl))
 | 
      
         | 1625 |  |  |     inform (input_location, "previous implicit declaration of %q+D was here", decl);
 | 
      
         | 1626 |  |  |   else
 | 
      
         | 1627 |  |  |     inform (input_location, "previous declaration of %q+D was here", decl);
 | 
      
         | 1628 |  |  | }
 | 
      
         | 1629 |  |  |  
 | 
      
         | 1630 |  |  | /* Subroutine of duplicate_decls.  Compare NEWDECL to OLDDECL.
 | 
      
         | 1631 |  |  |    Returns true if the caller should proceed to merge the two, false
 | 
      
         | 1632 |  |  |    if OLDDECL should simply be discarded.  As a side effect, issues
 | 
      
         | 1633 |  |  |    all necessary diagnostics for invalid or poor-style combinations.
 | 
      
         | 1634 |  |  |    If it returns true, writes the types of NEWDECL and OLDDECL to
 | 
      
         | 1635 |  |  |    *NEWTYPEP and *OLDTYPEP - these may have been adjusted from
 | 
      
         | 1636 |  |  |    TREE_TYPE (NEWDECL, OLDDECL) respectively.  */
 | 
      
         | 1637 |  |  |  
 | 
      
         | 1638 |  |  | static bool
 | 
      
         | 1639 |  |  | diagnose_mismatched_decls (tree newdecl, tree olddecl,
 | 
      
         | 1640 |  |  |                            tree *newtypep, tree *oldtypep)
 | 
      
         | 1641 |  |  | {
 | 
      
         | 1642 |  |  |   tree newtype, oldtype;
 | 
      
         | 1643 |  |  |   bool pedwarned = false;
 | 
      
         | 1644 |  |  |   bool warned = false;
 | 
      
         | 1645 |  |  |   bool retval = true;
 | 
      
         | 1646 |  |  |  
 | 
      
         | 1647 |  |  | #define DECL_EXTERN_INLINE(DECL) (DECL_DECLARED_INLINE_P (DECL)  \
 | 
      
         | 1648 |  |  |                                   && DECL_EXTERNAL (DECL))
 | 
      
         | 1649 |  |  |  
 | 
      
         | 1650 |  |  |   /* If we have error_mark_node for either decl or type, just discard
 | 
      
         | 1651 |  |  |      the previous decl - we're in an error cascade already.  */
 | 
      
         | 1652 |  |  |   if (olddecl == error_mark_node || newdecl == error_mark_node)
 | 
      
         | 1653 |  |  |     return false;
 | 
      
         | 1654 |  |  |   *oldtypep = oldtype = TREE_TYPE (olddecl);
 | 
      
         | 1655 |  |  |   *newtypep = newtype = TREE_TYPE (newdecl);
 | 
      
         | 1656 |  |  |   if (oldtype == error_mark_node || newtype == error_mark_node)
 | 
      
         | 1657 |  |  |     return false;
 | 
      
         | 1658 |  |  |  
 | 
      
         | 1659 |  |  |   /* Two different categories of symbol altogether.  This is an error
 | 
      
         | 1660 |  |  |      unless OLDDECL is a builtin.  OLDDECL will be discarded in any case.  */
 | 
      
         | 1661 |  |  |   if (TREE_CODE (olddecl) != TREE_CODE (newdecl))
 | 
      
         | 1662 |  |  |     {
 | 
      
         | 1663 |  |  |       if (!(TREE_CODE (olddecl) == FUNCTION_DECL
 | 
      
         | 1664 |  |  |             && DECL_BUILT_IN (olddecl)
 | 
      
         | 1665 |  |  |             && !C_DECL_DECLARED_BUILTIN (olddecl)))
 | 
      
         | 1666 |  |  |         {
 | 
      
         | 1667 |  |  |           error ("%q+D redeclared as different kind of symbol", newdecl);
 | 
      
         | 1668 |  |  |           locate_old_decl (olddecl);
 | 
      
         | 1669 |  |  |         }
 | 
      
         | 1670 |  |  |       else if (TREE_PUBLIC (newdecl))
 | 
      
         | 1671 |  |  |         warning (0, "built-in function %q+D declared as non-function",
 | 
      
         | 1672 |  |  |                  newdecl);
 | 
      
         | 1673 |  |  |       else
 | 
      
         | 1674 |  |  |         warning (OPT_Wshadow, "declaration of %q+D shadows "
 | 
      
         | 1675 |  |  |                  "a built-in function", newdecl);
 | 
      
         | 1676 |  |  |       return false;
 | 
      
         | 1677 |  |  |     }
 | 
      
         | 1678 |  |  |  
 | 
      
         | 1679 |  |  |   /* Enumerators have no linkage, so may only be declared once in a
 | 
      
         | 1680 |  |  |      given scope.  */
 | 
      
         | 1681 |  |  |   if (TREE_CODE (olddecl) == CONST_DECL)
 | 
      
         | 1682 |  |  |     {
 | 
      
         | 1683 |  |  |       error ("redeclaration of enumerator %q+D", newdecl);
 | 
      
         | 1684 |  |  |       locate_old_decl (olddecl);
 | 
      
         | 1685 |  |  |       return false;
 | 
      
         | 1686 |  |  |     }
 | 
      
         | 1687 |  |  |  
 | 
      
         | 1688 |  |  |   if (!comptypes (oldtype, newtype))
 | 
      
         | 1689 |  |  |     {
 | 
      
         | 1690 |  |  |       if (TREE_CODE (olddecl) == FUNCTION_DECL
 | 
      
         | 1691 |  |  |           && DECL_BUILT_IN (olddecl) && !C_DECL_DECLARED_BUILTIN (olddecl))
 | 
      
         | 1692 |  |  |         {
 | 
      
         | 1693 |  |  |           /* Accept harmless mismatch in function types.
 | 
      
         | 1694 |  |  |              This is for the ffs and fprintf builtins.  */
 | 
      
         | 1695 |  |  |           tree trytype = match_builtin_function_types (newtype, oldtype);
 | 
      
         | 1696 |  |  |  
 | 
      
         | 1697 |  |  |           if (trytype && comptypes (newtype, trytype))
 | 
      
         | 1698 |  |  |             *oldtypep = oldtype = trytype;
 | 
      
         | 1699 |  |  |           else
 | 
      
         | 1700 |  |  |             {
 | 
      
         | 1701 |  |  |               /* If types don't match for a built-in, throw away the
 | 
      
         | 1702 |  |  |                  built-in.  No point in calling locate_old_decl here, it
 | 
      
         | 1703 |  |  |                  won't print anything.  */
 | 
      
         | 1704 |  |  |               warning (0, "conflicting types for built-in function %q+D",
 | 
      
         | 1705 |  |  |                        newdecl);
 | 
      
         | 1706 |  |  |               return false;
 | 
      
         | 1707 |  |  |             }
 | 
      
         | 1708 |  |  |         }
 | 
      
         | 1709 |  |  |       else if (TREE_CODE (olddecl) == FUNCTION_DECL
 | 
      
         | 1710 |  |  |                && DECL_IS_BUILTIN (olddecl))
 | 
      
         | 1711 |  |  |         {
 | 
      
         | 1712 |  |  |           /* A conflicting function declaration for a predeclared
 | 
      
         | 1713 |  |  |              function that isn't actually built in.  Objective C uses
 | 
      
         | 1714 |  |  |              these.  The new declaration silently overrides everything
 | 
      
         | 1715 |  |  |              but the volatility (i.e. noreturn) indication.  See also
 | 
      
         | 1716 |  |  |              below.  FIXME: Make Objective C use normal builtins.  */
 | 
      
         | 1717 |  |  |           TREE_THIS_VOLATILE (newdecl) |= TREE_THIS_VOLATILE (olddecl);
 | 
      
         | 1718 |  |  |           return false;
 | 
      
         | 1719 |  |  |         }
 | 
      
         | 1720 |  |  |       /* Permit void foo (...) to match int foo (...) if the latter is
 | 
      
         | 1721 |  |  |          the definition and implicit int was used.  See
 | 
      
         | 1722 |  |  |          c-torture/compile/920625-2.c.  */
 | 
      
         | 1723 |  |  |       else if (TREE_CODE (newdecl) == FUNCTION_DECL && DECL_INITIAL (newdecl)
 | 
      
         | 1724 |  |  |                && TYPE_MAIN_VARIANT (TREE_TYPE (oldtype)) == void_type_node
 | 
      
         | 1725 |  |  |                && TYPE_MAIN_VARIANT (TREE_TYPE (newtype)) == integer_type_node
 | 
      
         | 1726 |  |  |                && C_FUNCTION_IMPLICIT_INT (newdecl) && !DECL_INITIAL (olddecl))
 | 
      
         | 1727 |  |  |         {
 | 
      
         | 1728 |  |  |           pedwarned = pedwarn (input_location, 0,
 | 
      
         | 1729 |  |  |                                "conflicting types for %q+D", newdecl);
 | 
      
         | 1730 |  |  |           /* Make sure we keep void as the return type.  */
 | 
      
         | 1731 |  |  |           TREE_TYPE (newdecl) = *newtypep = newtype = oldtype;
 | 
      
         | 1732 |  |  |           C_FUNCTION_IMPLICIT_INT (newdecl) = 0;
 | 
      
         | 1733 |  |  |         }
 | 
      
         | 1734 |  |  |       /* Permit void foo (...) to match an earlier call to foo (...) with
 | 
      
         | 1735 |  |  |          no declared type (thus, implicitly int).  */
 | 
      
         | 1736 |  |  |       else if (TREE_CODE (newdecl) == FUNCTION_DECL
 | 
      
         | 1737 |  |  |                && TYPE_MAIN_VARIANT (TREE_TYPE (newtype)) == void_type_node
 | 
      
         | 1738 |  |  |                && TYPE_MAIN_VARIANT (TREE_TYPE (oldtype)) == integer_type_node
 | 
      
         | 1739 |  |  |                && C_DECL_IMPLICIT (olddecl) && !DECL_INITIAL (olddecl))
 | 
      
         | 1740 |  |  |         {
 | 
      
         | 1741 |  |  |           pedwarned = pedwarn (input_location, 0,
 | 
      
         | 1742 |  |  |                                "conflicting types for %q+D", newdecl);
 | 
      
         | 1743 |  |  |           /* Make sure we keep void as the return type.  */
 | 
      
         | 1744 |  |  |           TREE_TYPE (olddecl) = *oldtypep = oldtype = newtype;
 | 
      
         | 1745 |  |  |         }
 | 
      
         | 1746 |  |  |       else
 | 
      
         | 1747 |  |  |         {
 | 
      
         | 1748 |  |  |           int new_quals = TYPE_QUALS (newtype);
 | 
      
         | 1749 |  |  |           int old_quals = TYPE_QUALS (oldtype);
 | 
      
         | 1750 |  |  |  
 | 
      
         | 1751 |  |  |           if (new_quals != old_quals)
 | 
      
         | 1752 |  |  |             {
 | 
      
         | 1753 |  |  |               addr_space_t new_addr = DECODE_QUAL_ADDR_SPACE (new_quals);
 | 
      
         | 1754 |  |  |               addr_space_t old_addr = DECODE_QUAL_ADDR_SPACE (old_quals);
 | 
      
         | 1755 |  |  |               if (new_addr != old_addr)
 | 
      
         | 1756 |  |  |                 {
 | 
      
         | 1757 |  |  |                   if (ADDR_SPACE_GENERIC_P (new_addr))
 | 
      
         | 1758 |  |  |                     error ("conflicting named address spaces (generic vs %s) "
 | 
      
         | 1759 |  |  |                            "for %q+D",
 | 
      
         | 1760 |  |  |                            c_addr_space_name (old_addr), newdecl);
 | 
      
         | 1761 |  |  |                   else if (ADDR_SPACE_GENERIC_P (old_addr))
 | 
      
         | 1762 |  |  |                     error ("conflicting named address spaces (%s vs generic) "
 | 
      
         | 1763 |  |  |                            "for %q+D",
 | 
      
         | 1764 |  |  |                            c_addr_space_name (new_addr), newdecl);
 | 
      
         | 1765 |  |  |                   else
 | 
      
         | 1766 |  |  |                     error ("conflicting named address spaces (%s vs %s) "
 | 
      
         | 1767 |  |  |                            "for %q+D",
 | 
      
         | 1768 |  |  |                            c_addr_space_name (new_addr),
 | 
      
         | 1769 |  |  |                            c_addr_space_name (old_addr),
 | 
      
         | 1770 |  |  |                            newdecl);
 | 
      
         | 1771 |  |  |                 }
 | 
      
         | 1772 |  |  |  
 | 
      
         | 1773 |  |  |               if (CLEAR_QUAL_ADDR_SPACE (new_quals)
 | 
      
         | 1774 |  |  |                   != CLEAR_QUAL_ADDR_SPACE (old_quals))
 | 
      
         | 1775 |  |  |                 error ("conflicting type qualifiers for %q+D", newdecl);
 | 
      
         | 1776 |  |  |             }
 | 
      
         | 1777 |  |  |           else
 | 
      
         | 1778 |  |  |             error ("conflicting types for %q+D", newdecl);
 | 
      
         | 1779 |  |  |           diagnose_arglist_conflict (newdecl, olddecl, newtype, oldtype);
 | 
      
         | 1780 |  |  |           locate_old_decl (olddecl);
 | 
      
         | 1781 |  |  |           return false;
 | 
      
         | 1782 |  |  |         }
 | 
      
         | 1783 |  |  |     }
 | 
      
         | 1784 |  |  |  
 | 
      
         | 1785 |  |  |   /* Redeclaration of a type is a constraint violation (6.7.2.3p1),
 | 
      
         | 1786 |  |  |      but silently ignore the redeclaration if either is in a system
 | 
      
         | 1787 |  |  |      header.  (Conflicting redeclarations were handled above.)  This
 | 
      
         | 1788 |  |  |      is allowed for C11 if the types are the same, not just
 | 
      
         | 1789 |  |  |      compatible.  */
 | 
      
         | 1790 |  |  |   if (TREE_CODE (newdecl) == TYPE_DECL)
 | 
      
         | 1791 |  |  |     {
 | 
      
         | 1792 |  |  |       bool types_different = false;
 | 
      
         | 1793 |  |  |       int comptypes_result;
 | 
      
         | 1794 |  |  |  
 | 
      
         | 1795 |  |  |       comptypes_result
 | 
      
         | 1796 |  |  |         = comptypes_check_different_types (oldtype, newtype, &types_different);
 | 
      
         | 1797 |  |  |  
 | 
      
         | 1798 |  |  |       if (comptypes_result != 1 || types_different)
 | 
      
         | 1799 |  |  |         {
 | 
      
         | 1800 |  |  |           error ("redefinition of typedef %q+D with different type", newdecl);
 | 
      
         | 1801 |  |  |           locate_old_decl (olddecl);
 | 
      
         | 1802 |  |  |           return false;
 | 
      
         | 1803 |  |  |         }
 | 
      
         | 1804 |  |  |  
 | 
      
         | 1805 |  |  |       if (DECL_IN_SYSTEM_HEADER (newdecl)
 | 
      
         | 1806 |  |  |           || DECL_IN_SYSTEM_HEADER (olddecl)
 | 
      
         | 1807 |  |  |           || TREE_NO_WARNING (newdecl)
 | 
      
         | 1808 |  |  |           || TREE_NO_WARNING (olddecl))
 | 
      
         | 1809 |  |  |         return true;  /* Allow OLDDECL to continue in use.  */
 | 
      
         | 1810 |  |  |  
 | 
      
         | 1811 |  |  |       if (variably_modified_type_p (newtype, NULL))
 | 
      
         | 1812 |  |  |         {
 | 
      
         | 1813 |  |  |           error ("redefinition of typedef %q+D with variably modified type",
 | 
      
         | 1814 |  |  |                  newdecl);
 | 
      
         | 1815 |  |  |           locate_old_decl (olddecl);
 | 
      
         | 1816 |  |  |         }
 | 
      
         | 1817 |  |  |       else if (pedantic && !flag_isoc11)
 | 
      
         | 1818 |  |  |         {
 | 
      
         | 1819 |  |  |           pedwarn (input_location, OPT_pedantic,
 | 
      
         | 1820 |  |  |                    "redefinition of typedef %q+D", newdecl);
 | 
      
         | 1821 |  |  |           locate_old_decl (olddecl);
 | 
      
         | 1822 |  |  |         }
 | 
      
         | 1823 |  |  |  
 | 
      
         | 1824 |  |  |       return true;
 | 
      
         | 1825 |  |  |     }
 | 
      
         | 1826 |  |  |  
 | 
      
         | 1827 |  |  |   /* Function declarations can either be 'static' or 'extern' (no
 | 
      
         | 1828 |  |  |      qualifier is equivalent to 'extern' - C99 6.2.2p5) and therefore
 | 
      
         | 1829 |  |  |      can never conflict with each other on account of linkage
 | 
      
         | 1830 |  |  |      (6.2.2p4).  Multiple definitions are not allowed (6.9p3,5) but
 | 
      
         | 1831 |  |  |      gnu89 mode permits two definitions if one is 'extern inline' and
 | 
      
         | 1832 |  |  |      one is not.  The non- extern-inline definition supersedes the
 | 
      
         | 1833 |  |  |      extern-inline definition.  */
 | 
      
         | 1834 |  |  |  
 | 
      
         | 1835 |  |  |   else if (TREE_CODE (newdecl) == FUNCTION_DECL)
 | 
      
         | 1836 |  |  |     {
 | 
      
         | 1837 |  |  |       /* If you declare a built-in function name as static, or
 | 
      
         | 1838 |  |  |          define the built-in with an old-style definition (so we
 | 
      
         | 1839 |  |  |          can't validate the argument list) the built-in definition is
 | 
      
         | 1840 |  |  |          overridden, but optionally warn this was a bad choice of name.  */
 | 
      
         | 1841 |  |  |       if (DECL_BUILT_IN (olddecl)
 | 
      
         | 1842 |  |  |           && !C_DECL_DECLARED_BUILTIN (olddecl)
 | 
      
         | 1843 |  |  |           && (!TREE_PUBLIC (newdecl)
 | 
      
         | 1844 |  |  |               || (DECL_INITIAL (newdecl)
 | 
      
         | 1845 |  |  |                   && !prototype_p (TREE_TYPE (newdecl)))))
 | 
      
         | 1846 |  |  |         {
 | 
      
         | 1847 |  |  |           warning (OPT_Wshadow, "declaration of %q+D shadows "
 | 
      
         | 1848 |  |  |                    "a built-in function", newdecl);
 | 
      
         | 1849 |  |  |           /* Discard the old built-in function.  */
 | 
      
         | 1850 |  |  |           return false;
 | 
      
         | 1851 |  |  |         }
 | 
      
         | 1852 |  |  |  
 | 
      
         | 1853 |  |  |       if (DECL_INITIAL (newdecl))
 | 
      
         | 1854 |  |  |         {
 | 
      
         | 1855 |  |  |           if (DECL_INITIAL (olddecl))
 | 
      
         | 1856 |  |  |             {
 | 
      
         | 1857 |  |  |               /* If both decls are in the same TU and the new declaration
 | 
      
         | 1858 |  |  |                  isn't overriding an extern inline reject the new decl.
 | 
      
         | 1859 |  |  |                  In c99, no overriding is allowed in the same translation
 | 
      
         | 1860 |  |  |                  unit.  */
 | 
      
         | 1861 |  |  |               if ((!DECL_EXTERN_INLINE (olddecl)
 | 
      
         | 1862 |  |  |                    || DECL_EXTERN_INLINE (newdecl)
 | 
      
         | 1863 |  |  |                    || (!flag_gnu89_inline
 | 
      
         | 1864 |  |  |                        && (!DECL_DECLARED_INLINE_P (olddecl)
 | 
      
         | 1865 |  |  |                            || !lookup_attribute ("gnu_inline",
 | 
      
         | 1866 |  |  |                                                  DECL_ATTRIBUTES (olddecl)))
 | 
      
         | 1867 |  |  |                        && (!DECL_DECLARED_INLINE_P (newdecl)
 | 
      
         | 1868 |  |  |                            || !lookup_attribute ("gnu_inline",
 | 
      
         | 1869 |  |  |                                                  DECL_ATTRIBUTES (newdecl))))
 | 
      
         | 1870 |  |  |                   )
 | 
      
         | 1871 |  |  |                   && same_translation_unit_p (newdecl, olddecl))
 | 
      
         | 1872 |  |  |                 {
 | 
      
         | 1873 |  |  |                   error ("redefinition of %q+D", newdecl);
 | 
      
         | 1874 |  |  |                   locate_old_decl (olddecl);
 | 
      
         | 1875 |  |  |                   return false;
 | 
      
         | 1876 |  |  |                 }
 | 
      
         | 1877 |  |  |             }
 | 
      
         | 1878 |  |  |         }
 | 
      
         | 1879 |  |  |       /* If we have a prototype after an old-style function definition,
 | 
      
         | 1880 |  |  |          the argument types must be checked specially.  */
 | 
      
         | 1881 |  |  |       else if (DECL_INITIAL (olddecl)
 | 
      
         | 1882 |  |  |                && !prototype_p (oldtype) && prototype_p (newtype)
 | 
      
         | 1883 |  |  |                && TYPE_ACTUAL_ARG_TYPES (oldtype)
 | 
      
         | 1884 |  |  |                && !validate_proto_after_old_defn (newdecl, newtype, oldtype))
 | 
      
         | 1885 |  |  |         {
 | 
      
         | 1886 |  |  |           locate_old_decl (olddecl);
 | 
      
         | 1887 |  |  |           return false;
 | 
      
         | 1888 |  |  |         }
 | 
      
         | 1889 |  |  |       /* A non-static declaration (even an "extern") followed by a
 | 
      
         | 1890 |  |  |          static declaration is undefined behavior per C99 6.2.2p3-5,7.
 | 
      
         | 1891 |  |  |          The same is true for a static forward declaration at block
 | 
      
         | 1892 |  |  |          scope followed by a non-static declaration/definition at file
 | 
      
         | 1893 |  |  |          scope.  Static followed by non-static at the same scope is
 | 
      
         | 1894 |  |  |          not undefined behavior, and is the most convenient way to get
 | 
      
         | 1895 |  |  |          some effects (see e.g.  what unwind-dw2-fde-glibc.c does to
 | 
      
         | 1896 |  |  |          the definition of _Unwind_Find_FDE in unwind-dw2-fde.c), but
 | 
      
         | 1897 |  |  |          we do diagnose it if -Wtraditional.  */
 | 
      
         | 1898 |  |  |       if (TREE_PUBLIC (olddecl) && !TREE_PUBLIC (newdecl))
 | 
      
         | 1899 |  |  |         {
 | 
      
         | 1900 |  |  |           /* Two exceptions to the rule.  If olddecl is an extern
 | 
      
         | 1901 |  |  |              inline, or a predeclared function that isn't actually
 | 
      
         | 1902 |  |  |              built in, newdecl silently overrides olddecl.  The latter
 | 
      
         | 1903 |  |  |              occur only in Objective C; see also above.  (FIXME: Make
 | 
      
         | 1904 |  |  |              Objective C use normal builtins.)  */
 | 
      
         | 1905 |  |  |           if (!DECL_IS_BUILTIN (olddecl)
 | 
      
         | 1906 |  |  |               && !DECL_EXTERN_INLINE (olddecl))
 | 
      
         | 1907 |  |  |             {
 | 
      
         | 1908 |  |  |               error ("static declaration of %q+D follows "
 | 
      
         | 1909 |  |  |                      "non-static declaration", newdecl);
 | 
      
         | 1910 |  |  |               locate_old_decl (olddecl);
 | 
      
         | 1911 |  |  |             }
 | 
      
         | 1912 |  |  |           return false;
 | 
      
         | 1913 |  |  |         }
 | 
      
         | 1914 |  |  |       else if (TREE_PUBLIC (newdecl) && !TREE_PUBLIC (olddecl))
 | 
      
         | 1915 |  |  |         {
 | 
      
         | 1916 |  |  |           if (DECL_CONTEXT (olddecl))
 | 
      
         | 1917 |  |  |             {
 | 
      
         | 1918 |  |  |               error ("non-static declaration of %q+D follows "
 | 
      
         | 1919 |  |  |                      "static declaration", newdecl);
 | 
      
         | 1920 |  |  |               locate_old_decl (olddecl);
 | 
      
         | 1921 |  |  |               return false;
 | 
      
         | 1922 |  |  |             }
 | 
      
         | 1923 |  |  |           else if (warn_traditional)
 | 
      
         | 1924 |  |  |             {
 | 
      
         | 1925 |  |  |               warned |= warning (OPT_Wtraditional,
 | 
      
         | 1926 |  |  |                                  "non-static declaration of %q+D "
 | 
      
         | 1927 |  |  |                                  "follows static declaration", newdecl);
 | 
      
         | 1928 |  |  |             }
 | 
      
         | 1929 |  |  |         }
 | 
      
         | 1930 |  |  |  
 | 
      
         | 1931 |  |  |       /* Make sure gnu_inline attribute is either not present, or
 | 
      
         | 1932 |  |  |          present on all inline decls.  */
 | 
      
         | 1933 |  |  |       if (DECL_DECLARED_INLINE_P (olddecl)
 | 
      
         | 1934 |  |  |           && DECL_DECLARED_INLINE_P (newdecl))
 | 
      
         | 1935 |  |  |         {
 | 
      
         | 1936 |  |  |           bool newa = lookup_attribute ("gnu_inline",
 | 
      
         | 1937 |  |  |                                         DECL_ATTRIBUTES (newdecl)) != NULL;
 | 
      
         | 1938 |  |  |           bool olda = lookup_attribute ("gnu_inline",
 | 
      
         | 1939 |  |  |                                         DECL_ATTRIBUTES (olddecl)) != NULL;
 | 
      
         | 1940 |  |  |           if (newa != olda)
 | 
      
         | 1941 |  |  |             {
 | 
      
         | 1942 |  |  |               error_at (input_location, "%<gnu_inline%> attribute present on %q+D",
 | 
      
         | 1943 |  |  |                         newa ? newdecl : olddecl);
 | 
      
         | 1944 |  |  |               error_at (DECL_SOURCE_LOCATION (newa ? olddecl : newdecl),
 | 
      
         | 1945 |  |  |                         "but not here");
 | 
      
         | 1946 |  |  |             }
 | 
      
         | 1947 |  |  |         }
 | 
      
         | 1948 |  |  |     }
 | 
      
         | 1949 |  |  |   else if (TREE_CODE (newdecl) == VAR_DECL)
 | 
      
         | 1950 |  |  |     {
 | 
      
         | 1951 |  |  |       /* Only variables can be thread-local, and all declarations must
 | 
      
         | 1952 |  |  |          agree on this property.  */
 | 
      
         | 1953 |  |  |       if (C_DECL_THREADPRIVATE_P (olddecl) && !DECL_THREAD_LOCAL_P (newdecl))
 | 
      
         | 1954 |  |  |         {
 | 
      
         | 1955 |  |  |           /* Nothing to check.  Since OLDDECL is marked threadprivate
 | 
      
         | 1956 |  |  |              and NEWDECL does not have a thread-local attribute, we
 | 
      
         | 1957 |  |  |              will merge the threadprivate attribute into NEWDECL.  */
 | 
      
         | 1958 |  |  |           ;
 | 
      
         | 1959 |  |  |         }
 | 
      
         | 1960 |  |  |       else if (DECL_THREAD_LOCAL_P (newdecl) != DECL_THREAD_LOCAL_P (olddecl))
 | 
      
         | 1961 |  |  |         {
 | 
      
         | 1962 |  |  |           if (DECL_THREAD_LOCAL_P (newdecl))
 | 
      
         | 1963 |  |  |             error ("thread-local declaration of %q+D follows "
 | 
      
         | 1964 |  |  |                    "non-thread-local declaration", newdecl);
 | 
      
         | 1965 |  |  |           else
 | 
      
         | 1966 |  |  |             error ("non-thread-local declaration of %q+D follows "
 | 
      
         | 1967 |  |  |                    "thread-local declaration", newdecl);
 | 
      
         | 1968 |  |  |  
 | 
      
         | 1969 |  |  |           locate_old_decl (olddecl);
 | 
      
         | 1970 |  |  |           return false;
 | 
      
         | 1971 |  |  |         }
 | 
      
         | 1972 |  |  |  
 | 
      
         | 1973 |  |  |       /* Multiple initialized definitions are not allowed (6.9p3,5).  */
 | 
      
         | 1974 |  |  |       if (DECL_INITIAL (newdecl) && DECL_INITIAL (olddecl))
 | 
      
         | 1975 |  |  |         {
 | 
      
         | 1976 |  |  |           error ("redefinition of %q+D", newdecl);
 | 
      
         | 1977 |  |  |           locate_old_decl (olddecl);
 | 
      
         | 1978 |  |  |           return false;
 | 
      
         | 1979 |  |  |         }
 | 
      
         | 1980 |  |  |  
 | 
      
         | 1981 |  |  |       /* Objects declared at file scope: if the first declaration had
 | 
      
         | 1982 |  |  |          external linkage (even if it was an external reference) the
 | 
      
         | 1983 |  |  |          second must have external linkage as well, or the behavior is
 | 
      
         | 1984 |  |  |          undefined.  If the first declaration had internal linkage, then
 | 
      
         | 1985 |  |  |          the second must too, or else be an external reference (in which
 | 
      
         | 1986 |  |  |          case the composite declaration still has internal linkage).
 | 
      
         | 1987 |  |  |          As for function declarations, we warn about the static-then-
 | 
      
         | 1988 |  |  |          extern case only for -Wtraditional.  See generally 6.2.2p3-5,7.  */
 | 
      
         | 1989 |  |  |       if (DECL_FILE_SCOPE_P (newdecl)
 | 
      
         | 1990 |  |  |           && TREE_PUBLIC (newdecl) != TREE_PUBLIC (olddecl))
 | 
      
         | 1991 |  |  |         {
 | 
      
         | 1992 |  |  |           if (DECL_EXTERNAL (newdecl))
 | 
      
         | 1993 |  |  |             {
 | 
      
         | 1994 |  |  |               if (!DECL_FILE_SCOPE_P (olddecl))
 | 
      
         | 1995 |  |  |                 {
 | 
      
         | 1996 |  |  |                   error ("extern declaration of %q+D follows "
 | 
      
         | 1997 |  |  |                          "declaration with no linkage", newdecl);
 | 
      
         | 1998 |  |  |                   locate_old_decl (olddecl);
 | 
      
         | 1999 |  |  |                   return false;
 | 
      
         | 2000 |  |  |                 }
 | 
      
         | 2001 |  |  |               else if (warn_traditional)
 | 
      
         | 2002 |  |  |                 {
 | 
      
         | 2003 |  |  |                   warned |= warning (OPT_Wtraditional,
 | 
      
         | 2004 |  |  |                                      "non-static declaration of %q+D "
 | 
      
         | 2005 |  |  |                                      "follows static declaration", newdecl);
 | 
      
         | 2006 |  |  |                 }
 | 
      
         | 2007 |  |  |             }
 | 
      
         | 2008 |  |  |           else
 | 
      
         | 2009 |  |  |             {
 | 
      
         | 2010 |  |  |               if (TREE_PUBLIC (newdecl))
 | 
      
         | 2011 |  |  |                 error ("non-static declaration of %q+D follows "
 | 
      
         | 2012 |  |  |                        "static declaration", newdecl);
 | 
      
         | 2013 |  |  |               else
 | 
      
         | 2014 |  |  |                 error ("static declaration of %q+D follows "
 | 
      
         | 2015 |  |  |                        "non-static declaration", newdecl);
 | 
      
         | 2016 |  |  |  
 | 
      
         | 2017 |  |  |               locate_old_decl (olddecl);
 | 
      
         | 2018 |  |  |               return false;
 | 
      
         | 2019 |  |  |             }
 | 
      
         | 2020 |  |  |         }
 | 
      
         | 2021 |  |  |       /* Two objects with the same name declared at the same block
 | 
      
         | 2022 |  |  |          scope must both be external references (6.7p3).  */
 | 
      
         | 2023 |  |  |       else if (!DECL_FILE_SCOPE_P (newdecl))
 | 
      
         | 2024 |  |  |         {
 | 
      
         | 2025 |  |  |           if (DECL_EXTERNAL (newdecl))
 | 
      
         | 2026 |  |  |             {
 | 
      
         | 2027 |  |  |               /* Extern with initializer at block scope, which will
 | 
      
         | 2028 |  |  |                  already have received an error.  */
 | 
      
         | 2029 |  |  |             }
 | 
      
         | 2030 |  |  |           else if (DECL_EXTERNAL (olddecl))
 | 
      
         | 2031 |  |  |             {
 | 
      
         | 2032 |  |  |               error ("declaration of %q+D with no linkage follows "
 | 
      
         | 2033 |  |  |                      "extern declaration", newdecl);
 | 
      
         | 2034 |  |  |               locate_old_decl (olddecl);
 | 
      
         | 2035 |  |  |             }
 | 
      
         | 2036 |  |  |           else
 | 
      
         | 2037 |  |  |             {
 | 
      
         | 2038 |  |  |               error ("redeclaration of %q+D with no linkage", newdecl);
 | 
      
         | 2039 |  |  |               locate_old_decl (olddecl);
 | 
      
         | 2040 |  |  |             }
 | 
      
         | 2041 |  |  |  
 | 
      
         | 2042 |  |  |           return false;
 | 
      
         | 2043 |  |  |         }
 | 
      
         | 2044 |  |  |  
 | 
      
         | 2045 |  |  |       /* C++ does not permit a decl to appear multiple times at file
 | 
      
         | 2046 |  |  |          scope.  */
 | 
      
         | 2047 |  |  |       if (warn_cxx_compat
 | 
      
         | 2048 |  |  |           && DECL_FILE_SCOPE_P (newdecl)
 | 
      
         | 2049 |  |  |           && !DECL_EXTERNAL (newdecl)
 | 
      
         | 2050 |  |  |           && !DECL_EXTERNAL (olddecl))
 | 
      
         | 2051 |  |  |         warned |= warning_at (DECL_SOURCE_LOCATION (newdecl),
 | 
      
         | 2052 |  |  |                               OPT_Wc___compat,
 | 
      
         | 2053 |  |  |                               ("duplicate declaration of %qD is "
 | 
      
         | 2054 |  |  |                                "invalid in C++"),
 | 
      
         | 2055 |  |  |                               newdecl);
 | 
      
         | 2056 |  |  |     }
 | 
      
         | 2057 |  |  |  
 | 
      
         | 2058 |  |  |   /* warnings */
 | 
      
         | 2059 |  |  |   /* All decls must agree on a visibility.  */
 | 
      
         | 2060 |  |  |   if (CODE_CONTAINS_STRUCT (TREE_CODE (newdecl), TS_DECL_WITH_VIS)
 | 
      
         | 2061 |  |  |       && DECL_VISIBILITY_SPECIFIED (newdecl) && DECL_VISIBILITY_SPECIFIED (olddecl)
 | 
      
         | 2062 |  |  |       && DECL_VISIBILITY (newdecl) != DECL_VISIBILITY (olddecl))
 | 
      
         | 2063 |  |  |     {
 | 
      
         | 2064 |  |  |       warned |= warning (0, "redeclaration of %q+D with different visibility "
 | 
      
         | 2065 |  |  |                          "(old visibility preserved)", newdecl);
 | 
      
         | 2066 |  |  |     }
 | 
      
         | 2067 |  |  |  
 | 
      
         | 2068 |  |  |   if (TREE_CODE (newdecl) == FUNCTION_DECL)
 | 
      
         | 2069 |  |  |     {
 | 
      
         | 2070 |  |  |       /* Diagnose inline __attribute__ ((noinline)) which is silly.  */
 | 
      
         | 2071 |  |  |       if (DECL_DECLARED_INLINE_P (newdecl)
 | 
      
         | 2072 |  |  |           && lookup_attribute ("noinline", DECL_ATTRIBUTES (olddecl)))
 | 
      
         | 2073 |  |  |         {
 | 
      
         | 2074 |  |  |           warned |= warning (OPT_Wattributes,
 | 
      
         | 2075 |  |  |                              "inline declaration of %qD follows "
 | 
      
         | 2076 |  |  |                              "declaration with attribute noinline", newdecl);
 | 
      
         | 2077 |  |  |         }
 | 
      
         | 2078 |  |  |       else if (DECL_DECLARED_INLINE_P (olddecl)
 | 
      
         | 2079 |  |  |                && lookup_attribute ("noinline", DECL_ATTRIBUTES (newdecl)))
 | 
      
         | 2080 |  |  |         {
 | 
      
         | 2081 |  |  |           warned |= warning (OPT_Wattributes,
 | 
      
         | 2082 |  |  |                              "declaration of %q+D with attribute "
 | 
      
         | 2083 |  |  |                              "noinline follows inline declaration ", newdecl);
 | 
      
         | 2084 |  |  |         }
 | 
      
         | 2085 |  |  |     }
 | 
      
         | 2086 |  |  |   else /* PARM_DECL, VAR_DECL */
 | 
      
         | 2087 |  |  |     {
 | 
      
         | 2088 |  |  |       /* Redeclaration of a parameter is a constraint violation (this is
 | 
      
         | 2089 |  |  |          not explicitly stated, but follows from C99 6.7p3 [no more than
 | 
      
         | 2090 |  |  |          one declaration of the same identifier with no linkage in the
 | 
      
         | 2091 |  |  |          same scope, except type tags] and 6.2.2p6 [parameters have no
 | 
      
         | 2092 |  |  |          linkage]).  We must check for a forward parameter declaration,
 | 
      
         | 2093 |  |  |          indicated by TREE_ASM_WRITTEN on the old declaration - this is
 | 
      
         | 2094 |  |  |          an extension, the mandatory diagnostic for which is handled by
 | 
      
         | 2095 |  |  |          mark_forward_parm_decls.  */
 | 
      
         | 2096 |  |  |  
 | 
      
         | 2097 |  |  |       if (TREE_CODE (newdecl) == PARM_DECL
 | 
      
         | 2098 |  |  |           && (!TREE_ASM_WRITTEN (olddecl) || TREE_ASM_WRITTEN (newdecl)))
 | 
      
         | 2099 |  |  |         {
 | 
      
         | 2100 |  |  |           error ("redefinition of parameter %q+D", newdecl);
 | 
      
         | 2101 |  |  |           locate_old_decl (olddecl);
 | 
      
         | 2102 |  |  |           return false;
 | 
      
         | 2103 |  |  |         }
 | 
      
         | 2104 |  |  |     }
 | 
      
         | 2105 |  |  |  
 | 
      
         | 2106 |  |  |   /* Optional warning for completely redundant decls.  */
 | 
      
         | 2107 |  |  |   if (!warned && !pedwarned
 | 
      
         | 2108 |  |  |       && warn_redundant_decls
 | 
      
         | 2109 |  |  |       /* Don't warn about a function declaration followed by a
 | 
      
         | 2110 |  |  |          definition.  */
 | 
      
         | 2111 |  |  |       && !(TREE_CODE (newdecl) == FUNCTION_DECL
 | 
      
         | 2112 |  |  |            && DECL_INITIAL (newdecl) && !DECL_INITIAL (olddecl))
 | 
      
         | 2113 |  |  |       /* Don't warn about redundant redeclarations of builtins.  */
 | 
      
         | 2114 |  |  |       && !(TREE_CODE (newdecl) == FUNCTION_DECL
 | 
      
         | 2115 |  |  |            && !DECL_BUILT_IN (newdecl)
 | 
      
         | 2116 |  |  |            && DECL_BUILT_IN (olddecl)
 | 
      
         | 2117 |  |  |            && !C_DECL_DECLARED_BUILTIN (olddecl))
 | 
      
         | 2118 |  |  |       /* Don't warn about an extern followed by a definition.  */
 | 
      
         | 2119 |  |  |       && !(DECL_EXTERNAL (olddecl) && !DECL_EXTERNAL (newdecl))
 | 
      
         | 2120 |  |  |       /* Don't warn about forward parameter decls.  */
 | 
      
         | 2121 |  |  |       && !(TREE_CODE (newdecl) == PARM_DECL
 | 
      
         | 2122 |  |  |            && TREE_ASM_WRITTEN (olddecl) && !TREE_ASM_WRITTEN (newdecl))
 | 
      
         | 2123 |  |  |       /* Don't warn about a variable definition following a declaration.  */
 | 
      
         | 2124 |  |  |       && !(TREE_CODE (newdecl) == VAR_DECL
 | 
      
         | 2125 |  |  |            && DECL_INITIAL (newdecl) && !DECL_INITIAL (olddecl)))
 | 
      
         | 2126 |  |  |     {
 | 
      
         | 2127 |  |  |       warned = warning (OPT_Wredundant_decls, "redundant redeclaration of %q+D",
 | 
      
         | 2128 |  |  |                         newdecl);
 | 
      
         | 2129 |  |  |     }
 | 
      
         | 2130 |  |  |  
 | 
      
         | 2131 |  |  |   /* Report location of previous decl/defn.  */
 | 
      
         | 2132 |  |  |   if (warned || pedwarned)
 | 
      
         | 2133 |  |  |     locate_old_decl (olddecl);
 | 
      
         | 2134 |  |  |  
 | 
      
         | 2135 |  |  | #undef DECL_EXTERN_INLINE
 | 
      
         | 2136 |  |  |  
 | 
      
         | 2137 |  |  |   return retval;
 | 
      
         | 2138 |  |  | }
 | 
      
         | 2139 |  |  |  
 | 
      
         | 2140 |  |  | /* Subroutine of duplicate_decls.  NEWDECL has been found to be
 | 
      
         | 2141 |  |  |    consistent with OLDDECL, but carries new information.  Merge the
 | 
      
         | 2142 |  |  |    new information into OLDDECL.  This function issues no
 | 
      
         | 2143 |  |  |    diagnostics.  */
 | 
      
         | 2144 |  |  |  
 | 
      
         | 2145 |  |  | static void
 | 
      
         | 2146 |  |  | merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype)
 | 
      
         | 2147 |  |  | {
 | 
      
         | 2148 |  |  |   bool new_is_definition = (TREE_CODE (newdecl) == FUNCTION_DECL
 | 
      
         | 2149 |  |  |                             && DECL_INITIAL (newdecl) != 0);
 | 
      
         | 2150 |  |  |   bool new_is_prototype = (TREE_CODE (newdecl) == FUNCTION_DECL
 | 
      
         | 2151 |  |  |                            && prototype_p (TREE_TYPE (newdecl)));
 | 
      
         | 2152 |  |  |   bool old_is_prototype = (TREE_CODE (olddecl) == FUNCTION_DECL
 | 
      
         | 2153 |  |  |                            && prototype_p (TREE_TYPE (olddecl)));
 | 
      
         | 2154 |  |  |   bool extern_changed = false;
 | 
      
         | 2155 |  |  |  
 | 
      
         | 2156 |  |  |   /* For real parm decl following a forward decl, rechain the old decl
 | 
      
         | 2157 |  |  |      in its new location and clear TREE_ASM_WRITTEN (it's not a
 | 
      
         | 2158 |  |  |      forward decl anymore).  */
 | 
      
         | 2159 |  |  |   if (TREE_CODE (newdecl) == PARM_DECL
 | 
      
         | 2160 |  |  |       && TREE_ASM_WRITTEN (olddecl) && !TREE_ASM_WRITTEN (newdecl))
 | 
      
         | 2161 |  |  |     {
 | 
      
         | 2162 |  |  |       struct c_binding *b, **here;
 | 
      
         | 2163 |  |  |  
 | 
      
         | 2164 |  |  |       for (here = ¤t_scope->bindings; *here; here = &(*here)->prev)
 | 
      
         | 2165 |  |  |         if ((*here)->decl == olddecl)
 | 
      
         | 2166 |  |  |           goto found;
 | 
      
         | 2167 |  |  |       gcc_unreachable ();
 | 
      
         | 2168 |  |  |  
 | 
      
         | 2169 |  |  |     found:
 | 
      
         | 2170 |  |  |       b = *here;
 | 
      
         | 2171 |  |  |       *here = b->prev;
 | 
      
         | 2172 |  |  |       b->prev = current_scope->bindings;
 | 
      
         | 2173 |  |  |       current_scope->bindings = b;
 | 
      
         | 2174 |  |  |  
 | 
      
         | 2175 |  |  |       TREE_ASM_WRITTEN (olddecl) = 0;
 | 
      
         | 2176 |  |  |     }
 | 
      
         | 2177 |  |  |  
 | 
      
         | 2178 |  |  |   DECL_ATTRIBUTES (newdecl)
 | 
      
         | 2179 |  |  |     = targetm.merge_decl_attributes (olddecl, newdecl);
 | 
      
         | 2180 |  |  |  
 | 
      
         | 2181 |  |  |   /* Merge the data types specified in the two decls.  */
 | 
      
         | 2182 |  |  |   TREE_TYPE (newdecl)
 | 
      
         | 2183 |  |  |     = TREE_TYPE (olddecl)
 | 
      
         | 2184 |  |  |     = composite_type (newtype, oldtype);
 | 
      
         | 2185 |  |  |  
 | 
      
         | 2186 |  |  |   /* Lay the type out, unless already done.  */
 | 
      
         | 2187 |  |  |   if (!comptypes (oldtype, TREE_TYPE (newdecl)))
 | 
      
         | 2188 |  |  |     {
 | 
      
         | 2189 |  |  |       if (TREE_TYPE (newdecl) != error_mark_node)
 | 
      
         | 2190 |  |  |         layout_type (TREE_TYPE (newdecl));
 | 
      
         | 2191 |  |  |       if (TREE_CODE (newdecl) != FUNCTION_DECL
 | 
      
         | 2192 |  |  |           && TREE_CODE (newdecl) != TYPE_DECL
 | 
      
         | 2193 |  |  |           && TREE_CODE (newdecl) != CONST_DECL)
 | 
      
         | 2194 |  |  |         layout_decl (newdecl, 0);
 | 
      
         | 2195 |  |  |     }
 | 
      
         | 2196 |  |  |   else
 | 
      
         | 2197 |  |  |     {
 | 
      
         | 2198 |  |  |       /* Since the type is OLDDECL's, make OLDDECL's size go with.  */
 | 
      
         | 2199 |  |  |       DECL_SIZE (newdecl) = DECL_SIZE (olddecl);
 | 
      
         | 2200 |  |  |       DECL_SIZE_UNIT (newdecl) = DECL_SIZE_UNIT (olddecl);
 | 
      
         | 2201 |  |  |       DECL_MODE (newdecl) = DECL_MODE (olddecl);
 | 
      
         | 2202 |  |  |       if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl))
 | 
      
         | 2203 |  |  |         {
 | 
      
         | 2204 |  |  |           DECL_ALIGN (newdecl) = DECL_ALIGN (olddecl);
 | 
      
         | 2205 |  |  |           DECL_USER_ALIGN (newdecl) |= DECL_USER_ALIGN (olddecl);
 | 
      
         | 2206 |  |  |         }
 | 
      
         | 2207 |  |  |     }
 | 
      
         | 2208 |  |  |  
 | 
      
         | 2209 |  |  |   /* Keep the old rtl since we can safely use it.  */
 | 
      
         | 2210 |  |  |   if (HAS_RTL_P (olddecl))
 | 
      
         | 2211 |  |  |     COPY_DECL_RTL (olddecl, newdecl);
 | 
      
         | 2212 |  |  |  
 | 
      
         | 2213 |  |  |   /* Merge the type qualifiers.  */
 | 
      
         | 2214 |  |  |   if (TREE_READONLY (newdecl))
 | 
      
         | 2215 |  |  |     TREE_READONLY (olddecl) = 1;
 | 
      
         | 2216 |  |  |  
 | 
      
         | 2217 |  |  |   if (TREE_THIS_VOLATILE (newdecl))
 | 
      
         | 2218 |  |  |     TREE_THIS_VOLATILE (olddecl) = 1;
 | 
      
         | 2219 |  |  |  
 | 
      
         | 2220 |  |  |   /* Merge deprecatedness.  */
 | 
      
         | 2221 |  |  |   if (TREE_DEPRECATED (newdecl))
 | 
      
         | 2222 |  |  |     TREE_DEPRECATED (olddecl) = 1;
 | 
      
         | 2223 |  |  |  
 | 
      
         | 2224 |  |  |   /* If a decl is in a system header and the other isn't, keep the one on the
 | 
      
         | 2225 |  |  |      system header. Otherwise, keep source location of definition rather than
 | 
      
         | 2226 |  |  |      declaration and of prototype rather than non-prototype unless that
 | 
      
         | 2227 |  |  |      prototype is built-in.  */
 | 
      
         | 2228 |  |  |   if (CODE_CONTAINS_STRUCT (TREE_CODE (olddecl), TS_DECL_WITH_VIS)
 | 
      
         | 2229 |  |  |       && DECL_IN_SYSTEM_HEADER (olddecl)
 | 
      
         | 2230 |  |  |       && !DECL_IN_SYSTEM_HEADER (newdecl) )
 | 
      
         | 2231 |  |  |     DECL_SOURCE_LOCATION (newdecl) = DECL_SOURCE_LOCATION (olddecl);
 | 
      
         | 2232 |  |  |   else if (CODE_CONTAINS_STRUCT (TREE_CODE (olddecl), TS_DECL_WITH_VIS)
 | 
      
         | 2233 |  |  |            && DECL_IN_SYSTEM_HEADER (newdecl)
 | 
      
         | 2234 |  |  |            && !DECL_IN_SYSTEM_HEADER (olddecl))
 | 
      
         | 2235 |  |  |     DECL_SOURCE_LOCATION (olddecl) = DECL_SOURCE_LOCATION (newdecl);
 | 
      
         | 2236 |  |  |   else if ((DECL_INITIAL (newdecl) == 0 && DECL_INITIAL (olddecl) != 0)
 | 
      
         | 2237 |  |  |            || (old_is_prototype && !new_is_prototype
 | 
      
         | 2238 |  |  |                && !C_DECL_BUILTIN_PROTOTYPE (olddecl)))
 | 
      
         | 2239 |  |  |     DECL_SOURCE_LOCATION (newdecl) = DECL_SOURCE_LOCATION (olddecl);
 | 
      
         | 2240 |  |  |  
 | 
      
         | 2241 |  |  |   /* Merge the initialization information.  */
 | 
      
         | 2242 |  |  |    if (DECL_INITIAL (newdecl) == 0)
 | 
      
         | 2243 |  |  |     DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
 | 
      
         | 2244 |  |  |  
 | 
      
         | 2245 |  |  |   /* Merge the threadprivate attribute.  */
 | 
      
         | 2246 |  |  |   if (TREE_CODE (olddecl) == VAR_DECL && C_DECL_THREADPRIVATE_P (olddecl))
 | 
      
         | 2247 |  |  |     {
 | 
      
         | 2248 |  |  |       DECL_TLS_MODEL (newdecl) = DECL_TLS_MODEL (olddecl);
 | 
      
         | 2249 |  |  |       C_DECL_THREADPRIVATE_P (newdecl) = 1;
 | 
      
         | 2250 |  |  |     }
 | 
      
         | 2251 |  |  |  
 | 
      
         | 2252 |  |  |   if (CODE_CONTAINS_STRUCT (TREE_CODE (olddecl), TS_DECL_WITH_VIS))
 | 
      
         | 2253 |  |  |     {
 | 
      
         | 2254 |  |  |       /* Merge the section attribute.
 | 
      
         | 2255 |  |  |          We want to issue an error if the sections conflict but that
 | 
      
         | 2256 |  |  |          must be done later in decl_attributes since we are called
 | 
      
         | 2257 |  |  |          before attributes are assigned.  */
 | 
      
         | 2258 |  |  |       if (DECL_SECTION_NAME (newdecl) == NULL_TREE)
 | 
      
         | 2259 |  |  |         DECL_SECTION_NAME (newdecl) = DECL_SECTION_NAME (olddecl);
 | 
      
         | 2260 |  |  |  
 | 
      
         | 2261 |  |  |       /* Copy the assembler name.
 | 
      
         | 2262 |  |  |          Currently, it can only be defined in the prototype.  */
 | 
      
         | 2263 |  |  |       COPY_DECL_ASSEMBLER_NAME (olddecl, newdecl);
 | 
      
         | 2264 |  |  |  
 | 
      
         | 2265 |  |  |       /* Use visibility of whichever declaration had it specified */
 | 
      
         | 2266 |  |  |       if (DECL_VISIBILITY_SPECIFIED (olddecl))
 | 
      
         | 2267 |  |  |         {
 | 
      
         | 2268 |  |  |           DECL_VISIBILITY (newdecl) = DECL_VISIBILITY (olddecl);
 | 
      
         | 2269 |  |  |           DECL_VISIBILITY_SPECIFIED (newdecl) = 1;
 | 
      
         | 2270 |  |  |         }
 | 
      
         | 2271 |  |  |  
 | 
      
         | 2272 |  |  |       if (TREE_CODE (newdecl) == FUNCTION_DECL)
 | 
      
         | 2273 |  |  |         {
 | 
      
         | 2274 |  |  |           DECL_STATIC_CONSTRUCTOR(newdecl) |= DECL_STATIC_CONSTRUCTOR(olddecl);
 | 
      
         | 2275 |  |  |           DECL_STATIC_DESTRUCTOR (newdecl) |= DECL_STATIC_DESTRUCTOR (olddecl);
 | 
      
         | 2276 |  |  |           DECL_NO_LIMIT_STACK (newdecl) |= DECL_NO_LIMIT_STACK (olddecl);
 | 
      
         | 2277 |  |  |           DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (newdecl)
 | 
      
         | 2278 |  |  |             |= DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (olddecl);
 | 
      
         | 2279 |  |  |           TREE_THIS_VOLATILE (newdecl) |= TREE_THIS_VOLATILE (olddecl);
 | 
      
         | 2280 |  |  |           DECL_IS_MALLOC (newdecl) |= DECL_IS_MALLOC (olddecl);
 | 
      
         | 2281 |  |  |           DECL_IS_OPERATOR_NEW (newdecl) |= DECL_IS_OPERATOR_NEW (olddecl);
 | 
      
         | 2282 |  |  |           TREE_READONLY (newdecl) |= TREE_READONLY (olddecl);
 | 
      
         | 2283 |  |  |           DECL_PURE_P (newdecl) |= DECL_PURE_P (olddecl);
 | 
      
         | 2284 |  |  |           DECL_IS_NOVOPS (newdecl) |= DECL_IS_NOVOPS (olddecl);
 | 
      
         | 2285 |  |  |         }
 | 
      
         | 2286 |  |  |  
 | 
      
         | 2287 |  |  |       /* Merge the storage class information.  */
 | 
      
         | 2288 |  |  |       merge_weak (newdecl, olddecl);
 | 
      
         | 2289 |  |  |  
 | 
      
         | 2290 |  |  |       /* For functions, static overrides non-static.  */
 | 
      
         | 2291 |  |  |       if (TREE_CODE (newdecl) == FUNCTION_DECL)
 | 
      
         | 2292 |  |  |         {
 | 
      
         | 2293 |  |  |           TREE_PUBLIC (newdecl) &= TREE_PUBLIC (olddecl);
 | 
      
         | 2294 |  |  |           /* This is since we don't automatically
 | 
      
         | 2295 |  |  |              copy the attributes of NEWDECL into OLDDECL.  */
 | 
      
         | 2296 |  |  |           TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl);
 | 
      
         | 2297 |  |  |           /* If this clears `static', clear it in the identifier too.  */
 | 
      
         | 2298 |  |  |           if (!TREE_PUBLIC (olddecl))
 | 
      
         | 2299 |  |  |             TREE_PUBLIC (DECL_NAME (olddecl)) = 0;
 | 
      
         | 2300 |  |  |         }
 | 
      
         | 2301 |  |  |     }
 | 
      
         | 2302 |  |  |  
 | 
      
         | 2303 |  |  |   /* In c99, 'extern' declaration before (or after) 'inline' means this
 | 
      
         | 2304 |  |  |      function is not DECL_EXTERNAL, unless 'gnu_inline' attribute
 | 
      
         | 2305 |  |  |      is present.  */
 | 
      
         | 2306 |  |  |   if (TREE_CODE (newdecl) == FUNCTION_DECL
 | 
      
         | 2307 |  |  |       && !flag_gnu89_inline
 | 
      
         | 2308 |  |  |       && (DECL_DECLARED_INLINE_P (newdecl)
 | 
      
         | 2309 |  |  |           || DECL_DECLARED_INLINE_P (olddecl))
 | 
      
         | 2310 |  |  |       && (!DECL_DECLARED_INLINE_P (newdecl)
 | 
      
         | 2311 |  |  |           || !DECL_DECLARED_INLINE_P (olddecl)
 | 
      
         | 2312 |  |  |           || !DECL_EXTERNAL (olddecl))
 | 
      
         | 2313 |  |  |       && DECL_EXTERNAL (newdecl)
 | 
      
         | 2314 |  |  |       && !lookup_attribute ("gnu_inline", DECL_ATTRIBUTES (newdecl))
 | 
      
         | 2315 |  |  |       && !current_function_decl)
 | 
      
         | 2316 |  |  |     DECL_EXTERNAL (newdecl) = 0;
 | 
      
         | 2317 |  |  |  
 | 
      
         | 2318 |  |  |   if (DECL_EXTERNAL (newdecl))
 | 
      
         | 2319 |  |  |     {
 | 
      
         | 2320 |  |  |       TREE_STATIC (newdecl) = TREE_STATIC (olddecl);
 | 
      
         | 2321 |  |  |       DECL_EXTERNAL (newdecl) = DECL_EXTERNAL (olddecl);
 | 
      
         | 2322 |  |  |  
 | 
      
         | 2323 |  |  |       /* An extern decl does not override previous storage class.  */
 | 
      
         | 2324 |  |  |       TREE_PUBLIC (newdecl) = TREE_PUBLIC (olddecl);
 | 
      
         | 2325 |  |  |       if (!DECL_EXTERNAL (newdecl))
 | 
      
         | 2326 |  |  |         {
 | 
      
         | 2327 |  |  |           DECL_CONTEXT (newdecl) = DECL_CONTEXT (olddecl);
 | 
      
         | 2328 |  |  |           DECL_COMMON (newdecl) = DECL_COMMON (olddecl);
 | 
      
         | 2329 |  |  |         }
 | 
      
         | 2330 |  |  |     }
 | 
      
         | 2331 |  |  |   else
 | 
      
         | 2332 |  |  |     {
 | 
      
         | 2333 |  |  |       TREE_STATIC (olddecl) = TREE_STATIC (newdecl);
 | 
      
         | 2334 |  |  |       TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl);
 | 
      
         | 2335 |  |  |     }
 | 
      
         | 2336 |  |  |  
 | 
      
         | 2337 |  |  |   if (TREE_CODE (newdecl) == FUNCTION_DECL)
 | 
      
         | 2338 |  |  |     {
 | 
      
         | 2339 |  |  |       /* If we're redefining a function previously defined as extern
 | 
      
         | 2340 |  |  |          inline, make sure we emit debug info for the inline before we
 | 
      
         | 2341 |  |  |          throw it away, in case it was inlined into a function that
 | 
      
         | 2342 |  |  |          hasn't been written out yet.  */
 | 
      
         | 2343 |  |  |       if (new_is_definition && DECL_INITIAL (olddecl))
 | 
      
         | 2344 |  |  |         /* The new defn must not be inline.  */
 | 
      
         | 2345 |  |  |         DECL_UNINLINABLE (newdecl) = 1;
 | 
      
         | 2346 |  |  |       else
 | 
      
         | 2347 |  |  |         {
 | 
      
         | 2348 |  |  |           /* If either decl says `inline', this fn is inline, unless
 | 
      
         | 2349 |  |  |              its definition was passed already.  */
 | 
      
         | 2350 |  |  |           if (DECL_DECLARED_INLINE_P (newdecl)
 | 
      
         | 2351 |  |  |               || DECL_DECLARED_INLINE_P (olddecl))
 | 
      
         | 2352 |  |  |             DECL_DECLARED_INLINE_P (newdecl) = 1;
 | 
      
         | 2353 |  |  |  
 | 
      
         | 2354 |  |  |           DECL_UNINLINABLE (newdecl) = DECL_UNINLINABLE (olddecl)
 | 
      
         | 2355 |  |  |             = (DECL_UNINLINABLE (newdecl) || DECL_UNINLINABLE (olddecl));
 | 
      
         | 2356 |  |  |  
 | 
      
         | 2357 |  |  |           DECL_DISREGARD_INLINE_LIMITS (newdecl)
 | 
      
         | 2358 |  |  |             = DECL_DISREGARD_INLINE_LIMITS (olddecl)
 | 
      
         | 2359 |  |  |             = (DECL_DISREGARD_INLINE_LIMITS (newdecl)
 | 
      
         | 2360 |  |  |                || DECL_DISREGARD_INLINE_LIMITS (olddecl));
 | 
      
         | 2361 |  |  |         }
 | 
      
         | 2362 |  |  |  
 | 
      
         | 2363 |  |  |       if (DECL_BUILT_IN (olddecl))
 | 
      
         | 2364 |  |  |         {
 | 
      
         | 2365 |  |  |           /* If redeclaring a builtin function, it stays built in.
 | 
      
         | 2366 |  |  |              But it gets tagged as having been declared.  */
 | 
      
         | 2367 |  |  |           DECL_BUILT_IN_CLASS (newdecl) = DECL_BUILT_IN_CLASS (olddecl);
 | 
      
         | 2368 |  |  |           DECL_FUNCTION_CODE (newdecl) = DECL_FUNCTION_CODE (olddecl);
 | 
      
         | 2369 |  |  |           C_DECL_DECLARED_BUILTIN (newdecl) = 1;
 | 
      
         | 2370 |  |  |           if (new_is_prototype)
 | 
      
         | 2371 |  |  |             {
 | 
      
         | 2372 |  |  |               C_DECL_BUILTIN_PROTOTYPE (newdecl) = 0;
 | 
      
         | 2373 |  |  |               if (DECL_BUILT_IN_CLASS (newdecl) == BUILT_IN_NORMAL)
 | 
      
         | 2374 |  |  |                 {
 | 
      
         | 2375 |  |  |                   enum built_in_function fncode = DECL_FUNCTION_CODE (newdecl);
 | 
      
         | 2376 |  |  |                   switch (fncode)
 | 
      
         | 2377 |  |  |                     {
 | 
      
         | 2378 |  |  |                       /* If a compatible prototype of these builtin functions
 | 
      
         | 2379 |  |  |                          is seen, assume the runtime implements it with the
 | 
      
         | 2380 |  |  |                          expected semantics.  */
 | 
      
         | 2381 |  |  |                     case BUILT_IN_STPCPY:
 | 
      
         | 2382 |  |  |                       if (builtin_decl_explicit_p (fncode))
 | 
      
         | 2383 |  |  |                         set_builtin_decl_implicit_p (fncode, true);
 | 
      
         | 2384 |  |  |                       break;
 | 
      
         | 2385 |  |  |                     default:
 | 
      
         | 2386 |  |  |                       break;
 | 
      
         | 2387 |  |  |                     }
 | 
      
         | 2388 |  |  |                 }
 | 
      
         | 2389 |  |  |             }
 | 
      
         | 2390 |  |  |           else
 | 
      
         | 2391 |  |  |             C_DECL_BUILTIN_PROTOTYPE (newdecl)
 | 
      
         | 2392 |  |  |               = C_DECL_BUILTIN_PROTOTYPE (olddecl);
 | 
      
         | 2393 |  |  |         }
 | 
      
         | 2394 |  |  |  
 | 
      
         | 2395 |  |  |       /* Preserve function specific target and optimization options */
 | 
      
         | 2396 |  |  |       if (DECL_FUNCTION_SPECIFIC_TARGET (olddecl)
 | 
      
         | 2397 |  |  |           && !DECL_FUNCTION_SPECIFIC_TARGET (newdecl))
 | 
      
         | 2398 |  |  |         DECL_FUNCTION_SPECIFIC_TARGET (newdecl)
 | 
      
         | 2399 |  |  |           = DECL_FUNCTION_SPECIFIC_TARGET (olddecl);
 | 
      
         | 2400 |  |  |  
 | 
      
         | 2401 |  |  |       if (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (olddecl)
 | 
      
         | 2402 |  |  |           && !DECL_FUNCTION_SPECIFIC_OPTIMIZATION (newdecl))
 | 
      
         | 2403 |  |  |         DECL_FUNCTION_SPECIFIC_OPTIMIZATION (newdecl)
 | 
      
         | 2404 |  |  |           = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (olddecl);
 | 
      
         | 2405 |  |  |  
 | 
      
         | 2406 |  |  |       /* Also preserve various other info from the definition.  */
 | 
      
         | 2407 |  |  |       if (!new_is_definition)
 | 
      
         | 2408 |  |  |         {
 | 
      
         | 2409 |  |  |           tree t;
 | 
      
         | 2410 |  |  |           DECL_RESULT (newdecl) = DECL_RESULT (olddecl);
 | 
      
         | 2411 |  |  |           DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
 | 
      
         | 2412 |  |  |           DECL_STRUCT_FUNCTION (newdecl) = DECL_STRUCT_FUNCTION (olddecl);
 | 
      
         | 2413 |  |  |           DECL_SAVED_TREE (newdecl) = DECL_SAVED_TREE (olddecl);
 | 
      
         | 2414 |  |  |           DECL_ARGUMENTS (newdecl) = copy_list (DECL_ARGUMENTS (olddecl));
 | 
      
         | 2415 |  |  |           for (t = DECL_ARGUMENTS (newdecl); t ; t = DECL_CHAIN (t))
 | 
      
         | 2416 |  |  |             DECL_CONTEXT (t) = newdecl;
 | 
      
         | 2417 |  |  |  
 | 
      
         | 2418 |  |  |           /* See if we've got a function to instantiate from.  */
 | 
      
         | 2419 |  |  |           if (DECL_SAVED_TREE (olddecl))
 | 
      
         | 2420 |  |  |             DECL_ABSTRACT_ORIGIN (newdecl)
 | 
      
         | 2421 |  |  |               = DECL_ABSTRACT_ORIGIN (olddecl);
 | 
      
         | 2422 |  |  |         }
 | 
      
         | 2423 |  |  |     }
 | 
      
         | 2424 |  |  |  
 | 
      
         | 2425 |  |  |   extern_changed = DECL_EXTERNAL (olddecl) && !DECL_EXTERNAL (newdecl);
 | 
      
         | 2426 |  |  |  
 | 
      
         | 2427 |  |  |   /* Merge the USED information.  */
 | 
      
         | 2428 |  |  |   if (TREE_USED (olddecl))
 | 
      
         | 2429 |  |  |     TREE_USED (newdecl) = 1;
 | 
      
         | 2430 |  |  |   else if (TREE_USED (newdecl))
 | 
      
         | 2431 |  |  |     TREE_USED (olddecl) = 1;
 | 
      
         | 2432 |  |  |   if (TREE_CODE (olddecl) == VAR_DECL || TREE_CODE (olddecl) == PARM_DECL)
 | 
      
         | 2433 |  |  |     DECL_READ_P (newdecl) |= DECL_READ_P (olddecl);
 | 
      
         | 2434 |  |  |   if (DECL_PRESERVE_P (olddecl))
 | 
      
         | 2435 |  |  |     DECL_PRESERVE_P (newdecl) = 1;
 | 
      
         | 2436 |  |  |   else if (DECL_PRESERVE_P (newdecl))
 | 
      
         | 2437 |  |  |     DECL_PRESERVE_P (olddecl) = 1;
 | 
      
         | 2438 |  |  |  
 | 
      
         | 2439 |  |  |   /* Copy most of the decl-specific fields of NEWDECL into OLDDECL.
 | 
      
         | 2440 |  |  |      But preserve OLDDECL's DECL_UID, DECL_CONTEXT and
 | 
      
         | 2441 |  |  |      DECL_ARGUMENTS (if appropriate).  */
 | 
      
         | 2442 |  |  |   {
 | 
      
         | 2443 |  |  |     unsigned olddecl_uid = DECL_UID (olddecl);
 | 
      
         | 2444 |  |  |     tree olddecl_context = DECL_CONTEXT (olddecl);
 | 
      
         | 2445 |  |  |     tree olddecl_arguments = NULL;
 | 
      
         | 2446 |  |  |     if (TREE_CODE (olddecl) == FUNCTION_DECL)
 | 
      
         | 2447 |  |  |       olddecl_arguments = DECL_ARGUMENTS (olddecl);
 | 
      
         | 2448 |  |  |  
 | 
      
         | 2449 |  |  |     memcpy ((char *) olddecl + sizeof (struct tree_common),
 | 
      
         | 2450 |  |  |             (char *) newdecl + sizeof (struct tree_common),
 | 
      
         | 2451 |  |  |             sizeof (struct tree_decl_common) - sizeof (struct tree_common));
 | 
      
         | 2452 |  |  |     DECL_USER_ALIGN (olddecl) = DECL_USER_ALIGN (newdecl);
 | 
      
         | 2453 |  |  |     switch (TREE_CODE (olddecl))
 | 
      
         | 2454 |  |  |       {
 | 
      
         | 2455 |  |  |       case FUNCTION_DECL:
 | 
      
         | 2456 |  |  |       case FIELD_DECL:
 | 
      
         | 2457 |  |  |       case VAR_DECL:
 | 
      
         | 2458 |  |  |       case PARM_DECL:
 | 
      
         | 2459 |  |  |       case LABEL_DECL:
 | 
      
         | 2460 |  |  |       case RESULT_DECL:
 | 
      
         | 2461 |  |  |       case CONST_DECL:
 | 
      
         | 2462 |  |  |       case TYPE_DECL:
 | 
      
         | 2463 |  |  |         memcpy ((char *) olddecl + sizeof (struct tree_decl_common),
 | 
      
         | 2464 |  |  |                 (char *) newdecl + sizeof (struct tree_decl_common),
 | 
      
         | 2465 |  |  |                 tree_code_size (TREE_CODE (olddecl)) - sizeof (struct tree_decl_common));
 | 
      
         | 2466 |  |  |         break;
 | 
      
         | 2467 |  |  |  
 | 
      
         | 2468 |  |  |       default:
 | 
      
         | 2469 |  |  |  
 | 
      
         | 2470 |  |  |         memcpy ((char *) olddecl + sizeof (struct tree_decl_common),
 | 
      
         | 2471 |  |  |                 (char *) newdecl + sizeof (struct tree_decl_common),
 | 
      
         | 2472 |  |  |                 sizeof (struct tree_decl_non_common) - sizeof (struct tree_decl_common));
 | 
      
         | 2473 |  |  |       }
 | 
      
         | 2474 |  |  |     DECL_UID (olddecl) = olddecl_uid;
 | 
      
         | 2475 |  |  |     DECL_CONTEXT (olddecl) = olddecl_context;
 | 
      
         | 2476 |  |  |     if (TREE_CODE (olddecl) == FUNCTION_DECL)
 | 
      
         | 2477 |  |  |       DECL_ARGUMENTS (olddecl) = olddecl_arguments;
 | 
      
         | 2478 |  |  |   }
 | 
      
         | 2479 |  |  |  
 | 
      
         | 2480 |  |  |   /* If OLDDECL had its DECL_RTL instantiated, re-invoke make_decl_rtl
 | 
      
         | 2481 |  |  |      so that encode_section_info has a chance to look at the new decl
 | 
      
         | 2482 |  |  |      flags and attributes.  */
 | 
      
         | 2483 |  |  |   if (DECL_RTL_SET_P (olddecl)
 | 
      
         | 2484 |  |  |       && (TREE_CODE (olddecl) == FUNCTION_DECL
 | 
      
         | 2485 |  |  |           || (TREE_CODE (olddecl) == VAR_DECL
 | 
      
         | 2486 |  |  |               && TREE_STATIC (olddecl))))
 | 
      
         | 2487 |  |  |     make_decl_rtl (olddecl);
 | 
      
         | 2488 |  |  |  
 | 
      
         | 2489 |  |  |   /* If we changed a function from DECL_EXTERNAL to !DECL_EXTERNAL,
 | 
      
         | 2490 |  |  |      and the definition is coming from the old version, cgraph needs
 | 
      
         | 2491 |  |  |      to be called again.  */
 | 
      
         | 2492 |  |  |   if (extern_changed && !new_is_definition
 | 
      
         | 2493 |  |  |       && TREE_CODE (olddecl) == FUNCTION_DECL && DECL_INITIAL (olddecl))
 | 
      
         | 2494 |  |  |     cgraph_mark_if_needed (olddecl);
 | 
      
         | 2495 |  |  | }
 | 
      
         | 2496 |  |  |  
 | 
      
         | 2497 |  |  | /* Handle when a new declaration NEWDECL has the same name as an old
 | 
      
         | 2498 |  |  |    one OLDDECL in the same binding contour.  Prints an error message
 | 
      
         | 2499 |  |  |    if appropriate.
 | 
      
         | 2500 |  |  |  
 | 
      
         | 2501 |  |  |    If safely possible, alter OLDDECL to look like NEWDECL, and return
 | 
      
         | 2502 |  |  |    true.  Otherwise, return false.  */
 | 
      
         | 2503 |  |  |  
 | 
      
         | 2504 |  |  | static bool
 | 
      
         | 2505 |  |  | duplicate_decls (tree newdecl, tree olddecl)
 | 
      
         | 2506 |  |  | {
 | 
      
         | 2507 |  |  |   tree newtype = NULL, oldtype = NULL;
 | 
      
         | 2508 |  |  |  
 | 
      
         | 2509 |  |  |   if (!diagnose_mismatched_decls (newdecl, olddecl, &newtype, &oldtype))
 | 
      
         | 2510 |  |  |     {
 | 
      
         | 2511 |  |  |       /* Avoid `unused variable' and other warnings for OLDDECL.  */
 | 
      
         | 2512 |  |  |       TREE_NO_WARNING (olddecl) = 1;
 | 
      
         | 2513 |  |  |       return false;
 | 
      
         | 2514 |  |  |     }
 | 
      
         | 2515 |  |  |  
 | 
      
         | 2516 |  |  |   merge_decls (newdecl, olddecl, newtype, oldtype);
 | 
      
         | 2517 |  |  |   return true;
 | 
      
         | 2518 |  |  | }
 | 
      
         | 2519 |  |  |  
 | 
      
         | 2520 |  |  |  
 | 
      
         | 2521 |  |  | /* Check whether decl-node NEW_DECL shadows an existing declaration.  */
 | 
      
         | 2522 |  |  | static void
 | 
      
         | 2523 |  |  | warn_if_shadowing (tree new_decl)
 | 
      
         | 2524 |  |  | {
 | 
      
         | 2525 |  |  |   struct c_binding *b;
 | 
      
         | 2526 |  |  |  
 | 
      
         | 2527 |  |  |   /* Shadow warnings wanted?  */
 | 
      
         | 2528 |  |  |   if (!warn_shadow
 | 
      
         | 2529 |  |  |       /* No shadow warnings for internally generated vars.  */
 | 
      
         | 2530 |  |  |       || DECL_IS_BUILTIN (new_decl)
 | 
      
         | 2531 |  |  |       /* No shadow warnings for vars made for inlining.  */
 | 
      
         | 2532 |  |  |       || DECL_FROM_INLINE (new_decl))
 | 
      
         | 2533 |  |  |     return;
 | 
      
         | 2534 |  |  |  
 | 
      
         | 2535 |  |  |   /* Is anything being shadowed?  Invisible decls do not count.  */
 | 
      
         | 2536 |  |  |   for (b = I_SYMBOL_BINDING (DECL_NAME (new_decl)); b; b = b->shadowed)
 | 
      
         | 2537 |  |  |     if (b->decl && b->decl != new_decl && !b->invisible
 | 
      
         | 2538 |  |  |         && (b->decl == error_mark_node
 | 
      
         | 2539 |  |  |             || diagnostic_report_warnings_p (global_dc,
 | 
      
         | 2540 |  |  |                                              DECL_SOURCE_LOCATION (b->decl))))
 | 
      
         | 2541 |  |  |       {
 | 
      
         | 2542 |  |  |         tree old_decl = b->decl;
 | 
      
         | 2543 |  |  |  
 | 
      
         | 2544 |  |  |         if (old_decl == error_mark_node)
 | 
      
         | 2545 |  |  |           {
 | 
      
         | 2546 |  |  |             warning (OPT_Wshadow, "declaration of %q+D shadows previous "
 | 
      
         | 2547 |  |  |                      "non-variable", new_decl);
 | 
      
         | 2548 |  |  |             break;
 | 
      
         | 2549 |  |  |           }
 | 
      
         | 2550 |  |  |         else if (TREE_CODE (old_decl) == PARM_DECL)
 | 
      
         | 2551 |  |  |           warning (OPT_Wshadow, "declaration of %q+D shadows a parameter",
 | 
      
         | 2552 |  |  |                    new_decl);
 | 
      
         | 2553 |  |  |         else if (DECL_FILE_SCOPE_P (old_decl))
 | 
      
         | 2554 |  |  |           warning (OPT_Wshadow, "declaration of %q+D shadows a global "
 | 
      
         | 2555 |  |  |                    "declaration", new_decl);
 | 
      
         | 2556 |  |  |         else if (TREE_CODE (old_decl) == FUNCTION_DECL
 | 
      
         | 2557 |  |  |                  && DECL_BUILT_IN (old_decl))
 | 
      
         | 2558 |  |  |           {
 | 
      
         | 2559 |  |  |             warning (OPT_Wshadow, "declaration of %q+D shadows "
 | 
      
         | 2560 |  |  |                      "a built-in function", new_decl);
 | 
      
         | 2561 |  |  |             break;
 | 
      
         | 2562 |  |  |           }
 | 
      
         | 2563 |  |  |         else
 | 
      
         | 2564 |  |  |           warning (OPT_Wshadow, "declaration of %q+D shadows a previous local",
 | 
      
         | 2565 |  |  |                    new_decl);
 | 
      
         | 2566 |  |  |  
 | 
      
         | 2567 |  |  |         warning_at (DECL_SOURCE_LOCATION (old_decl), OPT_Wshadow,
 | 
      
         | 2568 |  |  |                     "shadowed declaration is here");
 | 
      
         | 2569 |  |  |  
 | 
      
         | 2570 |  |  |         break;
 | 
      
         | 2571 |  |  |       }
 | 
      
         | 2572 |  |  | }
 | 
      
         | 2573 |  |  |  
 | 
      
         | 2574 |  |  | /* Record a decl-node X as belonging to the current lexical scope.
 | 
      
         | 2575 |  |  |    Check for errors (such as an incompatible declaration for the same
 | 
      
         | 2576 |  |  |    name already seen in the same scope).
 | 
      
         | 2577 |  |  |  
 | 
      
         | 2578 |  |  |    Returns either X or an old decl for the same name.
 | 
      
         | 2579 |  |  |    If an old decl is returned, it may have been smashed
 | 
      
         | 2580 |  |  |    to agree with what X says.  */
 | 
      
         | 2581 |  |  |  
 | 
      
         | 2582 |  |  | tree
 | 
      
         | 2583 |  |  | pushdecl (tree x)
 | 
      
         | 2584 |  |  | {
 | 
      
         | 2585 |  |  |   tree name = DECL_NAME (x);
 | 
      
         | 2586 |  |  |   struct c_scope *scope = current_scope;
 | 
      
         | 2587 |  |  |   struct c_binding *b;
 | 
      
         | 2588 |  |  |   bool nested = false;
 | 
      
         | 2589 |  |  |   location_t locus = DECL_SOURCE_LOCATION (x);
 | 
      
         | 2590 |  |  |  
 | 
      
         | 2591 |  |  |   /* Must set DECL_CONTEXT for everything not at file scope or
 | 
      
         | 2592 |  |  |      DECL_FILE_SCOPE_P won't work.  Local externs don't count
 | 
      
         | 2593 |  |  |      unless they have initializers (which generate code).  */
 | 
      
         | 2594 |  |  |   if (current_function_decl
 | 
      
         | 2595 |  |  |       && ((TREE_CODE (x) != FUNCTION_DECL && TREE_CODE (x) != VAR_DECL)
 | 
      
         | 2596 |  |  |           || DECL_INITIAL (x) || !DECL_EXTERNAL (x)))
 | 
      
         | 2597 |  |  |     DECL_CONTEXT (x) = current_function_decl;
 | 
      
         | 2598 |  |  |  
 | 
      
         | 2599 |  |  |   /* Anonymous decls are just inserted in the scope.  */
 | 
      
         | 2600 |  |  |   if (!name)
 | 
      
         | 2601 |  |  |     {
 | 
      
         | 2602 |  |  |       bind (name, x, scope, /*invisible=*/false, /*nested=*/false,
 | 
      
         | 2603 |  |  |             locus);
 | 
      
         | 2604 |  |  |       return x;
 | 
      
         | 2605 |  |  |     }
 | 
      
         | 2606 |  |  |  
 | 
      
         | 2607 |  |  |   /* First, see if there is another declaration with the same name in
 | 
      
         | 2608 |  |  |      the current scope.  If there is, duplicate_decls may do all the
 | 
      
         | 2609 |  |  |      work for us.  If duplicate_decls returns false, that indicates
 | 
      
         | 2610 |  |  |      two incompatible decls in the same scope; we are to silently
 | 
      
         | 2611 |  |  |      replace the old one (duplicate_decls has issued all appropriate
 | 
      
         | 2612 |  |  |      diagnostics).  In particular, we should not consider possible
 | 
      
         | 2613 |  |  |      duplicates in the external scope, or shadowing.  */
 | 
      
         | 2614 |  |  |   b = I_SYMBOL_BINDING (name);
 | 
      
         | 2615 |  |  |   if (b && B_IN_SCOPE (b, scope))
 | 
      
         | 2616 |  |  |     {
 | 
      
         | 2617 |  |  |       struct c_binding *b_ext, *b_use;
 | 
      
         | 2618 |  |  |       tree type = TREE_TYPE (x);
 | 
      
         | 2619 |  |  |       tree visdecl = b->decl;
 | 
      
         | 2620 |  |  |       tree vistype = TREE_TYPE (visdecl);
 | 
      
         | 2621 |  |  |       if (TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE
 | 
      
         | 2622 |  |  |           && COMPLETE_TYPE_P (TREE_TYPE (x)))
 | 
      
         | 2623 |  |  |         b->inner_comp = false;
 | 
      
         | 2624 |  |  |       b_use = b;
 | 
      
         | 2625 |  |  |       b_ext = b;
 | 
      
         | 2626 |  |  |       /* If this is an external linkage declaration, we should check
 | 
      
         | 2627 |  |  |          for compatibility with the type in the external scope before
 | 
      
         | 2628 |  |  |          setting the type at this scope based on the visible
 | 
      
         | 2629 |  |  |          information only.  */
 | 
      
         | 2630 |  |  |       if (TREE_PUBLIC (x) && TREE_PUBLIC (visdecl))
 | 
      
         | 2631 |  |  |         {
 | 
      
         | 2632 |  |  |           while (b_ext && !B_IN_EXTERNAL_SCOPE (b_ext))
 | 
      
         | 2633 |  |  |             b_ext = b_ext->shadowed;
 | 
      
         | 2634 |  |  |           if (b_ext)
 | 
      
         | 2635 |  |  |             {
 | 
      
         | 2636 |  |  |               b_use = b_ext;
 | 
      
         | 2637 |  |  |               if (b_use->u.type)
 | 
      
         | 2638 |  |  |                 TREE_TYPE (b_use->decl) = b_use->u.type;
 | 
      
         | 2639 |  |  |             }
 | 
      
         | 2640 |  |  |         }
 | 
      
         | 2641 |  |  |       if (duplicate_decls (x, b_use->decl))
 | 
      
         | 2642 |  |  |         {
 | 
      
         | 2643 |  |  |           if (b_use != b)
 | 
      
         | 2644 |  |  |             {
 | 
      
         | 2645 |  |  |               /* Save the updated type in the external scope and
 | 
      
         | 2646 |  |  |                  restore the proper type for this scope.  */
 | 
      
         | 2647 |  |  |               tree thistype;
 | 
      
         | 2648 |  |  |               if (comptypes (vistype, type))
 | 
      
         | 2649 |  |  |                 thistype = composite_type (vistype, type);
 | 
      
         | 2650 |  |  |               else
 | 
      
         | 2651 |  |  |                 thistype = TREE_TYPE (b_use->decl);
 | 
      
         | 2652 |  |  |               b_use->u.type = TREE_TYPE (b_use->decl);
 | 
      
         | 2653 |  |  |               if (TREE_CODE (b_use->decl) == FUNCTION_DECL
 | 
      
         | 2654 |  |  |                   && DECL_BUILT_IN (b_use->decl))
 | 
      
         | 2655 |  |  |                 thistype
 | 
      
         | 2656 |  |  |                   = build_type_attribute_variant (thistype,
 | 
      
         | 2657 |  |  |                                                   TYPE_ATTRIBUTES
 | 
      
         | 2658 |  |  |                                                   (b_use->u.type));
 | 
      
         | 2659 |  |  |               TREE_TYPE (b_use->decl) = thistype;
 | 
      
         | 2660 |  |  |             }
 | 
      
         | 2661 |  |  |           return b_use->decl;
 | 
      
         | 2662 |  |  |         }
 | 
      
         | 2663 |  |  |       else
 | 
      
         | 2664 |  |  |         goto skip_external_and_shadow_checks;
 | 
      
         | 2665 |  |  |     }
 | 
      
         | 2666 |  |  |  
 | 
      
         | 2667 |  |  |   /* All declarations with external linkage, and all external
 | 
      
         | 2668 |  |  |      references, go in the external scope, no matter what scope is
 | 
      
         | 2669 |  |  |      current.  However, the binding in that scope is ignored for
 | 
      
         | 2670 |  |  |      purposes of normal name lookup.  A separate binding structure is
 | 
      
         | 2671 |  |  |      created in the requested scope; this governs the normal
 | 
      
         | 2672 |  |  |      visibility of the symbol.
 | 
      
         | 2673 |  |  |  
 | 
      
         | 2674 |  |  |      The binding in the externals scope is used exclusively for
 | 
      
         | 2675 |  |  |      detecting duplicate declarations of the same object, no matter
 | 
      
         | 2676 |  |  |      what scope they are in; this is what we do here.  (C99 6.2.7p2:
 | 
      
         | 2677 |  |  |      All declarations that refer to the same object or function shall
 | 
      
         | 2678 |  |  |      have compatible type; otherwise, the behavior is undefined.)  */
 | 
      
         | 2679 |  |  |   if (DECL_EXTERNAL (x) || scope == file_scope)
 | 
      
         | 2680 |  |  |     {
 | 
      
         | 2681 |  |  |       tree type = TREE_TYPE (x);
 | 
      
         | 2682 |  |  |       tree vistype = 0;
 | 
      
         | 2683 |  |  |       tree visdecl = 0;
 | 
      
         | 2684 |  |  |       bool type_saved = false;
 | 
      
         | 2685 |  |  |       if (b && !B_IN_EXTERNAL_SCOPE (b)
 | 
      
         | 2686 |  |  |           && (TREE_CODE (b->decl) == FUNCTION_DECL
 | 
      
         | 2687 |  |  |               || TREE_CODE (b->decl) == VAR_DECL)
 | 
      
         | 2688 |  |  |           && DECL_FILE_SCOPE_P (b->decl))
 | 
      
         | 2689 |  |  |         {
 | 
      
         | 2690 |  |  |           visdecl = b->decl;
 | 
      
         | 2691 |  |  |           vistype = TREE_TYPE (visdecl);
 | 
      
         | 2692 |  |  |         }
 | 
      
         | 2693 |  |  |       if (scope != file_scope
 | 
      
         | 2694 |  |  |           && !DECL_IN_SYSTEM_HEADER (x))
 | 
      
         | 2695 |  |  |         warning (OPT_Wnested_externs, "nested extern declaration of %qD", x);
 | 
      
         | 2696 |  |  |  
 | 
      
         | 2697 |  |  |       while (b && !B_IN_EXTERNAL_SCOPE (b))
 | 
      
         | 2698 |  |  |         {
 | 
      
         | 2699 |  |  |           /* If this decl might be modified, save its type.  This is
 | 
      
         | 2700 |  |  |              done here rather than when the decl is first bound
 | 
      
         | 2701 |  |  |              because the type may change after first binding, through
 | 
      
         | 2702 |  |  |              being completed or through attributes being added.  If we
 | 
      
         | 2703 |  |  |              encounter multiple such decls, only the first should have
 | 
      
         | 2704 |  |  |              its type saved; the others will already have had their
 | 
      
         | 2705 |  |  |              proper types saved and the types will not have changed as
 | 
      
         | 2706 |  |  |              their scopes will not have been re-entered.  */
 | 
      
         | 2707 |  |  |           if (DECL_P (b->decl) && DECL_FILE_SCOPE_P (b->decl) && !type_saved)
 | 
      
         | 2708 |  |  |             {
 | 
      
         | 2709 |  |  |               b->u.type = TREE_TYPE (b->decl);
 | 
      
         | 2710 |  |  |               type_saved = true;
 | 
      
         | 2711 |  |  |             }
 | 
      
         | 2712 |  |  |           if (B_IN_FILE_SCOPE (b)
 | 
      
         | 2713 |  |  |               && TREE_CODE (b->decl) == VAR_DECL
 | 
      
         | 2714 |  |  |               && TREE_STATIC (b->decl)
 | 
      
         | 2715 |  |  |               && TREE_CODE (TREE_TYPE (b->decl)) == ARRAY_TYPE
 | 
      
         | 2716 |  |  |               && !TYPE_DOMAIN (TREE_TYPE (b->decl))
 | 
      
         | 2717 |  |  |               && TREE_CODE (type) == ARRAY_TYPE
 | 
      
         | 2718 |  |  |               && TYPE_DOMAIN (type)
 | 
      
         | 2719 |  |  |               && TYPE_MAX_VALUE (TYPE_DOMAIN (type))
 | 
      
         | 2720 |  |  |               && !integer_zerop (TYPE_MAX_VALUE (TYPE_DOMAIN (type))))
 | 
      
         | 2721 |  |  |             {
 | 
      
         | 2722 |  |  |               /* Array type completed in inner scope, which should be
 | 
      
         | 2723 |  |  |                  diagnosed if the completion does not have size 1 and
 | 
      
         | 2724 |  |  |                  it does not get completed in the file scope.  */
 | 
      
         | 2725 |  |  |               b->inner_comp = true;
 | 
      
         | 2726 |  |  |             }
 | 
      
         | 2727 |  |  |           b = b->shadowed;
 | 
      
         | 2728 |  |  |         }
 | 
      
         | 2729 |  |  |  
 | 
      
         | 2730 |  |  |       /* If a matching external declaration has been found, set its
 | 
      
         | 2731 |  |  |          type to the composite of all the types of that declaration.
 | 
      
         | 2732 |  |  |          After the consistency checks, it will be reset to the
 | 
      
         | 2733 |  |  |          composite of the visible types only.  */
 | 
      
         | 2734 |  |  |       if (b && (TREE_PUBLIC (x) || same_translation_unit_p (x, b->decl))
 | 
      
         | 2735 |  |  |           && b->u.type)
 | 
      
         | 2736 |  |  |         TREE_TYPE (b->decl) = b->u.type;
 | 
      
         | 2737 |  |  |  
 | 
      
         | 2738 |  |  |       /* The point of the same_translation_unit_p check here is,
 | 
      
         | 2739 |  |  |          we want to detect a duplicate decl for a construct like
 | 
      
         | 2740 |  |  |          foo() { extern bar(); } ... static bar();  but not if
 | 
      
         | 2741 |  |  |          they are in different translation units.  In any case,
 | 
      
         | 2742 |  |  |          the static does not go in the externals scope.  */
 | 
      
         | 2743 |  |  |       if (b
 | 
      
         | 2744 |  |  |           && (TREE_PUBLIC (x) || same_translation_unit_p (x, b->decl))
 | 
      
         | 2745 |  |  |           && duplicate_decls (x, b->decl))
 | 
      
         | 2746 |  |  |         {
 | 
      
         | 2747 |  |  |           tree thistype;
 | 
      
         | 2748 |  |  |           if (vistype)
 | 
      
         | 2749 |  |  |             {
 | 
      
         | 2750 |  |  |               if (comptypes (vistype, type))
 | 
      
         | 2751 |  |  |                 thistype = composite_type (vistype, type);
 | 
      
         | 2752 |  |  |               else
 | 
      
         | 2753 |  |  |                 thistype = TREE_TYPE (b->decl);
 | 
      
         | 2754 |  |  |             }
 | 
      
         | 2755 |  |  |           else
 | 
      
         | 2756 |  |  |             thistype = type;
 | 
      
         | 2757 |  |  |           b->u.type = TREE_TYPE (b->decl);
 | 
      
         | 2758 |  |  |           if (TREE_CODE (b->decl) == FUNCTION_DECL && DECL_BUILT_IN (b->decl))
 | 
      
         | 2759 |  |  |             thistype
 | 
      
         | 2760 |  |  |               = build_type_attribute_variant (thistype,
 | 
      
         | 2761 |  |  |                                               TYPE_ATTRIBUTES (b->u.type));
 | 
      
         | 2762 |  |  |           TREE_TYPE (b->decl) = thistype;
 | 
      
         | 2763 |  |  |           bind (name, b->decl, scope, /*invisible=*/false, /*nested=*/true,
 | 
      
         | 2764 |  |  |                 locus);
 | 
      
         | 2765 |  |  |           return b->decl;
 | 
      
         | 2766 |  |  |         }
 | 
      
         | 2767 |  |  |       else if (TREE_PUBLIC (x))
 | 
      
         | 2768 |  |  |         {
 | 
      
         | 2769 |  |  |           if (visdecl && !b && duplicate_decls (x, visdecl))
 | 
      
         | 2770 |  |  |             {
 | 
      
         | 2771 |  |  |               /* An external declaration at block scope referring to a
 | 
      
         | 2772 |  |  |                  visible entity with internal linkage.  The composite
 | 
      
         | 2773 |  |  |                  type will already be correct for this scope, so we
 | 
      
         | 2774 |  |  |                  just need to fall through to make the declaration in
 | 
      
         | 2775 |  |  |                  this scope.  */
 | 
      
         | 2776 |  |  |               nested = true;
 | 
      
         | 2777 |  |  |               x = visdecl;
 | 
      
         | 2778 |  |  |             }
 | 
      
         | 2779 |  |  |           else
 | 
      
         | 2780 |  |  |             {
 | 
      
         | 2781 |  |  |               bind (name, x, external_scope, /*invisible=*/true,
 | 
      
         | 2782 |  |  |                     /*nested=*/false, locus);
 | 
      
         | 2783 |  |  |               nested = true;
 | 
      
         | 2784 |  |  |             }
 | 
      
         | 2785 |  |  |         }
 | 
      
         | 2786 |  |  |     }
 | 
      
         | 2787 |  |  |  
 | 
      
         | 2788 |  |  |   if (TREE_CODE (x) != PARM_DECL)
 | 
      
         | 2789 |  |  |     warn_if_shadowing (x);
 | 
      
         | 2790 |  |  |  
 | 
      
         | 2791 |  |  |  skip_external_and_shadow_checks:
 | 
      
         | 2792 |  |  |   if (TREE_CODE (x) == TYPE_DECL)
 | 
      
         | 2793 |  |  |     {
 | 
      
         | 2794 |  |  |       /* So this is a typedef, set its underlying type.  */
 | 
      
         | 2795 |  |  |       set_underlying_type (x);
 | 
      
         | 2796 |  |  |  
 | 
      
         | 2797 |  |  |       /* If X is a typedef defined in the current function, record it
 | 
      
         | 2798 |  |  |          for the purpose of implementing the -Wunused-local-typedefs
 | 
      
         | 2799 |  |  |          warning.  */
 | 
      
         | 2800 |  |  |       record_locally_defined_typedef (x);
 | 
      
         | 2801 |  |  |     }
 | 
      
         | 2802 |  |  |  
 | 
      
         | 2803 |  |  |   bind (name, x, scope, /*invisible=*/false, nested, locus);
 | 
      
         | 2804 |  |  |  
 | 
      
         | 2805 |  |  |   /* If x's type is incomplete because it's based on a
 | 
      
         | 2806 |  |  |      structure or union which has not yet been fully declared,
 | 
      
         | 2807 |  |  |      attach it to that structure or union type, so we can go
 | 
      
         | 2808 |  |  |      back and complete the variable declaration later, if the
 | 
      
         | 2809 |  |  |      structure or union gets fully declared.
 | 
      
         | 2810 |  |  |  
 | 
      
         | 2811 |  |  |      If the input is erroneous, we can have error_mark in the type
 | 
      
         | 2812 |  |  |      slot (e.g. "f(void a, ...)") - that doesn't count as an
 | 
      
         | 2813 |  |  |      incomplete type.  */
 | 
      
         | 2814 |  |  |   if (TREE_TYPE (x) != error_mark_node
 | 
      
         | 2815 |  |  |       && !COMPLETE_TYPE_P (TREE_TYPE (x)))
 | 
      
         | 2816 |  |  |     {
 | 
      
         | 2817 |  |  |       tree element = TREE_TYPE (x);
 | 
      
         | 2818 |  |  |  
 | 
      
         | 2819 |  |  |       while (TREE_CODE (element) == ARRAY_TYPE)
 | 
      
         | 2820 |  |  |         element = TREE_TYPE (element);
 | 
      
         | 2821 |  |  |       element = TYPE_MAIN_VARIANT (element);
 | 
      
         | 2822 |  |  |  
 | 
      
         | 2823 |  |  |       if ((TREE_CODE (element) == RECORD_TYPE
 | 
      
         | 2824 |  |  |            || TREE_CODE (element) == UNION_TYPE)
 | 
      
         | 2825 |  |  |           && (TREE_CODE (x) != TYPE_DECL
 | 
      
         | 2826 |  |  |               || TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE)
 | 
      
         | 2827 |  |  |           && !COMPLETE_TYPE_P (element))
 | 
      
         | 2828 |  |  |         C_TYPE_INCOMPLETE_VARS (element)
 | 
      
         | 2829 |  |  |           = tree_cons (NULL_TREE, x, C_TYPE_INCOMPLETE_VARS (element));
 | 
      
         | 2830 |  |  |     }
 | 
      
         | 2831 |  |  |   return x;
 | 
      
         | 2832 |  |  | }
 | 
      
         | 2833 |  |  |  
 | 
      
         | 2834 |  |  | /* Record X as belonging to file scope.
 | 
      
         | 2835 |  |  |    This is used only internally by the Objective-C front end,
 | 
      
         | 2836 |  |  |    and is limited to its needs.  duplicate_decls is not called;
 | 
      
         | 2837 |  |  |    if there is any preexisting decl for this identifier, it is an ICE.  */
 | 
      
         | 2838 |  |  |  
 | 
      
         | 2839 |  |  | tree
 | 
      
         | 2840 |  |  | pushdecl_top_level (tree x)
 | 
      
         | 2841 |  |  | {
 | 
      
         | 2842 |  |  |   tree name;
 | 
      
         | 2843 |  |  |   bool nested = false;
 | 
      
         | 2844 |  |  |   gcc_assert (TREE_CODE (x) == VAR_DECL || TREE_CODE (x) == CONST_DECL);
 | 
      
         | 2845 |  |  |  
 | 
      
         | 2846 |  |  |   name = DECL_NAME (x);
 | 
      
         | 2847 |  |  |  
 | 
      
         | 2848 |  |  |  gcc_assert (TREE_CODE (x) == CONST_DECL || !I_SYMBOL_BINDING (name));
 | 
      
         | 2849 |  |  |  
 | 
      
         | 2850 |  |  |   if (TREE_PUBLIC (x))
 | 
      
         | 2851 |  |  |     {
 | 
      
         | 2852 |  |  |       bind (name, x, external_scope, /*invisible=*/true, /*nested=*/false,
 | 
      
         | 2853 |  |  |             UNKNOWN_LOCATION);
 | 
      
         | 2854 |  |  |       nested = true;
 | 
      
         | 2855 |  |  |     }
 | 
      
         | 2856 |  |  |   if (file_scope)
 | 
      
         | 2857 |  |  |     bind (name, x, file_scope, /*invisible=*/false, nested, UNKNOWN_LOCATION);
 | 
      
         | 2858 |  |  |  
 | 
      
         | 2859 |  |  |   return x;
 | 
      
         | 2860 |  |  | }
 | 
      
         | 2861 |  |  |  
 | 
      
         | 2862 |  |  | static void
 | 
      
         | 2863 |  |  | implicit_decl_warning (tree id, tree olddecl)
 | 
      
         | 2864 |  |  | {
 | 
      
         | 2865 |  |  |   if (warn_implicit_function_declaration)
 | 
      
         | 2866 |  |  |     {
 | 
      
         | 2867 |  |  |       bool warned;
 | 
      
         | 2868 |  |  |  
 | 
      
         | 2869 |  |  |       if (flag_isoc99)
 | 
      
         | 2870 |  |  |         warned = pedwarn (input_location, OPT_Wimplicit_function_declaration,
 | 
      
         | 2871 |  |  |                           "implicit declaration of function %qE", id);
 | 
      
         | 2872 |  |  |       else
 | 
      
         | 2873 |  |  |         warned = warning (OPT_Wimplicit_function_declaration,
 | 
      
         | 2874 |  |  |                           G_("implicit declaration of function %qE"), id);
 | 
      
         | 2875 |  |  |       if (olddecl && warned)
 | 
      
         | 2876 |  |  |         locate_old_decl (olddecl);
 | 
      
         | 2877 |  |  |     }
 | 
      
         | 2878 |  |  | }
 | 
      
         | 2879 |  |  |  
 | 
      
         | 2880 |  |  | /* Generate an implicit declaration for identifier FUNCTIONID at LOC as a
 | 
      
         | 2881 |  |  |    function of type int ().  */
 | 
      
         | 2882 |  |  |  
 | 
      
         | 2883 |  |  | tree
 | 
      
         | 2884 |  |  | implicitly_declare (location_t loc, tree functionid)
 | 
      
         | 2885 |  |  | {
 | 
      
         | 2886 |  |  |   struct c_binding *b;
 | 
      
         | 2887 |  |  |   tree decl = 0;
 | 
      
         | 2888 |  |  |   tree asmspec_tree;
 | 
      
         | 2889 |  |  |  
 | 
      
         | 2890 |  |  |   for (b = I_SYMBOL_BINDING (functionid); b; b = b->shadowed)
 | 
      
         | 2891 |  |  |     {
 | 
      
         | 2892 |  |  |       if (B_IN_SCOPE (b, external_scope))
 | 
      
         | 2893 |  |  |         {
 | 
      
         | 2894 |  |  |           decl = b->decl;
 | 
      
         | 2895 |  |  |           break;
 | 
      
         | 2896 |  |  |         }
 | 
      
         | 2897 |  |  |     }
 | 
      
         | 2898 |  |  |  
 | 
      
         | 2899 |  |  |   if (decl)
 | 
      
         | 2900 |  |  |     {
 | 
      
         | 2901 |  |  |       if (decl == error_mark_node)
 | 
      
         | 2902 |  |  |         return decl;
 | 
      
         | 2903 |  |  |  
 | 
      
         | 2904 |  |  |       /* FIXME: Objective-C has weird not-really-builtin functions
 | 
      
         | 2905 |  |  |          which are supposed to be visible automatically.  They wind up
 | 
      
         | 2906 |  |  |          in the external scope because they're pushed before the file
 | 
      
         | 2907 |  |  |          scope gets created.  Catch this here and rebind them into the
 | 
      
         | 2908 |  |  |          file scope.  */
 | 
      
         | 2909 |  |  |       if (!DECL_BUILT_IN (decl) && DECL_IS_BUILTIN (decl))
 | 
      
         | 2910 |  |  |         {
 | 
      
         | 2911 |  |  |           bind (functionid, decl, file_scope,
 | 
      
         | 2912 |  |  |                 /*invisible=*/false, /*nested=*/true,
 | 
      
         | 2913 |  |  |                 DECL_SOURCE_LOCATION (decl));
 | 
      
         | 2914 |  |  |           return decl;
 | 
      
         | 2915 |  |  |         }
 | 
      
         | 2916 |  |  |       else
 | 
      
         | 2917 |  |  |         {
 | 
      
         | 2918 |  |  |           tree newtype = default_function_type;
 | 
      
         | 2919 |  |  |           if (b->u.type)
 | 
      
         | 2920 |  |  |             TREE_TYPE (decl) = b->u.type;
 | 
      
         | 2921 |  |  |           /* Implicit declaration of a function already declared
 | 
      
         | 2922 |  |  |              (somehow) in a different scope, or as a built-in.
 | 
      
         | 2923 |  |  |              If this is the first time this has happened, warn;
 | 
      
         | 2924 |  |  |              then recycle the old declaration but with the new type.  */
 | 
      
         | 2925 |  |  |           if (!C_DECL_IMPLICIT (decl))
 | 
      
         | 2926 |  |  |             {
 | 
      
         | 2927 |  |  |               implicit_decl_warning (functionid, decl);
 | 
      
         | 2928 |  |  |               C_DECL_IMPLICIT (decl) = 1;
 | 
      
         | 2929 |  |  |             }
 | 
      
         | 2930 |  |  |           if (DECL_BUILT_IN (decl))
 | 
      
         | 2931 |  |  |             {
 | 
      
         | 2932 |  |  |               newtype = build_type_attribute_variant (newtype,
 | 
      
         | 2933 |  |  |                                                       TYPE_ATTRIBUTES
 | 
      
         | 2934 |  |  |                                                       (TREE_TYPE (decl)));
 | 
      
         | 2935 |  |  |               if (!comptypes (newtype, TREE_TYPE (decl)))
 | 
      
         | 2936 |  |  |                 {
 | 
      
         | 2937 |  |  |                   warning_at (loc, 0, "incompatible implicit declaration of "
 | 
      
         | 2938 |  |  |                               "built-in function %qD", decl);
 | 
      
         | 2939 |  |  |                   newtype = TREE_TYPE (decl);
 | 
      
         | 2940 |  |  |                 }
 | 
      
         | 2941 |  |  |             }
 | 
      
         | 2942 |  |  |           else
 | 
      
         | 2943 |  |  |             {
 | 
      
         | 2944 |  |  |               if (!comptypes (newtype, TREE_TYPE (decl)))
 | 
      
         | 2945 |  |  |                 {
 | 
      
         | 2946 |  |  |                   error_at (loc, "incompatible implicit declaration of function %qD", decl);
 | 
      
         | 2947 |  |  |                   locate_old_decl (decl);
 | 
      
         | 2948 |  |  |                 }
 | 
      
         | 2949 |  |  |             }
 | 
      
         | 2950 |  |  |           b->u.type = TREE_TYPE (decl);
 | 
      
         | 2951 |  |  |           TREE_TYPE (decl) = newtype;
 | 
      
         | 2952 |  |  |           bind (functionid, decl, current_scope,
 | 
      
         | 2953 |  |  |                 /*invisible=*/false, /*nested=*/true,
 | 
      
         | 2954 |  |  |                 DECL_SOURCE_LOCATION (decl));
 | 
      
         | 2955 |  |  |           return decl;
 | 
      
         | 2956 |  |  |         }
 | 
      
         | 2957 |  |  |     }
 | 
      
         | 2958 |  |  |  
 | 
      
         | 2959 |  |  |   /* Not seen before.  */
 | 
      
         | 2960 |  |  |   decl = build_decl (loc, FUNCTION_DECL, functionid, default_function_type);
 | 
      
         | 2961 |  |  |   DECL_EXTERNAL (decl) = 1;
 | 
      
         | 2962 |  |  |   TREE_PUBLIC (decl) = 1;
 | 
      
         | 2963 |  |  |   C_DECL_IMPLICIT (decl) = 1;
 | 
      
         | 2964 |  |  |   implicit_decl_warning (functionid, 0);
 | 
      
         | 2965 |  |  |   asmspec_tree = maybe_apply_renaming_pragma (decl, /*asmname=*/NULL);
 | 
      
         | 2966 |  |  |   if (asmspec_tree)
 | 
      
         | 2967 |  |  |     set_user_assembler_name (decl, TREE_STRING_POINTER (asmspec_tree));
 | 
      
         | 2968 |  |  |  
 | 
      
         | 2969 |  |  |   /* C89 says implicit declarations are in the innermost block.
 | 
      
         | 2970 |  |  |      So we record the decl in the standard fashion.  */
 | 
      
         | 2971 |  |  |   decl = pushdecl (decl);
 | 
      
         | 2972 |  |  |  
 | 
      
         | 2973 |  |  |   /* No need to call objc_check_decl here - it's a function type.  */
 | 
      
         | 2974 |  |  |   rest_of_decl_compilation (decl, 0, 0);
 | 
      
         | 2975 |  |  |  
 | 
      
         | 2976 |  |  |   /* Write a record describing this implicit function declaration
 | 
      
         | 2977 |  |  |      to the prototypes file (if requested).  */
 | 
      
         | 2978 |  |  |   gen_aux_info_record (decl, 0, 1, 0);
 | 
      
         | 2979 |  |  |  
 | 
      
         | 2980 |  |  |   /* Possibly apply some default attributes to this implicit declaration.  */
 | 
      
         | 2981 |  |  |   decl_attributes (&decl, NULL_TREE, 0);
 | 
      
         | 2982 |  |  |  
 | 
      
         | 2983 |  |  |   return decl;
 | 
      
         | 2984 |  |  | }
 | 
      
         | 2985 |  |  |  
 | 
      
         | 2986 |  |  | /* Issue an error message for a reference to an undeclared variable
 | 
      
         | 2987 |  |  |    ID, including a reference to a builtin outside of function-call
 | 
      
         | 2988 |  |  |    context.  Establish a binding of the identifier to error_mark_node
 | 
      
         | 2989 |  |  |    in an appropriate scope, which will suppress further errors for the
 | 
      
         | 2990 |  |  |    same identifier.  The error message should be given location LOC.  */
 | 
      
         | 2991 |  |  | void
 | 
      
         | 2992 |  |  | undeclared_variable (location_t loc, tree id)
 | 
      
         | 2993 |  |  | {
 | 
      
         | 2994 |  |  |   static bool already = false;
 | 
      
         | 2995 |  |  |   struct c_scope *scope;
 | 
      
         | 2996 |  |  |  
 | 
      
         | 2997 |  |  |   if (current_function_decl == 0)
 | 
      
         | 2998 |  |  |     {
 | 
      
         | 2999 |  |  |       error_at (loc, "%qE undeclared here (not in a function)", id);
 | 
      
         | 3000 |  |  |       scope = current_scope;
 | 
      
         | 3001 |  |  |     }
 | 
      
         | 3002 |  |  |   else
 | 
      
         | 3003 |  |  |     {
 | 
      
         | 3004 |  |  |       if (!objc_diagnose_private_ivar (id))
 | 
      
         | 3005 |  |  |         error_at (loc, "%qE undeclared (first use in this function)", id);
 | 
      
         | 3006 |  |  |       if (!already)
 | 
      
         | 3007 |  |  |         {
 | 
      
         | 3008 |  |  |           inform (loc, "each undeclared identifier is reported only"
 | 
      
         | 3009 |  |  |                   " once for each function it appears in");
 | 
      
         | 3010 |  |  |           already = true;
 | 
      
         | 3011 |  |  |         }
 | 
      
         | 3012 |  |  |  
 | 
      
         | 3013 |  |  |       /* If we are parsing old-style parameter decls, current_function_decl
 | 
      
         | 3014 |  |  |          will be nonnull but current_function_scope will be null.  */
 | 
      
         | 3015 |  |  |       scope = current_function_scope ? current_function_scope : current_scope;
 | 
      
         | 3016 |  |  |     }
 | 
      
         | 3017 |  |  |   bind (id, error_mark_node, scope, /*invisible=*/false, /*nested=*/false,
 | 
      
         | 3018 |  |  |         UNKNOWN_LOCATION);
 | 
      
         | 3019 |  |  | }
 | 
      
         | 3020 |  |  |  
 | 
      
         | 3021 |  |  | /* Subroutine of lookup_label, declare_label, define_label: construct a
 | 
      
         | 3022 |  |  |    LABEL_DECL with all the proper frills.  Also create a struct
 | 
      
         | 3023 |  |  |    c_label_vars initialized for the current scope.  */
 | 
      
         | 3024 |  |  |  
 | 
      
         | 3025 |  |  | static tree
 | 
      
         | 3026 |  |  | make_label (location_t location, tree name, bool defining,
 | 
      
         | 3027 |  |  |             struct c_label_vars **p_label_vars)
 | 
      
         | 3028 |  |  | {
 | 
      
         | 3029 |  |  |   tree label = build_decl (location, LABEL_DECL, name, void_type_node);
 | 
      
         | 3030 |  |  |   struct c_label_vars *label_vars;
 | 
      
         | 3031 |  |  |  
 | 
      
         | 3032 |  |  |   DECL_CONTEXT (label) = current_function_decl;
 | 
      
         | 3033 |  |  |   DECL_MODE (label) = VOIDmode;
 | 
      
         | 3034 |  |  |  
 | 
      
         | 3035 |  |  |   label_vars = ggc_alloc_c_label_vars ();
 | 
      
         | 3036 |  |  |   label_vars->shadowed = NULL;
 | 
      
         | 3037 |  |  |   set_spot_bindings (&label_vars->label_bindings, defining);
 | 
      
         | 3038 |  |  |   label_vars->decls_in_scope = make_tree_vector ();
 | 
      
         | 3039 |  |  |   label_vars->gotos = VEC_alloc (c_goto_bindings_p, gc, 0);
 | 
      
         | 3040 |  |  |   *p_label_vars = label_vars;
 | 
      
         | 3041 |  |  |  
 | 
      
         | 3042 |  |  |   return label;
 | 
      
         | 3043 |  |  | }
 | 
      
         | 3044 |  |  |  
 | 
      
         | 3045 |  |  | /* Get the LABEL_DECL corresponding to identifier NAME as a label.
 | 
      
         | 3046 |  |  |    Create one if none exists so far for the current function.
 | 
      
         | 3047 |  |  |    This is called when a label is used in a goto expression or
 | 
      
         | 3048 |  |  |    has its address taken.  */
 | 
      
         | 3049 |  |  |  
 | 
      
         | 3050 |  |  | tree
 | 
      
         | 3051 |  |  | lookup_label (tree name)
 | 
      
         | 3052 |  |  | {
 | 
      
         | 3053 |  |  |   tree label;
 | 
      
         | 3054 |  |  |   struct c_label_vars *label_vars;
 | 
      
         | 3055 |  |  |  
 | 
      
         | 3056 |  |  |   if (current_function_scope == 0)
 | 
      
         | 3057 |  |  |     {
 | 
      
         | 3058 |  |  |       error ("label %qE referenced outside of any function", name);
 | 
      
         | 3059 |  |  |       return 0;
 | 
      
         | 3060 |  |  |     }
 | 
      
         | 3061 |  |  |  
 | 
      
         | 3062 |  |  |   /* Use a label already defined or ref'd with this name, but not if
 | 
      
         | 3063 |  |  |      it is inherited from a containing function and wasn't declared
 | 
      
         | 3064 |  |  |      using __label__.  */
 | 
      
         | 3065 |  |  |   label = I_LABEL_DECL (name);
 | 
      
         | 3066 |  |  |   if (label && (DECL_CONTEXT (label) == current_function_decl
 | 
      
         | 3067 |  |  |                 || C_DECLARED_LABEL_FLAG (label)))
 | 
      
         | 3068 |  |  |     {
 | 
      
         | 3069 |  |  |       /* If the label has only been declared, update its apparent
 | 
      
         | 3070 |  |  |          location to point here, for better diagnostics if it
 | 
      
         | 3071 |  |  |          turns out not to have been defined.  */
 | 
      
         | 3072 |  |  |       if (DECL_INITIAL (label) == NULL_TREE)
 | 
      
         | 3073 |  |  |         DECL_SOURCE_LOCATION (label) = input_location;
 | 
      
         | 3074 |  |  |       return label;
 | 
      
         | 3075 |  |  |     }
 | 
      
         | 3076 |  |  |  
 | 
      
         | 3077 |  |  |   /* No label binding for that identifier; make one.  */
 | 
      
         | 3078 |  |  |   label = make_label (input_location, name, false, &label_vars);
 | 
      
         | 3079 |  |  |  
 | 
      
         | 3080 |  |  |   /* Ordinary labels go in the current function scope.  */
 | 
      
         | 3081 |  |  |   bind_label (name, label, current_function_scope, label_vars);
 | 
      
         | 3082 |  |  |  
 | 
      
         | 3083 |  |  |   return label;
 | 
      
         | 3084 |  |  | }
 | 
      
         | 3085 |  |  |  
 | 
      
         | 3086 |  |  | /* Issue a warning about DECL for a goto statement at GOTO_LOC going
 | 
      
         | 3087 |  |  |    to LABEL.  */
 | 
      
         | 3088 |  |  |  
 | 
      
         | 3089 |  |  | static void
 | 
      
         | 3090 |  |  | warn_about_goto (location_t goto_loc, tree label, tree decl)
 | 
      
         | 3091 |  |  | {
 | 
      
         | 3092 |  |  |   if (variably_modified_type_p (TREE_TYPE (decl), NULL_TREE))
 | 
      
         | 3093 |  |  |     error_at (goto_loc,
 | 
      
         | 3094 |  |  |               "jump into scope of identifier with variably modified type");
 | 
      
         | 3095 |  |  |   else
 | 
      
         | 3096 |  |  |     warning_at (goto_loc, OPT_Wjump_misses_init,
 | 
      
         | 3097 |  |  |                 "jump skips variable initialization");
 | 
      
         | 3098 |  |  |   inform (DECL_SOURCE_LOCATION (label), "label %qD defined here", label);
 | 
      
         | 3099 |  |  |   inform (DECL_SOURCE_LOCATION (decl), "%qD declared here", decl);
 | 
      
         | 3100 |  |  | }
 | 
      
         | 3101 |  |  |  
 | 
      
         | 3102 |  |  | /* Look up a label because of a goto statement.  This is like
 | 
      
         | 3103 |  |  |    lookup_label, but also issues any appropriate warnings.  */
 | 
      
         | 3104 |  |  |  
 | 
      
         | 3105 |  |  | tree
 | 
      
         | 3106 |  |  | lookup_label_for_goto (location_t loc, tree name)
 | 
      
         | 3107 |  |  | {
 | 
      
         | 3108 |  |  |   tree label;
 | 
      
         | 3109 |  |  |   struct c_label_vars *label_vars;
 | 
      
         | 3110 |  |  |   unsigned int ix;
 | 
      
         | 3111 |  |  |   tree decl;
 | 
      
         | 3112 |  |  |  
 | 
      
         | 3113 |  |  |   label = lookup_label (name);
 | 
      
         | 3114 |  |  |   if (label == NULL_TREE)
 | 
      
         | 3115 |  |  |     return NULL_TREE;
 | 
      
         | 3116 |  |  |  
 | 
      
         | 3117 |  |  |   /* If we are jumping to a different function, we can't issue any
 | 
      
         | 3118 |  |  |      useful warnings.  */
 | 
      
         | 3119 |  |  |   if (DECL_CONTEXT (label) != current_function_decl)
 | 
      
         | 3120 |  |  |     {
 | 
      
         | 3121 |  |  |       gcc_assert (C_DECLARED_LABEL_FLAG (label));
 | 
      
         | 3122 |  |  |       return label;
 | 
      
         | 3123 |  |  |     }
 | 
      
         | 3124 |  |  |  
 | 
      
         | 3125 |  |  |   label_vars = I_LABEL_BINDING (name)->u.label;
 | 
      
         | 3126 |  |  |  
 | 
      
         | 3127 |  |  |   /* If the label has not yet been defined, then push this goto on a
 | 
      
         | 3128 |  |  |      list for possible later warnings.  */
 | 
      
         | 3129 |  |  |   if (label_vars->label_bindings.scope == NULL)
 | 
      
         | 3130 |  |  |     {
 | 
      
         | 3131 |  |  |       struct c_goto_bindings *g;
 | 
      
         | 3132 |  |  |  
 | 
      
         | 3133 |  |  |       g = ggc_alloc_c_goto_bindings ();
 | 
      
         | 3134 |  |  |       g->loc = loc;
 | 
      
         | 3135 |  |  |       set_spot_bindings (&g->goto_bindings, true);
 | 
      
         | 3136 |  |  |       VEC_safe_push (c_goto_bindings_p, gc, label_vars->gotos, g);
 | 
      
         | 3137 |  |  |       return label;
 | 
      
         | 3138 |  |  |     }
 | 
      
         | 3139 |  |  |  
 | 
      
         | 3140 |  |  |   /* If there are any decls in label_vars->decls_in_scope, then this
 | 
      
         | 3141 |  |  |      goto has missed the declaration of the decl.  This happens for a
 | 
      
         | 3142 |  |  |      case like
 | 
      
         | 3143 |  |  |        int i = 1;
 | 
      
         | 3144 |  |  |       lab:
 | 
      
         | 3145 |  |  |        ...
 | 
      
         | 3146 |  |  |        goto lab;
 | 
      
         | 3147 |  |  |      Issue a warning or error.  */
 | 
      
         | 3148 |  |  |   FOR_EACH_VEC_ELT (tree, label_vars->decls_in_scope, ix, decl)
 | 
      
         | 3149 |  |  |     warn_about_goto (loc, label, decl);
 | 
      
         | 3150 |  |  |  
 | 
      
         | 3151 |  |  |   if (label_vars->label_bindings.left_stmt_expr)
 | 
      
         | 3152 |  |  |     {
 | 
      
         | 3153 |  |  |       error_at (loc, "jump into statement expression");
 | 
      
         | 3154 |  |  |       inform (DECL_SOURCE_LOCATION (label), "label %qD defined here", label);
 | 
      
         | 3155 |  |  |     }
 | 
      
         | 3156 |  |  |  
 | 
      
         | 3157 |  |  |   return label;
 | 
      
         | 3158 |  |  | }
 | 
      
         | 3159 |  |  |  
 | 
      
         | 3160 |  |  | /* Make a label named NAME in the current function, shadowing silently
 | 
      
         | 3161 |  |  |    any that may be inherited from containing functions or containing
 | 
      
         | 3162 |  |  |    scopes.  This is called for __label__ declarations.  */
 | 
      
         | 3163 |  |  |  
 | 
      
         | 3164 |  |  | tree
 | 
      
         | 3165 |  |  | declare_label (tree name)
 | 
      
         | 3166 |  |  | {
 | 
      
         | 3167 |  |  |   struct c_binding *b = I_LABEL_BINDING (name);
 | 
      
         | 3168 |  |  |   tree label;
 | 
      
         | 3169 |  |  |   struct c_label_vars *label_vars;
 | 
      
         | 3170 |  |  |  
 | 
      
         | 3171 |  |  |   /* Check to make sure that the label hasn't already been declared
 | 
      
         | 3172 |  |  |      at this scope */
 | 
      
         | 3173 |  |  |   if (b && B_IN_CURRENT_SCOPE (b))
 | 
      
         | 3174 |  |  |     {
 | 
      
         | 3175 |  |  |       error ("duplicate label declaration %qE", name);
 | 
      
         | 3176 |  |  |       locate_old_decl (b->decl);
 | 
      
         | 3177 |  |  |  
 | 
      
         | 3178 |  |  |       /* Just use the previous declaration.  */
 | 
      
         | 3179 |  |  |       return b->decl;
 | 
      
         | 3180 |  |  |     }
 | 
      
         | 3181 |  |  |  
 | 
      
         | 3182 |  |  |   label = make_label (input_location, name, false, &label_vars);
 | 
      
         | 3183 |  |  |   C_DECLARED_LABEL_FLAG (label) = 1;
 | 
      
         | 3184 |  |  |  
 | 
      
         | 3185 |  |  |   /* Declared labels go in the current scope.  */
 | 
      
         | 3186 |  |  |   bind_label (name, label, current_scope, label_vars);
 | 
      
         | 3187 |  |  |  
 | 
      
         | 3188 |  |  |   return label;
 | 
      
         | 3189 |  |  | }
 | 
      
         | 3190 |  |  |  
 | 
      
         | 3191 |  |  | /* When we define a label, issue any appropriate warnings if there are
 | 
      
         | 3192 |  |  |    any gotos earlier in the function which jump to this label.  */
 | 
      
         | 3193 |  |  |  
 | 
      
         | 3194 |  |  | static void
 | 
      
         | 3195 |  |  | check_earlier_gotos (tree label, struct c_label_vars* label_vars)
 | 
      
         | 3196 |  |  | {
 | 
      
         | 3197 |  |  |   unsigned int ix;
 | 
      
         | 3198 |  |  |   struct c_goto_bindings *g;
 | 
      
         | 3199 |  |  |  
 | 
      
         | 3200 |  |  |   FOR_EACH_VEC_ELT (c_goto_bindings_p, label_vars->gotos, ix, g)
 | 
      
         | 3201 |  |  |     {
 | 
      
         | 3202 |  |  |       struct c_binding *b;
 | 
      
         | 3203 |  |  |       struct c_scope *scope;
 | 
      
         | 3204 |  |  |  
 | 
      
         | 3205 |  |  |       /* We have a goto to this label.  The goto is going forward.  In
 | 
      
         | 3206 |  |  |          g->scope, the goto is going to skip any binding which was
 | 
      
         | 3207 |  |  |          defined after g->bindings_in_scope.  */
 | 
      
         | 3208 |  |  |       if (g->goto_bindings.scope->has_jump_unsafe_decl)
 | 
      
         | 3209 |  |  |         {
 | 
      
         | 3210 |  |  |           for (b = g->goto_bindings.scope->bindings;
 | 
      
         | 3211 |  |  |                b != g->goto_bindings.bindings_in_scope;
 | 
      
         | 3212 |  |  |                b = b->prev)
 | 
      
         | 3213 |  |  |             {
 | 
      
         | 3214 |  |  |               if (decl_jump_unsafe (b->decl))
 | 
      
         | 3215 |  |  |                 warn_about_goto (g->loc, label, b->decl);
 | 
      
         | 3216 |  |  |             }
 | 
      
         | 3217 |  |  |         }
 | 
      
         | 3218 |  |  |  
 | 
      
         | 3219 |  |  |       /* We also need to warn about decls defined in any scopes
 | 
      
         | 3220 |  |  |          between the scope of the label and the scope of the goto.  */
 | 
      
         | 3221 |  |  |       for (scope = label_vars->label_bindings.scope;
 | 
      
         | 3222 |  |  |            scope != g->goto_bindings.scope;
 | 
      
         | 3223 |  |  |            scope = scope->outer)
 | 
      
         | 3224 |  |  |         {
 | 
      
         | 3225 |  |  |           gcc_assert (scope != NULL);
 | 
      
         | 3226 |  |  |           if (scope->has_jump_unsafe_decl)
 | 
      
         | 3227 |  |  |             {
 | 
      
         | 3228 |  |  |               if (scope == label_vars->label_bindings.scope)
 | 
      
         | 3229 |  |  |                 b = label_vars->label_bindings.bindings_in_scope;
 | 
      
         | 3230 |  |  |               else
 | 
      
         | 3231 |  |  |                 b = scope->bindings;
 | 
      
         | 3232 |  |  |               for (; b != NULL; b = b->prev)
 | 
      
         | 3233 |  |  |                 {
 | 
      
         | 3234 |  |  |                   if (decl_jump_unsafe (b->decl))
 | 
      
         | 3235 |  |  |                     warn_about_goto (g->loc, label, b->decl);
 | 
      
         | 3236 |  |  |                 }
 | 
      
         | 3237 |  |  |             }
 | 
      
         | 3238 |  |  |         }
 | 
      
         | 3239 |  |  |  
 | 
      
         | 3240 |  |  |       if (g->goto_bindings.stmt_exprs > 0)
 | 
      
         | 3241 |  |  |         {
 | 
      
         | 3242 |  |  |           error_at (g->loc, "jump into statement expression");
 | 
      
         | 3243 |  |  |           inform (DECL_SOURCE_LOCATION (label), "label %qD defined here",
 | 
      
         | 3244 |  |  |                   label);
 | 
      
         | 3245 |  |  |         }
 | 
      
         | 3246 |  |  |     }
 | 
      
         | 3247 |  |  |  
 | 
      
         | 3248 |  |  |   /* Now that the label is defined, we will issue warnings about
 | 
      
         | 3249 |  |  |      subsequent gotos to this label when we see them.  */
 | 
      
         | 3250 |  |  |   VEC_truncate (c_goto_bindings_p, label_vars->gotos, 0);
 | 
      
         | 3251 |  |  |   label_vars->gotos = NULL;
 | 
      
         | 3252 |  |  | }
 | 
      
         | 3253 |  |  |  
 | 
      
         | 3254 |  |  | /* Define a label, specifying the location in the source file.
 | 
      
         | 3255 |  |  |    Return the LABEL_DECL node for the label, if the definition is valid.
 | 
      
         | 3256 |  |  |    Otherwise return 0.  */
 | 
      
         | 3257 |  |  |  
 | 
      
         | 3258 |  |  | tree
 | 
      
         | 3259 |  |  | define_label (location_t location, tree name)
 | 
      
         | 3260 |  |  | {
 | 
      
         | 3261 |  |  |   /* Find any preexisting label with this name.  It is an error
 | 
      
         | 3262 |  |  |      if that label has already been defined in this function, or
 | 
      
         | 3263 |  |  |      if there is a containing function with a declared label with
 | 
      
         | 3264 |  |  |      the same name.  */
 | 
      
         | 3265 |  |  |   tree label = I_LABEL_DECL (name);
 | 
      
         | 3266 |  |  |  
 | 
      
         | 3267 |  |  |   if (label
 | 
      
         | 3268 |  |  |       && ((DECL_CONTEXT (label) == current_function_decl
 | 
      
         | 3269 |  |  |            && DECL_INITIAL (label) != 0)
 | 
      
         | 3270 |  |  |           || (DECL_CONTEXT (label) != current_function_decl
 | 
      
         | 3271 |  |  |               && C_DECLARED_LABEL_FLAG (label))))
 | 
      
         | 3272 |  |  |     {
 | 
      
         | 3273 |  |  |       error_at (location, "duplicate label %qD", label);
 | 
      
         | 3274 |  |  |       locate_old_decl (label);
 | 
      
         | 3275 |  |  |       return 0;
 | 
      
         | 3276 |  |  |     }
 | 
      
         | 3277 |  |  |   else if (label && DECL_CONTEXT (label) == current_function_decl)
 | 
      
         | 3278 |  |  |     {
 | 
      
         | 3279 |  |  |       struct c_label_vars *label_vars = I_LABEL_BINDING (name)->u.label;
 | 
      
         | 3280 |  |  |  
 | 
      
         | 3281 |  |  |       /* The label has been used or declared already in this function,
 | 
      
         | 3282 |  |  |          but not defined.  Update its location to point to this
 | 
      
         | 3283 |  |  |          definition.  */
 | 
      
         | 3284 |  |  |       DECL_SOURCE_LOCATION (label) = location;
 | 
      
         | 3285 |  |  |       set_spot_bindings (&label_vars->label_bindings, true);
 | 
      
         | 3286 |  |  |  
 | 
      
         | 3287 |  |  |       /* Issue warnings as required about any goto statements from
 | 
      
         | 3288 |  |  |          earlier in the function.  */
 | 
      
         | 3289 |  |  |       check_earlier_gotos (label, label_vars);
 | 
      
         | 3290 |  |  |     }
 | 
      
         | 3291 |  |  |   else
 | 
      
         | 3292 |  |  |     {
 | 
      
         | 3293 |  |  |       struct c_label_vars *label_vars;
 | 
      
         | 3294 |  |  |  
 | 
      
         | 3295 |  |  |       /* No label binding for that identifier; make one.  */
 | 
      
         | 3296 |  |  |       label = make_label (location, name, true, &label_vars);
 | 
      
         | 3297 |  |  |  
 | 
      
         | 3298 |  |  |       /* Ordinary labels go in the current function scope.  */
 | 
      
         | 3299 |  |  |       bind_label (name, label, current_function_scope, label_vars);
 | 
      
         | 3300 |  |  |     }
 | 
      
         | 3301 |  |  |  
 | 
      
         | 3302 |  |  |   if (!in_system_header && lookup_name (name))
 | 
      
         | 3303 |  |  |     warning_at (location, OPT_Wtraditional,
 | 
      
         | 3304 |  |  |                 "traditional C lacks a separate namespace "
 | 
      
         | 3305 |  |  |                 "for labels, identifier %qE conflicts", name);
 | 
      
         | 3306 |  |  |  
 | 
      
         | 3307 |  |  |   /* Mark label as having been defined.  */
 | 
      
         | 3308 |  |  |   DECL_INITIAL (label) = error_mark_node;
 | 
      
         | 3309 |  |  |   return label;
 | 
      
         | 3310 |  |  | }
 | 
      
         | 3311 |  |  |  
 | 
      
         | 3312 |  |  | /* Get the bindings for a new switch statement.  This is used to issue
 | 
      
         | 3313 |  |  |    warnings as appropriate for jumps from the switch to case or
 | 
      
         | 3314 |  |  |    default labels.  */
 | 
      
         | 3315 |  |  |  
 | 
      
         | 3316 |  |  | struct c_spot_bindings *
 | 
      
         | 3317 |  |  | c_get_switch_bindings (void)
 | 
      
         | 3318 |  |  | {
 | 
      
         | 3319 |  |  |   struct c_spot_bindings *switch_bindings;
 | 
      
         | 3320 |  |  |  
 | 
      
         | 3321 |  |  |   switch_bindings = XNEW (struct c_spot_bindings);
 | 
      
         | 3322 |  |  |   set_spot_bindings (switch_bindings, true);
 | 
      
         | 3323 |  |  |   return switch_bindings;
 | 
      
         | 3324 |  |  | }
 | 
      
         | 3325 |  |  |  
 | 
      
         | 3326 |  |  | void
 | 
      
         | 3327 |  |  | c_release_switch_bindings (struct c_spot_bindings *bindings)
 | 
      
         | 3328 |  |  | {
 | 
      
         | 3329 |  |  |   gcc_assert (bindings->stmt_exprs == 0 && !bindings->left_stmt_expr);
 | 
      
         | 3330 |  |  |   XDELETE (bindings);
 | 
      
         | 3331 |  |  | }
 | 
      
         | 3332 |  |  |  
 | 
      
         | 3333 |  |  | /* This is called at the point of a case or default label to issue
 | 
      
         | 3334 |  |  |    warnings about decls as needed.  It returns true if it found an
 | 
      
         | 3335 |  |  |    error, not just a warning.  */
 | 
      
         | 3336 |  |  |  
 | 
      
         | 3337 |  |  | bool
 | 
      
         | 3338 |  |  | c_check_switch_jump_warnings (struct c_spot_bindings *switch_bindings,
 | 
      
         | 3339 |  |  |                               location_t switch_loc, location_t case_loc)
 | 
      
         | 3340 |  |  | {
 | 
      
         | 3341 |  |  |   bool saw_error;
 | 
      
         | 3342 |  |  |   struct c_scope *scope;
 | 
      
         | 3343 |  |  |  
 | 
      
         | 3344 |  |  |   saw_error = false;
 | 
      
         | 3345 |  |  |   for (scope = current_scope;
 | 
      
         | 3346 |  |  |        scope != switch_bindings->scope;
 | 
      
         | 3347 |  |  |        scope = scope->outer)
 | 
      
         | 3348 |  |  |     {
 | 
      
         | 3349 |  |  |       struct c_binding *b;
 | 
      
         | 3350 |  |  |  
 | 
      
         | 3351 |  |  |       gcc_assert (scope != NULL);
 | 
      
         | 3352 |  |  |  
 | 
      
         | 3353 |  |  |       if (!scope->has_jump_unsafe_decl)
 | 
      
         | 3354 |  |  |         continue;
 | 
      
         | 3355 |  |  |  
 | 
      
         | 3356 |  |  |       for (b = scope->bindings; b != NULL; b = b->prev)
 | 
      
         | 3357 |  |  |         {
 | 
      
         | 3358 |  |  |           if (decl_jump_unsafe (b->decl))
 | 
      
         | 3359 |  |  |             {
 | 
      
         | 3360 |  |  |               if (variably_modified_type_p (TREE_TYPE (b->decl), NULL_TREE))
 | 
      
         | 3361 |  |  |                 {
 | 
      
         | 3362 |  |  |                   saw_error = true;
 | 
      
         | 3363 |  |  |                   error_at (case_loc,
 | 
      
         | 3364 |  |  |                             ("switch jumps into scope of identifier with "
 | 
      
         | 3365 |  |  |                              "variably modified type"));
 | 
      
         | 3366 |  |  |                 }
 | 
      
         | 3367 |  |  |               else
 | 
      
         | 3368 |  |  |                 warning_at (case_loc, OPT_Wjump_misses_init,
 | 
      
         | 3369 |  |  |                             "switch jumps over variable initialization");
 | 
      
         | 3370 |  |  |               inform (switch_loc, "switch starts here");
 | 
      
         | 3371 |  |  |               inform (DECL_SOURCE_LOCATION (b->decl), "%qD declared here",
 | 
      
         | 3372 |  |  |                       b->decl);
 | 
      
         | 3373 |  |  |             }
 | 
      
         | 3374 |  |  |         }
 | 
      
         | 3375 |  |  |     }
 | 
      
         | 3376 |  |  |  
 | 
      
         | 3377 |  |  |   if (switch_bindings->stmt_exprs > 0)
 | 
      
         | 3378 |  |  |     {
 | 
      
         | 3379 |  |  |       saw_error = true;
 | 
      
         | 3380 |  |  |       error_at (case_loc, "switch jumps into statement expression");
 | 
      
         | 3381 |  |  |       inform (switch_loc, "switch starts here");
 | 
      
         | 3382 |  |  |     }
 | 
      
         | 3383 |  |  |  
 | 
      
         | 3384 |  |  |   return saw_error;
 | 
      
         | 3385 |  |  | }
 | 
      
         | 3386 |  |  |  
 | 
      
         | 3387 |  |  | /* Given NAME, an IDENTIFIER_NODE,
 | 
      
         | 3388 |  |  |    return the structure (or union or enum) definition for that name.
 | 
      
         | 3389 |  |  |    If THISLEVEL_ONLY is nonzero, searches only the current_scope.
 | 
      
         | 3390 |  |  |    CODE says which kind of type the caller wants;
 | 
      
         | 3391 |  |  |    it is RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE.
 | 
      
         | 3392 |  |  |    If PLOC is not NULL and this returns non-null, it sets *PLOC to the
 | 
      
         | 3393 |  |  |    location where the tag was defined.
 | 
      
         | 3394 |  |  |    If the wrong kind of type is found, an error is reported.  */
 | 
      
         | 3395 |  |  |  
 | 
      
         | 3396 |  |  | static tree
 | 
      
         | 3397 |  |  | lookup_tag (enum tree_code code, tree name, int thislevel_only,
 | 
      
         | 3398 |  |  |             location_t *ploc)
 | 
      
         | 3399 |  |  | {
 | 
      
         | 3400 |  |  |   struct c_binding *b = I_TAG_BINDING (name);
 | 
      
         | 3401 |  |  |   int thislevel = 0;
 | 
      
         | 3402 |  |  |  
 | 
      
         | 3403 |  |  |   if (!b || !b->decl)
 | 
      
         | 3404 |  |  |     return 0;
 | 
      
         | 3405 |  |  |  
 | 
      
         | 3406 |  |  |   /* We only care about whether it's in this level if
 | 
      
         | 3407 |  |  |      thislevel_only was set or it might be a type clash.  */
 | 
      
         | 3408 |  |  |   if (thislevel_only || TREE_CODE (b->decl) != code)
 | 
      
         | 3409 |  |  |     {
 | 
      
         | 3410 |  |  |       /* For our purposes, a tag in the external scope is the same as
 | 
      
         | 3411 |  |  |          a tag in the file scope.  (Primarily relevant to Objective-C
 | 
      
         | 3412 |  |  |          and its builtin structure tags, which get pushed before the
 | 
      
         | 3413 |  |  |          file scope is created.)  */
 | 
      
         | 3414 |  |  |       if (B_IN_CURRENT_SCOPE (b)
 | 
      
         | 3415 |  |  |           || (current_scope == file_scope && B_IN_EXTERNAL_SCOPE (b)))
 | 
      
         | 3416 |  |  |         thislevel = 1;
 | 
      
         | 3417 |  |  |     }
 | 
      
         | 3418 |  |  |  
 | 
      
         | 3419 |  |  |   if (thislevel_only && !thislevel)
 | 
      
         | 3420 |  |  |     return 0;
 | 
      
         | 3421 |  |  |  
 | 
      
         | 3422 |  |  |   if (TREE_CODE (b->decl) != code)
 | 
      
         | 3423 |  |  |     {
 | 
      
         | 3424 |  |  |       /* Definition isn't the kind we were looking for.  */
 | 
      
         | 3425 |  |  |       pending_invalid_xref = name;
 | 
      
         | 3426 |  |  |       pending_invalid_xref_location = input_location;
 | 
      
         | 3427 |  |  |  
 | 
      
         | 3428 |  |  |       /* If in the same binding level as a declaration as a tag
 | 
      
         | 3429 |  |  |          of a different type, this must not be allowed to
 | 
      
         | 3430 |  |  |          shadow that tag, so give the error immediately.
 | 
      
         | 3431 |  |  |          (For example, "struct foo; union foo;" is invalid.)  */
 | 
      
         | 3432 |  |  |       if (thislevel)
 | 
      
         | 3433 |  |  |         pending_xref_error ();
 | 
      
         | 3434 |  |  |     }
 | 
      
         | 3435 |  |  |  
 | 
      
         | 3436 |  |  |   if (ploc != NULL)
 | 
      
         | 3437 |  |  |     *ploc = b->locus;
 | 
      
         | 3438 |  |  |  
 | 
      
         | 3439 |  |  |   return b->decl;
 | 
      
         | 3440 |  |  | }
 | 
      
         | 3441 |  |  |  
 | 
      
         | 3442 |  |  | /* Print an error message now
 | 
      
         | 3443 |  |  |    for a recent invalid struct, union or enum cross reference.
 | 
      
         | 3444 |  |  |    We don't print them immediately because they are not invalid
 | 
      
         | 3445 |  |  |    when used in the `struct foo;' construct for shadowing.  */
 | 
      
         | 3446 |  |  |  
 | 
      
         | 3447 |  |  | void
 | 
      
         | 3448 |  |  | pending_xref_error (void)
 | 
      
         | 3449 |  |  | {
 | 
      
         | 3450 |  |  |   if (pending_invalid_xref != 0)
 | 
      
         | 3451 |  |  |     error_at (pending_invalid_xref_location, "%qE defined as wrong kind of tag",
 | 
      
         | 3452 |  |  |               pending_invalid_xref);
 | 
      
         | 3453 |  |  |   pending_invalid_xref = 0;
 | 
      
         | 3454 |  |  | }
 | 
      
         | 3455 |  |  |  
 | 
      
         | 3456 |  |  |  
 | 
      
         | 3457 |  |  | /* Look up NAME in the current scope and its superiors
 | 
      
         | 3458 |  |  |    in the namespace of variables, functions and typedefs.
 | 
      
         | 3459 |  |  |    Return a ..._DECL node of some kind representing its definition,
 | 
      
         | 3460 |  |  |    or return 0 if it is undefined.  */
 | 
      
         | 3461 |  |  |  
 | 
      
         | 3462 |  |  | tree
 | 
      
         | 3463 |  |  | lookup_name (tree name)
 | 
      
         | 3464 |  |  | {
 | 
      
         | 3465 |  |  |   struct c_binding *b = I_SYMBOL_BINDING (name);
 | 
      
         | 3466 |  |  |   if (b && !b->invisible)
 | 
      
         | 3467 |  |  |     {
 | 
      
         | 3468 |  |  |       maybe_record_typedef_use (b->decl);
 | 
      
         | 3469 |  |  |       return b->decl;
 | 
      
         | 3470 |  |  |     }
 | 
      
         | 3471 |  |  |   return 0;
 | 
      
         | 3472 |  |  | }
 | 
      
         | 3473 |  |  |  
 | 
      
         | 3474 |  |  | /* Similar to `lookup_name' but look only at the indicated scope.  */
 | 
      
         | 3475 |  |  |  
 | 
      
         | 3476 |  |  | static tree
 | 
      
         | 3477 |  |  | lookup_name_in_scope (tree name, struct c_scope *scope)
 | 
      
         | 3478 |  |  | {
 | 
      
         | 3479 |  |  |   struct c_binding *b;
 | 
      
         | 3480 |  |  |  
 | 
      
         | 3481 |  |  |   for (b = I_SYMBOL_BINDING (name); b; b = b->shadowed)
 | 
      
         | 3482 |  |  |     if (B_IN_SCOPE (b, scope))
 | 
      
         | 3483 |  |  |       return b->decl;
 | 
      
         | 3484 |  |  |   return 0;
 | 
      
         | 3485 |  |  | }
 | 
      
         | 3486 |  |  |  
 | 
      
         | 3487 |  |  | /* Create the predefined scalar types of C,
 | 
      
         | 3488 |  |  |    and some nodes representing standard constants (0, 1, (void *) 0).
 | 
      
         | 3489 |  |  |    Initialize the global scope.
 | 
      
         | 3490 |  |  |    Make definitions for built-in primitive functions.  */
 | 
      
         | 3491 |  |  |  
 | 
      
         | 3492 |  |  | void
 | 
      
         | 3493 |  |  | c_init_decl_processing (void)
 | 
      
         | 3494 |  |  | {
 | 
      
         | 3495 |  |  |   location_t save_loc = input_location;
 | 
      
         | 3496 |  |  |  
 | 
      
         | 3497 |  |  |   /* Initialize reserved words for parser.  */
 | 
      
         | 3498 |  |  |   c_parse_init ();
 | 
      
         | 3499 |  |  |  
 | 
      
         | 3500 |  |  |   current_function_decl = 0;
 | 
      
         | 3501 |  |  |  
 | 
      
         | 3502 |  |  |   gcc_obstack_init (&parser_obstack);
 | 
      
         | 3503 |  |  |  
 | 
      
         | 3504 |  |  |   /* Make the externals scope.  */
 | 
      
         | 3505 |  |  |   push_scope ();
 | 
      
         | 3506 |  |  |   external_scope = current_scope;
 | 
      
         | 3507 |  |  |  
 | 
      
         | 3508 |  |  |   /* Declarations from c_common_nodes_and_builtins must not be associated
 | 
      
         | 3509 |  |  |      with this input file, lest we get differences between using and not
 | 
      
         | 3510 |  |  |      using preprocessed headers.  */
 | 
      
         | 3511 |  |  |   input_location = BUILTINS_LOCATION;
 | 
      
         | 3512 |  |  |  
 | 
      
         | 3513 |  |  |   c_common_nodes_and_builtins ();
 | 
      
         | 3514 |  |  |  
 | 
      
         | 3515 |  |  |   /* In C, comparisons and TRUTH_* expressions have type int.  */
 | 
      
         | 3516 |  |  |   truthvalue_type_node = integer_type_node;
 | 
      
         | 3517 |  |  |   truthvalue_true_node = integer_one_node;
 | 
      
         | 3518 |  |  |   truthvalue_false_node = integer_zero_node;
 | 
      
         | 3519 |  |  |  
 | 
      
         | 3520 |  |  |   /* Even in C99, which has a real boolean type.  */
 | 
      
         | 3521 |  |  |   pushdecl (build_decl (UNKNOWN_LOCATION, TYPE_DECL, get_identifier ("_Bool"),
 | 
      
         | 3522 |  |  |                         boolean_type_node));
 | 
      
         | 3523 |  |  |  
 | 
      
         | 3524 |  |  |   input_location = save_loc;
 | 
      
         | 3525 |  |  |  
 | 
      
         | 3526 |  |  |   pedantic_lvalues = true;
 | 
      
         | 3527 |  |  |  
 | 
      
         | 3528 |  |  |   make_fname_decl = c_make_fname_decl;
 | 
      
         | 3529 |  |  |   start_fname_decls ();
 | 
      
         | 3530 |  |  | }
 | 
      
         | 3531 |  |  |  
 | 
      
         | 3532 |  |  | /* Create the VAR_DECL at LOC for __FUNCTION__ etc. ID is the name to
 | 
      
         | 3533 |  |  |    give the decl, NAME is the initialization string and TYPE_DEP
 | 
      
         | 3534 |  |  |    indicates whether NAME depended on the type of the function.  As we
 | 
      
         | 3535 |  |  |    don't yet implement delayed emission of static data, we mark the
 | 
      
         | 3536 |  |  |    decl as emitted so it is not placed in the output.  Anything using
 | 
      
         | 3537 |  |  |    it must therefore pull out the STRING_CST initializer directly.
 | 
      
         | 3538 |  |  |    FIXME.  */
 | 
      
         | 3539 |  |  |  
 | 
      
         | 3540 |  |  | static tree
 | 
      
         | 3541 |  |  | c_make_fname_decl (location_t loc, tree id, int type_dep)
 | 
      
         | 3542 |  |  | {
 | 
      
         | 3543 |  |  |   const char *name = fname_as_string (type_dep);
 | 
      
         | 3544 |  |  |   tree decl, type, init;
 | 
      
         | 3545 |  |  |   size_t length = strlen (name);
 | 
      
         | 3546 |  |  |  
 | 
      
         | 3547 |  |  |   type = build_array_type (char_type_node,
 | 
      
         | 3548 |  |  |                            build_index_type (size_int (length)));
 | 
      
         | 3549 |  |  |   type = c_build_qualified_type (type, TYPE_QUAL_CONST);
 | 
      
         | 3550 |  |  |  
 | 
      
         | 3551 |  |  |   decl = build_decl (loc, VAR_DECL, id, type);
 | 
      
         | 3552 |  |  |  
 | 
      
         | 3553 |  |  |   TREE_STATIC (decl) = 1;
 | 
      
         | 3554 |  |  |   TREE_READONLY (decl) = 1;
 | 
      
         | 3555 |  |  |   DECL_ARTIFICIAL (decl) = 1;
 | 
      
         | 3556 |  |  |  
 | 
      
         | 3557 |  |  |   init = build_string (length + 1, name);
 | 
      
         | 3558 |  |  |   free (CONST_CAST (char *, name));
 | 
      
         | 3559 |  |  |   TREE_TYPE (init) = type;
 | 
      
         | 3560 |  |  |   DECL_INITIAL (decl) = init;
 | 
      
         | 3561 |  |  |  
 | 
      
         | 3562 |  |  |   TREE_USED (decl) = 1;
 | 
      
         | 3563 |  |  |  
 | 
      
         | 3564 |  |  |   if (current_function_decl
 | 
      
         | 3565 |  |  |       /* For invalid programs like this:
 | 
      
         | 3566 |  |  |  
 | 
      
         | 3567 |  |  |          void foo()
 | 
      
         | 3568 |  |  |          const char* p = __FUNCTION__;
 | 
      
         | 3569 |  |  |  
 | 
      
         | 3570 |  |  |          the __FUNCTION__ is believed to appear in K&R style function
 | 
      
         | 3571 |  |  |          parameter declarator.  In that case we still don't have
 | 
      
         | 3572 |  |  |          function_scope.  */
 | 
      
         | 3573 |  |  |       && (!seen_error () || current_function_scope))
 | 
      
         | 3574 |  |  |     {
 | 
      
         | 3575 |  |  |       DECL_CONTEXT (decl) = current_function_decl;
 | 
      
         | 3576 |  |  |       bind (id, decl, current_function_scope,
 | 
      
         | 3577 |  |  |             /*invisible=*/false, /*nested=*/false, UNKNOWN_LOCATION);
 | 
      
         | 3578 |  |  |     }
 | 
      
         | 3579 |  |  |  
 | 
      
         | 3580 |  |  |   finish_decl (decl, loc, init, NULL_TREE, NULL_TREE);
 | 
      
         | 3581 |  |  |  
 | 
      
         | 3582 |  |  |   return decl;
 | 
      
         | 3583 |  |  | }
 | 
      
         | 3584 |  |  |  
 | 
      
         | 3585 |  |  | tree
 | 
      
         | 3586 |  |  | c_builtin_function (tree decl)
 | 
      
         | 3587 |  |  | {
 | 
      
         | 3588 |  |  |   tree type = TREE_TYPE (decl);
 | 
      
         | 3589 |  |  |   tree   id = DECL_NAME (decl);
 | 
      
         | 3590 |  |  |  
 | 
      
         | 3591 |  |  |   const char *name = IDENTIFIER_POINTER (id);
 | 
      
         | 3592 |  |  |   C_DECL_BUILTIN_PROTOTYPE (decl) = prototype_p (type);
 | 
      
         | 3593 |  |  |  
 | 
      
         | 3594 |  |  |   /* Should never be called on a symbol with a preexisting meaning.  */
 | 
      
         | 3595 |  |  |   gcc_assert (!I_SYMBOL_BINDING (id));
 | 
      
         | 3596 |  |  |  
 | 
      
         | 3597 |  |  |   bind (id, decl, external_scope, /*invisible=*/true, /*nested=*/false,
 | 
      
         | 3598 |  |  |         UNKNOWN_LOCATION);
 | 
      
         | 3599 |  |  |  
 | 
      
         | 3600 |  |  |   /* Builtins in the implementation namespace are made visible without
 | 
      
         | 3601 |  |  |      needing to be explicitly declared.  See push_file_scope.  */
 | 
      
         | 3602 |  |  |   if (name[0] == '_' && (name[1] == '_' || ISUPPER (name[1])))
 | 
      
         | 3603 |  |  |     {
 | 
      
         | 3604 |  |  |       DECL_CHAIN (decl) = visible_builtins;
 | 
      
         | 3605 |  |  |       visible_builtins = decl;
 | 
      
         | 3606 |  |  |     }
 | 
      
         | 3607 |  |  |  
 | 
      
         | 3608 |  |  |   return decl;
 | 
      
         | 3609 |  |  | }
 | 
      
         | 3610 |  |  |  
 | 
      
         | 3611 |  |  | tree
 | 
      
         | 3612 |  |  | c_builtin_function_ext_scope (tree decl)
 | 
      
         | 3613 |  |  | {
 | 
      
         | 3614 |  |  |   tree type = TREE_TYPE (decl);
 | 
      
         | 3615 |  |  |   tree   id = DECL_NAME (decl);
 | 
      
         | 3616 |  |  |  
 | 
      
         | 3617 |  |  |   const char *name = IDENTIFIER_POINTER (id);
 | 
      
         | 3618 |  |  |   C_DECL_BUILTIN_PROTOTYPE (decl) = prototype_p (type);
 | 
      
         | 3619 |  |  |  
 | 
      
         | 3620 |  |  |   /* Should never be called on a symbol with a preexisting meaning.  */
 | 
      
         | 3621 |  |  |   gcc_assert (!I_SYMBOL_BINDING (id));
 | 
      
         | 3622 |  |  |  
 | 
      
         | 3623 |  |  |   bind (id, decl, external_scope, /*invisible=*/false, /*nested=*/false,
 | 
      
         | 3624 |  |  |         UNKNOWN_LOCATION);
 | 
      
         | 3625 |  |  |  
 | 
      
         | 3626 |  |  |   /* Builtins in the implementation namespace are made visible without
 | 
      
         | 3627 |  |  |      needing to be explicitly declared.  See push_file_scope.  */
 | 
      
         | 3628 |  |  |   if (name[0] == '_' && (name[1] == '_' || ISUPPER (name[1])))
 | 
      
         | 3629 |  |  |     {
 | 
      
         | 3630 |  |  |       DECL_CHAIN (decl) = visible_builtins;
 | 
      
         | 3631 |  |  |       visible_builtins = decl;
 | 
      
         | 3632 |  |  |     }
 | 
      
         | 3633 |  |  |  
 | 
      
         | 3634 |  |  |   return decl;
 | 
      
         | 3635 |  |  | }
 | 
      
         | 3636 |  |  |  
 | 
      
         | 3637 |  |  | /* Called when a declaration is seen that contains no names to declare.
 | 
      
         | 3638 |  |  |    If its type is a reference to a structure, union or enum inherited
 | 
      
         | 3639 |  |  |    from a containing scope, shadow that tag name for the current scope
 | 
      
         | 3640 |  |  |    with a forward reference.
 | 
      
         | 3641 |  |  |    If its type defines a new named structure or union
 | 
      
         | 3642 |  |  |    or defines an enum, it is valid but we need not do anything here.
 | 
      
         | 3643 |  |  |    Otherwise, it is an error.  */
 | 
      
         | 3644 |  |  |  
 | 
      
         | 3645 |  |  | void
 | 
      
         | 3646 |  |  | shadow_tag (const struct c_declspecs *declspecs)
 | 
      
         | 3647 |  |  | {
 | 
      
         | 3648 |  |  |   shadow_tag_warned (declspecs, 0);
 | 
      
         | 3649 |  |  | }
 | 
      
         | 3650 |  |  |  
 | 
      
         | 3651 |  |  | /* WARNED is 1 if we have done a pedwarn, 2 if we have done a warning,
 | 
      
         | 3652 |  |  |    but no pedwarn.  */
 | 
      
         | 3653 |  |  | void
 | 
      
         | 3654 |  |  | shadow_tag_warned (const struct c_declspecs *declspecs, int warned)
 | 
      
         | 3655 |  |  | {
 | 
      
         | 3656 |  |  |   bool found_tag = false;
 | 
      
         | 3657 |  |  |  
 | 
      
         | 3658 |  |  |   if (declspecs->type && !declspecs->default_int_p && !declspecs->typedef_p)
 | 
      
         | 3659 |  |  |     {
 | 
      
         | 3660 |  |  |       tree value = declspecs->type;
 | 
      
         | 3661 |  |  |       enum tree_code code = TREE_CODE (value);
 | 
      
         | 3662 |  |  |  
 | 
      
         | 3663 |  |  |       if (code == RECORD_TYPE || code == UNION_TYPE || code == ENUMERAL_TYPE)
 | 
      
         | 3664 |  |  |         /* Used to test also that TYPE_SIZE (value) != 0.
 | 
      
         | 3665 |  |  |            That caused warning for `struct foo;' at top level in the file.  */
 | 
      
         | 3666 |  |  |         {
 | 
      
         | 3667 |  |  |           tree name = TYPE_NAME (value);
 | 
      
         | 3668 |  |  |           tree t;
 | 
      
         | 3669 |  |  |  
 | 
      
         | 3670 |  |  |           found_tag = true;
 | 
      
         | 3671 |  |  |  
 | 
      
         | 3672 |  |  |           if (declspecs->restrict_p)
 | 
      
         | 3673 |  |  |             {
 | 
      
         | 3674 |  |  |               error ("invalid use of %<restrict%>");
 | 
      
         | 3675 |  |  |               warned = 1;
 | 
      
         | 3676 |  |  |             }
 | 
      
         | 3677 |  |  |  
 | 
      
         | 3678 |  |  |           if (name == 0)
 | 
      
         | 3679 |  |  |             {
 | 
      
         | 3680 |  |  |               if (warned != 1 && code != ENUMERAL_TYPE)
 | 
      
         | 3681 |  |  |                 /* Empty unnamed enum OK */
 | 
      
         | 3682 |  |  |                 {
 | 
      
         | 3683 |  |  |                   pedwarn (input_location, 0,
 | 
      
         | 3684 |  |  |                            "unnamed struct/union that defines no instances");
 | 
      
         | 3685 |  |  |                   warned = 1;
 | 
      
         | 3686 |  |  |                 }
 | 
      
         | 3687 |  |  |             }
 | 
      
         | 3688 |  |  |           else if (declspecs->typespec_kind != ctsk_tagdef
 | 
      
         | 3689 |  |  |                    && declspecs->typespec_kind != ctsk_tagfirstref
 | 
      
         | 3690 |  |  |                    && declspecs->storage_class != csc_none)
 | 
      
         | 3691 |  |  |             {
 | 
      
         | 3692 |  |  |               if (warned != 1)
 | 
      
         | 3693 |  |  |                 pedwarn (input_location, 0,
 | 
      
         | 3694 |  |  |                          "empty declaration with storage class specifier "
 | 
      
         | 3695 |  |  |                          "does not redeclare tag");
 | 
      
         | 3696 |  |  |               warned = 1;
 | 
      
         | 3697 |  |  |               pending_xref_error ();
 | 
      
         | 3698 |  |  |             }
 | 
      
         | 3699 |  |  |           else if (declspecs->typespec_kind != ctsk_tagdef
 | 
      
         | 3700 |  |  |                    && declspecs->typespec_kind != ctsk_tagfirstref
 | 
      
         | 3701 |  |  |                    && (declspecs->const_p
 | 
      
         | 3702 |  |  |                        || declspecs->volatile_p
 | 
      
         | 3703 |  |  |                        || declspecs->restrict_p
 | 
      
         | 3704 |  |  |                        || declspecs->address_space))
 | 
      
         | 3705 |  |  |             {
 | 
      
         | 3706 |  |  |               if (warned != 1)
 | 
      
         | 3707 |  |  |                 pedwarn (input_location, 0,
 | 
      
         | 3708 |  |  |                          "empty declaration with type qualifier "
 | 
      
         | 3709 |  |  |                           "does not redeclare tag");
 | 
      
         | 3710 |  |  |               warned = 1;
 | 
      
         | 3711 |  |  |               pending_xref_error ();
 | 
      
         | 3712 |  |  |             }
 | 
      
         | 3713 |  |  |           else if (declspecs->typespec_kind != ctsk_tagdef
 | 
      
         | 3714 |  |  |                    && declspecs->typespec_kind != ctsk_tagfirstref
 | 
      
         | 3715 |  |  |                    && declspecs->alignas_p)
 | 
      
         | 3716 |  |  |             {
 | 
      
         | 3717 |  |  |               if (warned != 1)
 | 
      
         | 3718 |  |  |                 pedwarn (input_location, 0,
 | 
      
         | 3719 |  |  |                          "empty declaration with %<_Alignas%> "
 | 
      
         | 3720 |  |  |                           "does not redeclare tag");
 | 
      
         | 3721 |  |  |               warned = 1;
 | 
      
         | 3722 |  |  |               pending_xref_error ();
 | 
      
         | 3723 |  |  |             }
 | 
      
         | 3724 |  |  |           else
 | 
      
         | 3725 |  |  |             {
 | 
      
         | 3726 |  |  |               pending_invalid_xref = 0;
 | 
      
         | 3727 |  |  |               t = lookup_tag (code, name, 1, NULL);
 | 
      
         | 3728 |  |  |  
 | 
      
         | 3729 |  |  |               if (t == 0)
 | 
      
         | 3730 |  |  |                 {
 | 
      
         | 3731 |  |  |                   t = make_node (code);
 | 
      
         | 3732 |  |  |                   pushtag (input_location, name, t);
 | 
      
         | 3733 |  |  |                 }
 | 
      
         | 3734 |  |  |             }
 | 
      
         | 3735 |  |  |         }
 | 
      
         | 3736 |  |  |       else
 | 
      
         | 3737 |  |  |         {
 | 
      
         | 3738 |  |  |           if (warned != 1 && !in_system_header)
 | 
      
         | 3739 |  |  |             {
 | 
      
         | 3740 |  |  |               pedwarn (input_location, 0,
 | 
      
         | 3741 |  |  |                        "useless type name in empty declaration");
 | 
      
         | 3742 |  |  |               warned = 1;
 | 
      
         | 3743 |  |  |             }
 | 
      
         | 3744 |  |  |         }
 | 
      
         | 3745 |  |  |     }
 | 
      
         | 3746 |  |  |   else if (warned != 1 && !in_system_header && declspecs->typedef_p)
 | 
      
         | 3747 |  |  |     {
 | 
      
         | 3748 |  |  |       pedwarn (input_location, 0, "useless type name in empty declaration");
 | 
      
         | 3749 |  |  |       warned = 1;
 | 
      
         | 3750 |  |  |     }
 | 
      
         | 3751 |  |  |  
 | 
      
         | 3752 |  |  |   pending_invalid_xref = 0;
 | 
      
         | 3753 |  |  |  
 | 
      
         | 3754 |  |  |   if (declspecs->inline_p)
 | 
      
         | 3755 |  |  |     {
 | 
      
         | 3756 |  |  |       error ("%<inline%> in empty declaration");
 | 
      
         | 3757 |  |  |       warned = 1;
 | 
      
         | 3758 |  |  |     }
 | 
      
         | 3759 |  |  |  
 | 
      
         | 3760 |  |  |   if (declspecs->noreturn_p)
 | 
      
         | 3761 |  |  |     {
 | 
      
         | 3762 |  |  |       error ("%<_Noreturn%> in empty declaration");
 | 
      
         | 3763 |  |  |       warned = 1;
 | 
      
         | 3764 |  |  |     }
 | 
      
         | 3765 |  |  |  
 | 
      
         | 3766 |  |  |   if (current_scope == file_scope && declspecs->storage_class == csc_auto)
 | 
      
         | 3767 |  |  |     {
 | 
      
         | 3768 |  |  |       error ("%<auto%> in file-scope empty declaration");
 | 
      
         | 3769 |  |  |       warned = 1;
 | 
      
         | 3770 |  |  |     }
 | 
      
         | 3771 |  |  |  
 | 
      
         | 3772 |  |  |   if (current_scope == file_scope && declspecs->storage_class == csc_register)
 | 
      
         | 3773 |  |  |     {
 | 
      
         | 3774 |  |  |       error ("%<register%> in file-scope empty declaration");
 | 
      
         | 3775 |  |  |       warned = 1;
 | 
      
         | 3776 |  |  |     }
 | 
      
         | 3777 |  |  |  
 | 
      
         | 3778 |  |  |   if (!warned && !in_system_header && declspecs->storage_class != csc_none)
 | 
      
         | 3779 |  |  |     {
 | 
      
         | 3780 |  |  |       warning (0, "useless storage class specifier in empty declaration");
 | 
      
         | 3781 |  |  |       warned = 2;
 | 
      
         | 3782 |  |  |     }
 | 
      
         | 3783 |  |  |  
 | 
      
         | 3784 |  |  |   if (!warned && !in_system_header && declspecs->thread_p)
 | 
      
         | 3785 |  |  |     {
 | 
      
         | 3786 |  |  |       warning (0, "useless %<__thread%> in empty declaration");
 | 
      
         | 3787 |  |  |       warned = 2;
 | 
      
         | 3788 |  |  |     }
 | 
      
         | 3789 |  |  |  
 | 
      
         | 3790 |  |  |   if (!warned && !in_system_header && (declspecs->const_p
 | 
      
         | 3791 |  |  |                                        || declspecs->volatile_p
 | 
      
         | 3792 |  |  |                                        || declspecs->restrict_p
 | 
      
         | 3793 |  |  |                                        || declspecs->address_space))
 | 
      
         | 3794 |  |  |     {
 | 
      
         | 3795 |  |  |       warning (0, "useless type qualifier in empty declaration");
 | 
      
         | 3796 |  |  |       warned = 2;
 | 
      
         | 3797 |  |  |     }
 | 
      
         | 3798 |  |  |  
 | 
      
         | 3799 |  |  |   if (!warned && !in_system_header && declspecs->alignas_p)
 | 
      
         | 3800 |  |  |     {
 | 
      
         | 3801 |  |  |       warning (0, "useless %<_Alignas%> in empty declaration");
 | 
      
         | 3802 |  |  |       warned = 2;
 | 
      
         | 3803 |  |  |     }
 | 
      
         | 3804 |  |  |  
 | 
      
         | 3805 |  |  |   if (warned != 1)
 | 
      
         | 3806 |  |  |     {
 | 
      
         | 3807 |  |  |       if (!found_tag)
 | 
      
         | 3808 |  |  |         pedwarn (input_location, 0, "empty declaration");
 | 
      
         | 3809 |  |  |     }
 | 
      
         | 3810 |  |  | }
 | 
      
         | 3811 |  |  |  
 | 
      
         | 3812 |  |  |  
 | 
      
         | 3813 |  |  | /* Return the qualifiers from SPECS as a bitwise OR of TYPE_QUAL_*
 | 
      
         | 3814 |  |  |    bits.  SPECS represents declaration specifiers that the grammar
 | 
      
         | 3815 |  |  |    only permits to contain type qualifiers and attributes.  */
 | 
      
         | 3816 |  |  |  
 | 
      
         | 3817 |  |  | int
 | 
      
         | 3818 |  |  | quals_from_declspecs (const struct c_declspecs *specs)
 | 
      
         | 3819 |  |  | {
 | 
      
         | 3820 |  |  |   int quals = ((specs->const_p ? TYPE_QUAL_CONST : 0)
 | 
      
         | 3821 |  |  |                | (specs->volatile_p ? TYPE_QUAL_VOLATILE : 0)
 | 
      
         | 3822 |  |  |                | (specs->restrict_p ? TYPE_QUAL_RESTRICT : 0)
 | 
      
         | 3823 |  |  |                | (ENCODE_QUAL_ADDR_SPACE (specs->address_space)));
 | 
      
         | 3824 |  |  |   gcc_assert (!specs->type
 | 
      
         | 3825 |  |  |               && !specs->decl_attr
 | 
      
         | 3826 |  |  |               && specs->typespec_word == cts_none
 | 
      
         | 3827 |  |  |               && specs->storage_class == csc_none
 | 
      
         | 3828 |  |  |               && !specs->typedef_p
 | 
      
         | 3829 |  |  |               && !specs->explicit_signed_p
 | 
      
         | 3830 |  |  |               && !specs->deprecated_p
 | 
      
         | 3831 |  |  |               && !specs->long_p
 | 
      
         | 3832 |  |  |               && !specs->long_long_p
 | 
      
         | 3833 |  |  |               && !specs->short_p
 | 
      
         | 3834 |  |  |               && !specs->signed_p
 | 
      
         | 3835 |  |  |               && !specs->unsigned_p
 | 
      
         | 3836 |  |  |               && !specs->complex_p
 | 
      
         | 3837 |  |  |               && !specs->inline_p
 | 
      
         | 3838 |  |  |               && !specs->noreturn_p
 | 
      
         | 3839 |  |  |               && !specs->thread_p);
 | 
      
         | 3840 |  |  |   return quals;
 | 
      
         | 3841 |  |  | }
 | 
      
         | 3842 |  |  |  
 | 
      
         | 3843 |  |  | /* Construct an array declarator.  LOC is the location of the
 | 
      
         | 3844 |  |  |    beginning of the array (usually the opening brace).  EXPR is the
 | 
      
         | 3845 |  |  |    expression inside [], or NULL_TREE.  QUALS are the type qualifiers
 | 
      
         | 3846 |  |  |    inside the [] (to be applied to the pointer to which a parameter
 | 
      
         | 3847 |  |  |    array is converted).  STATIC_P is true if "static" is inside the
 | 
      
         | 3848 |  |  |    [], false otherwise.  VLA_UNSPEC_P is true if the array is [*], a
 | 
      
         | 3849 |  |  |    VLA of unspecified length which is nevertheless a complete type,
 | 
      
         | 3850 |  |  |    false otherwise.  The field for the contained declarator is left to
 | 
      
         | 3851 |  |  |    be filled in by set_array_declarator_inner.  */
 | 
      
         | 3852 |  |  |  
 | 
      
         | 3853 |  |  | struct c_declarator *
 | 
      
         | 3854 |  |  | build_array_declarator (location_t loc,
 | 
      
         | 3855 |  |  |                         tree expr, struct c_declspecs *quals, bool static_p,
 | 
      
         | 3856 |  |  |                         bool vla_unspec_p)
 | 
      
         | 3857 |  |  | {
 | 
      
         | 3858 |  |  |   struct c_declarator *declarator = XOBNEW (&parser_obstack,
 | 
      
         | 3859 |  |  |                                             struct c_declarator);
 | 
      
         | 3860 |  |  |   declarator->id_loc = loc;
 | 
      
         | 3861 |  |  |   declarator->kind = cdk_array;
 | 
      
         | 3862 |  |  |   declarator->declarator = 0;
 | 
      
         | 3863 |  |  |   declarator->u.array.dimen = expr;
 | 
      
         | 3864 |  |  |   if (quals)
 | 
      
         | 3865 |  |  |     {
 | 
      
         | 3866 |  |  |       declarator->u.array.attrs = quals->attrs;
 | 
      
         | 3867 |  |  |       declarator->u.array.quals = quals_from_declspecs (quals);
 | 
      
         | 3868 |  |  |     }
 | 
      
         | 3869 |  |  |   else
 | 
      
         | 3870 |  |  |     {
 | 
      
         | 3871 |  |  |       declarator->u.array.attrs = NULL_TREE;
 | 
      
         | 3872 |  |  |       declarator->u.array.quals = 0;
 | 
      
         | 3873 |  |  |     }
 | 
      
         | 3874 |  |  |   declarator->u.array.static_p = static_p;
 | 
      
         | 3875 |  |  |   declarator->u.array.vla_unspec_p = vla_unspec_p;
 | 
      
         | 3876 |  |  |   if (!flag_isoc99)
 | 
      
         | 3877 |  |  |     {
 | 
      
         | 3878 |  |  |       if (static_p || quals != NULL)
 | 
      
         | 3879 |  |  |         pedwarn (loc, OPT_pedantic,
 | 
      
         | 3880 |  |  |                  "ISO C90 does not support %<static%> or type "
 | 
      
         | 3881 |  |  |                  "qualifiers in parameter array declarators");
 | 
      
         | 3882 |  |  |       if (vla_unspec_p)
 | 
      
         | 3883 |  |  |         pedwarn (loc, OPT_pedantic,
 | 
      
         | 3884 |  |  |                  "ISO C90 does not support %<[*]%> array declarators");
 | 
      
         | 3885 |  |  |     }
 | 
      
         | 3886 |  |  |   if (vla_unspec_p)
 | 
      
         | 3887 |  |  |     {
 | 
      
         | 3888 |  |  |       if (!current_scope->parm_flag)
 | 
      
         | 3889 |  |  |         {
 | 
      
         | 3890 |  |  |           /* C99 6.7.5.2p4 */
 | 
      
         | 3891 |  |  |           error_at (loc, "%<[*]%> not allowed in other than "
 | 
      
         | 3892 |  |  |                     "function prototype scope");
 | 
      
         | 3893 |  |  |           declarator->u.array.vla_unspec_p = false;
 | 
      
         | 3894 |  |  |           return NULL;
 | 
      
         | 3895 |  |  |         }
 | 
      
         | 3896 |  |  |       current_scope->had_vla_unspec = true;
 | 
      
         | 3897 |  |  |     }
 | 
      
         | 3898 |  |  |   return declarator;
 | 
      
         | 3899 |  |  | }
 | 
      
         | 3900 |  |  |  
 | 
      
         | 3901 |  |  | /* Set the contained declarator of an array declarator.  DECL is the
 | 
      
         | 3902 |  |  |    declarator, as constructed by build_array_declarator; INNER is what
 | 
      
         | 3903 |  |  |    appears on the left of the [].  */
 | 
      
         | 3904 |  |  |  
 | 
      
         | 3905 |  |  | struct c_declarator *
 | 
      
         | 3906 |  |  | set_array_declarator_inner (struct c_declarator *decl,
 | 
      
         | 3907 |  |  |                             struct c_declarator *inner)
 | 
      
         | 3908 |  |  | {
 | 
      
         | 3909 |  |  |   decl->declarator = inner;
 | 
      
         | 3910 |  |  |   return decl;
 | 
      
         | 3911 |  |  | }
 | 
      
         | 3912 |  |  |  
 | 
      
         | 3913 |  |  | /* INIT is a constructor that forms DECL's initializer.  If the final
 | 
      
         | 3914 |  |  |    element initializes a flexible array field, add the size of that
 | 
      
         | 3915 |  |  |    initializer to DECL's size.  */
 | 
      
         | 3916 |  |  |  
 | 
      
         | 3917 |  |  | static void
 | 
      
         | 3918 |  |  | add_flexible_array_elts_to_size (tree decl, tree init)
 | 
      
         | 3919 |  |  | {
 | 
      
         | 3920 |  |  |   tree elt, type;
 | 
      
         | 3921 |  |  |  
 | 
      
         | 3922 |  |  |   if (VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (init)))
 | 
      
         | 3923 |  |  |     return;
 | 
      
         | 3924 |  |  |  
 | 
      
         | 3925 |  |  |   elt = VEC_last (constructor_elt, CONSTRUCTOR_ELTS (init))->value;
 | 
      
         | 3926 |  |  |   type = TREE_TYPE (elt);
 | 
      
         | 3927 |  |  |   if (TREE_CODE (type) == ARRAY_TYPE
 | 
      
         | 3928 |  |  |       && TYPE_SIZE (type) == NULL_TREE
 | 
      
         | 3929 |  |  |       && TYPE_DOMAIN (type) != NULL_TREE
 | 
      
         | 3930 |  |  |       && TYPE_MAX_VALUE (TYPE_DOMAIN (type)) == NULL_TREE)
 | 
      
         | 3931 |  |  |     {
 | 
      
         | 3932 |  |  |       complete_array_type (&type, elt, false);
 | 
      
         | 3933 |  |  |       DECL_SIZE (decl)
 | 
      
         | 3934 |  |  |         = size_binop (PLUS_EXPR, DECL_SIZE (decl), TYPE_SIZE (type));
 | 
      
         | 3935 |  |  |       DECL_SIZE_UNIT (decl)
 | 
      
         | 3936 |  |  |         = size_binop (PLUS_EXPR, DECL_SIZE_UNIT (decl), TYPE_SIZE_UNIT (type));
 | 
      
         | 3937 |  |  |     }
 | 
      
         | 3938 |  |  | }
 | 
      
         | 3939 |  |  |  
 | 
      
         | 3940 |  |  | /* Decode a "typename", such as "int **", returning a ..._TYPE node.
 | 
      
         | 3941 |  |  |    Set *EXPR, if EXPR not NULL, to any expression to be evaluated
 | 
      
         | 3942 |  |  |    before the type name, and set *EXPR_CONST_OPERANDS, if
 | 
      
         | 3943 |  |  |    EXPR_CONST_OPERANDS not NULL, to indicate whether the type name may
 | 
      
         | 3944 |  |  |    appear in a constant expression.  */
 | 
      
         | 3945 |  |  |  
 | 
      
         | 3946 |  |  | tree
 | 
      
         | 3947 |  |  | groktypename (struct c_type_name *type_name, tree *expr,
 | 
      
         | 3948 |  |  |               bool *expr_const_operands)
 | 
      
         | 3949 |  |  | {
 | 
      
         | 3950 |  |  |   tree type;
 | 
      
         | 3951 |  |  |   tree attrs = type_name->specs->attrs;
 | 
      
         | 3952 |  |  |  
 | 
      
         | 3953 |  |  |   type_name->specs->attrs = NULL_TREE;
 | 
      
         | 3954 |  |  |  
 | 
      
         | 3955 |  |  |   type = grokdeclarator (type_name->declarator, type_name->specs, TYPENAME,
 | 
      
         | 3956 |  |  |                          false, NULL, &attrs, expr, expr_const_operands,
 | 
      
         | 3957 |  |  |                          DEPRECATED_NORMAL);
 | 
      
         | 3958 |  |  |  
 | 
      
         | 3959 |  |  |   /* Apply attributes.  */
 | 
      
         | 3960 |  |  |   decl_attributes (&type, attrs, 0);
 | 
      
         | 3961 |  |  |  
 | 
      
         | 3962 |  |  |   return type;
 | 
      
         | 3963 |  |  | }
 | 
      
         | 3964 |  |  |  
 | 
      
         | 3965 |  |  | /* Decode a declarator in an ordinary declaration or data definition.
 | 
      
         | 3966 |  |  |    This is called as soon as the type information and variable name
 | 
      
         | 3967 |  |  |    have been parsed, before parsing the initializer if any.
 | 
      
         | 3968 |  |  |    Here we create the ..._DECL node, fill in its type,
 | 
      
         | 3969 |  |  |    and put it on the list of decls for the current context.
 | 
      
         | 3970 |  |  |    The ..._DECL node is returned as the value.
 | 
      
         | 3971 |  |  |  
 | 
      
         | 3972 |  |  |    Exception: for arrays where the length is not specified,
 | 
      
         | 3973 |  |  |    the type is left null, to be filled in by `finish_decl'.
 | 
      
         | 3974 |  |  |  
 | 
      
         | 3975 |  |  |    Function definitions do not come here; they go to start_function
 | 
      
         | 3976 |  |  |    instead.  However, external and forward declarations of functions
 | 
      
         | 3977 |  |  |    do go through here.  Structure field declarations are done by
 | 
      
         | 3978 |  |  |    grokfield and not through here.  */
 | 
      
         | 3979 |  |  |  
 | 
      
         | 3980 |  |  | tree
 | 
      
         | 3981 |  |  | start_decl (struct c_declarator *declarator, struct c_declspecs *declspecs,
 | 
      
         | 3982 |  |  |             bool initialized, tree attributes)
 | 
      
         | 3983 |  |  | {
 | 
      
         | 3984 |  |  |   tree decl;
 | 
      
         | 3985 |  |  |   tree tem;
 | 
      
         | 3986 |  |  |   tree expr = NULL_TREE;
 | 
      
         | 3987 |  |  |   enum deprecated_states deprecated_state = DEPRECATED_NORMAL;
 | 
      
         | 3988 |  |  |  
 | 
      
         | 3989 |  |  |   /* An object declared as __attribute__((deprecated)) suppresses
 | 
      
         | 3990 |  |  |      warnings of uses of other deprecated items.  */
 | 
      
         | 3991 |  |  |   if (lookup_attribute ("deprecated", attributes))
 | 
      
         | 3992 |  |  |     deprecated_state = DEPRECATED_SUPPRESS;
 | 
      
         | 3993 |  |  |  
 | 
      
         | 3994 |  |  |   decl = grokdeclarator (declarator, declspecs,
 | 
      
         | 3995 |  |  |                          NORMAL, initialized, NULL, &attributes, &expr, NULL,
 | 
      
         | 3996 |  |  |                          deprecated_state);
 | 
      
         | 3997 |  |  |   if (!decl)
 | 
      
         | 3998 |  |  |     return 0;
 | 
      
         | 3999 |  |  |  
 | 
      
         | 4000 |  |  |   if (expr)
 | 
      
         | 4001 |  |  |     add_stmt (fold_convert (void_type_node, expr));
 | 
      
         | 4002 |  |  |  
 | 
      
         | 4003 |  |  |   if (TREE_CODE (decl) != FUNCTION_DECL && MAIN_NAME_P (DECL_NAME (decl)))
 | 
      
         | 4004 |  |  |     warning (OPT_Wmain, "%q+D is usually a function", decl);
 | 
      
         | 4005 |  |  |  
 | 
      
         | 4006 |  |  |   if (initialized)
 | 
      
         | 4007 |  |  |     /* Is it valid for this decl to have an initializer at all?
 | 
      
         | 4008 |  |  |        If not, set INITIALIZED to zero, which will indirectly
 | 
      
         | 4009 |  |  |        tell 'finish_decl' to ignore the initializer once it is parsed.  */
 | 
      
         | 4010 |  |  |     switch (TREE_CODE (decl))
 | 
      
         | 4011 |  |  |       {
 | 
      
         | 4012 |  |  |       case TYPE_DECL:
 | 
      
         | 4013 |  |  |         error ("typedef %qD is initialized (use __typeof__ instead)", decl);
 | 
      
         | 4014 |  |  |         initialized = 0;
 | 
      
         | 4015 |  |  |         break;
 | 
      
         | 4016 |  |  |  
 | 
      
         | 4017 |  |  |       case FUNCTION_DECL:
 | 
      
         | 4018 |  |  |         error ("function %qD is initialized like a variable", decl);
 | 
      
         | 4019 |  |  |         initialized = 0;
 | 
      
         | 4020 |  |  |         break;
 | 
      
         | 4021 |  |  |  
 | 
      
         | 4022 |  |  |       case PARM_DECL:
 | 
      
         | 4023 |  |  |         /* DECL_INITIAL in a PARM_DECL is really DECL_ARG_TYPE.  */
 | 
      
         | 4024 |  |  |         error ("parameter %qD is initialized", decl);
 | 
      
         | 4025 |  |  |         initialized = 0;
 | 
      
         | 4026 |  |  |         break;
 | 
      
         | 4027 |  |  |  
 | 
      
         | 4028 |  |  |       default:
 | 
      
         | 4029 |  |  |         /* Don't allow initializations for incomplete types except for
 | 
      
         | 4030 |  |  |            arrays which might be completed by the initialization.  */
 | 
      
         | 4031 |  |  |  
 | 
      
         | 4032 |  |  |         /* This can happen if the array size is an undefined macro.
 | 
      
         | 4033 |  |  |            We already gave a warning, so we don't need another one.  */
 | 
      
         | 4034 |  |  |         if (TREE_TYPE (decl) == error_mark_node)
 | 
      
         | 4035 |  |  |           initialized = 0;
 | 
      
         | 4036 |  |  |         else if (COMPLETE_TYPE_P (TREE_TYPE (decl)))
 | 
      
         | 4037 |  |  |           {
 | 
      
         | 4038 |  |  |             /* A complete type is ok if size is fixed.  */
 | 
      
         | 4039 |  |  |  
 | 
      
         | 4040 |  |  |             if (TREE_CODE (TYPE_SIZE (TREE_TYPE (decl))) != INTEGER_CST
 | 
      
         | 4041 |  |  |                 || C_DECL_VARIABLE_SIZE (decl))
 | 
      
         | 4042 |  |  |               {
 | 
      
         | 4043 |  |  |                 error ("variable-sized object may not be initialized");
 | 
      
         | 4044 |  |  |                 initialized = 0;
 | 
      
         | 4045 |  |  |               }
 | 
      
         | 4046 |  |  |           }
 | 
      
         | 4047 |  |  |         else if (TREE_CODE (TREE_TYPE (decl)) != ARRAY_TYPE)
 | 
      
         | 4048 |  |  |           {
 | 
      
         | 4049 |  |  |             error ("variable %qD has initializer but incomplete type", decl);
 | 
      
         | 4050 |  |  |             initialized = 0;
 | 
      
         | 4051 |  |  |           }
 | 
      
         | 4052 |  |  |         else if (C_DECL_VARIABLE_SIZE (decl))
 | 
      
         | 4053 |  |  |           {
 | 
      
         | 4054 |  |  |             /* Although C99 is unclear about whether incomplete arrays
 | 
      
         | 4055 |  |  |                of VLAs themselves count as VLAs, it does not make
 | 
      
         | 4056 |  |  |                sense to permit them to be initialized given that
 | 
      
         | 4057 |  |  |                ordinary VLAs may not be initialized.  */
 | 
      
         | 4058 |  |  |             error ("variable-sized object may not be initialized");
 | 
      
         | 4059 |  |  |             initialized = 0;
 | 
      
         | 4060 |  |  |           }
 | 
      
         | 4061 |  |  |       }
 | 
      
         | 4062 |  |  |  
 | 
      
         | 4063 |  |  |   if (initialized)
 | 
      
         | 4064 |  |  |     {
 | 
      
         | 4065 |  |  |       if (current_scope == file_scope)
 | 
      
         | 4066 |  |  |         TREE_STATIC (decl) = 1;
 | 
      
         | 4067 |  |  |  
 | 
      
         | 4068 |  |  |       /* Tell 'pushdecl' this is an initialized decl
 | 
      
         | 4069 |  |  |          even though we don't yet have the initializer expression.
 | 
      
         | 4070 |  |  |          Also tell 'finish_decl' it may store the real initializer.  */
 | 
      
         | 4071 |  |  |       DECL_INITIAL (decl) = error_mark_node;
 | 
      
         | 4072 |  |  |     }
 | 
      
         | 4073 |  |  |  
 | 
      
         | 4074 |  |  |   /* If this is a function declaration, write a record describing it to the
 | 
      
         | 4075 |  |  |      prototypes file (if requested).  */
 | 
      
         | 4076 |  |  |  
 | 
      
         | 4077 |  |  |   if (TREE_CODE (decl) == FUNCTION_DECL)
 | 
      
         | 4078 |  |  |     gen_aux_info_record (decl, 0, 0, prototype_p (TREE_TYPE (decl)));
 | 
      
         | 4079 |  |  |  
 | 
      
         | 4080 |  |  |   /* ANSI specifies that a tentative definition which is not merged with
 | 
      
         | 4081 |  |  |      a non-tentative definition behaves exactly like a definition with an
 | 
      
         | 4082 |  |  |      initializer equal to zero.  (Section 3.7.2)
 | 
      
         | 4083 |  |  |  
 | 
      
         | 4084 |  |  |      -fno-common gives strict ANSI behavior, though this tends to break
 | 
      
         | 4085 |  |  |      a large body of code that grew up without this rule.
 | 
      
         | 4086 |  |  |  
 | 
      
         | 4087 |  |  |      Thread-local variables are never common, since there's no entrenched
 | 
      
         | 4088 |  |  |      body of code to break, and it allows more efficient variable references
 | 
      
         | 4089 |  |  |      in the presence of dynamic linking.  */
 | 
      
         | 4090 |  |  |  
 | 
      
         | 4091 |  |  |   if (TREE_CODE (decl) == VAR_DECL
 | 
      
         | 4092 |  |  |       && !initialized
 | 
      
         | 4093 |  |  |       && TREE_PUBLIC (decl)
 | 
      
         | 4094 |  |  |       && !DECL_THREAD_LOCAL_P (decl)
 | 
      
         | 4095 |  |  |       && !flag_no_common)
 | 
      
         | 4096 |  |  |     DECL_COMMON (decl) = 1;
 | 
      
         | 4097 |  |  |  
 | 
      
         | 4098 |  |  |   /* Set attributes here so if duplicate decl, will have proper attributes.  */
 | 
      
         | 4099 |  |  |   decl_attributes (&decl, attributes, 0);
 | 
      
         | 4100 |  |  |  
 | 
      
         | 4101 |  |  |   /* Handle gnu_inline attribute.  */
 | 
      
         | 4102 |  |  |   if (declspecs->inline_p
 | 
      
         | 4103 |  |  |       && !flag_gnu89_inline
 | 
      
         | 4104 |  |  |       && TREE_CODE (decl) == FUNCTION_DECL
 | 
      
         | 4105 |  |  |       && (lookup_attribute ("gnu_inline", DECL_ATTRIBUTES (decl))
 | 
      
         | 4106 |  |  |           || current_function_decl))
 | 
      
         | 4107 |  |  |     {
 | 
      
         | 4108 |  |  |       if (declspecs->storage_class == csc_auto && current_scope != file_scope)
 | 
      
         | 4109 |  |  |         ;
 | 
      
         | 4110 |  |  |       else if (declspecs->storage_class != csc_static)
 | 
      
         | 4111 |  |  |         DECL_EXTERNAL (decl) = !DECL_EXTERNAL (decl);
 | 
      
         | 4112 |  |  |     }
 | 
      
         | 4113 |  |  |  
 | 
      
         | 4114 |  |  |   if (TREE_CODE (decl) == FUNCTION_DECL
 | 
      
         | 4115 |  |  |       && targetm.calls.promote_prototypes (TREE_TYPE (decl)))
 | 
      
         | 4116 |  |  |     {
 | 
      
         | 4117 |  |  |       struct c_declarator *ce = declarator;
 | 
      
         | 4118 |  |  |  
 | 
      
         | 4119 |  |  |       if (ce->kind == cdk_pointer)
 | 
      
         | 4120 |  |  |         ce = declarator->declarator;
 | 
      
         | 4121 |  |  |       if (ce->kind == cdk_function)
 | 
      
         | 4122 |  |  |         {
 | 
      
         | 4123 |  |  |           tree args = ce->u.arg_info->parms;
 | 
      
         | 4124 |  |  |           for (; args; args = DECL_CHAIN (args))
 | 
      
         | 4125 |  |  |             {
 | 
      
         | 4126 |  |  |               tree type = TREE_TYPE (args);
 | 
      
         | 4127 |  |  |               if (type && INTEGRAL_TYPE_P (type)
 | 
      
         | 4128 |  |  |                   && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))
 | 
      
         | 4129 |  |  |                 DECL_ARG_TYPE (args) = integer_type_node;
 | 
      
         | 4130 |  |  |             }
 | 
      
         | 4131 |  |  |         }
 | 
      
         | 4132 |  |  |     }
 | 
      
         | 4133 |  |  |  
 | 
      
         | 4134 |  |  |   if (TREE_CODE (decl) == FUNCTION_DECL
 | 
      
         | 4135 |  |  |       && DECL_DECLARED_INLINE_P (decl)
 | 
      
         | 4136 |  |  |       && DECL_UNINLINABLE (decl)
 | 
      
         | 4137 |  |  |       && lookup_attribute ("noinline", DECL_ATTRIBUTES (decl)))
 | 
      
         | 4138 |  |  |     warning (OPT_Wattributes, "inline function %q+D given attribute noinline",
 | 
      
         | 4139 |  |  |              decl);
 | 
      
         | 4140 |  |  |  
 | 
      
         | 4141 |  |  |   /* C99 6.7.4p3: An inline definition of a function with external
 | 
      
         | 4142 |  |  |      linkage shall not contain a definition of a modifiable object
 | 
      
         | 4143 |  |  |      with static storage duration...  */
 | 
      
         | 4144 |  |  |   if (TREE_CODE (decl) == VAR_DECL
 | 
      
         | 4145 |  |  |       && current_scope != file_scope
 | 
      
         | 4146 |  |  |       && TREE_STATIC (decl)
 | 
      
         | 4147 |  |  |       && !TREE_READONLY (decl)
 | 
      
         | 4148 |  |  |       && DECL_DECLARED_INLINE_P (current_function_decl)
 | 
      
         | 4149 |  |  |       && DECL_EXTERNAL (current_function_decl))
 | 
      
         | 4150 |  |  |     record_inline_static (input_location, current_function_decl,
 | 
      
         | 4151 |  |  |                           decl, csi_modifiable);
 | 
      
         | 4152 |  |  |  
 | 
      
         | 4153 |  |  |   if (c_dialect_objc ()
 | 
      
         | 4154 |  |  |       && (TREE_CODE (decl) == VAR_DECL
 | 
      
         | 4155 |  |  |           || TREE_CODE (decl) == FUNCTION_DECL))
 | 
      
         | 4156 |  |  |       objc_check_global_decl (decl);
 | 
      
         | 4157 |  |  |  
 | 
      
         | 4158 |  |  |   /* Add this decl to the current scope.
 | 
      
         | 4159 |  |  |      TEM may equal DECL or it may be a previous decl of the same name.  */
 | 
      
         | 4160 |  |  |   tem = pushdecl (decl);
 | 
      
         | 4161 |  |  |  
 | 
      
         | 4162 |  |  |   if (initialized && DECL_EXTERNAL (tem))
 | 
      
         | 4163 |  |  |     {
 | 
      
         | 4164 |  |  |       DECL_EXTERNAL (tem) = 0;
 | 
      
         | 4165 |  |  |       TREE_STATIC (tem) = 1;
 | 
      
         | 4166 |  |  |     }
 | 
      
         | 4167 |  |  |  
 | 
      
         | 4168 |  |  |   return tem;
 | 
      
         | 4169 |  |  | }
 | 
      
         | 4170 |  |  |  
 | 
      
         | 4171 |  |  | /* Subroutine of finish_decl. TYPE is the type of an uninitialized object
 | 
      
         | 4172 |  |  |    DECL or the non-array element type if DECL is an uninitialized array.
 | 
      
         | 4173 |  |  |    If that type has a const member, diagnose this. */
 | 
      
         | 4174 |  |  |  
 | 
      
         | 4175 |  |  | static void
 | 
      
         | 4176 |  |  | diagnose_uninitialized_cst_member (tree decl, tree type)
 | 
      
         | 4177 |  |  | {
 | 
      
         | 4178 |  |  |   tree field;
 | 
      
         | 4179 |  |  |   for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field))
 | 
      
         | 4180 |  |  |     {
 | 
      
         | 4181 |  |  |       tree field_type;
 | 
      
         | 4182 |  |  |       if (TREE_CODE (field) != FIELD_DECL)
 | 
      
         | 4183 |  |  |         continue;
 | 
      
         | 4184 |  |  |       field_type = strip_array_types (TREE_TYPE (field));
 | 
      
         | 4185 |  |  |  
 | 
      
         | 4186 |  |  |       if (TYPE_QUALS (field_type) & TYPE_QUAL_CONST)
 | 
      
         | 4187 |  |  |         {
 | 
      
         | 4188 |  |  |           warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wc___compat,
 | 
      
         | 4189 |  |  |                       "uninitialized const member in %qT is invalid in C++",
 | 
      
         | 4190 |  |  |                       strip_array_types (TREE_TYPE (decl)));
 | 
      
         | 4191 |  |  |           inform (DECL_SOURCE_LOCATION (field), "%qD should be initialized", field);
 | 
      
         | 4192 |  |  |         }
 | 
      
         | 4193 |  |  |  
 | 
      
         | 4194 |  |  |       if (TREE_CODE (field_type) == RECORD_TYPE
 | 
      
         | 4195 |  |  |           || TREE_CODE (field_type) == UNION_TYPE)
 | 
      
         | 4196 |  |  |         diagnose_uninitialized_cst_member (decl, field_type);
 | 
      
         | 4197 |  |  |     }
 | 
      
         | 4198 |  |  | }
 | 
      
         | 4199 |  |  |  
 | 
      
         | 4200 |  |  | /* Finish processing of a declaration;
 | 
      
         | 4201 |  |  |    install its initial value.
 | 
      
         | 4202 |  |  |    If ORIGTYPE is not NULL_TREE, it is the original type of INIT.
 | 
      
         | 4203 |  |  |    If the length of an array type is not known before,
 | 
      
         | 4204 |  |  |    it must be determined now, from the initial value, or it is an error.
 | 
      
         | 4205 |  |  |  
 | 
      
         | 4206 |  |  |    INIT_LOC is the location of the initial value.  */
 | 
      
         | 4207 |  |  |  
 | 
      
         | 4208 |  |  | void
 | 
      
         | 4209 |  |  | finish_decl (tree decl, location_t init_loc, tree init,
 | 
      
         | 4210 |  |  |              tree origtype, tree asmspec_tree)
 | 
      
         | 4211 |  |  | {
 | 
      
         | 4212 |  |  |   tree type;
 | 
      
         | 4213 |  |  |   bool was_incomplete = (DECL_SIZE (decl) == 0);
 | 
      
         | 4214 |  |  |   const char *asmspec = 0;
 | 
      
         | 4215 |  |  |  
 | 
      
         | 4216 |  |  |   /* If a name was specified, get the string.  */
 | 
      
         | 4217 |  |  |   if ((TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == VAR_DECL)
 | 
      
         | 4218 |  |  |       && DECL_FILE_SCOPE_P (decl))
 | 
      
         | 4219 |  |  |     asmspec_tree = maybe_apply_renaming_pragma (decl, asmspec_tree);
 | 
      
         | 4220 |  |  |   if (asmspec_tree)
 | 
      
         | 4221 |  |  |     asmspec = TREE_STRING_POINTER (asmspec_tree);
 | 
      
         | 4222 |  |  |  
 | 
      
         | 4223 |  |  |   if (TREE_CODE (decl) == VAR_DECL
 | 
      
         | 4224 |  |  |       && TREE_STATIC (decl)
 | 
      
         | 4225 |  |  |       && global_bindings_p ())
 | 
      
         | 4226 |  |  |     /* So decl is a global variable. Record the types it uses
 | 
      
         | 4227 |  |  |        so that we can decide later to emit debug info for them.  */
 | 
      
         | 4228 |  |  |     record_types_used_by_current_var_decl (decl);
 | 
      
         | 4229 |  |  |  
 | 
      
         | 4230 |  |  |   /* If `start_decl' didn't like having an initialization, ignore it now.  */
 | 
      
         | 4231 |  |  |   if (init != 0 && DECL_INITIAL (decl) == 0)
 | 
      
         | 4232 |  |  |     init = 0;
 | 
      
         | 4233 |  |  |  
 | 
      
         | 4234 |  |  |   /* Don't crash if parm is initialized.  */
 | 
      
         | 4235 |  |  |   if (TREE_CODE (decl) == PARM_DECL)
 | 
      
         | 4236 |  |  |     init = 0;
 | 
      
         | 4237 |  |  |  
 | 
      
         | 4238 |  |  |   if (init)
 | 
      
         | 4239 |  |  |     store_init_value (init_loc, decl, init, origtype);
 | 
      
         | 4240 |  |  |  
 | 
      
         | 4241 |  |  |   if (c_dialect_objc () && (TREE_CODE (decl) == VAR_DECL
 | 
      
         | 4242 |  |  |                             || TREE_CODE (decl) == FUNCTION_DECL
 | 
      
         | 4243 |  |  |                             || TREE_CODE (decl) == FIELD_DECL))
 | 
      
         | 4244 |  |  |     objc_check_decl (decl);
 | 
      
         | 4245 |  |  |  
 | 
      
         | 4246 |  |  |   type = TREE_TYPE (decl);
 | 
      
         | 4247 |  |  |  
 | 
      
         | 4248 |  |  |   /* Deduce size of array from initialization, if not already known.  */
 | 
      
         | 4249 |  |  |   if (TREE_CODE (type) == ARRAY_TYPE
 | 
      
         | 4250 |  |  |       && TYPE_DOMAIN (type) == 0
 | 
      
         | 4251 |  |  |       && TREE_CODE (decl) != TYPE_DECL)
 | 
      
         | 4252 |  |  |     {
 | 
      
         | 4253 |  |  |       bool do_default
 | 
      
         | 4254 |  |  |         = (TREE_STATIC (decl)
 | 
      
         | 4255 |  |  |            /* Even if pedantic, an external linkage array
 | 
      
         | 4256 |  |  |               may have incomplete type at first.  */
 | 
      
         | 4257 |  |  |            ? pedantic && !TREE_PUBLIC (decl)
 | 
      
         | 4258 |  |  |            : !DECL_EXTERNAL (decl));
 | 
      
         | 4259 |  |  |       int failure
 | 
      
         | 4260 |  |  |         = complete_array_type (&TREE_TYPE (decl), DECL_INITIAL (decl),
 | 
      
         | 4261 |  |  |                                do_default);
 | 
      
         | 4262 |  |  |  
 | 
      
         | 4263 |  |  |       /* Get the completed type made by complete_array_type.  */
 | 
      
         | 4264 |  |  |       type = TREE_TYPE (decl);
 | 
      
         | 4265 |  |  |  
 | 
      
         | 4266 |  |  |       switch (failure)
 | 
      
         | 4267 |  |  |         {
 | 
      
         | 4268 |  |  |         case 1:
 | 
      
         | 4269 |  |  |           error ("initializer fails to determine size of %q+D", decl);
 | 
      
         | 4270 |  |  |           break;
 | 
      
         | 4271 |  |  |  
 | 
      
         | 4272 |  |  |         case 2:
 | 
      
         | 4273 |  |  |           if (do_default)
 | 
      
         | 4274 |  |  |             error ("array size missing in %q+D", decl);
 | 
      
         | 4275 |  |  |           /* If a `static' var's size isn't known,
 | 
      
         | 4276 |  |  |              make it extern as well as static, so it does not get
 | 
      
         | 4277 |  |  |              allocated.
 | 
      
         | 4278 |  |  |              If it is not `static', then do not mark extern;
 | 
      
         | 4279 |  |  |              finish_incomplete_decl will give it a default size
 | 
      
         | 4280 |  |  |              and it will get allocated.  */
 | 
      
         | 4281 |  |  |           else if (!pedantic && TREE_STATIC (decl) && !TREE_PUBLIC (decl))
 | 
      
         | 4282 |  |  |             DECL_EXTERNAL (decl) = 1;
 | 
      
         | 4283 |  |  |           break;
 | 
      
         | 4284 |  |  |  
 | 
      
         | 4285 |  |  |         case 3:
 | 
      
         | 4286 |  |  |           error ("zero or negative size array %q+D", decl);
 | 
      
         | 4287 |  |  |           break;
 | 
      
         | 4288 |  |  |  
 | 
      
         | 4289 |  |  |         case 0:
 | 
      
         | 4290 |  |  |           /* For global variables, update the copy of the type that
 | 
      
         | 4291 |  |  |              exists in the binding.  */
 | 
      
         | 4292 |  |  |           if (TREE_PUBLIC (decl))
 | 
      
         | 4293 |  |  |             {
 | 
      
         | 4294 |  |  |               struct c_binding *b_ext = I_SYMBOL_BINDING (DECL_NAME (decl));
 | 
      
         | 4295 |  |  |               while (b_ext && !B_IN_EXTERNAL_SCOPE (b_ext))
 | 
      
         | 4296 |  |  |                 b_ext = b_ext->shadowed;
 | 
      
         | 4297 |  |  |               if (b_ext)
 | 
      
         | 4298 |  |  |                 {
 | 
      
         | 4299 |  |  |                   if (b_ext->u.type && comptypes (b_ext->u.type, type))
 | 
      
         | 4300 |  |  |                     b_ext->u.type = composite_type (b_ext->u.type, type);
 | 
      
         | 4301 |  |  |                   else
 | 
      
         | 4302 |  |  |                     b_ext->u.type = type;
 | 
      
         | 4303 |  |  |                 }
 | 
      
         | 4304 |  |  |             }
 | 
      
         | 4305 |  |  |           break;
 | 
      
         | 4306 |  |  |  
 | 
      
         | 4307 |  |  |         default:
 | 
      
         | 4308 |  |  |           gcc_unreachable ();
 | 
      
         | 4309 |  |  |         }
 | 
      
         | 4310 |  |  |  
 | 
      
         | 4311 |  |  |       if (DECL_INITIAL (decl))
 | 
      
         | 4312 |  |  |         TREE_TYPE (DECL_INITIAL (decl)) = type;
 | 
      
         | 4313 |  |  |  
 | 
      
         | 4314 |  |  |       relayout_decl (decl);
 | 
      
         | 4315 |  |  |     }
 | 
      
         | 4316 |  |  |  
 | 
      
         | 4317 |  |  |   if (TREE_CODE (decl) == VAR_DECL)
 | 
      
         | 4318 |  |  |     {
 | 
      
         | 4319 |  |  |       if (init && TREE_CODE (init) == CONSTRUCTOR)
 | 
      
         | 4320 |  |  |         add_flexible_array_elts_to_size (decl, init);
 | 
      
         | 4321 |  |  |  
 | 
      
         | 4322 |  |  |       if (DECL_SIZE (decl) == 0 && TREE_TYPE (decl) != error_mark_node
 | 
      
         | 4323 |  |  |           && COMPLETE_TYPE_P (TREE_TYPE (decl)))
 | 
      
         | 4324 |  |  |         layout_decl (decl, 0);
 | 
      
         | 4325 |  |  |  
 | 
      
         | 4326 |  |  |       if (DECL_SIZE (decl) == 0
 | 
      
         | 4327 |  |  |           /* Don't give an error if we already gave one earlier.  */
 | 
      
         | 4328 |  |  |           && TREE_TYPE (decl) != error_mark_node
 | 
      
         | 4329 |  |  |           && (TREE_STATIC (decl)
 | 
      
         | 4330 |  |  |               /* A static variable with an incomplete type
 | 
      
         | 4331 |  |  |                  is an error if it is initialized.
 | 
      
         | 4332 |  |  |                  Also if it is not file scope.
 | 
      
         | 4333 |  |  |                  Otherwise, let it through, but if it is not `extern'
 | 
      
         | 4334 |  |  |                  then it may cause an error message later.  */
 | 
      
         | 4335 |  |  |               ? (DECL_INITIAL (decl) != 0
 | 
      
         | 4336 |  |  |                  || !DECL_FILE_SCOPE_P (decl))
 | 
      
         | 4337 |  |  |               /* An automatic variable with an incomplete type
 | 
      
         | 4338 |  |  |                  is an error.  */
 | 
      
         | 4339 |  |  |               : !DECL_EXTERNAL (decl)))
 | 
      
         | 4340 |  |  |          {
 | 
      
         | 4341 |  |  |            error ("storage size of %q+D isn%'t known", decl);
 | 
      
         | 4342 |  |  |            TREE_TYPE (decl) = error_mark_node;
 | 
      
         | 4343 |  |  |          }
 | 
      
         | 4344 |  |  |  
 | 
      
         | 4345 |  |  |       if ((DECL_EXTERNAL (decl) || TREE_STATIC (decl))
 | 
      
         | 4346 |  |  |           && DECL_SIZE (decl) != 0)
 | 
      
         | 4347 |  |  |         {
 | 
      
         | 4348 |  |  |           if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST)
 | 
      
         | 4349 |  |  |             constant_expression_warning (DECL_SIZE (decl));
 | 
      
         | 4350 |  |  |           else
 | 
      
         | 4351 |  |  |             {
 | 
      
         | 4352 |  |  |               error ("storage size of %q+D isn%'t constant", decl);
 | 
      
         | 4353 |  |  |               TREE_TYPE (decl) = error_mark_node;
 | 
      
         | 4354 |  |  |             }
 | 
      
         | 4355 |  |  |         }
 | 
      
         | 4356 |  |  |  
 | 
      
         | 4357 |  |  |       if (TREE_USED (type))
 | 
      
         | 4358 |  |  |         {
 | 
      
         | 4359 |  |  |           TREE_USED (decl) = 1;
 | 
      
         | 4360 |  |  |           DECL_READ_P (decl) = 1;
 | 
      
         | 4361 |  |  |         }
 | 
      
         | 4362 |  |  |     }
 | 
      
         | 4363 |  |  |  
 | 
      
         | 4364 |  |  |   /* If this is a function and an assembler name is specified, reset DECL_RTL
 | 
      
         | 4365 |  |  |      so we can give it its new name.  Also, update builtin_decl if it
 | 
      
         | 4366 |  |  |      was a normal built-in.  */
 | 
      
         | 4367 |  |  |   if (TREE_CODE (decl) == FUNCTION_DECL && asmspec)
 | 
      
         | 4368 |  |  |     {
 | 
      
         | 4369 |  |  |       if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL)
 | 
      
         | 4370 |  |  |         set_builtin_user_assembler_name (decl, asmspec);
 | 
      
         | 4371 |  |  |       set_user_assembler_name (decl, asmspec);
 | 
      
         | 4372 |  |  |     }
 | 
      
         | 4373 |  |  |  
 | 
      
         | 4374 |  |  |   /* If #pragma weak was used, mark the decl weak now.  */
 | 
      
         | 4375 |  |  |   maybe_apply_pragma_weak (decl);
 | 
      
         | 4376 |  |  |  
 | 
      
         | 4377 |  |  |   /* Output the assembler code and/or RTL code for variables and functions,
 | 
      
         | 4378 |  |  |      unless the type is an undefined structure or union.
 | 
      
         | 4379 |  |  |      If not, it will get done when the type is completed.  */
 | 
      
         | 4380 |  |  |  
 | 
      
         | 4381 |  |  |   if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL)
 | 
      
         | 4382 |  |  |     {
 | 
      
         | 4383 |  |  |       /* Determine the ELF visibility.  */
 | 
      
         | 4384 |  |  |       if (TREE_PUBLIC (decl))
 | 
      
         | 4385 |  |  |         c_determine_visibility (decl);
 | 
      
         | 4386 |  |  |  
 | 
      
         | 4387 |  |  |       /* This is a no-op in c-lang.c or something real in objc-act.c.  */
 | 
      
         | 4388 |  |  |       if (c_dialect_objc ())
 | 
      
         | 4389 |  |  |         objc_check_decl (decl);
 | 
      
         | 4390 |  |  |  
 | 
      
         | 4391 |  |  |       if (asmspec)
 | 
      
         | 4392 |  |  |         {
 | 
      
         | 4393 |  |  |           /* If this is not a static variable, issue a warning.
 | 
      
         | 4394 |  |  |              It doesn't make any sense to give an ASMSPEC for an
 | 
      
         | 4395 |  |  |              ordinary, non-register local variable.  Historically,
 | 
      
         | 4396 |  |  |              GCC has accepted -- but ignored -- the ASMSPEC in
 | 
      
         | 4397 |  |  |              this case.  */
 | 
      
         | 4398 |  |  |           if (!DECL_FILE_SCOPE_P (decl)
 | 
      
         | 4399 |  |  |               && TREE_CODE (decl) == VAR_DECL
 | 
      
         | 4400 |  |  |               && !C_DECL_REGISTER (decl)
 | 
      
         | 4401 |  |  |               && !TREE_STATIC (decl))
 | 
      
         | 4402 |  |  |             warning (0, "ignoring asm-specifier for non-static local "
 | 
      
         | 4403 |  |  |                      "variable %q+D", decl);
 | 
      
         | 4404 |  |  |           else
 | 
      
         | 4405 |  |  |             set_user_assembler_name (decl, asmspec);
 | 
      
         | 4406 |  |  |         }
 | 
      
         | 4407 |  |  |  
 | 
      
         | 4408 |  |  |       if (DECL_FILE_SCOPE_P (decl))
 | 
      
         | 4409 |  |  |         {
 | 
      
         | 4410 |  |  |           if (DECL_INITIAL (decl) == NULL_TREE
 | 
      
         | 4411 |  |  |               || DECL_INITIAL (decl) == error_mark_node)
 | 
      
         | 4412 |  |  |             /* Don't output anything
 | 
      
         | 4413 |  |  |                when a tentative file-scope definition is seen.
 | 
      
         | 4414 |  |  |                But at end of compilation, do output code for them.  */
 | 
      
         | 4415 |  |  |             DECL_DEFER_OUTPUT (decl) = 1;
 | 
      
         | 4416 |  |  |           if (asmspec && C_DECL_REGISTER (decl))
 | 
      
         | 4417 |  |  |             DECL_HARD_REGISTER (decl) = 1;
 | 
      
         | 4418 |  |  |           rest_of_decl_compilation (decl, true, 0);
 | 
      
         | 4419 |  |  |         }
 | 
      
         | 4420 |  |  |       else
 | 
      
         | 4421 |  |  |         {
 | 
      
         | 4422 |  |  |           /* In conjunction with an ASMSPEC, the `register'
 | 
      
         | 4423 |  |  |              keyword indicates that we should place the variable
 | 
      
         | 4424 |  |  |              in a particular register.  */
 | 
      
         | 4425 |  |  |           if (asmspec && C_DECL_REGISTER (decl))
 | 
      
         | 4426 |  |  |             {
 | 
      
         | 4427 |  |  |               DECL_HARD_REGISTER (decl) = 1;
 | 
      
         | 4428 |  |  |               /* This cannot be done for a structure with volatile
 | 
      
         | 4429 |  |  |                  fields, on which DECL_REGISTER will have been
 | 
      
         | 4430 |  |  |                  reset.  */
 | 
      
         | 4431 |  |  |               if (!DECL_REGISTER (decl))
 | 
      
         | 4432 |  |  |                 error ("cannot put object with volatile field into register");
 | 
      
         | 4433 |  |  |             }
 | 
      
         | 4434 |  |  |  
 | 
      
         | 4435 |  |  |           if (TREE_CODE (decl) != FUNCTION_DECL)
 | 
      
         | 4436 |  |  |             {
 | 
      
         | 4437 |  |  |               /* If we're building a variable sized type, and we might be
 | 
      
         | 4438 |  |  |                  reachable other than via the top of the current binding
 | 
      
         | 4439 |  |  |                  level, then create a new BIND_EXPR so that we deallocate
 | 
      
         | 4440 |  |  |                  the object at the right time.  */
 | 
      
         | 4441 |  |  |               /* Note that DECL_SIZE can be null due to errors.  */
 | 
      
         | 4442 |  |  |               if (DECL_SIZE (decl)
 | 
      
         | 4443 |  |  |                   && !TREE_CONSTANT (DECL_SIZE (decl))
 | 
      
         | 4444 |  |  |                   && STATEMENT_LIST_HAS_LABEL (cur_stmt_list))
 | 
      
         | 4445 |  |  |                 {
 | 
      
         | 4446 |  |  |                   tree bind;
 | 
      
         | 4447 |  |  |                   bind = build3 (BIND_EXPR, void_type_node, NULL, NULL, NULL);
 | 
      
         | 4448 |  |  |                   TREE_SIDE_EFFECTS (bind) = 1;
 | 
      
         | 4449 |  |  |                   add_stmt (bind);
 | 
      
         | 4450 |  |  |                   BIND_EXPR_BODY (bind) = push_stmt_list ();
 | 
      
         | 4451 |  |  |                 }
 | 
      
         | 4452 |  |  |               add_stmt (build_stmt (DECL_SOURCE_LOCATION (decl),
 | 
      
         | 4453 |  |  |                                     DECL_EXPR, decl));
 | 
      
         | 4454 |  |  |             }
 | 
      
         | 4455 |  |  |         }
 | 
      
         | 4456 |  |  |  
 | 
      
         | 4457 |  |  |  
 | 
      
         | 4458 |  |  |       if (!DECL_FILE_SCOPE_P (decl))
 | 
      
         | 4459 |  |  |         {
 | 
      
         | 4460 |  |  |           /* Recompute the RTL of a local array now
 | 
      
         | 4461 |  |  |              if it used to be an incomplete type.  */
 | 
      
         | 4462 |  |  |           if (was_incomplete
 | 
      
         | 4463 |  |  |               && !TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
 | 
      
         | 4464 |  |  |             {
 | 
      
         | 4465 |  |  |               /* If we used it already as memory, it must stay in memory.  */
 | 
      
         | 4466 |  |  |               TREE_ADDRESSABLE (decl) = TREE_USED (decl);
 | 
      
         | 4467 |  |  |               /* If it's still incomplete now, no init will save it.  */
 | 
      
         | 4468 |  |  |               if (DECL_SIZE (decl) == 0)
 | 
      
         | 4469 |  |  |                 DECL_INITIAL (decl) = 0;
 | 
      
         | 4470 |  |  |             }
 | 
      
         | 4471 |  |  |         }
 | 
      
         | 4472 |  |  |     }
 | 
      
         | 4473 |  |  |  
 | 
      
         | 4474 |  |  |   if (TREE_CODE (decl) == TYPE_DECL)
 | 
      
         | 4475 |  |  |     {
 | 
      
         | 4476 |  |  |       if (!DECL_FILE_SCOPE_P (decl)
 | 
      
         | 4477 |  |  |           && variably_modified_type_p (TREE_TYPE (decl), NULL_TREE))
 | 
      
         | 4478 |  |  |         add_stmt (build_stmt (DECL_SOURCE_LOCATION (decl), DECL_EXPR, decl));
 | 
      
         | 4479 |  |  |  
 | 
      
         | 4480 |  |  |       rest_of_decl_compilation (decl, DECL_FILE_SCOPE_P (decl), 0);
 | 
      
         | 4481 |  |  |     }
 | 
      
         | 4482 |  |  |  
 | 
      
         | 4483 |  |  |   /* Install a cleanup (aka destructor) if one was given.  */
 | 
      
         | 4484 |  |  |   if (TREE_CODE (decl) == VAR_DECL && !TREE_STATIC (decl))
 | 
      
         | 4485 |  |  |     {
 | 
      
         | 4486 |  |  |       tree attr = lookup_attribute ("cleanup", DECL_ATTRIBUTES (decl));
 | 
      
         | 4487 |  |  |       if (attr)
 | 
      
         | 4488 |  |  |         {
 | 
      
         | 4489 |  |  |           tree cleanup_id = TREE_VALUE (TREE_VALUE (attr));
 | 
      
         | 4490 |  |  |           tree cleanup_decl = lookup_name (cleanup_id);
 | 
      
         | 4491 |  |  |           tree cleanup;
 | 
      
         | 4492 |  |  |           VEC(tree,gc) *vec;
 | 
      
         | 4493 |  |  |  
 | 
      
         | 4494 |  |  |           /* Build "cleanup(&decl)" for the destructor.  */
 | 
      
         | 4495 |  |  |           cleanup = build_unary_op (input_location, ADDR_EXPR, decl, 0);
 | 
      
         | 4496 |  |  |           vec = VEC_alloc (tree, gc, 1);
 | 
      
         | 4497 |  |  |           VEC_quick_push (tree, vec, cleanup);
 | 
      
         | 4498 |  |  |           cleanup = build_function_call_vec (DECL_SOURCE_LOCATION (decl),
 | 
      
         | 4499 |  |  |                                              cleanup_decl, vec, NULL);
 | 
      
         | 4500 |  |  |           VEC_free (tree, gc, vec);
 | 
      
         | 4501 |  |  |  
 | 
      
         | 4502 |  |  |           /* Don't warn about decl unused; the cleanup uses it.  */
 | 
      
         | 4503 |  |  |           TREE_USED (decl) = 1;
 | 
      
         | 4504 |  |  |           TREE_USED (cleanup_decl) = 1;
 | 
      
         | 4505 |  |  |           DECL_READ_P (decl) = 1;
 | 
      
         | 4506 |  |  |  
 | 
      
         | 4507 |  |  |           push_cleanup (decl, cleanup, false);
 | 
      
         | 4508 |  |  |         }
 | 
      
         | 4509 |  |  |     }
 | 
      
         | 4510 |  |  |  
 | 
      
         | 4511 |  |  |   if (warn_cxx_compat
 | 
      
         | 4512 |  |  |       && TREE_CODE (decl) == VAR_DECL
 | 
      
         | 4513 |  |  |       && !DECL_EXTERNAL (decl)
 | 
      
         | 4514 |  |  |       && DECL_INITIAL (decl) == NULL_TREE)
 | 
      
         | 4515 |  |  |     {
 | 
      
         | 4516 |  |  |       type = strip_array_types (type);
 | 
      
         | 4517 |  |  |       if (TREE_READONLY (decl))
 | 
      
         | 4518 |  |  |         warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wc___compat,
 | 
      
         | 4519 |  |  |                     "uninitialized const %qD is invalid in C++", decl);
 | 
      
         | 4520 |  |  |       else if ((TREE_CODE (type) == RECORD_TYPE
 | 
      
         | 4521 |  |  |                 || TREE_CODE (type) == UNION_TYPE)
 | 
      
         | 4522 |  |  |                && C_TYPE_FIELDS_READONLY (type))
 | 
      
         | 4523 |  |  |         diagnose_uninitialized_cst_member (decl, type);
 | 
      
         | 4524 |  |  |     }
 | 
      
         | 4525 |  |  |  
 | 
      
         | 4526 |  |  |         invoke_plugin_callbacks (PLUGIN_FINISH_DECL, decl);
 | 
      
         | 4527 |  |  | }
 | 
      
         | 4528 |  |  |  
 | 
      
         | 4529 |  |  | /* Given a parsed parameter declaration, decode it into a PARM_DECL.
 | 
      
         | 4530 |  |  |    EXPR is NULL or a pointer to an expression that needs to be
 | 
      
         | 4531 |  |  |    evaluated for the side effects of array size expressions in the
 | 
      
         | 4532 |  |  |    parameters.  */
 | 
      
         | 4533 |  |  |  
 | 
      
         | 4534 |  |  | tree
 | 
      
         | 4535 |  |  | grokparm (const struct c_parm *parm, tree *expr)
 | 
      
         | 4536 |  |  | {
 | 
      
         | 4537 |  |  |   tree attrs = parm->attrs;
 | 
      
         | 4538 |  |  |   tree decl = grokdeclarator (parm->declarator, parm->specs, PARM, false,
 | 
      
         | 4539 |  |  |                               NULL, &attrs, expr, NULL, DEPRECATED_NORMAL);
 | 
      
         | 4540 |  |  |  
 | 
      
         | 4541 |  |  |   decl_attributes (&decl, attrs, 0);
 | 
      
         | 4542 |  |  |  
 | 
      
         | 4543 |  |  |   return decl;
 | 
      
         | 4544 |  |  | }
 | 
      
         | 4545 |  |  |  
 | 
      
         | 4546 |  |  | /* Given a parsed parameter declaration, decode it into a PARM_DECL
 | 
      
         | 4547 |  |  |    and push that on the current scope.  EXPR is a pointer to an
 | 
      
         | 4548 |  |  |    expression that needs to be evaluated for the side effects of array
 | 
      
         | 4549 |  |  |    size expressions in the parameters.  */
 | 
      
         | 4550 |  |  |  
 | 
      
         | 4551 |  |  | void
 | 
      
         | 4552 |  |  | push_parm_decl (const struct c_parm *parm, tree *expr)
 | 
      
         | 4553 |  |  | {
 | 
      
         | 4554 |  |  |   tree attrs = parm->attrs;
 | 
      
         | 4555 |  |  |   tree decl;
 | 
      
         | 4556 |  |  |  
 | 
      
         | 4557 |  |  |   decl = grokdeclarator (parm->declarator, parm->specs, PARM, false, NULL,
 | 
      
         | 4558 |  |  |                          &attrs, expr, NULL, DEPRECATED_NORMAL);
 | 
      
         | 4559 |  |  |   decl_attributes (&decl, attrs, 0);
 | 
      
         | 4560 |  |  |  
 | 
      
         | 4561 |  |  |   decl = pushdecl (decl);
 | 
      
         | 4562 |  |  |  
 | 
      
         | 4563 |  |  |   finish_decl (decl, input_location, NULL_TREE, NULL_TREE, NULL_TREE);
 | 
      
         | 4564 |  |  | }
 | 
      
         | 4565 |  |  |  
 | 
      
         | 4566 |  |  | /* Mark all the parameter declarations to date as forward decls.
 | 
      
         | 4567 |  |  |    Also diagnose use of this extension.  */
 | 
      
         | 4568 |  |  |  
 | 
      
         | 4569 |  |  | void
 | 
      
         | 4570 |  |  | mark_forward_parm_decls (void)
 | 
      
         | 4571 |  |  | {
 | 
      
         | 4572 |  |  |   struct c_binding *b;
 | 
      
         | 4573 |  |  |  
 | 
      
         | 4574 |  |  |   if (pedantic && !current_scope->warned_forward_parm_decls)
 | 
      
         | 4575 |  |  |     {
 | 
      
         | 4576 |  |  |       pedwarn (input_location, OPT_pedantic,
 | 
      
         | 4577 |  |  |                "ISO C forbids forward parameter declarations");
 | 
      
         | 4578 |  |  |       current_scope->warned_forward_parm_decls = true;
 | 
      
         | 4579 |  |  |     }
 | 
      
         | 4580 |  |  |  
 | 
      
         | 4581 |  |  |   for (b = current_scope->bindings; b; b = b->prev)
 | 
      
         | 4582 |  |  |     if (TREE_CODE (b->decl) == PARM_DECL)
 | 
      
         | 4583 |  |  |       TREE_ASM_WRITTEN (b->decl) = 1;
 | 
      
         | 4584 |  |  | }
 | 
      
         | 4585 |  |  |  
 | 
      
         | 4586 |  |  | /* Build a COMPOUND_LITERAL_EXPR.  TYPE is the type given in the compound
 | 
      
         | 4587 |  |  |    literal, which may be an incomplete array type completed by the
 | 
      
         | 4588 |  |  |    initializer; INIT is a CONSTRUCTOR at LOC that initializes the compound
 | 
      
         | 4589 |  |  |    literal.  NON_CONST is true if the initializers contain something
 | 
      
         | 4590 |  |  |    that cannot occur in a constant expression.  */
 | 
      
         | 4591 |  |  |  
 | 
      
         | 4592 |  |  | tree
 | 
      
         | 4593 |  |  | build_compound_literal (location_t loc, tree type, tree init, bool non_const)
 | 
      
         | 4594 |  |  | {
 | 
      
         | 4595 |  |  |   /* We do not use start_decl here because we have a type, not a declarator;
 | 
      
         | 4596 |  |  |      and do not use finish_decl because the decl should be stored inside
 | 
      
         | 4597 |  |  |      the COMPOUND_LITERAL_EXPR rather than added elsewhere as a DECL_EXPR.  */
 | 
      
         | 4598 |  |  |   tree decl;
 | 
      
         | 4599 |  |  |   tree complit;
 | 
      
         | 4600 |  |  |   tree stmt;
 | 
      
         | 4601 |  |  |  
 | 
      
         | 4602 |  |  |   if (type == error_mark_node
 | 
      
         | 4603 |  |  |       || init == error_mark_node)
 | 
      
         | 4604 |  |  |     return error_mark_node;
 | 
      
         | 4605 |  |  |  
 | 
      
         | 4606 |  |  |   decl = build_decl (loc, VAR_DECL, NULL_TREE, type);
 | 
      
         | 4607 |  |  |   DECL_EXTERNAL (decl) = 0;
 | 
      
         | 4608 |  |  |   TREE_PUBLIC (decl) = 0;
 | 
      
         | 4609 |  |  |   TREE_STATIC (decl) = (current_scope == file_scope);
 | 
      
         | 4610 |  |  |   DECL_CONTEXT (decl) = current_function_decl;
 | 
      
         | 4611 |  |  |   TREE_USED (decl) = 1;
 | 
      
         | 4612 |  |  |   DECL_READ_P (decl) = 1;
 | 
      
         | 4613 |  |  |   TREE_TYPE (decl) = type;
 | 
      
         | 4614 |  |  |   TREE_READONLY (decl) = TYPE_READONLY (type);
 | 
      
         | 4615 |  |  |   store_init_value (loc, decl, init, NULL_TREE);
 | 
      
         | 4616 |  |  |  
 | 
      
         | 4617 |  |  |   if (TREE_CODE (type) == ARRAY_TYPE && !COMPLETE_TYPE_P (type))
 | 
      
         | 4618 |  |  |     {
 | 
      
         | 4619 |  |  |       int failure = complete_array_type (&TREE_TYPE (decl),
 | 
      
         | 4620 |  |  |                                          DECL_INITIAL (decl), true);
 | 
      
         | 4621 |  |  |       gcc_assert (!failure);
 | 
      
         | 4622 |  |  |  
 | 
      
         | 4623 |  |  |       type = TREE_TYPE (decl);
 | 
      
         | 4624 |  |  |       TREE_TYPE (DECL_INITIAL (decl)) = type;
 | 
      
         | 4625 |  |  |     }
 | 
      
         | 4626 |  |  |  
 | 
      
         | 4627 |  |  |   if (type == error_mark_node || !COMPLETE_TYPE_P (type))
 | 
      
         | 4628 |  |  |     return error_mark_node;
 | 
      
         | 4629 |  |  |  
 | 
      
         | 4630 |  |  |   stmt = build_stmt (DECL_SOURCE_LOCATION (decl), DECL_EXPR, decl);
 | 
      
         | 4631 |  |  |   complit = build1 (COMPOUND_LITERAL_EXPR, type, stmt);
 | 
      
         | 4632 |  |  |   TREE_SIDE_EFFECTS (complit) = 1;
 | 
      
         | 4633 |  |  |  
 | 
      
         | 4634 |  |  |   layout_decl (decl, 0);
 | 
      
         | 4635 |  |  |  
 | 
      
         | 4636 |  |  |   if (TREE_STATIC (decl))
 | 
      
         | 4637 |  |  |     {
 | 
      
         | 4638 |  |  |       /* This decl needs a name for the assembler output.  */
 | 
      
         | 4639 |  |  |       set_compound_literal_name (decl);
 | 
      
         | 4640 |  |  |       DECL_DEFER_OUTPUT (decl) = 1;
 | 
      
         | 4641 |  |  |       DECL_COMDAT (decl) = 1;
 | 
      
         | 4642 |  |  |       DECL_ARTIFICIAL (decl) = 1;
 | 
      
         | 4643 |  |  |       DECL_IGNORED_P (decl) = 1;
 | 
      
         | 4644 |  |  |       pushdecl (decl);
 | 
      
         | 4645 |  |  |       rest_of_decl_compilation (decl, 1, 0);
 | 
      
         | 4646 |  |  |     }
 | 
      
         | 4647 |  |  |  
 | 
      
         | 4648 |  |  |   if (non_const)
 | 
      
         | 4649 |  |  |     {
 | 
      
         | 4650 |  |  |       complit = build2 (C_MAYBE_CONST_EXPR, type, NULL, complit);
 | 
      
         | 4651 |  |  |       C_MAYBE_CONST_EXPR_NON_CONST (complit) = 1;
 | 
      
         | 4652 |  |  |     }
 | 
      
         | 4653 |  |  |  
 | 
      
         | 4654 |  |  |   return complit;
 | 
      
         | 4655 |  |  | }
 | 
      
         | 4656 |  |  |  
 | 
      
         | 4657 |  |  | /* Check the type of a compound literal.  Here we just check that it
 | 
      
         | 4658 |  |  |    is valid for C++.  */
 | 
      
         | 4659 |  |  |  
 | 
      
         | 4660 |  |  | void
 | 
      
         | 4661 |  |  | check_compound_literal_type (location_t loc, struct c_type_name *type_name)
 | 
      
         | 4662 |  |  | {
 | 
      
         | 4663 |  |  |   if (warn_cxx_compat
 | 
      
         | 4664 |  |  |       && (type_name->specs->typespec_kind == ctsk_tagdef
 | 
      
         | 4665 |  |  |           || type_name->specs->typespec_kind == ctsk_tagfirstref))
 | 
      
         | 4666 |  |  |     warning_at (loc, OPT_Wc___compat,
 | 
      
         | 4667 |  |  |                 "defining a type in a compound literal is invalid in C++");
 | 
      
         | 4668 |  |  | }
 | 
      
         | 4669 |  |  |  
 | 
      
         | 4670 |  |  | /* Determine whether TYPE is a structure with a flexible array member,
 | 
      
         | 4671 |  |  |    or a union containing such a structure (possibly recursively).  */
 | 
      
         | 4672 |  |  |  
 | 
      
         | 4673 |  |  | static bool
 | 
      
         | 4674 |  |  | flexible_array_type_p (tree type)
 | 
      
         | 4675 |  |  | {
 | 
      
         | 4676 |  |  |   tree x;
 | 
      
         | 4677 |  |  |   switch (TREE_CODE (type))
 | 
      
         | 4678 |  |  |     {
 | 
      
         | 4679 |  |  |     case RECORD_TYPE:
 | 
      
         | 4680 |  |  |       x = TYPE_FIELDS (type);
 | 
      
         | 4681 |  |  |       if (x == NULL_TREE)
 | 
      
         | 4682 |  |  |         return false;
 | 
      
         | 4683 |  |  |       while (DECL_CHAIN (x) != NULL_TREE)
 | 
      
         | 4684 |  |  |         x = DECL_CHAIN (x);
 | 
      
         | 4685 |  |  |       if (TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE
 | 
      
         | 4686 |  |  |           && TYPE_SIZE (TREE_TYPE (x)) == NULL_TREE
 | 
      
         | 4687 |  |  |           && TYPE_DOMAIN (TREE_TYPE (x)) != NULL_TREE
 | 
      
         | 4688 |  |  |           && TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (x))) == NULL_TREE)
 | 
      
         | 4689 |  |  |         return true;
 | 
      
         | 4690 |  |  |       return false;
 | 
      
         | 4691 |  |  |     case UNION_TYPE:
 | 
      
         | 4692 |  |  |       for (x = TYPE_FIELDS (type); x != NULL_TREE; x = DECL_CHAIN (x))
 | 
      
         | 4693 |  |  |         {
 | 
      
         | 4694 |  |  |           if (flexible_array_type_p (TREE_TYPE (x)))
 | 
      
         | 4695 |  |  |             return true;
 | 
      
         | 4696 |  |  |         }
 | 
      
         | 4697 |  |  |       return false;
 | 
      
         | 4698 |  |  |     default:
 | 
      
         | 4699 |  |  |     return false;
 | 
      
         | 4700 |  |  |   }
 | 
      
         | 4701 |  |  | }
 | 
      
         | 4702 |  |  |  
 | 
      
         | 4703 |  |  | /* Performs sanity checks on the TYPE and WIDTH of the bit-field NAME,
 | 
      
         | 4704 |  |  |    replacing with appropriate values if they are invalid.  */
 | 
      
         | 4705 |  |  | static void
 | 
      
         | 4706 |  |  | check_bitfield_type_and_width (tree *type, tree *width, tree orig_name)
 | 
      
         | 4707 |  |  | {
 | 
      
         | 4708 |  |  |   tree type_mv;
 | 
      
         | 4709 |  |  |   unsigned int max_width;
 | 
      
         | 4710 |  |  |   unsigned HOST_WIDE_INT w;
 | 
      
         | 4711 |  |  |   const char *name = (orig_name
 | 
      
         | 4712 |  |  |                       ? identifier_to_locale (IDENTIFIER_POINTER (orig_name))
 | 
      
         | 4713 |  |  |                       : _("<anonymous>"));
 | 
      
         | 4714 |  |  |  
 | 
      
         | 4715 |  |  |   /* Detect and ignore out of range field width and process valid
 | 
      
         | 4716 |  |  |      field widths.  */
 | 
      
         | 4717 |  |  |   if (!INTEGRAL_TYPE_P (TREE_TYPE (*width)))
 | 
      
         | 4718 |  |  |     {
 | 
      
         | 4719 |  |  |       error ("bit-field %qs width not an integer constant", name);
 | 
      
         | 4720 |  |  |       *width = integer_one_node;
 | 
      
         | 4721 |  |  |     }
 | 
      
         | 4722 |  |  |   else
 | 
      
         | 4723 |  |  |     {
 | 
      
         | 4724 |  |  |       if (TREE_CODE (*width) != INTEGER_CST)
 | 
      
         | 4725 |  |  |         {
 | 
      
         | 4726 |  |  |           *width = c_fully_fold (*width, false, NULL);
 | 
      
         | 4727 |  |  |           if (TREE_CODE (*width) == INTEGER_CST)
 | 
      
         | 4728 |  |  |             pedwarn (input_location, OPT_pedantic,
 | 
      
         | 4729 |  |  |                      "bit-field %qs width not an integer constant expression",
 | 
      
         | 4730 |  |  |                      name);
 | 
      
         | 4731 |  |  |         }
 | 
      
         | 4732 |  |  |       if (TREE_CODE (*width) != INTEGER_CST)
 | 
      
         | 4733 |  |  |         {
 | 
      
         | 4734 |  |  |           error ("bit-field %qs width not an integer constant", name);
 | 
      
         | 4735 |  |  |           *width = integer_one_node;
 | 
      
         | 4736 |  |  |         }
 | 
      
         | 4737 |  |  |       constant_expression_warning (*width);
 | 
      
         | 4738 |  |  |       if (tree_int_cst_sgn (*width) < 0)
 | 
      
         | 4739 |  |  |         {
 | 
      
         | 4740 |  |  |           error ("negative width in bit-field %qs", name);
 | 
      
         | 4741 |  |  |           *width = integer_one_node;
 | 
      
         | 4742 |  |  |         }
 | 
      
         | 4743 |  |  |       else if (integer_zerop (*width) && orig_name)
 | 
      
         | 4744 |  |  |         {
 | 
      
         | 4745 |  |  |           error ("zero width for bit-field %qs", name);
 | 
      
         | 4746 |  |  |           *width = integer_one_node;
 | 
      
         | 4747 |  |  |         }
 | 
      
         | 4748 |  |  |     }
 | 
      
         | 4749 |  |  |  
 | 
      
         | 4750 |  |  |   /* Detect invalid bit-field type.  */
 | 
      
         | 4751 |  |  |   if (TREE_CODE (*type) != INTEGER_TYPE
 | 
      
         | 4752 |  |  |       && TREE_CODE (*type) != BOOLEAN_TYPE
 | 
      
         | 4753 |  |  |       && TREE_CODE (*type) != ENUMERAL_TYPE)
 | 
      
         | 4754 |  |  |     {
 | 
      
         | 4755 |  |  |       error ("bit-field %qs has invalid type", name);
 | 
      
         | 4756 |  |  |       *type = unsigned_type_node;
 | 
      
         | 4757 |  |  |     }
 | 
      
         | 4758 |  |  |  
 | 
      
         | 4759 |  |  |   type_mv = TYPE_MAIN_VARIANT (*type);
 | 
      
         | 4760 |  |  |   if (!in_system_header
 | 
      
         | 4761 |  |  |       && type_mv != integer_type_node
 | 
      
         | 4762 |  |  |       && type_mv != unsigned_type_node
 | 
      
         | 4763 |  |  |       && type_mv != boolean_type_node)
 | 
      
         | 4764 |  |  |     pedwarn (input_location, OPT_pedantic,
 | 
      
         | 4765 |  |  |              "type of bit-field %qs is a GCC extension", name);
 | 
      
         | 4766 |  |  |  
 | 
      
         | 4767 |  |  |   max_width = TYPE_PRECISION (*type);
 | 
      
         | 4768 |  |  |  
 | 
      
         | 4769 |  |  |   if (0 < compare_tree_int (*width, max_width))
 | 
      
         | 4770 |  |  |     {
 | 
      
         | 4771 |  |  |       error ("width of %qs exceeds its type", name);
 | 
      
         | 4772 |  |  |       w = max_width;
 | 
      
         | 4773 |  |  |       *width = build_int_cst (integer_type_node, w);
 | 
      
         | 4774 |  |  |     }
 | 
      
         | 4775 |  |  |   else
 | 
      
         | 4776 |  |  |     w = tree_low_cst (*width, 1);
 | 
      
         | 4777 |  |  |  
 | 
      
         | 4778 |  |  |   if (TREE_CODE (*type) == ENUMERAL_TYPE)
 | 
      
         | 4779 |  |  |     {
 | 
      
         | 4780 |  |  |       struct lang_type *lt = TYPE_LANG_SPECIFIC (*type);
 | 
      
         | 4781 |  |  |       if (!lt
 | 
      
         | 4782 |  |  |           || w < tree_int_cst_min_precision (lt->enum_min, TYPE_UNSIGNED (*type))
 | 
      
         | 4783 |  |  |           || w < tree_int_cst_min_precision (lt->enum_max, TYPE_UNSIGNED (*type)))
 | 
      
         | 4784 |  |  |         warning (0, "%qs is narrower than values of its type", name);
 | 
      
         | 4785 |  |  |     }
 | 
      
         | 4786 |  |  | }
 | 
      
         | 4787 |  |  |  
 | 
      
         | 4788 |  |  |  
 | 
      
         | 4789 |  |  |  
 | 
      
         | 4790 |  |  | /* Print warning about variable length array if necessary.  */
 | 
      
         | 4791 |  |  |  
 | 
      
         | 4792 |  |  | static void
 | 
      
         | 4793 |  |  | warn_variable_length_array (tree name, tree size)
 | 
      
         | 4794 |  |  | {
 | 
      
         | 4795 |  |  |   int const_size = TREE_CONSTANT (size);
 | 
      
         | 4796 |  |  |  
 | 
      
         | 4797 |  |  |   if (!flag_isoc99 && pedantic && warn_vla != 0)
 | 
      
         | 4798 |  |  |     {
 | 
      
         | 4799 |  |  |       if (const_size)
 | 
      
         | 4800 |  |  |         {
 | 
      
         | 4801 |  |  |           if (name)
 | 
      
         | 4802 |  |  |             pedwarn (input_location, OPT_Wvla,
 | 
      
         | 4803 |  |  |                      "ISO C90 forbids array %qE whose size "
 | 
      
         | 4804 |  |  |                      "can%'t be evaluated",
 | 
      
         | 4805 |  |  |                      name);
 | 
      
         | 4806 |  |  |           else
 | 
      
         | 4807 |  |  |             pedwarn (input_location, OPT_Wvla, "ISO C90 forbids array whose size "
 | 
      
         | 4808 |  |  |                      "can%'t be evaluated");
 | 
      
         | 4809 |  |  |         }
 | 
      
         | 4810 |  |  |       else
 | 
      
         | 4811 |  |  |         {
 | 
      
         | 4812 |  |  |           if (name)
 | 
      
         | 4813 |  |  |             pedwarn (input_location, OPT_Wvla,
 | 
      
         | 4814 |  |  |                      "ISO C90 forbids variable length array %qE",
 | 
      
         | 4815 |  |  |                      name);
 | 
      
         | 4816 |  |  |           else
 | 
      
         | 4817 |  |  |             pedwarn (input_location, OPT_Wvla, "ISO C90 forbids variable length array");
 | 
      
         | 4818 |  |  |         }
 | 
      
         | 4819 |  |  |     }
 | 
      
         | 4820 |  |  |   else if (warn_vla > 0)
 | 
      
         | 4821 |  |  |     {
 | 
      
         | 4822 |  |  |       if (const_size)
 | 
      
         | 4823 |  |  |         {
 | 
      
         | 4824 |  |  |           if (name)
 | 
      
         | 4825 |  |  |             warning (OPT_Wvla,
 | 
      
         | 4826 |  |  |                      "the size of array %qE can"
 | 
      
         | 4827 |  |  |                      "%'t be evaluated", name);
 | 
      
         | 4828 |  |  |           else
 | 
      
         | 4829 |  |  |             warning (OPT_Wvla,
 | 
      
         | 4830 |  |  |                      "the size of array can %'t be evaluated");
 | 
      
         | 4831 |  |  |         }
 | 
      
         | 4832 |  |  |       else
 | 
      
         | 4833 |  |  |         {
 | 
      
         | 4834 |  |  |           if (name)
 | 
      
         | 4835 |  |  |             warning (OPT_Wvla,
 | 
      
         | 4836 |  |  |                      "variable length array %qE is used",
 | 
      
         | 4837 |  |  |                      name);
 | 
      
         | 4838 |  |  |           else
 | 
      
         | 4839 |  |  |             warning (OPT_Wvla,
 | 
      
         | 4840 |  |  |                      "variable length array is used");
 | 
      
         | 4841 |  |  |         }
 | 
      
         | 4842 |  |  |     }
 | 
      
         | 4843 |  |  | }
 | 
      
         | 4844 |  |  |  
 | 
      
         | 4845 |  |  | /* Given declspecs and a declarator,
 | 
      
         | 4846 |  |  |    determine the name and type of the object declared
 | 
      
         | 4847 |  |  |    and construct a ..._DECL node for it.
 | 
      
         | 4848 |  |  |    (In one case we can return a ..._TYPE node instead.
 | 
      
         | 4849 |  |  |     For invalid input we sometimes return 0.)
 | 
      
         | 4850 |  |  |  
 | 
      
         | 4851 |  |  |    DECLSPECS is a c_declspecs structure for the declaration specifiers.
 | 
      
         | 4852 |  |  |  
 | 
      
         | 4853 |  |  |    DECL_CONTEXT says which syntactic context this declaration is in:
 | 
      
         | 4854 |  |  |      NORMAL for most contexts.  Make a VAR_DECL or FUNCTION_DECL or TYPE_DECL.
 | 
      
         | 4855 |  |  |      FUNCDEF for a function definition.  Like NORMAL but a few different
 | 
      
         | 4856 |  |  |       error messages in each case.  Return value may be zero meaning
 | 
      
         | 4857 |  |  |       this definition is too screwy to try to parse.
 | 
      
         | 4858 |  |  |      PARM for a parameter declaration (either within a function prototype
 | 
      
         | 4859 |  |  |       or before a function body).  Make a PARM_DECL, or return void_type_node.
 | 
      
         | 4860 |  |  |      TYPENAME if for a typename (in a cast or sizeof).
 | 
      
         | 4861 |  |  |       Don't make a DECL node; just return the ..._TYPE node.
 | 
      
         | 4862 |  |  |      FIELD for a struct or union field; make a FIELD_DECL.
 | 
      
         | 4863 |  |  |    INITIALIZED is true if the decl has an initializer.
 | 
      
         | 4864 |  |  |    WIDTH is non-NULL for bit-fields, and is a pointer to an INTEGER_CST node
 | 
      
         | 4865 |  |  |    representing the width of the bit-field.
 | 
      
         | 4866 |  |  |    DECL_ATTRS points to the list of attributes that should be added to this
 | 
      
         | 4867 |  |  |      decl.  Any nested attributes that belong on the decl itself will be
 | 
      
         | 4868 |  |  |      added to this list.
 | 
      
         | 4869 |  |  |    If EXPR is not NULL, any expressions that need to be evaluated as
 | 
      
         | 4870 |  |  |      part of evaluating variably modified types will be stored in *EXPR.
 | 
      
         | 4871 |  |  |    If EXPR_CONST_OPERANDS is not NULL, *EXPR_CONST_OPERANDS will be
 | 
      
         | 4872 |  |  |      set to indicate whether operands in *EXPR can be used in constant
 | 
      
         | 4873 |  |  |      expressions.
 | 
      
         | 4874 |  |  |    DEPRECATED_STATE is a deprecated_states value indicating whether
 | 
      
         | 4875 |  |  |    deprecation warnings should be suppressed.
 | 
      
         | 4876 |  |  |  
 | 
      
         | 4877 |  |  |    In the TYPENAME case, DECLARATOR is really an absolute declarator.
 | 
      
         | 4878 |  |  |    It may also be so in the PARM case, for a prototype where the
 | 
      
         | 4879 |  |  |    argument type is specified but not the name.
 | 
      
         | 4880 |  |  |  
 | 
      
         | 4881 |  |  |    This function is where the complicated C meanings of `static'
 | 
      
         | 4882 |  |  |    and `extern' are interpreted.  */
 | 
      
         | 4883 |  |  |  
 | 
      
         | 4884 |  |  | static tree
 | 
      
         | 4885 |  |  | grokdeclarator (const struct c_declarator *declarator,
 | 
      
         | 4886 |  |  |                 struct c_declspecs *declspecs,
 | 
      
         | 4887 |  |  |                 enum decl_context decl_context, bool initialized, tree *width,
 | 
      
         | 4888 |  |  |                 tree *decl_attrs, tree *expr, bool *expr_const_operands,
 | 
      
         | 4889 |  |  |                 enum deprecated_states deprecated_state)
 | 
      
         | 4890 |  |  | {
 | 
      
         | 4891 |  |  |   tree type = declspecs->type;
 | 
      
         | 4892 |  |  |   bool threadp = declspecs->thread_p;
 | 
      
         | 4893 |  |  |   enum c_storage_class storage_class = declspecs->storage_class;
 | 
      
         | 4894 |  |  |   int constp;
 | 
      
         | 4895 |  |  |   int restrictp;
 | 
      
         | 4896 |  |  |   int volatilep;
 | 
      
         | 4897 |  |  |   int type_quals = TYPE_UNQUALIFIED;
 | 
      
         | 4898 |  |  |   tree name = NULL_TREE;
 | 
      
         | 4899 |  |  |   bool funcdef_flag = false;
 | 
      
         | 4900 |  |  |   bool funcdef_syntax = false;
 | 
      
         | 4901 |  |  |   bool size_varies = false;
 | 
      
         | 4902 |  |  |   tree decl_attr = declspecs->decl_attr;
 | 
      
         | 4903 |  |  |   int array_ptr_quals = TYPE_UNQUALIFIED;
 | 
      
         | 4904 |  |  |   tree array_ptr_attrs = NULL_TREE;
 | 
      
         | 4905 |  |  |   int array_parm_static = 0;
 | 
      
         | 4906 |  |  |   bool array_parm_vla_unspec_p = false;
 | 
      
         | 4907 |  |  |   tree returned_attrs = NULL_TREE;
 | 
      
         | 4908 |  |  |   bool bitfield = width != NULL;
 | 
      
         | 4909 |  |  |   tree element_type;
 | 
      
         | 4910 |  |  |   struct c_arg_info *arg_info = 0;
 | 
      
         | 4911 |  |  |   addr_space_t as1, as2, address_space;
 | 
      
         | 4912 |  |  |   location_t loc = UNKNOWN_LOCATION;
 | 
      
         | 4913 |  |  |   const char *errmsg;
 | 
      
         | 4914 |  |  |   tree expr_dummy;
 | 
      
         | 4915 |  |  |   bool expr_const_operands_dummy;
 | 
      
         | 4916 |  |  |   enum c_declarator_kind first_non_attr_kind;
 | 
      
         | 4917 |  |  |   unsigned int alignas_align = 0;
 | 
      
         | 4918 |  |  |  
 | 
      
         | 4919 |  |  |   if (TREE_CODE (type) == ERROR_MARK)
 | 
      
         | 4920 |  |  |     return error_mark_node;
 | 
      
         | 4921 |  |  |   if (expr == NULL)
 | 
      
         | 4922 |  |  |     expr = &expr_dummy;
 | 
      
         | 4923 |  |  |   if (expr_const_operands == NULL)
 | 
      
         | 4924 |  |  |     expr_const_operands = &expr_const_operands_dummy;
 | 
      
         | 4925 |  |  |  
 | 
      
         | 4926 |  |  |   *expr = declspecs->expr;
 | 
      
         | 4927 |  |  |   *expr_const_operands = declspecs->expr_const_operands;
 | 
      
         | 4928 |  |  |  
 | 
      
         | 4929 |  |  |   if (decl_context == FUNCDEF)
 | 
      
         | 4930 |  |  |     funcdef_flag = true, decl_context = NORMAL;
 | 
      
         | 4931 |  |  |  
 | 
      
         | 4932 |  |  |   /* Look inside a declarator for the name being declared
 | 
      
         | 4933 |  |  |      and get it as an IDENTIFIER_NODE, for an error message.  */
 | 
      
         | 4934 |  |  |   {
 | 
      
         | 4935 |  |  |     const struct c_declarator *decl = declarator;
 | 
      
         | 4936 |  |  |  
 | 
      
         | 4937 |  |  |     first_non_attr_kind = cdk_attrs;
 | 
      
         | 4938 |  |  |     while (decl)
 | 
      
         | 4939 |  |  |       switch (decl->kind)
 | 
      
         | 4940 |  |  |         {
 | 
      
         | 4941 |  |  |         case cdk_array:
 | 
      
         | 4942 |  |  |           loc = decl->id_loc;
 | 
      
         | 4943 |  |  |           /* FALL THRU.  */
 | 
      
         | 4944 |  |  |  
 | 
      
         | 4945 |  |  |         case cdk_function:
 | 
      
         | 4946 |  |  |         case cdk_pointer:
 | 
      
         | 4947 |  |  |           funcdef_syntax = (decl->kind == cdk_function);
 | 
      
         | 4948 |  |  |           decl = decl->declarator;
 | 
      
         | 4949 |  |  |           if (first_non_attr_kind == cdk_attrs)
 | 
      
         | 4950 |  |  |             first_non_attr_kind = decl->kind;
 | 
      
         | 4951 |  |  |           break;
 | 
      
         | 4952 |  |  |  
 | 
      
         | 4953 |  |  |         case cdk_attrs:
 | 
      
         | 4954 |  |  |           decl = decl->declarator;
 | 
      
         | 4955 |  |  |           break;
 | 
      
         | 4956 |  |  |  
 | 
      
         | 4957 |  |  |         case cdk_id:
 | 
      
         | 4958 |  |  |           loc = decl->id_loc;
 | 
      
         | 4959 |  |  |           if (decl->u.id)
 | 
      
         | 4960 |  |  |             name = decl->u.id;
 | 
      
         | 4961 |  |  |           if (first_non_attr_kind == cdk_attrs)
 | 
      
         | 4962 |  |  |             first_non_attr_kind = decl->kind;
 | 
      
         | 4963 |  |  |           decl = 0;
 | 
      
         | 4964 |  |  |           break;
 | 
      
         | 4965 |  |  |  
 | 
      
         | 4966 |  |  |         default:
 | 
      
         | 4967 |  |  |           gcc_unreachable ();
 | 
      
         | 4968 |  |  |         }
 | 
      
         | 4969 |  |  |     if (name == 0)
 | 
      
         | 4970 |  |  |       {
 | 
      
         | 4971 |  |  |         gcc_assert (decl_context == PARM
 | 
      
         | 4972 |  |  |                     || decl_context == TYPENAME
 | 
      
         | 4973 |  |  |                     || (decl_context == FIELD
 | 
      
         | 4974 |  |  |                         && declarator->kind == cdk_id));
 | 
      
         | 4975 |  |  |         gcc_assert (!initialized);
 | 
      
         | 4976 |  |  |       }
 | 
      
         | 4977 |  |  |   }
 | 
      
         | 4978 |  |  |  
 | 
      
         | 4979 |  |  |   /* A function definition's declarator must have the form of
 | 
      
         | 4980 |  |  |      a function declarator.  */
 | 
      
         | 4981 |  |  |  
 | 
      
         | 4982 |  |  |   if (funcdef_flag && !funcdef_syntax)
 | 
      
         | 4983 |  |  |     return 0;
 | 
      
         | 4984 |  |  |  
 | 
      
         | 4985 |  |  |   /* If this looks like a function definition, make it one,
 | 
      
         | 4986 |  |  |      even if it occurs where parms are expected.
 | 
      
         | 4987 |  |  |      Then store_parm_decls will reject it and not use it as a parm.  */
 | 
      
         | 4988 |  |  |   if (decl_context == NORMAL && !funcdef_flag && current_scope->parm_flag)
 | 
      
         | 4989 |  |  |     decl_context = PARM;
 | 
      
         | 4990 |  |  |  
 | 
      
         | 4991 |  |  |   if (declspecs->deprecated_p && deprecated_state != DEPRECATED_SUPPRESS)
 | 
      
         | 4992 |  |  |     warn_deprecated_use (declspecs->type, declspecs->decl_attr);
 | 
      
         | 4993 |  |  |  
 | 
      
         | 4994 |  |  |   if ((decl_context == NORMAL || decl_context == FIELD)
 | 
      
         | 4995 |  |  |       && current_scope == file_scope
 | 
      
         | 4996 |  |  |       && variably_modified_type_p (type, NULL_TREE))
 | 
      
         | 4997 |  |  |     {
 | 
      
         | 4998 |  |  |       if (name)
 | 
      
         | 4999 |  |  |         error_at (loc, "variably modified %qE at file scope", name);
 | 
      
         | 5000 |  |  |       else
 | 
      
         | 5001 |  |  |         error_at (loc, "variably modified field at file scope");
 | 
      
         | 5002 |  |  |       type = integer_type_node;
 | 
      
         | 5003 |  |  |     }
 | 
      
         | 5004 |  |  |  
 | 
      
         | 5005 |  |  |   size_varies = C_TYPE_VARIABLE_SIZE (type) != 0;
 | 
      
         | 5006 |  |  |  
 | 
      
         | 5007 |  |  |   /* Diagnose defaulting to "int".  */
 | 
      
         | 5008 |  |  |  
 | 
      
         | 5009 |  |  |   if (declspecs->default_int_p && !in_system_header)
 | 
      
         | 5010 |  |  |     {
 | 
      
         | 5011 |  |  |       /* Issue a warning if this is an ISO C 99 program or if
 | 
      
         | 5012 |  |  |          -Wreturn-type and this is a function, or if -Wimplicit;
 | 
      
         | 5013 |  |  |          prefer the former warning since it is more explicit.  */
 | 
      
         | 5014 |  |  |       if ((warn_implicit_int || warn_return_type || flag_isoc99)
 | 
      
         | 5015 |  |  |           && funcdef_flag)
 | 
      
         | 5016 |  |  |         warn_about_return_type = 1;
 | 
      
         | 5017 |  |  |       else
 | 
      
         | 5018 |  |  |         {
 | 
      
         | 5019 |  |  |           if (name)
 | 
      
         | 5020 |  |  |             pedwarn_c99 (loc, flag_isoc99 ? 0 : OPT_Wimplicit_int,
 | 
      
         | 5021 |  |  |                          "type defaults to %<int%> in declaration of %qE",
 | 
      
         | 5022 |  |  |                          name);
 | 
      
         | 5023 |  |  |           else
 | 
      
         | 5024 |  |  |             pedwarn_c99 (input_location, flag_isoc99 ? 0 : OPT_Wimplicit_int,
 | 
      
         | 5025 |  |  |                          "type defaults to %<int%> in type name");
 | 
      
         | 5026 |  |  |         }
 | 
      
         | 5027 |  |  |     }
 | 
      
         | 5028 |  |  |  
 | 
      
         | 5029 |  |  |   /* Adjust the type if a bit-field is being declared,
 | 
      
         | 5030 |  |  |      -funsigned-bitfields applied and the type is not explicitly
 | 
      
         | 5031 |  |  |      "signed".  */
 | 
      
         | 5032 |  |  |   if (bitfield && !flag_signed_bitfields && !declspecs->explicit_signed_p
 | 
      
         | 5033 |  |  |       && TREE_CODE (type) == INTEGER_TYPE)
 | 
      
         | 5034 |  |  |     type = unsigned_type_for (type);
 | 
      
         | 5035 |  |  |  
 | 
      
         | 5036 |  |  |   /* Figure out the type qualifiers for the declaration.  There are
 | 
      
         | 5037 |  |  |      two ways a declaration can become qualified.  One is something
 | 
      
         | 5038 |  |  |      like `const int i' where the `const' is explicit.  Another is
 | 
      
         | 5039 |  |  |      something like `typedef const int CI; CI i' where the type of the
 | 
      
         | 5040 |  |  |      declaration contains the `const'.  A third possibility is that
 | 
      
         | 5041 |  |  |      there is a type qualifier on the element type of a typedefed
 | 
      
         | 5042 |  |  |      array type, in which case we should extract that qualifier so
 | 
      
         | 5043 |  |  |      that c_apply_type_quals_to_decl receives the full list of
 | 
      
         | 5044 |  |  |      qualifiers to work with (C90 is not entirely clear about whether
 | 
      
         | 5045 |  |  |      duplicate qualifiers should be diagnosed in this case, but it
 | 
      
         | 5046 |  |  |      seems most appropriate to do so).  */
 | 
      
         | 5047 |  |  |   element_type = strip_array_types (type);
 | 
      
         | 5048 |  |  |   constp = declspecs->const_p + TYPE_READONLY (element_type);
 | 
      
         | 5049 |  |  |   restrictp = declspecs->restrict_p + TYPE_RESTRICT (element_type);
 | 
      
         | 5050 |  |  |   volatilep = declspecs->volatile_p + TYPE_VOLATILE (element_type);
 | 
      
         | 5051 |  |  |   as1 = declspecs->address_space;
 | 
      
         | 5052 |  |  |   as2 = TYPE_ADDR_SPACE (element_type);
 | 
      
         | 5053 |  |  |   address_space = ADDR_SPACE_GENERIC_P (as1)? as2 : as1;
 | 
      
         | 5054 |  |  |  
 | 
      
         | 5055 |  |  |   if (pedantic && !flag_isoc99)
 | 
      
         | 5056 |  |  |     {
 | 
      
         | 5057 |  |  |       if (constp > 1)
 | 
      
         | 5058 |  |  |         pedwarn (loc, OPT_pedantic, "duplicate %<const%>");
 | 
      
         | 5059 |  |  |       if (restrictp > 1)
 | 
      
         | 5060 |  |  |         pedwarn (loc, OPT_pedantic, "duplicate %<restrict%>");
 | 
      
         | 5061 |  |  |       if (volatilep > 1)
 | 
      
         | 5062 |  |  |         pedwarn (loc, OPT_pedantic, "duplicate %<volatile%>");
 | 
      
         | 5063 |  |  |     }
 | 
      
         | 5064 |  |  |  
 | 
      
         | 5065 |  |  |   if (!ADDR_SPACE_GENERIC_P (as1) && !ADDR_SPACE_GENERIC_P (as2) && as1 != as2)
 | 
      
         | 5066 |  |  |     error_at (loc, "conflicting named address spaces (%s vs %s)",
 | 
      
         | 5067 |  |  |               c_addr_space_name (as1), c_addr_space_name (as2));
 | 
      
         | 5068 |  |  |  
 | 
      
         | 5069 |  |  |   if ((TREE_CODE (type) == ARRAY_TYPE
 | 
      
         | 5070 |  |  |        || first_non_attr_kind == cdk_array)
 | 
      
         | 5071 |  |  |       && TYPE_QUALS (element_type))
 | 
      
         | 5072 |  |  |     type = TYPE_MAIN_VARIANT (type);
 | 
      
         | 5073 |  |  |   type_quals = ((constp ? TYPE_QUAL_CONST : 0)
 | 
      
         | 5074 |  |  |                 | (restrictp ? TYPE_QUAL_RESTRICT : 0)
 | 
      
         | 5075 |  |  |                 | (volatilep ? TYPE_QUAL_VOLATILE : 0)
 | 
      
         | 5076 |  |  |                 | ENCODE_QUAL_ADDR_SPACE (address_space));
 | 
      
         | 5077 |  |  |  
 | 
      
         | 5078 |  |  |   /* Warn about storage classes that are invalid for certain
 | 
      
         | 5079 |  |  |      kinds of declarations (parameters, typenames, etc.).  */
 | 
      
         | 5080 |  |  |  
 | 
      
         | 5081 |  |  |   if (funcdef_flag
 | 
      
         | 5082 |  |  |       && (threadp
 | 
      
         | 5083 |  |  |           || storage_class == csc_auto
 | 
      
         | 5084 |  |  |           || storage_class == csc_register
 | 
      
         | 5085 |  |  |           || storage_class == csc_typedef))
 | 
      
         | 5086 |  |  |     {
 | 
      
         | 5087 |  |  |       if (storage_class == csc_auto)
 | 
      
         | 5088 |  |  |         pedwarn (loc,
 | 
      
         | 5089 |  |  |                  (current_scope == file_scope) ? 0 : OPT_pedantic,
 | 
      
         | 5090 |  |  |                  "function definition declared %<auto%>");
 | 
      
         | 5091 |  |  |       if (storage_class == csc_register)
 | 
      
         | 5092 |  |  |         error_at (loc, "function definition declared %<register%>");
 | 
      
         | 5093 |  |  |       if (storage_class == csc_typedef)
 | 
      
         | 5094 |  |  |         error_at (loc, "function definition declared %<typedef%>");
 | 
      
         | 5095 |  |  |       if (threadp)
 | 
      
         | 5096 |  |  |         error_at (loc, "function definition declared %<__thread%>");
 | 
      
         | 5097 |  |  |       threadp = false;
 | 
      
         | 5098 |  |  |       if (storage_class == csc_auto
 | 
      
         | 5099 |  |  |           || storage_class == csc_register
 | 
      
         | 5100 |  |  |           || storage_class == csc_typedef)
 | 
      
         | 5101 |  |  |         storage_class = csc_none;
 | 
      
         | 5102 |  |  |     }
 | 
      
         | 5103 |  |  |   else if (decl_context != NORMAL && (storage_class != csc_none || threadp))
 | 
      
         | 5104 |  |  |     {
 | 
      
         | 5105 |  |  |       if (decl_context == PARM && storage_class == csc_register)
 | 
      
         | 5106 |  |  |         ;
 | 
      
         | 5107 |  |  |       else
 | 
      
         | 5108 |  |  |         {
 | 
      
         | 5109 |  |  |           switch (decl_context)
 | 
      
         | 5110 |  |  |             {
 | 
      
         | 5111 |  |  |             case FIELD:
 | 
      
         | 5112 |  |  |               if (name)
 | 
      
         | 5113 |  |  |                 error_at (loc, "storage class specified for structure "
 | 
      
         | 5114 |  |  |                           "field %qE", name);
 | 
      
         | 5115 |  |  |               else
 | 
      
         | 5116 |  |  |                 error_at (loc, "storage class specified for structure field");
 | 
      
         | 5117 |  |  |               break;
 | 
      
         | 5118 |  |  |             case PARM:
 | 
      
         | 5119 |  |  |               if (name)
 | 
      
         | 5120 |  |  |                 error_at (loc, "storage class specified for parameter %qE",
 | 
      
         | 5121 |  |  |                           name);
 | 
      
         | 5122 |  |  |               else
 | 
      
         | 5123 |  |  |                 error_at (loc, "storage class specified for unnamed parameter");
 | 
      
         | 5124 |  |  |               break;
 | 
      
         | 5125 |  |  |             default:
 | 
      
         | 5126 |  |  |               error_at (loc, "storage class specified for typename");
 | 
      
         | 5127 |  |  |               break;
 | 
      
         | 5128 |  |  |             }
 | 
      
         | 5129 |  |  |           storage_class = csc_none;
 | 
      
         | 5130 |  |  |           threadp = false;
 | 
      
         | 5131 |  |  |         }
 | 
      
         | 5132 |  |  |     }
 | 
      
         | 5133 |  |  |   else if (storage_class == csc_extern
 | 
      
         | 5134 |  |  |            && initialized
 | 
      
         | 5135 |  |  |            && !funcdef_flag)
 | 
      
         | 5136 |  |  |     {
 | 
      
         | 5137 |  |  |       /* 'extern' with initialization is invalid if not at file scope.  */
 | 
      
         | 5138 |  |  |        if (current_scope == file_scope)
 | 
      
         | 5139 |  |  |          {
 | 
      
         | 5140 |  |  |            /* It is fine to have 'extern const' when compiling at C
 | 
      
         | 5141 |  |  |               and C++ intersection.  */
 | 
      
         | 5142 |  |  |            if (!(warn_cxx_compat && constp))
 | 
      
         | 5143 |  |  |              warning_at (loc, 0, "%qE initialized and declared %<extern%>",
 | 
      
         | 5144 |  |  |                          name);
 | 
      
         | 5145 |  |  |          }
 | 
      
         | 5146 |  |  |       else
 | 
      
         | 5147 |  |  |         error_at (loc, "%qE has both %<extern%> and initializer", name);
 | 
      
         | 5148 |  |  |     }
 | 
      
         | 5149 |  |  |   else if (current_scope == file_scope)
 | 
      
         | 5150 |  |  |     {
 | 
      
         | 5151 |  |  |       if (storage_class == csc_auto)
 | 
      
         | 5152 |  |  |         error_at (loc, "file-scope declaration of %qE specifies %<auto%>",
 | 
      
         | 5153 |  |  |                   name);
 | 
      
         | 5154 |  |  |       if (pedantic && storage_class == csc_register)
 | 
      
         | 5155 |  |  |         pedwarn (input_location, OPT_pedantic,
 | 
      
         | 5156 |  |  |                  "file-scope declaration of %qE specifies %<register%>", name);
 | 
      
         | 5157 |  |  |     }
 | 
      
         | 5158 |  |  |   else
 | 
      
         | 5159 |  |  |     {
 | 
      
         | 5160 |  |  |       if (storage_class == csc_extern && funcdef_flag)
 | 
      
         | 5161 |  |  |         error_at (loc, "nested function %qE declared %<extern%>", name);
 | 
      
         | 5162 |  |  |       else if (threadp && storage_class == csc_none)
 | 
      
         | 5163 |  |  |         {
 | 
      
         | 5164 |  |  |           error_at (loc, "function-scope %qE implicitly auto and declared "
 | 
      
         | 5165 |  |  |                     "%<__thread%>",
 | 
      
         | 5166 |  |  |                     name);
 | 
      
         | 5167 |  |  |           threadp = false;
 | 
      
         | 5168 |  |  |         }
 | 
      
         | 5169 |  |  |     }
 | 
      
         | 5170 |  |  |  
 | 
      
         | 5171 |  |  |   /* Now figure out the structure of the declarator proper.
 | 
      
         | 5172 |  |  |      Descend through it, creating more complex types, until we reach
 | 
      
         | 5173 |  |  |      the declared identifier (or NULL_TREE, in an absolute declarator).
 | 
      
         | 5174 |  |  |      At each stage we maintain an unqualified version of the type
 | 
      
         | 5175 |  |  |      together with any qualifiers that should be applied to it with
 | 
      
         | 5176 |  |  |      c_build_qualified_type; this way, array types including
 | 
      
         | 5177 |  |  |      multidimensional array types are first built up in unqualified
 | 
      
         | 5178 |  |  |      form and then the qualified form is created with
 | 
      
         | 5179 |  |  |      TYPE_MAIN_VARIANT pointing to the unqualified form.  */
 | 
      
         | 5180 |  |  |  
 | 
      
         | 5181 |  |  |   while (declarator && declarator->kind != cdk_id)
 | 
      
         | 5182 |  |  |     {
 | 
      
         | 5183 |  |  |       if (type == error_mark_node)
 | 
      
         | 5184 |  |  |         {
 | 
      
         | 5185 |  |  |           declarator = declarator->declarator;
 | 
      
         | 5186 |  |  |           continue;
 | 
      
         | 5187 |  |  |         }
 | 
      
         | 5188 |  |  |  
 | 
      
         | 5189 |  |  |       /* Each level of DECLARATOR is either a cdk_array (for ...[..]),
 | 
      
         | 5190 |  |  |          a cdk_pointer (for *...),
 | 
      
         | 5191 |  |  |          a cdk_function (for ...(...)),
 | 
      
         | 5192 |  |  |          a cdk_attrs (for nested attributes),
 | 
      
         | 5193 |  |  |          or a cdk_id (for the name being declared
 | 
      
         | 5194 |  |  |          or the place in an absolute declarator
 | 
      
         | 5195 |  |  |          where the name was omitted).
 | 
      
         | 5196 |  |  |          For the last case, we have just exited the loop.
 | 
      
         | 5197 |  |  |  
 | 
      
         | 5198 |  |  |          At this point, TYPE is the type of elements of an array,
 | 
      
         | 5199 |  |  |          or for a function to return, or for a pointer to point to.
 | 
      
         | 5200 |  |  |          After this sequence of ifs, TYPE is the type of the
 | 
      
         | 5201 |  |  |          array or function or pointer, and DECLARATOR has had its
 | 
      
         | 5202 |  |  |          outermost layer removed.  */
 | 
      
         | 5203 |  |  |  
 | 
      
         | 5204 |  |  |       if (array_ptr_quals != TYPE_UNQUALIFIED
 | 
      
         | 5205 |  |  |           || array_ptr_attrs != NULL_TREE
 | 
      
         | 5206 |  |  |           || array_parm_static)
 | 
      
         | 5207 |  |  |         {
 | 
      
         | 5208 |  |  |           /* Only the innermost declarator (making a parameter be of
 | 
      
         | 5209 |  |  |              array type which is converted to pointer type)
 | 
      
         | 5210 |  |  |              may have static or type qualifiers.  */
 | 
      
         | 5211 |  |  |           error_at (loc, "static or type qualifiers in non-parameter array declarator");
 | 
      
         | 5212 |  |  |           array_ptr_quals = TYPE_UNQUALIFIED;
 | 
      
         | 5213 |  |  |           array_ptr_attrs = NULL_TREE;
 | 
      
         | 5214 |  |  |           array_parm_static = 0;
 | 
      
         | 5215 |  |  |         }
 | 
      
         | 5216 |  |  |  
 | 
      
         | 5217 |  |  |       switch (declarator->kind)
 | 
      
         | 5218 |  |  |         {
 | 
      
         | 5219 |  |  |         case cdk_attrs:
 | 
      
         | 5220 |  |  |           {
 | 
      
         | 5221 |  |  |             /* A declarator with embedded attributes.  */
 | 
      
         | 5222 |  |  |             tree attrs = declarator->u.attrs;
 | 
      
         | 5223 |  |  |             const struct c_declarator *inner_decl;
 | 
      
         | 5224 |  |  |             int attr_flags = 0;
 | 
      
         | 5225 |  |  |             declarator = declarator->declarator;
 | 
      
         | 5226 |  |  |             inner_decl = declarator;
 | 
      
         | 5227 |  |  |             while (inner_decl->kind == cdk_attrs)
 | 
      
         | 5228 |  |  |               inner_decl = inner_decl->declarator;
 | 
      
         | 5229 |  |  |             if (inner_decl->kind == cdk_id)
 | 
      
         | 5230 |  |  |               attr_flags |= (int) ATTR_FLAG_DECL_NEXT;
 | 
      
         | 5231 |  |  |             else if (inner_decl->kind == cdk_function)
 | 
      
         | 5232 |  |  |               attr_flags |= (int) ATTR_FLAG_FUNCTION_NEXT;
 | 
      
         | 5233 |  |  |             else if (inner_decl->kind == cdk_array)
 | 
      
         | 5234 |  |  |               attr_flags |= (int) ATTR_FLAG_ARRAY_NEXT;
 | 
      
         | 5235 |  |  |             returned_attrs = decl_attributes (&type,
 | 
      
         | 5236 |  |  |                                               chainon (returned_attrs, attrs),
 | 
      
         | 5237 |  |  |                                               attr_flags);
 | 
      
         | 5238 |  |  |             break;
 | 
      
         | 5239 |  |  |           }
 | 
      
         | 5240 |  |  |         case cdk_array:
 | 
      
         | 5241 |  |  |           {
 | 
      
         | 5242 |  |  |             tree itype = NULL_TREE;
 | 
      
         | 5243 |  |  |             tree size = declarator->u.array.dimen;
 | 
      
         | 5244 |  |  |             /* The index is a signed object `sizetype' bits wide.  */
 | 
      
         | 5245 |  |  |             tree index_type = c_common_signed_type (sizetype);
 | 
      
         | 5246 |  |  |  
 | 
      
         | 5247 |  |  |             array_ptr_quals = declarator->u.array.quals;
 | 
      
         | 5248 |  |  |             array_ptr_attrs = declarator->u.array.attrs;
 | 
      
         | 5249 |  |  |             array_parm_static = declarator->u.array.static_p;
 | 
      
         | 5250 |  |  |             array_parm_vla_unspec_p = declarator->u.array.vla_unspec_p;
 | 
      
         | 5251 |  |  |  
 | 
      
         | 5252 |  |  |             declarator = declarator->declarator;
 | 
      
         | 5253 |  |  |  
 | 
      
         | 5254 |  |  |             /* Check for some types that there cannot be arrays of.  */
 | 
      
         | 5255 |  |  |  
 | 
      
         | 5256 |  |  |             if (VOID_TYPE_P (type))
 | 
      
         | 5257 |  |  |               {
 | 
      
         | 5258 |  |  |                 if (name)
 | 
      
         | 5259 |  |  |                   error_at (loc, "declaration of %qE as array of voids", name);
 | 
      
         | 5260 |  |  |                 else
 | 
      
         | 5261 |  |  |                   error_at (loc, "declaration of type name as array of voids");
 | 
      
         | 5262 |  |  |                 type = error_mark_node;
 | 
      
         | 5263 |  |  |               }
 | 
      
         | 5264 |  |  |  
 | 
      
         | 5265 |  |  |             if (TREE_CODE (type) == FUNCTION_TYPE)
 | 
      
         | 5266 |  |  |               {
 | 
      
         | 5267 |  |  |                 if (name)
 | 
      
         | 5268 |  |  |                   error_at (loc, "declaration of %qE as array of functions",
 | 
      
         | 5269 |  |  |                             name);
 | 
      
         | 5270 |  |  |                 else
 | 
      
         | 5271 |  |  |                   error_at (loc, "declaration of type name as array of "
 | 
      
         | 5272 |  |  |                             "functions");
 | 
      
         | 5273 |  |  |                 type = error_mark_node;
 | 
      
         | 5274 |  |  |               }
 | 
      
         | 5275 |  |  |  
 | 
      
         | 5276 |  |  |             if (pedantic && !in_system_header && flexible_array_type_p (type))
 | 
      
         | 5277 |  |  |               pedwarn (loc, OPT_pedantic,
 | 
      
         | 5278 |  |  |                        "invalid use of structure with flexible array member");
 | 
      
         | 5279 |  |  |  
 | 
      
         | 5280 |  |  |             if (size == error_mark_node)
 | 
      
         | 5281 |  |  |               type = error_mark_node;
 | 
      
         | 5282 |  |  |  
 | 
      
         | 5283 |  |  |             if (type == error_mark_node)
 | 
      
         | 5284 |  |  |               continue;
 | 
      
         | 5285 |  |  |  
 | 
      
         | 5286 |  |  |             /* If size was specified, set ITYPE to a range-type for
 | 
      
         | 5287 |  |  |                that size.  Otherwise, ITYPE remains null.  finish_decl
 | 
      
         | 5288 |  |  |                may figure it out from an initial value.  */
 | 
      
         | 5289 |  |  |  
 | 
      
         | 5290 |  |  |             if (size)
 | 
      
         | 5291 |  |  |               {
 | 
      
         | 5292 |  |  |                 bool size_maybe_const = true;
 | 
      
         | 5293 |  |  |                 bool size_int_const = (TREE_CODE (size) == INTEGER_CST
 | 
      
         | 5294 |  |  |                                        && !TREE_OVERFLOW (size));
 | 
      
         | 5295 |  |  |                 bool this_size_varies = false;
 | 
      
         | 5296 |  |  |  
 | 
      
         | 5297 |  |  |                 /* Strip NON_LVALUE_EXPRs since we aren't using as an
 | 
      
         | 5298 |  |  |                    lvalue.  */
 | 
      
         | 5299 |  |  |                 STRIP_TYPE_NOPS (size);
 | 
      
         | 5300 |  |  |  
 | 
      
         | 5301 |  |  |                 if (!INTEGRAL_TYPE_P (TREE_TYPE (size)))
 | 
      
         | 5302 |  |  |                   {
 | 
      
         | 5303 |  |  |                     if (name)
 | 
      
         | 5304 |  |  |                       error_at (loc, "size of array %qE has non-integer type",
 | 
      
         | 5305 |  |  |                                 name);
 | 
      
         | 5306 |  |  |                     else
 | 
      
         | 5307 |  |  |                       error_at (loc,
 | 
      
         | 5308 |  |  |                                 "size of unnamed array has non-integer type");
 | 
      
         | 5309 |  |  |                     size = integer_one_node;
 | 
      
         | 5310 |  |  |                   }
 | 
      
         | 5311 |  |  |  
 | 
      
         | 5312 |  |  |                 size = c_fully_fold (size, false, &size_maybe_const);
 | 
      
         | 5313 |  |  |  
 | 
      
         | 5314 |  |  |                 if (pedantic && size_maybe_const && integer_zerop (size))
 | 
      
         | 5315 |  |  |                   {
 | 
      
         | 5316 |  |  |                     if (name)
 | 
      
         | 5317 |  |  |                       pedwarn (loc, OPT_pedantic,
 | 
      
         | 5318 |  |  |                                "ISO C forbids zero-size array %qE", name);
 | 
      
         | 5319 |  |  |                     else
 | 
      
         | 5320 |  |  |                       pedwarn (loc, OPT_pedantic,
 | 
      
         | 5321 |  |  |                                "ISO C forbids zero-size array");
 | 
      
         | 5322 |  |  |                   }
 | 
      
         | 5323 |  |  |  
 | 
      
         | 5324 |  |  |                 if (TREE_CODE (size) == INTEGER_CST && size_maybe_const)
 | 
      
         | 5325 |  |  |                   {
 | 
      
         | 5326 |  |  |                     constant_expression_warning (size);
 | 
      
         | 5327 |  |  |                     if (tree_int_cst_sgn (size) < 0)
 | 
      
         | 5328 |  |  |                       {
 | 
      
         | 5329 |  |  |                         if (name)
 | 
      
         | 5330 |  |  |                           error_at (loc, "size of array %qE is negative", name);
 | 
      
         | 5331 |  |  |                         else
 | 
      
         | 5332 |  |  |                           error_at (loc, "size of unnamed array is negative");
 | 
      
         | 5333 |  |  |                         size = integer_one_node;
 | 
      
         | 5334 |  |  |                       }
 | 
      
         | 5335 |  |  |                     /* Handle a size folded to an integer constant but
 | 
      
         | 5336 |  |  |                        not an integer constant expression.  */
 | 
      
         | 5337 |  |  |                     if (!size_int_const)
 | 
      
         | 5338 |  |  |                       {
 | 
      
         | 5339 |  |  |                         /* If this is a file scope declaration of an
 | 
      
         | 5340 |  |  |                            ordinary identifier, this is invalid code;
 | 
      
         | 5341 |  |  |                            diagnosing it here and not subsequently
 | 
      
         | 5342 |  |  |                            treating the type as variable-length avoids
 | 
      
         | 5343 |  |  |                            more confusing diagnostics later.  */
 | 
      
         | 5344 |  |  |                         if ((decl_context == NORMAL || decl_context == FIELD)
 | 
      
         | 5345 |  |  |                             && current_scope == file_scope)
 | 
      
         | 5346 |  |  |                           pedwarn (input_location, 0,
 | 
      
         | 5347 |  |  |                                    "variably modified %qE at file scope",
 | 
      
         | 5348 |  |  |                                    name);
 | 
      
         | 5349 |  |  |                         else
 | 
      
         | 5350 |  |  |                           this_size_varies = size_varies = true;
 | 
      
         | 5351 |  |  |                         warn_variable_length_array (name, size);
 | 
      
         | 5352 |  |  |                       }
 | 
      
         | 5353 |  |  |                   }
 | 
      
         | 5354 |  |  |                 else if ((decl_context == NORMAL || decl_context == FIELD)
 | 
      
         | 5355 |  |  |                          && current_scope == file_scope)
 | 
      
         | 5356 |  |  |                   {
 | 
      
         | 5357 |  |  |                     error_at (loc, "variably modified %qE at file scope", name);
 | 
      
         | 5358 |  |  |                     size = integer_one_node;
 | 
      
         | 5359 |  |  |                   }
 | 
      
         | 5360 |  |  |                 else
 | 
      
         | 5361 |  |  |                   {
 | 
      
         | 5362 |  |  |                     /* Make sure the array size remains visibly
 | 
      
         | 5363 |  |  |                        nonconstant even if it is (eg) a const variable
 | 
      
         | 5364 |  |  |                        with known value.  */
 | 
      
         | 5365 |  |  |                     this_size_varies = size_varies = true;
 | 
      
         | 5366 |  |  |                     warn_variable_length_array (name, size);
 | 
      
         | 5367 |  |  |                   }
 | 
      
         | 5368 |  |  |  
 | 
      
         | 5369 |  |  |                 if (integer_zerop (size) && !this_size_varies)
 | 
      
         | 5370 |  |  |                   {
 | 
      
         | 5371 |  |  |                     /* A zero-length array cannot be represented with
 | 
      
         | 5372 |  |  |                        an unsigned index type, which is what we'll
 | 
      
         | 5373 |  |  |                        get with build_index_type.  Create an
 | 
      
         | 5374 |  |  |                        open-ended range instead.  */
 | 
      
         | 5375 |  |  |                     itype = build_range_type (sizetype, size, NULL_TREE);
 | 
      
         | 5376 |  |  |                   }
 | 
      
         | 5377 |  |  |                 else
 | 
      
         | 5378 |  |  |                   {
 | 
      
         | 5379 |  |  |                     /* Arrange for the SAVE_EXPR on the inside of the
 | 
      
         | 5380 |  |  |                        MINUS_EXPR, which allows the -1 to get folded
 | 
      
         | 5381 |  |  |                        with the +1 that happens when building TYPE_SIZE.  */
 | 
      
         | 5382 |  |  |                     if (size_varies)
 | 
      
         | 5383 |  |  |                       size = save_expr (size);
 | 
      
         | 5384 |  |  |                     if (this_size_varies && TREE_CODE (size) == INTEGER_CST)
 | 
      
         | 5385 |  |  |                       size = build2 (COMPOUND_EXPR, TREE_TYPE (size),
 | 
      
         | 5386 |  |  |                                      integer_zero_node, size);
 | 
      
         | 5387 |  |  |  
 | 
      
         | 5388 |  |  |                     /* Compute the maximum valid index, that is, size
 | 
      
         | 5389 |  |  |                        - 1.  Do the calculation in index_type, so that
 | 
      
         | 5390 |  |  |                        if it is a variable the computations will be
 | 
      
         | 5391 |  |  |                        done in the proper mode.  */
 | 
      
         | 5392 |  |  |                     itype = fold_build2_loc (loc, MINUS_EXPR, index_type,
 | 
      
         | 5393 |  |  |                                              convert (index_type, size),
 | 
      
         | 5394 |  |  |                                              convert (index_type,
 | 
      
         | 5395 |  |  |                                                       size_one_node));
 | 
      
         | 5396 |  |  |  
 | 
      
         | 5397 |  |  |                     /* The above overflows when size does not fit
 | 
      
         | 5398 |  |  |                        in index_type.
 | 
      
         | 5399 |  |  |                        ???  While a size of INT_MAX+1 technically shouldn't
 | 
      
         | 5400 |  |  |                        cause an overflow (because we subtract 1), handling
 | 
      
         | 5401 |  |  |                        this case seems like an unnecessary complication.  */
 | 
      
         | 5402 |  |  |                     if (TREE_CODE (size) == INTEGER_CST
 | 
      
         | 5403 |  |  |                         && !int_fits_type_p (size, index_type))
 | 
      
         | 5404 |  |  |                       {
 | 
      
         | 5405 |  |  |                         if (name)
 | 
      
         | 5406 |  |  |                           error_at (loc, "size of array %qE is too large",
 | 
      
         | 5407 |  |  |                                     name);
 | 
      
         | 5408 |  |  |                         else
 | 
      
         | 5409 |  |  |                           error_at (loc, "size of unnamed array is too large");
 | 
      
         | 5410 |  |  |                         type = error_mark_node;
 | 
      
         | 5411 |  |  |                         continue;
 | 
      
         | 5412 |  |  |                       }
 | 
      
         | 5413 |  |  |  
 | 
      
         | 5414 |  |  |                     itype = build_index_type (itype);
 | 
      
         | 5415 |  |  |                   }
 | 
      
         | 5416 |  |  |                 if (this_size_varies)
 | 
      
         | 5417 |  |  |                   {
 | 
      
         | 5418 |  |  |                     if (*expr)
 | 
      
         | 5419 |  |  |                       *expr = build2 (COMPOUND_EXPR, TREE_TYPE (size),
 | 
      
         | 5420 |  |  |                                       *expr, size);
 | 
      
         | 5421 |  |  |                     else
 | 
      
         | 5422 |  |  |                       *expr = size;
 | 
      
         | 5423 |  |  |                     *expr_const_operands &= size_maybe_const;
 | 
      
         | 5424 |  |  |                   }
 | 
      
         | 5425 |  |  |               }
 | 
      
         | 5426 |  |  |             else if (decl_context == FIELD)
 | 
      
         | 5427 |  |  |               {
 | 
      
         | 5428 |  |  |                 bool flexible_array_member = false;
 | 
      
         | 5429 |  |  |                 if (array_parm_vla_unspec_p)
 | 
      
         | 5430 |  |  |                   /* Field names can in fact have function prototype
 | 
      
         | 5431 |  |  |                      scope so [*] is disallowed here through making
 | 
      
         | 5432 |  |  |                      the field variably modified, not through being
 | 
      
         | 5433 |  |  |                      something other than a declaration with function
 | 
      
         | 5434 |  |  |                      prototype scope.  */
 | 
      
         | 5435 |  |  |                   size_varies = true;
 | 
      
         | 5436 |  |  |                 else
 | 
      
         | 5437 |  |  |                   {
 | 
      
         | 5438 |  |  |                     const struct c_declarator *t = declarator;
 | 
      
         | 5439 |  |  |                     while (t->kind == cdk_attrs)
 | 
      
         | 5440 |  |  |                       t = t->declarator;
 | 
      
         | 5441 |  |  |                     flexible_array_member = (t->kind == cdk_id);
 | 
      
         | 5442 |  |  |                   }
 | 
      
         | 5443 |  |  |                 if (flexible_array_member
 | 
      
         | 5444 |  |  |                     && pedantic && !flag_isoc99 && !in_system_header)
 | 
      
         | 5445 |  |  |                   pedwarn (loc, OPT_pedantic,
 | 
      
         | 5446 |  |  |                            "ISO C90 does not support flexible array members");
 | 
      
         | 5447 |  |  |  
 | 
      
         | 5448 |  |  |                 /* ISO C99 Flexible array members are effectively
 | 
      
         | 5449 |  |  |                    identical to GCC's zero-length array extension.  */
 | 
      
         | 5450 |  |  |                 if (flexible_array_member || array_parm_vla_unspec_p)
 | 
      
         | 5451 |  |  |                   itype = build_range_type (sizetype, size_zero_node,
 | 
      
         | 5452 |  |  |                                             NULL_TREE);
 | 
      
         | 5453 |  |  |               }
 | 
      
         | 5454 |  |  |             else if (decl_context == PARM)
 | 
      
         | 5455 |  |  |               {
 | 
      
         | 5456 |  |  |                 if (array_parm_vla_unspec_p)
 | 
      
         | 5457 |  |  |                   {
 | 
      
         | 5458 |  |  |                     itype = build_range_type (sizetype, size_zero_node, NULL_TREE);
 | 
      
         | 5459 |  |  |                     size_varies = true;
 | 
      
         | 5460 |  |  |                   }
 | 
      
         | 5461 |  |  |               }
 | 
      
         | 5462 |  |  |             else if (decl_context == TYPENAME)
 | 
      
         | 5463 |  |  |               {
 | 
      
         | 5464 |  |  |                 if (array_parm_vla_unspec_p)
 | 
      
         | 5465 |  |  |                   {
 | 
      
         | 5466 |  |  |                     /* C99 6.7.5.2p4 */
 | 
      
         | 5467 |  |  |                     warning (0, "%<[*]%> not in a declaration");
 | 
      
         | 5468 |  |  |                     /* We use this to avoid messing up with incomplete
 | 
      
         | 5469 |  |  |                        array types of the same type, that would
 | 
      
         | 5470 |  |  |                        otherwise be modified below.  */
 | 
      
         | 5471 |  |  |                     itype = build_range_type (sizetype, size_zero_node,
 | 
      
         | 5472 |  |  |                                               NULL_TREE);
 | 
      
         | 5473 |  |  |                     size_varies = true;
 | 
      
         | 5474 |  |  |                   }
 | 
      
         | 5475 |  |  |               }
 | 
      
         | 5476 |  |  |  
 | 
      
         | 5477 |  |  |             /* Complain about arrays of incomplete types.  */
 | 
      
         | 5478 |  |  |             if (!COMPLETE_TYPE_P (type))
 | 
      
         | 5479 |  |  |               {
 | 
      
         | 5480 |  |  |                 error_at (loc, "array type has incomplete element type");
 | 
      
         | 5481 |  |  |                 type = error_mark_node;
 | 
      
         | 5482 |  |  |               }
 | 
      
         | 5483 |  |  |             else
 | 
      
         | 5484 |  |  |             /* When itype is NULL, a shared incomplete array type is
 | 
      
         | 5485 |  |  |                returned for all array of a given type.  Elsewhere we
 | 
      
         | 5486 |  |  |                make sure we don't complete that type before copying
 | 
      
         | 5487 |  |  |                it, but here we want to make sure we don't ever
 | 
      
         | 5488 |  |  |                modify the shared type, so we gcc_assert (itype)
 | 
      
         | 5489 |  |  |                below.  */
 | 
      
         | 5490 |  |  |               {
 | 
      
         | 5491 |  |  |                 addr_space_t as = DECODE_QUAL_ADDR_SPACE (type_quals);
 | 
      
         | 5492 |  |  |                 if (!ADDR_SPACE_GENERIC_P (as) && as != TYPE_ADDR_SPACE (type))
 | 
      
         | 5493 |  |  |                   type = build_qualified_type (type,
 | 
      
         | 5494 |  |  |                                                ENCODE_QUAL_ADDR_SPACE (as));
 | 
      
         | 5495 |  |  |  
 | 
      
         | 5496 |  |  |                 type = build_array_type (type, itype);
 | 
      
         | 5497 |  |  |               }
 | 
      
         | 5498 |  |  |  
 | 
      
         | 5499 |  |  |             if (type != error_mark_node)
 | 
      
         | 5500 |  |  |               {
 | 
      
         | 5501 |  |  |                 if (size_varies)
 | 
      
         | 5502 |  |  |                   {
 | 
      
         | 5503 |  |  |                     /* It is ok to modify type here even if itype is
 | 
      
         | 5504 |  |  |                        NULL: if size_varies, we're in a
 | 
      
         | 5505 |  |  |                        multi-dimensional array and the inner type has
 | 
      
         | 5506 |  |  |                        variable size, so the enclosing shared array type
 | 
      
         | 5507 |  |  |                        must too.  */
 | 
      
         | 5508 |  |  |                     if (size && TREE_CODE (size) == INTEGER_CST)
 | 
      
         | 5509 |  |  |                       type
 | 
      
         | 5510 |  |  |                         = build_distinct_type_copy (TYPE_MAIN_VARIANT (type));
 | 
      
         | 5511 |  |  |                     C_TYPE_VARIABLE_SIZE (type) = 1;
 | 
      
         | 5512 |  |  |                   }
 | 
      
         | 5513 |  |  |  
 | 
      
         | 5514 |  |  |                 /* The GCC extension for zero-length arrays differs from
 | 
      
         | 5515 |  |  |                    ISO flexible array members in that sizeof yields
 | 
      
         | 5516 |  |  |                    zero.  */
 | 
      
         | 5517 |  |  |                 if (size && integer_zerop (size))
 | 
      
         | 5518 |  |  |                   {
 | 
      
         | 5519 |  |  |                     gcc_assert (itype);
 | 
      
         | 5520 |  |  |                     type = build_distinct_type_copy (TYPE_MAIN_VARIANT (type));
 | 
      
         | 5521 |  |  |                     TYPE_SIZE (type) = bitsize_zero_node;
 | 
      
         | 5522 |  |  |                     TYPE_SIZE_UNIT (type) = size_zero_node;
 | 
      
         | 5523 |  |  |                     SET_TYPE_STRUCTURAL_EQUALITY (type);
 | 
      
         | 5524 |  |  |                   }
 | 
      
         | 5525 |  |  |                 if (array_parm_vla_unspec_p)
 | 
      
         | 5526 |  |  |                   {
 | 
      
         | 5527 |  |  |                     gcc_assert (itype);
 | 
      
         | 5528 |  |  |                     /* The type is complete.  C99 6.7.5.2p4  */
 | 
      
         | 5529 |  |  |                     type = build_distinct_type_copy (TYPE_MAIN_VARIANT (type));
 | 
      
         | 5530 |  |  |                     TYPE_SIZE (type) = bitsize_zero_node;
 | 
      
         | 5531 |  |  |                     TYPE_SIZE_UNIT (type) = size_zero_node;
 | 
      
         | 5532 |  |  |                     SET_TYPE_STRUCTURAL_EQUALITY (type);
 | 
      
         | 5533 |  |  |                   }
 | 
      
         | 5534 |  |  |               }
 | 
      
         | 5535 |  |  |  
 | 
      
         | 5536 |  |  |             if (decl_context != PARM
 | 
      
         | 5537 |  |  |                 && (array_ptr_quals != TYPE_UNQUALIFIED
 | 
      
         | 5538 |  |  |                     || array_ptr_attrs != NULL_TREE
 | 
      
         | 5539 |  |  |                     || array_parm_static))
 | 
      
         | 5540 |  |  |               {
 | 
      
         | 5541 |  |  |                 error_at (loc, "static or type qualifiers in non-parameter array declarator");
 | 
      
         | 5542 |  |  |                 array_ptr_quals = TYPE_UNQUALIFIED;
 | 
      
         | 5543 |  |  |                 array_ptr_attrs = NULL_TREE;
 | 
      
         | 5544 |  |  |                 array_parm_static = 0;
 | 
      
         | 5545 |  |  |               }
 | 
      
         | 5546 |  |  |             break;
 | 
      
         | 5547 |  |  |           }
 | 
      
         | 5548 |  |  |         case cdk_function:
 | 
      
         | 5549 |  |  |           {
 | 
      
         | 5550 |  |  |             /* Say it's a definition only for the declarator closest
 | 
      
         | 5551 |  |  |                to the identifier, apart possibly from some
 | 
      
         | 5552 |  |  |                attributes.  */
 | 
      
         | 5553 |  |  |             bool really_funcdef = false;
 | 
      
         | 5554 |  |  |             tree arg_types;
 | 
      
         | 5555 |  |  |             if (funcdef_flag)
 | 
      
         | 5556 |  |  |               {
 | 
      
         | 5557 |  |  |                 const struct c_declarator *t = declarator->declarator;
 | 
      
         | 5558 |  |  |                 while (t->kind == cdk_attrs)
 | 
      
         | 5559 |  |  |                   t = t->declarator;
 | 
      
         | 5560 |  |  |                 really_funcdef = (t->kind == cdk_id);
 | 
      
         | 5561 |  |  |               }
 | 
      
         | 5562 |  |  |  
 | 
      
         | 5563 |  |  |             /* Declaring a function type.  Make sure we have a valid
 | 
      
         | 5564 |  |  |                type for the function to return.  */
 | 
      
         | 5565 |  |  |             if (type == error_mark_node)
 | 
      
         | 5566 |  |  |               continue;
 | 
      
         | 5567 |  |  |  
 | 
      
         | 5568 |  |  |             size_varies = false;
 | 
      
         | 5569 |  |  |  
 | 
      
         | 5570 |  |  |             /* Warn about some types functions can't return.  */
 | 
      
         | 5571 |  |  |             if (TREE_CODE (type) == FUNCTION_TYPE)
 | 
      
         | 5572 |  |  |               {
 | 
      
         | 5573 |  |  |                 if (name)
 | 
      
         | 5574 |  |  |                   error_at (loc, "%qE declared as function returning a "
 | 
      
         | 5575 |  |  |                                  "function", name);
 | 
      
         | 5576 |  |  |                 else
 | 
      
         | 5577 |  |  |                   error_at (loc, "type name declared as function "
 | 
      
         | 5578 |  |  |                             "returning a function");
 | 
      
         | 5579 |  |  |                 type = integer_type_node;
 | 
      
         | 5580 |  |  |               }
 | 
      
         | 5581 |  |  |             if (TREE_CODE (type) == ARRAY_TYPE)
 | 
      
         | 5582 |  |  |               {
 | 
      
         | 5583 |  |  |                 if (name)
 | 
      
         | 5584 |  |  |                   error_at (loc, "%qE declared as function returning an array",
 | 
      
         | 5585 |  |  |                             name);
 | 
      
         | 5586 |  |  |                 else
 | 
      
         | 5587 |  |  |                   error_at (loc, "type name declared as function returning "
 | 
      
         | 5588 |  |  |                             "an array");
 | 
      
         | 5589 |  |  |                 type = integer_type_node;
 | 
      
         | 5590 |  |  |               }
 | 
      
         | 5591 |  |  |             errmsg = targetm.invalid_return_type (type);
 | 
      
         | 5592 |  |  |             if (errmsg)
 | 
      
         | 5593 |  |  |               {
 | 
      
         | 5594 |  |  |                 error (errmsg);
 | 
      
         | 5595 |  |  |                 type = integer_type_node;
 | 
      
         | 5596 |  |  |               }
 | 
      
         | 5597 |  |  |  
 | 
      
         | 5598 |  |  |             /* Construct the function type and go to the next
 | 
      
         | 5599 |  |  |                inner layer of declarator.  */
 | 
      
         | 5600 |  |  |             arg_info = declarator->u.arg_info;
 | 
      
         | 5601 |  |  |             arg_types = grokparms (arg_info, really_funcdef);
 | 
      
         | 5602 |  |  |  
 | 
      
         | 5603 |  |  |             /* Type qualifiers before the return type of the function
 | 
      
         | 5604 |  |  |                qualify the return type, not the function type.  */
 | 
      
         | 5605 |  |  |             if (type_quals)
 | 
      
         | 5606 |  |  |               {
 | 
      
         | 5607 |  |  |                 /* Type qualifiers on a function return type are
 | 
      
         | 5608 |  |  |                    normally permitted by the standard but have no
 | 
      
         | 5609 |  |  |                    effect, so give a warning at -Wreturn-type.
 | 
      
         | 5610 |  |  |                    Qualifiers on a void return type are banned on
 | 
      
         | 5611 |  |  |                    function definitions in ISO C; GCC used to used
 | 
      
         | 5612 |  |  |                    them for noreturn functions.  */
 | 
      
         | 5613 |  |  |                 if (VOID_TYPE_P (type) && really_funcdef)
 | 
      
         | 5614 |  |  |                   pedwarn (loc, 0,
 | 
      
         | 5615 |  |  |                            "function definition has qualified void return type");
 | 
      
         | 5616 |  |  |                 else
 | 
      
         | 5617 |  |  |                   warning_at (loc, OPT_Wignored_qualifiers,
 | 
      
         | 5618 |  |  |                            "type qualifiers ignored on function return type");
 | 
      
         | 5619 |  |  |  
 | 
      
         | 5620 |  |  |                 type = c_build_qualified_type (type, type_quals);
 | 
      
         | 5621 |  |  |               }
 | 
      
         | 5622 |  |  |             type_quals = TYPE_UNQUALIFIED;
 | 
      
         | 5623 |  |  |  
 | 
      
         | 5624 |  |  |             type = build_function_type (type, arg_types);
 | 
      
         | 5625 |  |  |             declarator = declarator->declarator;
 | 
      
         | 5626 |  |  |  
 | 
      
         | 5627 |  |  |             /* Set the TYPE_CONTEXTs for each tagged type which is local to
 | 
      
         | 5628 |  |  |                the formal parameter list of this FUNCTION_TYPE to point to
 | 
      
         | 5629 |  |  |                the FUNCTION_TYPE node itself.  */
 | 
      
         | 5630 |  |  |             {
 | 
      
         | 5631 |  |  |               c_arg_tag *tag;
 | 
      
         | 5632 |  |  |               unsigned ix;
 | 
      
         | 5633 |  |  |  
 | 
      
         | 5634 |  |  |               FOR_EACH_VEC_ELT_REVERSE (c_arg_tag, arg_info->tags, ix, tag)
 | 
      
         | 5635 |  |  |                 TYPE_CONTEXT (tag->type) = type;
 | 
      
         | 5636 |  |  |             }
 | 
      
         | 5637 |  |  |             break;
 | 
      
         | 5638 |  |  |           }
 | 
      
         | 5639 |  |  |         case cdk_pointer:
 | 
      
         | 5640 |  |  |           {
 | 
      
         | 5641 |  |  |             /* Merge any constancy or volatility into the target type
 | 
      
         | 5642 |  |  |                for the pointer.  */
 | 
      
         | 5643 |  |  |  
 | 
      
         | 5644 |  |  |             if (pedantic && TREE_CODE (type) == FUNCTION_TYPE
 | 
      
         | 5645 |  |  |                 && type_quals)
 | 
      
         | 5646 |  |  |               pedwarn (loc, OPT_pedantic,
 | 
      
         | 5647 |  |  |                        "ISO C forbids qualified function types");
 | 
      
         | 5648 |  |  |             if (type_quals)
 | 
      
         | 5649 |  |  |               type = c_build_qualified_type (type, type_quals);
 | 
      
         | 5650 |  |  |             size_varies = false;
 | 
      
         | 5651 |  |  |  
 | 
      
         | 5652 |  |  |             /* When the pointed-to type involves components of variable size,
 | 
      
         | 5653 |  |  |                care must be taken to ensure that the size evaluation code is
 | 
      
         | 5654 |  |  |                emitted early enough to dominate all the possible later uses
 | 
      
         | 5655 |  |  |                and late enough for the variables on which it depends to have
 | 
      
         | 5656 |  |  |                been assigned.
 | 
      
         | 5657 |  |  |  
 | 
      
         | 5658 |  |  |                This is expected to happen automatically when the pointed-to
 | 
      
         | 5659 |  |  |                type has a name/declaration of it's own, but special attention
 | 
      
         | 5660 |  |  |                is required if the type is anonymous.
 | 
      
         | 5661 |  |  |  
 | 
      
         | 5662 |  |  |                We handle the NORMAL and FIELD contexts here by attaching an
 | 
      
         | 5663 |  |  |                artificial TYPE_DECL to such pointed-to type.  This forces the
 | 
      
         | 5664 |  |  |                sizes evaluation at a safe point and ensures it is not deferred
 | 
      
         | 5665 |  |  |                until e.g. within a deeper conditional context.
 | 
      
         | 5666 |  |  |  
 | 
      
         | 5667 |  |  |                We expect nothing to be needed here for PARM or TYPENAME.
 | 
      
         | 5668 |  |  |                Pushing a TYPE_DECL at this point for TYPENAME would actually
 | 
      
         | 5669 |  |  |                be incorrect, as we might be in the middle of an expression
 | 
      
         | 5670 |  |  |                with side effects on the pointed-to type size "arguments" prior
 | 
      
         | 5671 |  |  |                to the pointer declaration point and the fake TYPE_DECL in the
 | 
      
         | 5672 |  |  |                enclosing context would force the size evaluation prior to the
 | 
      
         | 5673 |  |  |                side effects.  */
 | 
      
         | 5674 |  |  |  
 | 
      
         | 5675 |  |  |             if (!TYPE_NAME (type)
 | 
      
         | 5676 |  |  |                 && (decl_context == NORMAL || decl_context == FIELD)
 | 
      
         | 5677 |  |  |                 && variably_modified_type_p (type, NULL_TREE))
 | 
      
         | 5678 |  |  |               {
 | 
      
         | 5679 |  |  |                 tree decl = build_decl (loc, TYPE_DECL, NULL_TREE, type);
 | 
      
         | 5680 |  |  |                 DECL_ARTIFICIAL (decl) = 1;
 | 
      
         | 5681 |  |  |                 pushdecl (decl);
 | 
      
         | 5682 |  |  |                 finish_decl (decl, loc, NULL_TREE, NULL_TREE, NULL_TREE);
 | 
      
         | 5683 |  |  |                 TYPE_NAME (type) = decl;
 | 
      
         | 5684 |  |  |               }
 | 
      
         | 5685 |  |  |  
 | 
      
         | 5686 |  |  |             type = build_pointer_type (type);
 | 
      
         | 5687 |  |  |  
 | 
      
         | 5688 |  |  |             /* Process type qualifiers (such as const or volatile)
 | 
      
         | 5689 |  |  |                that were given inside the `*'.  */
 | 
      
         | 5690 |  |  |             type_quals = declarator->u.pointer_quals;
 | 
      
         | 5691 |  |  |  
 | 
      
         | 5692 |  |  |             declarator = declarator->declarator;
 | 
      
         | 5693 |  |  |             break;
 | 
      
         | 5694 |  |  |           }
 | 
      
         | 5695 |  |  |         default:
 | 
      
         | 5696 |  |  |           gcc_unreachable ();
 | 
      
         | 5697 |  |  |         }
 | 
      
         | 5698 |  |  |     }
 | 
      
         | 5699 |  |  |   *decl_attrs = chainon (returned_attrs, *decl_attrs);
 | 
      
         | 5700 |  |  |  
 | 
      
         | 5701 |  |  |   /* Now TYPE has the actual type, apart from any qualifiers in
 | 
      
         | 5702 |  |  |      TYPE_QUALS.  */
 | 
      
         | 5703 |  |  |  
 | 
      
         | 5704 |  |  |   /* Warn about address space used for things other than static memory or
 | 
      
         | 5705 |  |  |      pointers.  */
 | 
      
         | 5706 |  |  |   address_space = DECODE_QUAL_ADDR_SPACE (type_quals);
 | 
      
         | 5707 |  |  |   if (!ADDR_SPACE_GENERIC_P (address_space))
 | 
      
         | 5708 |  |  |     {
 | 
      
         | 5709 |  |  |       if (decl_context == NORMAL)
 | 
      
         | 5710 |  |  |         {
 | 
      
         | 5711 |  |  |           switch (storage_class)
 | 
      
         | 5712 |  |  |             {
 | 
      
         | 5713 |  |  |             case csc_auto:
 | 
      
         | 5714 |  |  |               error ("%qs combined with %<auto%> qualifier for %qE",
 | 
      
         | 5715 |  |  |                      c_addr_space_name (address_space), name);
 | 
      
         | 5716 |  |  |               break;
 | 
      
         | 5717 |  |  |             case csc_register:
 | 
      
         | 5718 |  |  |               error ("%qs combined with %<register%> qualifier for %qE",
 | 
      
         | 5719 |  |  |                      c_addr_space_name (address_space), name);
 | 
      
         | 5720 |  |  |               break;
 | 
      
         | 5721 |  |  |             case csc_none:
 | 
      
         | 5722 |  |  |               if (current_function_scope)
 | 
      
         | 5723 |  |  |                 {
 | 
      
         | 5724 |  |  |                   error ("%qs specified for auto variable %qE",
 | 
      
         | 5725 |  |  |                          c_addr_space_name (address_space), name);
 | 
      
         | 5726 |  |  |                   break;
 | 
      
         | 5727 |  |  |                 }
 | 
      
         | 5728 |  |  |               break;
 | 
      
         | 5729 |  |  |             case csc_static:
 | 
      
         | 5730 |  |  |             case csc_extern:
 | 
      
         | 5731 |  |  |             case csc_typedef:
 | 
      
         | 5732 |  |  |               break;
 | 
      
         | 5733 |  |  |             default:
 | 
      
         | 5734 |  |  |               gcc_unreachable ();
 | 
      
         | 5735 |  |  |             }
 | 
      
         | 5736 |  |  |         }
 | 
      
         | 5737 |  |  |       else if (decl_context == PARM && TREE_CODE (type) != ARRAY_TYPE)
 | 
      
         | 5738 |  |  |         {
 | 
      
         | 5739 |  |  |           if (name)
 | 
      
         | 5740 |  |  |             error ("%qs specified for parameter %qE",
 | 
      
         | 5741 |  |  |                    c_addr_space_name (address_space), name);
 | 
      
         | 5742 |  |  |           else
 | 
      
         | 5743 |  |  |             error ("%qs specified for unnamed parameter",
 | 
      
         | 5744 |  |  |                    c_addr_space_name (address_space));
 | 
      
         | 5745 |  |  |         }
 | 
      
         | 5746 |  |  |       else if (decl_context == FIELD)
 | 
      
         | 5747 |  |  |         {
 | 
      
         | 5748 |  |  |           if (name)
 | 
      
         | 5749 |  |  |             error ("%qs specified for structure field %qE",
 | 
      
         | 5750 |  |  |                    c_addr_space_name (address_space), name);
 | 
      
         | 5751 |  |  |           else
 | 
      
         | 5752 |  |  |             error ("%qs specified for structure field",
 | 
      
         | 5753 |  |  |                    c_addr_space_name (address_space));
 | 
      
         | 5754 |  |  |         }
 | 
      
         | 5755 |  |  |     }
 | 
      
         | 5756 |  |  |  
 | 
      
         | 5757 |  |  |   /* Check the type and width of a bit-field.  */
 | 
      
         | 5758 |  |  |   if (bitfield)
 | 
      
         | 5759 |  |  |     check_bitfield_type_and_width (&type, width, name);
 | 
      
         | 5760 |  |  |  
 | 
      
         | 5761 |  |  |   /* Reject invalid uses of _Alignas.  */
 | 
      
         | 5762 |  |  |   if (declspecs->alignas_p)
 | 
      
         | 5763 |  |  |     {
 | 
      
         | 5764 |  |  |       if (storage_class == csc_typedef)
 | 
      
         | 5765 |  |  |         error_at (loc, "alignment specified for typedef %qE", name);
 | 
      
         | 5766 |  |  |       else if (storage_class == csc_register)
 | 
      
         | 5767 |  |  |         error_at (loc, "alignment specified for %<register%> object %qE",
 | 
      
         | 5768 |  |  |                   name);
 | 
      
         | 5769 |  |  |       else if (decl_context == PARM)
 | 
      
         | 5770 |  |  |         {
 | 
      
         | 5771 |  |  |           if (name)
 | 
      
         | 5772 |  |  |             error_at (loc, "alignment specified for parameter %qE", name);
 | 
      
         | 5773 |  |  |           else
 | 
      
         | 5774 |  |  |             error_at (loc, "alignment specified for unnamed parameter");
 | 
      
         | 5775 |  |  |         }
 | 
      
         | 5776 |  |  |       else if (bitfield)
 | 
      
         | 5777 |  |  |         {
 | 
      
         | 5778 |  |  |           if (name)
 | 
      
         | 5779 |  |  |             error_at (loc, "alignment specified for bit-field %qE", name);
 | 
      
         | 5780 |  |  |           else
 | 
      
         | 5781 |  |  |             error_at (loc, "alignment specified for unnamed bit-field");
 | 
      
         | 5782 |  |  |         }
 | 
      
         | 5783 |  |  |       else if (TREE_CODE (type) == FUNCTION_TYPE)
 | 
      
         | 5784 |  |  |         error_at (loc, "alignment specified for function %qE", name);
 | 
      
         | 5785 |  |  |       else if (declspecs->align_log != -1)
 | 
      
         | 5786 |  |  |         {
 | 
      
         | 5787 |  |  |           alignas_align = 1U << declspecs->align_log;
 | 
      
         | 5788 |  |  |           if (alignas_align < TYPE_ALIGN_UNIT (type))
 | 
      
         | 5789 |  |  |             {
 | 
      
         | 5790 |  |  |               if (name)
 | 
      
         | 5791 |  |  |                 error_at (loc, "%<_Alignas%> specifiers cannot reduce "
 | 
      
         | 5792 |  |  |                           "alignment of %qE", name);
 | 
      
         | 5793 |  |  |               else
 | 
      
         | 5794 |  |  |                 error_at (loc, "%<_Alignas%> specifiers cannot reduce "
 | 
      
         | 5795 |  |  |                           "alignment of unnamed field");
 | 
      
         | 5796 |  |  |               alignas_align = 0;
 | 
      
         | 5797 |  |  |             }
 | 
      
         | 5798 |  |  |         }
 | 
      
         | 5799 |  |  |     }
 | 
      
         | 5800 |  |  |  
 | 
      
         | 5801 |  |  |   /* Did array size calculations overflow?  */
 | 
      
         | 5802 |  |  |  
 | 
      
         | 5803 |  |  |   if (TREE_CODE (type) == ARRAY_TYPE
 | 
      
         | 5804 |  |  |       && COMPLETE_TYPE_P (type)
 | 
      
         | 5805 |  |  |       && TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST
 | 
      
         | 5806 |  |  |       && TREE_OVERFLOW (TYPE_SIZE_UNIT (type)))
 | 
      
         | 5807 |  |  |     {
 | 
      
         | 5808 |  |  |       if (name)
 | 
      
         | 5809 |  |  |         error_at (loc, "size of array %qE is too large", name);
 | 
      
         | 5810 |  |  |       else
 | 
      
         | 5811 |  |  |         error_at (loc, "size of unnamed array is too large");
 | 
      
         | 5812 |  |  |       /* If we proceed with the array type as it is, we'll eventually
 | 
      
         | 5813 |  |  |          crash in tree_low_cst().  */
 | 
      
         | 5814 |  |  |       type = error_mark_node;
 | 
      
         | 5815 |  |  |     }
 | 
      
         | 5816 |  |  |  
 | 
      
         | 5817 |  |  |   /* If this is declaring a typedef name, return a TYPE_DECL.  */
 | 
      
         | 5818 |  |  |  
 | 
      
         | 5819 |  |  |   if (storage_class == csc_typedef)
 | 
      
         | 5820 |  |  |     {
 | 
      
         | 5821 |  |  |       tree decl;
 | 
      
         | 5822 |  |  |       if (pedantic && TREE_CODE (type) == FUNCTION_TYPE
 | 
      
         | 5823 |  |  |           && type_quals)
 | 
      
         | 5824 |  |  |         pedwarn (loc, OPT_pedantic,
 | 
      
         | 5825 |  |  |                  "ISO C forbids qualified function types");
 | 
      
         | 5826 |  |  |       if (type_quals)
 | 
      
         | 5827 |  |  |         type = c_build_qualified_type (type, type_quals);
 | 
      
         | 5828 |  |  |       decl = build_decl (declarator->id_loc,
 | 
      
         | 5829 |  |  |                          TYPE_DECL, declarator->u.id, type);
 | 
      
         | 5830 |  |  |       if (declspecs->explicit_signed_p)
 | 
      
         | 5831 |  |  |         C_TYPEDEF_EXPLICITLY_SIGNED (decl) = 1;
 | 
      
         | 5832 |  |  |       if (declspecs->inline_p)
 | 
      
         | 5833 |  |  |         pedwarn (loc, 0,"typedef %q+D declared %<inline%>", decl);
 | 
      
         | 5834 |  |  |       if (declspecs->noreturn_p)
 | 
      
         | 5835 |  |  |         pedwarn (loc, 0,"typedef %q+D declared %<_Noreturn%>", decl);
 | 
      
         | 5836 |  |  |  
 | 
      
         | 5837 |  |  |       if (warn_cxx_compat && declarator->u.id != NULL_TREE)
 | 
      
         | 5838 |  |  |         {
 | 
      
         | 5839 |  |  |           struct c_binding *b = I_TAG_BINDING (declarator->u.id);
 | 
      
         | 5840 |  |  |  
 | 
      
         | 5841 |  |  |           if (b != NULL
 | 
      
         | 5842 |  |  |               && b->decl != NULL_TREE
 | 
      
         | 5843 |  |  |               && (B_IN_CURRENT_SCOPE (b)
 | 
      
         | 5844 |  |  |                   || (current_scope == file_scope && B_IN_EXTERNAL_SCOPE (b)))
 | 
      
         | 5845 |  |  |               && TYPE_MAIN_VARIANT (b->decl) != TYPE_MAIN_VARIANT (type))
 | 
      
         | 5846 |  |  |             {
 | 
      
         | 5847 |  |  |               warning_at (declarator->id_loc, OPT_Wc___compat,
 | 
      
         | 5848 |  |  |                           ("using %qD as both a typedef and a tag is "
 | 
      
         | 5849 |  |  |                            "invalid in C++"),
 | 
      
         | 5850 |  |  |                           decl);
 | 
      
         | 5851 |  |  |               if (b->locus != UNKNOWN_LOCATION)
 | 
      
         | 5852 |  |  |                 inform (b->locus, "originally defined here");
 | 
      
         | 5853 |  |  |             }
 | 
      
         | 5854 |  |  |         }
 | 
      
         | 5855 |  |  |  
 | 
      
         | 5856 |  |  |       return decl;
 | 
      
         | 5857 |  |  |     }
 | 
      
         | 5858 |  |  |  
 | 
      
         | 5859 |  |  |   /* If this is a type name (such as, in a cast or sizeof),
 | 
      
         | 5860 |  |  |      compute the type and return it now.  */
 | 
      
         | 5861 |  |  |  
 | 
      
         | 5862 |  |  |   if (decl_context == TYPENAME)
 | 
      
         | 5863 |  |  |     {
 | 
      
         | 5864 |  |  |       /* Note that the grammar rejects storage classes in typenames
 | 
      
         | 5865 |  |  |          and fields.  */
 | 
      
         | 5866 |  |  |       gcc_assert (storage_class == csc_none && !threadp
 | 
      
         | 5867 |  |  |                   && !declspecs->inline_p && !declspecs->noreturn_p);
 | 
      
         | 5868 |  |  |       if (pedantic && TREE_CODE (type) == FUNCTION_TYPE
 | 
      
         | 5869 |  |  |           && type_quals)
 | 
      
         | 5870 |  |  |         pedwarn (loc, OPT_pedantic,
 | 
      
         | 5871 |  |  |                  "ISO C forbids const or volatile function types");
 | 
      
         | 5872 |  |  |       if (type_quals)
 | 
      
         | 5873 |  |  |         type = c_build_qualified_type (type, type_quals);
 | 
      
         | 5874 |  |  |       return type;
 | 
      
         | 5875 |  |  |     }
 | 
      
         | 5876 |  |  |  
 | 
      
         | 5877 |  |  |   if (pedantic && decl_context == FIELD
 | 
      
         | 5878 |  |  |       && variably_modified_type_p (type, NULL_TREE))
 | 
      
         | 5879 |  |  |     {
 | 
      
         | 5880 |  |  |       /* C99 6.7.2.1p8 */
 | 
      
         | 5881 |  |  |       pedwarn (loc, OPT_pedantic, "a member of a structure or union cannot "
 | 
      
         | 5882 |  |  |                "have a variably modified type");
 | 
      
         | 5883 |  |  |     }
 | 
      
         | 5884 |  |  |  
 | 
      
         | 5885 |  |  |   /* Aside from typedefs and type names (handle above),
 | 
      
         | 5886 |  |  |      `void' at top level (not within pointer)
 | 
      
         | 5887 |  |  |      is allowed only in public variables.
 | 
      
         | 5888 |  |  |      We don't complain about parms either, but that is because
 | 
      
         | 5889 |  |  |      a better error message can be made later.  */
 | 
      
         | 5890 |  |  |  
 | 
      
         | 5891 |  |  |   if (VOID_TYPE_P (type) && decl_context != PARM
 | 
      
         | 5892 |  |  |       && !((decl_context != FIELD && TREE_CODE (type) != FUNCTION_TYPE)
 | 
      
         | 5893 |  |  |             && (storage_class == csc_extern
 | 
      
         | 5894 |  |  |                 || (current_scope == file_scope
 | 
      
         | 5895 |  |  |                     && !(storage_class == csc_static
 | 
      
         | 5896 |  |  |                          || storage_class == csc_register)))))
 | 
      
         | 5897 |  |  |     {
 | 
      
         | 5898 |  |  |       error_at (loc, "variable or field %qE declared void", name);
 | 
      
         | 5899 |  |  |       type = integer_type_node;
 | 
      
         | 5900 |  |  |     }
 | 
      
         | 5901 |  |  |  
 | 
      
         | 5902 |  |  |   /* Now create the decl, which may be a VAR_DECL, a PARM_DECL
 | 
      
         | 5903 |  |  |      or a FUNCTION_DECL, depending on DECL_CONTEXT and TYPE.  */
 | 
      
         | 5904 |  |  |  
 | 
      
         | 5905 |  |  |   {
 | 
      
         | 5906 |  |  |     tree decl;
 | 
      
         | 5907 |  |  |  
 | 
      
         | 5908 |  |  |     if (decl_context == PARM)
 | 
      
         | 5909 |  |  |       {
 | 
      
         | 5910 |  |  |         tree promoted_type;
 | 
      
         | 5911 |  |  |  
 | 
      
         | 5912 |  |  |         /* A parameter declared as an array of T is really a pointer to T.
 | 
      
         | 5913 |  |  |            One declared as a function is really a pointer to a function.  */
 | 
      
         | 5914 |  |  |  
 | 
      
         | 5915 |  |  |         if (TREE_CODE (type) == ARRAY_TYPE)
 | 
      
         | 5916 |  |  |           {
 | 
      
         | 5917 |  |  |             /* Transfer const-ness of array into that of type pointed to.  */
 | 
      
         | 5918 |  |  |             type = TREE_TYPE (type);
 | 
      
         | 5919 |  |  |             if (type_quals)
 | 
      
         | 5920 |  |  |               type = c_build_qualified_type (type, type_quals);
 | 
      
         | 5921 |  |  |             type = build_pointer_type (type);
 | 
      
         | 5922 |  |  |             type_quals = array_ptr_quals;
 | 
      
         | 5923 |  |  |             if (type_quals)
 | 
      
         | 5924 |  |  |               type = c_build_qualified_type (type, type_quals);
 | 
      
         | 5925 |  |  |  
 | 
      
         | 5926 |  |  |             /* We don't yet implement attributes in this context.  */
 | 
      
         | 5927 |  |  |             if (array_ptr_attrs != NULL_TREE)
 | 
      
         | 5928 |  |  |               warning_at (loc, OPT_Wattributes,
 | 
      
         | 5929 |  |  |                           "attributes in parameter array declarator ignored");
 | 
      
         | 5930 |  |  |  
 | 
      
         | 5931 |  |  |             size_varies = false;
 | 
      
         | 5932 |  |  |           }
 | 
      
         | 5933 |  |  |         else if (TREE_CODE (type) == FUNCTION_TYPE)
 | 
      
         | 5934 |  |  |           {
 | 
      
         | 5935 |  |  |             if (type_quals)
 | 
      
         | 5936 |  |  |               pedwarn (loc, OPT_pedantic,
 | 
      
         | 5937 |  |  |                        "ISO C forbids qualified function types");
 | 
      
         | 5938 |  |  |             if (type_quals)
 | 
      
         | 5939 |  |  |               type = c_build_qualified_type (type, type_quals);
 | 
      
         | 5940 |  |  |             type = build_pointer_type (type);
 | 
      
         | 5941 |  |  |             type_quals = TYPE_UNQUALIFIED;
 | 
      
         | 5942 |  |  |           }
 | 
      
         | 5943 |  |  |         else if (type_quals)
 | 
      
         | 5944 |  |  |           type = c_build_qualified_type (type, type_quals);
 | 
      
         | 5945 |  |  |  
 | 
      
         | 5946 |  |  |         decl = build_decl (declarator->id_loc,
 | 
      
         | 5947 |  |  |                            PARM_DECL, declarator->u.id, type);
 | 
      
         | 5948 |  |  |         if (size_varies)
 | 
      
         | 5949 |  |  |           C_DECL_VARIABLE_SIZE (decl) = 1;
 | 
      
         | 5950 |  |  |  
 | 
      
         | 5951 |  |  |         /* Compute the type actually passed in the parmlist,
 | 
      
         | 5952 |  |  |            for the case where there is no prototype.
 | 
      
         | 5953 |  |  |            (For example, shorts and chars are passed as ints.)
 | 
      
         | 5954 |  |  |            When there is a prototype, this is overridden later.  */
 | 
      
         | 5955 |  |  |  
 | 
      
         | 5956 |  |  |         if (type == error_mark_node)
 | 
      
         | 5957 |  |  |           promoted_type = type;
 | 
      
         | 5958 |  |  |         else
 | 
      
         | 5959 |  |  |           promoted_type = c_type_promotes_to (type);
 | 
      
         | 5960 |  |  |  
 | 
      
         | 5961 |  |  |         DECL_ARG_TYPE (decl) = promoted_type;
 | 
      
         | 5962 |  |  |         if (declspecs->inline_p)
 | 
      
         | 5963 |  |  |           pedwarn (loc, 0, "parameter %q+D declared %<inline%>", decl);
 | 
      
         | 5964 |  |  |         if (declspecs->noreturn_p)
 | 
      
         | 5965 |  |  |           pedwarn (loc, 0, "parameter %q+D declared %<_Noreturn%>", decl);
 | 
      
         | 5966 |  |  |       }
 | 
      
         | 5967 |  |  |     else if (decl_context == FIELD)
 | 
      
         | 5968 |  |  |       {
 | 
      
         | 5969 |  |  |         /* Note that the grammar rejects storage classes in typenames
 | 
      
         | 5970 |  |  |            and fields.  */
 | 
      
         | 5971 |  |  |         gcc_assert (storage_class == csc_none && !threadp
 | 
      
         | 5972 |  |  |                     && !declspecs->inline_p && !declspecs->noreturn_p);
 | 
      
         | 5973 |  |  |  
 | 
      
         | 5974 |  |  |         /* Structure field.  It may not be a function.  */
 | 
      
         | 5975 |  |  |  
 | 
      
         | 5976 |  |  |         if (TREE_CODE (type) == FUNCTION_TYPE)
 | 
      
         | 5977 |  |  |           {
 | 
      
         | 5978 |  |  |             error_at (loc, "field %qE declared as a function", name);
 | 
      
         | 5979 |  |  |             type = build_pointer_type (type);
 | 
      
         | 5980 |  |  |           }
 | 
      
         | 5981 |  |  |         else if (TREE_CODE (type) != ERROR_MARK
 | 
      
         | 5982 |  |  |                  && !COMPLETE_OR_UNBOUND_ARRAY_TYPE_P (type))
 | 
      
         | 5983 |  |  |           {
 | 
      
         | 5984 |  |  |             if (name)
 | 
      
         | 5985 |  |  |               error_at (loc, "field %qE has incomplete type", name);
 | 
      
         | 5986 |  |  |             else
 | 
      
         | 5987 |  |  |               error_at (loc, "unnamed field has incomplete type");
 | 
      
         | 5988 |  |  |             type = error_mark_node;
 | 
      
         | 5989 |  |  |           }
 | 
      
         | 5990 |  |  |         type = c_build_qualified_type (type, type_quals);
 | 
      
         | 5991 |  |  |         decl = build_decl (declarator->id_loc,
 | 
      
         | 5992 |  |  |                            FIELD_DECL, declarator->u.id, type);
 | 
      
         | 5993 |  |  |         DECL_NONADDRESSABLE_P (decl) = bitfield;
 | 
      
         | 5994 |  |  |         if (bitfield && !declarator->u.id)
 | 
      
         | 5995 |  |  |           TREE_NO_WARNING (decl) = 1;
 | 
      
         | 5996 |  |  |  
 | 
      
         | 5997 |  |  |         if (size_varies)
 | 
      
         | 5998 |  |  |           C_DECL_VARIABLE_SIZE (decl) = 1;
 | 
      
         | 5999 |  |  |       }
 | 
      
         | 6000 |  |  |     else if (TREE_CODE (type) == FUNCTION_TYPE)
 | 
      
         | 6001 |  |  |       {
 | 
      
         | 6002 |  |  |         if (storage_class == csc_register || threadp)
 | 
      
         | 6003 |  |  |           {
 | 
      
         | 6004 |  |  |             error_at (loc, "invalid storage class for function %qE", name);
 | 
      
         | 6005 |  |  |           }
 | 
      
         | 6006 |  |  |         else if (current_scope != file_scope)
 | 
      
         | 6007 |  |  |           {
 | 
      
         | 6008 |  |  |             /* Function declaration not at file scope.  Storage
 | 
      
         | 6009 |  |  |                classes other than `extern' are not allowed, C99
 | 
      
         | 6010 |  |  |                6.7.1p5, and `extern' makes no difference.  However,
 | 
      
         | 6011 |  |  |                GCC allows 'auto', perhaps with 'inline', to support
 | 
      
         | 6012 |  |  |                nested functions.  */
 | 
      
         | 6013 |  |  |             if (storage_class == csc_auto)
 | 
      
         | 6014 |  |  |                 pedwarn (loc, OPT_pedantic,
 | 
      
         | 6015 |  |  |                          "invalid storage class for function %qE", name);
 | 
      
         | 6016 |  |  |             else if (storage_class == csc_static)
 | 
      
         | 6017 |  |  |               {
 | 
      
         | 6018 |  |  |                 error_at (loc, "invalid storage class for function %qE", name);
 | 
      
         | 6019 |  |  |                 if (funcdef_flag)
 | 
      
         | 6020 |  |  |                   storage_class = declspecs->storage_class = csc_none;
 | 
      
         | 6021 |  |  |                 else
 | 
      
         | 6022 |  |  |                   return 0;
 | 
      
         | 6023 |  |  |               }
 | 
      
         | 6024 |  |  |           }
 | 
      
         | 6025 |  |  |  
 | 
      
         | 6026 |  |  |         decl = build_decl (declarator->id_loc,
 | 
      
         | 6027 |  |  |                            FUNCTION_DECL, declarator->u.id, type);
 | 
      
         | 6028 |  |  |         decl = build_decl_attribute_variant (decl, decl_attr);
 | 
      
         | 6029 |  |  |  
 | 
      
         | 6030 |  |  |         if (pedantic && type_quals && !DECL_IN_SYSTEM_HEADER (decl))
 | 
      
         | 6031 |  |  |           pedwarn (loc, OPT_pedantic,
 | 
      
         | 6032 |  |  |                    "ISO C forbids qualified function types");
 | 
      
         | 6033 |  |  |  
 | 
      
         | 6034 |  |  |         /* Every function declaration is an external reference
 | 
      
         | 6035 |  |  |            (DECL_EXTERNAL) except for those which are not at file
 | 
      
         | 6036 |  |  |            scope and are explicitly declared "auto".  This is
 | 
      
         | 6037 |  |  |            forbidden by standard C (C99 6.7.1p5) and is interpreted by
 | 
      
         | 6038 |  |  |            GCC to signify a forward declaration of a nested function.  */
 | 
      
         | 6039 |  |  |         if (storage_class == csc_auto && current_scope != file_scope)
 | 
      
         | 6040 |  |  |           DECL_EXTERNAL (decl) = 0;
 | 
      
         | 6041 |  |  |         /* In C99, a function which is declared 'inline' with 'extern'
 | 
      
         | 6042 |  |  |            is not an external reference (which is confusing).  It
 | 
      
         | 6043 |  |  |            means that the later definition of the function must be output
 | 
      
         | 6044 |  |  |            in this file, C99 6.7.4p6.  In GNU C89, a function declared
 | 
      
         | 6045 |  |  |            'extern inline' is an external reference.  */
 | 
      
         | 6046 |  |  |         else if (declspecs->inline_p && storage_class != csc_static)
 | 
      
         | 6047 |  |  |           DECL_EXTERNAL (decl) = ((storage_class == csc_extern)
 | 
      
         | 6048 |  |  |                                   == flag_gnu89_inline);
 | 
      
         | 6049 |  |  |         else
 | 
      
         | 6050 |  |  |           DECL_EXTERNAL (decl) = !initialized;
 | 
      
         | 6051 |  |  |  
 | 
      
         | 6052 |  |  |         /* Record absence of global scope for `static' or `auto'.  */
 | 
      
         | 6053 |  |  |         TREE_PUBLIC (decl)
 | 
      
         | 6054 |  |  |           = !(storage_class == csc_static || storage_class == csc_auto);
 | 
      
         | 6055 |  |  |  
 | 
      
         | 6056 |  |  |         /* For a function definition, record the argument information
 | 
      
         | 6057 |  |  |            block where store_parm_decls will look for it.  */
 | 
      
         | 6058 |  |  |         if (funcdef_flag)
 | 
      
         | 6059 |  |  |           current_function_arg_info = arg_info;
 | 
      
         | 6060 |  |  |  
 | 
      
         | 6061 |  |  |         if (declspecs->default_int_p)
 | 
      
         | 6062 |  |  |           C_FUNCTION_IMPLICIT_INT (decl) = 1;
 | 
      
         | 6063 |  |  |  
 | 
      
         | 6064 |  |  |         /* Record presence of `inline' and `_Noreturn', if it is
 | 
      
         | 6065 |  |  |            reasonable.  */
 | 
      
         | 6066 |  |  |         if (flag_hosted && MAIN_NAME_P (declarator->u.id))
 | 
      
         | 6067 |  |  |           {
 | 
      
         | 6068 |  |  |             if (declspecs->inline_p)
 | 
      
         | 6069 |  |  |               pedwarn (loc, 0, "cannot inline function %<main%>");
 | 
      
         | 6070 |  |  |             if (declspecs->noreturn_p)
 | 
      
         | 6071 |  |  |               pedwarn (loc, 0, "%<main%> declared %<_Noreturn%>");
 | 
      
         | 6072 |  |  |           }
 | 
      
         | 6073 |  |  |         else
 | 
      
         | 6074 |  |  |           {
 | 
      
         | 6075 |  |  |             if (declspecs->inline_p)
 | 
      
         | 6076 |  |  |               /* Record that the function is declared `inline'.  */
 | 
      
         | 6077 |  |  |               DECL_DECLARED_INLINE_P (decl) = 1;
 | 
      
         | 6078 |  |  |             if (declspecs->noreturn_p)
 | 
      
         | 6079 |  |  |               {
 | 
      
         | 6080 |  |  |                 if (!flag_isoc11)
 | 
      
         | 6081 |  |  |                   {
 | 
      
         | 6082 |  |  |                     if (flag_isoc99)
 | 
      
         | 6083 |  |  |                       pedwarn (loc, OPT_pedantic,
 | 
      
         | 6084 |  |  |                                "ISO C99 does not support %<_Noreturn%>");
 | 
      
         | 6085 |  |  |                     else
 | 
      
         | 6086 |  |  |                       pedwarn (loc, OPT_pedantic,
 | 
      
         | 6087 |  |  |                                "ISO C90 does not support %<_Noreturn%>");
 | 
      
         | 6088 |  |  |                   }
 | 
      
         | 6089 |  |  |                 TREE_THIS_VOLATILE (decl) = 1;
 | 
      
         | 6090 |  |  |               }
 | 
      
         | 6091 |  |  |           }
 | 
      
         | 6092 |  |  |       }
 | 
      
         | 6093 |  |  |     else
 | 
      
         | 6094 |  |  |       {
 | 
      
         | 6095 |  |  |         /* It's a variable.  */
 | 
      
         | 6096 |  |  |         /* An uninitialized decl with `extern' is a reference.  */
 | 
      
         | 6097 |  |  |         int extern_ref = !initialized && storage_class == csc_extern;
 | 
      
         | 6098 |  |  |  
 | 
      
         | 6099 |  |  |         type = c_build_qualified_type (type, type_quals);
 | 
      
         | 6100 |  |  |  
 | 
      
         | 6101 |  |  |         /* C99 6.2.2p7: It is invalid (compile-time undefined
 | 
      
         | 6102 |  |  |            behavior) to create an 'extern' declaration for a
 | 
      
         | 6103 |  |  |            variable if there is a global declaration that is
 | 
      
         | 6104 |  |  |            'static' and the global declaration is not visible.
 | 
      
         | 6105 |  |  |            (If the static declaration _is_ currently visible,
 | 
      
         | 6106 |  |  |            the 'extern' declaration is taken to refer to that decl.) */
 | 
      
         | 6107 |  |  |         if (extern_ref && current_scope != file_scope)
 | 
      
         | 6108 |  |  |           {
 | 
      
         | 6109 |  |  |             tree global_decl  = identifier_global_value (declarator->u.id);
 | 
      
         | 6110 |  |  |             tree visible_decl = lookup_name (declarator->u.id);
 | 
      
         | 6111 |  |  |  
 | 
      
         | 6112 |  |  |             if (global_decl
 | 
      
         | 6113 |  |  |                 && global_decl != visible_decl
 | 
      
         | 6114 |  |  |                 && TREE_CODE (global_decl) == VAR_DECL
 | 
      
         | 6115 |  |  |                 && !TREE_PUBLIC (global_decl))
 | 
      
         | 6116 |  |  |               error_at (loc, "variable previously declared %<static%> "
 | 
      
         | 6117 |  |  |                         "redeclared %<extern%>");
 | 
      
         | 6118 |  |  |           }
 | 
      
         | 6119 |  |  |  
 | 
      
         | 6120 |  |  |         decl = build_decl (declarator->id_loc,
 | 
      
         | 6121 |  |  |                            VAR_DECL, declarator->u.id, type);
 | 
      
         | 6122 |  |  |         if (size_varies)
 | 
      
         | 6123 |  |  |           C_DECL_VARIABLE_SIZE (decl) = 1;
 | 
      
         | 6124 |  |  |  
 | 
      
         | 6125 |  |  |         if (declspecs->inline_p)
 | 
      
         | 6126 |  |  |           pedwarn (loc, 0, "variable %q+D declared %<inline%>", decl);
 | 
      
         | 6127 |  |  |         if (declspecs->noreturn_p)
 | 
      
         | 6128 |  |  |           pedwarn (loc, 0, "variable %q+D declared %<_Noreturn%>", decl);
 | 
      
         | 6129 |  |  |  
 | 
      
         | 6130 |  |  |         /* At file scope, an initialized extern declaration may follow
 | 
      
         | 6131 |  |  |            a static declaration.  In that case, DECL_EXTERNAL will be
 | 
      
         | 6132 |  |  |            reset later in start_decl.  */
 | 
      
         | 6133 |  |  |         DECL_EXTERNAL (decl) = (storage_class == csc_extern);
 | 
      
         | 6134 |  |  |  
 | 
      
         | 6135 |  |  |         /* At file scope, the presence of a `static' or `register' storage
 | 
      
         | 6136 |  |  |            class specifier, or the absence of all storage class specifiers
 | 
      
         | 6137 |  |  |            makes this declaration a definition (perhaps tentative).  Also,
 | 
      
         | 6138 |  |  |            the absence of `static' makes it public.  */
 | 
      
         | 6139 |  |  |         if (current_scope == file_scope)
 | 
      
         | 6140 |  |  |           {
 | 
      
         | 6141 |  |  |             TREE_PUBLIC (decl) = storage_class != csc_static;
 | 
      
         | 6142 |  |  |             TREE_STATIC (decl) = !extern_ref;
 | 
      
         | 6143 |  |  |           }
 | 
      
         | 6144 |  |  |         /* Not at file scope, only `static' makes a static definition.  */
 | 
      
         | 6145 |  |  |         else
 | 
      
         | 6146 |  |  |           {
 | 
      
         | 6147 |  |  |             TREE_STATIC (decl) = (storage_class == csc_static);
 | 
      
         | 6148 |  |  |             TREE_PUBLIC (decl) = extern_ref;
 | 
      
         | 6149 |  |  |           }
 | 
      
         | 6150 |  |  |  
 | 
      
         | 6151 |  |  |         if (threadp)
 | 
      
         | 6152 |  |  |           DECL_TLS_MODEL (decl) = decl_default_tls_model (decl);
 | 
      
         | 6153 |  |  |       }
 | 
      
         | 6154 |  |  |  
 | 
      
         | 6155 |  |  |     if ((storage_class == csc_extern
 | 
      
         | 6156 |  |  |          || (storage_class == csc_none
 | 
      
         | 6157 |  |  |              && TREE_CODE (type) == FUNCTION_TYPE
 | 
      
         | 6158 |  |  |              && !funcdef_flag))
 | 
      
         | 6159 |  |  |         && variably_modified_type_p (type, NULL_TREE))
 | 
      
         | 6160 |  |  |       {
 | 
      
         | 6161 |  |  |         /* C99 6.7.5.2p2 */
 | 
      
         | 6162 |  |  |         if (TREE_CODE (type) == FUNCTION_TYPE)
 | 
      
         | 6163 |  |  |           error_at (loc, "non-nested function with variably modified type");
 | 
      
         | 6164 |  |  |         else
 | 
      
         | 6165 |  |  |           error_at (loc, "object with variably modified type must have "
 | 
      
         | 6166 |  |  |                     "no linkage");
 | 
      
         | 6167 |  |  |       }
 | 
      
         | 6168 |  |  |  
 | 
      
         | 6169 |  |  |     /* Record `register' declaration for warnings on &
 | 
      
         | 6170 |  |  |        and in case doing stupid register allocation.  */
 | 
      
         | 6171 |  |  |  
 | 
      
         | 6172 |  |  |     if (storage_class == csc_register)
 | 
      
         | 6173 |  |  |       {
 | 
      
         | 6174 |  |  |         C_DECL_REGISTER (decl) = 1;
 | 
      
         | 6175 |  |  |         DECL_REGISTER (decl) = 1;
 | 
      
         | 6176 |  |  |       }
 | 
      
         | 6177 |  |  |  
 | 
      
         | 6178 |  |  |     /* Record constancy and volatility.  */
 | 
      
         | 6179 |  |  |     c_apply_type_quals_to_decl (type_quals, decl);
 | 
      
         | 6180 |  |  |  
 | 
      
         | 6181 |  |  |     /* Apply _Alignas specifiers.  */
 | 
      
         | 6182 |  |  |     if (alignas_align)
 | 
      
         | 6183 |  |  |       {
 | 
      
         | 6184 |  |  |         DECL_ALIGN (decl) = alignas_align * BITS_PER_UNIT;
 | 
      
         | 6185 |  |  |         DECL_USER_ALIGN (decl) = 1;
 | 
      
         | 6186 |  |  |       }
 | 
      
         | 6187 |  |  |  
 | 
      
         | 6188 |  |  |     /* If a type has volatile components, it should be stored in memory.
 | 
      
         | 6189 |  |  |        Otherwise, the fact that those components are volatile
 | 
      
         | 6190 |  |  |        will be ignored, and would even crash the compiler.
 | 
      
         | 6191 |  |  |        Of course, this only makes sense on  VAR,PARM, and RESULT decl's.   */
 | 
      
         | 6192 |  |  |     if (C_TYPE_FIELDS_VOLATILE (TREE_TYPE (decl))
 | 
      
         | 6193 |  |  |         && (TREE_CODE (decl) == VAR_DECL ||  TREE_CODE (decl) == PARM_DECL
 | 
      
         | 6194 |  |  |           || TREE_CODE (decl) == RESULT_DECL))
 | 
      
         | 6195 |  |  |       {
 | 
      
         | 6196 |  |  |         /* It is not an error for a structure with volatile fields to
 | 
      
         | 6197 |  |  |            be declared register, but reset DECL_REGISTER since it
 | 
      
         | 6198 |  |  |            cannot actually go in a register.  */
 | 
      
         | 6199 |  |  |         int was_reg = C_DECL_REGISTER (decl);
 | 
      
         | 6200 |  |  |         C_DECL_REGISTER (decl) = 0;
 | 
      
         | 6201 |  |  |         DECL_REGISTER (decl) = 0;
 | 
      
         | 6202 |  |  |         c_mark_addressable (decl);
 | 
      
         | 6203 |  |  |         C_DECL_REGISTER (decl) = was_reg;
 | 
      
         | 6204 |  |  |       }
 | 
      
         | 6205 |  |  |  
 | 
      
         | 6206 |  |  |   /* This is the earliest point at which we might know the assembler
 | 
      
         | 6207 |  |  |      name of a variable.  Thus, if it's known before this, die horribly.  */
 | 
      
         | 6208 |  |  |     gcc_assert (!DECL_ASSEMBLER_NAME_SET_P (decl));
 | 
      
         | 6209 |  |  |  
 | 
      
         | 6210 |  |  |     if (warn_cxx_compat
 | 
      
         | 6211 |  |  |         && TREE_CODE (decl) == VAR_DECL
 | 
      
         | 6212 |  |  |         && TREE_PUBLIC (decl)
 | 
      
         | 6213 |  |  |         && TREE_STATIC (decl)
 | 
      
         | 6214 |  |  |         && (TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
 | 
      
         | 6215 |  |  |             || TREE_CODE (TREE_TYPE (decl)) == UNION_TYPE
 | 
      
         | 6216 |  |  |             || TREE_CODE (TREE_TYPE (decl)) == ENUMERAL_TYPE)
 | 
      
         | 6217 |  |  |         && TYPE_NAME (TREE_TYPE (decl)) == NULL_TREE)
 | 
      
         | 6218 |  |  |       warning_at (DECL_SOURCE_LOCATION (decl), OPT_Wc___compat,
 | 
      
         | 6219 |  |  |                   ("non-local variable %qD with anonymous type is "
 | 
      
         | 6220 |  |  |                    "questionable in C++"),
 | 
      
         | 6221 |  |  |                   decl);
 | 
      
         | 6222 |  |  |  
 | 
      
         | 6223 |  |  |     return decl;
 | 
      
         | 6224 |  |  |   }
 | 
      
         | 6225 |  |  | }
 | 
      
         | 6226 |  |  |  
 | 
      
         | 6227 |  |  | /* Decode the parameter-list info for a function type or function definition.
 | 
      
         | 6228 |  |  |    The argument is the value returned by `get_parm_info' (or made in c-parse.c
 | 
      
         | 6229 |  |  |    if there is an identifier list instead of a parameter decl list).
 | 
      
         | 6230 |  |  |    These two functions are separate because when a function returns
 | 
      
         | 6231 |  |  |    or receives functions then each is called multiple times but the order
 | 
      
         | 6232 |  |  |    of calls is different.  The last call to `grokparms' is always the one
 | 
      
         | 6233 |  |  |    that contains the formal parameter names of a function definition.
 | 
      
         | 6234 |  |  |  
 | 
      
         | 6235 |  |  |    Return a list of arg types to use in the FUNCTION_TYPE for this function.
 | 
      
         | 6236 |  |  |  
 | 
      
         | 6237 |  |  |    FUNCDEF_FLAG is true for a function definition, false for
 | 
      
         | 6238 |  |  |    a mere declaration.  A nonempty identifier-list gets an error message
 | 
      
         | 6239 |  |  |    when FUNCDEF_FLAG is false.  */
 | 
      
         | 6240 |  |  |  
 | 
      
         | 6241 |  |  | static tree
 | 
      
         | 6242 |  |  | grokparms (struct c_arg_info *arg_info, bool funcdef_flag)
 | 
      
         | 6243 |  |  | {
 | 
      
         | 6244 |  |  |   tree arg_types = arg_info->types;
 | 
      
         | 6245 |  |  |  
 | 
      
         | 6246 |  |  |   if (funcdef_flag && arg_info->had_vla_unspec)
 | 
      
         | 6247 |  |  |     {
 | 
      
         | 6248 |  |  |       /* A function definition isn't function prototype scope C99 6.2.1p4.  */
 | 
      
         | 6249 |  |  |       /* C99 6.7.5.2p4 */
 | 
      
         | 6250 |  |  |       error ("%<[*]%> not allowed in other than function prototype scope");
 | 
      
         | 6251 |  |  |     }
 | 
      
         | 6252 |  |  |  
 | 
      
         | 6253 |  |  |   if (arg_types == 0 && !funcdef_flag && !in_system_header)
 | 
      
         | 6254 |  |  |     warning (OPT_Wstrict_prototypes,
 | 
      
         | 6255 |  |  |              "function declaration isn%'t a prototype");
 | 
      
         | 6256 |  |  |  
 | 
      
         | 6257 |  |  |   if (arg_types == error_mark_node)
 | 
      
         | 6258 |  |  |     return 0;  /* don't set TYPE_ARG_TYPES in this case */
 | 
      
         | 6259 |  |  |  
 | 
      
         | 6260 |  |  |   else if (arg_types && TREE_CODE (TREE_VALUE (arg_types)) == IDENTIFIER_NODE)
 | 
      
         | 6261 |  |  |     {
 | 
      
         | 6262 |  |  |       if (!funcdef_flag)
 | 
      
         | 6263 |  |  |         {
 | 
      
         | 6264 |  |  |           pedwarn (input_location, 0, "parameter names (without types) in function declaration");
 | 
      
         | 6265 |  |  |           arg_info->parms = NULL_TREE;
 | 
      
         | 6266 |  |  |         }
 | 
      
         | 6267 |  |  |       else
 | 
      
         | 6268 |  |  |         arg_info->parms = arg_info->types;
 | 
      
         | 6269 |  |  |  
 | 
      
         | 6270 |  |  |       arg_info->types = 0;
 | 
      
         | 6271 |  |  |       return 0;
 | 
      
         | 6272 |  |  |     }
 | 
      
         | 6273 |  |  |   else
 | 
      
         | 6274 |  |  |     {
 | 
      
         | 6275 |  |  |       tree parm, type, typelt;
 | 
      
         | 6276 |  |  |       unsigned int parmno;
 | 
      
         | 6277 |  |  |       const char *errmsg;
 | 
      
         | 6278 |  |  |  
 | 
      
         | 6279 |  |  |       /* If there is a parameter of incomplete type in a definition,
 | 
      
         | 6280 |  |  |          this is an error.  In a declaration this is valid, and a
 | 
      
         | 6281 |  |  |          struct or union type may be completed later, before any calls
 | 
      
         | 6282 |  |  |          or definition of the function.  In the case where the tag was
 | 
      
         | 6283 |  |  |          first declared within the parameter list, a warning has
 | 
      
         | 6284 |  |  |          already been given.  If a parameter has void type, then
 | 
      
         | 6285 |  |  |          however the function cannot be defined or called, so
 | 
      
         | 6286 |  |  |          warn.  */
 | 
      
         | 6287 |  |  |  
 | 
      
         | 6288 |  |  |       for (parm = arg_info->parms, typelt = arg_types, parmno = 1;
 | 
      
         | 6289 |  |  |            parm;
 | 
      
         | 6290 |  |  |            parm = DECL_CHAIN (parm), typelt = TREE_CHAIN (typelt), parmno++)
 | 
      
         | 6291 |  |  |         {
 | 
      
         | 6292 |  |  |           type = TREE_VALUE (typelt);
 | 
      
         | 6293 |  |  |           if (type == error_mark_node)
 | 
      
         | 6294 |  |  |             continue;
 | 
      
         | 6295 |  |  |  
 | 
      
         | 6296 |  |  |           if (!COMPLETE_TYPE_P (type))
 | 
      
         | 6297 |  |  |             {
 | 
      
         | 6298 |  |  |               if (funcdef_flag)
 | 
      
         | 6299 |  |  |                 {
 | 
      
         | 6300 |  |  |                   if (DECL_NAME (parm))
 | 
      
         | 6301 |  |  |                     error_at (input_location,
 | 
      
         | 6302 |  |  |                               "parameter %u (%q+D) has incomplete type",
 | 
      
         | 6303 |  |  |                               parmno, parm);
 | 
      
         | 6304 |  |  |                   else
 | 
      
         | 6305 |  |  |                     error_at (DECL_SOURCE_LOCATION (parm),
 | 
      
         | 6306 |  |  |                               "parameter %u has incomplete type",
 | 
      
         | 6307 |  |  |                               parmno);
 | 
      
         | 6308 |  |  |  
 | 
      
         | 6309 |  |  |                   TREE_VALUE (typelt) = error_mark_node;
 | 
      
         | 6310 |  |  |                   TREE_TYPE (parm) = error_mark_node;
 | 
      
         | 6311 |  |  |                   arg_types = NULL_TREE;
 | 
      
         | 6312 |  |  |                 }
 | 
      
         | 6313 |  |  |               else if (VOID_TYPE_P (type))
 | 
      
         | 6314 |  |  |                 {
 | 
      
         | 6315 |  |  |                   if (DECL_NAME (parm))
 | 
      
         | 6316 |  |  |                     warning_at (input_location, 0,
 | 
      
         | 6317 |  |  |                                 "parameter %u (%q+D) has void type",
 | 
      
         | 6318 |  |  |                                 parmno, parm);
 | 
      
         | 6319 |  |  |                   else
 | 
      
         | 6320 |  |  |                     warning_at (DECL_SOURCE_LOCATION (parm), 0,
 | 
      
         | 6321 |  |  |                                 "parameter %u has void type",
 | 
      
         | 6322 |  |  |                                 parmno);
 | 
      
         | 6323 |  |  |                 }
 | 
      
         | 6324 |  |  |             }
 | 
      
         | 6325 |  |  |  
 | 
      
         | 6326 |  |  |           errmsg = targetm.invalid_parameter_type (type);
 | 
      
         | 6327 |  |  |           if (errmsg)
 | 
      
         | 6328 |  |  |             {
 | 
      
         | 6329 |  |  |               error (errmsg);
 | 
      
         | 6330 |  |  |               TREE_VALUE (typelt) = error_mark_node;
 | 
      
         | 6331 |  |  |               TREE_TYPE (parm) = error_mark_node;
 | 
      
         | 6332 |  |  |               arg_types = NULL_TREE;
 | 
      
         | 6333 |  |  |             }
 | 
      
         | 6334 |  |  |  
 | 
      
         | 6335 |  |  |           if (DECL_NAME (parm) && TREE_USED (parm))
 | 
      
         | 6336 |  |  |             warn_if_shadowing (parm);
 | 
      
         | 6337 |  |  |         }
 | 
      
         | 6338 |  |  |       return arg_types;
 | 
      
         | 6339 |  |  |     }
 | 
      
         | 6340 |  |  | }
 | 
      
         | 6341 |  |  |  
 | 
      
         | 6342 |  |  | /* Allocate and initialize a c_arg_info structure from the parser's
 | 
      
         | 6343 |  |  |    obstack.  */
 | 
      
         | 6344 |  |  |  
 | 
      
         | 6345 |  |  | struct c_arg_info *
 | 
      
         | 6346 |  |  | build_arg_info (void)
 | 
      
         | 6347 |  |  | {
 | 
      
         | 6348 |  |  |   struct c_arg_info *ret = XOBNEW (&parser_obstack, struct c_arg_info);
 | 
      
         | 6349 |  |  |   ret->parms = NULL_TREE;
 | 
      
         | 6350 |  |  |   ret->tags = NULL;
 | 
      
         | 6351 |  |  |   ret->types = NULL_TREE;
 | 
      
         | 6352 |  |  |   ret->others = NULL_TREE;
 | 
      
         | 6353 |  |  |   ret->pending_sizes = NULL;
 | 
      
         | 6354 |  |  |   ret->had_vla_unspec = 0;
 | 
      
         | 6355 |  |  |   return ret;
 | 
      
         | 6356 |  |  | }
 | 
      
         | 6357 |  |  |  
 | 
      
         | 6358 |  |  | /* Take apart the current scope and return a c_arg_info structure with
 | 
      
         | 6359 |  |  |    info on a parameter list just parsed.
 | 
      
         | 6360 |  |  |  
 | 
      
         | 6361 |  |  |    This structure is later fed to 'grokparms' and 'store_parm_decls'.
 | 
      
         | 6362 |  |  |  
 | 
      
         | 6363 |  |  |    ELLIPSIS being true means the argument list ended in '...' so don't
 | 
      
         | 6364 |  |  |    append a sentinel (void_list_node) to the end of the type-list.
 | 
      
         | 6365 |  |  |  
 | 
      
         | 6366 |  |  |    EXPR is NULL or an expression that needs to be evaluated for the
 | 
      
         | 6367 |  |  |    side effects of array size expressions in the parameters.  */
 | 
      
         | 6368 |  |  |  
 | 
      
         | 6369 |  |  | struct c_arg_info *
 | 
      
         | 6370 |  |  | get_parm_info (bool ellipsis, tree expr)
 | 
      
         | 6371 |  |  | {
 | 
      
         | 6372 |  |  |   struct c_binding *b = current_scope->bindings;
 | 
      
         | 6373 |  |  |   struct c_arg_info *arg_info = build_arg_info ();
 | 
      
         | 6374 |  |  |  
 | 
      
         | 6375 |  |  |   tree parms    = 0;
 | 
      
         | 6376 |  |  |   VEC(c_arg_tag,gc) *tags = NULL;
 | 
      
         | 6377 |  |  |   tree types    = 0;
 | 
      
         | 6378 |  |  |   tree others   = 0;
 | 
      
         | 6379 |  |  |  
 | 
      
         | 6380 |  |  |   static bool explained_incomplete_types = false;
 | 
      
         | 6381 |  |  |   bool gave_void_only_once_err = false;
 | 
      
         | 6382 |  |  |  
 | 
      
         | 6383 |  |  |   arg_info->had_vla_unspec = current_scope->had_vla_unspec;
 | 
      
         | 6384 |  |  |  
 | 
      
         | 6385 |  |  |   /* The bindings in this scope must not get put into a block.
 | 
      
         | 6386 |  |  |      We will take care of deleting the binding nodes.  */
 | 
      
         | 6387 |  |  |   current_scope->bindings = 0;
 | 
      
         | 6388 |  |  |  
 | 
      
         | 6389 |  |  |   /* This function is only called if there was *something* on the
 | 
      
         | 6390 |  |  |      parameter list.  */
 | 
      
         | 6391 |  |  |   gcc_assert (b);
 | 
      
         | 6392 |  |  |  
 | 
      
         | 6393 |  |  |   /* A parameter list consisting solely of 'void' indicates that the
 | 
      
         | 6394 |  |  |      function takes no arguments.  But if the 'void' is qualified
 | 
      
         | 6395 |  |  |      (by 'const' or 'volatile'), or has a storage class specifier
 | 
      
         | 6396 |  |  |      ('register'), then the behavior is undefined; issue an error.
 | 
      
         | 6397 |  |  |      Typedefs for 'void' are OK (see DR#157).  */
 | 
      
         | 6398 |  |  |   if (b->prev == 0                           /* one binding */
 | 
      
         | 6399 |  |  |       && TREE_CODE (b->decl) == PARM_DECL   /* which is a parameter */
 | 
      
         | 6400 |  |  |       && !DECL_NAME (b->decl)               /* anonymous */
 | 
      
         | 6401 |  |  |       && VOID_TYPE_P (TREE_TYPE (b->decl))) /* of void type */
 | 
      
         | 6402 |  |  |     {
 | 
      
         | 6403 |  |  |       if (TREE_THIS_VOLATILE (b->decl)
 | 
      
         | 6404 |  |  |           || TREE_READONLY (b->decl)
 | 
      
         | 6405 |  |  |           || C_DECL_REGISTER (b->decl))
 | 
      
         | 6406 |  |  |         error ("%<void%> as only parameter may not be qualified");
 | 
      
         | 6407 |  |  |  
 | 
      
         | 6408 |  |  |       /* There cannot be an ellipsis.  */
 | 
      
         | 6409 |  |  |       if (ellipsis)
 | 
      
         | 6410 |  |  |         error ("%<void%> must be the only parameter");
 | 
      
         | 6411 |  |  |  
 | 
      
         | 6412 |  |  |       arg_info->types = void_list_node;
 | 
      
         | 6413 |  |  |       return arg_info;
 | 
      
         | 6414 |  |  |     }
 | 
      
         | 6415 |  |  |  
 | 
      
         | 6416 |  |  |   if (!ellipsis)
 | 
      
         | 6417 |  |  |     types = void_list_node;
 | 
      
         | 6418 |  |  |  
 | 
      
         | 6419 |  |  |   /* Break up the bindings list into parms, tags, types, and others;
 | 
      
         | 6420 |  |  |      apply sanity checks; purge the name-to-decl bindings.  */
 | 
      
         | 6421 |  |  |   while (b)
 | 
      
         | 6422 |  |  |     {
 | 
      
         | 6423 |  |  |       tree decl = b->decl;
 | 
      
         | 6424 |  |  |       tree type = TREE_TYPE (decl);
 | 
      
         | 6425 |  |  |       c_arg_tag *tag;
 | 
      
         | 6426 |  |  |       const char *keyword;
 | 
      
         | 6427 |  |  |  
 | 
      
         | 6428 |  |  |       switch (TREE_CODE (decl))
 | 
      
         | 6429 |  |  |         {
 | 
      
         | 6430 |  |  |         case PARM_DECL:
 | 
      
         | 6431 |  |  |           if (b->id)
 | 
      
         | 6432 |  |  |             {
 | 
      
         | 6433 |  |  |               gcc_assert (I_SYMBOL_BINDING (b->id) == b);
 | 
      
         | 6434 |  |  |               I_SYMBOL_BINDING (b->id) = b->shadowed;
 | 
      
         | 6435 |  |  |             }
 | 
      
         | 6436 |  |  |  
 | 
      
         | 6437 |  |  |           /* Check for forward decls that never got their actual decl.  */
 | 
      
         | 6438 |  |  |           if (TREE_ASM_WRITTEN (decl))
 | 
      
         | 6439 |  |  |             error ("parameter %q+D has just a forward declaration", decl);
 | 
      
         | 6440 |  |  |           /* Check for (..., void, ...) and issue an error.  */
 | 
      
         | 6441 |  |  |           else if (VOID_TYPE_P (type) && !DECL_NAME (decl))
 | 
      
         | 6442 |  |  |             {
 | 
      
         | 6443 |  |  |               if (!gave_void_only_once_err)
 | 
      
         | 6444 |  |  |                 {
 | 
      
         | 6445 |  |  |                   error ("%<void%> must be the only parameter");
 | 
      
         | 6446 |  |  |                   gave_void_only_once_err = true;
 | 
      
         | 6447 |  |  |                 }
 | 
      
         | 6448 |  |  |             }
 | 
      
         | 6449 |  |  |           else
 | 
      
         | 6450 |  |  |             {
 | 
      
         | 6451 |  |  |               /* Valid parameter, add it to the list.  */
 | 
      
         | 6452 |  |  |               DECL_CHAIN (decl) = parms;
 | 
      
         | 6453 |  |  |               parms = decl;
 | 
      
         | 6454 |  |  |  
 | 
      
         | 6455 |  |  |               /* Since there is a prototype, args are passed in their
 | 
      
         | 6456 |  |  |                  declared types.  The back end may override this later.  */
 | 
      
         | 6457 |  |  |               DECL_ARG_TYPE (decl) = type;
 | 
      
         | 6458 |  |  |               types = tree_cons (0, type, types);
 | 
      
         | 6459 |  |  |             }
 | 
      
         | 6460 |  |  |           break;
 | 
      
         | 6461 |  |  |  
 | 
      
         | 6462 |  |  |         case ENUMERAL_TYPE: keyword = "enum"; goto tag;
 | 
      
         | 6463 |  |  |         case UNION_TYPE:    keyword = "union"; goto tag;
 | 
      
         | 6464 |  |  |         case RECORD_TYPE:   keyword = "struct"; goto tag;
 | 
      
         | 6465 |  |  |         tag:
 | 
      
         | 6466 |  |  |           /* Types may not have tag-names, in which case the type
 | 
      
         | 6467 |  |  |              appears in the bindings list with b->id NULL.  */
 | 
      
         | 6468 |  |  |           if (b->id)
 | 
      
         | 6469 |  |  |             {
 | 
      
         | 6470 |  |  |               gcc_assert (I_TAG_BINDING (b->id) == b);
 | 
      
         | 6471 |  |  |               I_TAG_BINDING (b->id) = b->shadowed;
 | 
      
         | 6472 |  |  |             }
 | 
      
         | 6473 |  |  |  
 | 
      
         | 6474 |  |  |           /* Warn about any struct, union or enum tags defined in a
 | 
      
         | 6475 |  |  |              parameter list.  The scope of such types is limited to
 | 
      
         | 6476 |  |  |              the parameter list, which is rarely if ever desirable
 | 
      
         | 6477 |  |  |              (it's impossible to call such a function with type-
 | 
      
         | 6478 |  |  |              correct arguments).  An anonymous union parm type is
 | 
      
         | 6479 |  |  |              meaningful as a GNU extension, so don't warn for that.  */
 | 
      
         | 6480 |  |  |           if (TREE_CODE (decl) != UNION_TYPE || b->id != 0)
 | 
      
         | 6481 |  |  |             {
 | 
      
         | 6482 |  |  |               if (b->id)
 | 
      
         | 6483 |  |  |                 /* The %s will be one of 'struct', 'union', or 'enum'.  */
 | 
      
         | 6484 |  |  |                 warning (0, "%<%s %E%> declared inside parameter list",
 | 
      
         | 6485 |  |  |                          keyword, b->id);
 | 
      
         | 6486 |  |  |               else
 | 
      
         | 6487 |  |  |                 /* The %s will be one of 'struct', 'union', or 'enum'.  */
 | 
      
         | 6488 |  |  |                 warning (0, "anonymous %s declared inside parameter list",
 | 
      
         | 6489 |  |  |                          keyword);
 | 
      
         | 6490 |  |  |  
 | 
      
         | 6491 |  |  |               if (!explained_incomplete_types)
 | 
      
         | 6492 |  |  |                 {
 | 
      
         | 6493 |  |  |                   warning (0, "its scope is only this definition or declaration,"
 | 
      
         | 6494 |  |  |                            " which is probably not what you want");
 | 
      
         | 6495 |  |  |                   explained_incomplete_types = true;
 | 
      
         | 6496 |  |  |                 }
 | 
      
         | 6497 |  |  |             }
 | 
      
         | 6498 |  |  |  
 | 
      
         | 6499 |  |  |           tag = VEC_safe_push (c_arg_tag, gc, tags, NULL);
 | 
      
         | 6500 |  |  |           tag->id = b->id;
 | 
      
         | 6501 |  |  |           tag->type = decl;
 | 
      
         | 6502 |  |  |           break;
 | 
      
         | 6503 |  |  |  
 | 
      
         | 6504 |  |  |         case CONST_DECL:
 | 
      
         | 6505 |  |  |         case TYPE_DECL:
 | 
      
         | 6506 |  |  |         case FUNCTION_DECL:
 | 
      
         | 6507 |  |  |           /* CONST_DECLs appear here when we have an embedded enum,
 | 
      
         | 6508 |  |  |              and TYPE_DECLs appear here when we have an embedded struct
 | 
      
         | 6509 |  |  |              or union.  No warnings for this - we already warned about the
 | 
      
         | 6510 |  |  |              type itself.  FUNCTION_DECLs appear when there is an implicit
 | 
      
         | 6511 |  |  |              function declaration in the parameter list.  */
 | 
      
         | 6512 |  |  |  
 | 
      
         | 6513 |  |  |           /* When we reinsert this decl in the function body, we need
 | 
      
         | 6514 |  |  |              to reconstruct whether it was marked as nested.  */
 | 
      
         | 6515 |  |  |           gcc_assert (TREE_CODE (decl) == FUNCTION_DECL
 | 
      
         | 6516 |  |  |                       ? b->nested
 | 
      
         | 6517 |  |  |                       : !b->nested);
 | 
      
         | 6518 |  |  |           DECL_CHAIN (decl) = others;
 | 
      
         | 6519 |  |  |           others = decl;
 | 
      
         | 6520 |  |  |           /* fall through */
 | 
      
         | 6521 |  |  |  
 | 
      
         | 6522 |  |  |         case ERROR_MARK:
 | 
      
         | 6523 |  |  |           /* error_mark_node appears here when we have an undeclared
 | 
      
         | 6524 |  |  |              variable.  Just throw it away.  */
 | 
      
         | 6525 |  |  |           if (b->id)
 | 
      
         | 6526 |  |  |             {
 | 
      
         | 6527 |  |  |               gcc_assert (I_SYMBOL_BINDING (b->id) == b);
 | 
      
         | 6528 |  |  |               I_SYMBOL_BINDING (b->id) = b->shadowed;
 | 
      
         | 6529 |  |  |             }
 | 
      
         | 6530 |  |  |           break;
 | 
      
         | 6531 |  |  |  
 | 
      
         | 6532 |  |  |           /* Other things that might be encountered.  */
 | 
      
         | 6533 |  |  |         case LABEL_DECL:
 | 
      
         | 6534 |  |  |         case VAR_DECL:
 | 
      
         | 6535 |  |  |         default:
 | 
      
         | 6536 |  |  |           gcc_unreachable ();
 | 
      
         | 6537 |  |  |         }
 | 
      
         | 6538 |  |  |  
 | 
      
         | 6539 |  |  |       b = free_binding_and_advance (b);
 | 
      
         | 6540 |  |  |     }
 | 
      
         | 6541 |  |  |  
 | 
      
         | 6542 |  |  |   arg_info->parms = parms;
 | 
      
         | 6543 |  |  |   arg_info->tags = tags;
 | 
      
         | 6544 |  |  |   arg_info->types = types;
 | 
      
         | 6545 |  |  |   arg_info->others = others;
 | 
      
         | 6546 |  |  |   arg_info->pending_sizes = expr;
 | 
      
         | 6547 |  |  |   return arg_info;
 | 
      
         | 6548 |  |  | }
 | 
      
         | 6549 |  |  |  
 | 
      
         | 6550 |  |  | /* Get the struct, enum or union (CODE says which) with tag NAME.
 | 
      
         | 6551 |  |  |    Define the tag as a forward-reference with location LOC if it is
 | 
      
         | 6552 |  |  |    not defined.  Return a c_typespec structure for the type
 | 
      
         | 6553 |  |  |    specifier.  */
 | 
      
         | 6554 |  |  |  
 | 
      
         | 6555 |  |  | struct c_typespec
 | 
      
         | 6556 |  |  | parser_xref_tag (location_t loc, enum tree_code code, tree name)
 | 
      
         | 6557 |  |  | {
 | 
      
         | 6558 |  |  |   struct c_typespec ret;
 | 
      
         | 6559 |  |  |   tree ref;
 | 
      
         | 6560 |  |  |   location_t refloc;
 | 
      
         | 6561 |  |  |  
 | 
      
         | 6562 |  |  |   ret.expr = NULL_TREE;
 | 
      
         | 6563 |  |  |   ret.expr_const_operands = true;
 | 
      
         | 6564 |  |  |  
 | 
      
         | 6565 |  |  |   /* If a cross reference is requested, look up the type
 | 
      
         | 6566 |  |  |      already defined for this tag and return it.  */
 | 
      
         | 6567 |  |  |  
 | 
      
         | 6568 |  |  |   ref = lookup_tag (code, name, 0, &refloc);
 | 
      
         | 6569 |  |  |   /* If this is the right type of tag, return what we found.
 | 
      
         | 6570 |  |  |      (This reference will be shadowed by shadow_tag later if appropriate.)
 | 
      
         | 6571 |  |  |      If this is the wrong type of tag, do not return it.  If it was the
 | 
      
         | 6572 |  |  |      wrong type in the same scope, we will have had an error
 | 
      
         | 6573 |  |  |      message already; if in a different scope and declaring
 | 
      
         | 6574 |  |  |      a name, pending_xref_error will give an error message; but if in a
 | 
      
         | 6575 |  |  |      different scope and not declaring a name, this tag should
 | 
      
         | 6576 |  |  |      shadow the previous declaration of a different type of tag, and
 | 
      
         | 6577 |  |  |      this would not work properly if we return the reference found.
 | 
      
         | 6578 |  |  |      (For example, with "struct foo" in an outer scope, "union foo;"
 | 
      
         | 6579 |  |  |      must shadow that tag with a new one of union type.)  */
 | 
      
         | 6580 |  |  |   ret.kind = (ref ? ctsk_tagref : ctsk_tagfirstref);
 | 
      
         | 6581 |  |  |   if (ref && TREE_CODE (ref) == code)
 | 
      
         | 6582 |  |  |     {
 | 
      
         | 6583 |  |  |       if (C_TYPE_DEFINED_IN_STRUCT (ref)
 | 
      
         | 6584 |  |  |           && loc != UNKNOWN_LOCATION
 | 
      
         | 6585 |  |  |           && warn_cxx_compat)
 | 
      
         | 6586 |  |  |         {
 | 
      
         | 6587 |  |  |           switch (code)
 | 
      
         | 6588 |  |  |             {
 | 
      
         | 6589 |  |  |             case ENUMERAL_TYPE:
 | 
      
         | 6590 |  |  |               warning_at (loc, OPT_Wc___compat,
 | 
      
         | 6591 |  |  |                           ("enum type defined in struct or union "
 | 
      
         | 6592 |  |  |                            "is not visible in C++"));
 | 
      
         | 6593 |  |  |               inform (refloc, "enum type defined here");
 | 
      
         | 6594 |  |  |               break;
 | 
      
         | 6595 |  |  |             case RECORD_TYPE:
 | 
      
         | 6596 |  |  |               warning_at (loc, OPT_Wc___compat,
 | 
      
         | 6597 |  |  |                           ("struct defined in struct or union "
 | 
      
         | 6598 |  |  |                            "is not visible in C++"));
 | 
      
         | 6599 |  |  |               inform (refloc, "struct defined here");
 | 
      
         | 6600 |  |  |               break;
 | 
      
         | 6601 |  |  |             case UNION_TYPE:
 | 
      
         | 6602 |  |  |               warning_at (loc, OPT_Wc___compat,
 | 
      
         | 6603 |  |  |                           ("union defined in struct or union "
 | 
      
         | 6604 |  |  |                            "is not visible in C++"));
 | 
      
         | 6605 |  |  |               inform (refloc, "union defined here");
 | 
      
         | 6606 |  |  |               break;
 | 
      
         | 6607 |  |  |             default:
 | 
      
         | 6608 |  |  |               gcc_unreachable();
 | 
      
         | 6609 |  |  |             }
 | 
      
         | 6610 |  |  |         }
 | 
      
         | 6611 |  |  |  
 | 
      
         | 6612 |  |  |       ret.spec = ref;
 | 
      
         | 6613 |  |  |       return ret;
 | 
      
         | 6614 |  |  |     }
 | 
      
         | 6615 |  |  |  
 | 
      
         | 6616 |  |  |   /* If no such tag is yet defined, create a forward-reference node
 | 
      
         | 6617 |  |  |      and record it as the "definition".
 | 
      
         | 6618 |  |  |      When a real declaration of this type is found,
 | 
      
         | 6619 |  |  |      the forward-reference will be altered into a real type.  */
 | 
      
         | 6620 |  |  |  
 | 
      
         | 6621 |  |  |   ref = make_node (code);
 | 
      
         | 6622 |  |  |   if (code == ENUMERAL_TYPE)
 | 
      
         | 6623 |  |  |     {
 | 
      
         | 6624 |  |  |       /* Give the type a default layout like unsigned int
 | 
      
         | 6625 |  |  |          to avoid crashing if it does not get defined.  */
 | 
      
         | 6626 |  |  |       SET_TYPE_MODE (ref, TYPE_MODE (unsigned_type_node));
 | 
      
         | 6627 |  |  |       TYPE_ALIGN (ref) = TYPE_ALIGN (unsigned_type_node);
 | 
      
         | 6628 |  |  |       TYPE_USER_ALIGN (ref) = 0;
 | 
      
         | 6629 |  |  |       TYPE_UNSIGNED (ref) = 1;
 | 
      
         | 6630 |  |  |       TYPE_PRECISION (ref) = TYPE_PRECISION (unsigned_type_node);
 | 
      
         | 6631 |  |  |       TYPE_MIN_VALUE (ref) = TYPE_MIN_VALUE (unsigned_type_node);
 | 
      
         | 6632 |  |  |       TYPE_MAX_VALUE (ref) = TYPE_MAX_VALUE (unsigned_type_node);
 | 
      
         | 6633 |  |  |     }
 | 
      
         | 6634 |  |  |  
 | 
      
         | 6635 |  |  |   pushtag (loc, name, ref);
 | 
      
         | 6636 |  |  |  
 | 
      
         | 6637 |  |  |   ret.spec = ref;
 | 
      
         | 6638 |  |  |   return ret;
 | 
      
         | 6639 |  |  | }
 | 
      
         | 6640 |  |  |  
 | 
      
         | 6641 |  |  | /* Get the struct, enum or union (CODE says which) with tag NAME.
 | 
      
         | 6642 |  |  |    Define the tag as a forward-reference if it is not defined.
 | 
      
         | 6643 |  |  |    Return a tree for the type.  */
 | 
      
         | 6644 |  |  |  
 | 
      
         | 6645 |  |  | tree
 | 
      
         | 6646 |  |  | xref_tag (enum tree_code code, tree name)
 | 
      
         | 6647 |  |  | {
 | 
      
         | 6648 |  |  |   return parser_xref_tag (input_location, code, name).spec;
 | 
      
         | 6649 |  |  | }
 | 
      
         | 6650 |  |  |  
 | 
      
         | 6651 |  |  | /* Make sure that the tag NAME is defined *in the current scope*
 | 
      
         | 6652 |  |  |    at least as a forward reference.
 | 
      
         | 6653 |  |  |    LOC is the location of the struct's definition.
 | 
      
         | 6654 |  |  |    CODE says which kind of tag NAME ought to be.
 | 
      
         | 6655 |  |  |  
 | 
      
         | 6656 |  |  |    This stores the current value of the file static STRUCT_PARSE_INFO
 | 
      
         | 6657 |  |  |    in *ENCLOSING_STRUCT_PARSE_INFO, and points STRUCT_PARSE_INFO at a
 | 
      
         | 6658 |  |  |    new c_struct_parse_info structure.  The old value of
 | 
      
         | 6659 |  |  |    STRUCT_PARSE_INFO is restored in finish_struct.  */
 | 
      
         | 6660 |  |  |  
 | 
      
         | 6661 |  |  | tree
 | 
      
         | 6662 |  |  | start_struct (location_t loc, enum tree_code code, tree name,
 | 
      
         | 6663 |  |  |               struct c_struct_parse_info **enclosing_struct_parse_info)
 | 
      
         | 6664 |  |  | {
 | 
      
         | 6665 |  |  |   /* If there is already a tag defined at this scope
 | 
      
         | 6666 |  |  |      (as a forward reference), just return it.  */
 | 
      
         | 6667 |  |  |  
 | 
      
         | 6668 |  |  |   tree ref = NULL_TREE;
 | 
      
         | 6669 |  |  |   location_t refloc = UNKNOWN_LOCATION;
 | 
      
         | 6670 |  |  |  
 | 
      
         | 6671 |  |  |   if (name != NULL_TREE)
 | 
      
         | 6672 |  |  |     ref = lookup_tag (code, name, 1, &refloc);
 | 
      
         | 6673 |  |  |   if (ref && TREE_CODE (ref) == code)
 | 
      
         | 6674 |  |  |     {
 | 
      
         | 6675 |  |  |       if (TYPE_SIZE (ref))
 | 
      
         | 6676 |  |  |         {
 | 
      
         | 6677 |  |  |           if (code == UNION_TYPE)
 | 
      
         | 6678 |  |  |             error_at (loc, "redefinition of %<union %E%>", name);
 | 
      
         | 6679 |  |  |           else
 | 
      
         | 6680 |  |  |             error_at (loc, "redefinition of %<struct %E%>", name);
 | 
      
         | 6681 |  |  |           if (refloc != UNKNOWN_LOCATION)
 | 
      
         | 6682 |  |  |             inform (refloc, "originally defined here");
 | 
      
         | 6683 |  |  |           /* Don't create structures using a name already in use.  */
 | 
      
         | 6684 |  |  |           ref = NULL_TREE;
 | 
      
         | 6685 |  |  |         }
 | 
      
         | 6686 |  |  |       else if (C_TYPE_BEING_DEFINED (ref))
 | 
      
         | 6687 |  |  |         {
 | 
      
         | 6688 |  |  |           if (code == UNION_TYPE)
 | 
      
         | 6689 |  |  |             error_at (loc, "nested redefinition of %<union %E%>", name);
 | 
      
         | 6690 |  |  |           else
 | 
      
         | 6691 |  |  |             error_at (loc, "nested redefinition of %<struct %E%>", name);
 | 
      
         | 6692 |  |  |           /* Don't bother to report "originally defined here" for a
 | 
      
         | 6693 |  |  |              nested redefinition; the original definition should be
 | 
      
         | 6694 |  |  |              obvious.  */
 | 
      
         | 6695 |  |  |           /* Don't create structures that contain themselves.  */
 | 
      
         | 6696 |  |  |           ref = NULL_TREE;
 | 
      
         | 6697 |  |  |         }
 | 
      
         | 6698 |  |  |     }
 | 
      
         | 6699 |  |  |  
 | 
      
         | 6700 |  |  |   /* Otherwise create a forward-reference just so the tag is in scope.  */
 | 
      
         | 6701 |  |  |  
 | 
      
         | 6702 |  |  |   if (ref == NULL_TREE || TREE_CODE (ref) != code)
 | 
      
         | 6703 |  |  |     {
 | 
      
         | 6704 |  |  |       ref = make_node (code);
 | 
      
         | 6705 |  |  |       pushtag (loc, name, ref);
 | 
      
         | 6706 |  |  |     }
 | 
      
         | 6707 |  |  |  
 | 
      
         | 6708 |  |  |   C_TYPE_BEING_DEFINED (ref) = 1;
 | 
      
         | 6709 |  |  |   TYPE_PACKED (ref) = flag_pack_struct;
 | 
      
         | 6710 |  |  |  
 | 
      
         | 6711 |  |  |   *enclosing_struct_parse_info = struct_parse_info;
 | 
      
         | 6712 |  |  |   struct_parse_info = XNEW (struct c_struct_parse_info);
 | 
      
         | 6713 |  |  |   struct_parse_info->struct_types = VEC_alloc (tree, heap, 0);
 | 
      
         | 6714 |  |  |   struct_parse_info->fields = VEC_alloc (c_binding_ptr, heap, 0);
 | 
      
         | 6715 |  |  |   struct_parse_info->typedefs_seen = VEC_alloc (tree, heap, 0);
 | 
      
         | 6716 |  |  |  
 | 
      
         | 6717 |  |  |   /* FIXME: This will issue a warning for a use of a type defined
 | 
      
         | 6718 |  |  |      within a statement expr used within sizeof, et. al.  This is not
 | 
      
         | 6719 |  |  |      terribly serious as C++ doesn't permit statement exprs within
 | 
      
         | 6720 |  |  |      sizeof anyhow.  */
 | 
      
         | 6721 |  |  |   if (warn_cxx_compat && (in_sizeof || in_typeof || in_alignof))
 | 
      
         | 6722 |  |  |     warning_at (loc, OPT_Wc___compat,
 | 
      
         | 6723 |  |  |                 "defining type in %qs expression is invalid in C++",
 | 
      
         | 6724 |  |  |                 (in_sizeof
 | 
      
         | 6725 |  |  |                  ? "sizeof"
 | 
      
         | 6726 |  |  |                  : (in_typeof ? "typeof" : "alignof")));
 | 
      
         | 6727 |  |  |  
 | 
      
         | 6728 |  |  |   return ref;
 | 
      
         | 6729 |  |  | }
 | 
      
         | 6730 |  |  |  
 | 
      
         | 6731 |  |  | /* Process the specs, declarator and width (NULL if omitted)
 | 
      
         | 6732 |  |  |    of a structure component, returning a FIELD_DECL node.
 | 
      
         | 6733 |  |  |    WIDTH is non-NULL for bit-fields only, and is an INTEGER_CST node.
 | 
      
         | 6734 |  |  |    DECL_ATTRS is as for grokdeclarator.
 | 
      
         | 6735 |  |  |  
 | 
      
         | 6736 |  |  |    LOC is the location of the structure component.
 | 
      
         | 6737 |  |  |  
 | 
      
         | 6738 |  |  |    This is done during the parsing of the struct declaration.
 | 
      
         | 6739 |  |  |    The FIELD_DECL nodes are chained together and the lot of them
 | 
      
         | 6740 |  |  |    are ultimately passed to `build_struct' to make the RECORD_TYPE node.  */
 | 
      
         | 6741 |  |  |  
 | 
      
         | 6742 |  |  | tree
 | 
      
         | 6743 |  |  | grokfield (location_t loc,
 | 
      
         | 6744 |  |  |            struct c_declarator *declarator, struct c_declspecs *declspecs,
 | 
      
         | 6745 |  |  |            tree width, tree *decl_attrs)
 | 
      
         | 6746 |  |  | {
 | 
      
         | 6747 |  |  |   tree value;
 | 
      
         | 6748 |  |  |  
 | 
      
         | 6749 |  |  |   if (declarator->kind == cdk_id && declarator->u.id == NULL_TREE
 | 
      
         | 6750 |  |  |       && width == NULL_TREE)
 | 
      
         | 6751 |  |  |     {
 | 
      
         | 6752 |  |  |       /* This is an unnamed decl.
 | 
      
         | 6753 |  |  |  
 | 
      
         | 6754 |  |  |          If we have something of the form "union { list } ;" then this
 | 
      
         | 6755 |  |  |          is the anonymous union extension.  Similarly for struct.
 | 
      
         | 6756 |  |  |  
 | 
      
         | 6757 |  |  |          If this is something of the form "struct foo;", then
 | 
      
         | 6758 |  |  |            If MS or Plan 9 extensions are enabled, this is handled as
 | 
      
         | 6759 |  |  |              an anonymous struct.
 | 
      
         | 6760 |  |  |            Otherwise this is a forward declaration of a structure tag.
 | 
      
         | 6761 |  |  |  
 | 
      
         | 6762 |  |  |          If this is something of the form "foo;" and foo is a TYPE_DECL, then
 | 
      
         | 6763 |  |  |            If foo names a structure or union without a tag, then this
 | 
      
         | 6764 |  |  |              is an anonymous struct (this is permitted by C11).
 | 
      
         | 6765 |  |  |            If MS or Plan 9 extensions are enabled and foo names a
 | 
      
         | 6766 |  |  |              structure, then again this is an anonymous struct.
 | 
      
         | 6767 |  |  |            Otherwise this is an error.
 | 
      
         | 6768 |  |  |  
 | 
      
         | 6769 |  |  |          Oh what a horrid tangled web we weave.  I wonder if MS consciously
 | 
      
         | 6770 |  |  |          took this from Plan 9 or if it was an accident of implementation
 | 
      
         | 6771 |  |  |          that took root before someone noticed the bug...  */
 | 
      
         | 6772 |  |  |  
 | 
      
         | 6773 |  |  |       tree type = declspecs->type;
 | 
      
         | 6774 |  |  |       bool type_ok = (TREE_CODE (type) == RECORD_TYPE
 | 
      
         | 6775 |  |  |                       || TREE_CODE (type) == UNION_TYPE);
 | 
      
         | 6776 |  |  |       bool ok = false;
 | 
      
         | 6777 |  |  |  
 | 
      
         | 6778 |  |  |       if (type_ok
 | 
      
         | 6779 |  |  |           && (flag_ms_extensions
 | 
      
         | 6780 |  |  |               || flag_plan9_extensions
 | 
      
         | 6781 |  |  |               || !declspecs->typedef_p))
 | 
      
         | 6782 |  |  |         {
 | 
      
         | 6783 |  |  |           if (flag_ms_extensions || flag_plan9_extensions)
 | 
      
         | 6784 |  |  |             ok = true;
 | 
      
         | 6785 |  |  |           else if (TYPE_NAME (type) == NULL)
 | 
      
         | 6786 |  |  |             ok = true;
 | 
      
         | 6787 |  |  |           else
 | 
      
         | 6788 |  |  |             ok = false;
 | 
      
         | 6789 |  |  |         }
 | 
      
         | 6790 |  |  |       if (!ok)
 | 
      
         | 6791 |  |  |         {
 | 
      
         | 6792 |  |  |           pedwarn (loc, 0, "declaration does not declare anything");
 | 
      
         | 6793 |  |  |           return NULL_TREE;
 | 
      
         | 6794 |  |  |         }
 | 
      
         | 6795 |  |  |       if (!flag_isoc11)
 | 
      
         | 6796 |  |  |         {
 | 
      
         | 6797 |  |  |           if (flag_isoc99)
 | 
      
         | 6798 |  |  |             pedwarn (loc, OPT_pedantic,
 | 
      
         | 6799 |  |  |                      "ISO C99 doesn%'t support unnamed structs/unions");
 | 
      
         | 6800 |  |  |           else
 | 
      
         | 6801 |  |  |             pedwarn (loc, OPT_pedantic,
 | 
      
         | 6802 |  |  |                      "ISO C90 doesn%'t support unnamed structs/unions");
 | 
      
         | 6803 |  |  |         }
 | 
      
         | 6804 |  |  |     }
 | 
      
         | 6805 |  |  |  
 | 
      
         | 6806 |  |  |   value = grokdeclarator (declarator, declspecs, FIELD, false,
 | 
      
         | 6807 |  |  |                           width ? &width : NULL, decl_attrs, NULL, NULL,
 | 
      
         | 6808 |  |  |                           DEPRECATED_NORMAL);
 | 
      
         | 6809 |  |  |  
 | 
      
         | 6810 |  |  |   finish_decl (value, loc, NULL_TREE, NULL_TREE, NULL_TREE);
 | 
      
         | 6811 |  |  |   DECL_INITIAL (value) = width;
 | 
      
         | 6812 |  |  |  
 | 
      
         | 6813 |  |  |   if (warn_cxx_compat && DECL_NAME (value) != NULL_TREE)
 | 
      
         | 6814 |  |  |     {
 | 
      
         | 6815 |  |  |       /* If we currently have a binding for this field, set the
 | 
      
         | 6816 |  |  |          in_struct field in the binding, so that we warn about lookups
 | 
      
         | 6817 |  |  |          which find it.  */
 | 
      
         | 6818 |  |  |       struct c_binding *b = I_SYMBOL_BINDING (DECL_NAME (value));
 | 
      
         | 6819 |  |  |       if (b != NULL)
 | 
      
         | 6820 |  |  |         {
 | 
      
         | 6821 |  |  |           /* If the in_struct field is not yet set, push it on a list
 | 
      
         | 6822 |  |  |              to be cleared when this struct is finished.  */
 | 
      
         | 6823 |  |  |           if (!b->in_struct)
 | 
      
         | 6824 |  |  |             {
 | 
      
         | 6825 |  |  |               VEC_safe_push (c_binding_ptr, heap,
 | 
      
         | 6826 |  |  |                              struct_parse_info->fields, b);
 | 
      
         | 6827 |  |  |               b->in_struct = 1;
 | 
      
         | 6828 |  |  |             }
 | 
      
         | 6829 |  |  |         }
 | 
      
         | 6830 |  |  |     }
 | 
      
         | 6831 |  |  |  
 | 
      
         | 6832 |  |  |   return value;
 | 
      
         | 6833 |  |  | }
 | 
      
         | 6834 |  |  |  
 | 
      
         | 6835 |  |  | /* Subroutine of detect_field_duplicates: return whether X and Y,
 | 
      
         | 6836 |  |  |    which are both fields in the same struct, have duplicate field
 | 
      
         | 6837 |  |  |    names.  */
 | 
      
         | 6838 |  |  |  
 | 
      
         | 6839 |  |  | static bool
 | 
      
         | 6840 |  |  | is_duplicate_field (tree x, tree y)
 | 
      
         | 6841 |  |  | {
 | 
      
         | 6842 |  |  |   if (DECL_NAME (x) != NULL_TREE && DECL_NAME (x) == DECL_NAME (y))
 | 
      
         | 6843 |  |  |     return true;
 | 
      
         | 6844 |  |  |  
 | 
      
         | 6845 |  |  |   /* When using -fplan9-extensions, an anonymous field whose name is a
 | 
      
         | 6846 |  |  |      typedef can duplicate a field name.  */
 | 
      
         | 6847 |  |  |   if (flag_plan9_extensions
 | 
      
         | 6848 |  |  |       && (DECL_NAME (x) == NULL_TREE || DECL_NAME (y) == NULL_TREE))
 | 
      
         | 6849 |  |  |     {
 | 
      
         | 6850 |  |  |       tree xt, xn, yt, yn;
 | 
      
         | 6851 |  |  |  
 | 
      
         | 6852 |  |  |       xt = TREE_TYPE (x);
 | 
      
         | 6853 |  |  |       if (DECL_NAME (x) != NULL_TREE)
 | 
      
         | 6854 |  |  |         xn = DECL_NAME (x);
 | 
      
         | 6855 |  |  |       else if ((TREE_CODE (xt) == RECORD_TYPE || TREE_CODE (xt) == UNION_TYPE)
 | 
      
         | 6856 |  |  |                && TYPE_NAME (xt) != NULL_TREE
 | 
      
         | 6857 |  |  |                && TREE_CODE (TYPE_NAME (xt)) == TYPE_DECL)
 | 
      
         | 6858 |  |  |         xn = DECL_NAME (TYPE_NAME (xt));
 | 
      
         | 6859 |  |  |       else
 | 
      
         | 6860 |  |  |         xn = NULL_TREE;
 | 
      
         | 6861 |  |  |  
 | 
      
         | 6862 |  |  |       yt = TREE_TYPE (y);
 | 
      
         | 6863 |  |  |       if (DECL_NAME (y) != NULL_TREE)
 | 
      
         | 6864 |  |  |         yn = DECL_NAME (y);
 | 
      
         | 6865 |  |  |       else if ((TREE_CODE (yt) == RECORD_TYPE || TREE_CODE (yt) == UNION_TYPE)
 | 
      
         | 6866 |  |  |                && TYPE_NAME (yt) != NULL_TREE
 | 
      
         | 6867 |  |  |                && TREE_CODE (TYPE_NAME (yt)) == TYPE_DECL)
 | 
      
         | 6868 |  |  |         yn = DECL_NAME (TYPE_NAME (yt));
 | 
      
         | 6869 |  |  |       else
 | 
      
         | 6870 |  |  |         yn = NULL_TREE;
 | 
      
         | 6871 |  |  |  
 | 
      
         | 6872 |  |  |       if (xn != NULL_TREE && xn == yn)
 | 
      
         | 6873 |  |  |         return true;
 | 
      
         | 6874 |  |  |     }
 | 
      
         | 6875 |  |  |  
 | 
      
         | 6876 |  |  |   return false;
 | 
      
         | 6877 |  |  | }
 | 
      
         | 6878 |  |  |  
 | 
      
         | 6879 |  |  | /* Subroutine of detect_field_duplicates: add the fields of FIELDLIST
 | 
      
         | 6880 |  |  |    to HTAB, giving errors for any duplicates.  */
 | 
      
         | 6881 |  |  |  
 | 
      
         | 6882 |  |  | static void
 | 
      
         | 6883 |  |  | detect_field_duplicates_hash (tree fieldlist, htab_t htab)
 | 
      
         | 6884 |  |  | {
 | 
      
         | 6885 |  |  |   tree x, y;
 | 
      
         | 6886 |  |  |   void **slot;
 | 
      
         | 6887 |  |  |  
 | 
      
         | 6888 |  |  |   for (x = fieldlist; x ; x = DECL_CHAIN (x))
 | 
      
         | 6889 |  |  |     if ((y = DECL_NAME (x)) != 0)
 | 
      
         | 6890 |  |  |       {
 | 
      
         | 6891 |  |  |         slot = htab_find_slot (htab, y, INSERT);
 | 
      
         | 6892 |  |  |         if (*slot)
 | 
      
         | 6893 |  |  |           {
 | 
      
         | 6894 |  |  |             error ("duplicate member %q+D", x);
 | 
      
         | 6895 |  |  |             DECL_NAME (x) = NULL_TREE;
 | 
      
         | 6896 |  |  |           }
 | 
      
         | 6897 |  |  |         *slot = y;
 | 
      
         | 6898 |  |  |       }
 | 
      
         | 6899 |  |  |     else if (TREE_CODE (TREE_TYPE (x)) == RECORD_TYPE
 | 
      
         | 6900 |  |  |              || TREE_CODE (TREE_TYPE (x)) == UNION_TYPE)
 | 
      
         | 6901 |  |  |       {
 | 
      
         | 6902 |  |  |         detect_field_duplicates_hash (TYPE_FIELDS (TREE_TYPE (x)), htab);
 | 
      
         | 6903 |  |  |  
 | 
      
         | 6904 |  |  |         /* When using -fplan9-extensions, an anonymous field whose
 | 
      
         | 6905 |  |  |            name is a typedef can duplicate a field name.  */
 | 
      
         | 6906 |  |  |         if (flag_plan9_extensions
 | 
      
         | 6907 |  |  |             && TYPE_NAME (TREE_TYPE (x)) != NULL_TREE
 | 
      
         | 6908 |  |  |             && TREE_CODE (TYPE_NAME (TREE_TYPE (x))) == TYPE_DECL)
 | 
      
         | 6909 |  |  |           {
 | 
      
         | 6910 |  |  |             tree xn = DECL_NAME (TYPE_NAME (TREE_TYPE (x)));
 | 
      
         | 6911 |  |  |             slot = htab_find_slot (htab, xn, INSERT);
 | 
      
         | 6912 |  |  |             if (*slot)
 | 
      
         | 6913 |  |  |               error ("duplicate member %q+D", TYPE_NAME (TREE_TYPE (x)));
 | 
      
         | 6914 |  |  |             *slot = xn;
 | 
      
         | 6915 |  |  |           }
 | 
      
         | 6916 |  |  |       }
 | 
      
         | 6917 |  |  | }
 | 
      
         | 6918 |  |  |  
 | 
      
         | 6919 |  |  | /* Generate an error for any duplicate field names in FIELDLIST.  Munge
 | 
      
         | 6920 |  |  |    the list such that this does not present a problem later.  */
 | 
      
         | 6921 |  |  |  
 | 
      
         | 6922 |  |  | static void
 | 
      
         | 6923 |  |  | detect_field_duplicates (tree fieldlist)
 | 
      
         | 6924 |  |  | {
 | 
      
         | 6925 |  |  |   tree x, y;
 | 
      
         | 6926 |  |  |   int timeout = 10;
 | 
      
         | 6927 |  |  |  
 | 
      
         | 6928 |  |  |   /* If the struct is the list of instance variables of an Objective-C
 | 
      
         | 6929 |  |  |      class, then we need to check all the instance variables of
 | 
      
         | 6930 |  |  |      superclasses when checking for duplicates (since you can't have
 | 
      
         | 6931 |  |  |      an instance variable in a subclass with the same name as an
 | 
      
         | 6932 |  |  |      instance variable in a superclass).  We pass on this job to the
 | 
      
         | 6933 |  |  |      Objective-C compiler.  objc_detect_field_duplicates() will return
 | 
      
         | 6934 |  |  |      false if we are not checking the list of instance variables and
 | 
      
         | 6935 |  |  |      the C frontend should proceed with the standard field duplicate
 | 
      
         | 6936 |  |  |      checks.  If we are checking the list of instance variables, the
 | 
      
         | 6937 |  |  |      ObjC frontend will do the check, emit the errors if needed, and
 | 
      
         | 6938 |  |  |      then return true.  */
 | 
      
         | 6939 |  |  |   if (c_dialect_objc ())
 | 
      
         | 6940 |  |  |     if (objc_detect_field_duplicates (false))
 | 
      
         | 6941 |  |  |       return;
 | 
      
         | 6942 |  |  |  
 | 
      
         | 6943 |  |  |   /* First, see if there are more than "a few" fields.
 | 
      
         | 6944 |  |  |      This is trivially true if there are zero or one fields.  */
 | 
      
         | 6945 |  |  |   if (!fieldlist || !DECL_CHAIN (fieldlist))
 | 
      
         | 6946 |  |  |     return;
 | 
      
         | 6947 |  |  |   x = fieldlist;
 | 
      
         | 6948 |  |  |   do {
 | 
      
         | 6949 |  |  |     timeout--;
 | 
      
         | 6950 |  |  |     if (DECL_NAME (x) == NULL_TREE
 | 
      
         | 6951 |  |  |         && (TREE_CODE (TREE_TYPE (x)) == RECORD_TYPE
 | 
      
         | 6952 |  |  |             || TREE_CODE (TREE_TYPE (x)) == UNION_TYPE))
 | 
      
         | 6953 |  |  |       timeout = 0;
 | 
      
         | 6954 |  |  |     x = DECL_CHAIN (x);
 | 
      
         | 6955 |  |  |   } while (timeout > 0 && x);
 | 
      
         | 6956 |  |  |  
 | 
      
         | 6957 |  |  |   /* If there were "few" fields and no anonymous structures or unions,
 | 
      
         | 6958 |  |  |      avoid the overhead of allocating a hash table.  Instead just do
 | 
      
         | 6959 |  |  |      the nested traversal thing.  */
 | 
      
         | 6960 |  |  |   if (timeout > 0)
 | 
      
         | 6961 |  |  |     {
 | 
      
         | 6962 |  |  |       for (x = DECL_CHAIN (fieldlist); x; x = DECL_CHAIN (x))
 | 
      
         | 6963 |  |  |         /* When using -fplan9-extensions, we can have duplicates
 | 
      
         | 6964 |  |  |            between typedef names and fields.  */
 | 
      
         | 6965 |  |  |         if (DECL_NAME (x)
 | 
      
         | 6966 |  |  |             || (flag_plan9_extensions
 | 
      
         | 6967 |  |  |                 && DECL_NAME (x) == NULL_TREE
 | 
      
         | 6968 |  |  |                 && (TREE_CODE (TREE_TYPE (x)) == RECORD_TYPE
 | 
      
         | 6969 |  |  |                     || TREE_CODE (TREE_TYPE (x)) == UNION_TYPE)
 | 
      
         | 6970 |  |  |                 && TYPE_NAME (TREE_TYPE (x)) != NULL_TREE
 | 
      
         | 6971 |  |  |                 && TREE_CODE (TYPE_NAME (TREE_TYPE (x))) == TYPE_DECL))
 | 
      
         | 6972 |  |  |           {
 | 
      
         | 6973 |  |  |             for (y = fieldlist; y != x; y = TREE_CHAIN (y))
 | 
      
         | 6974 |  |  |               if (is_duplicate_field (y, x))
 | 
      
         | 6975 |  |  |                 {
 | 
      
         | 6976 |  |  |                   error ("duplicate member %q+D", x);
 | 
      
         | 6977 |  |  |                   DECL_NAME (x) = NULL_TREE;
 | 
      
         | 6978 |  |  |                 }
 | 
      
         | 6979 |  |  |           }
 | 
      
         | 6980 |  |  |     }
 | 
      
         | 6981 |  |  |   else
 | 
      
         | 6982 |  |  |     {
 | 
      
         | 6983 |  |  |       htab_t htab = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
 | 
      
         | 6984 |  |  |  
 | 
      
         | 6985 |  |  |       detect_field_duplicates_hash (fieldlist, htab);
 | 
      
         | 6986 |  |  |       htab_delete (htab);
 | 
      
         | 6987 |  |  |     }
 | 
      
         | 6988 |  |  | }
 | 
      
         | 6989 |  |  |  
 | 
      
         | 6990 |  |  | /* Finish up struct info used by -Wc++-compat.  */
 | 
      
         | 6991 |  |  |  
 | 
      
         | 6992 |  |  | static void
 | 
      
         | 6993 |  |  | warn_cxx_compat_finish_struct (tree fieldlist)
 | 
      
         | 6994 |  |  | {
 | 
      
         | 6995 |  |  |   unsigned int ix;
 | 
      
         | 6996 |  |  |   tree x;
 | 
      
         | 6997 |  |  |   struct c_binding *b;
 | 
      
         | 6998 |  |  |  
 | 
      
         | 6999 |  |  |   /* Set the C_TYPE_DEFINED_IN_STRUCT flag for each type defined in
 | 
      
         | 7000 |  |  |      the current struct.  We do this now at the end of the struct
 | 
      
         | 7001 |  |  |      because the flag is used to issue visibility warnings, and we
 | 
      
         | 7002 |  |  |      only want to issue those warnings if the type is referenced
 | 
      
         | 7003 |  |  |      outside of the struct declaration.  */
 | 
      
         | 7004 |  |  |   FOR_EACH_VEC_ELT (tree, struct_parse_info->struct_types, ix, x)
 | 
      
         | 7005 |  |  |     C_TYPE_DEFINED_IN_STRUCT (x) = 1;
 | 
      
         | 7006 |  |  |  
 | 
      
         | 7007 |  |  |   /* The TYPEDEFS_SEEN field of STRUCT_PARSE_INFO is a list of
 | 
      
         | 7008 |  |  |      typedefs used when declaring fields in this struct.  If the name
 | 
      
         | 7009 |  |  |      of any of the fields is also a typedef name then the struct would
 | 
      
         | 7010 |  |  |      not parse in C++, because the C++ lookup rules say that the
 | 
      
         | 7011 |  |  |      typedef name would be looked up in the context of the struct, and
 | 
      
         | 7012 |  |  |      would thus be the field rather than the typedef.  */
 | 
      
         | 7013 |  |  |   if (!VEC_empty (tree, struct_parse_info->typedefs_seen)
 | 
      
         | 7014 |  |  |       && fieldlist != NULL_TREE)
 | 
      
         | 7015 |  |  |     {
 | 
      
         | 7016 |  |  |       /* Use a pointer_set using the name of the typedef.  We can use
 | 
      
         | 7017 |  |  |          a pointer_set because identifiers are interned.  */
 | 
      
         | 7018 |  |  |       struct pointer_set_t *tset = pointer_set_create ();
 | 
      
         | 7019 |  |  |  
 | 
      
         | 7020 |  |  |       FOR_EACH_VEC_ELT (tree, struct_parse_info->typedefs_seen, ix, x)
 | 
      
         | 7021 |  |  |         pointer_set_insert (tset, DECL_NAME (x));
 | 
      
         | 7022 |  |  |  
 | 
      
         | 7023 |  |  |       for (x = fieldlist; x != NULL_TREE; x = DECL_CHAIN (x))
 | 
      
         | 7024 |  |  |         {
 | 
      
         | 7025 |  |  |           if (DECL_NAME (x) != NULL_TREE
 | 
      
         | 7026 |  |  |               && pointer_set_contains (tset, DECL_NAME (x)))
 | 
      
         | 7027 |  |  |             {
 | 
      
         | 7028 |  |  |               warning_at (DECL_SOURCE_LOCATION (x), OPT_Wc___compat,
 | 
      
         | 7029 |  |  |                           ("using %qD as both field and typedef name is "
 | 
      
         | 7030 |  |  |                            "invalid in C++"),
 | 
      
         | 7031 |  |  |                           x);
 | 
      
         | 7032 |  |  |               /* FIXME: It would be nice to report the location where
 | 
      
         | 7033 |  |  |                  the typedef name is used.  */
 | 
      
         | 7034 |  |  |             }
 | 
      
         | 7035 |  |  |         }
 | 
      
         | 7036 |  |  |  
 | 
      
         | 7037 |  |  |       pointer_set_destroy (tset);
 | 
      
         | 7038 |  |  |     }
 | 
      
         | 7039 |  |  |  
 | 
      
         | 7040 |  |  |   /* For each field which has a binding and which was not defined in
 | 
      
         | 7041 |  |  |      an enclosing struct, clear the in_struct field.  */
 | 
      
         | 7042 |  |  |   FOR_EACH_VEC_ELT (c_binding_ptr, struct_parse_info->fields, ix, b)
 | 
      
         | 7043 |  |  |     b->in_struct = 0;
 | 
      
         | 7044 |  |  | }
 | 
      
         | 7045 |  |  |  
 | 
      
         | 7046 |  |  | /* Fill in the fields of a RECORD_TYPE or UNION_TYPE node, T.
 | 
      
         | 7047 |  |  |    LOC is the location of the RECORD_TYPE or UNION_TYPE's definition.
 | 
      
         | 7048 |  |  |    FIELDLIST is a chain of FIELD_DECL nodes for the fields.
 | 
      
         | 7049 |  |  |    ATTRIBUTES are attributes to be applied to the structure.
 | 
      
         | 7050 |  |  |  
 | 
      
         | 7051 |  |  |    ENCLOSING_STRUCT_PARSE_INFO is the value of STRUCT_PARSE_INFO when
 | 
      
         | 7052 |  |  |    the struct was started.  */
 | 
      
         | 7053 |  |  |  
 | 
      
         | 7054 |  |  | tree
 | 
      
         | 7055 |  |  | finish_struct (location_t loc, tree t, tree fieldlist, tree attributes,
 | 
      
         | 7056 |  |  |                struct c_struct_parse_info *enclosing_struct_parse_info)
 | 
      
         | 7057 |  |  | {
 | 
      
         | 7058 |  |  |   tree x;
 | 
      
         | 7059 |  |  |   bool toplevel = file_scope == current_scope;
 | 
      
         | 7060 |  |  |   int saw_named_field;
 | 
      
         | 7061 |  |  |  
 | 
      
         | 7062 |  |  |   /* If this type was previously laid out as a forward reference,
 | 
      
         | 7063 |  |  |      make sure we lay it out again.  */
 | 
      
         | 7064 |  |  |  
 | 
      
         | 7065 |  |  |   TYPE_SIZE (t) = 0;
 | 
      
         | 7066 |  |  |  
 | 
      
         | 7067 |  |  |   decl_attributes (&t, attributes, (int) ATTR_FLAG_TYPE_IN_PLACE);
 | 
      
         | 7068 |  |  |  
 | 
      
         | 7069 |  |  |   if (pedantic)
 | 
      
         | 7070 |  |  |     {
 | 
      
         | 7071 |  |  |       for (x = fieldlist; x; x = DECL_CHAIN (x))
 | 
      
         | 7072 |  |  |         {
 | 
      
         | 7073 |  |  |           if (DECL_NAME (x) != 0)
 | 
      
         | 7074 |  |  |             break;
 | 
      
         | 7075 |  |  |           if (flag_isoc11
 | 
      
         | 7076 |  |  |               && (TREE_CODE (TREE_TYPE (x)) == RECORD_TYPE
 | 
      
         | 7077 |  |  |                   || TREE_CODE (TREE_TYPE (x)) == UNION_TYPE))
 | 
      
         | 7078 |  |  |             break;
 | 
      
         | 7079 |  |  |         }
 | 
      
         | 7080 |  |  |  
 | 
      
         | 7081 |  |  |       if (x == 0)
 | 
      
         | 7082 |  |  |         {
 | 
      
         | 7083 |  |  |           if (TREE_CODE (t) == UNION_TYPE)
 | 
      
         | 7084 |  |  |             {
 | 
      
         | 7085 |  |  |               if (fieldlist)
 | 
      
         | 7086 |  |  |                 pedwarn (loc, OPT_pedantic, "union has no named members");
 | 
      
         | 7087 |  |  |               else
 | 
      
         | 7088 |  |  |                 pedwarn (loc, OPT_pedantic, "union has no members");
 | 
      
         | 7089 |  |  |             }
 | 
      
         | 7090 |  |  |           else
 | 
      
         | 7091 |  |  |             {
 | 
      
         | 7092 |  |  |               if (fieldlist)
 | 
      
         | 7093 |  |  |                 pedwarn (loc, OPT_pedantic, "struct has no named members");
 | 
      
         | 7094 |  |  |               else
 | 
      
         | 7095 |  |  |                 pedwarn (loc, OPT_pedantic, "struct has no members");
 | 
      
         | 7096 |  |  |             }
 | 
      
         | 7097 |  |  |         }
 | 
      
         | 7098 |  |  |     }
 | 
      
         | 7099 |  |  |  
 | 
      
         | 7100 |  |  |   /* Install struct as DECL_CONTEXT of each field decl.
 | 
      
         | 7101 |  |  |      Also process specified field sizes, found in the DECL_INITIAL,
 | 
      
         | 7102 |  |  |      storing 0 there after the type has been changed to precision equal
 | 
      
         | 7103 |  |  |      to its width, rather than the precision of the specified standard
 | 
      
         | 7104 |  |  |      type.  (Correct layout requires the original type to have been preserved
 | 
      
         | 7105 |  |  |      until now.)  */
 | 
      
         | 7106 |  |  |  
 | 
      
         | 7107 |  |  |   saw_named_field = 0;
 | 
      
         | 7108 |  |  |   for (x = fieldlist; x; x = DECL_CHAIN (x))
 | 
      
         | 7109 |  |  |     {
 | 
      
         | 7110 |  |  |       if (TREE_TYPE (x) == error_mark_node)
 | 
      
         | 7111 |  |  |         continue;
 | 
      
         | 7112 |  |  |  
 | 
      
         | 7113 |  |  |       DECL_CONTEXT (x) = t;
 | 
      
         | 7114 |  |  |  
 | 
      
         | 7115 |  |  |       /* If any field is const, the structure type is pseudo-const.  */
 | 
      
         | 7116 |  |  |       if (TREE_READONLY (x))
 | 
      
         | 7117 |  |  |         C_TYPE_FIELDS_READONLY (t) = 1;
 | 
      
         | 7118 |  |  |       else
 | 
      
         | 7119 |  |  |         {
 | 
      
         | 7120 |  |  |           /* A field that is pseudo-const makes the structure likewise.  */
 | 
      
         | 7121 |  |  |           tree t1 = strip_array_types (TREE_TYPE (x));
 | 
      
         | 7122 |  |  |           if ((TREE_CODE (t1) == RECORD_TYPE || TREE_CODE (t1) == UNION_TYPE)
 | 
      
         | 7123 |  |  |               && C_TYPE_FIELDS_READONLY (t1))
 | 
      
         | 7124 |  |  |             C_TYPE_FIELDS_READONLY (t) = 1;
 | 
      
         | 7125 |  |  |         }
 | 
      
         | 7126 |  |  |  
 | 
      
         | 7127 |  |  |       /* Any field that is volatile means variables of this type must be
 | 
      
         | 7128 |  |  |          treated in some ways as volatile.  */
 | 
      
         | 7129 |  |  |       if (TREE_THIS_VOLATILE (x))
 | 
      
         | 7130 |  |  |         C_TYPE_FIELDS_VOLATILE (t) = 1;
 | 
      
         | 7131 |  |  |  
 | 
      
         | 7132 |  |  |       /* Any field of nominal variable size implies structure is too.  */
 | 
      
         | 7133 |  |  |       if (C_DECL_VARIABLE_SIZE (x))
 | 
      
         | 7134 |  |  |         C_TYPE_VARIABLE_SIZE (t) = 1;
 | 
      
         | 7135 |  |  |  
 | 
      
         | 7136 |  |  |       if (DECL_INITIAL (x))
 | 
      
         | 7137 |  |  |         {
 | 
      
         | 7138 |  |  |           unsigned HOST_WIDE_INT width = tree_low_cst (DECL_INITIAL (x), 1);
 | 
      
         | 7139 |  |  |           DECL_SIZE (x) = bitsize_int (width);
 | 
      
         | 7140 |  |  |           DECL_BIT_FIELD (x) = 1;
 | 
      
         | 7141 |  |  |           SET_DECL_C_BIT_FIELD (x);
 | 
      
         | 7142 |  |  |         }
 | 
      
         | 7143 |  |  |  
 | 
      
         | 7144 |  |  |       if (TYPE_PACKED (t)
 | 
      
         | 7145 |  |  |           && (DECL_BIT_FIELD (x)
 | 
      
         | 7146 |  |  |               || TYPE_ALIGN (TREE_TYPE (x)) > BITS_PER_UNIT))
 | 
      
         | 7147 |  |  |         DECL_PACKED (x) = 1;
 | 
      
         | 7148 |  |  |  
 | 
      
         | 7149 |  |  |       /* Detect flexible array member in an invalid context.  */
 | 
      
         | 7150 |  |  |       if (TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE
 | 
      
         | 7151 |  |  |           && TYPE_SIZE (TREE_TYPE (x)) == NULL_TREE
 | 
      
         | 7152 |  |  |           && TYPE_DOMAIN (TREE_TYPE (x)) != NULL_TREE
 | 
      
         | 7153 |  |  |           && TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (x))) == NULL_TREE)
 | 
      
         | 7154 |  |  |         {
 | 
      
         | 7155 |  |  |           if (TREE_CODE (t) == UNION_TYPE)
 | 
      
         | 7156 |  |  |             {
 | 
      
         | 7157 |  |  |               error_at (DECL_SOURCE_LOCATION (x),
 | 
      
         | 7158 |  |  |                         "flexible array member in union");
 | 
      
         | 7159 |  |  |               TREE_TYPE (x) = error_mark_node;
 | 
      
         | 7160 |  |  |             }
 | 
      
         | 7161 |  |  |           else if (DECL_CHAIN (x) != NULL_TREE)
 | 
      
         | 7162 |  |  |             {
 | 
      
         | 7163 |  |  |               error_at (DECL_SOURCE_LOCATION (x),
 | 
      
         | 7164 |  |  |                         "flexible array member not at end of struct");
 | 
      
         | 7165 |  |  |               TREE_TYPE (x) = error_mark_node;
 | 
      
         | 7166 |  |  |             }
 | 
      
         | 7167 |  |  |           else if (!saw_named_field)
 | 
      
         | 7168 |  |  |             {
 | 
      
         | 7169 |  |  |               error_at (DECL_SOURCE_LOCATION (x),
 | 
      
         | 7170 |  |  |                         "flexible array member in otherwise empty struct");
 | 
      
         | 7171 |  |  |               TREE_TYPE (x) = error_mark_node;
 | 
      
         | 7172 |  |  |             }
 | 
      
         | 7173 |  |  |         }
 | 
      
         | 7174 |  |  |  
 | 
      
         | 7175 |  |  |       if (pedantic && TREE_CODE (t) == RECORD_TYPE
 | 
      
         | 7176 |  |  |           && flexible_array_type_p (TREE_TYPE (x)))
 | 
      
         | 7177 |  |  |         pedwarn (DECL_SOURCE_LOCATION (x), OPT_pedantic,
 | 
      
         | 7178 |  |  |                  "invalid use of structure with flexible array member");
 | 
      
         | 7179 |  |  |  
 | 
      
         | 7180 |  |  |       if (DECL_NAME (x)
 | 
      
         | 7181 |  |  |           || TREE_CODE (TREE_TYPE (x)) == RECORD_TYPE
 | 
      
         | 7182 |  |  |           || TREE_CODE (TREE_TYPE (x)) == UNION_TYPE)
 | 
      
         | 7183 |  |  |         saw_named_field = 1;
 | 
      
         | 7184 |  |  |     }
 | 
      
         | 7185 |  |  |  
 | 
      
         | 7186 |  |  |   detect_field_duplicates (fieldlist);
 | 
      
         | 7187 |  |  |  
 | 
      
         | 7188 |  |  |   /* Now we have the nearly final fieldlist.  Record it,
 | 
      
         | 7189 |  |  |      then lay out the structure or union (including the fields).  */
 | 
      
         | 7190 |  |  |  
 | 
      
         | 7191 |  |  |   TYPE_FIELDS (t) = fieldlist;
 | 
      
         | 7192 |  |  |  
 | 
      
         | 7193 |  |  |   layout_type (t);
 | 
      
         | 7194 |  |  |  
 | 
      
         | 7195 |  |  |   /* Give bit-fields their proper types.  */
 | 
      
         | 7196 |  |  |   {
 | 
      
         | 7197 |  |  |     tree *fieldlistp = &fieldlist;
 | 
      
         | 7198 |  |  |     while (*fieldlistp)
 | 
      
         | 7199 |  |  |       if (TREE_CODE (*fieldlistp) == FIELD_DECL && DECL_INITIAL (*fieldlistp)
 | 
      
         | 7200 |  |  |           && TREE_TYPE (*fieldlistp) != error_mark_node)
 | 
      
         | 7201 |  |  |         {
 | 
      
         | 7202 |  |  |           unsigned HOST_WIDE_INT width
 | 
      
         | 7203 |  |  |             = tree_low_cst (DECL_INITIAL (*fieldlistp), 1);
 | 
      
         | 7204 |  |  |           tree type = TREE_TYPE (*fieldlistp);
 | 
      
         | 7205 |  |  |           if (width != TYPE_PRECISION (type))
 | 
      
         | 7206 |  |  |             {
 | 
      
         | 7207 |  |  |               TREE_TYPE (*fieldlistp)
 | 
      
         | 7208 |  |  |                 = c_build_bitfield_integer_type (width, TYPE_UNSIGNED (type));
 | 
      
         | 7209 |  |  |               DECL_MODE (*fieldlistp) = TYPE_MODE (TREE_TYPE (*fieldlistp));
 | 
      
         | 7210 |  |  |             }
 | 
      
         | 7211 |  |  |           DECL_INITIAL (*fieldlistp) = 0;
 | 
      
         | 7212 |  |  |         }
 | 
      
         | 7213 |  |  |       else
 | 
      
         | 7214 |  |  |         fieldlistp = &DECL_CHAIN (*fieldlistp);
 | 
      
         | 7215 |  |  |   }
 | 
      
         | 7216 |  |  |  
 | 
      
         | 7217 |  |  |   /* Now we have the truly final field list.
 | 
      
         | 7218 |  |  |      Store it in this type and in the variants.  */
 | 
      
         | 7219 |  |  |  
 | 
      
         | 7220 |  |  |   TYPE_FIELDS (t) = fieldlist;
 | 
      
         | 7221 |  |  |  
 | 
      
         | 7222 |  |  |   /* If there are lots of fields, sort so we can look through them fast.
 | 
      
         | 7223 |  |  |      We arbitrarily consider 16 or more elts to be "a lot".  */
 | 
      
         | 7224 |  |  |  
 | 
      
         | 7225 |  |  |   {
 | 
      
         | 7226 |  |  |     int len = 0;
 | 
      
         | 7227 |  |  |  
 | 
      
         | 7228 |  |  |     for (x = fieldlist; x; x = DECL_CHAIN (x))
 | 
      
         | 7229 |  |  |       {
 | 
      
         | 7230 |  |  |         if (len > 15 || DECL_NAME (x) == NULL)
 | 
      
         | 7231 |  |  |           break;
 | 
      
         | 7232 |  |  |         len += 1;
 | 
      
         | 7233 |  |  |       }
 | 
      
         | 7234 |  |  |  
 | 
      
         | 7235 |  |  |     if (len > 15)
 | 
      
         | 7236 |  |  |       {
 | 
      
         | 7237 |  |  |         tree *field_array;
 | 
      
         | 7238 |  |  |         struct lang_type *space;
 | 
      
         | 7239 |  |  |         struct sorted_fields_type *space2;
 | 
      
         | 7240 |  |  |  
 | 
      
         | 7241 |  |  |         len += list_length (x);
 | 
      
         | 7242 |  |  |  
 | 
      
         | 7243 |  |  |         /* Use the same allocation policy here that make_node uses, to
 | 
      
         | 7244 |  |  |           ensure that this lives as long as the rest of the struct decl.
 | 
      
         | 7245 |  |  |           All decls in an inline function need to be saved.  */
 | 
      
         | 7246 |  |  |  
 | 
      
         | 7247 |  |  |         space = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
 | 
      
         | 7248 |  |  |         space2 = ggc_alloc_sorted_fields_type
 | 
      
         | 7249 |  |  |           (sizeof (struct sorted_fields_type) + len * sizeof (tree));
 | 
      
         | 7250 |  |  |  
 | 
      
         | 7251 |  |  |         len = 0;
 | 
      
         | 7252 |  |  |         space->s = space2;
 | 
      
         | 7253 |  |  |         field_array = &space2->elts[0];
 | 
      
         | 7254 |  |  |         for (x = fieldlist; x; x = DECL_CHAIN (x))
 | 
      
         | 7255 |  |  |           {
 | 
      
         | 7256 |  |  |             field_array[len++] = x;
 | 
      
         | 7257 |  |  |  
 | 
      
         | 7258 |  |  |             /* If there is anonymous struct or union, break out of the loop.  */
 | 
      
         | 7259 |  |  |             if (DECL_NAME (x) == NULL)
 | 
      
         | 7260 |  |  |               break;
 | 
      
         | 7261 |  |  |           }
 | 
      
         | 7262 |  |  |         /* Found no anonymous struct/union.  Add the TYPE_LANG_SPECIFIC.  */
 | 
      
         | 7263 |  |  |         if (x == NULL)
 | 
      
         | 7264 |  |  |           {
 | 
      
         | 7265 |  |  |             TYPE_LANG_SPECIFIC (t) = space;
 | 
      
         | 7266 |  |  |             TYPE_LANG_SPECIFIC (t)->s->len = len;
 | 
      
         | 7267 |  |  |             field_array = TYPE_LANG_SPECIFIC (t)->s->elts;
 | 
      
         | 7268 |  |  |             qsort (field_array, len, sizeof (tree), field_decl_cmp);
 | 
      
         | 7269 |  |  |           }
 | 
      
         | 7270 |  |  |       }
 | 
      
         | 7271 |  |  |   }
 | 
      
         | 7272 |  |  |  
 | 
      
         | 7273 |  |  |   for (x = TYPE_MAIN_VARIANT (t); x; x = TYPE_NEXT_VARIANT (x))
 | 
      
         | 7274 |  |  |     {
 | 
      
         | 7275 |  |  |       TYPE_FIELDS (x) = TYPE_FIELDS (t);
 | 
      
         | 7276 |  |  |       TYPE_LANG_SPECIFIC (x) = TYPE_LANG_SPECIFIC (t);
 | 
      
         | 7277 |  |  |       C_TYPE_FIELDS_READONLY (x) = C_TYPE_FIELDS_READONLY (t);
 | 
      
         | 7278 |  |  |       C_TYPE_FIELDS_VOLATILE (x) = C_TYPE_FIELDS_VOLATILE (t);
 | 
      
         | 7279 |  |  |       C_TYPE_VARIABLE_SIZE (x) = C_TYPE_VARIABLE_SIZE (t);
 | 
      
         | 7280 |  |  |     }
 | 
      
         | 7281 |  |  |  
 | 
      
         | 7282 |  |  |   /* If this was supposed to be a transparent union, but we can't
 | 
      
         | 7283 |  |  |      make it one, warn and turn off the flag.  */
 | 
      
         | 7284 |  |  |   if (TREE_CODE (t) == UNION_TYPE
 | 
      
         | 7285 |  |  |       && TYPE_TRANSPARENT_AGGR (t)
 | 
      
         | 7286 |  |  |       && (!TYPE_FIELDS (t) || TYPE_MODE (t) != DECL_MODE (TYPE_FIELDS (t))))
 | 
      
         | 7287 |  |  |     {
 | 
      
         | 7288 |  |  |       TYPE_TRANSPARENT_AGGR (t) = 0;
 | 
      
         | 7289 |  |  |       warning_at (loc, 0, "union cannot be made transparent");
 | 
      
         | 7290 |  |  |     }
 | 
      
         | 7291 |  |  |  
 | 
      
         | 7292 |  |  |   /* If this structure or union completes the type of any previous
 | 
      
         | 7293 |  |  |      variable declaration, lay it out and output its rtl.  */
 | 
      
         | 7294 |  |  |   for (x = C_TYPE_INCOMPLETE_VARS (TYPE_MAIN_VARIANT (t));
 | 
      
         | 7295 |  |  |        x;
 | 
      
         | 7296 |  |  |        x = TREE_CHAIN (x))
 | 
      
         | 7297 |  |  |     {
 | 
      
         | 7298 |  |  |       tree decl = TREE_VALUE (x);
 | 
      
         | 7299 |  |  |       if (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
 | 
      
         | 7300 |  |  |         layout_array_type (TREE_TYPE (decl));
 | 
      
         | 7301 |  |  |       if (TREE_CODE (decl) != TYPE_DECL)
 | 
      
         | 7302 |  |  |         {
 | 
      
         | 7303 |  |  |           layout_decl (decl, 0);
 | 
      
         | 7304 |  |  |           if (c_dialect_objc ())
 | 
      
         | 7305 |  |  |             objc_check_decl (decl);
 | 
      
         | 7306 |  |  |           rest_of_decl_compilation (decl, toplevel, 0);
 | 
      
         | 7307 |  |  |           if (!toplevel)
 | 
      
         | 7308 |  |  |             expand_decl (decl);
 | 
      
         | 7309 |  |  |         }
 | 
      
         | 7310 |  |  |     }
 | 
      
         | 7311 |  |  |   C_TYPE_INCOMPLETE_VARS (TYPE_MAIN_VARIANT (t)) = 0;
 | 
      
         | 7312 |  |  |  
 | 
      
         | 7313 |  |  |   /* Update type location to the one of the definition, instead of e.g.
 | 
      
         | 7314 |  |  |      a forward declaration.  */
 | 
      
         | 7315 |  |  |   if (TYPE_STUB_DECL (t))
 | 
      
         | 7316 |  |  |     DECL_SOURCE_LOCATION (TYPE_STUB_DECL (t)) = loc;
 | 
      
         | 7317 |  |  |  
 | 
      
         | 7318 |  |  |   /* Finish debugging output for this type.  */
 | 
      
         | 7319 |  |  |   rest_of_type_compilation (t, toplevel);
 | 
      
         | 7320 |  |  |  
 | 
      
         | 7321 |  |  |   /* If we're inside a function proper, i.e. not file-scope and not still
 | 
      
         | 7322 |  |  |      parsing parameters, then arrange for the size of a variable sized type
 | 
      
         | 7323 |  |  |      to be bound now.  */
 | 
      
         | 7324 |  |  |   if (building_stmt_list_p () && variably_modified_type_p (t, NULL_TREE))
 | 
      
         | 7325 |  |  |     add_stmt (build_stmt (loc,
 | 
      
         | 7326 |  |  |                           DECL_EXPR, build_decl (loc, TYPE_DECL, NULL, t)));
 | 
      
         | 7327 |  |  |  
 | 
      
         | 7328 |  |  |   if (warn_cxx_compat)
 | 
      
         | 7329 |  |  |     warn_cxx_compat_finish_struct (fieldlist);
 | 
      
         | 7330 |  |  |  
 | 
      
         | 7331 |  |  |   VEC_free (tree, heap, struct_parse_info->struct_types);
 | 
      
         | 7332 |  |  |   VEC_free (c_binding_ptr, heap, struct_parse_info->fields);
 | 
      
         | 7333 |  |  |   VEC_free (tree, heap, struct_parse_info->typedefs_seen);
 | 
      
         | 7334 |  |  |   XDELETE (struct_parse_info);
 | 
      
         | 7335 |  |  |  
 | 
      
         | 7336 |  |  |   struct_parse_info = enclosing_struct_parse_info;
 | 
      
         | 7337 |  |  |  
 | 
      
         | 7338 |  |  |   /* If this struct is defined inside a struct, add it to
 | 
      
         | 7339 |  |  |      struct_types.  */
 | 
      
         | 7340 |  |  |   if (warn_cxx_compat
 | 
      
         | 7341 |  |  |       && struct_parse_info != NULL
 | 
      
         | 7342 |  |  |       && !in_sizeof && !in_typeof && !in_alignof)
 | 
      
         | 7343 |  |  |     VEC_safe_push (tree, heap, struct_parse_info->struct_types, t);
 | 
      
         | 7344 |  |  |  
 | 
      
         | 7345 |  |  |   return t;
 | 
      
         | 7346 |  |  | }
 | 
      
         | 7347 |  |  |  
 | 
      
         | 7348 |  |  | /* Lay out the type T, and its element type, and so on.  */
 | 
      
         | 7349 |  |  |  
 | 
      
         | 7350 |  |  | static void
 | 
      
         | 7351 |  |  | layout_array_type (tree t)
 | 
      
         | 7352 |  |  | {
 | 
      
         | 7353 |  |  |   if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
 | 
      
         | 7354 |  |  |     layout_array_type (TREE_TYPE (t));
 | 
      
         | 7355 |  |  |   layout_type (t);
 | 
      
         | 7356 |  |  | }
 | 
      
         | 7357 |  |  |  
 | 
      
         | 7358 |  |  | /* Begin compiling the definition of an enumeration type.
 | 
      
         | 7359 |  |  |    NAME is its name (or null if anonymous).
 | 
      
         | 7360 |  |  |    LOC is the enum's location.
 | 
      
         | 7361 |  |  |    Returns the type object, as yet incomplete.
 | 
      
         | 7362 |  |  |    Also records info about it so that build_enumerator
 | 
      
         | 7363 |  |  |    may be used to declare the individual values as they are read.  */
 | 
      
         | 7364 |  |  |  
 | 
      
         | 7365 |  |  | tree
 | 
      
         | 7366 |  |  | start_enum (location_t loc, struct c_enum_contents *the_enum, tree name)
 | 
      
         | 7367 |  |  | {
 | 
      
         | 7368 |  |  |   tree enumtype = NULL_TREE;
 | 
      
         | 7369 |  |  |   location_t enumloc = UNKNOWN_LOCATION;
 | 
      
         | 7370 |  |  |  
 | 
      
         | 7371 |  |  |   /* If this is the real definition for a previous forward reference,
 | 
      
         | 7372 |  |  |      fill in the contents in the same object that used to be the
 | 
      
         | 7373 |  |  |      forward reference.  */
 | 
      
         | 7374 |  |  |  
 | 
      
         | 7375 |  |  |   if (name != NULL_TREE)
 | 
      
         | 7376 |  |  |     enumtype = lookup_tag (ENUMERAL_TYPE, name, 1, &enumloc);
 | 
      
         | 7377 |  |  |  
 | 
      
         | 7378 |  |  |   if (enumtype == 0 || TREE_CODE (enumtype) != ENUMERAL_TYPE)
 | 
      
         | 7379 |  |  |     {
 | 
      
         | 7380 |  |  |       enumtype = make_node (ENUMERAL_TYPE);
 | 
      
         | 7381 |  |  |       pushtag (loc, name, enumtype);
 | 
      
         | 7382 |  |  |     }
 | 
      
         | 7383 |  |  |  
 | 
      
         | 7384 |  |  |   if (C_TYPE_BEING_DEFINED (enumtype))
 | 
      
         | 7385 |  |  |     error_at (loc, "nested redefinition of %<enum %E%>", name);
 | 
      
         | 7386 |  |  |  
 | 
      
         | 7387 |  |  |   C_TYPE_BEING_DEFINED (enumtype) = 1;
 | 
      
         | 7388 |  |  |  
 | 
      
         | 7389 |  |  |   if (TYPE_VALUES (enumtype) != 0)
 | 
      
         | 7390 |  |  |     {
 | 
      
         | 7391 |  |  |       /* This enum is a named one that has been declared already.  */
 | 
      
         | 7392 |  |  |       error_at (loc, "redeclaration of %<enum %E%>", name);
 | 
      
         | 7393 |  |  |       if (enumloc != UNKNOWN_LOCATION)
 | 
      
         | 7394 |  |  |         inform (enumloc, "originally defined here");
 | 
      
         | 7395 |  |  |  
 | 
      
         | 7396 |  |  |       /* Completely replace its old definition.
 | 
      
         | 7397 |  |  |          The old enumerators remain defined, however.  */
 | 
      
         | 7398 |  |  |       TYPE_VALUES (enumtype) = 0;
 | 
      
         | 7399 |  |  |     }
 | 
      
         | 7400 |  |  |  
 | 
      
         | 7401 |  |  |   the_enum->enum_next_value = integer_zero_node;
 | 
      
         | 7402 |  |  |   the_enum->enum_overflow = 0;
 | 
      
         | 7403 |  |  |  
 | 
      
         | 7404 |  |  |   if (flag_short_enums)
 | 
      
         | 7405 |  |  |     TYPE_PACKED (enumtype) = 1;
 | 
      
         | 7406 |  |  |  
 | 
      
         | 7407 |  |  |   /* FIXME: This will issue a warning for a use of a type defined
 | 
      
         | 7408 |  |  |      within sizeof in a statement expr.  This is not terribly serious
 | 
      
         | 7409 |  |  |      as C++ doesn't permit statement exprs within sizeof anyhow.  */
 | 
      
         | 7410 |  |  |   if (warn_cxx_compat && (in_sizeof || in_typeof || in_alignof))
 | 
      
         | 7411 |  |  |     warning_at (loc, OPT_Wc___compat,
 | 
      
         | 7412 |  |  |                 "defining type in %qs expression is invalid in C++",
 | 
      
         | 7413 |  |  |                 (in_sizeof
 | 
      
         | 7414 |  |  |                  ? "sizeof"
 | 
      
         | 7415 |  |  |                  : (in_typeof ? "typeof" : "alignof")));
 | 
      
         | 7416 |  |  |  
 | 
      
         | 7417 |  |  |   return enumtype;
 | 
      
         | 7418 |  |  | }
 | 
      
         | 7419 |  |  |  
 | 
      
         | 7420 |  |  | /* After processing and defining all the values of an enumeration type,
 | 
      
         | 7421 |  |  |    install their decls in the enumeration type and finish it off.
 | 
      
         | 7422 |  |  |    ENUMTYPE is the type object, VALUES a list of decl-value pairs,
 | 
      
         | 7423 |  |  |    and ATTRIBUTES are the specified attributes.
 | 
      
         | 7424 |  |  |    Returns ENUMTYPE.  */
 | 
      
         | 7425 |  |  |  
 | 
      
         | 7426 |  |  | tree
 | 
      
         | 7427 |  |  | finish_enum (tree enumtype, tree values, tree attributes)
 | 
      
         | 7428 |  |  | {
 | 
      
         | 7429 |  |  |   tree pair, tem;
 | 
      
         | 7430 |  |  |   tree minnode = 0, maxnode = 0;
 | 
      
         | 7431 |  |  |   int precision, unsign;
 | 
      
         | 7432 |  |  |   bool toplevel = (file_scope == current_scope);
 | 
      
         | 7433 |  |  |   struct lang_type *lt;
 | 
      
         | 7434 |  |  |  
 | 
      
         | 7435 |  |  |   decl_attributes (&enumtype, attributes, (int) ATTR_FLAG_TYPE_IN_PLACE);
 | 
      
         | 7436 |  |  |  
 | 
      
         | 7437 |  |  |   /* Calculate the maximum value of any enumerator in this type.  */
 | 
      
         | 7438 |  |  |  
 | 
      
         | 7439 |  |  |   if (values == error_mark_node)
 | 
      
         | 7440 |  |  |     minnode = maxnode = integer_zero_node;
 | 
      
         | 7441 |  |  |   else
 | 
      
         | 7442 |  |  |     {
 | 
      
         | 7443 |  |  |       minnode = maxnode = TREE_VALUE (values);
 | 
      
         | 7444 |  |  |       for (pair = TREE_CHAIN (values); pair; pair = TREE_CHAIN (pair))
 | 
      
         | 7445 |  |  |         {
 | 
      
         | 7446 |  |  |           tree value = TREE_VALUE (pair);
 | 
      
         | 7447 |  |  |           if (tree_int_cst_lt (maxnode, value))
 | 
      
         | 7448 |  |  |             maxnode = value;
 | 
      
         | 7449 |  |  |           if (tree_int_cst_lt (value, minnode))
 | 
      
         | 7450 |  |  |             minnode = value;
 | 
      
         | 7451 |  |  |         }
 | 
      
         | 7452 |  |  |     }
 | 
      
         | 7453 |  |  |  
 | 
      
         | 7454 |  |  |   /* Construct the final type of this enumeration.  It is the same
 | 
      
         | 7455 |  |  |      as one of the integral types - the narrowest one that fits, except
 | 
      
         | 7456 |  |  |      that normally we only go as narrow as int - and signed iff any of
 | 
      
         | 7457 |  |  |      the values are negative.  */
 | 
      
         | 7458 |  |  |   unsign = (tree_int_cst_sgn (minnode) >= 0);
 | 
      
         | 7459 |  |  |   precision = MAX (tree_int_cst_min_precision (minnode, unsign),
 | 
      
         | 7460 |  |  |                    tree_int_cst_min_precision (maxnode, unsign));
 | 
      
         | 7461 |  |  |  
 | 
      
         | 7462 |  |  |   if (TYPE_PACKED (enumtype) || precision > TYPE_PRECISION (integer_type_node))
 | 
      
         | 7463 |  |  |     {
 | 
      
         | 7464 |  |  |       tem = c_common_type_for_size (precision, unsign);
 | 
      
         | 7465 |  |  |       if (tem == NULL)
 | 
      
         | 7466 |  |  |         {
 | 
      
         | 7467 |  |  |           warning (0, "enumeration values exceed range of largest integer");
 | 
      
         | 7468 |  |  |           tem = long_long_integer_type_node;
 | 
      
         | 7469 |  |  |         }
 | 
      
         | 7470 |  |  |     }
 | 
      
         | 7471 |  |  |   else
 | 
      
         | 7472 |  |  |     tem = unsign ? unsigned_type_node : integer_type_node;
 | 
      
         | 7473 |  |  |  
 | 
      
         | 7474 |  |  |   TYPE_MIN_VALUE (enumtype) = TYPE_MIN_VALUE (tem);
 | 
      
         | 7475 |  |  |   TYPE_MAX_VALUE (enumtype) = TYPE_MAX_VALUE (tem);
 | 
      
         | 7476 |  |  |   TYPE_UNSIGNED (enumtype) = TYPE_UNSIGNED (tem);
 | 
      
         | 7477 |  |  |   TYPE_SIZE (enumtype) = 0;
 | 
      
         | 7478 |  |  |  
 | 
      
         | 7479 |  |  |   /* If the precision of the type was specific with an attribute and it
 | 
      
         | 7480 |  |  |      was too small, give an error.  Otherwise, use it.  */
 | 
      
         | 7481 |  |  |   if (TYPE_PRECISION (enumtype))
 | 
      
         | 7482 |  |  |     {
 | 
      
         | 7483 |  |  |       if (precision > TYPE_PRECISION (enumtype))
 | 
      
         | 7484 |  |  |         error ("specified mode too small for enumeral values");
 | 
      
         | 7485 |  |  |     }
 | 
      
         | 7486 |  |  |   else
 | 
      
         | 7487 |  |  |     TYPE_PRECISION (enumtype) = TYPE_PRECISION (tem);
 | 
      
         | 7488 |  |  |  
 | 
      
         | 7489 |  |  |   layout_type (enumtype);
 | 
      
         | 7490 |  |  |  
 | 
      
         | 7491 |  |  |   if (values != error_mark_node)
 | 
      
         | 7492 |  |  |     {
 | 
      
         | 7493 |  |  |       /* Change the type of the enumerators to be the enum type.  We
 | 
      
         | 7494 |  |  |          need to do this irrespective of the size of the enum, for
 | 
      
         | 7495 |  |  |          proper type checking.  Replace the DECL_INITIALs of the
 | 
      
         | 7496 |  |  |          enumerators, and the value slots of the list, with copies
 | 
      
         | 7497 |  |  |          that have the enum type; they cannot be modified in place
 | 
      
         | 7498 |  |  |          because they may be shared (e.g.  integer_zero_node) Finally,
 | 
      
         | 7499 |  |  |          change the purpose slots to point to the names of the decls.  */
 | 
      
         | 7500 |  |  |       for (pair = values; pair; pair = TREE_CHAIN (pair))
 | 
      
         | 7501 |  |  |         {
 | 
      
         | 7502 |  |  |           tree enu = TREE_PURPOSE (pair);
 | 
      
         | 7503 |  |  |           tree ini = DECL_INITIAL (enu);
 | 
      
         | 7504 |  |  |  
 | 
      
         | 7505 |  |  |           TREE_TYPE (enu) = enumtype;
 | 
      
         | 7506 |  |  |  
 | 
      
         | 7507 |  |  |           /* The ISO C Standard mandates enumerators to have type int,
 | 
      
         | 7508 |  |  |              even though the underlying type of an enum type is
 | 
      
         | 7509 |  |  |              unspecified.  However, GCC allows enumerators of any
 | 
      
         | 7510 |  |  |              integer type as an extensions.  build_enumerator()
 | 
      
         | 7511 |  |  |              converts any enumerators that fit in an int to type int,
 | 
      
         | 7512 |  |  |              to avoid promotions to unsigned types when comparing
 | 
      
         | 7513 |  |  |              integers with enumerators that fit in the int range.
 | 
      
         | 7514 |  |  |              When -pedantic is given, build_enumerator() would have
 | 
      
         | 7515 |  |  |              already warned about those that don't fit. Here we
 | 
      
         | 7516 |  |  |              convert the rest to the enumerator type. */
 | 
      
         | 7517 |  |  |           if (TREE_TYPE (ini) != integer_type_node)
 | 
      
         | 7518 |  |  |             ini = convert (enumtype, ini);
 | 
      
         | 7519 |  |  |  
 | 
      
         | 7520 |  |  |           DECL_INITIAL (enu) = ini;
 | 
      
         | 7521 |  |  |           TREE_PURPOSE (pair) = DECL_NAME (enu);
 | 
      
         | 7522 |  |  |           TREE_VALUE (pair) = ini;
 | 
      
         | 7523 |  |  |         }
 | 
      
         | 7524 |  |  |  
 | 
      
         | 7525 |  |  |       TYPE_VALUES (enumtype) = values;
 | 
      
         | 7526 |  |  |     }
 | 
      
         | 7527 |  |  |  
 | 
      
         | 7528 |  |  |   /* Record the min/max values so that we can warn about bit-field
 | 
      
         | 7529 |  |  |      enumerations that are too small for the values.  */
 | 
      
         | 7530 |  |  |   lt = ggc_alloc_cleared_lang_type (sizeof (struct lang_type));
 | 
      
         | 7531 |  |  |   lt->enum_min = minnode;
 | 
      
         | 7532 |  |  |   lt->enum_max = maxnode;
 | 
      
         | 7533 |  |  |   TYPE_LANG_SPECIFIC (enumtype) = lt;
 | 
      
         | 7534 |  |  |  
 | 
      
         | 7535 |  |  |   /* Fix up all variant types of this enum type.  */
 | 
      
         | 7536 |  |  |   for (tem = TYPE_MAIN_VARIANT (enumtype); tem; tem = TYPE_NEXT_VARIANT (tem))
 | 
      
         | 7537 |  |  |     {
 | 
      
         | 7538 |  |  |       if (tem == enumtype)
 | 
      
         | 7539 |  |  |         continue;
 | 
      
         | 7540 |  |  |       TYPE_VALUES (tem) = TYPE_VALUES (enumtype);
 | 
      
         | 7541 |  |  |       TYPE_MIN_VALUE (tem) = TYPE_MIN_VALUE (enumtype);
 | 
      
         | 7542 |  |  |       TYPE_MAX_VALUE (tem) = TYPE_MAX_VALUE (enumtype);
 | 
      
         | 7543 |  |  |       TYPE_SIZE (tem) = TYPE_SIZE (enumtype);
 | 
      
         | 7544 |  |  |       TYPE_SIZE_UNIT (tem) = TYPE_SIZE_UNIT (enumtype);
 | 
      
         | 7545 |  |  |       SET_TYPE_MODE (tem, TYPE_MODE (enumtype));
 | 
      
         | 7546 |  |  |       TYPE_PRECISION (tem) = TYPE_PRECISION (enumtype);
 | 
      
         | 7547 |  |  |       TYPE_ALIGN (tem) = TYPE_ALIGN (enumtype);
 | 
      
         | 7548 |  |  |       TYPE_USER_ALIGN (tem) = TYPE_USER_ALIGN (enumtype);
 | 
      
         | 7549 |  |  |       TYPE_UNSIGNED (tem) = TYPE_UNSIGNED (enumtype);
 | 
      
         | 7550 |  |  |       TYPE_LANG_SPECIFIC (tem) = TYPE_LANG_SPECIFIC (enumtype);
 | 
      
         | 7551 |  |  |     }
 | 
      
         | 7552 |  |  |  
 | 
      
         | 7553 |  |  |   /* Finish debugging output for this type.  */
 | 
      
         | 7554 |  |  |   rest_of_type_compilation (enumtype, toplevel);
 | 
      
         | 7555 |  |  |  
 | 
      
         | 7556 |  |  |   /* If this enum is defined inside a struct, add it to
 | 
      
         | 7557 |  |  |      struct_types.  */
 | 
      
         | 7558 |  |  |   if (warn_cxx_compat
 | 
      
         | 7559 |  |  |       && struct_parse_info != NULL
 | 
      
         | 7560 |  |  |       && !in_sizeof && !in_typeof && !in_alignof)
 | 
      
         | 7561 |  |  |     VEC_safe_push (tree, heap, struct_parse_info->struct_types, enumtype);
 | 
      
         | 7562 |  |  |  
 | 
      
         | 7563 |  |  |   return enumtype;
 | 
      
         | 7564 |  |  | }
 | 
      
         | 7565 |  |  |  
 | 
      
         | 7566 |  |  | /* Build and install a CONST_DECL for one value of the
 | 
      
         | 7567 |  |  |    current enumeration type (one that was begun with start_enum).
 | 
      
         | 7568 |  |  |    DECL_LOC is the location of the enumerator.
 | 
      
         | 7569 |  |  |    LOC is the location of the '=' operator if any, DECL_LOC otherwise.
 | 
      
         | 7570 |  |  |    Return a tree-list containing the CONST_DECL and its value.
 | 
      
         | 7571 |  |  |    Assignment of sequential values by default is handled here.  */
 | 
      
         | 7572 |  |  |  
 | 
      
         | 7573 |  |  | tree
 | 
      
         | 7574 |  |  | build_enumerator (location_t decl_loc, location_t loc,
 | 
      
         | 7575 |  |  |                   struct c_enum_contents *the_enum, tree name, tree value)
 | 
      
         | 7576 |  |  | {
 | 
      
         | 7577 |  |  |   tree decl, type;
 | 
      
         | 7578 |  |  |  
 | 
      
         | 7579 |  |  |   /* Validate and default VALUE.  */
 | 
      
         | 7580 |  |  |  
 | 
      
         | 7581 |  |  |   if (value != 0)
 | 
      
         | 7582 |  |  |     {
 | 
      
         | 7583 |  |  |       /* Don't issue more errors for error_mark_node (i.e. an
 | 
      
         | 7584 |  |  |          undeclared identifier) - just ignore the value expression.  */
 | 
      
         | 7585 |  |  |       if (value == error_mark_node)
 | 
      
         | 7586 |  |  |         value = 0;
 | 
      
         | 7587 |  |  |       else if (!INTEGRAL_TYPE_P (TREE_TYPE (value)))
 | 
      
         | 7588 |  |  |         {
 | 
      
         | 7589 |  |  |           error_at (loc, "enumerator value for %qE is not an integer constant",
 | 
      
         | 7590 |  |  |                     name);
 | 
      
         | 7591 |  |  |           value = 0;
 | 
      
         | 7592 |  |  |         }
 | 
      
         | 7593 |  |  |       else
 | 
      
         | 7594 |  |  |         {
 | 
      
         | 7595 |  |  |           if (TREE_CODE (value) != INTEGER_CST)
 | 
      
         | 7596 |  |  |             {
 | 
      
         | 7597 |  |  |               value = c_fully_fold (value, false, NULL);
 | 
      
         | 7598 |  |  |               if (TREE_CODE (value) == INTEGER_CST)
 | 
      
         | 7599 |  |  |                 pedwarn (loc, OPT_pedantic,
 | 
      
         | 7600 |  |  |                          "enumerator value for %qE is not an integer "
 | 
      
         | 7601 |  |  |                          "constant expression", name);
 | 
      
         | 7602 |  |  |             }
 | 
      
         | 7603 |  |  |           if (TREE_CODE (value) != INTEGER_CST)
 | 
      
         | 7604 |  |  |             {
 | 
      
         | 7605 |  |  |               error ("enumerator value for %qE is not an integer constant",
 | 
      
         | 7606 |  |  |                      name);
 | 
      
         | 7607 |  |  |               value = 0;
 | 
      
         | 7608 |  |  |             }
 | 
      
         | 7609 |  |  |           else
 | 
      
         | 7610 |  |  |             {
 | 
      
         | 7611 |  |  |               value = default_conversion (value);
 | 
      
         | 7612 |  |  |               constant_expression_warning (value);
 | 
      
         | 7613 |  |  |             }
 | 
      
         | 7614 |  |  |         }
 | 
      
         | 7615 |  |  |     }
 | 
      
         | 7616 |  |  |  
 | 
      
         | 7617 |  |  |   /* Default based on previous value.  */
 | 
      
         | 7618 |  |  |   /* It should no longer be possible to have NON_LVALUE_EXPR
 | 
      
         | 7619 |  |  |      in the default.  */
 | 
      
         | 7620 |  |  |   if (value == 0)
 | 
      
         | 7621 |  |  |     {
 | 
      
         | 7622 |  |  |       value = the_enum->enum_next_value;
 | 
      
         | 7623 |  |  |       if (the_enum->enum_overflow)
 | 
      
         | 7624 |  |  |         error_at (loc, "overflow in enumeration values");
 | 
      
         | 7625 |  |  |     }
 | 
      
         | 7626 |  |  |   /* Even though the underlying type of an enum is unspecified, the
 | 
      
         | 7627 |  |  |      type of enumeration constants is explicitly defined as int
 | 
      
         | 7628 |  |  |      (6.4.4.3/2 in the C99 Standard).  GCC allows any integer type as
 | 
      
         | 7629 |  |  |      an extension.  */
 | 
      
         | 7630 |  |  |   else if (!int_fits_type_p (value, integer_type_node))
 | 
      
         | 7631 |  |  |     pedwarn (loc, OPT_pedantic,
 | 
      
         | 7632 |  |  |              "ISO C restricts enumerator values to range of %<int%>");
 | 
      
         | 7633 |  |  |  
 | 
      
         | 7634 |  |  |   /* The ISO C Standard mandates enumerators to have type int, even
 | 
      
         | 7635 |  |  |      though the underlying type of an enum type is unspecified.
 | 
      
         | 7636 |  |  |      However, GCC allows enumerators of any integer type as an
 | 
      
         | 7637 |  |  |      extensions.  Here we convert any enumerators that fit in an int
 | 
      
         | 7638 |  |  |      to type int, to avoid promotions to unsigned types when comparing
 | 
      
         | 7639 |  |  |      integers with enumerators that fit in the int range.  When
 | 
      
         | 7640 |  |  |      -pedantic is given, we would have already warned about those that
 | 
      
         | 7641 |  |  |      don't fit. We have to do this here rather than in finish_enum
 | 
      
         | 7642 |  |  |      because this value may be used to define more enumerators.  */
 | 
      
         | 7643 |  |  |   if (int_fits_type_p (value, integer_type_node))
 | 
      
         | 7644 |  |  |     value = convert (integer_type_node, value);
 | 
      
         | 7645 |  |  |  
 | 
      
         | 7646 |  |  |   /* Set basis for default for next value.  */
 | 
      
         | 7647 |  |  |   the_enum->enum_next_value
 | 
      
         | 7648 |  |  |     = build_binary_op (EXPR_LOC_OR_HERE (value),
 | 
      
         | 7649 |  |  |                        PLUS_EXPR, value, integer_one_node, 0);
 | 
      
         | 7650 |  |  |   the_enum->enum_overflow = tree_int_cst_lt (the_enum->enum_next_value, value);
 | 
      
         | 7651 |  |  |  
 | 
      
         | 7652 |  |  |   /* Now create a declaration for the enum value name.  */
 | 
      
         | 7653 |  |  |  
 | 
      
         | 7654 |  |  |   type = TREE_TYPE (value);
 | 
      
         | 7655 |  |  |   type = c_common_type_for_size (MAX (TYPE_PRECISION (type),
 | 
      
         | 7656 |  |  |                                       TYPE_PRECISION (integer_type_node)),
 | 
      
         | 7657 |  |  |                                  (TYPE_PRECISION (type)
 | 
      
         | 7658 |  |  |                                   >= TYPE_PRECISION (integer_type_node)
 | 
      
         | 7659 |  |  |                                   && TYPE_UNSIGNED (type)));
 | 
      
         | 7660 |  |  |  
 | 
      
         | 7661 |  |  |   decl = build_decl (decl_loc, CONST_DECL, name, type);
 | 
      
         | 7662 |  |  |   DECL_INITIAL (decl) = convert (type, value);
 | 
      
         | 7663 |  |  |   pushdecl (decl);
 | 
      
         | 7664 |  |  |  
 | 
      
         | 7665 |  |  |   return tree_cons (decl, value, NULL_TREE);
 | 
      
         | 7666 |  |  | }
 | 
      
         | 7667 |  |  |  
 | 
      
         | 7668 |  |  |  
 | 
      
         | 7669 |  |  | /* Create the FUNCTION_DECL for a function definition.
 | 
      
         | 7670 |  |  |    DECLSPECS, DECLARATOR and ATTRIBUTES are the parts of
 | 
      
         | 7671 |  |  |    the declaration; they describe the function's name and the type it returns,
 | 
      
         | 7672 |  |  |    but twisted together in a fashion that parallels the syntax of C.
 | 
      
         | 7673 |  |  |  
 | 
      
         | 7674 |  |  |    This function creates a binding context for the function body
 | 
      
         | 7675 |  |  |    as well as setting up the FUNCTION_DECL in current_function_decl.
 | 
      
         | 7676 |  |  |  
 | 
      
         | 7677 |  |  |    Returns 1 on success.  If the DECLARATOR is not suitable for a function
 | 
      
         | 7678 |  |  |    (it defines a datum instead), we return 0, which tells
 | 
      
         | 7679 |  |  |    yyparse to report a parse error.  */
 | 
      
         | 7680 |  |  |  
 | 
      
         | 7681 |  |  | int
 | 
      
         | 7682 |  |  | start_function (struct c_declspecs *declspecs, struct c_declarator *declarator,
 | 
      
         | 7683 |  |  |                 tree attributes)
 | 
      
         | 7684 |  |  | {
 | 
      
         | 7685 |  |  |   tree decl1, old_decl;
 | 
      
         | 7686 |  |  |   tree restype, resdecl;
 | 
      
         | 7687 |  |  |   location_t loc;
 | 
      
         | 7688 |  |  |  
 | 
      
         | 7689 |  |  |   current_function_returns_value = 0;  /* Assume, until we see it does.  */
 | 
      
         | 7690 |  |  |   current_function_returns_null = 0;
 | 
      
         | 7691 |  |  |   current_function_returns_abnormally = 0;
 | 
      
         | 7692 |  |  |   warn_about_return_type = 0;
 | 
      
         | 7693 |  |  |   c_switch_stack = NULL;
 | 
      
         | 7694 |  |  |  
 | 
      
         | 7695 |  |  |   /* Indicate no valid break/continue context by setting these variables
 | 
      
         | 7696 |  |  |      to some non-null, non-label value.  We'll notice and emit the proper
 | 
      
         | 7697 |  |  |      error message in c_finish_bc_stmt.  */
 | 
      
         | 7698 |  |  |   c_break_label = c_cont_label = size_zero_node;
 | 
      
         | 7699 |  |  |  
 | 
      
         | 7700 |  |  |   decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, true, NULL,
 | 
      
         | 7701 |  |  |                           &attributes, NULL, NULL, DEPRECATED_NORMAL);
 | 
      
         | 7702 |  |  |  
 | 
      
         | 7703 |  |  |   /* If the declarator is not suitable for a function definition,
 | 
      
         | 7704 |  |  |      cause a syntax error.  */
 | 
      
         | 7705 |  |  |   if (decl1 == 0
 | 
      
         | 7706 |  |  |       || TREE_CODE (decl1) != FUNCTION_DECL)
 | 
      
         | 7707 |  |  |     return 0;
 | 
      
         | 7708 |  |  |  
 | 
      
         | 7709 |  |  |   loc = DECL_SOURCE_LOCATION (decl1);
 | 
      
         | 7710 |  |  |  
 | 
      
         | 7711 |  |  |   decl_attributes (&decl1, attributes, 0);
 | 
      
         | 7712 |  |  |  
 | 
      
         | 7713 |  |  |   if (DECL_DECLARED_INLINE_P (decl1)
 | 
      
         | 7714 |  |  |       && DECL_UNINLINABLE (decl1)
 | 
      
         | 7715 |  |  |       && lookup_attribute ("noinline", DECL_ATTRIBUTES (decl1)))
 | 
      
         | 7716 |  |  |     warning_at (loc, OPT_Wattributes,
 | 
      
         | 7717 |  |  |                 "inline function %qD given attribute noinline",
 | 
      
         | 7718 |  |  |                 decl1);
 | 
      
         | 7719 |  |  |  
 | 
      
         | 7720 |  |  |   /* Handle gnu_inline attribute.  */
 | 
      
         | 7721 |  |  |   if (declspecs->inline_p
 | 
      
         | 7722 |  |  |       && !flag_gnu89_inline
 | 
      
         | 7723 |  |  |       && TREE_CODE (decl1) == FUNCTION_DECL
 | 
      
         | 7724 |  |  |       && (lookup_attribute ("gnu_inline", DECL_ATTRIBUTES (decl1))
 | 
      
         | 7725 |  |  |           || current_function_decl))
 | 
      
         | 7726 |  |  |     {
 | 
      
         | 7727 |  |  |       if (declspecs->storage_class != csc_static)
 | 
      
         | 7728 |  |  |         DECL_EXTERNAL (decl1) = !DECL_EXTERNAL (decl1);
 | 
      
         | 7729 |  |  |     }
 | 
      
         | 7730 |  |  |  
 | 
      
         | 7731 |  |  |   announce_function (decl1);
 | 
      
         | 7732 |  |  |  
 | 
      
         | 7733 |  |  |   if (!COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (TREE_TYPE (decl1))))
 | 
      
         | 7734 |  |  |     {
 | 
      
         | 7735 |  |  |       error_at (loc, "return type is an incomplete type");
 | 
      
         | 7736 |  |  |       /* Make it return void instead.  */
 | 
      
         | 7737 |  |  |       TREE_TYPE (decl1)
 | 
      
         | 7738 |  |  |         = build_function_type (void_type_node,
 | 
      
         | 7739 |  |  |                                TYPE_ARG_TYPES (TREE_TYPE (decl1)));
 | 
      
         | 7740 |  |  |     }
 | 
      
         | 7741 |  |  |  
 | 
      
         | 7742 |  |  |   if (warn_about_return_type)
 | 
      
         | 7743 |  |  |     pedwarn_c99 (loc, flag_isoc99 ? 0
 | 
      
         | 7744 |  |  |                  : (warn_return_type ? OPT_Wreturn_type : OPT_Wimplicit_int),
 | 
      
         | 7745 |  |  |                  "return type defaults to %<int%>");
 | 
      
         | 7746 |  |  |  
 | 
      
         | 7747 |  |  |   /* Make the init_value nonzero so pushdecl knows this is not tentative.
 | 
      
         | 7748 |  |  |      error_mark_node is replaced below (in pop_scope) with the BLOCK.  */
 | 
      
         | 7749 |  |  |   DECL_INITIAL (decl1) = error_mark_node;
 | 
      
         | 7750 |  |  |  
 | 
      
         | 7751 |  |  |   /* A nested function is not global.  */
 | 
      
         | 7752 |  |  |   if (current_function_decl != 0)
 | 
      
         | 7753 |  |  |     TREE_PUBLIC (decl1) = 0;
 | 
      
         | 7754 |  |  |  
 | 
      
         | 7755 |  |  |   /* If this definition isn't a prototype and we had a prototype declaration
 | 
      
         | 7756 |  |  |      before, copy the arg type info from that prototype.  */
 | 
      
         | 7757 |  |  |   old_decl = lookup_name_in_scope (DECL_NAME (decl1), current_scope);
 | 
      
         | 7758 |  |  |   if (old_decl && TREE_CODE (old_decl) != FUNCTION_DECL)
 | 
      
         | 7759 |  |  |     old_decl = 0;
 | 
      
         | 7760 |  |  |   current_function_prototype_locus = UNKNOWN_LOCATION;
 | 
      
         | 7761 |  |  |   current_function_prototype_built_in = false;
 | 
      
         | 7762 |  |  |   current_function_prototype_arg_types = NULL_TREE;
 | 
      
         | 7763 |  |  |   if (!prototype_p (TREE_TYPE (decl1)))
 | 
      
         | 7764 |  |  |     {
 | 
      
         | 7765 |  |  |       if (old_decl != 0 && TREE_CODE (TREE_TYPE (old_decl)) == FUNCTION_TYPE
 | 
      
         | 7766 |  |  |           && comptypes (TREE_TYPE (TREE_TYPE (decl1)),
 | 
      
         | 7767 |  |  |                         TREE_TYPE (TREE_TYPE (old_decl))))
 | 
      
         | 7768 |  |  |         {
 | 
      
         | 7769 |  |  |           TREE_TYPE (decl1) = composite_type (TREE_TYPE (old_decl),
 | 
      
         | 7770 |  |  |                                               TREE_TYPE (decl1));
 | 
      
         | 7771 |  |  |           current_function_prototype_locus = DECL_SOURCE_LOCATION (old_decl);
 | 
      
         | 7772 |  |  |           current_function_prototype_built_in
 | 
      
         | 7773 |  |  |             = C_DECL_BUILTIN_PROTOTYPE (old_decl);
 | 
      
         | 7774 |  |  |           current_function_prototype_arg_types
 | 
      
         | 7775 |  |  |             = TYPE_ARG_TYPES (TREE_TYPE (decl1));
 | 
      
         | 7776 |  |  |         }
 | 
      
         | 7777 |  |  |       if (TREE_PUBLIC (decl1))
 | 
      
         | 7778 |  |  |         {
 | 
      
         | 7779 |  |  |           /* If there is an external prototype declaration of this
 | 
      
         | 7780 |  |  |              function, record its location but do not copy information
 | 
      
         | 7781 |  |  |              to this decl.  This may be an invisible declaration
 | 
      
         | 7782 |  |  |              (built-in or in a scope which has finished) or simply
 | 
      
         | 7783 |  |  |              have more refined argument types than any declaration
 | 
      
         | 7784 |  |  |              found above.  */
 | 
      
         | 7785 |  |  |           struct c_binding *b;
 | 
      
         | 7786 |  |  |           for (b = I_SYMBOL_BINDING (DECL_NAME (decl1)); b; b = b->shadowed)
 | 
      
         | 7787 |  |  |             if (B_IN_SCOPE (b, external_scope))
 | 
      
         | 7788 |  |  |               break;
 | 
      
         | 7789 |  |  |           if (b)
 | 
      
         | 7790 |  |  |             {
 | 
      
         | 7791 |  |  |               tree ext_decl, ext_type;
 | 
      
         | 7792 |  |  |               ext_decl = b->decl;
 | 
      
         | 7793 |  |  |               ext_type = b->u.type ? b->u.type : TREE_TYPE (ext_decl);
 | 
      
         | 7794 |  |  |               if (TREE_CODE (ext_type) == FUNCTION_TYPE
 | 
      
         | 7795 |  |  |                   && comptypes (TREE_TYPE (TREE_TYPE (decl1)),
 | 
      
         | 7796 |  |  |                                 TREE_TYPE (ext_type)))
 | 
      
         | 7797 |  |  |                 {
 | 
      
         | 7798 |  |  |                   current_function_prototype_locus
 | 
      
         | 7799 |  |  |                     = DECL_SOURCE_LOCATION (ext_decl);
 | 
      
         | 7800 |  |  |                   current_function_prototype_built_in
 | 
      
         | 7801 |  |  |                     = C_DECL_BUILTIN_PROTOTYPE (ext_decl);
 | 
      
         | 7802 |  |  |                   current_function_prototype_arg_types
 | 
      
         | 7803 |  |  |                     = TYPE_ARG_TYPES (ext_type);
 | 
      
         | 7804 |  |  |                 }
 | 
      
         | 7805 |  |  |             }
 | 
      
         | 7806 |  |  |         }
 | 
      
         | 7807 |  |  |     }
 | 
      
         | 7808 |  |  |  
 | 
      
         | 7809 |  |  |   /* Optionally warn of old-fashioned def with no previous prototype.  */
 | 
      
         | 7810 |  |  |   if (warn_strict_prototypes
 | 
      
         | 7811 |  |  |       && old_decl != error_mark_node
 | 
      
         | 7812 |  |  |       && !prototype_p (TREE_TYPE (decl1))
 | 
      
         | 7813 |  |  |       && C_DECL_ISNT_PROTOTYPE (old_decl))
 | 
      
         | 7814 |  |  |     warning_at (loc, OPT_Wstrict_prototypes,
 | 
      
         | 7815 |  |  |                 "function declaration isn%'t a prototype");
 | 
      
         | 7816 |  |  |   /* Optionally warn of any global def with no previous prototype.  */
 | 
      
         | 7817 |  |  |   else if (warn_missing_prototypes
 | 
      
         | 7818 |  |  |            && old_decl != error_mark_node
 | 
      
         | 7819 |  |  |            && TREE_PUBLIC (decl1)
 | 
      
         | 7820 |  |  |            && !MAIN_NAME_P (DECL_NAME (decl1))
 | 
      
         | 7821 |  |  |            && C_DECL_ISNT_PROTOTYPE (old_decl))
 | 
      
         | 7822 |  |  |     warning_at (loc, OPT_Wmissing_prototypes,
 | 
      
         | 7823 |  |  |                 "no previous prototype for %qD", decl1);
 | 
      
         | 7824 |  |  |   /* Optionally warn of any def with no previous prototype
 | 
      
         | 7825 |  |  |      if the function has already been used.  */
 | 
      
         | 7826 |  |  |   else if (warn_missing_prototypes
 | 
      
         | 7827 |  |  |            && old_decl != 0
 | 
      
         | 7828 |  |  |            && old_decl != error_mark_node
 | 
      
         | 7829 |  |  |            && TREE_USED (old_decl)
 | 
      
         | 7830 |  |  |            && !prototype_p (TREE_TYPE (old_decl)))
 | 
      
         | 7831 |  |  |     warning_at (loc, OPT_Wmissing_prototypes,
 | 
      
         | 7832 |  |  |                 "%qD was used with no prototype before its definition", decl1);
 | 
      
         | 7833 |  |  |   /* Optionally warn of any global def with no previous declaration.  */
 | 
      
         | 7834 |  |  |   else if (warn_missing_declarations
 | 
      
         | 7835 |  |  |            && TREE_PUBLIC (decl1)
 | 
      
         | 7836 |  |  |            && old_decl == 0
 | 
      
         | 7837 |  |  |            && !MAIN_NAME_P (DECL_NAME (decl1)))
 | 
      
         | 7838 |  |  |     warning_at (loc, OPT_Wmissing_declarations,
 | 
      
         | 7839 |  |  |                 "no previous declaration for %qD",
 | 
      
         | 7840 |  |  |                 decl1);
 | 
      
         | 7841 |  |  |   /* Optionally warn of any def with no previous declaration
 | 
      
         | 7842 |  |  |      if the function has already been used.  */
 | 
      
         | 7843 |  |  |   else if (warn_missing_declarations
 | 
      
         | 7844 |  |  |            && old_decl != 0
 | 
      
         | 7845 |  |  |            && old_decl != error_mark_node
 | 
      
         | 7846 |  |  |            && TREE_USED (old_decl)
 | 
      
         | 7847 |  |  |            && C_DECL_IMPLICIT (old_decl))
 | 
      
         | 7848 |  |  |     warning_at (loc, OPT_Wmissing_declarations,
 | 
      
         | 7849 |  |  |                 "%qD was used with no declaration before its definition", decl1);
 | 
      
         | 7850 |  |  |  
 | 
      
         | 7851 |  |  |   /* This function exists in static storage.
 | 
      
         | 7852 |  |  |      (This does not mean `static' in the C sense!)  */
 | 
      
         | 7853 |  |  |   TREE_STATIC (decl1) = 1;
 | 
      
         | 7854 |  |  |  
 | 
      
         | 7855 |  |  |   /* This is the earliest point at which we might know the assembler
 | 
      
         | 7856 |  |  |      name of the function.  Thus, if it's set before this, die horribly.  */
 | 
      
         | 7857 |  |  |   gcc_assert (!DECL_ASSEMBLER_NAME_SET_P (decl1));
 | 
      
         | 7858 |  |  |  
 | 
      
         | 7859 |  |  |   /* If #pragma weak was used, mark the decl weak now.  */
 | 
      
         | 7860 |  |  |   if (current_scope == file_scope)
 | 
      
         | 7861 |  |  |     maybe_apply_pragma_weak (decl1);
 | 
      
         | 7862 |  |  |  
 | 
      
         | 7863 |  |  |   /* Warn for unlikely, improbable, or stupid declarations of `main'.  */
 | 
      
         | 7864 |  |  |   if (warn_main && MAIN_NAME_P (DECL_NAME (decl1)))
 | 
      
         | 7865 |  |  |     {
 | 
      
         | 7866 |  |  |       if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (decl1)))
 | 
      
         | 7867 |  |  |           != integer_type_node)
 | 
      
         | 7868 |  |  |         pedwarn (loc, OPT_Wmain, "return type of %qD is not %<int%>", decl1);
 | 
      
         | 7869 |  |  |  
 | 
      
         | 7870 |  |  |       check_main_parameter_types (decl1);
 | 
      
         | 7871 |  |  |  
 | 
      
         | 7872 |  |  |       if (!TREE_PUBLIC (decl1))
 | 
      
         | 7873 |  |  |         pedwarn (loc, OPT_Wmain,
 | 
      
         | 7874 |  |  |                  "%qD is normally a non-static function", decl1);
 | 
      
         | 7875 |  |  |     }
 | 
      
         | 7876 |  |  |  
 | 
      
         | 7877 |  |  |   /* Record the decl so that the function name is defined.
 | 
      
         | 7878 |  |  |      If we already have a decl for this name, and it is a FUNCTION_DECL,
 | 
      
         | 7879 |  |  |      use the old decl.  */
 | 
      
         | 7880 |  |  |  
 | 
      
         | 7881 |  |  |   current_function_decl = pushdecl (decl1);
 | 
      
         | 7882 |  |  |  
 | 
      
         | 7883 |  |  |   push_scope ();
 | 
      
         | 7884 |  |  |   declare_parm_level ();
 | 
      
         | 7885 |  |  |  
 | 
      
         | 7886 |  |  |   restype = TREE_TYPE (TREE_TYPE (current_function_decl));
 | 
      
         | 7887 |  |  |   resdecl = build_decl (loc, RESULT_DECL, NULL_TREE, restype);
 | 
      
         | 7888 |  |  |   DECL_ARTIFICIAL (resdecl) = 1;
 | 
      
         | 7889 |  |  |   DECL_IGNORED_P (resdecl) = 1;
 | 
      
         | 7890 |  |  |   DECL_RESULT (current_function_decl) = resdecl;
 | 
      
         | 7891 |  |  |  
 | 
      
         | 7892 |  |  |   start_fname_decls ();
 | 
      
         | 7893 |  |  |  
 | 
      
         | 7894 |  |  |   return 1;
 | 
      
         | 7895 |  |  | }
 | 
      
         | 7896 |  |  |  
 | 
      
         | 7897 |  |  | /* Subroutine of store_parm_decls which handles new-style function
 | 
      
         | 7898 |  |  |    definitions (prototype format). The parms already have decls, so we
 | 
      
         | 7899 |  |  |    need only record them as in effect and complain if any redundant
 | 
      
         | 7900 |  |  |    old-style parm decls were written.  */
 | 
      
         | 7901 |  |  | static void
 | 
      
         | 7902 |  |  | store_parm_decls_newstyle (tree fndecl, const struct c_arg_info *arg_info)
 | 
      
         | 7903 |  |  | {
 | 
      
         | 7904 |  |  |   tree decl;
 | 
      
         | 7905 |  |  |   c_arg_tag *tag;
 | 
      
         | 7906 |  |  |   unsigned ix;
 | 
      
         | 7907 |  |  |  
 | 
      
         | 7908 |  |  |   if (current_scope->bindings)
 | 
      
         | 7909 |  |  |     {
 | 
      
         | 7910 |  |  |       error_at (DECL_SOURCE_LOCATION (fndecl),
 | 
      
         | 7911 |  |  |                 "old-style parameter declarations in prototyped "
 | 
      
         | 7912 |  |  |                 "function definition");
 | 
      
         | 7913 |  |  |  
 | 
      
         | 7914 |  |  |       /* Get rid of the old-style declarations.  */
 | 
      
         | 7915 |  |  |       pop_scope ();
 | 
      
         | 7916 |  |  |       push_scope ();
 | 
      
         | 7917 |  |  |     }
 | 
      
         | 7918 |  |  |   /* Don't issue this warning for nested functions, and don't issue this
 | 
      
         | 7919 |  |  |      warning if we got here because ARG_INFO_TYPES was error_mark_node
 | 
      
         | 7920 |  |  |      (this happens when a function definition has just an ellipsis in
 | 
      
         | 7921 |  |  |      its parameter list).  */
 | 
      
         | 7922 |  |  |   else if (!in_system_header && !current_function_scope
 | 
      
         | 7923 |  |  |            && arg_info->types != error_mark_node)
 | 
      
         | 7924 |  |  |     warning_at (DECL_SOURCE_LOCATION (fndecl), OPT_Wtraditional,
 | 
      
         | 7925 |  |  |                 "traditional C rejects ISO C style function definitions");
 | 
      
         | 7926 |  |  |  
 | 
      
         | 7927 |  |  |   /* Now make all the parameter declarations visible in the function body.
 | 
      
         | 7928 |  |  |      We can bypass most of the grunt work of pushdecl.  */
 | 
      
         | 7929 |  |  |   for (decl = arg_info->parms; decl; decl = DECL_CHAIN (decl))
 | 
      
         | 7930 |  |  |     {
 | 
      
         | 7931 |  |  |       DECL_CONTEXT (decl) = current_function_decl;
 | 
      
         | 7932 |  |  |       if (DECL_NAME (decl))
 | 
      
         | 7933 |  |  |         {
 | 
      
         | 7934 |  |  |           bind (DECL_NAME (decl), decl, current_scope,
 | 
      
         | 7935 |  |  |                 /*invisible=*/false, /*nested=*/false,
 | 
      
         | 7936 |  |  |                 UNKNOWN_LOCATION);
 | 
      
         | 7937 |  |  |           if (!TREE_USED (decl))
 | 
      
         | 7938 |  |  |             warn_if_shadowing (decl);
 | 
      
         | 7939 |  |  |         }
 | 
      
         | 7940 |  |  |       else
 | 
      
         | 7941 |  |  |         error_at (DECL_SOURCE_LOCATION (decl), "parameter name omitted");
 | 
      
         | 7942 |  |  |     }
 | 
      
         | 7943 |  |  |  
 | 
      
         | 7944 |  |  |   /* Record the parameter list in the function declaration.  */
 | 
      
         | 7945 |  |  |   DECL_ARGUMENTS (fndecl) = arg_info->parms;
 | 
      
         | 7946 |  |  |  
 | 
      
         | 7947 |  |  |   /* Now make all the ancillary declarations visible, likewise.  */
 | 
      
         | 7948 |  |  |   for (decl = arg_info->others; decl; decl = DECL_CHAIN (decl))
 | 
      
         | 7949 |  |  |     {
 | 
      
         | 7950 |  |  |       DECL_CONTEXT (decl) = current_function_decl;
 | 
      
         | 7951 |  |  |       if (DECL_NAME (decl))
 | 
      
         | 7952 |  |  |         bind (DECL_NAME (decl), decl, current_scope,
 | 
      
         | 7953 |  |  |               /*invisible=*/false,
 | 
      
         | 7954 |  |  |               /*nested=*/(TREE_CODE (decl) == FUNCTION_DECL),
 | 
      
         | 7955 |  |  |               UNKNOWN_LOCATION);
 | 
      
         | 7956 |  |  |     }
 | 
      
         | 7957 |  |  |  
 | 
      
         | 7958 |  |  |   /* And all the tag declarations.  */
 | 
      
         | 7959 |  |  |   FOR_EACH_VEC_ELT_REVERSE (c_arg_tag, arg_info->tags, ix, tag)
 | 
      
         | 7960 |  |  |     if (tag->id)
 | 
      
         | 7961 |  |  |       bind (tag->id, tag->type, current_scope,
 | 
      
         | 7962 |  |  |             /*invisible=*/false, /*nested=*/false, UNKNOWN_LOCATION);
 | 
      
         | 7963 |  |  | }
 | 
      
         | 7964 |  |  |  
 | 
      
         | 7965 |  |  | /* Subroutine of store_parm_decls which handles old-style function
 | 
      
         | 7966 |  |  |    definitions (separate parameter list and declarations).  */
 | 
      
         | 7967 |  |  |  
 | 
      
         | 7968 |  |  | static void
 | 
      
         | 7969 |  |  | store_parm_decls_oldstyle (tree fndecl, const struct c_arg_info *arg_info)
 | 
      
         | 7970 |  |  | {
 | 
      
         | 7971 |  |  |   struct c_binding *b;
 | 
      
         | 7972 |  |  |   tree parm, decl, last;
 | 
      
         | 7973 |  |  |   tree parmids = arg_info->parms;
 | 
      
         | 7974 |  |  |   struct pointer_set_t *seen_args = pointer_set_create ();
 | 
      
         | 7975 |  |  |  
 | 
      
         | 7976 |  |  |   if (!in_system_header)
 | 
      
         | 7977 |  |  |     warning_at (DECL_SOURCE_LOCATION (fndecl),
 | 
      
         | 7978 |  |  |                 OPT_Wold_style_definition, "old-style function definition");
 | 
      
         | 7979 |  |  |  
 | 
      
         | 7980 |  |  |   /* Match each formal parameter name with its declaration.  Save each
 | 
      
         | 7981 |  |  |      decl in the appropriate TREE_PURPOSE slot of the parmids chain.  */
 | 
      
         | 7982 |  |  |   for (parm = parmids; parm; parm = TREE_CHAIN (parm))
 | 
      
         | 7983 |  |  |     {
 | 
      
         | 7984 |  |  |       if (TREE_VALUE (parm) == 0)
 | 
      
         | 7985 |  |  |         {
 | 
      
         | 7986 |  |  |           error_at (DECL_SOURCE_LOCATION (fndecl),
 | 
      
         | 7987 |  |  |                     "parameter name missing from parameter list");
 | 
      
         | 7988 |  |  |           TREE_PURPOSE (parm) = 0;
 | 
      
         | 7989 |  |  |           continue;
 | 
      
         | 7990 |  |  |         }
 | 
      
         | 7991 |  |  |  
 | 
      
         | 7992 |  |  |       b = I_SYMBOL_BINDING (TREE_VALUE (parm));
 | 
      
         | 7993 |  |  |       if (b && B_IN_CURRENT_SCOPE (b))
 | 
      
         | 7994 |  |  |         {
 | 
      
         | 7995 |  |  |           decl = b->decl;
 | 
      
         | 7996 |  |  |           /* Skip erroneous parameters.  */
 | 
      
         | 7997 |  |  |           if (decl == error_mark_node)
 | 
      
         | 7998 |  |  |             continue;
 | 
      
         | 7999 |  |  |           /* If we got something other than a PARM_DECL it is an error.  */
 | 
      
         | 8000 |  |  |           if (TREE_CODE (decl) != PARM_DECL)
 | 
      
         | 8001 |  |  |             error_at (DECL_SOURCE_LOCATION (decl),
 | 
      
         | 8002 |  |  |                       "%qD declared as a non-parameter", decl);
 | 
      
         | 8003 |  |  |           /* If the declaration is already marked, we have a duplicate
 | 
      
         | 8004 |  |  |              name.  Complain and ignore the duplicate.  */
 | 
      
         | 8005 |  |  |           else if (pointer_set_contains (seen_args, decl))
 | 
      
         | 8006 |  |  |             {
 | 
      
         | 8007 |  |  |               error_at (DECL_SOURCE_LOCATION (decl),
 | 
      
         | 8008 |  |  |                         "multiple parameters named %qD", decl);
 | 
      
         | 8009 |  |  |               TREE_PURPOSE (parm) = 0;
 | 
      
         | 8010 |  |  |               continue;
 | 
      
         | 8011 |  |  |             }
 | 
      
         | 8012 |  |  |           /* If the declaration says "void", complain and turn it into
 | 
      
         | 8013 |  |  |              an int.  */
 | 
      
         | 8014 |  |  |           else if (VOID_TYPE_P (TREE_TYPE (decl)))
 | 
      
         | 8015 |  |  |             {
 | 
      
         | 8016 |  |  |               error_at (DECL_SOURCE_LOCATION (decl),
 | 
      
         | 8017 |  |  |                         "parameter %qD declared with void type", decl);
 | 
      
         | 8018 |  |  |               TREE_TYPE (decl) = integer_type_node;
 | 
      
         | 8019 |  |  |               DECL_ARG_TYPE (decl) = integer_type_node;
 | 
      
         | 8020 |  |  |               layout_decl (decl, 0);
 | 
      
         | 8021 |  |  |             }
 | 
      
         | 8022 |  |  |           warn_if_shadowing (decl);
 | 
      
         | 8023 |  |  |         }
 | 
      
         | 8024 |  |  |       /* If no declaration found, default to int.  */
 | 
      
         | 8025 |  |  |       else
 | 
      
         | 8026 |  |  |         {
 | 
      
         | 8027 |  |  |           /* FIXME diagnostics: This should be the location of the argument,
 | 
      
         | 8028 |  |  |              not the FNDECL.  E.g., for an old-style declaration
 | 
      
         | 8029 |  |  |  
 | 
      
         | 8030 |  |  |                int f10(v) { blah; }
 | 
      
         | 8031 |  |  |  
 | 
      
         | 8032 |  |  |              We should use the location of the V, not the F10.
 | 
      
         | 8033 |  |  |              Unfortunately, the V is an IDENTIFIER_NODE which has no
 | 
      
         | 8034 |  |  |              location.  In the future we need locations for c_arg_info
 | 
      
         | 8035 |  |  |              entries.
 | 
      
         | 8036 |  |  |  
 | 
      
         | 8037 |  |  |              See gcc.dg/Wshadow-3.c for an example of this problem. */
 | 
      
         | 8038 |  |  |           decl = build_decl (DECL_SOURCE_LOCATION (fndecl),
 | 
      
         | 8039 |  |  |                              PARM_DECL, TREE_VALUE (parm), integer_type_node);
 | 
      
         | 8040 |  |  |           DECL_ARG_TYPE (decl) = TREE_TYPE (decl);
 | 
      
         | 8041 |  |  |           pushdecl (decl);
 | 
      
         | 8042 |  |  |           warn_if_shadowing (decl);
 | 
      
         | 8043 |  |  |  
 | 
      
         | 8044 |  |  |           if (flag_isoc99)
 | 
      
         | 8045 |  |  |             pedwarn (DECL_SOURCE_LOCATION (decl),
 | 
      
         | 8046 |  |  |                      0, "type of %qD defaults to %<int%>", decl);
 | 
      
         | 8047 |  |  |           else
 | 
      
         | 8048 |  |  |             warning_at (DECL_SOURCE_LOCATION (decl),
 | 
      
         | 8049 |  |  |                         OPT_Wmissing_parameter_type,
 | 
      
         | 8050 |  |  |                         "type of %qD defaults to %<int%>", decl);
 | 
      
         | 8051 |  |  |         }
 | 
      
         | 8052 |  |  |  
 | 
      
         | 8053 |  |  |       TREE_PURPOSE (parm) = decl;
 | 
      
         | 8054 |  |  |       pointer_set_insert (seen_args, decl);
 | 
      
         | 8055 |  |  |     }
 | 
      
         | 8056 |  |  |  
 | 
      
         | 8057 |  |  |   /* Now examine the parms chain for incomplete declarations
 | 
      
         | 8058 |  |  |      and declarations with no corresponding names.  */
 | 
      
         | 8059 |  |  |  
 | 
      
         | 8060 |  |  |   for (b = current_scope->bindings; b; b = b->prev)
 | 
      
         | 8061 |  |  |     {
 | 
      
         | 8062 |  |  |       parm = b->decl;
 | 
      
         | 8063 |  |  |       if (TREE_CODE (parm) != PARM_DECL)
 | 
      
         | 8064 |  |  |         continue;
 | 
      
         | 8065 |  |  |  
 | 
      
         | 8066 |  |  |       if (TREE_TYPE (parm) != error_mark_node
 | 
      
         | 8067 |  |  |           && !COMPLETE_TYPE_P (TREE_TYPE (parm)))
 | 
      
         | 8068 |  |  |         {
 | 
      
         | 8069 |  |  |           error_at (DECL_SOURCE_LOCATION (parm),
 | 
      
         | 8070 |  |  |                     "parameter %qD has incomplete type", parm);
 | 
      
         | 8071 |  |  |           TREE_TYPE (parm) = error_mark_node;
 | 
      
         | 8072 |  |  |         }
 | 
      
         | 8073 |  |  |  
 | 
      
         | 8074 |  |  |       if (!pointer_set_contains (seen_args, parm))
 | 
      
         | 8075 |  |  |         {
 | 
      
         | 8076 |  |  |           error_at (DECL_SOURCE_LOCATION (parm),
 | 
      
         | 8077 |  |  |                     "declaration for parameter %qD but no such parameter",
 | 
      
         | 8078 |  |  |                     parm);
 | 
      
         | 8079 |  |  |  
 | 
      
         | 8080 |  |  |           /* Pretend the parameter was not missing.
 | 
      
         | 8081 |  |  |              This gets us to a standard state and minimizes
 | 
      
         | 8082 |  |  |              further error messages.  */
 | 
      
         | 8083 |  |  |           parmids = chainon (parmids, tree_cons (parm, 0, 0));
 | 
      
         | 8084 |  |  |         }
 | 
      
         | 8085 |  |  |     }
 | 
      
         | 8086 |  |  |  
 | 
      
         | 8087 |  |  |   /* Chain the declarations together in the order of the list of
 | 
      
         | 8088 |  |  |      names.  Store that chain in the function decl, replacing the
 | 
      
         | 8089 |  |  |      list of names.  Update the current scope to match.  */
 | 
      
         | 8090 |  |  |   DECL_ARGUMENTS (fndecl) = 0;
 | 
      
         | 8091 |  |  |  
 | 
      
         | 8092 |  |  |   for (parm = parmids; parm; parm = TREE_CHAIN (parm))
 | 
      
         | 8093 |  |  |     if (TREE_PURPOSE (parm))
 | 
      
         | 8094 |  |  |       break;
 | 
      
         | 8095 |  |  |   if (parm && TREE_PURPOSE (parm))
 | 
      
         | 8096 |  |  |     {
 | 
      
         | 8097 |  |  |       last = TREE_PURPOSE (parm);
 | 
      
         | 8098 |  |  |       DECL_ARGUMENTS (fndecl) = last;
 | 
      
         | 8099 |  |  |  
 | 
      
         | 8100 |  |  |       for (parm = TREE_CHAIN (parm); parm; parm = TREE_CHAIN (parm))
 | 
      
         | 8101 |  |  |         if (TREE_PURPOSE (parm))
 | 
      
         | 8102 |  |  |           {
 | 
      
         | 8103 |  |  |             DECL_CHAIN (last) = TREE_PURPOSE (parm);
 | 
      
         | 8104 |  |  |             last = TREE_PURPOSE (parm);
 | 
      
         | 8105 |  |  |           }
 | 
      
         | 8106 |  |  |       DECL_CHAIN (last) = 0;
 | 
      
         | 8107 |  |  |     }
 | 
      
         | 8108 |  |  |  
 | 
      
         | 8109 |  |  |   pointer_set_destroy (seen_args);
 | 
      
         | 8110 |  |  |  
 | 
      
         | 8111 |  |  |   /* If there was a previous prototype,
 | 
      
         | 8112 |  |  |      set the DECL_ARG_TYPE of each argument according to
 | 
      
         | 8113 |  |  |      the type previously specified, and report any mismatches.  */
 | 
      
         | 8114 |  |  |  
 | 
      
         | 8115 |  |  |   if (current_function_prototype_arg_types)
 | 
      
         | 8116 |  |  |     {
 | 
      
         | 8117 |  |  |       tree type;
 | 
      
         | 8118 |  |  |       for (parm = DECL_ARGUMENTS (fndecl),
 | 
      
         | 8119 |  |  |              type = current_function_prototype_arg_types;
 | 
      
         | 8120 |  |  |            parm || (type && TREE_VALUE (type) != error_mark_node
 | 
      
         | 8121 |  |  |                    && (TYPE_MAIN_VARIANT (TREE_VALUE (type)) != void_type_node));
 | 
      
         | 8122 |  |  |            parm = DECL_CHAIN (parm), type = TREE_CHAIN (type))
 | 
      
         | 8123 |  |  |         {
 | 
      
         | 8124 |  |  |           if (parm == 0 || type == 0
 | 
      
         | 8125 |  |  |               || TYPE_MAIN_VARIANT (TREE_VALUE (type)) == void_type_node)
 | 
      
         | 8126 |  |  |             {
 | 
      
         | 8127 |  |  |               if (current_function_prototype_built_in)
 | 
      
         | 8128 |  |  |                 warning_at (DECL_SOURCE_LOCATION (fndecl),
 | 
      
         | 8129 |  |  |                             0, "number of arguments doesn%'t match "
 | 
      
         | 8130 |  |  |                             "built-in prototype");
 | 
      
         | 8131 |  |  |               else
 | 
      
         | 8132 |  |  |                 {
 | 
      
         | 8133 |  |  |                   /* FIXME diagnostics: This should be the location of
 | 
      
         | 8134 |  |  |                      FNDECL, but there is bug when a prototype is
 | 
      
         | 8135 |  |  |                      declared inside function context, but defined
 | 
      
         | 8136 |  |  |                      outside of it (e.g., gcc.dg/pr15698-2.c).  In
 | 
      
         | 8137 |  |  |                      which case FNDECL gets the location of the
 | 
      
         | 8138 |  |  |                      prototype, not the definition.  */
 | 
      
         | 8139 |  |  |                   error_at (input_location,
 | 
      
         | 8140 |  |  |                             "number of arguments doesn%'t match prototype");
 | 
      
         | 8141 |  |  |  
 | 
      
         | 8142 |  |  |                   error_at (current_function_prototype_locus,
 | 
      
         | 8143 |  |  |                             "prototype declaration");
 | 
      
         | 8144 |  |  |                 }
 | 
      
         | 8145 |  |  |               break;
 | 
      
         | 8146 |  |  |             }
 | 
      
         | 8147 |  |  |           /* Type for passing arg must be consistent with that
 | 
      
         | 8148 |  |  |              declared for the arg.  ISO C says we take the unqualified
 | 
      
         | 8149 |  |  |              type for parameters declared with qualified type.  */
 | 
      
         | 8150 |  |  |           if (TREE_TYPE (parm) != error_mark_node
 | 
      
         | 8151 |  |  |               && TREE_TYPE (type) != error_mark_node
 | 
      
         | 8152 |  |  |               && !comptypes (TYPE_MAIN_VARIANT (DECL_ARG_TYPE (parm)),
 | 
      
         | 8153 |  |  |                              TYPE_MAIN_VARIANT (TREE_VALUE (type))))
 | 
      
         | 8154 |  |  |             {
 | 
      
         | 8155 |  |  |               if (TYPE_MAIN_VARIANT (TREE_TYPE (parm))
 | 
      
         | 8156 |  |  |                   == TYPE_MAIN_VARIANT (TREE_VALUE (type)))
 | 
      
         | 8157 |  |  |                 {
 | 
      
         | 8158 |  |  |                   /* Adjust argument to match prototype.  E.g. a previous
 | 
      
         | 8159 |  |  |                      `int foo(float);' prototype causes
 | 
      
         | 8160 |  |  |                      `int foo(x) float x; {...}' to be treated like
 | 
      
         | 8161 |  |  |                      `int foo(float x) {...}'.  This is particularly
 | 
      
         | 8162 |  |  |                      useful for argument types like uid_t.  */
 | 
      
         | 8163 |  |  |                   DECL_ARG_TYPE (parm) = TREE_TYPE (parm);
 | 
      
         | 8164 |  |  |  
 | 
      
         | 8165 |  |  |                   if (targetm.calls.promote_prototypes (TREE_TYPE (current_function_decl))
 | 
      
         | 8166 |  |  |                       && INTEGRAL_TYPE_P (TREE_TYPE (parm))
 | 
      
         | 8167 |  |  |                       && TYPE_PRECISION (TREE_TYPE (parm))
 | 
      
         | 8168 |  |  |                       < TYPE_PRECISION (integer_type_node))
 | 
      
         | 8169 |  |  |                     DECL_ARG_TYPE (parm) = integer_type_node;
 | 
      
         | 8170 |  |  |  
 | 
      
         | 8171 |  |  |                   /* ??? Is it possible to get here with a
 | 
      
         | 8172 |  |  |                      built-in prototype or will it always have
 | 
      
         | 8173 |  |  |                      been diagnosed as conflicting with an
 | 
      
         | 8174 |  |  |                      old-style definition and discarded?  */
 | 
      
         | 8175 |  |  |                   if (current_function_prototype_built_in)
 | 
      
         | 8176 |  |  |                     warning_at (DECL_SOURCE_LOCATION (parm),
 | 
      
         | 8177 |  |  |                                 OPT_pedantic, "promoted argument %qD "
 | 
      
         | 8178 |  |  |                                 "doesn%'t match built-in prototype", parm);
 | 
      
         | 8179 |  |  |                   else
 | 
      
         | 8180 |  |  |                     {
 | 
      
         | 8181 |  |  |                       pedwarn (DECL_SOURCE_LOCATION (parm),
 | 
      
         | 8182 |  |  |                                OPT_pedantic, "promoted argument %qD "
 | 
      
         | 8183 |  |  |                                "doesn%'t match prototype", parm);
 | 
      
         | 8184 |  |  |                       pedwarn (current_function_prototype_locus, OPT_pedantic,
 | 
      
         | 8185 |  |  |                                "prototype declaration");
 | 
      
         | 8186 |  |  |                     }
 | 
      
         | 8187 |  |  |                 }
 | 
      
         | 8188 |  |  |               else
 | 
      
         | 8189 |  |  |                 {
 | 
      
         | 8190 |  |  |                   if (current_function_prototype_built_in)
 | 
      
         | 8191 |  |  |                     warning_at (DECL_SOURCE_LOCATION (parm),
 | 
      
         | 8192 |  |  |                                 0, "argument %qD doesn%'t match "
 | 
      
         | 8193 |  |  |                                 "built-in prototype", parm);
 | 
      
         | 8194 |  |  |                   else
 | 
      
         | 8195 |  |  |                     {
 | 
      
         | 8196 |  |  |                       error_at (DECL_SOURCE_LOCATION (parm),
 | 
      
         | 8197 |  |  |                                 "argument %qD doesn%'t match prototype", parm);
 | 
      
         | 8198 |  |  |                       error_at (current_function_prototype_locus,
 | 
      
         | 8199 |  |  |                                 "prototype declaration");
 | 
      
         | 8200 |  |  |                     }
 | 
      
         | 8201 |  |  |                 }
 | 
      
         | 8202 |  |  |             }
 | 
      
         | 8203 |  |  |         }
 | 
      
         | 8204 |  |  |       TYPE_ACTUAL_ARG_TYPES (TREE_TYPE (fndecl)) = 0;
 | 
      
         | 8205 |  |  |     }
 | 
      
         | 8206 |  |  |  
 | 
      
         | 8207 |  |  |   /* Otherwise, create a prototype that would match.  */
 | 
      
         | 8208 |  |  |  
 | 
      
         | 8209 |  |  |   else
 | 
      
         | 8210 |  |  |     {
 | 
      
         | 8211 |  |  |       tree actual = 0, last = 0, type;
 | 
      
         | 8212 |  |  |  
 | 
      
         | 8213 |  |  |       for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
 | 
      
         | 8214 |  |  |         {
 | 
      
         | 8215 |  |  |           type = tree_cons (NULL_TREE, DECL_ARG_TYPE (parm), NULL_TREE);
 | 
      
         | 8216 |  |  |           if (last)
 | 
      
         | 8217 |  |  |             TREE_CHAIN (last) = type;
 | 
      
         | 8218 |  |  |           else
 | 
      
         | 8219 |  |  |             actual = type;
 | 
      
         | 8220 |  |  |           last = type;
 | 
      
         | 8221 |  |  |         }
 | 
      
         | 8222 |  |  |       type = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
 | 
      
         | 8223 |  |  |       if (last)
 | 
      
         | 8224 |  |  |         TREE_CHAIN (last) = type;
 | 
      
         | 8225 |  |  |       else
 | 
      
         | 8226 |  |  |         actual = type;
 | 
      
         | 8227 |  |  |  
 | 
      
         | 8228 |  |  |       /* We are going to assign a new value for the TYPE_ACTUAL_ARG_TYPES
 | 
      
         | 8229 |  |  |          of the type of this function, but we need to avoid having this
 | 
      
         | 8230 |  |  |          affect the types of other similarly-typed functions, so we must
 | 
      
         | 8231 |  |  |          first force the generation of an identical (but separate) type
 | 
      
         | 8232 |  |  |          node for the relevant function type.  The new node we create
 | 
      
         | 8233 |  |  |          will be a variant of the main variant of the original function
 | 
      
         | 8234 |  |  |          type.  */
 | 
      
         | 8235 |  |  |  
 | 
      
         | 8236 |  |  |       TREE_TYPE (fndecl) = build_variant_type_copy (TREE_TYPE (fndecl));
 | 
      
         | 8237 |  |  |  
 | 
      
         | 8238 |  |  |       TYPE_ACTUAL_ARG_TYPES (TREE_TYPE (fndecl)) = actual;
 | 
      
         | 8239 |  |  |     }
 | 
      
         | 8240 |  |  | }
 | 
      
         | 8241 |  |  |  
 | 
      
         | 8242 |  |  | /* Store parameter declarations passed in ARG_INFO into the current
 | 
      
         | 8243 |  |  |    function declaration.  */
 | 
      
         | 8244 |  |  |  
 | 
      
         | 8245 |  |  | void
 | 
      
         | 8246 |  |  | store_parm_decls_from (struct c_arg_info *arg_info)
 | 
      
         | 8247 |  |  | {
 | 
      
         | 8248 |  |  |   current_function_arg_info = arg_info;
 | 
      
         | 8249 |  |  |   store_parm_decls ();
 | 
      
         | 8250 |  |  | }
 | 
      
         | 8251 |  |  |  
 | 
      
         | 8252 |  |  | /* Store the parameter declarations into the current function declaration.
 | 
      
         | 8253 |  |  |    This is called after parsing the parameter declarations, before
 | 
      
         | 8254 |  |  |    digesting the body of the function.
 | 
      
         | 8255 |  |  |  
 | 
      
         | 8256 |  |  |    For an old-style definition, construct a prototype out of the old-style
 | 
      
         | 8257 |  |  |    parameter declarations and inject it into the function's type.  */
 | 
      
         | 8258 |  |  |  
 | 
      
         | 8259 |  |  | void
 | 
      
         | 8260 |  |  | store_parm_decls (void)
 | 
      
         | 8261 |  |  | {
 | 
      
         | 8262 |  |  |   tree fndecl = current_function_decl;
 | 
      
         | 8263 |  |  |   bool proto;
 | 
      
         | 8264 |  |  |  
 | 
      
         | 8265 |  |  |   /* The argument information block for FNDECL.  */
 | 
      
         | 8266 |  |  |   struct c_arg_info *arg_info = current_function_arg_info;
 | 
      
         | 8267 |  |  |   current_function_arg_info = 0;
 | 
      
         | 8268 |  |  |  
 | 
      
         | 8269 |  |  |   /* True if this definition is written with a prototype.  Note:
 | 
      
         | 8270 |  |  |      despite C99 6.7.5.3p14, we can *not* treat an empty argument
 | 
      
         | 8271 |  |  |      list in a function definition as equivalent to (void) -- an
 | 
      
         | 8272 |  |  |      empty argument list specifies the function has no parameters,
 | 
      
         | 8273 |  |  |      but only (void) sets up a prototype for future calls.  */
 | 
      
         | 8274 |  |  |   proto = arg_info->types != 0;
 | 
      
         | 8275 |  |  |  
 | 
      
         | 8276 |  |  |   if (proto)
 | 
      
         | 8277 |  |  |     store_parm_decls_newstyle (fndecl, arg_info);
 | 
      
         | 8278 |  |  |   else
 | 
      
         | 8279 |  |  |     store_parm_decls_oldstyle (fndecl, arg_info);
 | 
      
         | 8280 |  |  |  
 | 
      
         | 8281 |  |  |   /* The next call to push_scope will be a function body.  */
 | 
      
         | 8282 |  |  |  
 | 
      
         | 8283 |  |  |   next_is_function_body = true;
 | 
      
         | 8284 |  |  |  
 | 
      
         | 8285 |  |  |   /* Write a record describing this function definition to the prototypes
 | 
      
         | 8286 |  |  |      file (if requested).  */
 | 
      
         | 8287 |  |  |  
 | 
      
         | 8288 |  |  |   gen_aux_info_record (fndecl, 1, 0, proto);
 | 
      
         | 8289 |  |  |  
 | 
      
         | 8290 |  |  |   /* Initialize the RTL code for the function.  */
 | 
      
         | 8291 |  |  |   allocate_struct_function (fndecl, false);
 | 
      
         | 8292 |  |  |  
 | 
      
         | 8293 |  |  |   if (warn_unused_local_typedefs)
 | 
      
         | 8294 |  |  |     cfun->language = ggc_alloc_cleared_language_function ();
 | 
      
         | 8295 |  |  |  
 | 
      
         | 8296 |  |  |   /* Begin the statement tree for this function.  */
 | 
      
         | 8297 |  |  |   DECL_SAVED_TREE (fndecl) = push_stmt_list ();
 | 
      
         | 8298 |  |  |  
 | 
      
         | 8299 |  |  |   /* ??? Insert the contents of the pending sizes list into the function
 | 
      
         | 8300 |  |  |      to be evaluated.  The only reason left to have this is
 | 
      
         | 8301 |  |  |         void foo(int n, int array[n++])
 | 
      
         | 8302 |  |  |      because we throw away the array type in favor of a pointer type, and
 | 
      
         | 8303 |  |  |      thus won't naturally see the SAVE_EXPR containing the increment.  All
 | 
      
         | 8304 |  |  |      other pending sizes would be handled by gimplify_parameters.  */
 | 
      
         | 8305 |  |  |   if (arg_info->pending_sizes)
 | 
      
         | 8306 |  |  |     add_stmt (arg_info->pending_sizes);
 | 
      
         | 8307 |  |  | }
 | 
      
         | 8308 |  |  |  
 | 
      
         | 8309 |  |  |  
 | 
      
         | 8310 |  |  | /* Finish up a function declaration and compile that function
 | 
      
         | 8311 |  |  |    all the way to assembler language output.  Then free the storage
 | 
      
         | 8312 |  |  |    for the function definition.
 | 
      
         | 8313 |  |  |  
 | 
      
         | 8314 |  |  |    This is called after parsing the body of the function definition.  */
 | 
      
         | 8315 |  |  |  
 | 
      
         | 8316 |  |  | void
 | 
      
         | 8317 |  |  | finish_function (void)
 | 
      
         | 8318 |  |  | {
 | 
      
         | 8319 |  |  |   tree fndecl = current_function_decl;
 | 
      
         | 8320 |  |  |  
 | 
      
         | 8321 |  |  |   if (c_dialect_objc ())
 | 
      
         | 8322 |  |  |     objc_finish_function ();
 | 
      
         | 8323 |  |  |  
 | 
      
         | 8324 |  |  |   if (TREE_CODE (fndecl) == FUNCTION_DECL
 | 
      
         | 8325 |  |  |       && targetm.calls.promote_prototypes (TREE_TYPE (fndecl)))
 | 
      
         | 8326 |  |  |     {
 | 
      
         | 8327 |  |  |       tree args = DECL_ARGUMENTS (fndecl);
 | 
      
         | 8328 |  |  |       for (; args; args = DECL_CHAIN (args))
 | 
      
         | 8329 |  |  |         {
 | 
      
         | 8330 |  |  |           tree type = TREE_TYPE (args);
 | 
      
         | 8331 |  |  |           if (INTEGRAL_TYPE_P (type)
 | 
      
         | 8332 |  |  |               && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))
 | 
      
         | 8333 |  |  |             DECL_ARG_TYPE (args) = integer_type_node;
 | 
      
         | 8334 |  |  |         }
 | 
      
         | 8335 |  |  |     }
 | 
      
         | 8336 |  |  |  
 | 
      
         | 8337 |  |  |   if (DECL_INITIAL (fndecl) && DECL_INITIAL (fndecl) != error_mark_node)
 | 
      
         | 8338 |  |  |     BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
 | 
      
         | 8339 |  |  |  
 | 
      
         | 8340 |  |  |   /* Must mark the RESULT_DECL as being in this function.  */
 | 
      
         | 8341 |  |  |  
 | 
      
         | 8342 |  |  |   if (DECL_RESULT (fndecl) && DECL_RESULT (fndecl) != error_mark_node)
 | 
      
         | 8343 |  |  |     DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl;
 | 
      
         | 8344 |  |  |  
 | 
      
         | 8345 |  |  |   if (MAIN_NAME_P (DECL_NAME (fndecl)) && flag_hosted
 | 
      
         | 8346 |  |  |       && TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (fndecl)))
 | 
      
         | 8347 |  |  |       == integer_type_node && flag_isoc99)
 | 
      
         | 8348 |  |  |     {
 | 
      
         | 8349 |  |  |       /* Hack.  We don't want the middle-end to warn that this return
 | 
      
         | 8350 |  |  |          is unreachable, so we mark its location as special.  Using
 | 
      
         | 8351 |  |  |          UNKNOWN_LOCATION has the problem that it gets clobbered in
 | 
      
         | 8352 |  |  |          annotate_one_with_locus.  A cleaner solution might be to
 | 
      
         | 8353 |  |  |          ensure ! should_carry_locus_p (stmt), but that needs a flag.
 | 
      
         | 8354 |  |  |       */
 | 
      
         | 8355 |  |  |       c_finish_return (BUILTINS_LOCATION, integer_zero_node, NULL_TREE);
 | 
      
         | 8356 |  |  |     }
 | 
      
         | 8357 |  |  |  
 | 
      
         | 8358 |  |  |   /* Tie off the statement tree for this function.  */
 | 
      
         | 8359 |  |  |   DECL_SAVED_TREE (fndecl) = pop_stmt_list (DECL_SAVED_TREE (fndecl));
 | 
      
         | 8360 |  |  |  
 | 
      
         | 8361 |  |  |   finish_fname_decls ();
 | 
      
         | 8362 |  |  |  
 | 
      
         | 8363 |  |  |   /* Complain if there's just no return statement.  */
 | 
      
         | 8364 |  |  |   if (warn_return_type
 | 
      
         | 8365 |  |  |       && TREE_CODE (TREE_TYPE (TREE_TYPE (fndecl))) != VOID_TYPE
 | 
      
         | 8366 |  |  |       && !current_function_returns_value && !current_function_returns_null
 | 
      
         | 8367 |  |  |       /* Don't complain if we are no-return.  */
 | 
      
         | 8368 |  |  |       && !current_function_returns_abnormally
 | 
      
         | 8369 |  |  |       /* Don't complain if we are declared noreturn.  */
 | 
      
         | 8370 |  |  |       && !TREE_THIS_VOLATILE (fndecl)
 | 
      
         | 8371 |  |  |       /* Don't warn for main().  */
 | 
      
         | 8372 |  |  |       && !MAIN_NAME_P (DECL_NAME (fndecl))
 | 
      
         | 8373 |  |  |       /* Or if they didn't actually specify a return type.  */
 | 
      
         | 8374 |  |  |       && !C_FUNCTION_IMPLICIT_INT (fndecl)
 | 
      
         | 8375 |  |  |       /* Normally, with -Wreturn-type, flow will complain, but we might
 | 
      
         | 8376 |  |  |          optimize out static functions.  */
 | 
      
         | 8377 |  |  |       && !TREE_PUBLIC (fndecl))
 | 
      
         | 8378 |  |  |     {
 | 
      
         | 8379 |  |  |       warning (OPT_Wreturn_type,
 | 
      
         | 8380 |  |  |                "no return statement in function returning non-void");
 | 
      
         | 8381 |  |  |       TREE_NO_WARNING (fndecl) = 1;
 | 
      
         | 8382 |  |  |     }
 | 
      
         | 8383 |  |  |  
 | 
      
         | 8384 |  |  |   /* Complain about parameters that are only set, but never otherwise used.  */
 | 
      
         | 8385 |  |  |   if (warn_unused_but_set_parameter)
 | 
      
         | 8386 |  |  |     {
 | 
      
         | 8387 |  |  |       tree decl;
 | 
      
         | 8388 |  |  |  
 | 
      
         | 8389 |  |  |       for (decl = DECL_ARGUMENTS (fndecl);
 | 
      
         | 8390 |  |  |            decl;
 | 
      
         | 8391 |  |  |            decl = DECL_CHAIN (decl))
 | 
      
         | 8392 |  |  |         if (TREE_USED (decl)
 | 
      
         | 8393 |  |  |             && TREE_CODE (decl) == PARM_DECL
 | 
      
         | 8394 |  |  |             && !DECL_READ_P (decl)
 | 
      
         | 8395 |  |  |             && DECL_NAME (decl)
 | 
      
         | 8396 |  |  |             && !DECL_ARTIFICIAL (decl)
 | 
      
         | 8397 |  |  |             && !TREE_NO_WARNING (decl))
 | 
      
         | 8398 |  |  |           warning_at (DECL_SOURCE_LOCATION (decl),
 | 
      
         | 8399 |  |  |                       OPT_Wunused_but_set_parameter,
 | 
      
         | 8400 |  |  |                       "parameter %qD set but not used", decl);
 | 
      
         | 8401 |  |  |     }
 | 
      
         | 8402 |  |  |  
 | 
      
         | 8403 |  |  |   /* Complain about locally defined typedefs that are not used in this
 | 
      
         | 8404 |  |  |      function.  */
 | 
      
         | 8405 |  |  |   maybe_warn_unused_local_typedefs ();
 | 
      
         | 8406 |  |  |  
 | 
      
         | 8407 |  |  |   /* Store the end of the function, so that we get good line number
 | 
      
         | 8408 |  |  |      info for the epilogue.  */
 | 
      
         | 8409 |  |  |   cfun->function_end_locus = input_location;
 | 
      
         | 8410 |  |  |  
 | 
      
         | 8411 |  |  |   /* Finalize the ELF visibility for the function.  */
 | 
      
         | 8412 |  |  |   c_determine_visibility (fndecl);
 | 
      
         | 8413 |  |  |  
 | 
      
         | 8414 |  |  |   /* For GNU C extern inline functions disregard inline limits.  */
 | 
      
         | 8415 |  |  |   if (DECL_EXTERNAL (fndecl)
 | 
      
         | 8416 |  |  |       && DECL_DECLARED_INLINE_P (fndecl))
 | 
      
         | 8417 |  |  |     DECL_DISREGARD_INLINE_LIMITS (fndecl) = 1;
 | 
      
         | 8418 |  |  |  
 | 
      
         | 8419 |  |  |   /* Genericize before inlining.  Delay genericizing nested functions
 | 
      
         | 8420 |  |  |      until their parent function is genericized.  Since finalizing
 | 
      
         | 8421 |  |  |      requires GENERIC, delay that as well.  */
 | 
      
         | 8422 |  |  |  
 | 
      
         | 8423 |  |  |   if (DECL_INITIAL (fndecl) && DECL_INITIAL (fndecl) != error_mark_node
 | 
      
         | 8424 |  |  |       && !undef_nested_function)
 | 
      
         | 8425 |  |  |     {
 | 
      
         | 8426 |  |  |       if (!decl_function_context (fndecl))
 | 
      
         | 8427 |  |  |         {
 | 
      
         | 8428 |  |  |           invoke_plugin_callbacks (PLUGIN_PRE_GENERICIZE, fndecl);
 | 
      
         | 8429 |  |  |           c_genericize (fndecl);
 | 
      
         | 8430 |  |  |  
 | 
      
         | 8431 |  |  |           /* ??? Objc emits functions after finalizing the compilation unit.
 | 
      
         | 8432 |  |  |              This should be cleaned up later and this conditional removed.  */
 | 
      
         | 8433 |  |  |           if (cgraph_global_info_ready)
 | 
      
         | 8434 |  |  |             {
 | 
      
         | 8435 |  |  |               cgraph_add_new_function (fndecl, false);
 | 
      
         | 8436 |  |  |               return;
 | 
      
         | 8437 |  |  |             }
 | 
      
         | 8438 |  |  |           cgraph_finalize_function (fndecl, false);
 | 
      
         | 8439 |  |  |         }
 | 
      
         | 8440 |  |  |       else
 | 
      
         | 8441 |  |  |         {
 | 
      
         | 8442 |  |  |           /* Register this function with cgraph just far enough to get it
 | 
      
         | 8443 |  |  |             added to our parent's nested function list.  Handy, since the
 | 
      
         | 8444 |  |  |             C front end doesn't have such a list.  */
 | 
      
         | 8445 |  |  |           (void) cgraph_get_create_node (fndecl);
 | 
      
         | 8446 |  |  |         }
 | 
      
         | 8447 |  |  |     }
 | 
      
         | 8448 |  |  |  
 | 
      
         | 8449 |  |  |   if (!decl_function_context (fndecl))
 | 
      
         | 8450 |  |  |     undef_nested_function = false;
 | 
      
         | 8451 |  |  |  
 | 
      
         | 8452 |  |  |   if (cfun->language != NULL)
 | 
      
         | 8453 |  |  |     {
 | 
      
         | 8454 |  |  |       ggc_free (cfun->language);
 | 
      
         | 8455 |  |  |       cfun->language = NULL;
 | 
      
         | 8456 |  |  |     }
 | 
      
         | 8457 |  |  |  
 | 
      
         | 8458 |  |  |   /* We're leaving the context of this function, so zap cfun.
 | 
      
         | 8459 |  |  |      It's still in DECL_STRUCT_FUNCTION, and we'll restore it in
 | 
      
         | 8460 |  |  |      tree_rest_of_compilation.  */
 | 
      
         | 8461 |  |  |   set_cfun (NULL);
 | 
      
         | 8462 |  |  |   current_function_decl = NULL;
 | 
      
         | 8463 |  |  | }
 | 
      
         | 8464 |  |  |  
 | 
      
         | 8465 |  |  | /* Check the declarations given in a for-loop for satisfying the C99
 | 
      
         | 8466 |  |  |    constraints.  If exactly one such decl is found, return it.  LOC is
 | 
      
         | 8467 |  |  |    the location of the opening parenthesis of the for loop.  The last
 | 
      
         | 8468 |  |  |    parameter allows you to control the "for loop initial declarations
 | 
      
         | 8469 |  |  |    are only allowed in C99 mode".  Normally, you should pass
 | 
      
         | 8470 |  |  |    flag_isoc99 as that parameter.  But in some cases (Objective-C
 | 
      
         | 8471 |  |  |    foreach loop, for example) we want to run the checks in this
 | 
      
         | 8472 |  |  |    function even if not in C99 mode, so we allow the caller to turn
 | 
      
         | 8473 |  |  |    off the error about not being in C99 mode.
 | 
      
         | 8474 |  |  | */
 | 
      
         | 8475 |  |  |  
 | 
      
         | 8476 |  |  | tree
 | 
      
         | 8477 |  |  | check_for_loop_decls (location_t loc, bool turn_off_iso_c99_error)
 | 
      
         | 8478 |  |  | {
 | 
      
         | 8479 |  |  |   struct c_binding *b;
 | 
      
         | 8480 |  |  |   tree one_decl = NULL_TREE;
 | 
      
         | 8481 |  |  |   int n_decls = 0;
 | 
      
         | 8482 |  |  |  
 | 
      
         | 8483 |  |  |   if (!turn_off_iso_c99_error)
 | 
      
         | 8484 |  |  |     {
 | 
      
         | 8485 |  |  |       static bool hint = true;
 | 
      
         | 8486 |  |  |       /* If we get here, declarations have been used in a for loop without
 | 
      
         | 8487 |  |  |          the C99 for loop scope.  This doesn't make much sense, so don't
 | 
      
         | 8488 |  |  |          allow it.  */
 | 
      
         | 8489 |  |  |       error_at (loc, "%<for%> loop initial declarations "
 | 
      
         | 8490 |  |  |                 "are only allowed in C99 mode");
 | 
      
         | 8491 |  |  |       if (hint)
 | 
      
         | 8492 |  |  |         {
 | 
      
         | 8493 |  |  |           inform (loc,
 | 
      
         | 8494 |  |  |                   "use option -std=c99 or -std=gnu99 to compile your code");
 | 
      
         | 8495 |  |  |           hint = false;
 | 
      
         | 8496 |  |  |         }
 | 
      
         | 8497 |  |  |       return NULL_TREE;
 | 
      
         | 8498 |  |  |     }
 | 
      
         | 8499 |  |  |   /* C99 subclause 6.8.5 paragraph 3:
 | 
      
         | 8500 |  |  |  
 | 
      
         | 8501 |  |  |        [#3]  The  declaration  part  of  a for statement shall only
 | 
      
         | 8502 |  |  |        declare identifiers for objects having storage class auto or
 | 
      
         | 8503 |  |  |        register.
 | 
      
         | 8504 |  |  |  
 | 
      
         | 8505 |  |  |      It isn't clear whether, in this sentence, "identifiers" binds to
 | 
      
         | 8506 |  |  |      "shall only declare" or to "objects" - that is, whether all identifiers
 | 
      
         | 8507 |  |  |      declared must be identifiers for objects, or whether the restriction
 | 
      
         | 8508 |  |  |      only applies to those that are.  (A question on this in comp.std.c
 | 
      
         | 8509 |  |  |      in November 2000 received no answer.)  We implement the strictest
 | 
      
         | 8510 |  |  |      interpretation, to avoid creating an extension which later causes
 | 
      
         | 8511 |  |  |      problems.  */
 | 
      
         | 8512 |  |  |  
 | 
      
         | 8513 |  |  |   for (b = current_scope->bindings; b; b = b->prev)
 | 
      
         | 8514 |  |  |     {
 | 
      
         | 8515 |  |  |       tree id = b->id;
 | 
      
         | 8516 |  |  |       tree decl = b->decl;
 | 
      
         | 8517 |  |  |  
 | 
      
         | 8518 |  |  |       if (!id)
 | 
      
         | 8519 |  |  |         continue;
 | 
      
         | 8520 |  |  |  
 | 
      
         | 8521 |  |  |       switch (TREE_CODE (decl))
 | 
      
         | 8522 |  |  |         {
 | 
      
         | 8523 |  |  |         case VAR_DECL:
 | 
      
         | 8524 |  |  |           {
 | 
      
         | 8525 |  |  |             location_t decl_loc = DECL_SOURCE_LOCATION (decl);
 | 
      
         | 8526 |  |  |             if (TREE_STATIC (decl))
 | 
      
         | 8527 |  |  |               error_at (decl_loc,
 | 
      
         | 8528 |  |  |                         "declaration of static variable %qD in %<for%> loop "
 | 
      
         | 8529 |  |  |                         "initial declaration", decl);
 | 
      
         | 8530 |  |  |             else if (DECL_EXTERNAL (decl))
 | 
      
         | 8531 |  |  |               error_at (decl_loc,
 | 
      
         | 8532 |  |  |                         "declaration of %<extern%> variable %qD in %<for%> loop "
 | 
      
         | 8533 |  |  |                         "initial declaration", decl);
 | 
      
         | 8534 |  |  |           }
 | 
      
         | 8535 |  |  |           break;
 | 
      
         | 8536 |  |  |  
 | 
      
         | 8537 |  |  |         case RECORD_TYPE:
 | 
      
         | 8538 |  |  |           error_at (loc,
 | 
      
         | 8539 |  |  |                     "%<struct %E%> declared in %<for%> loop initial "
 | 
      
         | 8540 |  |  |                     "declaration", id);
 | 
      
         | 8541 |  |  |           break;
 | 
      
         | 8542 |  |  |         case UNION_TYPE:
 | 
      
         | 8543 |  |  |           error_at (loc,
 | 
      
         | 8544 |  |  |                     "%<union %E%> declared in %<for%> loop initial declaration",
 | 
      
         | 8545 |  |  |                     id);
 | 
      
         | 8546 |  |  |           break;
 | 
      
         | 8547 |  |  |         case ENUMERAL_TYPE:
 | 
      
         | 8548 |  |  |           error_at (loc, "%<enum %E%> declared in %<for%> loop "
 | 
      
         | 8549 |  |  |                     "initial declaration", id);
 | 
      
         | 8550 |  |  |           break;
 | 
      
         | 8551 |  |  |         default:
 | 
      
         | 8552 |  |  |           error_at (loc, "declaration of non-variable "
 | 
      
         | 8553 |  |  |                     "%qD in %<for%> loop initial declaration", decl);
 | 
      
         | 8554 |  |  |         }
 | 
      
         | 8555 |  |  |  
 | 
      
         | 8556 |  |  |       n_decls++;
 | 
      
         | 8557 |  |  |       one_decl = decl;
 | 
      
         | 8558 |  |  |     }
 | 
      
         | 8559 |  |  |  
 | 
      
         | 8560 |  |  |   return n_decls == 1 ? one_decl : NULL_TREE;
 | 
      
         | 8561 |  |  | }
 | 
      
         | 8562 |  |  |  
 | 
      
         | 8563 |  |  | /* Save and reinitialize the variables
 | 
      
         | 8564 |  |  |    used during compilation of a C function.  */
 | 
      
         | 8565 |  |  |  
 | 
      
         | 8566 |  |  | void
 | 
      
         | 8567 |  |  | c_push_function_context (void)
 | 
      
         | 8568 |  |  | {
 | 
      
         | 8569 |  |  |   struct language_function *p = cfun->language;
 | 
      
         | 8570 |  |  |   /* cfun->language might have been already allocated by the use of
 | 
      
         | 8571 |  |  |      -Wunused-local-typedefs.  In that case, just re-use it.  */
 | 
      
         | 8572 |  |  |   if (p == NULL)
 | 
      
         | 8573 |  |  |     cfun->language = p = ggc_alloc_cleared_language_function ();
 | 
      
         | 8574 |  |  |  
 | 
      
         | 8575 |  |  |   p->base.x_stmt_tree = c_stmt_tree;
 | 
      
         | 8576 |  |  |   c_stmt_tree.x_cur_stmt_list
 | 
      
         | 8577 |  |  |     = VEC_copy (tree, gc, c_stmt_tree.x_cur_stmt_list);
 | 
      
         | 8578 |  |  |   p->x_break_label = c_break_label;
 | 
      
         | 8579 |  |  |   p->x_cont_label = c_cont_label;
 | 
      
         | 8580 |  |  |   p->x_switch_stack = c_switch_stack;
 | 
      
         | 8581 |  |  |   p->arg_info = current_function_arg_info;
 | 
      
         | 8582 |  |  |   p->returns_value = current_function_returns_value;
 | 
      
         | 8583 |  |  |   p->returns_null = current_function_returns_null;
 | 
      
         | 8584 |  |  |   p->returns_abnormally = current_function_returns_abnormally;
 | 
      
         | 8585 |  |  |   p->warn_about_return_type = warn_about_return_type;
 | 
      
         | 8586 |  |  |  
 | 
      
         | 8587 |  |  |   push_function_context ();
 | 
      
         | 8588 |  |  | }
 | 
      
         | 8589 |  |  |  
 | 
      
         | 8590 |  |  | /* Restore the variables used during compilation of a C function.  */
 | 
      
         | 8591 |  |  |  
 | 
      
         | 8592 |  |  | void
 | 
      
         | 8593 |  |  | c_pop_function_context (void)
 | 
      
         | 8594 |  |  | {
 | 
      
         | 8595 |  |  |   struct language_function *p;
 | 
      
         | 8596 |  |  |  
 | 
      
         | 8597 |  |  |   pop_function_context ();
 | 
      
         | 8598 |  |  |   p = cfun->language;
 | 
      
         | 8599 |  |  |   /* When -Wunused-local-typedefs is in effect, cfun->languages is
 | 
      
         | 8600 |  |  |      used to store data throughout the life time of the current cfun,
 | 
      
         | 8601 |  |  |      So don't deallocate it.  */
 | 
      
         | 8602 |  |  |   if (!warn_unused_local_typedefs)
 | 
      
         | 8603 |  |  |     cfun->language = NULL;
 | 
      
         | 8604 |  |  |  
 | 
      
         | 8605 |  |  |   if (DECL_STRUCT_FUNCTION (current_function_decl) == 0
 | 
      
         | 8606 |  |  |       && DECL_SAVED_TREE (current_function_decl) == NULL_TREE)
 | 
      
         | 8607 |  |  |     {
 | 
      
         | 8608 |  |  |       /* Stop pointing to the local nodes about to be freed.  */
 | 
      
         | 8609 |  |  |       /* But DECL_INITIAL must remain nonzero so we know this
 | 
      
         | 8610 |  |  |          was an actual function definition.  */
 | 
      
         | 8611 |  |  |       DECL_INITIAL (current_function_decl) = error_mark_node;
 | 
      
         | 8612 |  |  |       DECL_ARGUMENTS (current_function_decl) = 0;
 | 
      
         | 8613 |  |  |     }
 | 
      
         | 8614 |  |  |  
 | 
      
         | 8615 |  |  |   c_stmt_tree = p->base.x_stmt_tree;
 | 
      
         | 8616 |  |  |   c_break_label = p->x_break_label;
 | 
      
         | 8617 |  |  |   c_cont_label = p->x_cont_label;
 | 
      
         | 8618 |  |  |   c_switch_stack = p->x_switch_stack;
 | 
      
         | 8619 |  |  |   current_function_arg_info = p->arg_info;
 | 
      
         | 8620 |  |  |   current_function_returns_value = p->returns_value;
 | 
      
         | 8621 |  |  |   current_function_returns_null = p->returns_null;
 | 
      
         | 8622 |  |  |   current_function_returns_abnormally = p->returns_abnormally;
 | 
      
         | 8623 |  |  |   warn_about_return_type = p->warn_about_return_type;
 | 
      
         | 8624 |  |  | }
 | 
      
         | 8625 |  |  |  
 | 
      
         | 8626 |  |  | /* The functions below are required for functionality of doing
 | 
      
         | 8627 |  |  |    function at once processing in the C front end. Currently these
 | 
      
         | 8628 |  |  |    functions are not called from anywhere in the C front end, but as
 | 
      
         | 8629 |  |  |    these changes continue, that will change.  */
 | 
      
         | 8630 |  |  |  
 | 
      
         | 8631 |  |  | /* Returns the stmt_tree (if any) to which statements are currently
 | 
      
         | 8632 |  |  |    being added.  If there is no active statement-tree, NULL is
 | 
      
         | 8633 |  |  |    returned.  */
 | 
      
         | 8634 |  |  |  
 | 
      
         | 8635 |  |  | stmt_tree
 | 
      
         | 8636 |  |  | current_stmt_tree (void)
 | 
      
         | 8637 |  |  | {
 | 
      
         | 8638 |  |  |   return &c_stmt_tree;
 | 
      
         | 8639 |  |  | }
 | 
      
         | 8640 |  |  |  
 | 
      
         | 8641 |  |  | /* Return the global value of T as a symbol.  */
 | 
      
         | 8642 |  |  |  
 | 
      
         | 8643 |  |  | tree
 | 
      
         | 8644 |  |  | identifier_global_value (tree t)
 | 
      
         | 8645 |  |  | {
 | 
      
         | 8646 |  |  |   struct c_binding *b;
 | 
      
         | 8647 |  |  |  
 | 
      
         | 8648 |  |  |   for (b = I_SYMBOL_BINDING (t); b; b = b->shadowed)
 | 
      
         | 8649 |  |  |     if (B_IN_FILE_SCOPE (b) || B_IN_EXTERNAL_SCOPE (b))
 | 
      
         | 8650 |  |  |       return b->decl;
 | 
      
         | 8651 |  |  |  
 | 
      
         | 8652 |  |  |   return 0;
 | 
      
         | 8653 |  |  | }
 | 
      
         | 8654 |  |  |  
 | 
      
         | 8655 |  |  | /* In C, the only C-linkage public declaration is at file scope.  */
 | 
      
         | 8656 |  |  |  
 | 
      
         | 8657 |  |  | tree
 | 
      
         | 8658 |  |  | c_linkage_bindings (tree name)
 | 
      
         | 8659 |  |  | {
 | 
      
         | 8660 |  |  |   return identifier_global_value (name);
 | 
      
         | 8661 |  |  | }
 | 
      
         | 8662 |  |  |  
 | 
      
         | 8663 |  |  | /* Record a builtin type for C.  If NAME is non-NULL, it is the name used;
 | 
      
         | 8664 |  |  |    otherwise the name is found in ridpointers from RID_INDEX.  */
 | 
      
         | 8665 |  |  |  
 | 
      
         | 8666 |  |  | void
 | 
      
         | 8667 |  |  | record_builtin_type (enum rid rid_index, const char *name, tree type)
 | 
      
         | 8668 |  |  | {
 | 
      
         | 8669 |  |  |   tree id, decl;
 | 
      
         | 8670 |  |  |   if (name == 0)
 | 
      
         | 8671 |  |  |     id = ridpointers[(int) rid_index];
 | 
      
         | 8672 |  |  |   else
 | 
      
         | 8673 |  |  |     id = get_identifier (name);
 | 
      
         | 8674 |  |  |   decl = build_decl (UNKNOWN_LOCATION, TYPE_DECL, id, type);
 | 
      
         | 8675 |  |  |   pushdecl (decl);
 | 
      
         | 8676 |  |  |   if (debug_hooks->type_decl)
 | 
      
         | 8677 |  |  |     debug_hooks->type_decl (decl, false);
 | 
      
         | 8678 |  |  | }
 | 
      
         | 8679 |  |  |  
 | 
      
         | 8680 |  |  | /* Build the void_list_node (void_type_node having been created).  */
 | 
      
         | 8681 |  |  | tree
 | 
      
         | 8682 |  |  | build_void_list_node (void)
 | 
      
         | 8683 |  |  | {
 | 
      
         | 8684 |  |  |   tree t = build_tree_list (NULL_TREE, void_type_node);
 | 
      
         | 8685 |  |  |   return t;
 | 
      
         | 8686 |  |  | }
 | 
      
         | 8687 |  |  |  
 | 
      
         | 8688 |  |  | /* Return a c_parm structure with the given SPECS, ATTRS and DECLARATOR.  */
 | 
      
         | 8689 |  |  |  
 | 
      
         | 8690 |  |  | struct c_parm *
 | 
      
         | 8691 |  |  | build_c_parm (struct c_declspecs *specs, tree attrs,
 | 
      
         | 8692 |  |  |               struct c_declarator *declarator)
 | 
      
         | 8693 |  |  | {
 | 
      
         | 8694 |  |  |   struct c_parm *ret = XOBNEW (&parser_obstack, struct c_parm);
 | 
      
         | 8695 |  |  |   ret->specs = specs;
 | 
      
         | 8696 |  |  |   ret->attrs = attrs;
 | 
      
         | 8697 |  |  |   ret->declarator = declarator;
 | 
      
         | 8698 |  |  |   return ret;
 | 
      
         | 8699 |  |  | }
 | 
      
         | 8700 |  |  |  
 | 
      
         | 8701 |  |  | /* Return a declarator with nested attributes.  TARGET is the inner
 | 
      
         | 8702 |  |  |    declarator to which these attributes apply.  ATTRS are the
 | 
      
         | 8703 |  |  |    attributes.  */
 | 
      
         | 8704 |  |  |  
 | 
      
         | 8705 |  |  | struct c_declarator *
 | 
      
         | 8706 |  |  | build_attrs_declarator (tree attrs, struct c_declarator *target)
 | 
      
         | 8707 |  |  | {
 | 
      
         | 8708 |  |  |   struct c_declarator *ret = XOBNEW (&parser_obstack, struct c_declarator);
 | 
      
         | 8709 |  |  |   ret->kind = cdk_attrs;
 | 
      
         | 8710 |  |  |   ret->declarator = target;
 | 
      
         | 8711 |  |  |   ret->u.attrs = attrs;
 | 
      
         | 8712 |  |  |   return ret;
 | 
      
         | 8713 |  |  | }
 | 
      
         | 8714 |  |  |  
 | 
      
         | 8715 |  |  | /* Return a declarator for a function with arguments specified by ARGS
 | 
      
         | 8716 |  |  |    and return type specified by TARGET.  */
 | 
      
         | 8717 |  |  |  
 | 
      
         | 8718 |  |  | struct c_declarator *
 | 
      
         | 8719 |  |  | build_function_declarator (struct c_arg_info *args,
 | 
      
         | 8720 |  |  |                            struct c_declarator *target)
 | 
      
         | 8721 |  |  | {
 | 
      
         | 8722 |  |  |   struct c_declarator *ret = XOBNEW (&parser_obstack, struct c_declarator);
 | 
      
         | 8723 |  |  |   ret->kind = cdk_function;
 | 
      
         | 8724 |  |  |   ret->declarator = target;
 | 
      
         | 8725 |  |  |   ret->u.arg_info = args;
 | 
      
         | 8726 |  |  |   return ret;
 | 
      
         | 8727 |  |  | }
 | 
      
         | 8728 |  |  |  
 | 
      
         | 8729 |  |  | /* Return a declarator for the identifier IDENT (which may be
 | 
      
         | 8730 |  |  |    NULL_TREE for an abstract declarator).  */
 | 
      
         | 8731 |  |  |  
 | 
      
         | 8732 |  |  | struct c_declarator *
 | 
      
         | 8733 |  |  | build_id_declarator (tree ident)
 | 
      
         | 8734 |  |  | {
 | 
      
         | 8735 |  |  |   struct c_declarator *ret = XOBNEW (&parser_obstack, struct c_declarator);
 | 
      
         | 8736 |  |  |   ret->kind = cdk_id;
 | 
      
         | 8737 |  |  |   ret->declarator = 0;
 | 
      
         | 8738 |  |  |   ret->u.id = ident;
 | 
      
         | 8739 |  |  |   /* Default value - may get reset to a more precise location. */
 | 
      
         | 8740 |  |  |   ret->id_loc = input_location;
 | 
      
         | 8741 |  |  |   return ret;
 | 
      
         | 8742 |  |  | }
 | 
      
         | 8743 |  |  |  
 | 
      
         | 8744 |  |  | /* Return something to represent absolute declarators containing a *.
 | 
      
         | 8745 |  |  |    TARGET is the absolute declarator that the * contains.
 | 
      
         | 8746 |  |  |    TYPE_QUALS_ATTRS is a structure for type qualifiers and attributes
 | 
      
         | 8747 |  |  |    to apply to the pointer type.  */
 | 
      
         | 8748 |  |  |  
 | 
      
         | 8749 |  |  | struct c_declarator *
 | 
      
         | 8750 |  |  | make_pointer_declarator (struct c_declspecs *type_quals_attrs,
 | 
      
         | 8751 |  |  |                          struct c_declarator *target)
 | 
      
         | 8752 |  |  | {
 | 
      
         | 8753 |  |  |   tree attrs;
 | 
      
         | 8754 |  |  |   int quals = 0;
 | 
      
         | 8755 |  |  |   struct c_declarator *itarget = target;
 | 
      
         | 8756 |  |  |   struct c_declarator *ret = XOBNEW (&parser_obstack, struct c_declarator);
 | 
      
         | 8757 |  |  |   if (type_quals_attrs)
 | 
      
         | 8758 |  |  |     {
 | 
      
         | 8759 |  |  |       attrs = type_quals_attrs->attrs;
 | 
      
         | 8760 |  |  |       quals = quals_from_declspecs (type_quals_attrs);
 | 
      
         | 8761 |  |  |       if (attrs != NULL_TREE)
 | 
      
         | 8762 |  |  |         itarget = build_attrs_declarator (attrs, target);
 | 
      
         | 8763 |  |  |     }
 | 
      
         | 8764 |  |  |   ret->kind = cdk_pointer;
 | 
      
         | 8765 |  |  |   ret->declarator = itarget;
 | 
      
         | 8766 |  |  |   ret->u.pointer_quals = quals;
 | 
      
         | 8767 |  |  |   return ret;
 | 
      
         | 8768 |  |  | }
 | 
      
         | 8769 |  |  |  
 | 
      
         | 8770 |  |  | /* Return a pointer to a structure for an empty list of declaration
 | 
      
         | 8771 |  |  |    specifiers.  */
 | 
      
         | 8772 |  |  |  
 | 
      
         | 8773 |  |  | struct c_declspecs *
 | 
      
         | 8774 |  |  | build_null_declspecs (void)
 | 
      
         | 8775 |  |  | {
 | 
      
         | 8776 |  |  |   struct c_declspecs *ret = XOBNEW (&parser_obstack, struct c_declspecs);
 | 
      
         | 8777 |  |  |   ret->type = 0;
 | 
      
         | 8778 |  |  |   ret->expr = 0;
 | 
      
         | 8779 |  |  |   ret->decl_attr = 0;
 | 
      
         | 8780 |  |  |   ret->attrs = 0;
 | 
      
         | 8781 |  |  |   ret->align_log = -1;
 | 
      
         | 8782 |  |  |   ret->typespec_word = cts_none;
 | 
      
         | 8783 |  |  |   ret->storage_class = csc_none;
 | 
      
         | 8784 |  |  |   ret->expr_const_operands = true;
 | 
      
         | 8785 |  |  |   ret->declspecs_seen_p = false;
 | 
      
         | 8786 |  |  |   ret->typespec_kind = ctsk_none;
 | 
      
         | 8787 |  |  |   ret->non_sc_seen_p = false;
 | 
      
         | 8788 |  |  |   ret->typedef_p = false;
 | 
      
         | 8789 |  |  |   ret->explicit_signed_p = false;
 | 
      
         | 8790 |  |  |   ret->deprecated_p = false;
 | 
      
         | 8791 |  |  |   ret->default_int_p = false;
 | 
      
         | 8792 |  |  |   ret->long_p = false;
 | 
      
         | 8793 |  |  |   ret->long_long_p = false;
 | 
      
         | 8794 |  |  |   ret->short_p = false;
 | 
      
         | 8795 |  |  |   ret->signed_p = false;
 | 
      
         | 8796 |  |  |   ret->unsigned_p = false;
 | 
      
         | 8797 |  |  |   ret->complex_p = false;
 | 
      
         | 8798 |  |  |   ret->inline_p = false;
 | 
      
         | 8799 |  |  |   ret->noreturn_p = false;
 | 
      
         | 8800 |  |  |   ret->thread_p = false;
 | 
      
         | 8801 |  |  |   ret->const_p = false;
 | 
      
         | 8802 |  |  |   ret->volatile_p = false;
 | 
      
         | 8803 |  |  |   ret->restrict_p = false;
 | 
      
         | 8804 |  |  |   ret->saturating_p = false;
 | 
      
         | 8805 |  |  |   ret->alignas_p = false;
 | 
      
         | 8806 |  |  |   ret->address_space = ADDR_SPACE_GENERIC;
 | 
      
         | 8807 |  |  |   return ret;
 | 
      
         | 8808 |  |  | }
 | 
      
         | 8809 |  |  |  
 | 
      
         | 8810 |  |  | /* Add the address space ADDRSPACE to the declaration specifiers
 | 
      
         | 8811 |  |  |    SPECS, returning SPECS.  */
 | 
      
         | 8812 |  |  |  
 | 
      
         | 8813 |  |  | struct c_declspecs *
 | 
      
         | 8814 |  |  | declspecs_add_addrspace (struct c_declspecs *specs, addr_space_t as)
 | 
      
         | 8815 |  |  | {
 | 
      
         | 8816 |  |  |   specs->non_sc_seen_p = true;
 | 
      
         | 8817 |  |  |   specs->declspecs_seen_p = true;
 | 
      
         | 8818 |  |  |  
 | 
      
         | 8819 |  |  |   if (!ADDR_SPACE_GENERIC_P (specs->address_space)
 | 
      
         | 8820 |  |  |       && specs->address_space != as)
 | 
      
         | 8821 |  |  |     error ("incompatible address space qualifiers %qs and %qs",
 | 
      
         | 8822 |  |  |            c_addr_space_name (as),
 | 
      
         | 8823 |  |  |            c_addr_space_name (specs->address_space));
 | 
      
         | 8824 |  |  |   else
 | 
      
         | 8825 |  |  |     specs->address_space = as;
 | 
      
         | 8826 |  |  |   return specs;
 | 
      
         | 8827 |  |  | }
 | 
      
         | 8828 |  |  |  
 | 
      
         | 8829 |  |  | /* Add the type qualifier QUAL to the declaration specifiers SPECS,
 | 
      
         | 8830 |  |  |    returning SPECS.  */
 | 
      
         | 8831 |  |  |  
 | 
      
         | 8832 |  |  | struct c_declspecs *
 | 
      
         | 8833 |  |  | declspecs_add_qual (struct c_declspecs *specs, tree qual)
 | 
      
         | 8834 |  |  | {
 | 
      
         | 8835 |  |  |   enum rid i;
 | 
      
         | 8836 |  |  |   bool dupe = false;
 | 
      
         | 8837 |  |  |   specs->non_sc_seen_p = true;
 | 
      
         | 8838 |  |  |   specs->declspecs_seen_p = true;
 | 
      
         | 8839 |  |  |   gcc_assert (TREE_CODE (qual) == IDENTIFIER_NODE
 | 
      
         | 8840 |  |  |               && C_IS_RESERVED_WORD (qual));
 | 
      
         | 8841 |  |  |   i = C_RID_CODE (qual);
 | 
      
         | 8842 |  |  |   switch (i)
 | 
      
         | 8843 |  |  |     {
 | 
      
         | 8844 |  |  |     case RID_CONST:
 | 
      
         | 8845 |  |  |       dupe = specs->const_p;
 | 
      
         | 8846 |  |  |       specs->const_p = true;
 | 
      
         | 8847 |  |  |       break;
 | 
      
         | 8848 |  |  |     case RID_VOLATILE:
 | 
      
         | 8849 |  |  |       dupe = specs->volatile_p;
 | 
      
         | 8850 |  |  |       specs->volatile_p = true;
 | 
      
         | 8851 |  |  |       break;
 | 
      
         | 8852 |  |  |     case RID_RESTRICT:
 | 
      
         | 8853 |  |  |       dupe = specs->restrict_p;
 | 
      
         | 8854 |  |  |       specs->restrict_p = true;
 | 
      
         | 8855 |  |  |       break;
 | 
      
         | 8856 |  |  |     default:
 | 
      
         | 8857 |  |  |       gcc_unreachable ();
 | 
      
         | 8858 |  |  |     }
 | 
      
         | 8859 |  |  |   if (dupe && !flag_isoc99)
 | 
      
         | 8860 |  |  |     pedwarn (input_location, OPT_pedantic, "duplicate %qE", qual);
 | 
      
         | 8861 |  |  |   return specs;
 | 
      
         | 8862 |  |  | }
 | 
      
         | 8863 |  |  |  
 | 
      
         | 8864 |  |  | /* Add the type specifier TYPE to the declaration specifiers SPECS,
 | 
      
         | 8865 |  |  |    returning SPECS.  */
 | 
      
         | 8866 |  |  |  
 | 
      
         | 8867 |  |  | struct c_declspecs *
 | 
      
         | 8868 |  |  | declspecs_add_type (location_t loc, struct c_declspecs *specs,
 | 
      
         | 8869 |  |  |                     struct c_typespec spec)
 | 
      
         | 8870 |  |  | {
 | 
      
         | 8871 |  |  |   tree type = spec.spec;
 | 
      
         | 8872 |  |  |   specs->non_sc_seen_p = true;
 | 
      
         | 8873 |  |  |   specs->declspecs_seen_p = true;
 | 
      
         | 8874 |  |  |   specs->typespec_kind = spec.kind;
 | 
      
         | 8875 |  |  |   if (TREE_DEPRECATED (type))
 | 
      
         | 8876 |  |  |     specs->deprecated_p = true;
 | 
      
         | 8877 |  |  |  
 | 
      
         | 8878 |  |  |   /* Handle type specifier keywords.  */
 | 
      
         | 8879 |  |  |   if (TREE_CODE (type) == IDENTIFIER_NODE
 | 
      
         | 8880 |  |  |       && C_IS_RESERVED_WORD (type)
 | 
      
         | 8881 |  |  |       && C_RID_CODE (type) != RID_CXX_COMPAT_WARN)
 | 
      
         | 8882 |  |  |     {
 | 
      
         | 8883 |  |  |       enum rid i = C_RID_CODE (type);
 | 
      
         | 8884 |  |  |       if (specs->type)
 | 
      
         | 8885 |  |  |         {
 | 
      
         | 8886 |  |  |           error_at (loc, "two or more data types in declaration specifiers");
 | 
      
         | 8887 |  |  |           return specs;
 | 
      
         | 8888 |  |  |         }
 | 
      
         | 8889 |  |  |       if ((int) i <= (int) RID_LAST_MODIFIER)
 | 
      
         | 8890 |  |  |         {
 | 
      
         | 8891 |  |  |           /* "long", "short", "signed", "unsigned", "_Complex" or "_Sat".  */
 | 
      
         | 8892 |  |  |           bool dupe = false;
 | 
      
         | 8893 |  |  |           switch (i)
 | 
      
         | 8894 |  |  |             {
 | 
      
         | 8895 |  |  |             case RID_LONG:
 | 
      
         | 8896 |  |  |               if (specs->long_long_p)
 | 
      
         | 8897 |  |  |                 {
 | 
      
         | 8898 |  |  |                   error_at (loc, "%<long long long%> is too long for GCC");
 | 
      
         | 8899 |  |  |                   break;
 | 
      
         | 8900 |  |  |                 }
 | 
      
         | 8901 |  |  |               if (specs->long_p)
 | 
      
         | 8902 |  |  |                 {
 | 
      
         | 8903 |  |  |                   if (specs->typespec_word == cts_double)
 | 
      
         | 8904 |  |  |                     {
 | 
      
         | 8905 |  |  |                       error_at (loc,
 | 
      
         | 8906 |  |  |                                 ("both %<long long%> and %<double%> in "
 | 
      
         | 8907 |  |  |                                  "declaration specifiers"));
 | 
      
         | 8908 |  |  |                       break;
 | 
      
         | 8909 |  |  |                     }
 | 
      
         | 8910 |  |  |                   pedwarn_c90 (loc, OPT_Wlong_long,
 | 
      
         | 8911 |  |  |                                "ISO C90 does not support %<long long%>");
 | 
      
         | 8912 |  |  |                   specs->long_long_p = 1;
 | 
      
         | 8913 |  |  |                   break;
 | 
      
         | 8914 |  |  |                 }
 | 
      
         | 8915 |  |  |               if (specs->short_p)
 | 
      
         | 8916 |  |  |                 error_at (loc,
 | 
      
         | 8917 |  |  |                           ("both %<long%> and %<short%> in "
 | 
      
         | 8918 |  |  |                            "declaration specifiers"));
 | 
      
         | 8919 |  |  |               else if (specs->typespec_word == cts_void)
 | 
      
         | 8920 |  |  |                 error_at (loc,
 | 
      
         | 8921 |  |  |                           ("both %<long%> and %<void%> in "
 | 
      
         | 8922 |  |  |                            "declaration specifiers"));
 | 
      
         | 8923 |  |  |               else if (specs->typespec_word == cts_int128)
 | 
      
         | 8924 |  |  |                   error_at (loc,
 | 
      
         | 8925 |  |  |                             ("both %<long%> and %<__int128%> in "
 | 
      
         | 8926 |  |  |                              "declaration specifiers"));
 | 
      
         | 8927 |  |  |               else if (specs->typespec_word == cts_bool)
 | 
      
         | 8928 |  |  |                 error_at (loc,
 | 
      
         | 8929 |  |  |                           ("both %<long%> and %<_Bool%> in "
 | 
      
         | 8930 |  |  |                            "declaration specifiers"));
 | 
      
         | 8931 |  |  |               else if (specs->typespec_word == cts_char)
 | 
      
         | 8932 |  |  |                 error_at (loc,
 | 
      
         | 8933 |  |  |                           ("both %<long%> and %<char%> in "
 | 
      
         | 8934 |  |  |                            "declaration specifiers"));
 | 
      
         | 8935 |  |  |               else if (specs->typespec_word == cts_float)
 | 
      
         | 8936 |  |  |                 error_at (loc,
 | 
      
         | 8937 |  |  |                           ("both %<long%> and %<float%> in "
 | 
      
         | 8938 |  |  |                            "declaration specifiers"));
 | 
      
         | 8939 |  |  |               else if (specs->typespec_word == cts_dfloat32)
 | 
      
         | 8940 |  |  |                 error_at (loc,
 | 
      
         | 8941 |  |  |                           ("both %<long%> and %<_Decimal32%> in "
 | 
      
         | 8942 |  |  |                            "declaration specifiers"));
 | 
      
         | 8943 |  |  |               else if (specs->typespec_word == cts_dfloat64)
 | 
      
         | 8944 |  |  |                 error_at (loc,
 | 
      
         | 8945 |  |  |                           ("both %<long%> and %<_Decimal64%> in "
 | 
      
         | 8946 |  |  |                            "declaration specifiers"));
 | 
      
         | 8947 |  |  |               else if (specs->typespec_word == cts_dfloat128)
 | 
      
         | 8948 |  |  |                 error_at (loc,
 | 
      
         | 8949 |  |  |                           ("both %<long%> and %<_Decimal128%> in "
 | 
      
         | 8950 |  |  |                            "declaration specifiers"));
 | 
      
         | 8951 |  |  |               else
 | 
      
         | 8952 |  |  |                 specs->long_p = true;
 | 
      
         | 8953 |  |  |               break;
 | 
      
         | 8954 |  |  |             case RID_SHORT:
 | 
      
         | 8955 |  |  |               dupe = specs->short_p;
 | 
      
         | 8956 |  |  |               if (specs->long_p)
 | 
      
         | 8957 |  |  |                 error_at (loc,
 | 
      
         | 8958 |  |  |                           ("both %<long%> and %<short%> in "
 | 
      
         | 8959 |  |  |                            "declaration specifiers"));
 | 
      
         | 8960 |  |  |               else if (specs->typespec_word == cts_void)
 | 
      
         | 8961 |  |  |                 error_at (loc,
 | 
      
         | 8962 |  |  |                           ("both %<short%> and %<void%> in "
 | 
      
         | 8963 |  |  |                            "declaration specifiers"));
 | 
      
         | 8964 |  |  |               else if (specs->typespec_word == cts_int128)
 | 
      
         | 8965 |  |  |                 error_at (loc,
 | 
      
         | 8966 |  |  |                           ("both %<short%> and %<__int128%> in "
 | 
      
         | 8967 |  |  |                            "declaration specifiers"));
 | 
      
         | 8968 |  |  |               else if (specs->typespec_word == cts_bool)
 | 
      
         | 8969 |  |  |                 error_at (loc,
 | 
      
         | 8970 |  |  |                           ("both %<short%> and %<_Bool%> in "
 | 
      
         | 8971 |  |  |                            "declaration specifiers"));
 | 
      
         | 8972 |  |  |               else if (specs->typespec_word == cts_char)
 | 
      
         | 8973 |  |  |                 error_at (loc,
 | 
      
         | 8974 |  |  |                           ("both %<short%> and %<char%> in "
 | 
      
         | 8975 |  |  |                            "declaration specifiers"));
 | 
      
         | 8976 |  |  |               else if (specs->typespec_word == cts_float)
 | 
      
         | 8977 |  |  |                 error_at (loc,
 | 
      
         | 8978 |  |  |                           ("both %<short%> and %<float%> in "
 | 
      
         | 8979 |  |  |                            "declaration specifiers"));
 | 
      
         | 8980 |  |  |               else if (specs->typespec_word == cts_double)
 | 
      
         | 8981 |  |  |                 error_at (loc,
 | 
      
         | 8982 |  |  |                           ("both %<short%> and %<double%> in "
 | 
      
         | 8983 |  |  |                            "declaration specifiers"));
 | 
      
         | 8984 |  |  |               else if (specs->typespec_word == cts_dfloat32)
 | 
      
         | 8985 |  |  |                 error_at (loc,
 | 
      
         | 8986 |  |  |                           ("both %<short%> and %<_Decimal32%> in "
 | 
      
         | 8987 |  |  |                            "declaration specifiers"));
 | 
      
         | 8988 |  |  |               else if (specs->typespec_word == cts_dfloat64)
 | 
      
         | 8989 |  |  |                 error_at (loc,
 | 
      
         | 8990 |  |  |                           ("both %<short%> and %<_Decimal64%> in "
 | 
      
         | 8991 |  |  |                            "declaration specifiers"));
 | 
      
         | 8992 |  |  |               else if (specs->typespec_word == cts_dfloat128)
 | 
      
         | 8993 |  |  |                 error_at (loc,
 | 
      
         | 8994 |  |  |                           ("both %<short%> and %<_Decimal128%> in "
 | 
      
         | 8995 |  |  |                            "declaration specifiers"));
 | 
      
         | 8996 |  |  |               else
 | 
      
         | 8997 |  |  |                 specs->short_p = true;
 | 
      
         | 8998 |  |  |               break;
 | 
      
         | 8999 |  |  |             case RID_SIGNED:
 | 
      
         | 9000 |  |  |               dupe = specs->signed_p;
 | 
      
         | 9001 |  |  |               if (specs->unsigned_p)
 | 
      
         | 9002 |  |  |                 error_at (loc,
 | 
      
         | 9003 |  |  |                           ("both %<signed%> and %<unsigned%> in "
 | 
      
         | 9004 |  |  |                            "declaration specifiers"));
 | 
      
         | 9005 |  |  |               else if (specs->typespec_word == cts_void)
 | 
      
         | 9006 |  |  |                 error_at (loc,
 | 
      
         | 9007 |  |  |                           ("both %<signed%> and %<void%> in "
 | 
      
         | 9008 |  |  |                            "declaration specifiers"));
 | 
      
         | 9009 |  |  |               else if (specs->typespec_word == cts_bool)
 | 
      
         | 9010 |  |  |                 error_at (loc,
 | 
      
         | 9011 |  |  |                           ("both %<signed%> and %<_Bool%> in "
 | 
      
         | 9012 |  |  |                            "declaration specifiers"));
 | 
      
         | 9013 |  |  |               else if (specs->typespec_word == cts_float)
 | 
      
         | 9014 |  |  |                 error_at (loc,
 | 
      
         | 9015 |  |  |                           ("both %<signed%> and %<float%> in "
 | 
      
         | 9016 |  |  |                            "declaration specifiers"));
 | 
      
         | 9017 |  |  |               else if (specs->typespec_word == cts_double)
 | 
      
         | 9018 |  |  |                 error_at (loc,
 | 
      
         | 9019 |  |  |                           ("both %<signed%> and %<double%> in "
 | 
      
         | 9020 |  |  |                            "declaration specifiers"));
 | 
      
         | 9021 |  |  |               else if (specs->typespec_word == cts_dfloat32)
 | 
      
         | 9022 |  |  |                 error_at (loc,
 | 
      
         | 9023 |  |  |                           ("both %<signed%> and %<_Decimal32%> in "
 | 
      
         | 9024 |  |  |                            "declaration specifiers"));
 | 
      
         | 9025 |  |  |               else if (specs->typespec_word == cts_dfloat64)
 | 
      
         | 9026 |  |  |                 error_at (loc,
 | 
      
         | 9027 |  |  |                           ("both %<signed%> and %<_Decimal64%> in "
 | 
      
         | 9028 |  |  |                            "declaration specifiers"));
 | 
      
         | 9029 |  |  |               else if (specs->typespec_word == cts_dfloat128)
 | 
      
         | 9030 |  |  |                 error_at (loc,
 | 
      
         | 9031 |  |  |                           ("both %<signed%> and %<_Decimal128%> in "
 | 
      
         | 9032 |  |  |                            "declaration specifiers"));
 | 
      
         | 9033 |  |  |               else
 | 
      
         | 9034 |  |  |                 specs->signed_p = true;
 | 
      
         | 9035 |  |  |               break;
 | 
      
         | 9036 |  |  |             case RID_UNSIGNED:
 | 
      
         | 9037 |  |  |               dupe = specs->unsigned_p;
 | 
      
         | 9038 |  |  |               if (specs->signed_p)
 | 
      
         | 9039 |  |  |                 error_at (loc,
 | 
      
         | 9040 |  |  |                           ("both %<signed%> and %<unsigned%> in "
 | 
      
         | 9041 |  |  |                            "declaration specifiers"));
 | 
      
         | 9042 |  |  |               else if (specs->typespec_word == cts_void)
 | 
      
         | 9043 |  |  |                 error_at (loc,
 | 
      
         | 9044 |  |  |                           ("both %<unsigned%> and %<void%> in "
 | 
      
         | 9045 |  |  |                            "declaration specifiers"));
 | 
      
         | 9046 |  |  |               else if (specs->typespec_word == cts_bool)
 | 
      
         | 9047 |  |  |                 error_at (loc,
 | 
      
         | 9048 |  |  |                           ("both %<unsigned%> and %<_Bool%> in "
 | 
      
         | 9049 |  |  |                            "declaration specifiers"));
 | 
      
         | 9050 |  |  |               else if (specs->typespec_word == cts_float)
 | 
      
         | 9051 |  |  |                 error_at (loc,
 | 
      
         | 9052 |  |  |                           ("both %<unsigned%> and %<float%> in "
 | 
      
         | 9053 |  |  |                            "declaration specifiers"));
 | 
      
         | 9054 |  |  |               else if (specs->typespec_word == cts_double)
 | 
      
         | 9055 |  |  |                 error_at (loc,
 | 
      
         | 9056 |  |  |                           ("both %<unsigned%> and %<double%> in "
 | 
      
         | 9057 |  |  |                            "declaration specifiers"));
 | 
      
         | 9058 |  |  |               else if (specs->typespec_word == cts_dfloat32)
 | 
      
         | 9059 |  |  |                 error_at (loc,
 | 
      
         | 9060 |  |  |                           ("both %<unsigned%> and %<_Decimal32%> in "
 | 
      
         | 9061 |  |  |                            "declaration specifiers"));
 | 
      
         | 9062 |  |  |               else if (specs->typespec_word == cts_dfloat64)
 | 
      
         | 9063 |  |  |                 error_at (loc,
 | 
      
         | 9064 |  |  |                           ("both %<unsigned%> and %<_Decimal64%> in "
 | 
      
         | 9065 |  |  |                            "declaration specifiers"));
 | 
      
         | 9066 |  |  |               else if (specs->typespec_word == cts_dfloat128)
 | 
      
         | 9067 |  |  |                 error_at (loc,
 | 
      
         | 9068 |  |  |                           ("both %<unsigned%> and %<_Decimal128%> in "
 | 
      
         | 9069 |  |  |                            "declaration specifiers"));
 | 
      
         | 9070 |  |  |               else
 | 
      
         | 9071 |  |  |                 specs->unsigned_p = true;
 | 
      
         | 9072 |  |  |               break;
 | 
      
         | 9073 |  |  |             case RID_COMPLEX:
 | 
      
         | 9074 |  |  |               dupe = specs->complex_p;
 | 
      
         | 9075 |  |  |               if (!flag_isoc99 && !in_system_header)
 | 
      
         | 9076 |  |  |                 pedwarn (loc, OPT_pedantic,
 | 
      
         | 9077 |  |  |                          "ISO C90 does not support complex types");
 | 
      
         | 9078 |  |  |               if (specs->typespec_word == cts_void)
 | 
      
         | 9079 |  |  |                 error_at (loc,
 | 
      
         | 9080 |  |  |                           ("both %<complex%> and %<void%> in "
 | 
      
         | 9081 |  |  |                            "declaration specifiers"));
 | 
      
         | 9082 |  |  |               else if (specs->typespec_word == cts_bool)
 | 
      
         | 9083 |  |  |                 error_at (loc,
 | 
      
         | 9084 |  |  |                           ("both %<complex%> and %<_Bool%> in "
 | 
      
         | 9085 |  |  |                            "declaration specifiers"));
 | 
      
         | 9086 |  |  |               else if (specs->typespec_word == cts_dfloat32)
 | 
      
         | 9087 |  |  |                 error_at (loc,
 | 
      
         | 9088 |  |  |                           ("both %<complex%> and %<_Decimal32%> in "
 | 
      
         | 9089 |  |  |                            "declaration specifiers"));
 | 
      
         | 9090 |  |  |               else if (specs->typespec_word == cts_dfloat64)
 | 
      
         | 9091 |  |  |                 error_at (loc,
 | 
      
         | 9092 |  |  |                           ("both %<complex%> and %<_Decimal64%> in "
 | 
      
         | 9093 |  |  |                            "declaration specifiers"));
 | 
      
         | 9094 |  |  |               else if (specs->typespec_word == cts_dfloat128)
 | 
      
         | 9095 |  |  |                 error_at (loc,
 | 
      
         | 9096 |  |  |                           ("both %<complex%> and %<_Decimal128%> in "
 | 
      
         | 9097 |  |  |                            "declaration specifiers"));
 | 
      
         | 9098 |  |  |               else if (specs->typespec_word == cts_fract)
 | 
      
         | 9099 |  |  |                 error_at (loc,
 | 
      
         | 9100 |  |  |                           ("both %<complex%> and %<_Fract%> in "
 | 
      
         | 9101 |  |  |                            "declaration specifiers"));
 | 
      
         | 9102 |  |  |               else if (specs->typespec_word == cts_accum)
 | 
      
         | 9103 |  |  |                 error_at (loc,
 | 
      
         | 9104 |  |  |                           ("both %<complex%> and %<_Accum%> in "
 | 
      
         | 9105 |  |  |                            "declaration specifiers"));
 | 
      
         | 9106 |  |  |               else if (specs->saturating_p)
 | 
      
         | 9107 |  |  |                 error_at (loc,
 | 
      
         | 9108 |  |  |                           ("both %<complex%> and %<_Sat%> in "
 | 
      
         | 9109 |  |  |                            "declaration specifiers"));
 | 
      
         | 9110 |  |  |               else
 | 
      
         | 9111 |  |  |                 specs->complex_p = true;
 | 
      
         | 9112 |  |  |               break;
 | 
      
         | 9113 |  |  |             case RID_SAT:
 | 
      
         | 9114 |  |  |               dupe = specs->saturating_p;
 | 
      
         | 9115 |  |  |               pedwarn (loc, OPT_pedantic,
 | 
      
         | 9116 |  |  |                        "ISO C does not support saturating types");
 | 
      
         | 9117 |  |  |               if (specs->typespec_word == cts_int128)
 | 
      
         | 9118 |  |  |                 {
 | 
      
         | 9119 |  |  |                   error_at (loc,
 | 
      
         | 9120 |  |  |                             ("both %<_Sat%> and %<__int128%> in "
 | 
      
         | 9121 |  |  |                              "declaration specifiers"));
 | 
      
         | 9122 |  |  |                 }
 | 
      
         | 9123 |  |  |               else if (specs->typespec_word == cts_void)
 | 
      
         | 9124 |  |  |                 error_at (loc,
 | 
      
         | 9125 |  |  |                           ("both %<_Sat%> and %<void%> in "
 | 
      
         | 9126 |  |  |                            "declaration specifiers"));
 | 
      
         | 9127 |  |  |               else if (specs->typespec_word == cts_bool)
 | 
      
         | 9128 |  |  |                 error_at (loc,
 | 
      
         | 9129 |  |  |                           ("both %<_Sat%> and %<_Bool%> in "
 | 
      
         | 9130 |  |  |                            "declaration specifiers"));
 | 
      
         | 9131 |  |  |               else if (specs->typespec_word == cts_char)
 | 
      
         | 9132 |  |  |                 error_at (loc,
 | 
      
         | 9133 |  |  |                           ("both %<_Sat%> and %<char%> in "
 | 
      
         | 9134 |  |  |                            "declaration specifiers"));
 | 
      
         | 9135 |  |  |               else if (specs->typespec_word == cts_int)
 | 
      
         | 9136 |  |  |                 error_at (loc,
 | 
      
         | 9137 |  |  |                           ("both %<_Sat%> and %<int%> in "
 | 
      
         | 9138 |  |  |                            "declaration specifiers"));
 | 
      
         | 9139 |  |  |               else if (specs->typespec_word == cts_float)
 | 
      
         | 9140 |  |  |                 error_at (loc,
 | 
      
         | 9141 |  |  |                           ("both %<_Sat%> and %<float%> in "
 | 
      
         | 9142 |  |  |                            "declaration specifiers"));
 | 
      
         | 9143 |  |  |               else if (specs->typespec_word == cts_double)
 | 
      
         | 9144 |  |  |                 error_at (loc,
 | 
      
         | 9145 |  |  |                           ("both %<_Sat%> and %<double%> in "
 | 
      
         | 9146 |  |  |                            "declaration specifiers"));
 | 
      
         | 9147 |  |  |               else if (specs->typespec_word == cts_dfloat32)
 | 
      
         | 9148 |  |  |                 error_at (loc,
 | 
      
         | 9149 |  |  |                           ("both %<_Sat%> and %<_Decimal32%> in "
 | 
      
         | 9150 |  |  |                            "declaration specifiers"));
 | 
      
         | 9151 |  |  |               else if (specs->typespec_word == cts_dfloat64)
 | 
      
         | 9152 |  |  |                 error_at (loc,
 | 
      
         | 9153 |  |  |                           ("both %<_Sat%> and %<_Decimal64%> in "
 | 
      
         | 9154 |  |  |                            "declaration specifiers"));
 | 
      
         | 9155 |  |  |               else if (specs->typespec_word == cts_dfloat128)
 | 
      
         | 9156 |  |  |                 error_at (loc,
 | 
      
         | 9157 |  |  |                           ("both %<_Sat%> and %<_Decimal128%> in "
 | 
      
         | 9158 |  |  |                            "declaration specifiers"));
 | 
      
         | 9159 |  |  |               else if (specs->complex_p)
 | 
      
         | 9160 |  |  |                 error_at (loc,
 | 
      
         | 9161 |  |  |                           ("both %<_Sat%> and %<complex%> in "
 | 
      
         | 9162 |  |  |                            "declaration specifiers"));
 | 
      
         | 9163 |  |  |               else
 | 
      
         | 9164 |  |  |                 specs->saturating_p = true;
 | 
      
         | 9165 |  |  |               break;
 | 
      
         | 9166 |  |  |             default:
 | 
      
         | 9167 |  |  |               gcc_unreachable ();
 | 
      
         | 9168 |  |  |             }
 | 
      
         | 9169 |  |  |  
 | 
      
         | 9170 |  |  |           if (dupe)
 | 
      
         | 9171 |  |  |             error_at (loc, "duplicate %qE", type);
 | 
      
         | 9172 |  |  |  
 | 
      
         | 9173 |  |  |           return specs;
 | 
      
         | 9174 |  |  |         }
 | 
      
         | 9175 |  |  |       else
 | 
      
         | 9176 |  |  |         {
 | 
      
         | 9177 |  |  |           /* "void", "_Bool", "char", "int", "float", "double", "_Decimal32",
 | 
      
         | 9178 |  |  |              "__int128", "_Decimal64", "_Decimal128", "_Fract" or "_Accum".  */
 | 
      
         | 9179 |  |  |           if (specs->typespec_word != cts_none)
 | 
      
         | 9180 |  |  |             {
 | 
      
         | 9181 |  |  |               error_at (loc,
 | 
      
         | 9182 |  |  |                         "two or more data types in declaration specifiers");
 | 
      
         | 9183 |  |  |               return specs;
 | 
      
         | 9184 |  |  |             }
 | 
      
         | 9185 |  |  |           switch (i)
 | 
      
         | 9186 |  |  |             {
 | 
      
         | 9187 |  |  |             case RID_INT128:
 | 
      
         | 9188 |  |  |               if (int128_integer_type_node == NULL_TREE)
 | 
      
         | 9189 |  |  |                 {
 | 
      
         | 9190 |  |  |                   error_at (loc, "%<__int128%> is not supported for this target");
 | 
      
         | 9191 |  |  |                   return specs;
 | 
      
         | 9192 |  |  |                 }
 | 
      
         | 9193 |  |  |               if (!in_system_header)
 | 
      
         | 9194 |  |  |                 pedwarn (loc, OPT_pedantic,
 | 
      
         | 9195 |  |  |                          "ISO C does not support %<__int128%> type");
 | 
      
         | 9196 |  |  |  
 | 
      
         | 9197 |  |  |               if (specs->long_p)
 | 
      
         | 9198 |  |  |                 error_at (loc,
 | 
      
         | 9199 |  |  |                           ("both %<__int128%> and %<long%> in "
 | 
      
         | 9200 |  |  |                            "declaration specifiers"));
 | 
      
         | 9201 |  |  |               else if (specs->saturating_p)
 | 
      
         | 9202 |  |  |                 error_at (loc,
 | 
      
         | 9203 |  |  |                           ("both %<_Sat%> and %<__int128%> in "
 | 
      
         | 9204 |  |  |                            "declaration specifiers"));
 | 
      
         | 9205 |  |  |               else if (specs->short_p)
 | 
      
         | 9206 |  |  |                 error_at (loc,
 | 
      
         | 9207 |  |  |                           ("both %<__int128%> and %<short%> in "
 | 
      
         | 9208 |  |  |                            "declaration specifiers"));
 | 
      
         | 9209 |  |  |               else
 | 
      
         | 9210 |  |  |                 specs->typespec_word = cts_int128;
 | 
      
         | 9211 |  |  |               return specs;
 | 
      
         | 9212 |  |  |             case RID_VOID:
 | 
      
         | 9213 |  |  |               if (specs->long_p)
 | 
      
         | 9214 |  |  |                 error_at (loc,
 | 
      
         | 9215 |  |  |                           ("both %<long%> and %<void%> in "
 | 
      
         | 9216 |  |  |                            "declaration specifiers"));
 | 
      
         | 9217 |  |  |               else if (specs->short_p)
 | 
      
         | 9218 |  |  |                 error_at (loc,
 | 
      
         | 9219 |  |  |                           ("both %<short%> and %<void%> in "
 | 
      
         | 9220 |  |  |                            "declaration specifiers"));
 | 
      
         | 9221 |  |  |               else if (specs->signed_p)
 | 
      
         | 9222 |  |  |                 error_at (loc,
 | 
      
         | 9223 |  |  |                           ("both %<signed%> and %<void%> in "
 | 
      
         | 9224 |  |  |                            "declaration specifiers"));
 | 
      
         | 9225 |  |  |               else if (specs->unsigned_p)
 | 
      
         | 9226 |  |  |                 error_at (loc,
 | 
      
         | 9227 |  |  |                           ("both %<unsigned%> and %<void%> in "
 | 
      
         | 9228 |  |  |                            "declaration specifiers"));
 | 
      
         | 9229 |  |  |               else if (specs->complex_p)
 | 
      
         | 9230 |  |  |                 error_at (loc,
 | 
      
         | 9231 |  |  |                           ("both %<complex%> and %<void%> in "
 | 
      
         | 9232 |  |  |                            "declaration specifiers"));
 | 
      
         | 9233 |  |  |               else if (specs->saturating_p)
 | 
      
         | 9234 |  |  |                 error_at (loc,
 | 
      
         | 9235 |  |  |                           ("both %<_Sat%> and %<void%> in "
 | 
      
         | 9236 |  |  |                            "declaration specifiers"));
 | 
      
         | 9237 |  |  |               else
 | 
      
         | 9238 |  |  |                 specs->typespec_word = cts_void;
 | 
      
         | 9239 |  |  |               return specs;
 | 
      
         | 9240 |  |  |             case RID_BOOL:
 | 
      
         | 9241 |  |  |               if (specs->long_p)
 | 
      
         | 9242 |  |  |                 error_at (loc,
 | 
      
         | 9243 |  |  |                           ("both %<long%> and %<_Bool%> in "
 | 
      
         | 9244 |  |  |                            "declaration specifiers"));
 | 
      
         | 9245 |  |  |               else if (specs->short_p)
 | 
      
         | 9246 |  |  |                 error_at (loc,
 | 
      
         | 9247 |  |  |                           ("both %<short%> and %<_Bool%> in "
 | 
      
         | 9248 |  |  |                            "declaration specifiers"));
 | 
      
         | 9249 |  |  |               else if (specs->signed_p)
 | 
      
         | 9250 |  |  |                 error_at (loc,
 | 
      
         | 9251 |  |  |                           ("both %<signed%> and %<_Bool%> in "
 | 
      
         | 9252 |  |  |                            "declaration specifiers"));
 | 
      
         | 9253 |  |  |               else if (specs->unsigned_p)
 | 
      
         | 9254 |  |  |                 error_at (loc,
 | 
      
         | 9255 |  |  |                           ("both %<unsigned%> and %<_Bool%> in "
 | 
      
         | 9256 |  |  |                            "declaration specifiers"));
 | 
      
         | 9257 |  |  |               else if (specs->complex_p)
 | 
      
         | 9258 |  |  |                 error_at (loc,
 | 
      
         | 9259 |  |  |                           ("both %<complex%> and %<_Bool%> in "
 | 
      
         | 9260 |  |  |                            "declaration specifiers"));
 | 
      
         | 9261 |  |  |               else if (specs->saturating_p)
 | 
      
         | 9262 |  |  |                 error_at (loc,
 | 
      
         | 9263 |  |  |                           ("both %<_Sat%> and %<_Bool%> in "
 | 
      
         | 9264 |  |  |                            "declaration specifiers"));
 | 
      
         | 9265 |  |  |               else
 | 
      
         | 9266 |  |  |                 specs->typespec_word = cts_bool;
 | 
      
         | 9267 |  |  |               return specs;
 | 
      
         | 9268 |  |  |             case RID_CHAR:
 | 
      
         | 9269 |  |  |               if (specs->long_p)
 | 
      
         | 9270 |  |  |                 error_at (loc,
 | 
      
         | 9271 |  |  |                           ("both %<long%> and %<char%> in "
 | 
      
         | 9272 |  |  |                            "declaration specifiers"));
 | 
      
         | 9273 |  |  |               else if (specs->short_p)
 | 
      
         | 9274 |  |  |                 error_at (loc,
 | 
      
         | 9275 |  |  |                           ("both %<short%> and %<char%> in "
 | 
      
         | 9276 |  |  |                            "declaration specifiers"));
 | 
      
         | 9277 |  |  |               else if (specs->saturating_p)
 | 
      
         | 9278 |  |  |                 error_at (loc,
 | 
      
         | 9279 |  |  |                           ("both %<_Sat%> and %<char%> in "
 | 
      
         | 9280 |  |  |                            "declaration specifiers"));
 | 
      
         | 9281 |  |  |               else
 | 
      
         | 9282 |  |  |                 specs->typespec_word = cts_char;
 | 
      
         | 9283 |  |  |               return specs;
 | 
      
         | 9284 |  |  |             case RID_INT:
 | 
      
         | 9285 |  |  |               if (specs->saturating_p)
 | 
      
         | 9286 |  |  |                 error_at (loc,
 | 
      
         | 9287 |  |  |                           ("both %<_Sat%> and %<int%> in "
 | 
      
         | 9288 |  |  |                            "declaration specifiers"));
 | 
      
         | 9289 |  |  |               else
 | 
      
         | 9290 |  |  |                 specs->typespec_word = cts_int;
 | 
      
         | 9291 |  |  |               return specs;
 | 
      
         | 9292 |  |  |             case RID_FLOAT:
 | 
      
         | 9293 |  |  |               if (specs->long_p)
 | 
      
         | 9294 |  |  |                 error_at (loc,
 | 
      
         | 9295 |  |  |                           ("both %<long%> and %<float%> in "
 | 
      
         | 9296 |  |  |                            "declaration specifiers"));
 | 
      
         | 9297 |  |  |               else if (specs->short_p)
 | 
      
         | 9298 |  |  |                 error_at (loc,
 | 
      
         | 9299 |  |  |                           ("both %<short%> and %<float%> in "
 | 
      
         | 9300 |  |  |                            "declaration specifiers"));
 | 
      
         | 9301 |  |  |               else if (specs->signed_p)
 | 
      
         | 9302 |  |  |                 error_at (loc,
 | 
      
         | 9303 |  |  |                           ("both %<signed%> and %<float%> in "
 | 
      
         | 9304 |  |  |                            "declaration specifiers"));
 | 
      
         | 9305 |  |  |               else if (specs->unsigned_p)
 | 
      
         | 9306 |  |  |                 error_at (loc,
 | 
      
         | 9307 |  |  |                           ("both %<unsigned%> and %<float%> in "
 | 
      
         | 9308 |  |  |                            "declaration specifiers"));
 | 
      
         | 9309 |  |  |               else if (specs->saturating_p)
 | 
      
         | 9310 |  |  |                 error_at (loc,
 | 
      
         | 9311 |  |  |                           ("both %<_Sat%> and %<float%> in "
 | 
      
         | 9312 |  |  |                            "declaration specifiers"));
 | 
      
         | 9313 |  |  |               else
 | 
      
         | 9314 |  |  |                 specs->typespec_word = cts_float;
 | 
      
         | 9315 |  |  |               return specs;
 | 
      
         | 9316 |  |  |             case RID_DOUBLE:
 | 
      
         | 9317 |  |  |               if (specs->long_long_p)
 | 
      
         | 9318 |  |  |                 error_at (loc,
 | 
      
         | 9319 |  |  |                           ("both %<long long%> and %<double%> in "
 | 
      
         | 9320 |  |  |                            "declaration specifiers"));
 | 
      
         | 9321 |  |  |               else if (specs->short_p)
 | 
      
         | 9322 |  |  |                 error_at (loc,
 | 
      
         | 9323 |  |  |                           ("both %<short%> and %<double%> in "
 | 
      
         | 9324 |  |  |                            "declaration specifiers"));
 | 
      
         | 9325 |  |  |               else if (specs->signed_p)
 | 
      
         | 9326 |  |  |                 error_at (loc,
 | 
      
         | 9327 |  |  |                           ("both %<signed%> and %<double%> in "
 | 
      
         | 9328 |  |  |                            "declaration specifiers"));
 | 
      
         | 9329 |  |  |               else if (specs->unsigned_p)
 | 
      
         | 9330 |  |  |                 error_at (loc,
 | 
      
         | 9331 |  |  |                           ("both %<unsigned%> and %<double%> in "
 | 
      
         | 9332 |  |  |                            "declaration specifiers"));
 | 
      
         | 9333 |  |  |               else if (specs->saturating_p)
 | 
      
         | 9334 |  |  |                 error_at (loc,
 | 
      
         | 9335 |  |  |                           ("both %<_Sat%> and %<double%> in "
 | 
      
         | 9336 |  |  |                            "declaration specifiers"));
 | 
      
         | 9337 |  |  |               else
 | 
      
         | 9338 |  |  |                 specs->typespec_word = cts_double;
 | 
      
         | 9339 |  |  |               return specs;
 | 
      
         | 9340 |  |  |             case RID_DFLOAT32:
 | 
      
         | 9341 |  |  |             case RID_DFLOAT64:
 | 
      
         | 9342 |  |  |             case RID_DFLOAT128:
 | 
      
         | 9343 |  |  |               {
 | 
      
         | 9344 |  |  |                 const char *str;
 | 
      
         | 9345 |  |  |                 if (i == RID_DFLOAT32)
 | 
      
         | 9346 |  |  |                   str = "_Decimal32";
 | 
      
         | 9347 |  |  |                 else if (i == RID_DFLOAT64)
 | 
      
         | 9348 |  |  |                   str = "_Decimal64";
 | 
      
         | 9349 |  |  |                 else
 | 
      
         | 9350 |  |  |                   str = "_Decimal128";
 | 
      
         | 9351 |  |  |                 if (specs->long_long_p)
 | 
      
         | 9352 |  |  |                   error_at (loc,
 | 
      
         | 9353 |  |  |                             ("both %<long long%> and %<%s%> in "
 | 
      
         | 9354 |  |  |                              "declaration specifiers"),
 | 
      
         | 9355 |  |  |                             str);
 | 
      
         | 9356 |  |  |                 if (specs->long_p)
 | 
      
         | 9357 |  |  |                   error_at (loc,
 | 
      
         | 9358 |  |  |                             ("both %<long%> and %<%s%> in "
 | 
      
         | 9359 |  |  |                              "declaration specifiers"),
 | 
      
         | 9360 |  |  |                             str);
 | 
      
         | 9361 |  |  |                 else if (specs->short_p)
 | 
      
         | 9362 |  |  |                   error_at (loc,
 | 
      
         | 9363 |  |  |                             ("both %<short%> and %<%s%> in "
 | 
      
         | 9364 |  |  |                              "declaration specifiers"),
 | 
      
         | 9365 |  |  |                             str);
 | 
      
         | 9366 |  |  |                 else if (specs->signed_p)
 | 
      
         | 9367 |  |  |                   error_at (loc,
 | 
      
         | 9368 |  |  |                             ("both %<signed%> and %<%s%> in "
 | 
      
         | 9369 |  |  |                              "declaration specifiers"),
 | 
      
         | 9370 |  |  |                             str);
 | 
      
         | 9371 |  |  |                 else if (specs->unsigned_p)
 | 
      
         | 9372 |  |  |                   error_at (loc,
 | 
      
         | 9373 |  |  |                             ("both %<unsigned%> and %<%s%> in "
 | 
      
         | 9374 |  |  |                              "declaration specifiers"),
 | 
      
         | 9375 |  |  |                             str);
 | 
      
         | 9376 |  |  |                 else if (specs->complex_p)
 | 
      
         | 9377 |  |  |                   error_at (loc,
 | 
      
         | 9378 |  |  |                             ("both %<complex%> and %<%s%> in "
 | 
      
         | 9379 |  |  |                              "declaration specifiers"),
 | 
      
         | 9380 |  |  |                             str);
 | 
      
         | 9381 |  |  |                 else if (specs->saturating_p)
 | 
      
         | 9382 |  |  |                   error_at (loc,
 | 
      
         | 9383 |  |  |                             ("both %<_Sat%> and %<%s%> in "
 | 
      
         | 9384 |  |  |                              "declaration specifiers"),
 | 
      
         | 9385 |  |  |                             str);
 | 
      
         | 9386 |  |  |                 else if (i == RID_DFLOAT32)
 | 
      
         | 9387 |  |  |                   specs->typespec_word = cts_dfloat32;
 | 
      
         | 9388 |  |  |                 else if (i == RID_DFLOAT64)
 | 
      
         | 9389 |  |  |                   specs->typespec_word = cts_dfloat64;
 | 
      
         | 9390 |  |  |                 else
 | 
      
         | 9391 |  |  |                   specs->typespec_word = cts_dfloat128;
 | 
      
         | 9392 |  |  |               }
 | 
      
         | 9393 |  |  |               if (!targetm.decimal_float_supported_p ())
 | 
      
         | 9394 |  |  |                 error_at (loc,
 | 
      
         | 9395 |  |  |                           ("decimal floating point not supported "
 | 
      
         | 9396 |  |  |                            "for this target"));
 | 
      
         | 9397 |  |  |               pedwarn (loc, OPT_pedantic,
 | 
      
         | 9398 |  |  |                        "ISO C does not support decimal floating point");
 | 
      
         | 9399 |  |  |               return specs;
 | 
      
         | 9400 |  |  |             case RID_FRACT:
 | 
      
         | 9401 |  |  |             case RID_ACCUM:
 | 
      
         | 9402 |  |  |               {
 | 
      
         | 9403 |  |  |                 const char *str;
 | 
      
         | 9404 |  |  |                 if (i == RID_FRACT)
 | 
      
         | 9405 |  |  |                   str = "_Fract";
 | 
      
         | 9406 |  |  |                 else
 | 
      
         | 9407 |  |  |                   str = "_Accum";
 | 
      
         | 9408 |  |  |                 if (specs->complex_p)
 | 
      
         | 9409 |  |  |                   error_at (loc,
 | 
      
         | 9410 |  |  |                             ("both %<complex%> and %<%s%> in "
 | 
      
         | 9411 |  |  |                              "declaration specifiers"),
 | 
      
         | 9412 |  |  |                             str);
 | 
      
         | 9413 |  |  |                 else if (i == RID_FRACT)
 | 
      
         | 9414 |  |  |                     specs->typespec_word = cts_fract;
 | 
      
         | 9415 |  |  |                 else
 | 
      
         | 9416 |  |  |                     specs->typespec_word = cts_accum;
 | 
      
         | 9417 |  |  |               }
 | 
      
         | 9418 |  |  |               if (!targetm.fixed_point_supported_p ())
 | 
      
         | 9419 |  |  |                 error_at (loc,
 | 
      
         | 9420 |  |  |                           "fixed-point types not supported for this target");
 | 
      
         | 9421 |  |  |               pedwarn (loc, OPT_pedantic,
 | 
      
         | 9422 |  |  |                        "ISO C does not support fixed-point types");
 | 
      
         | 9423 |  |  |               return specs;
 | 
      
         | 9424 |  |  |             default:
 | 
      
         | 9425 |  |  |               /* ObjC reserved word "id", handled below.  */
 | 
      
         | 9426 |  |  |               break;
 | 
      
         | 9427 |  |  |             }
 | 
      
         | 9428 |  |  |         }
 | 
      
         | 9429 |  |  |     }
 | 
      
         | 9430 |  |  |  
 | 
      
         | 9431 |  |  |   /* Now we have a typedef (a TYPE_DECL node), an identifier (some
 | 
      
         | 9432 |  |  |      form of ObjC type, cases such as "int" and "long" being handled
 | 
      
         | 9433 |  |  |      above), a TYPE (struct, union, enum and typeof specifiers) or an
 | 
      
         | 9434 |  |  |      ERROR_MARK.  In none of these cases may there have previously
 | 
      
         | 9435 |  |  |      been any type specifiers.  */
 | 
      
         | 9436 |  |  |   if (specs->type || specs->typespec_word != cts_none
 | 
      
         | 9437 |  |  |       || specs->long_p || specs->short_p || specs->signed_p
 | 
      
         | 9438 |  |  |       || specs->unsigned_p || specs->complex_p)
 | 
      
         | 9439 |  |  |     error_at (loc, "two or more data types in declaration specifiers");
 | 
      
         | 9440 |  |  |   else if (TREE_CODE (type) == TYPE_DECL)
 | 
      
         | 9441 |  |  |     {
 | 
      
         | 9442 |  |  |       if (TREE_TYPE (type) == error_mark_node)
 | 
      
         | 9443 |  |  |         ; /* Allow the type to default to int to avoid cascading errors.  */
 | 
      
         | 9444 |  |  |       else
 | 
      
         | 9445 |  |  |         {
 | 
      
         | 9446 |  |  |           specs->type = TREE_TYPE (type);
 | 
      
         | 9447 |  |  |           specs->decl_attr = DECL_ATTRIBUTES (type);
 | 
      
         | 9448 |  |  |           specs->typedef_p = true;
 | 
      
         | 9449 |  |  |           specs->explicit_signed_p = C_TYPEDEF_EXPLICITLY_SIGNED (type);
 | 
      
         | 9450 |  |  |  
 | 
      
         | 9451 |  |  |           /* If this typedef name is defined in a struct, then a C++
 | 
      
         | 9452 |  |  |              lookup would return a different value.  */
 | 
      
         | 9453 |  |  |           if (warn_cxx_compat
 | 
      
         | 9454 |  |  |               && I_SYMBOL_BINDING (DECL_NAME (type))->in_struct)
 | 
      
         | 9455 |  |  |             warning_at (loc, OPT_Wc___compat,
 | 
      
         | 9456 |  |  |                         "C++ lookup of %qD would return a field, not a type",
 | 
      
         | 9457 |  |  |                         type);
 | 
      
         | 9458 |  |  |  
 | 
      
         | 9459 |  |  |           /* If we are parsing a struct, record that a struct field
 | 
      
         | 9460 |  |  |              used a typedef.  */
 | 
      
         | 9461 |  |  |           if (warn_cxx_compat && struct_parse_info != NULL)
 | 
      
         | 9462 |  |  |             VEC_safe_push (tree, heap, struct_parse_info->typedefs_seen, type);
 | 
      
         | 9463 |  |  |         }
 | 
      
         | 9464 |  |  |     }
 | 
      
         | 9465 |  |  |   else if (TREE_CODE (type) == IDENTIFIER_NODE)
 | 
      
         | 9466 |  |  |     {
 | 
      
         | 9467 |  |  |       tree t = lookup_name (type);
 | 
      
         | 9468 |  |  |       if (!t || TREE_CODE (t) != TYPE_DECL)
 | 
      
         | 9469 |  |  |         error_at (loc, "%qE fails to be a typedef or built in type", type);
 | 
      
         | 9470 |  |  |       else if (TREE_TYPE (t) == error_mark_node)
 | 
      
         | 9471 |  |  |         ;
 | 
      
         | 9472 |  |  |       else
 | 
      
         | 9473 |  |  |         specs->type = TREE_TYPE (t);
 | 
      
         | 9474 |  |  |     }
 | 
      
         | 9475 |  |  |   else
 | 
      
         | 9476 |  |  |     {
 | 
      
         | 9477 |  |  |       if (TREE_CODE (type) != ERROR_MARK && spec.kind == ctsk_typeof)
 | 
      
         | 9478 |  |  |         {
 | 
      
         | 9479 |  |  |           specs->typedef_p = true;
 | 
      
         | 9480 |  |  |           if (spec.expr)
 | 
      
         | 9481 |  |  |             {
 | 
      
         | 9482 |  |  |               if (specs->expr)
 | 
      
         | 9483 |  |  |                 specs->expr = build2 (COMPOUND_EXPR, TREE_TYPE (spec.expr),
 | 
      
         | 9484 |  |  |                                       specs->expr, spec.expr);
 | 
      
         | 9485 |  |  |               else
 | 
      
         | 9486 |  |  |                 specs->expr = spec.expr;
 | 
      
         | 9487 |  |  |               specs->expr_const_operands &= spec.expr_const_operands;
 | 
      
         | 9488 |  |  |             }
 | 
      
         | 9489 |  |  |         }
 | 
      
         | 9490 |  |  |       specs->type = type;
 | 
      
         | 9491 |  |  |     }
 | 
      
         | 9492 |  |  |  
 | 
      
         | 9493 |  |  |   return specs;
 | 
      
         | 9494 |  |  | }
 | 
      
         | 9495 |  |  |  
 | 
      
         | 9496 |  |  | /* Add the storage class specifier or function specifier SCSPEC to the
 | 
      
         | 9497 |  |  |    declaration specifiers SPECS, returning SPECS.  */
 | 
      
         | 9498 |  |  |  
 | 
      
         | 9499 |  |  | struct c_declspecs *
 | 
      
         | 9500 |  |  | declspecs_add_scspec (struct c_declspecs *specs, tree scspec)
 | 
      
         | 9501 |  |  | {
 | 
      
         | 9502 |  |  |   enum rid i;
 | 
      
         | 9503 |  |  |   enum c_storage_class n = csc_none;
 | 
      
         | 9504 |  |  |   bool dupe = false;
 | 
      
         | 9505 |  |  |   specs->declspecs_seen_p = true;
 | 
      
         | 9506 |  |  |   gcc_assert (TREE_CODE (scspec) == IDENTIFIER_NODE
 | 
      
         | 9507 |  |  |               && C_IS_RESERVED_WORD (scspec));
 | 
      
         | 9508 |  |  |   i = C_RID_CODE (scspec);
 | 
      
         | 9509 |  |  |   if (specs->non_sc_seen_p)
 | 
      
         | 9510 |  |  |     warning (OPT_Wold_style_declaration,
 | 
      
         | 9511 |  |  |              "%qE is not at beginning of declaration", scspec);
 | 
      
         | 9512 |  |  |   switch (i)
 | 
      
         | 9513 |  |  |     {
 | 
      
         | 9514 |  |  |     case RID_INLINE:
 | 
      
         | 9515 |  |  |       /* C99 permits duplicate inline.  Although of doubtful utility,
 | 
      
         | 9516 |  |  |          it seems simplest to permit it in gnu89 mode as well, as
 | 
      
         | 9517 |  |  |          there is also little utility in maintaining this as a
 | 
      
         | 9518 |  |  |          difference between gnu89 and C99 inline.  */
 | 
      
         | 9519 |  |  |       dupe = false;
 | 
      
         | 9520 |  |  |       specs->inline_p = true;
 | 
      
         | 9521 |  |  |       break;
 | 
      
         | 9522 |  |  |     case RID_NORETURN:
 | 
      
         | 9523 |  |  |       /* Duplicate _Noreturn is permitted.  */
 | 
      
         | 9524 |  |  |       dupe = false;
 | 
      
         | 9525 |  |  |       specs->noreturn_p = true;
 | 
      
         | 9526 |  |  |       break;
 | 
      
         | 9527 |  |  |     case RID_THREAD:
 | 
      
         | 9528 |  |  |       dupe = specs->thread_p;
 | 
      
         | 9529 |  |  |       if (specs->storage_class == csc_auto)
 | 
      
         | 9530 |  |  |         error ("%<__thread%> used with %<auto%>");
 | 
      
         | 9531 |  |  |       else if (specs->storage_class == csc_register)
 | 
      
         | 9532 |  |  |         error ("%<__thread%> used with %<register%>");
 | 
      
         | 9533 |  |  |       else if (specs->storage_class == csc_typedef)
 | 
      
         | 9534 |  |  |         error ("%<__thread%> used with %<typedef%>");
 | 
      
         | 9535 |  |  |       else
 | 
      
         | 9536 |  |  |         specs->thread_p = true;
 | 
      
         | 9537 |  |  |       break;
 | 
      
         | 9538 |  |  |     case RID_AUTO:
 | 
      
         | 9539 |  |  |       n = csc_auto;
 | 
      
         | 9540 |  |  |       break;
 | 
      
         | 9541 |  |  |     case RID_EXTERN:
 | 
      
         | 9542 |  |  |       n = csc_extern;
 | 
      
         | 9543 |  |  |       /* Diagnose "__thread extern".  */
 | 
      
         | 9544 |  |  |       if (specs->thread_p)
 | 
      
         | 9545 |  |  |         error ("%<__thread%> before %<extern%>");
 | 
      
         | 9546 |  |  |       break;
 | 
      
         | 9547 |  |  |     case RID_REGISTER:
 | 
      
         | 9548 |  |  |       n = csc_register;
 | 
      
         | 9549 |  |  |       break;
 | 
      
         | 9550 |  |  |     case RID_STATIC:
 | 
      
         | 9551 |  |  |       n = csc_static;
 | 
      
         | 9552 |  |  |       /* Diagnose "__thread static".  */
 | 
      
         | 9553 |  |  |       if (specs->thread_p)
 | 
      
         | 9554 |  |  |         error ("%<__thread%> before %<static%>");
 | 
      
         | 9555 |  |  |       break;
 | 
      
         | 9556 |  |  |     case RID_TYPEDEF:
 | 
      
         | 9557 |  |  |       n = csc_typedef;
 | 
      
         | 9558 |  |  |       break;
 | 
      
         | 9559 |  |  |     default:
 | 
      
         | 9560 |  |  |       gcc_unreachable ();
 | 
      
         | 9561 |  |  |     }
 | 
      
         | 9562 |  |  |   if (n != csc_none && n == specs->storage_class)
 | 
      
         | 9563 |  |  |     dupe = true;
 | 
      
         | 9564 |  |  |   if (dupe)
 | 
      
         | 9565 |  |  |     error ("duplicate %qE", scspec);
 | 
      
         | 9566 |  |  |   if (n != csc_none)
 | 
      
         | 9567 |  |  |     {
 | 
      
         | 9568 |  |  |       if (specs->storage_class != csc_none && n != specs->storage_class)
 | 
      
         | 9569 |  |  |         {
 | 
      
         | 9570 |  |  |           error ("multiple storage classes in declaration specifiers");
 | 
      
         | 9571 |  |  |         }
 | 
      
         | 9572 |  |  |       else
 | 
      
         | 9573 |  |  |         {
 | 
      
         | 9574 |  |  |           specs->storage_class = n;
 | 
      
         | 9575 |  |  |           if (n != csc_extern && n != csc_static && specs->thread_p)
 | 
      
         | 9576 |  |  |             {
 | 
      
         | 9577 |  |  |               error ("%<__thread%> used with %qE", scspec);
 | 
      
         | 9578 |  |  |               specs->thread_p = false;
 | 
      
         | 9579 |  |  |             }
 | 
      
         | 9580 |  |  |         }
 | 
      
         | 9581 |  |  |     }
 | 
      
         | 9582 |  |  |   return specs;
 | 
      
         | 9583 |  |  | }
 | 
      
         | 9584 |  |  |  
 | 
      
         | 9585 |  |  | /* Add the attributes ATTRS to the declaration specifiers SPECS,
 | 
      
         | 9586 |  |  |    returning SPECS.  */
 | 
      
         | 9587 |  |  |  
 | 
      
         | 9588 |  |  | struct c_declspecs *
 | 
      
         | 9589 |  |  | declspecs_add_attrs (struct c_declspecs *specs, tree attrs)
 | 
      
         | 9590 |  |  | {
 | 
      
         | 9591 |  |  |   specs->attrs = chainon (attrs, specs->attrs);
 | 
      
         | 9592 |  |  |   specs->declspecs_seen_p = true;
 | 
      
         | 9593 |  |  |   return specs;
 | 
      
         | 9594 |  |  | }
 | 
      
         | 9595 |  |  |  
 | 
      
         | 9596 |  |  | /* Add an _Alignas specifier (expression ALIGN, or type whose
 | 
      
         | 9597 |  |  |    alignment is ALIGN) to the declaration specifiers SPECS, returning
 | 
      
         | 9598 |  |  |    SPECS.  */
 | 
      
         | 9599 |  |  | struct c_declspecs *
 | 
      
         | 9600 |  |  | declspecs_add_alignas (struct c_declspecs *specs, tree align)
 | 
      
         | 9601 |  |  | {
 | 
      
         | 9602 |  |  |   int align_log;
 | 
      
         | 9603 |  |  |   specs->alignas_p = true;
 | 
      
         | 9604 |  |  |   if (align == error_mark_node)
 | 
      
         | 9605 |  |  |     return specs;
 | 
      
         | 9606 |  |  |   align_log = check_user_alignment (align, true);
 | 
      
         | 9607 |  |  |   if (align_log > specs->align_log)
 | 
      
         | 9608 |  |  |     specs->align_log = align_log;
 | 
      
         | 9609 |  |  |   return specs;
 | 
      
         | 9610 |  |  | }
 | 
      
         | 9611 |  |  |  
 | 
      
         | 9612 |  |  | /* Combine "long", "short", "signed", "unsigned" and "_Complex" type
 | 
      
         | 9613 |  |  |    specifiers with any other type specifier to determine the resulting
 | 
      
         | 9614 |  |  |    type.  This is where ISO C checks on complex types are made, since
 | 
      
         | 9615 |  |  |    "_Complex long" is a prefix of the valid ISO C type "_Complex long
 | 
      
         | 9616 |  |  |    double".  */
 | 
      
         | 9617 |  |  |  
 | 
      
         | 9618 |  |  | struct c_declspecs *
 | 
      
         | 9619 |  |  | finish_declspecs (struct c_declspecs *specs)
 | 
      
         | 9620 |  |  | {
 | 
      
         | 9621 |  |  |   /* If a type was specified as a whole, we have no modifiers and are
 | 
      
         | 9622 |  |  |      done.  */
 | 
      
         | 9623 |  |  |   if (specs->type != NULL_TREE)
 | 
      
         | 9624 |  |  |     {
 | 
      
         | 9625 |  |  |       gcc_assert (!specs->long_p && !specs->long_long_p && !specs->short_p
 | 
      
         | 9626 |  |  |                   && !specs->signed_p && !specs->unsigned_p
 | 
      
         | 9627 |  |  |                   && !specs->complex_p);
 | 
      
         | 9628 |  |  |  
 | 
      
         | 9629 |  |  |       /* Set a dummy type.  */
 | 
      
         | 9630 |  |  |       if (TREE_CODE (specs->type) == ERROR_MARK)
 | 
      
         | 9631 |  |  |         specs->type = integer_type_node;
 | 
      
         | 9632 |  |  |       return specs;
 | 
      
         | 9633 |  |  |     }
 | 
      
         | 9634 |  |  |  
 | 
      
         | 9635 |  |  |   /* If none of "void", "_Bool", "char", "int", "float" or "double"
 | 
      
         | 9636 |  |  |      has been specified, treat it as "int" unless "_Complex" is
 | 
      
         | 9637 |  |  |      present and there are no other specifiers.  If we just have
 | 
      
         | 9638 |  |  |      "_Complex", it is equivalent to "_Complex double", but e.g.
 | 
      
         | 9639 |  |  |      "_Complex short" is equivalent to "_Complex short int".  */
 | 
      
         | 9640 |  |  |   if (specs->typespec_word == cts_none)
 | 
      
         | 9641 |  |  |     {
 | 
      
         | 9642 |  |  |       if (specs->saturating_p)
 | 
      
         | 9643 |  |  |         {
 | 
      
         | 9644 |  |  |           error ("%<_Sat%> is used without %<_Fract%> or %<_Accum%>");
 | 
      
         | 9645 |  |  |           if (!targetm.fixed_point_supported_p ())
 | 
      
         | 9646 |  |  |             error ("fixed-point types not supported for this target");
 | 
      
         | 9647 |  |  |           specs->typespec_word = cts_fract;
 | 
      
         | 9648 |  |  |         }
 | 
      
         | 9649 |  |  |       else if (specs->long_p || specs->short_p
 | 
      
         | 9650 |  |  |                || specs->signed_p || specs->unsigned_p)
 | 
      
         | 9651 |  |  |         {
 | 
      
         | 9652 |  |  |           specs->typespec_word = cts_int;
 | 
      
         | 9653 |  |  |         }
 | 
      
         | 9654 |  |  |       else if (specs->complex_p)
 | 
      
         | 9655 |  |  |         {
 | 
      
         | 9656 |  |  |           specs->typespec_word = cts_double;
 | 
      
         | 9657 |  |  |           pedwarn (input_location, OPT_pedantic,
 | 
      
         | 9658 |  |  |                    "ISO C does not support plain %<complex%> meaning "
 | 
      
         | 9659 |  |  |                    "%<double complex%>");
 | 
      
         | 9660 |  |  |         }
 | 
      
         | 9661 |  |  |       else
 | 
      
         | 9662 |  |  |         {
 | 
      
         | 9663 |  |  |           specs->typespec_word = cts_int;
 | 
      
         | 9664 |  |  |           specs->default_int_p = true;
 | 
      
         | 9665 |  |  |           /* We don't diagnose this here because grokdeclarator will
 | 
      
         | 9666 |  |  |              give more specific diagnostics according to whether it is
 | 
      
         | 9667 |  |  |              a function definition.  */
 | 
      
         | 9668 |  |  |         }
 | 
      
         | 9669 |  |  |     }
 | 
      
         | 9670 |  |  |  
 | 
      
         | 9671 |  |  |   /* If "signed" was specified, record this to distinguish "int" and
 | 
      
         | 9672 |  |  |      "signed int" in the case of a bit-field with
 | 
      
         | 9673 |  |  |      -funsigned-bitfields.  */
 | 
      
         | 9674 |  |  |   specs->explicit_signed_p = specs->signed_p;
 | 
      
         | 9675 |  |  |  
 | 
      
         | 9676 |  |  |   /* Now compute the actual type.  */
 | 
      
         | 9677 |  |  |   switch (specs->typespec_word)
 | 
      
         | 9678 |  |  |     {
 | 
      
         | 9679 |  |  |     case cts_void:
 | 
      
         | 9680 |  |  |       gcc_assert (!specs->long_p && !specs->short_p
 | 
      
         | 9681 |  |  |                   && !specs->signed_p && !specs->unsigned_p
 | 
      
         | 9682 |  |  |                   && !specs->complex_p);
 | 
      
         | 9683 |  |  |       specs->type = void_type_node;
 | 
      
         | 9684 |  |  |       break;
 | 
      
         | 9685 |  |  |     case cts_bool:
 | 
      
         | 9686 |  |  |       gcc_assert (!specs->long_p && !specs->short_p
 | 
      
         | 9687 |  |  |                   && !specs->signed_p && !specs->unsigned_p
 | 
      
         | 9688 |  |  |                   && !specs->complex_p);
 | 
      
         | 9689 |  |  |       specs->type = boolean_type_node;
 | 
      
         | 9690 |  |  |       break;
 | 
      
         | 9691 |  |  |     case cts_char:
 | 
      
         | 9692 |  |  |       gcc_assert (!specs->long_p && !specs->short_p);
 | 
      
         | 9693 |  |  |       gcc_assert (!(specs->signed_p && specs->unsigned_p));
 | 
      
         | 9694 |  |  |       if (specs->signed_p)
 | 
      
         | 9695 |  |  |         specs->type = signed_char_type_node;
 | 
      
         | 9696 |  |  |       else if (specs->unsigned_p)
 | 
      
         | 9697 |  |  |         specs->type = unsigned_char_type_node;
 | 
      
         | 9698 |  |  |       else
 | 
      
         | 9699 |  |  |         specs->type = char_type_node;
 | 
      
         | 9700 |  |  |       if (specs->complex_p)
 | 
      
         | 9701 |  |  |         {
 | 
      
         | 9702 |  |  |           pedwarn (input_location, OPT_pedantic,
 | 
      
         | 9703 |  |  |                    "ISO C does not support complex integer types");
 | 
      
         | 9704 |  |  |           specs->type = build_complex_type (specs->type);
 | 
      
         | 9705 |  |  |         }
 | 
      
         | 9706 |  |  |       break;
 | 
      
         | 9707 |  |  |     case cts_int128:
 | 
      
         | 9708 |  |  |       gcc_assert (!specs->long_p && !specs->short_p && !specs->long_long_p);
 | 
      
         | 9709 |  |  |       gcc_assert (!(specs->signed_p && specs->unsigned_p));
 | 
      
         | 9710 |  |  |       specs->type = (specs->unsigned_p
 | 
      
         | 9711 |  |  |                      ? int128_unsigned_type_node
 | 
      
         | 9712 |  |  |                      : int128_integer_type_node);
 | 
      
         | 9713 |  |  |       if (specs->complex_p)
 | 
      
         | 9714 |  |  |         {
 | 
      
         | 9715 |  |  |           pedwarn (input_location, OPT_pedantic,
 | 
      
         | 9716 |  |  |                    "ISO C does not support complex integer types");
 | 
      
         | 9717 |  |  |           specs->type = build_complex_type (specs->type);
 | 
      
         | 9718 |  |  |         }
 | 
      
         | 9719 |  |  |       break;
 | 
      
         | 9720 |  |  |     case cts_int:
 | 
      
         | 9721 |  |  |       gcc_assert (!(specs->long_p && specs->short_p));
 | 
      
         | 9722 |  |  |       gcc_assert (!(specs->signed_p && specs->unsigned_p));
 | 
      
         | 9723 |  |  |       if (specs->long_long_p)
 | 
      
         | 9724 |  |  |         specs->type = (specs->unsigned_p
 | 
      
         | 9725 |  |  |                        ? long_long_unsigned_type_node
 | 
      
         | 9726 |  |  |                        : long_long_integer_type_node);
 | 
      
         | 9727 |  |  |       else if (specs->long_p)
 | 
      
         | 9728 |  |  |         specs->type = (specs->unsigned_p
 | 
      
         | 9729 |  |  |                        ? long_unsigned_type_node
 | 
      
         | 9730 |  |  |                        : long_integer_type_node);
 | 
      
         | 9731 |  |  |       else if (specs->short_p)
 | 
      
         | 9732 |  |  |         specs->type = (specs->unsigned_p
 | 
      
         | 9733 |  |  |                        ? short_unsigned_type_node
 | 
      
         | 9734 |  |  |                        : short_integer_type_node);
 | 
      
         | 9735 |  |  |       else
 | 
      
         | 9736 |  |  |         specs->type = (specs->unsigned_p
 | 
      
         | 9737 |  |  |                        ? unsigned_type_node
 | 
      
         | 9738 |  |  |                        : integer_type_node);
 | 
      
         | 9739 |  |  |       if (specs->complex_p)
 | 
      
         | 9740 |  |  |         {
 | 
      
         | 9741 |  |  |           pedwarn (input_location, OPT_pedantic,
 | 
      
         | 9742 |  |  |                    "ISO C does not support complex integer types");
 | 
      
         | 9743 |  |  |           specs->type = build_complex_type (specs->type);
 | 
      
         | 9744 |  |  |         }
 | 
      
         | 9745 |  |  |       break;
 | 
      
         | 9746 |  |  |     case cts_float:
 | 
      
         | 9747 |  |  |       gcc_assert (!specs->long_p && !specs->short_p
 | 
      
         | 9748 |  |  |                   && !specs->signed_p && !specs->unsigned_p);
 | 
      
         | 9749 |  |  |       specs->type = (specs->complex_p
 | 
      
         | 9750 |  |  |                      ? complex_float_type_node
 | 
      
         | 9751 |  |  |                      : float_type_node);
 | 
      
         | 9752 |  |  |       break;
 | 
      
         | 9753 |  |  |     case cts_double:
 | 
      
         | 9754 |  |  |       gcc_assert (!specs->long_long_p && !specs->short_p
 | 
      
         | 9755 |  |  |                   && !specs->signed_p && !specs->unsigned_p);
 | 
      
         | 9756 |  |  |       if (specs->long_p)
 | 
      
         | 9757 |  |  |         {
 | 
      
         | 9758 |  |  |           specs->type = (specs->complex_p
 | 
      
         | 9759 |  |  |                          ? complex_long_double_type_node
 | 
      
         | 9760 |  |  |                          : long_double_type_node);
 | 
      
         | 9761 |  |  |         }
 | 
      
         | 9762 |  |  |       else
 | 
      
         | 9763 |  |  |         {
 | 
      
         | 9764 |  |  |           specs->type = (specs->complex_p
 | 
      
         | 9765 |  |  |                          ? complex_double_type_node
 | 
      
         | 9766 |  |  |                          : double_type_node);
 | 
      
         | 9767 |  |  |         }
 | 
      
         | 9768 |  |  |       break;
 | 
      
         | 9769 |  |  |     case cts_dfloat32:
 | 
      
         | 9770 |  |  |     case cts_dfloat64:
 | 
      
         | 9771 |  |  |     case cts_dfloat128:
 | 
      
         | 9772 |  |  |       gcc_assert (!specs->long_p && !specs->long_long_p && !specs->short_p
 | 
      
         | 9773 |  |  |                   && !specs->signed_p && !specs->unsigned_p && !specs->complex_p);
 | 
      
         | 9774 |  |  |       if (specs->typespec_word == cts_dfloat32)
 | 
      
         | 9775 |  |  |         specs->type = dfloat32_type_node;
 | 
      
         | 9776 |  |  |       else if (specs->typespec_word == cts_dfloat64)
 | 
      
         | 9777 |  |  |         specs->type = dfloat64_type_node;
 | 
      
         | 9778 |  |  |       else
 | 
      
         | 9779 |  |  |         specs->type = dfloat128_type_node;
 | 
      
         | 9780 |  |  |       break;
 | 
      
         | 9781 |  |  |     case cts_fract:
 | 
      
         | 9782 |  |  |       gcc_assert (!specs->complex_p);
 | 
      
         | 9783 |  |  |       if (!targetm.fixed_point_supported_p ())
 | 
      
         | 9784 |  |  |         specs->type = integer_type_node;
 | 
      
         | 9785 |  |  |       else if (specs->saturating_p)
 | 
      
         | 9786 |  |  |         {
 | 
      
         | 9787 |  |  |           if (specs->long_long_p)
 | 
      
         | 9788 |  |  |             specs->type = specs->unsigned_p
 | 
      
         | 9789 |  |  |                           ? sat_unsigned_long_long_fract_type_node
 | 
      
         | 9790 |  |  |                           : sat_long_long_fract_type_node;
 | 
      
         | 9791 |  |  |           else if (specs->long_p)
 | 
      
         | 9792 |  |  |             specs->type = specs->unsigned_p
 | 
      
         | 9793 |  |  |                           ? sat_unsigned_long_fract_type_node
 | 
      
         | 9794 |  |  |                           : sat_long_fract_type_node;
 | 
      
         | 9795 |  |  |           else if (specs->short_p)
 | 
      
         | 9796 |  |  |             specs->type = specs->unsigned_p
 | 
      
         | 9797 |  |  |                           ? sat_unsigned_short_fract_type_node
 | 
      
         | 9798 |  |  |                           : sat_short_fract_type_node;
 | 
      
         | 9799 |  |  |           else
 | 
      
         | 9800 |  |  |             specs->type = specs->unsigned_p
 | 
      
         | 9801 |  |  |                           ? sat_unsigned_fract_type_node
 | 
      
         | 9802 |  |  |                           : sat_fract_type_node;
 | 
      
         | 9803 |  |  |         }
 | 
      
         | 9804 |  |  |       else
 | 
      
         | 9805 |  |  |         {
 | 
      
         | 9806 |  |  |           if (specs->long_long_p)
 | 
      
         | 9807 |  |  |             specs->type = specs->unsigned_p
 | 
      
         | 9808 |  |  |                           ? unsigned_long_long_fract_type_node
 | 
      
         | 9809 |  |  |                           : long_long_fract_type_node;
 | 
      
         | 9810 |  |  |           else if (specs->long_p)
 | 
      
         | 9811 |  |  |             specs->type = specs->unsigned_p
 | 
      
         | 9812 |  |  |                           ? unsigned_long_fract_type_node
 | 
      
         | 9813 |  |  |                           : long_fract_type_node;
 | 
      
         | 9814 |  |  |           else if (specs->short_p)
 | 
      
         | 9815 |  |  |             specs->type = specs->unsigned_p
 | 
      
         | 9816 |  |  |                           ? unsigned_short_fract_type_node
 | 
      
         | 9817 |  |  |                           : short_fract_type_node;
 | 
      
         | 9818 |  |  |           else
 | 
      
         | 9819 |  |  |             specs->type = specs->unsigned_p
 | 
      
         | 9820 |  |  |                           ? unsigned_fract_type_node
 | 
      
         | 9821 |  |  |                           : fract_type_node;
 | 
      
         | 9822 |  |  |         }
 | 
      
         | 9823 |  |  |       break;
 | 
      
         | 9824 |  |  |     case cts_accum:
 | 
      
         | 9825 |  |  |       gcc_assert (!specs->complex_p);
 | 
      
         | 9826 |  |  |       if (!targetm.fixed_point_supported_p ())
 | 
      
         | 9827 |  |  |         specs->type = integer_type_node;
 | 
      
         | 9828 |  |  |       else if (specs->saturating_p)
 | 
      
         | 9829 |  |  |         {
 | 
      
         | 9830 |  |  |           if (specs->long_long_p)
 | 
      
         | 9831 |  |  |             specs->type = specs->unsigned_p
 | 
      
         | 9832 |  |  |                           ? sat_unsigned_long_long_accum_type_node
 | 
      
         | 9833 |  |  |                           : sat_long_long_accum_type_node;
 | 
      
         | 9834 |  |  |           else if (specs->long_p)
 | 
      
         | 9835 |  |  |             specs->type = specs->unsigned_p
 | 
      
         | 9836 |  |  |                           ? sat_unsigned_long_accum_type_node
 | 
      
         | 9837 |  |  |                           : sat_long_accum_type_node;
 | 
      
         | 9838 |  |  |           else if (specs->short_p)
 | 
      
         | 9839 |  |  |             specs->type = specs->unsigned_p
 | 
      
         | 9840 |  |  |                           ? sat_unsigned_short_accum_type_node
 | 
      
         | 9841 |  |  |                           : sat_short_accum_type_node;
 | 
      
         | 9842 |  |  |           else
 | 
      
         | 9843 |  |  |             specs->type = specs->unsigned_p
 | 
      
         | 9844 |  |  |                           ? sat_unsigned_accum_type_node
 | 
      
         | 9845 |  |  |                           : sat_accum_type_node;
 | 
      
         | 9846 |  |  |         }
 | 
      
         | 9847 |  |  |       else
 | 
      
         | 9848 |  |  |         {
 | 
      
         | 9849 |  |  |           if (specs->long_long_p)
 | 
      
         | 9850 |  |  |             specs->type = specs->unsigned_p
 | 
      
         | 9851 |  |  |                           ? unsigned_long_long_accum_type_node
 | 
      
         | 9852 |  |  |                           : long_long_accum_type_node;
 | 
      
         | 9853 |  |  |           else if (specs->long_p)
 | 
      
         | 9854 |  |  |             specs->type = specs->unsigned_p
 | 
      
         | 9855 |  |  |                           ? unsigned_long_accum_type_node
 | 
      
         | 9856 |  |  |                           : long_accum_type_node;
 | 
      
         | 9857 |  |  |           else if (specs->short_p)
 | 
      
         | 9858 |  |  |             specs->type = specs->unsigned_p
 | 
      
         | 9859 |  |  |                           ? unsigned_short_accum_type_node
 | 
      
         | 9860 |  |  |                           : short_accum_type_node;
 | 
      
         | 9861 |  |  |           else
 | 
      
         | 9862 |  |  |             specs->type = specs->unsigned_p
 | 
      
         | 9863 |  |  |                           ? unsigned_accum_type_node
 | 
      
         | 9864 |  |  |                           : accum_type_node;
 | 
      
         | 9865 |  |  |         }
 | 
      
         | 9866 |  |  |       break;
 | 
      
         | 9867 |  |  |     default:
 | 
      
         | 9868 |  |  |       gcc_unreachable ();
 | 
      
         | 9869 |  |  |     }
 | 
      
         | 9870 |  |  |  
 | 
      
         | 9871 |  |  |   return specs;
 | 
      
         | 9872 |  |  | }
 | 
      
         | 9873 |  |  |  
 | 
      
         | 9874 |  |  | /* A subroutine of c_write_global_declarations.  Perform final processing
 | 
      
         | 9875 |  |  |    on one file scope's declarations (or the external scope's declarations),
 | 
      
         | 9876 |  |  |    GLOBALS.  */
 | 
      
         | 9877 |  |  |  
 | 
      
         | 9878 |  |  | static void
 | 
      
         | 9879 |  |  | c_write_global_declarations_1 (tree globals)
 | 
      
         | 9880 |  |  | {
 | 
      
         | 9881 |  |  |   tree decl;
 | 
      
         | 9882 |  |  |   bool reconsider;
 | 
      
         | 9883 |  |  |  
 | 
      
         | 9884 |  |  |   /* Process the decls in the order they were written.  */
 | 
      
         | 9885 |  |  |   for (decl = globals; decl; decl = DECL_CHAIN (decl))
 | 
      
         | 9886 |  |  |     {
 | 
      
         | 9887 |  |  |       /* Check for used but undefined static functions using the C
 | 
      
         | 9888 |  |  |          standard's definition of "used", and set TREE_NO_WARNING so
 | 
      
         | 9889 |  |  |          that check_global_declarations doesn't repeat the check.  */
 | 
      
         | 9890 |  |  |       if (TREE_CODE (decl) == FUNCTION_DECL
 | 
      
         | 9891 |  |  |           && DECL_INITIAL (decl) == 0
 | 
      
         | 9892 |  |  |           && DECL_EXTERNAL (decl)
 | 
      
         | 9893 |  |  |           && !TREE_PUBLIC (decl)
 | 
      
         | 9894 |  |  |           && C_DECL_USED (decl))
 | 
      
         | 9895 |  |  |         {
 | 
      
         | 9896 |  |  |           pedwarn (input_location, 0, "%q+F used but never defined", decl);
 | 
      
         | 9897 |  |  |           TREE_NO_WARNING (decl) = 1;
 | 
      
         | 9898 |  |  |         }
 | 
      
         | 9899 |  |  |  
 | 
      
         | 9900 |  |  |       wrapup_global_declaration_1 (decl);
 | 
      
         | 9901 |  |  |     }
 | 
      
         | 9902 |  |  |  
 | 
      
         | 9903 |  |  |   do
 | 
      
         | 9904 |  |  |     {
 | 
      
         | 9905 |  |  |       reconsider = false;
 | 
      
         | 9906 |  |  |       for (decl = globals; decl; decl = DECL_CHAIN (decl))
 | 
      
         | 9907 |  |  |         reconsider |= wrapup_global_declaration_2 (decl);
 | 
      
         | 9908 |  |  |     }
 | 
      
         | 9909 |  |  |   while (reconsider);
 | 
      
         | 9910 |  |  |  
 | 
      
         | 9911 |  |  |   for (decl = globals; decl; decl = DECL_CHAIN (decl))
 | 
      
         | 9912 |  |  |     check_global_declaration_1 (decl);
 | 
      
         | 9913 |  |  | }
 | 
      
         | 9914 |  |  |  
 | 
      
         | 9915 |  |  | /* A subroutine of c_write_global_declarations Emit debug information for each
 | 
      
         | 9916 |  |  |    of the declarations in GLOBALS.  */
 | 
      
         | 9917 |  |  |  
 | 
      
         | 9918 |  |  | static void
 | 
      
         | 9919 |  |  | c_write_global_declarations_2 (tree globals)
 | 
      
         | 9920 |  |  | {
 | 
      
         | 9921 |  |  |   tree decl;
 | 
      
         | 9922 |  |  |  
 | 
      
         | 9923 |  |  |   for (decl = globals; decl ; decl = DECL_CHAIN (decl))
 | 
      
         | 9924 |  |  |     debug_hooks->global_decl (decl);
 | 
      
         | 9925 |  |  | }
 | 
      
         | 9926 |  |  |  
 | 
      
         | 9927 |  |  | /* Callback to collect a source_ref from a DECL.  */
 | 
      
         | 9928 |  |  |  
 | 
      
         | 9929 |  |  | static void
 | 
      
         | 9930 |  |  | collect_source_ref_cb (tree decl)
 | 
      
         | 9931 |  |  | {
 | 
      
         | 9932 |  |  |   if (!DECL_IS_BUILTIN (decl))
 | 
      
         | 9933 |  |  |     collect_source_ref (LOCATION_FILE (decl_sloc (decl, false)));
 | 
      
         | 9934 |  |  | }
 | 
      
         | 9935 |  |  |  
 | 
      
         | 9936 |  |  | /* Preserve the external declarations scope across a garbage collect.  */
 | 
      
         | 9937 |  |  | static GTY(()) tree ext_block;
 | 
      
         | 9938 |  |  |  
 | 
      
         | 9939 |  |  | /* Collect all references relevant to SOURCE_FILE.  */
 | 
      
         | 9940 |  |  |  
 | 
      
         | 9941 |  |  | static void
 | 
      
         | 9942 |  |  | collect_all_refs (const char *source_file)
 | 
      
         | 9943 |  |  | {
 | 
      
         | 9944 |  |  |   tree t;
 | 
      
         | 9945 |  |  |   unsigned i;
 | 
      
         | 9946 |  |  |  
 | 
      
         | 9947 |  |  |   FOR_EACH_VEC_ELT (tree, all_translation_units, i, t)
 | 
      
         | 9948 |  |  |     collect_ada_nodes (BLOCK_VARS (DECL_INITIAL (t)), source_file);
 | 
      
         | 9949 |  |  |  
 | 
      
         | 9950 |  |  |   collect_ada_nodes (BLOCK_VARS (ext_block), source_file);
 | 
      
         | 9951 |  |  | }
 | 
      
         | 9952 |  |  |  
 | 
      
         | 9953 |  |  | /* Iterate over all global declarations and call CALLBACK.  */
 | 
      
         | 9954 |  |  |  
 | 
      
         | 9955 |  |  | static void
 | 
      
         | 9956 |  |  | for_each_global_decl (void (*callback) (tree decl))
 | 
      
         | 9957 |  |  | {
 | 
      
         | 9958 |  |  |   tree t;
 | 
      
         | 9959 |  |  |   tree decls;
 | 
      
         | 9960 |  |  |   tree decl;
 | 
      
         | 9961 |  |  |   unsigned i;
 | 
      
         | 9962 |  |  |  
 | 
      
         | 9963 |  |  |   FOR_EACH_VEC_ELT (tree, all_translation_units, i, t)
 | 
      
         | 9964 |  |  |     {
 | 
      
         | 9965 |  |  |       decls = DECL_INITIAL (t);
 | 
      
         | 9966 |  |  |       for (decl = BLOCK_VARS (decls); decl; decl = TREE_CHAIN (decl))
 | 
      
         | 9967 |  |  |         callback (decl);
 | 
      
         | 9968 |  |  |     }
 | 
      
         | 9969 |  |  |  
 | 
      
         | 9970 |  |  |   for (decl = BLOCK_VARS (ext_block); decl; decl = TREE_CHAIN (decl))
 | 
      
         | 9971 |  |  |     callback (decl);
 | 
      
         | 9972 |  |  | }
 | 
      
         | 9973 |  |  |  
 | 
      
         | 9974 |  |  | void
 | 
      
         | 9975 |  |  | c_write_global_declarations (void)
 | 
      
         | 9976 |  |  | {
 | 
      
         | 9977 |  |  |   tree t;
 | 
      
         | 9978 |  |  |   unsigned i;
 | 
      
         | 9979 |  |  |  
 | 
      
         | 9980 |  |  |   /* We don't want to do this if generating a PCH.  */
 | 
      
         | 9981 |  |  |   if (pch_file)
 | 
      
         | 9982 |  |  |     return;
 | 
      
         | 9983 |  |  |  
 | 
      
         | 9984 |  |  |   timevar_start (TV_PHASE_DEFERRED);
 | 
      
         | 9985 |  |  |  
 | 
      
         | 9986 |  |  |   /* Do the Objective-C stuff.  This is where all the Objective-C
 | 
      
         | 9987 |  |  |      module stuff gets generated (symtab, class/protocol/selector
 | 
      
         | 9988 |  |  |      lists etc).  */
 | 
      
         | 9989 |  |  |   if (c_dialect_objc ())
 | 
      
         | 9990 |  |  |     objc_write_global_declarations ();
 | 
      
         | 9991 |  |  |  
 | 
      
         | 9992 |  |  |   /* Close the external scope.  */
 | 
      
         | 9993 |  |  |   ext_block = pop_scope ();
 | 
      
         | 9994 |  |  |   external_scope = 0;
 | 
      
         | 9995 |  |  |   gcc_assert (!current_scope);
 | 
      
         | 9996 |  |  |  
 | 
      
         | 9997 |  |  |   /* Handle -fdump-ada-spec[-slim]. */
 | 
      
         | 9998 |  |  |   if (dump_enabled_p (TDI_ada))
 | 
      
         | 9999 |  |  |     {
 | 
      
         | 10000 |  |  |       /* Build a table of files to generate specs for */
 | 
      
         | 10001 |  |  |       if (get_dump_file_info (TDI_ada)->flags & TDF_SLIM)
 | 
      
         | 10002 |  |  |         collect_source_ref (main_input_filename);
 | 
      
         | 10003 |  |  |       else
 | 
      
         | 10004 |  |  |         for_each_global_decl (collect_source_ref_cb);
 | 
      
         | 10005 |  |  |  
 | 
      
         | 10006 |  |  |       dump_ada_specs (collect_all_refs, NULL);
 | 
      
         | 10007 |  |  |     }
 | 
      
         | 10008 |  |  |  
 | 
      
         | 10009 |  |  |   if (ext_block)
 | 
      
         | 10010 |  |  |     {
 | 
      
         | 10011 |  |  |       tree tmp = BLOCK_VARS (ext_block);
 | 
      
         | 10012 |  |  |       int flags;
 | 
      
         | 10013 |  |  |       FILE * stream = dump_begin (TDI_tu, &flags);
 | 
      
         | 10014 |  |  |       if (stream && tmp)
 | 
      
         | 10015 |  |  |         {
 | 
      
         | 10016 |  |  |           dump_node (tmp, flags & ~TDF_SLIM, stream);
 | 
      
         | 10017 |  |  |           dump_end (TDI_tu, stream);
 | 
      
         | 10018 |  |  |         }
 | 
      
         | 10019 |  |  |     }
 | 
      
         | 10020 |  |  |  
 | 
      
         | 10021 |  |  |   /* Process all file scopes in this compilation, and the external_scope,
 | 
      
         | 10022 |  |  |      through wrapup_global_declarations and check_global_declarations.  */
 | 
      
         | 10023 |  |  |   FOR_EACH_VEC_ELT (tree, all_translation_units, i, t)
 | 
      
         | 10024 |  |  |     c_write_global_declarations_1 (BLOCK_VARS (DECL_INITIAL (t)));
 | 
      
         | 10025 |  |  |   c_write_global_declarations_1 (BLOCK_VARS (ext_block));
 | 
      
         | 10026 |  |  |  
 | 
      
         | 10027 |  |  |   timevar_stop (TV_PHASE_DEFERRED);
 | 
      
         | 10028 |  |  |   timevar_start (TV_PHASE_CGRAPH);
 | 
      
         | 10029 |  |  |  
 | 
      
         | 10030 |  |  |   /* We're done parsing; proceed to optimize and emit assembly.
 | 
      
         | 10031 |  |  |      FIXME: shouldn't be the front end's responsibility to call this.  */
 | 
      
         | 10032 |  |  |   cgraph_finalize_compilation_unit ();
 | 
      
         | 10033 |  |  |  
 | 
      
         | 10034 |  |  |   timevar_stop (TV_PHASE_CGRAPH);
 | 
      
         | 10035 |  |  |   timevar_start (TV_PHASE_DBGINFO);
 | 
      
         | 10036 |  |  |  
 | 
      
         | 10037 |  |  |   /* After cgraph has had a chance to emit everything that's going to
 | 
      
         | 10038 |  |  |      be emitted, output debug information for globals.  */
 | 
      
         | 10039 |  |  |   if (!seen_error ())
 | 
      
         | 10040 |  |  |     {
 | 
      
         | 10041 |  |  |       timevar_push (TV_SYMOUT);
 | 
      
         | 10042 |  |  |       FOR_EACH_VEC_ELT (tree, all_translation_units, i, t)
 | 
      
         | 10043 |  |  |         c_write_global_declarations_2 (BLOCK_VARS (DECL_INITIAL (t)));
 | 
      
         | 10044 |  |  |       c_write_global_declarations_2 (BLOCK_VARS (ext_block));
 | 
      
         | 10045 |  |  |       timevar_pop (TV_SYMOUT);
 | 
      
         | 10046 |  |  |     }
 | 
      
         | 10047 |  |  |  
 | 
      
         | 10048 |  |  |   ext_block = NULL;
 | 
      
         | 10049 |  |  |   timevar_stop (TV_PHASE_DBGINFO);
 | 
      
         | 10050 |  |  | }
 | 
      
         | 10051 |  |  |  
 | 
      
         | 10052 |  |  | /* Register reserved keyword WORD as qualifier for address space AS.  */
 | 
      
         | 10053 |  |  |  
 | 
      
         | 10054 |  |  | void
 | 
      
         | 10055 |  |  | c_register_addr_space (const char *word, addr_space_t as)
 | 
      
         | 10056 |  |  | {
 | 
      
         | 10057 |  |  |   int rid = RID_FIRST_ADDR_SPACE + as;
 | 
      
         | 10058 |  |  |   tree id;
 | 
      
         | 10059 |  |  |  
 | 
      
         | 10060 |  |  |   /* Address space qualifiers are only supported
 | 
      
         | 10061 |  |  |      in C with GNU extensions enabled.  */
 | 
      
         | 10062 |  |  |   if (c_dialect_objc () || flag_no_asm)
 | 
      
         | 10063 |  |  |     return;
 | 
      
         | 10064 |  |  |  
 | 
      
         | 10065 |  |  |   id = get_identifier (word);
 | 
      
         | 10066 |  |  |   C_SET_RID_CODE (id, rid);
 | 
      
         | 10067 |  |  |   C_IS_RESERVED_WORD (id) = 1;
 | 
      
         | 10068 |  |  |   ridpointers [rid] = id;
 | 
      
         | 10069 |  |  | }
 | 
      
         | 10070 |  |  |  
 | 
      
         | 10071 |  |  | #include "gt-c-decl.h"
 |