|
|
1.1 root 1: /* Process declarations and variables for C compiler.
2: Copyright (C) 1988, 1992 Free Software Foundation, Inc.
3:
4: This file is part of GNU CC.
5:
6: GNU CC is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 2, or (at your option)
9: any later version.
10:
11: GNU CC is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with GNU CC; see the file COPYING. If not, write to
18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19:
20:
21: /* Process declarations and symbol lookup for C front end.
22: Also constructs types; the standard scalar types at initialization,
23: and structure, union, array and enum types when they are declared. */
24:
25: /* ??? not all decl nodes are given the most useful possible
26: line numbers. For example, the CONST_DECLs for enum values. */
27:
28: #include "config.h"
29: #include "tree.h"
30: #include "flags.h"
31: #include "c-tree.h"
32: #include "c-lex.h"
33: #include <stdio.h>
34:
35: /* In grokdeclarator, distinguish syntactic contexts of declarators. */
36: enum decl_context
37: { NORMAL, /* Ordinary declaration */
38: FUNCDEF, /* Function definition */
39: PARM, /* Declaration of parm before function body */
40: FIELD, /* Declaration inside struct or union */
41: BITFIELD, /* Likewise but with specified width */
42: TYPENAME}; /* Typename (inside cast or sizeof) */
43:
44: #ifndef CHAR_TYPE_SIZE
45: #define CHAR_TYPE_SIZE BITS_PER_UNIT
46: #endif
47:
48: #ifndef SHORT_TYPE_SIZE
49: #define SHORT_TYPE_SIZE (BITS_PER_UNIT * MIN ((UNITS_PER_WORD + 1) / 2, 2))
50: #endif
51:
52: #ifndef INT_TYPE_SIZE
53: #define INT_TYPE_SIZE BITS_PER_WORD
54: #endif
55:
56: #ifndef LONG_TYPE_SIZE
57: #define LONG_TYPE_SIZE BITS_PER_WORD
58: #endif
59:
60: #ifndef LONG_LONG_TYPE_SIZE
61: #define LONG_LONG_TYPE_SIZE (BITS_PER_WORD * 2)
62: #endif
63:
64: #ifndef WCHAR_UNSIGNED
65: #define WCHAR_UNSIGNED 0
66: #endif
67:
68: #ifndef FLOAT_TYPE_SIZE
69: #define FLOAT_TYPE_SIZE BITS_PER_WORD
70: #endif
71:
72: #ifndef DOUBLE_TYPE_SIZE
73: #define DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
74: #endif
75:
76: #ifndef LONG_DOUBLE_TYPE_SIZE
77: #define LONG_DOUBLE_TYPE_SIZE (BITS_PER_WORD * 2)
78: #endif
79:
80: /* We let tm.h override the types used here, to handle trivial differences
81: such as the choice of unsigned int or long unsigned int for size_t.
82: When machines start needing nontrivial differences in the size type,
83: it would be best to do something here to figure out automatically
84: from other information what type to use. */
85:
86: #ifndef SIZE_TYPE
87: #define SIZE_TYPE "long unsigned int"
88: #endif
89:
90: #ifndef PTRDIFF_TYPE
91: #define PTRDIFF_TYPE "long int"
92: #endif
93:
94: #ifndef WCHAR_TYPE
95: #define WCHAR_TYPE "int"
96: #endif
97:
98: /* a node which has tree code ERROR_MARK, and whose type is itself.
99: All erroneous expressions are replaced with this node. All functions
100: that accept nodes as arguments should avoid generating error messages
101: if this node is one of the arguments, since it is undesirable to get
102: multiple error messages from one error in the input. */
103:
104: tree error_mark_node;
105:
106: /* INTEGER_TYPE and REAL_TYPE nodes for the standard data types */
107:
108: tree short_integer_type_node;
109: tree integer_type_node;
110: tree long_integer_type_node;
111: tree long_long_integer_type_node;
112:
113: tree short_unsigned_type_node;
114: tree unsigned_type_node;
115: tree long_unsigned_type_node;
116: tree long_long_unsigned_type_node;
117:
118: tree ptrdiff_type_node;
119:
120: tree unsigned_char_type_node;
121: tree signed_char_type_node;
122: tree char_type_node;
123: tree wchar_type_node;
124: tree signed_wchar_type_node;
125: tree unsigned_wchar_type_node;
126:
127: tree float_type_node;
128: tree double_type_node;
129: tree long_double_type_node;
130:
1.1.1.5 ! root 131: tree complex_integer_type_node;
! 132: tree complex_float_type_node;
! 133: tree complex_double_type_node;
! 134: tree complex_long_double_type_node;
! 135:
1.1.1.4 root 136: tree intQI_type_node;
137: tree intHI_type_node;
138: tree intSI_type_node;
139: tree intDI_type_node;
140:
141: tree unsigned_intQI_type_node;
142: tree unsigned_intHI_type_node;
143: tree unsigned_intSI_type_node;
144: tree unsigned_intDI_type_node;
145:
1.1 root 146: /* a VOID_TYPE node. */
147:
148: tree void_type_node;
149:
150: /* Nodes for types `void *' and `const void *'. */
151:
152: tree ptr_type_node, const_ptr_type_node;
153:
154: /* Nodes for types `char *' and `const char *'. */
155:
156: tree string_type_node, const_string_type_node;
157:
1.1.1.5 ! root 158: /* Type `char[SOMENUMBER]'.
1.1 root 159: Used when an array of char is needed and the size is irrelevant. */
160:
161: tree char_array_type_node;
162:
1.1.1.5 ! root 163: /* Type `int[SOMENUMBER]' or something like it.
1.1 root 164: Used when an array of int needed and the size is irrelevant. */
165:
166: tree int_array_type_node;
167:
1.1.1.5 ! root 168: /* Type `wchar_t[SOMENUMBER]' or something like it.
1.1 root 169: Used when a wide string literal is created. */
170:
171: tree wchar_array_type_node;
172:
173: /* type `int ()' -- used for implicit declaration of functions. */
174:
175: tree default_function_type;
176:
177: /* function types `double (double)' and `double (double, double)', etc. */
178:
179: tree double_ftype_double, double_ftype_double_double;
180: tree int_ftype_int, long_ftype_long;
181:
182: /* Function type `void (void *, void *, int)' and similar ones */
183:
184: tree void_ftype_ptr_ptr_int, int_ftype_ptr_ptr_int, void_ftype_ptr_int_int;
185:
186: /* Function type `char *(char *, char *)' and similar ones */
187: tree string_ftype_ptr_ptr, int_ftype_string_string;
188:
189: /* Function type `int (const void *, const void *, size_t)' */
190: tree int_ftype_cptr_cptr_sizet;
191:
192: /* Two expressions that are constants with value zero.
193: The first is of type `int', the second of type `void *'. */
194:
195: tree integer_zero_node;
196: tree null_pointer_node;
197:
198: /* A node for the integer constant 1. */
199:
200: tree integer_one_node;
201:
202: /* Nonzero if we have seen an invalid cross reference
203: to a struct, union, or enum, but not yet printed the message. */
204:
205: tree pending_invalid_xref;
206: /* File and line to appear in the eventual error message. */
207: char *pending_invalid_xref_file;
208: int pending_invalid_xref_line;
209:
210: /* While defining an enum type, this is 1 plus the last enumerator
211: constant value. */
212:
213: static tree enum_next_value;
214:
1.1.1.3 root 215: /* Nonzero means that there was overflow computing enum_next_value. */
216:
217: static int enum_overflow;
218:
1.1 root 219: /* Parsing a function declarator leaves a list of parameter names
220: or a chain or parameter decls here. */
221:
222: static tree last_function_parms;
223:
224: /* Parsing a function declarator leaves here a chain of structure
225: and enum types declared in the parmlist. */
226:
227: static tree last_function_parm_tags;
228:
229: /* After parsing the declarator that starts a function definition,
230: `start_function' puts here the list of parameter names or chain of decls.
231: `store_parm_decls' finds it here. */
232:
233: static tree current_function_parms;
234:
235: /* Similar, for last_function_parm_tags. */
236: static tree current_function_parm_tags;
237:
1.1.1.5 ! root 238: /* Similar, for the file and line that the prototype came from if this is
! 239: an old-style definition. */
! 240: static char *current_function_prototype_file;
! 241: static int current_function_prototype_line;
! 242:
1.1 root 243: /* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function
244: that have names. Here so we can clear out their names' definitions
245: at the end of the function. */
246:
1.1.1.4 root 247: static tree named_labels;
1.1 root 248:
249: /* A list of LABEL_DECLs from outer contexts that are currently shadowed. */
250:
251: static tree shadowed_labels;
252:
253: /* Nonzero when store_parm_decls is called indicates a varargs function.
254: Value not meaningful after store_parm_decls. */
255:
256: static int c_function_varargs;
257:
258: /* The FUNCTION_DECL for the function currently being compiled,
259: or 0 if between functions. */
260: tree current_function_decl;
261:
262: /* Set to 0 at beginning of a function definition, set to 1 if
263: a return statement that specifies a return value is seen. */
264:
265: int current_function_returns_value;
266:
267: /* Set to 0 at beginning of a function definition, set to 1 if
268: a return statement with no argument is seen. */
269:
270: int current_function_returns_null;
271:
272: /* Set to nonzero by `grokdeclarator' for a function
273: whose return type is defaulted, if warnings for this are desired. */
274:
275: static int warn_about_return_type;
276:
1.1.1.2 root 277: /* Nonzero when starting a function declared `extern inline'. */
1.1 root 278:
279: static int current_extern_inline;
280:
281: /* For each binding contour we allocate a binding_level structure
282: * which records the names defined in that contour.
283: * Contours include:
284: * 0) the global one
285: * 1) one for each function definition,
286: * where internal declarations of the parameters appear.
287: * 2) one for each compound statement,
288: * to record its declarations.
289: *
290: * The current meaning of a name can be found by searching the levels from
291: * the current one out to the global one.
292: */
293:
294: /* Note that the information in the `names' component of the global contour
295: is duplicated in the IDENTIFIER_GLOBAL_VALUEs of all identifiers. */
296:
297: struct binding_level
298: {
299: /* A chain of _DECL nodes for all variables, constants, functions,
300: and typedef types. These are in the reverse of the order supplied.
301: */
302: tree names;
303:
304: /* A list of structure, union and enum definitions,
305: * for looking up tag names.
306: * It is a chain of TREE_LIST nodes, each of whose TREE_PURPOSE is a name,
307: * or NULL_TREE; and whose TREE_VALUE is a RECORD_TYPE, UNION_TYPE,
308: * or ENUMERAL_TYPE node.
309: */
310: tree tags;
311:
312: /* For each level, a list of shadowed outer-level local definitions
313: to be restored when this level is popped.
314: Each link is a TREE_LIST whose TREE_PURPOSE is an identifier and
315: whose TREE_VALUE is its old definition (a kind of ..._DECL node). */
316: tree shadowed;
317:
318: /* For each level (except not the global one),
319: a chain of BLOCK nodes for all the levels
320: that were entered and exited one level down. */
321: tree blocks;
322:
1.1.1.4 root 323: /* The BLOCK node for this level, if one has been preallocated.
324: If 0, the BLOCK is allocated (if needed) when the level is popped. */
325: tree this_block;
326:
1.1 root 327: /* The binding level which this one is contained in (inherits from). */
328: struct binding_level *level_chain;
329:
330: /* Nonzero for the level that holds the parameters of a function. */
331: char parm_flag;
332:
333: /* Nonzero if this level "doesn't exist" for tags. */
334: char tag_transparent;
335:
336: /* Nonzero if sublevels of this level "don't exist" for tags.
337: This is set in the parm level of a function definition
338: while reading the function body, so that the outermost block
339: of the function body will be tag-transparent. */
340: char subblocks_tag_transparent;
341:
342: /* Nonzero means make a BLOCK for this level regardless of all else. */
343: char keep;
344:
345: /* Nonzero means make a BLOCK if this level has any subblocks. */
346: char keep_if_subblocks;
347:
348: /* Number of decls in `names' that have incomplete
349: structure or union types. */
350: int n_incomplete;
351:
352: /* A list of decls giving the (reversed) specified order of parms,
353: not including any forward-decls in the parmlist.
354: This is so we can put the parms in proper order for assign_parms. */
355: tree parm_order;
356: };
357:
358: #define NULL_BINDING_LEVEL (struct binding_level *) NULL
359:
360: /* The binding level currently in effect. */
361:
362: static struct binding_level *current_binding_level;
363:
364: /* A chain of binding_level structures awaiting reuse. */
365:
366: static struct binding_level *free_binding_level;
367:
368: /* The outermost binding level, for names of file scope.
369: This is created when the compiler is started and exists
370: through the entire run. */
371:
372: static struct binding_level *global_binding_level;
373:
374: /* Binding level structures are initialized by copying this one. */
375:
376: static struct binding_level clear_binding_level
1.1.1.4 root 377: = {NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0};
1.1 root 378:
379: /* Nonzero means unconditionally make a BLOCK for the next level pushed. */
380:
381: static int keep_next_level_flag;
382:
383: /* Nonzero means make a BLOCK for the next level pushed
384: if it has subblocks. */
385:
386: static int keep_next_if_subblocks;
387:
388: /* The chain of outer levels of label scopes.
389: This uses the same data structure used for binding levels,
390: but it works differently: each link in the chain records
391: saved values of named_labels and shadowed_labels for
392: a label binding level outside the current one. */
393:
394: static struct binding_level *label_level_chain;
395:
396: /* Forward declarations. */
397:
398: static tree grokparms (), grokdeclarator ();
399: tree pushdecl ();
1.1.1.2 root 400: tree builtin_function ();
1.1.1.4 root 401: void shadow_tag_warned ();
1.1 root 402:
403: static tree lookup_tag ();
404: static tree lookup_tag_reverse ();
1.1.1.5 ! root 405: tree lookup_name_current_level ();
1.1 root 406: static char *redeclaration_error_message ();
407: static void layout_array_type ();
408:
409: /* C-specific option variables. */
410:
411: /* Nonzero means allow type mismatches in conditional expressions;
412: just make their values `void'. */
413:
414: int flag_cond_mismatch;
415:
416: /* Nonzero means give `double' the same size as `float'. */
417:
418: int flag_short_double;
419:
420: /* Nonzero means don't recognize the keyword `asm'. */
421:
422: int flag_no_asm;
423:
1.1.1.3 root 424: /* Nonzero means don't recognize any builtin functions. */
1.1 root 425:
426: int flag_no_builtin;
427:
1.1.1.3 root 428: /* Nonzero means don't recognize the non-ANSI builtin functions.
429: -ansi sets this. */
430:
431: int flag_no_nonansi_builtin;
432:
1.1 root 433: /* Nonzero means do some things the same way PCC does. */
434:
435: int flag_traditional;
436:
437: /* Nonzero means to treat bitfields as signed unless they say `unsigned'. */
438:
439: int flag_signed_bitfields = 1;
1.1.1.4 root 440: int explicit_flag_signed_bitfields = 0;
1.1 root 441:
442: /* Nonzero means handle `#ident' directives. 0 means ignore them. */
443:
444: int flag_no_ident = 0;
445:
446: /* Nonzero means warn about implicit declarations. */
447:
448: int warn_implicit;
449:
450: /* Nonzero means give string constants the type `const char *'
451: to get extra warnings from them. These warnings will be too numerous
452: to be useful, except in thoroughly ANSIfied programs. */
453:
454: int warn_write_strings;
455:
456: /* Nonzero means warn about pointer casts that can drop a type qualifier
457: from the pointer target type. */
458:
459: int warn_cast_qual;
460:
461: /* Warn about traditional constructs whose meanings changed in ANSI C. */
462:
463: int warn_traditional;
464:
465: /* Nonzero means warn about sizeof(function) or addition/subtraction
466: of function pointers. */
467:
468: int warn_pointer_arith;
469:
470: /* Nonzero means warn for non-prototype function decls
471: or non-prototyped defs without previous prototype. */
472:
473: int warn_strict_prototypes;
474:
475: /* Nonzero means warn for any global function def
476: without separate previous prototype decl. */
477:
478: int warn_missing_prototypes;
479:
480: /* Nonzero means warn about multiple (redundant) decls for the same single
481: variable or function. */
482:
483: int warn_redundant_decls = 0;
484:
485: /* Nonzero means warn about extern declarations of objects not at
486: file-scope level and about *all* declarations of functions (whether
487: extern or static) not at file-scope level. Note that we exclude
488: implicit function declarations. To get warnings about those, use
489: -Wimplicit. */
490:
491: int warn_nested_externs = 0;
492:
493: /* Warn about *printf or *scanf format/argument anomalies. */
494:
495: int warn_format;
496:
497: /* Warn about a subscript that has type char. */
498:
499: int warn_char_subscripts = 0;
500:
501: /* Warn if a type conversion is done that might have confusing results. */
502:
503: int warn_conversion;
504:
505: /* Warn if adding () is suggested. */
506:
1.1.1.2 root 507: int warn_parentheses;
1.1 root 508:
1.1.1.5 ! root 509: /* Warn if initializer is not completely bracketed. */
! 510:
! 511: int warn_missing_braces;
! 512:
1.1 root 513: /* Nonzero means `$' can be in an identifier.
514: See cccp.c for reasons why this breaks some obscure ANSI C programs. */
515:
516: #ifndef DOLLARS_IN_IDENTIFIERS
517: #define DOLLARS_IN_IDENTIFIERS 1
518: #endif
519: int dollars_in_ident = DOLLARS_IN_IDENTIFIERS > 1;
520:
521: /* Decode the string P as a language-specific option for C.
522: Return 1 if it is recognized (and handle it);
523: return 0 if not recognized. */
524:
525: int
526: c_decode_option (p)
527: char *p;
528: {
529: if (!strcmp (p, "-ftraditional") || !strcmp (p, "-traditional"))
530: {
531: flag_traditional = 1;
532: flag_writable_strings = 1;
533: #if DOLLARS_IN_IDENTIFIERS > 0
534: dollars_in_ident = 1;
535: #endif
536: }
1.1.1.4 root 537: else if (!strcmp (p, "-fnotraditional") || !strcmp (p, "-fno-traditional"))
538: {
539: flag_traditional = 0;
540: flag_writable_strings = 0;
541: dollars_in_ident = DOLLARS_IN_IDENTIFIERS > 1;
542: }
1.1 root 543: else if (!strcmp (p, "-fsigned-char"))
544: flag_signed_char = 1;
545: else if (!strcmp (p, "-funsigned-char"))
546: flag_signed_char = 0;
547: else if (!strcmp (p, "-fno-signed-char"))
548: flag_signed_char = 0;
549: else if (!strcmp (p, "-fno-unsigned-char"))
550: flag_signed_char = 1;
1.1.1.4 root 551: else if (!strcmp (p, "-fsigned-bitfields")
552: || !strcmp (p, "-fno-unsigned-bitfields"))
553: {
554: flag_signed_bitfields = 1;
555: explicit_flag_signed_bitfields = 1;
556: }
557: else if (!strcmp (p, "-funsigned-bitfields")
558: || !strcmp (p, "-fno-signed-bitfields"))
559: {
560: flag_signed_bitfields = 0;
561: explicit_flag_signed_bitfields = 1;
562: }
1.1 root 563: else if (!strcmp (p, "-fshort-enums"))
564: flag_short_enums = 1;
565: else if (!strcmp (p, "-fno-short-enums"))
566: flag_short_enums = 0;
567: else if (!strcmp (p, "-fcond-mismatch"))
568: flag_cond_mismatch = 1;
569: else if (!strcmp (p, "-fno-cond-mismatch"))
570: flag_cond_mismatch = 0;
571: else if (!strcmp (p, "-fshort-double"))
572: flag_short_double = 1;
573: else if (!strcmp (p, "-fno-short-double"))
574: flag_short_double = 0;
575: else if (!strcmp (p, "-fasm"))
576: flag_no_asm = 0;
577: else if (!strcmp (p, "-fno-asm"))
578: flag_no_asm = 1;
579: else if (!strcmp (p, "-fbuiltin"))
580: flag_no_builtin = 0;
581: else if (!strcmp (p, "-fno-builtin"))
582: flag_no_builtin = 1;
583: else if (!strcmp (p, "-fno-ident"))
584: flag_no_ident = 1;
585: else if (!strcmp (p, "-fident"))
586: flag_no_ident = 0;
587: else if (!strcmp (p, "-ansi"))
1.1.1.3 root 588: flag_no_asm = 1, flag_no_nonansi_builtin = 1, dollars_in_ident = 0;
1.1 root 589: else if (!strcmp (p, "-Wimplicit"))
590: warn_implicit = 1;
591: else if (!strcmp (p, "-Wno-implicit"))
592: warn_implicit = 0;
593: else if (!strcmp (p, "-Wwrite-strings"))
594: warn_write_strings = 1;
595: else if (!strcmp (p, "-Wno-write-strings"))
596: warn_write_strings = 0;
597: else if (!strcmp (p, "-Wcast-qual"))
598: warn_cast_qual = 1;
599: else if (!strcmp (p, "-Wno-cast-qual"))
600: warn_cast_qual = 0;
601: else if (!strcmp (p, "-Wpointer-arith"))
602: warn_pointer_arith = 1;
603: else if (!strcmp (p, "-Wno-pointer-arith"))
604: warn_pointer_arith = 0;
605: else if (!strcmp (p, "-Wstrict-prototypes"))
606: warn_strict_prototypes = 1;
607: else if (!strcmp (p, "-Wno-strict-prototypes"))
608: warn_strict_prototypes = 0;
609: else if (!strcmp (p, "-Wmissing-prototypes"))
610: warn_missing_prototypes = 1;
611: else if (!strcmp (p, "-Wno-missing-prototypes"))
612: warn_missing_prototypes = 0;
613: else if (!strcmp (p, "-Wredundant-decls"))
614: warn_redundant_decls = 1;
1.1.1.3 root 615: else if (!strcmp (p, "-Wno-redundant-decls"))
1.1 root 616: warn_redundant_decls = 0;
617: else if (!strcmp (p, "-Wnested-externs"))
618: warn_nested_externs = 1;
619: else if (!strcmp (p, "-Wno-nested-externs"))
620: warn_nested_externs = 0;
621: else if (!strcmp (p, "-Wtraditional"))
622: warn_traditional = 1;
623: else if (!strcmp (p, "-Wno-traditional"))
624: warn_traditional = 0;
625: else if (!strcmp (p, "-Wformat"))
626: warn_format = 1;
627: else if (!strcmp (p, "-Wno-format"))
628: warn_format = 0;
629: else if (!strcmp (p, "-Wchar-subscripts"))
630: warn_char_subscripts = 1;
631: else if (!strcmp (p, "-Wno-char-subscripts"))
632: warn_char_subscripts = 0;
633: else if (!strcmp (p, "-Wconversion"))
634: warn_conversion = 1;
635: else if (!strcmp (p, "-Wno-conversion"))
636: warn_conversion = 0;
637: else if (!strcmp (p, "-Wparentheses"))
638: warn_parentheses = 1;
639: else if (!strcmp (p, "-Wno-parentheses"))
640: warn_parentheses = 0;
1.1.1.4 root 641: else if (!strcmp (p, "-Wreturn-type"))
642: warn_return_type = 1;
643: else if (!strcmp (p, "-Wno-return-type"))
644: warn_return_type = 0;
1.1 root 645: else if (!strcmp (p, "-Wcomment"))
646: ; /* cpp handles this one. */
647: else if (!strcmp (p, "-Wno-comment"))
648: ; /* cpp handles this one. */
649: else if (!strcmp (p, "-Wcomments"))
650: ; /* cpp handles this one. */
651: else if (!strcmp (p, "-Wno-comments"))
652: ; /* cpp handles this one. */
653: else if (!strcmp (p, "-Wtrigraphs"))
654: ; /* cpp handles this one. */
655: else if (!strcmp (p, "-Wno-trigraphs"))
656: ; /* cpp handles this one. */
1.1.1.3 root 657: else if (!strcmp (p, "-Wimport"))
658: ; /* cpp handles this one. */
659: else if (!strcmp (p, "-Wno-import"))
660: ; /* cpp handles this one. */
1.1.1.5 ! root 661: else if (!strcmp (p, "-Wmissing-braces"))
! 662: warn_missing_braces = 1;
! 663: else if (!strcmp (p, "-Wno-missing-braces"))
! 664: warn_missing_braces = 0;
1.1 root 665: else if (!strcmp (p, "-Wall"))
666: {
667: extra_warnings = 1;
1.1.1.5 ! root 668: /* We save the value of warn_uninitialized, since if they put
! 669: -Wuninitialized on the command line, we need to generate a
! 670: warning about not using it without also specifying -O. */
! 671: if (warn_uninitialized != 1)
! 672: warn_uninitialized = 2;
1.1 root 673: warn_implicit = 1;
674: warn_return_type = 1;
675: warn_unused = 1;
676: warn_switch = 1;
677: warn_format = 1;
678: warn_char_subscripts = 1;
1.1.1.2 root 679: warn_parentheses = 1;
1.1.1.5 ! root 680: warn_missing_braces = 1;
1.1 root 681: }
682: else
683: return 0;
684:
685: return 1;
686: }
687:
688: /* Hooks for print_node. */
689:
690: void
691: print_lang_decl ()
692: {
693: }
694:
695: void
696: print_lang_type ()
697: {
698: }
699:
700: void
701: print_lang_identifier (file, node, indent)
702: FILE *file;
703: tree node;
704: int indent;
705: {
706: print_node (file, "global", IDENTIFIER_GLOBAL_VALUE (node), indent + 4);
707: print_node (file, "local", IDENTIFIER_LOCAL_VALUE (node), indent + 4);
708: print_node (file, "label", IDENTIFIER_LABEL_VALUE (node), indent + 4);
709: print_node (file, "implicit", IDENTIFIER_IMPLICIT_DECL (node), indent + 4);
710: print_node (file, "error locus", IDENTIFIER_ERROR_LOCUS (node), indent + 4);
1.1.1.4 root 711: print_node (file, "limbo value", IDENTIFIER_LIMBO_VALUE (node), indent + 4);
1.1 root 712: }
713:
1.1.1.5 ! root 714: /* Hook called at end of compilation to assume 1 elt
! 715: for a top-level array decl that wasn't complete before. */
! 716:
! 717: void
! 718: finish_incomplete_decl (decl)
! 719: tree decl;
! 720: {
! 721: if (TREE_CODE (decl) == VAR_DECL && TREE_TYPE (decl) != error_mark_node)
! 722: {
! 723: tree type = TREE_TYPE (decl);
! 724: if (TREE_CODE (type) == ARRAY_TYPE
! 725: && TYPE_DOMAIN (type) == 0
! 726: && TREE_CODE (decl) != TYPE_DECL)
! 727: {
! 728: complete_array_type (type, NULL_TREE, 1);
! 729:
! 730: layout_decl (decl, 0);
! 731: }
! 732: }
! 733: }
! 734:
1.1 root 735: /* Create a new `struct binding_level'. */
736:
737: static
738: struct binding_level *
739: make_binding_level ()
740: {
741: /* NOSTRICT */
742: return (struct binding_level *) xmalloc (sizeof (struct binding_level));
743: }
744:
745: /* Nonzero if we are currently in the global binding level. */
746:
747: int
748: global_bindings_p ()
749: {
750: return current_binding_level == global_binding_level;
751: }
752:
753: void
754: keep_next_level ()
755: {
756: keep_next_level_flag = 1;
757: }
758:
759: /* Nonzero if the current level needs to have a BLOCK made. */
760:
761: int
762: kept_level_p ()
763: {
764: return ((current_binding_level->keep_if_subblocks
765: && current_binding_level->blocks != 0)
766: || current_binding_level->keep
767: || current_binding_level->names != 0
768: || (current_binding_level->tags != 0
769: && !current_binding_level->tag_transparent));
770: }
771:
772: /* Identify this binding level as a level of parameters.
1.1.1.5 ! root 773: DEFINITION_FLAG is 1 for a definition, 0 for a declaration.
! 774: But it turns out there is no way to pass the right value for
! 775: DEFINITION_FLAG, so we ignore it. */
1.1 root 776:
777: void
778: declare_parm_level (definition_flag)
779: int definition_flag;
780: {
1.1.1.5 ! root 781: current_binding_level->parm_flag = 1;
1.1 root 782: }
783:
784: /* Nonzero if currently making parm declarations. */
785:
786: int
787: in_parm_level_p ()
788: {
789: return current_binding_level->parm_flag;
790: }
791:
792: /* Enter a new binding level.
793: If TAG_TRANSPARENT is nonzero, do so only for the name space of variables,
794: not for that of tags. */
795:
796: void
797: pushlevel (tag_transparent)
798: int tag_transparent;
799: {
800: register struct binding_level *newlevel = NULL_BINDING_LEVEL;
801:
802: /* If this is the top level of a function,
803: just make sure that NAMED_LABELS is 0. */
804:
805: if (current_binding_level == global_binding_level)
806: {
807: named_labels = 0;
808: }
809:
810: /* Reuse or create a struct for this binding level. */
811:
812: if (free_binding_level)
813: {
814: newlevel = free_binding_level;
815: free_binding_level = free_binding_level->level_chain;
816: }
817: else
818: {
819: newlevel = make_binding_level ();
820: }
821:
822: /* Add this level to the front of the chain (stack) of levels that
823: are active. */
824:
825: *newlevel = clear_binding_level;
826: newlevel->tag_transparent
827: = (tag_transparent
828: || (current_binding_level
829: ? current_binding_level->subblocks_tag_transparent
830: : 0));
831: newlevel->level_chain = current_binding_level;
832: current_binding_level = newlevel;
833: newlevel->keep = keep_next_level_flag;
834: keep_next_level_flag = 0;
835: newlevel->keep_if_subblocks = keep_next_if_subblocks;
836: keep_next_if_subblocks = 0;
837: }
838:
839: /* Exit a binding level.
840: Pop the level off, and restore the state of the identifier-decl mappings
841: that were in effect when this level was entered.
842:
843: If KEEP is nonzero, this level had explicit declarations, so
844: and create a "block" (a BLOCK node) for the level
845: to record its declarations and subblocks for symbol table output.
846:
847: If FUNCTIONBODY is nonzero, this level is the body of a function,
848: so create a block as if KEEP were set and also clear out all
849: label names.
850:
851: If REVERSE is nonzero, reverse the order of decls before putting
852: them into the BLOCK. */
853:
854: tree
855: poplevel (keep, reverse, functionbody)
856: int keep;
857: int reverse;
858: int functionbody;
859: {
860: register tree link;
861: /* The chain of decls was accumulated in reverse order.
862: Put it into forward order, just for cleanliness. */
863: tree decls;
864: tree tags = current_binding_level->tags;
865: tree subblocks = current_binding_level->blocks;
866: tree block = 0;
867: tree decl;
1.1.1.4 root 868: int block_previously_created;
1.1 root 869:
870: keep |= current_binding_level->keep;
871:
872: /* This warning is turned off because it causes warnings for
873: declarations like `extern struct foo *x'. */
874: #if 0
875: /* Warn about incomplete structure types in this level. */
876: for (link = tags; link; link = TREE_CHAIN (link))
877: if (TYPE_SIZE (TREE_VALUE (link)) == 0)
878: {
879: tree type = TREE_VALUE (link);
880: char *errmsg;
881: switch (TREE_CODE (type))
882: {
883: case RECORD_TYPE:
884: errmsg = "`struct %s' incomplete in scope ending here";
885: break;
886: case UNION_TYPE:
887: errmsg = "`union %s' incomplete in scope ending here";
888: break;
889: case ENUMERAL_TYPE:
890: errmsg = "`enum %s' incomplete in scope ending here";
891: break;
892: }
893: if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
894: error (errmsg, IDENTIFIER_POINTER (TYPE_NAME (type)));
895: else
896: /* If this type has a typedef-name, the TYPE_NAME is a TYPE_DECL. */
897: error (errmsg, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
898: }
899: #endif /* 0 */
900:
901: /* Get the decls in the order they were written.
902: Usually current_binding_level->names is in reverse order.
903: But parameter decls were previously put in forward order. */
904:
905: if (reverse)
906: current_binding_level->names
907: = decls = nreverse (current_binding_level->names);
908: else
909: decls = current_binding_level->names;
910:
911: /* Output any nested inline functions within this block
912: if they weren't already output. */
913:
914: for (decl = decls; decl; decl = TREE_CHAIN (decl))
915: if (TREE_CODE (decl) == FUNCTION_DECL
916: && ! TREE_ASM_WRITTEN (decl)
917: && DECL_INITIAL (decl) != 0
918: && TREE_ADDRESSABLE (decl))
1.1.1.4 root 919: {
920: /* If this decl was copied from a file-scope decl
921: on account of a block-scope extern decl,
922: propagate TREE_ADDRESSABLE to the file-scope decl. */
923: if (DECL_ABSTRACT_ORIGIN (decl) != 0)
924: TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (decl)) = 1;
925: else
926: output_inline_function (decl);
927: }
1.1 root 928:
929: /* If there were any declarations or structure tags in that level,
930: or if this level is a function body,
931: create a BLOCK to record them for the life of this function. */
932:
1.1.1.4 root 933: block = 0;
934: block_previously_created = (current_binding_level->this_block != 0);
935: if (block_previously_created)
936: block = current_binding_level->this_block;
937: else if (keep || functionbody
938: || (current_binding_level->keep_if_subblocks && subblocks != 0))
939: block = make_node (BLOCK);
940: if (block != 0)
941: {
942: BLOCK_VARS (block) = decls;
943: BLOCK_TYPE_TAGS (block) = tags;
944: BLOCK_SUBBLOCKS (block) = subblocks;
945: remember_end_note (block);
946: }
1.1 root 947:
948: /* In each subblock, record that this is its superior. */
949:
950: for (link = subblocks; link; link = TREE_CHAIN (link))
951: BLOCK_SUPERCONTEXT (link) = block;
952:
953: /* Clear out the meanings of the local variables of this level. */
954:
955: for (link = decls; link; link = TREE_CHAIN (link))
956: {
957: if (DECL_NAME (link) != 0)
958: {
959: /* If the ident. was used or addressed via a local extern decl,
960: don't forget that fact. */
1.1.1.4 root 961: if (DECL_EXTERNAL (link))
1.1 root 962: {
963: if (TREE_USED (link))
964: TREE_USED (DECL_NAME (link)) = 1;
965: if (TREE_ADDRESSABLE (link))
966: TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (link)) = 1;
967: }
968: IDENTIFIER_LOCAL_VALUE (DECL_NAME (link)) = 0;
969: }
970: }
971:
972: /* Restore all name-meanings of the outer levels
973: that were shadowed by this level. */
974:
975: for (link = current_binding_level->shadowed; link; link = TREE_CHAIN (link))
976: IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
977:
978: /* If the level being exited is the top level of a function,
979: check over all the labels, and clear out the current
980: (function local) meanings of their names. */
981:
982: if (functionbody)
983: {
984: /* If this is the top level block of a function,
985: the vars are the function's parameters.
986: Don't leave them in the BLOCK because they are
987: found in the FUNCTION_DECL instead. */
988:
989: BLOCK_VARS (block) = 0;
990:
991: /* Clear out the definitions of all label names,
992: since their scopes end here,
993: and add them to BLOCK_VARS. */
994:
995: for (link = named_labels; link; link = TREE_CHAIN (link))
996: {
997: register tree label = TREE_VALUE (link);
998:
999: if (DECL_INITIAL (label) == 0)
1000: {
1001: error_with_decl (label, "label `%s' used but not defined");
1002: /* Avoid crashing later. */
1003: define_label (input_filename, lineno,
1004: DECL_NAME (label));
1005: }
1006: else if (warn_unused && !TREE_USED (label))
1007: warning_with_decl (label, "label `%s' defined but not used");
1008: IDENTIFIER_LABEL_VALUE (DECL_NAME (label)) = 0;
1009:
1010: /* Put the labels into the "variables" of the
1011: top-level block, so debugger can see them. */
1012: TREE_CHAIN (label) = BLOCK_VARS (block);
1013: BLOCK_VARS (block) = label;
1014: }
1015: }
1016:
1017: /* Pop the current level, and free the structure for reuse. */
1018:
1019: {
1020: register struct binding_level *level = current_binding_level;
1021: current_binding_level = current_binding_level->level_chain;
1022:
1023: level->level_chain = free_binding_level;
1024: free_binding_level = level;
1025: }
1026:
1027: /* Dispose of the block that we just made inside some higher level. */
1028: if (functionbody)
1029: DECL_INITIAL (current_function_decl) = block;
1030: else if (block)
1.1.1.4 root 1031: {
1032: if (!block_previously_created)
1033: current_binding_level->blocks
1034: = chainon (current_binding_level->blocks, block);
1035: }
1.1 root 1036: /* If we did not make a block for the level just exited,
1037: any blocks made for inner levels
1038: (since they cannot be recorded as subblocks in that level)
1039: must be carried forward so they will later become subblocks
1040: of something else. */
1041: else if (subblocks)
1042: current_binding_level->blocks
1043: = chainon (current_binding_level->blocks, subblocks);
1044:
1045: /* Set the TYPE_CONTEXTs for all of the tagged types belonging to this
1046: binding contour so that they point to the appropriate construct, i.e.
1047: either to the current FUNCTION_DECL node, or else to the BLOCK node
1048: we just constructed.
1049:
1050: Note that for tagged types whose scope is just the formal parameter
1051: list for some function type specification, we can't properly set
1052: their TYPE_CONTEXTs here, because we don't have a pointer to the
1053: appropriate FUNCTION_TYPE node readily available to us. For those
1054: cases, the TYPE_CONTEXTs of the relevant tagged type nodes get set
1055: in `grokdeclarator' as soon as we have created the FUNCTION_TYPE
1056: node which will represent the "scope" for these "parameter list local"
1057: tagged types.
1058: */
1059:
1060: if (functionbody)
1061: for (link = tags; link; link = TREE_CHAIN (link))
1062: TYPE_CONTEXT (TREE_VALUE (link)) = current_function_decl;
1063: else if (block)
1064: for (link = tags; link; link = TREE_CHAIN (link))
1065: TYPE_CONTEXT (TREE_VALUE (link)) = block;
1066:
1067: if (block)
1068: TREE_USED (block) = 1;
1069: return block;
1070: }
1.1.1.4 root 1071:
1072: /* Delete the node BLOCK from the current binding level.
1073: This is used for the block inside a stmt expr ({...})
1074: so that the block can be reinserted where appropriate. */
1075:
1076: void
1077: delete_block (block)
1078: tree block;
1079: {
1080: tree t;
1081: if (current_binding_level->blocks == block)
1082: current_binding_level->blocks = TREE_CHAIN (block);
1083: for (t = current_binding_level->blocks; t;)
1084: {
1085: if (TREE_CHAIN (t) == block)
1086: TREE_CHAIN (t) = TREE_CHAIN (block);
1087: else
1088: t = TREE_CHAIN (t);
1089: }
1090: TREE_CHAIN (block) = NULL;
1091: /* Clear TREE_USED which is always set by poplevel.
1092: The flag is set again if insert_block is called. */
1093: TREE_USED (block) = 0;
1094: }
1095:
1096: /* Insert BLOCK at the end of the list of subblocks of the
1097: current binding level. This is used when a BIND_EXPR is expanded,
1098: to handle the BLOCK node inside teh BIND_EXPR. */
1099:
1100: void
1101: insert_block (block)
1102: tree block;
1103: {
1104: TREE_USED (block) = 1;
1105: current_binding_level->blocks
1106: = chainon (current_binding_level->blocks, block);
1107: }
1108:
1109: /* Set the BLOCK node for the innermost scope
1110: (the one we are currently in). */
1111:
1112: void
1113: set_block (block)
1114: register tree block;
1115: {
1116: current_binding_level->this_block = block;
1117: }
1.1 root 1118:
1119: void
1120: push_label_level ()
1121: {
1122: register struct binding_level *newlevel;
1123:
1124: /* Reuse or create a struct for this binding level. */
1125:
1126: if (free_binding_level)
1127: {
1128: newlevel = free_binding_level;
1129: free_binding_level = free_binding_level->level_chain;
1130: }
1131: else
1132: {
1133: newlevel = make_binding_level ();
1134: }
1135:
1136: /* Add this level to the front of the chain (stack) of label levels. */
1137:
1138: newlevel->level_chain = label_level_chain;
1139: label_level_chain = newlevel;
1140:
1141: newlevel->names = named_labels;
1142: newlevel->shadowed = shadowed_labels;
1143: named_labels = 0;
1144: shadowed_labels = 0;
1145: }
1146:
1147: void
1148: pop_label_level ()
1149: {
1150: register struct binding_level *level = label_level_chain;
1151: tree link, prev;
1152:
1153: /* Clear out the definitions of the declared labels in this level.
1154: Leave in the list any ordinary, non-declared labels. */
1155: for (link = named_labels, prev = 0; link;)
1156: {
1157: if (C_DECLARED_LABEL_FLAG (TREE_VALUE (link)))
1158: {
1159: if (DECL_SOURCE_LINE (TREE_VALUE (link)) == 0)
1160: {
1.1.1.5 ! root 1161: error_with_decl (TREE_VALUE (link),
! 1162: "label `%s' used but not defined");
1.1 root 1163: /* Avoid crashing later. */
1164: define_label (input_filename, lineno,
1165: DECL_NAME (TREE_VALUE (link)));
1166: }
1167: else if (warn_unused && !TREE_USED (TREE_VALUE (link)))
1168: warning_with_decl (TREE_VALUE (link),
1169: "label `%s' defined but not used");
1170: IDENTIFIER_LABEL_VALUE (DECL_NAME (TREE_VALUE (link))) = 0;
1171:
1172: /* Delete this element from the list. */
1173: link = TREE_CHAIN (link);
1174: if (prev)
1175: TREE_CHAIN (prev) = link;
1176: else
1177: named_labels = link;
1178: }
1179: else
1180: {
1181: prev = link;
1182: link = TREE_CHAIN (link);
1183: }
1184: }
1185:
1186: /* Bring back all the labels that were shadowed. */
1187: for (link = shadowed_labels; link; link = TREE_CHAIN (link))
1188: if (DECL_NAME (TREE_VALUE (link)) != 0)
1189: IDENTIFIER_LABEL_VALUE (DECL_NAME (TREE_VALUE (link)))
1190: = TREE_VALUE (link);
1191:
1192: named_labels = chainon (named_labels, level->names);
1193: shadowed_labels = level->shadowed;
1194:
1195: /* Pop the current level, and free the structure for reuse. */
1196: label_level_chain = label_level_chain->level_chain;
1197: level->level_chain = free_binding_level;
1198: free_binding_level = level;
1199: }
1200:
1201: /* Push a definition or a declaration of struct, union or enum tag "name".
1202: "type" should be the type node.
1203: We assume that the tag "name" is not already defined.
1204:
1205: Note that the definition may really be just a forward reference.
1206: In that case, the TYPE_SIZE will be zero. */
1207:
1208: void
1209: pushtag (name, type)
1210: tree name, type;
1211: {
1212: register struct binding_level *b;
1213:
1214: /* Find the proper binding level for this type tag. */
1215:
1216: for (b = current_binding_level; b->tag_transparent; b = b->level_chain)
1217: continue;
1218:
1219: if (name)
1220: {
1221: /* Record the identifier as the type's name if it has none. */
1222:
1223: if (TYPE_NAME (type) == 0)
1224: TYPE_NAME (type) = name;
1225: }
1226:
1.1.1.2 root 1227: if (b == global_binding_level)
1228: b->tags = perm_tree_cons (name, type, b->tags);
1229: else
1230: b->tags = saveable_tree_cons (name, type, b->tags);
1231:
1.1 root 1232: /* Create a fake NULL-named TYPE_DECL node whose TREE_TYPE will be the
1233: tagged type we just added to the current binding level. This fake
1234: NULL-named TYPE_DECL node helps dwarfout.c to know when it needs
1.1.1.4 root 1235: to output a representation of a tagged type, and it also gives
1.1 root 1236: us a convenient place to record the "scope start" address for the
1237: tagged type. */
1238:
1.1.1.4 root 1239: TYPE_STUB_DECL (type) = pushdecl (build_decl (TYPE_DECL, NULL_TREE, type));
1.1 root 1240: }
1241:
1242: /* Handle when a new declaration NEWDECL
1243: has the same name as an old one OLDDECL
1244: in the same binding contour.
1245: Prints an error message if appropriate.
1246:
1247: If safely possible, alter OLDDECL to look like NEWDECL, and return 1.
1248: Otherwise, return 0. */
1249:
1250: static int
1251: duplicate_decls (newdecl, olddecl)
1252: register tree newdecl, olddecl;
1253: {
1254: int types_match = comptypes (TREE_TYPE (newdecl), TREE_TYPE (olddecl));
1255: int new_is_definition = (TREE_CODE (newdecl) == FUNCTION_DECL
1256: && DECL_INITIAL (newdecl) != 0);
1.1.1.4 root 1257: tree oldtype = TREE_TYPE (olddecl);
1258: tree newtype = TREE_TYPE (newdecl);
1.1 root 1259:
1.1.1.4 root 1260: if (TREE_CODE (newtype) == ERROR_MARK
1261: || TREE_CODE (oldtype) == ERROR_MARK)
1.1 root 1262: types_match = 0;
1263:
1264: /* New decl is completely inconsistent with the old one =>
1265: tell caller to replace the old one.
1266: This is always an error except in the case of shadowing a builtin. */
1267: if (TREE_CODE (olddecl) != TREE_CODE (newdecl))
1268: {
1269: if (TREE_CODE (olddecl) == FUNCTION_DECL
1270: && DECL_BUILT_IN (olddecl))
1271: {
1272: /* If you declare a built-in function name as static, the
1273: built-in definition is overridden,
1274: but optionally warn this was a bad choice of name. */
1275: if (!TREE_PUBLIC (newdecl))
1276: {
1277: if (warn_shadow)
1278: warning_with_decl (newdecl, "shadowing built-in function `%s'");
1279: }
1280: /* Likewise, if the built-in is not ansi, then programs can
1.1.1.2 root 1281: override it even globally without an error. */
1.1 root 1282: else if (DECL_BUILT_IN_NONANSI (olddecl))
1283: warning_with_decl (newdecl,
1284: "built-in function `%s' declared as non-function");
1285: else
1286: error_with_decl (newdecl,
1287: "built-in function `%s' declared as non-function");
1288: }
1289: else if (TREE_CODE (olddecl) == FUNCTION_DECL
1290: && DECL_BUILT_IN_NONANSI (olddecl))
1291: {
1292: /* If overriding decl is static,
1293: optionally warn this was a bad choice of name. */
1294: if (!TREE_PUBLIC (newdecl))
1295: {
1296: if (warn_shadow)
1297: warning_with_decl (newdecl, "shadowing library function `%s'");
1298: }
1299: /* Otherwise, always warn. */
1300: else
1301: warning_with_decl (newdecl,
1302: "library function `%s' declared as non-function");
1303: }
1304: else
1305: {
1306: error_with_decl (newdecl, "`%s' redeclared as different kind of symbol");
1307: error_with_decl (olddecl, "previous declaration of `%s'");
1308: }
1309:
1310: return 0;
1311: }
1312:
1313: /* For real parm decl following a forward decl,
1314: return 1 so old decl will be reused. */
1315: if (types_match && TREE_CODE (newdecl) == PARM_DECL
1316: && TREE_ASM_WRITTEN (olddecl) && ! TREE_ASM_WRITTEN (newdecl))
1317: return 1;
1318:
1319: /* The new declaration is the same kind of object as the old one.
1320: The declarations may partially match. Print warnings if they don't
1321: match enough. Ultimately, copy most of the information from the new
1322: decl to the old one, and keep using the old one. */
1323:
1324: if (flag_traditional && TREE_CODE (newdecl) == FUNCTION_DECL
1325: && IDENTIFIER_IMPLICIT_DECL (DECL_NAME (newdecl)) == olddecl
1326: && DECL_INITIAL (olddecl) == 0)
1327: /* If -traditional, avoid error for redeclaring fcn
1328: after implicit decl. */
1329: ;
1330: else if (TREE_CODE (olddecl) == FUNCTION_DECL
1331: && DECL_BUILT_IN (olddecl))
1332: {
1.1.1.4 root 1333: /* A function declaration for a built-in function. */
1.1 root 1334: if (!TREE_PUBLIC (newdecl))
1335: {
1336: /* If you declare a built-in function name as static, the
1337: built-in definition is overridden,
1338: but optionally warn this was a bad choice of name. */
1339: if (warn_shadow)
1340: warning_with_decl (newdecl, "shadowing built-in function `%s'");
1341: /* Discard the old built-in function. */
1342: return 0;
1343: }
1344: else if (!types_match)
1.1.1.4 root 1345: {
1346: /* Accept the return type of the new declaration if same modes. */
1347: tree oldreturntype = TREE_TYPE (TREE_TYPE (olddecl));
1348: tree newreturntype = TREE_TYPE (TREE_TYPE (newdecl));
1349: if (TYPE_MODE (oldreturntype) == TYPE_MODE (newreturntype))
1350: {
1351: /* Function types may be shared, so we can't just modify
1352: the return type of olddecl's function type. */
1353: tree newtype
1354: = build_function_type (newreturntype,
1355: TYPE_ARG_TYPES (TREE_TYPE (olddecl)));
1356:
1357: types_match = comptypes (TREE_TYPE (newdecl), newtype);
1358: if (types_match)
1359: TREE_TYPE (olddecl) = newtype;
1360: }
1.1.1.5 ! root 1361: /* Accept harmless mismatch in first argument type also.
! 1362: This is for ffs. */
! 1363: if (TYPE_ARG_TYPES (TREE_TYPE (newdecl)) != 0
! 1364: && TYPE_ARG_TYPES (TREE_TYPE (olddecl)) != 0
! 1365: && TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (newdecl))) != 0
! 1366: && TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (olddecl))) != 0
! 1367: && (TYPE_MODE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (newdecl))))
! 1368: ==
! 1369: TYPE_MODE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (olddecl))))))
! 1370: {
! 1371: /* Function types may be shared, so we can't just modify
! 1372: the return type of olddecl's function type. */
! 1373: tree newtype
! 1374: = build_function_type (TREE_TYPE (TREE_TYPE (olddecl)),
! 1375: tree_cons (NULL_TREE,
! 1376: TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (newdecl))),
! 1377: TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (olddecl)))));
! 1378:
! 1379: types_match = comptypes (TREE_TYPE (newdecl), newtype);
! 1380: if (types_match)
! 1381: TREE_TYPE (olddecl) = newtype;
! 1382: }
1.1.1.4 root 1383: }
1384: if (!types_match)
1385: {
1386: /* If types don't match for a built-in, throw away the built-in. */
1387: warning_with_decl (newdecl, "conflicting types for built-in function `%s'");
1388: return 0;
1389: }
1.1 root 1390: }
1391: else if (TREE_CODE (olddecl) == FUNCTION_DECL
1.1.1.4 root 1392: && DECL_SOURCE_LINE (olddecl) == 0)
1.1 root 1393: {
1.1.1.4 root 1394: /* A function declaration for a predeclared function
1395: that isn't actually built in. */
1.1 root 1396: if (!TREE_PUBLIC (newdecl))
1397: {
1.1.1.4 root 1398: /* If you declare it as static, the
1399: default definition is overridden. */
1.1 root 1400: return 0;
1401: }
1402: else if (!types_match)
1.1.1.4 root 1403: {
1404: /* If the types don't match, preserve volatility indication.
1405: Later on, we will discard everything else about the
1406: default declaration. */
1407: TREE_THIS_VOLATILE (newdecl) |= TREE_THIS_VOLATILE (olddecl);
1408: }
1409: }
1410: /* Permit char *foo () to match void *foo (...) if not pedantic,
1411: if one of them came from a system header file. */
1412: else if (!types_match
1413: && TREE_CODE (olddecl) == FUNCTION_DECL
1414: && TREE_CODE (newdecl) == FUNCTION_DECL
1415: && TREE_CODE (TREE_TYPE (oldtype)) == POINTER_TYPE
1416: && TREE_CODE (TREE_TYPE (newtype)) == POINTER_TYPE
1417: && (DECL_IN_SYSTEM_HEADER (olddecl)
1418: || DECL_IN_SYSTEM_HEADER (newdecl))
1419: && ((TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (newtype))) == void_type_node
1420: && TYPE_ARG_TYPES (oldtype) == 0
1421: && self_promoting_args_p (TYPE_ARG_TYPES (newtype))
1422: && TREE_TYPE (TREE_TYPE (oldtype)) == char_type_node)
1423: ||
1424: (TREE_TYPE (TREE_TYPE (newtype)) == char_type_node
1425: && TYPE_ARG_TYPES (newtype) == 0
1426: && self_promoting_args_p (TYPE_ARG_TYPES (oldtype))
1427: && TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (oldtype))) == void_type_node)))
1428: {
1429: if (pedantic)
1430: pedwarn_with_decl (newdecl, "conflicting types for `%s'");
1431: /* Make sure we keep void * as ret type, not char *. */
1432: if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (oldtype))) == void_type_node)
1433: TREE_TYPE (newdecl) = newtype = oldtype;
1.1 root 1434: }
1435: else if (!types_match
1436: /* Permit char *foo (int, ...); followed by char *foo ();
1437: if not pedantic. */
1438: && ! (TREE_CODE (olddecl) == FUNCTION_DECL
1439: && ! pedantic
1440: /* Return types must still match. */
1.1.1.4 root 1441: && comptypes (TREE_TYPE (oldtype),
1442: TREE_TYPE (newtype))
1443: && TYPE_ARG_TYPES (newtype) == 0))
1.1 root 1444: {
1445: error_with_decl (newdecl, "conflicting types for `%s'");
1446: /* Check for function type mismatch
1447: involving an empty arglist vs a nonempty one. */
1448: if (TREE_CODE (olddecl) == FUNCTION_DECL
1.1.1.4 root 1449: && comptypes (TREE_TYPE (oldtype),
1450: TREE_TYPE (newtype))
1451: && ((TYPE_ARG_TYPES (oldtype) == 0
1.1 root 1452: && DECL_INITIAL (olddecl) == 0)
1453: ||
1.1.1.4 root 1454: (TYPE_ARG_TYPES (newtype) == 0
1.1 root 1455: && DECL_INITIAL (newdecl) == 0)))
1456: {
1457: /* Classify the problem further. */
1.1.1.4 root 1458: register tree t = TYPE_ARG_TYPES (oldtype);
1.1 root 1459: if (t == 0)
1.1.1.4 root 1460: t = TYPE_ARG_TYPES (newtype);
1.1 root 1461: for (; t; t = TREE_CHAIN (t))
1462: {
1463: register tree type = TREE_VALUE (t);
1464:
1.1.1.4 root 1465: if (TREE_CHAIN (t) == 0
1466: && TYPE_MAIN_VARIANT (type) != void_type_node)
1.1 root 1467: {
1468: error ("A parameter list with an ellipsis can't match");
1469: error ("an empty parameter name list declaration.");
1470: break;
1471: }
1472:
1.1.1.4 root 1473: if (TYPE_MAIN_VARIANT (type) == float_type_node
1474: || C_PROMOTING_INTEGER_TYPE_P (type))
1.1 root 1475: {
1476: error ("An argument type that has a default promotion");
1477: error ("can't match an empty parameter name list declaration.");
1478: break;
1479: }
1480: }
1481: }
1482: error_with_decl (olddecl, "previous declaration of `%s'");
1483: }
1484: else
1485: {
1486: char *errmsg = redeclaration_error_message (newdecl, olddecl);
1487: if (errmsg)
1488: {
1489: error_with_decl (newdecl, errmsg);
1490: error_with_decl (olddecl,
1.1.1.4 root 1491: ((DECL_INITIAL (olddecl)
1492: && current_binding_level == global_binding_level)
1493: ? "`%s' previously defined here"
1494: : "`%s' previously declared here"));
1.1 root 1495: }
1496: else if (TREE_CODE (olddecl) == FUNCTION_DECL
1497: && DECL_INITIAL (olddecl) != 0
1.1.1.4 root 1498: && TYPE_ARG_TYPES (oldtype) == 0
1499: && TYPE_ARG_TYPES (newtype) != 0)
1.1 root 1500: {
1501: register tree type, parm;
1502: register int nargs;
1503: /* Prototype decl follows defn w/o prototype. */
1504:
1.1.1.4 root 1505: for (parm = TYPE_ACTUAL_ARG_TYPES (oldtype),
1506: type = TYPE_ARG_TYPES (newtype),
1.1 root 1507: nargs = 1;
1.1.1.4 root 1508: (TYPE_MAIN_VARIANT (TREE_VALUE (parm)) != void_type_node
1509: || TYPE_MAIN_VARIANT (TREE_VALUE (type)) != void_type_node);
1.1 root 1510: parm = TREE_CHAIN (parm), type = TREE_CHAIN (type), nargs++)
1511: {
1.1.1.4 root 1512: if (TYPE_MAIN_VARIANT (TREE_VALUE (parm)) == void_type_node
1513: || TYPE_MAIN_VARIANT (TREE_VALUE (type)) == void_type_node)
1.1 root 1514: {
1515: errmsg = "prototype for `%s' follows and number of arguments";
1516: break;
1517: }
1518: /* Type for passing arg must be consistent
1519: with that declared for the arg. */
1520: if (! comptypes (TREE_VALUE (parm), TREE_VALUE (type))
1521: /* If -traditional, allow `unsigned int' instead of `int'
1522: in the prototype. */
1523: && (! (flag_traditional
1.1.1.4 root 1524: && TYPE_MAIN_VARIANT (TREE_VALUE (parm)) == integer_type_node
1525: && TYPE_MAIN_VARIANT (TREE_VALUE (type)) == unsigned_type_node)))
1.1 root 1526: {
1527: errmsg = "prototype for `%s' follows and argument %d";
1528: break;
1529: }
1530: }
1531: if (errmsg)
1532: {
1533: error_with_decl (newdecl, errmsg, nargs);
1534: error_with_decl (olddecl,
1535: "doesn't match non-prototype definition here");
1536: }
1537: else
1538: {
1539: warning_with_decl (newdecl, "prototype for `%s' follows");
1540: warning_with_decl (olddecl, "non-prototype definition here");
1541: }
1542: }
1.1.1.3 root 1543: /* Warn about mismatches in various flags. */
1.1 root 1544: else
1545: {
1.1.1.3 root 1546: /* Warn if function is now inline
1547: but was previously declared not inline and has been called. */
1.1 root 1548: if (TREE_CODE (olddecl) == FUNCTION_DECL
1.1.1.4 root 1549: && ! DECL_INLINE (olddecl) && DECL_INLINE (newdecl)
1.1 root 1550: && TREE_USED (olddecl))
1551: warning_with_decl (newdecl,
1552: "`%s' declared inline after being called");
1553: if (TREE_CODE (olddecl) == FUNCTION_DECL
1.1.1.4 root 1554: && ! DECL_INLINE (olddecl) && DECL_INLINE (newdecl)
1555: && DECL_INITIAL (olddecl) != 0)
1.1 root 1556: warning_with_decl (newdecl,
1.1.1.4 root 1557: "`%s' declared inline after its definition");
1.1 root 1558: /* It is nice to warn when a function is declared
1559: global first and then static. */
1560: if (TREE_CODE (olddecl) == FUNCTION_DECL
1561: && TREE_PUBLIC (olddecl)
1562: && !TREE_PUBLIC (newdecl))
1563: warning_with_decl (newdecl, "static declaration for `%s' follows non-static");
1564:
1.1.1.3 root 1565: /* These bits are logically part of the type, for variables.
1566: But not for functions
1567: (where qualifiers are not valid ANSI anyway). */
1568: if (pedantic && TREE_CODE (olddecl) != FUNCTION_DECL
1.1 root 1569: && (TREE_READONLY (newdecl) != TREE_READONLY (olddecl)
1570: || TREE_THIS_VOLATILE (newdecl) != TREE_THIS_VOLATILE (olddecl)))
1571: pedwarn_with_decl (newdecl, "type qualifiers for `%s' conflict with previous decl");
1572: }
1573: }
1574:
1.1.1.4 root 1575: /* Optionally warn about more than one declaration for the same name. */
1576: if (warn_redundant_decls && DECL_SOURCE_LINE (olddecl) != 0
1577: /* Dont warn about a function declaration
1578: followed by a definition. */
1579: && !(TREE_CODE (newdecl) == FUNCTION_DECL && DECL_INITIAL (newdecl) != 0
1580: && DECL_INITIAL (olddecl) == 0))
1581: {
1582: warning_with_decl (newdecl, "redundant redeclaration of `%s' in same scope");
1583: warning_with_decl (olddecl, "previous declaration of `%s'");
1584: }
1585:
1.1 root 1586: /* Copy all the DECL_... slots specified in the new decl
1.1.1.4 root 1587: except for any that we copy here from the old type.
1588:
1589: Past this point, we don't change OLDTYPE and NEWTYPE
1590: even if we change the types of NEWDECL and OLDDECL. */
1.1 root 1591:
1592: if (types_match)
1593: {
1594: /* Merge the data types specified in the two decls. */
1595: if (TREE_CODE (newdecl) != FUNCTION_DECL || !DECL_BUILT_IN (olddecl))
1596: TREE_TYPE (newdecl)
1597: = TREE_TYPE (olddecl)
1.1.1.4 root 1598: = common_type (newtype, oldtype);
1.1 root 1599:
1600: /* Lay the type out, unless already done. */
1601: if (oldtype != TREE_TYPE (newdecl))
1602: {
1603: if (TREE_TYPE (newdecl) != error_mark_node)
1604: layout_type (TREE_TYPE (newdecl));
1605: if (TREE_CODE (newdecl) != FUNCTION_DECL
1606: && TREE_CODE (newdecl) != TYPE_DECL
1607: && TREE_CODE (newdecl) != CONST_DECL)
1608: layout_decl (newdecl, 0);
1609: }
1610: else
1611: {
1612: /* Since the type is OLDDECL's, make OLDDECL's size go with. */
1613: DECL_SIZE (newdecl) = DECL_SIZE (olddecl);
1.1.1.3 root 1614: if (TREE_CODE (olddecl) != FUNCTION_DECL)
1615: if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl))
1616: DECL_ALIGN (newdecl) = DECL_ALIGN (olddecl);
1.1 root 1617: }
1618:
1.1.1.4 root 1619: /* Keep the old rtl since we can safely use it. */
1620: DECL_RTL (newdecl) = DECL_RTL (olddecl);
1621:
1.1 root 1622: /* Merge the type qualifiers. */
1623: if (DECL_BUILT_IN_NONANSI (olddecl) && TREE_THIS_VOLATILE (olddecl)
1624: && !TREE_THIS_VOLATILE (newdecl))
1625: TREE_THIS_VOLATILE (olddecl) = 0;
1626: if (TREE_READONLY (newdecl))
1627: TREE_READONLY (olddecl) = 1;
1628: if (TREE_THIS_VOLATILE (newdecl))
1.1.1.4 root 1629: {
1630: TREE_THIS_VOLATILE (olddecl) = 1;
1631: if (TREE_CODE (newdecl) == VAR_DECL)
1632: make_var_volatile (newdecl);
1633: }
1.1 root 1634:
1635: /* Keep source location of definition rather than declaration. */
1636: if (DECL_INITIAL (newdecl) == 0 && DECL_INITIAL (olddecl) != 0)
1637: {
1638: DECL_SOURCE_LINE (newdecl) = DECL_SOURCE_LINE (olddecl);
1639: DECL_SOURCE_FILE (newdecl) = DECL_SOURCE_FILE (olddecl);
1640: }
1641:
1.1.1.4 root 1642: /* Merge the unused-warning information. */
1643: if (DECL_IN_SYSTEM_HEADER (olddecl))
1644: DECL_IN_SYSTEM_HEADER (newdecl) = 1;
1645: else if (DECL_IN_SYSTEM_HEADER (newdecl))
1646: DECL_IN_SYSTEM_HEADER (olddecl) = 1;
1647:
1.1 root 1648: /* Merge the initialization information. */
1649: if (DECL_INITIAL (newdecl) == 0)
1650: DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
1651: }
1652: /* If cannot merge, then use the new type and qualifiers,
1653: and don't preserve the old rtl. */
1654: else
1655: {
1656: TREE_TYPE (olddecl) = TREE_TYPE (newdecl);
1657: TREE_READONLY (olddecl) = TREE_READONLY (newdecl);
1658: TREE_THIS_VOLATILE (olddecl) = TREE_THIS_VOLATILE (newdecl);
1659: TREE_SIDE_EFFECTS (olddecl) = TREE_SIDE_EFFECTS (newdecl);
1660: }
1661:
1662: /* Merge the storage class information. */
1663: /* For functions, static overrides non-static. */
1664: if (TREE_CODE (newdecl) == FUNCTION_DECL)
1665: {
1666: TREE_PUBLIC (newdecl) &= TREE_PUBLIC (olddecl);
1667: /* This is since we don't automatically
1668: copy the attributes of NEWDECL into OLDDECL. */
1669: TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl);
1670: /* If this clears `static', clear it in the identifier too. */
1671: if (! TREE_PUBLIC (olddecl))
1672: TREE_PUBLIC (DECL_NAME (olddecl)) = 0;
1673: }
1.1.1.4 root 1674: if (DECL_EXTERNAL (newdecl))
1.1 root 1675: {
1676: TREE_STATIC (newdecl) = TREE_STATIC (olddecl);
1.1.1.4 root 1677: DECL_EXTERNAL (newdecl) = DECL_EXTERNAL (olddecl);
1.1 root 1678: /* An extern decl does not override previous storage class. */
1679: TREE_PUBLIC (newdecl) = TREE_PUBLIC (olddecl);
1680: }
1681: else
1682: {
1683: TREE_STATIC (olddecl) = TREE_STATIC (newdecl);
1684: TREE_PUBLIC (olddecl) = TREE_PUBLIC (newdecl);
1685: }
1.1.1.4 root 1686:
1.1 root 1687: /* If either decl says `inline', this fn is inline,
1688: unless its definition was passed already. */
1.1.1.4 root 1689: if (DECL_INLINE (newdecl) && DECL_INITIAL (olddecl) == 0)
1690: DECL_INLINE (olddecl) = 1;
1691: DECL_INLINE (newdecl) = DECL_INLINE (olddecl);
1.1 root 1692:
1693: /* Get rid of any built-in function if new arg types don't match it
1694: or if we have a function definition. */
1695: if (TREE_CODE (newdecl) == FUNCTION_DECL
1696: && DECL_BUILT_IN (olddecl)
1697: && (!types_match || new_is_definition))
1698: {
1699: TREE_TYPE (olddecl) = TREE_TYPE (newdecl);
1700: DECL_BUILT_IN (olddecl) = 0;
1701: }
1702:
1703: /* If redeclaring a builtin function, and not a definition,
1704: it stays built in.
1705: Also preserve various other info from the definition. */
1706: if (TREE_CODE (newdecl) == FUNCTION_DECL && !new_is_definition)
1707: {
1708: if (DECL_BUILT_IN (olddecl))
1709: {
1710: DECL_BUILT_IN (newdecl) = 1;
1711: DECL_SET_FUNCTION_CODE (newdecl, DECL_FUNCTION_CODE (olddecl));
1712: }
1713: else
1714: DECL_FRAME_SIZE (newdecl) = DECL_FRAME_SIZE (olddecl);
1715:
1716: DECL_RESULT (newdecl) = DECL_RESULT (olddecl);
1717: DECL_INITIAL (newdecl) = DECL_INITIAL (olddecl);
1718: DECL_SAVED_INSNS (newdecl) = DECL_SAVED_INSNS (olddecl);
1719: DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl);
1720: }
1721:
1.1.1.4 root 1722: /* Copy most of the decl-specific fields of NEWDECL into OLDDECL.
1723: But preserve OLDdECL's DECL_UID. */
1724: {
1725: register unsigned olddecl_uid = DECL_UID (olddecl);
1726:
1727: bcopy ((char *) newdecl + sizeof (struct tree_common),
1728: (char *) olddecl + sizeof (struct tree_common),
1729: sizeof (struct tree_decl) - sizeof (struct tree_common));
1730: DECL_UID (olddecl) = olddecl_uid;
1731: }
1.1 root 1732:
1733: return 1;
1734: }
1735:
1736: /* Record a decl-node X as belonging to the current lexical scope.
1737: Check for errors (such as an incompatible declaration for the same
1738: name already seen in the same scope).
1739:
1740: Returns either X or an old decl for the same name.
1741: If an old decl is returned, it may have been smashed
1742: to agree with what X says. */
1743:
1744: tree
1745: pushdecl (x)
1746: tree x;
1747: {
1748: register tree t;
1749: register tree name = DECL_NAME (x);
1750: register struct binding_level *b = current_binding_level;
1751:
1752: DECL_CONTEXT (x) = current_function_decl;
1.1.1.5 ! root 1753: /* A local extern declaration for a function doesn't constitute nesting.
! 1754: A local auto declaration does, since it's a forward decl
! 1755: for a nested function coming later. */
! 1756: if (TREE_CODE (x) == FUNCTION_DECL && DECL_INITIAL (x) == 0
! 1757: && DECL_EXTERNAL (x))
1.1 root 1758: DECL_CONTEXT (x) = 0;
1759:
1.1.1.4 root 1760: if (warn_nested_externs && DECL_EXTERNAL (x) && b != global_binding_level
1.1 root 1761: && x != IDENTIFIER_IMPLICIT_DECL (name))
1762: warning ("nested extern declaration of `%s'", IDENTIFIER_POINTER (name));
1763:
1764: if (name)
1765: {
1766: char *file;
1767: int line;
1768:
1769: t = lookup_name_current_level (name);
1770: if (t != 0 && t == error_mark_node)
1771: /* error_mark_node is 0 for a while during initialization! */
1772: {
1773: t = 0;
1774: error_with_decl (x, "`%s' used prior to declaration");
1775: }
1776:
1777: if (t != 0)
1778: {
1779: file = DECL_SOURCE_FILE (t);
1780: line = DECL_SOURCE_LINE (t);
1781: }
1782:
1783: if (t != 0 && duplicate_decls (x, t))
1784: {
1785: if (TREE_CODE (t) == PARM_DECL)
1786: {
1787: /* Don't allow more than one "real" duplicate
1788: of a forward parm decl. */
1789: TREE_ASM_WRITTEN (t) = TREE_ASM_WRITTEN (x);
1790: return t;
1791: }
1792: /* If this decl is `static' and an implicit decl was seen previously,
1793: warn. But don't complain if -traditional,
1794: since traditional compilers don't complain. */
1795: if (!flag_traditional && TREE_PUBLIC (name)
1.1.1.4 root 1796: && ! TREE_PUBLIC (x) && ! DECL_EXTERNAL (x)
1.1 root 1797: /* We used to warn also for explicit extern followed by static,
1798: but sometimes you need to do it that way. */
1799: && IDENTIFIER_IMPLICIT_DECL (name) != 0)
1800: {
1801: pedwarn ("`%s' was declared implicitly `extern' and later `static'",
1802: IDENTIFIER_POINTER (name));
1803: pedwarn_with_file_and_line (file, line,
1804: "previous declaration of `%s'",
1805: IDENTIFIER_POINTER (name));
1806: }
1.1.1.4 root 1807:
1.1 root 1808: return t;
1809: }
1810:
1.1.1.3 root 1811: /* If we are processing a typedef statement, generate a whole new
1812: ..._TYPE node (which will be just an variant of the existing
1813: ..._TYPE node with identical properties) and then install the
1814: TYPE_DECL node generated to represent the typedef name as the
1815: TYPE_NAME of this brand new (duplicate) ..._TYPE node.
1816:
1817: The whole point here is to end up with a situation where each
1818: and every ..._TYPE node the compiler creates will be uniquely
1819: associated with AT MOST one node representing a typedef name.
1820: This way, even though the compiler substitutes corresponding
1821: ..._TYPE nodes for TYPE_DECL (i.e. "typedef name") nodes very
1822: early on, later parts of the compiler can always do the reverse
1823: translation and get back the corresponding typedef name. For
1824: example, given:
1825:
1826: typedef struct S MY_TYPE;
1827: MY_TYPE object;
1828:
1829: Later parts of the compiler might only know that `object' was of
1830: type `struct S' if if were not for code just below. With this
1831: code however, later parts of the compiler see something like:
1832:
1833: struct S' == struct S
1834: typedef struct S' MY_TYPE;
1835: struct S' object;
1836:
1837: And they can then deduce (from the node for type struct S') that
1838: the original object declaration was:
1839:
1840: MY_TYPE object;
1841:
1842: Being able to do this is important for proper support of protoize,
1843: and also for generating precise symbolic debugging information
1844: which takes full account of the programmer's (typedef) vocabulary.
1845:
1846: Obviously, we don't want to generate a duplicate ..._TYPE node if
1847: the TYPE_DECL node that we are now processing really represents a
1848: standard built-in type.
1849:
1.1 root 1850: Since all standard types are effectively declared at line zero
1851: in the source file, we can easily check to see if we are working
1852: on a standard type by checking the current value of lineno. */
1853:
1854: if (TREE_CODE (x) == TYPE_DECL)
1855: {
1.1.1.4 root 1856: if (DECL_SOURCE_LINE (x) == 0)
1.1 root 1857: {
1858: if (TYPE_NAME (TREE_TYPE (x)) == 0)
1859: TYPE_NAME (TREE_TYPE (x)) = x;
1860: }
1.1.1.5 ! root 1861: else if (TREE_TYPE (x) != error_mark_node)
1.1 root 1862: {
1863: tree tt = TREE_TYPE (x);
1864:
1.1.1.3 root 1865: tt = build_type_copy (tt);
1.1 root 1866: TYPE_NAME (tt) = x;
1867: TREE_TYPE (x) = tt;
1868: }
1869: }
1870:
1.1.1.4 root 1871: /* Multiple external decls of the same identifier ought to match.
1872: Check against both global declarations and out of scope (limbo) block
1873: level declarations.
1874:
1875: We get warnings about inline functions where they are defined.
1876: Avoid duplicate warnings where they are used. */
1.1.1.5 ! root 1877: if (TREE_PUBLIC (x) && ! DECL_INLINE (x))
1.1.1.4 root 1878: {
1879: tree decl;
1880:
1881: if (IDENTIFIER_GLOBAL_VALUE (name) != 0
1882: && (DECL_EXTERNAL (IDENTIFIER_GLOBAL_VALUE (name))
1883: || TREE_PUBLIC (IDENTIFIER_GLOBAL_VALUE (name))))
1884: decl = IDENTIFIER_GLOBAL_VALUE (name);
1885: else if (IDENTIFIER_LIMBO_VALUE (name) != 0)
1886: /* Decls in limbo are always extern, so no need to check that. */
1887: decl = IDENTIFIER_LIMBO_VALUE (name);
1888: else
1889: decl = 0;
1.1 root 1890:
1.1.1.5 ! root 1891: if (decl && ! comptypes (TREE_TYPE (x), TREE_TYPE (decl))
! 1892: /* If old decl is built-in, we already warned if we should. */
! 1893: && !DECL_BUILT_IN (decl))
1.1 root 1894: {
1895: pedwarn_with_decl (x,
1896: "type mismatch with previous external decl");
1.1.1.4 root 1897: pedwarn_with_decl (decl, "previous external decl of `%s'");
1.1 root 1898: }
1899: }
1900:
1901: /* If a function has had an implicit declaration, and then is defined,
1902: make sure they are compatible. */
1903:
1904: if (IDENTIFIER_IMPLICIT_DECL (name) != 0
1905: && IDENTIFIER_GLOBAL_VALUE (name) == 0
1906: && TREE_CODE (x) == FUNCTION_DECL
1907: && ! comptypes (TREE_TYPE (x),
1908: TREE_TYPE (IDENTIFIER_IMPLICIT_DECL (name))))
1909: {
1910: warning_with_decl (x, "type mismatch with previous implicit declaration");
1.1.1.2 root 1911: warning_with_decl (IDENTIFIER_IMPLICIT_DECL (name),
1912: "previous implicit declaration of `%s'");
1.1 root 1913: }
1914:
1915: /* In PCC-compatibility mode, extern decls of vars with no current decl
1916: take effect at top level no matter where they are. */
1.1.1.4 root 1917: if (flag_traditional && DECL_EXTERNAL (x)
1.1 root 1918: && lookup_name (name) == 0)
1919: {
1920: tree type = TREE_TYPE (x);
1921:
1922: /* But don't do this if the type contains temporary nodes. */
1923: while (type)
1924: {
1925: if (type == error_mark_node)
1926: break;
1927: if (! TREE_PERMANENT (type))
1928: {
1929: warning_with_decl (x, "type of external `%s' is not global");
1930: /* By exiting the loop early, we leave TYPE nonzero,
1931: and thus prevent globalization of the decl. */
1932: break;
1933: }
1934: else if (TREE_CODE (type) == FUNCTION_TYPE
1935: && TYPE_ARG_TYPES (type) != 0)
1936: /* The types might not be truly local,
1937: but the list of arg types certainly is temporary.
1938: Since prototypes are nontraditional,
1939: ok not to do the traditional thing. */
1940: break;
1941: type = TREE_TYPE (type);
1942: }
1943:
1944: if (type == 0)
1945: b = global_binding_level;
1946: }
1947:
1948: /* This name is new in its binding level.
1949: Install the new declaration and return it. */
1950: if (b == global_binding_level)
1951: {
1952: /* Install a global value. */
1953:
1954: /* If the first global decl has external linkage,
1955: warn if we later see static one. */
1956: if (IDENTIFIER_GLOBAL_VALUE (name) == 0 && TREE_PUBLIC (x))
1957: TREE_PUBLIC (name) = 1;
1958:
1959: IDENTIFIER_GLOBAL_VALUE (name) = x;
1960:
1.1.1.4 root 1961: /* We no longer care about any previous block level declarations. */
1962: IDENTIFIER_LIMBO_VALUE (name) = 0;
1963:
1.1 root 1964: /* Don't forget if the function was used via an implicit decl. */
1965: if (IDENTIFIER_IMPLICIT_DECL (name)
1966: && TREE_USED (IDENTIFIER_IMPLICIT_DECL (name)))
1967: TREE_USED (x) = 1, TREE_USED (name) = 1;
1968:
1969: /* Don't forget if its address was taken in that way. */
1970: if (IDENTIFIER_IMPLICIT_DECL (name)
1971: && TREE_ADDRESSABLE (IDENTIFIER_IMPLICIT_DECL (name)))
1972: TREE_ADDRESSABLE (x) = 1;
1973:
1974: /* Warn about mismatches against previous implicit decl. */
1975: if (IDENTIFIER_IMPLICIT_DECL (name) != 0
1976: /* If this real decl matches the implicit, don't complain. */
1977: && ! (TREE_CODE (x) == FUNCTION_DECL
1.1.1.4 root 1978: && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (x)))
1979: == integer_type_node)))
1.1 root 1980: pedwarn ("`%s' was previously implicitly declared to return `int'",
1981: IDENTIFIER_POINTER (name));
1982:
1983: /* If this decl is `static' and an `extern' was seen previously,
1984: that is erroneous. */
1985: if (TREE_PUBLIC (name)
1.1.1.4 root 1986: && ! TREE_PUBLIC (x) && ! DECL_EXTERNAL (x))
1.1 root 1987: {
1.1.1.4 root 1988: /* Okay to redeclare an ANSI built-in as static. */
1989: if (t != 0 && DECL_BUILT_IN (t))
1.1.1.2 root 1990: ;
1991: /* Okay to declare a non-ANSI built-in as anything. */
1992: else if (t != 0 && DECL_BUILT_IN_NONANSI (t))
1993: ;
1994: else if (IDENTIFIER_IMPLICIT_DECL (name))
1.1 root 1995: pedwarn ("`%s' was declared implicitly `extern' and later `static'",
1996: IDENTIFIER_POINTER (name));
1997: else
1998: pedwarn ("`%s' was declared `extern' and later `static'",
1999: IDENTIFIER_POINTER (name));
2000: }
2001: }
2002: else
2003: {
2004: /* Here to install a non-global value. */
2005: tree oldlocal = IDENTIFIER_LOCAL_VALUE (name);
2006: tree oldglobal = IDENTIFIER_GLOBAL_VALUE (name);
2007: IDENTIFIER_LOCAL_VALUE (name) = x;
2008:
2009: /* If this is an extern function declaration, see if we
1.1.1.4 root 2010: have a global definition or declaration for the function. */
1.1 root 2011: if (oldlocal == 0
1.1.1.4 root 2012: && DECL_EXTERNAL (x) && !DECL_INLINE (x)
1.1 root 2013: && oldglobal != 0
2014: && TREE_CODE (x) == FUNCTION_DECL
2015: && TREE_CODE (oldglobal) == FUNCTION_DECL)
2016: {
2017: /* We have one. Their types must agree. */
2018: if (! comptypes (TREE_TYPE (x),
2019: TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (name))))
1.1.1.4 root 2020: pedwarn_with_decl (x, "extern declaration of `%s' doesn't match global one");
2021: else
2022: {
2023: /* Inner extern decl is inline if global one is.
2024: Copy enough to really inline it. */
2025: if (DECL_INLINE (oldglobal))
2026: {
2027: DECL_INLINE (x) = DECL_INLINE (oldglobal);
2028: DECL_INITIAL (x) = (current_function_decl == oldglobal
2029: ? 0 : DECL_INITIAL (oldglobal));
2030: DECL_SAVED_INSNS (x) = DECL_SAVED_INSNS (oldglobal);
1.1.1.5 ! root 2031: DECL_FRAME_SIZE (x) = DECL_FRAME_SIZE (oldglobal);
1.1.1.4 root 2032: DECL_ARGUMENTS (x) = DECL_ARGUMENTS (oldglobal);
2033: DECL_RESULT (x) = DECL_RESULT (oldglobal);
2034: TREE_ASM_WRITTEN (x) = TREE_ASM_WRITTEN (oldglobal);
2035: DECL_ABSTRACT_ORIGIN (x) = oldglobal;
2036: }
2037: /* Inner extern decl is built-in if global one is. */
2038: if (DECL_BUILT_IN (oldglobal))
2039: {
2040: DECL_BUILT_IN (x) = DECL_BUILT_IN (oldglobal);
2041: DECL_SET_FUNCTION_CODE (x, DECL_FUNCTION_CODE (oldglobal));
2042: }
2043: /* Keep the arg types from a file-scope fcn defn. */
2044: if (TYPE_ARG_TYPES (TREE_TYPE (oldglobal)) != 0
2045: && DECL_INITIAL (oldglobal)
2046: && TYPE_ARG_TYPES (TREE_TYPE (x)) == 0)
2047: TREE_TYPE (x) = TREE_TYPE (oldglobal);
2048: }
1.1 root 2049: }
2050:
2051: #if 0 /* This case is probably sometimes the right thing to do. */
2052: /* If we have a local external declaration,
2053: then any file-scope declaration should not
2054: have been static. */
2055: if (oldlocal == 0 && oldglobal != 0
2056: && !TREE_PUBLIC (oldglobal)
1.1.1.4 root 2057: && DECL_EXTERNAL (x) && TREE_PUBLIC (x))
1.1 root 2058: warning ("`%s' locally external but globally static",
2059: IDENTIFIER_POINTER (name));
2060: #endif
2061:
2062: /* If we have a local external declaration,
2063: and no file-scope declaration has yet been seen,
2064: then if we later have a file-scope decl it must not be static. */
2065: if (oldlocal == 0
2066: && oldglobal == 0
1.1.1.4 root 2067: && DECL_EXTERNAL (x)
1.1 root 2068: && TREE_PUBLIC (x))
2069: {
2070: TREE_PUBLIC (name) = 1;
1.1.1.4 root 2071:
2072: /* Save this decl, so that we can do type checking against
2073: other decls after it falls out of scope.
2074:
2075: Only save it once. This prevents temporary decls created in
2076: expand_inline_function from being used here, since this
2077: will have been set when the inline function was parsed.
2078: It also helps give slightly better warnings. */
2079: if (IDENTIFIER_LIMBO_VALUE (name) == 0)
2080: IDENTIFIER_LIMBO_VALUE (name) = x;
1.1 root 2081: }
2082:
2083: /* Warn if shadowing an argument at the top level of the body. */
1.1.1.4 root 2084: if (oldlocal != 0 && !DECL_EXTERNAL (x)
1.1 root 2085: /* This warning doesn't apply to the parms of a nested fcn. */
2086: && ! current_binding_level->parm_flag
2087: /* Check that this is one level down from the parms. */
2088: && current_binding_level->level_chain->parm_flag
2089: /* Check that the decl being shadowed
2090: comes from the parm level, one level up. */
2091: && chain_member (oldlocal, current_binding_level->level_chain->names))
2092: {
2093: if (TREE_CODE (oldlocal) == PARM_DECL)
2094: pedwarn ("declaration of `%s' shadows a parameter",
2095: IDENTIFIER_POINTER (name));
2096: else
2097: pedwarn ("declaration of `%s' shadows a symbol from the parameter list",
2098: IDENTIFIER_POINTER (name));
2099: }
2100:
2101: /* Maybe warn if shadowing something else. */
1.1.1.4 root 2102: else if (warn_shadow && !DECL_EXTERNAL (x)
1.1.1.3 root 2103: /* No shadow warnings for internally generated vars. */
1.1.1.4 root 2104: && DECL_SOURCE_LINE (x) != 0
1.1 root 2105: /* No shadow warnings for vars made for inlining. */
2106: && ! DECL_FROM_INLINE (x))
2107: {
2108: char *warnstring = 0;
2109:
2110: if (TREE_CODE (x) == PARM_DECL
1.1.1.5 ! root 2111: && current_binding_level->level_chain->parm_flag)
! 2112: /* Don't warn about the parm names in function declarator
! 2113: within a function declarator.
! 2114: It would be nice to avoid warning in any function
! 2115: declarator in a declaration, as opposed to a definition,
! 2116: but there is no way to tell it's not a definition. */
1.1 root 2117: ;
2118: else if (oldlocal != 0 && TREE_CODE (oldlocal) == PARM_DECL)
2119: warnstring = "declaration of `%s' shadows a parameter";
2120: else if (oldlocal != 0)
2121: warnstring = "declaration of `%s' shadows previous local";
2122: else if (IDENTIFIER_GLOBAL_VALUE (name) != 0
2123: && IDENTIFIER_GLOBAL_VALUE (name) != error_mark_node)
2124: warnstring = "declaration of `%s' shadows global declaration";
2125:
2126: if (warnstring)
2127: warning (warnstring, IDENTIFIER_POINTER (name));
2128: }
2129:
2130: /* If storing a local value, there may already be one (inherited).
2131: If so, record it for restoration when this binding level ends. */
2132: if (oldlocal != 0)
2133: b->shadowed = tree_cons (name, oldlocal, b->shadowed);
2134: }
2135:
2136: /* Keep count of variables in this level with incomplete type. */
2137: if (TYPE_SIZE (TREE_TYPE (x)) == 0)
2138: ++b->n_incomplete;
2139: }
2140:
2141: /* Put decls on list in reverse order.
2142: We will reverse them later if necessary. */
2143: TREE_CHAIN (x) = b->names;
2144: b->names = x;
2145:
2146: return x;
2147: }
2148:
2149: /* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL, if appropriate. */
2150:
2151: tree
2152: pushdecl_top_level (x)
2153: tree x;
2154: {
2155: register tree t;
2156: register struct binding_level *b = current_binding_level;
2157:
2158: current_binding_level = global_binding_level;
2159: t = pushdecl (x);
2160: current_binding_level = b;
2161: return t;
2162: }
2163:
2164: /* Generate an implicit declaration for identifier FUNCTIONID
2165: as a function of type int (). Print a warning if appropriate. */
2166:
2167: tree
2168: implicitly_declare (functionid)
2169: tree functionid;
2170: {
2171: register tree decl;
2172: int traditional_warning = 0;
2173: /* Only one "implicit declaration" warning per identifier. */
2174: int implicit_warning;
2175:
2176: /* Save the decl permanently so we can warn if definition follows. */
2177: push_obstacks_nochange ();
2178: end_temporary_allocation ();
2179:
2180: /* We used to reuse an old implicit decl here,
2181: but this loses with inline functions because it can clobber
2182: the saved decl chains. */
2183: /* if (IDENTIFIER_IMPLICIT_DECL (functionid) != 0)
2184: decl = IDENTIFIER_IMPLICIT_DECL (functionid);
2185: else */
2186: decl = build_decl (FUNCTION_DECL, functionid, default_function_type);
2187:
2188: /* Warn of implicit decl following explicit local extern decl.
2189: This is probably a program designed for traditional C. */
2190: if (TREE_PUBLIC (functionid) && IDENTIFIER_GLOBAL_VALUE (functionid) == 0)
2191: traditional_warning = 1;
2192:
2193: /* Warn once of an implicit declaration. */
2194: implicit_warning = (IDENTIFIER_IMPLICIT_DECL (functionid) == 0);
2195:
1.1.1.4 root 2196: DECL_EXTERNAL (decl) = 1;
1.1 root 2197: TREE_PUBLIC (decl) = 1;
2198:
2199: /* Record that we have an implicit decl and this is it. */
2200: IDENTIFIER_IMPLICIT_DECL (functionid) = decl;
2201:
2202: /* ANSI standard says implicit declarations are in the innermost block.
2203: So we record the decl in the standard fashion.
2204: If flag_traditional is set, pushdecl does it top-level. */
2205: pushdecl (decl);
2206:
2207: /* This is a no-op in c-lang.c or something real in objc-actions.c. */
2208: maybe_objc_check_decl (decl);
2209:
1.1.1.4 root 2210: rest_of_decl_compilation (decl, NULL_PTR, 0, 0);
1.1 root 2211:
2212: if (warn_implicit && implicit_warning)
2213: warning ("implicit declaration of function `%s'",
2214: IDENTIFIER_POINTER (functionid));
2215: else if (warn_traditional && traditional_warning)
2216: warning ("function `%s' was previously declared within a block",
2217: IDENTIFIER_POINTER (functionid));
2218:
2219: /* Write a record describing this implicit function declaration to the
2220: prototypes file (if requested). */
2221:
2222: gen_aux_info_record (decl, 0, 1, 0);
2223:
2224: pop_obstacks ();
2225:
2226: return decl;
2227: }
2228:
2229: /* Return zero if the declaration NEWDECL is valid
2230: when the declaration OLDDECL (assumed to be for the same name)
2231: has already been seen.
2232: Otherwise return an error message format string with a %s
2233: where the identifier should go. */
2234:
2235: static char *
2236: redeclaration_error_message (newdecl, olddecl)
2237: tree newdecl, olddecl;
2238: {
2239: if (TREE_CODE (newdecl) == TYPE_DECL)
2240: {
2241: if (flag_traditional && TREE_TYPE (newdecl) == TREE_TYPE (olddecl))
2242: return 0;
2243: return "redefinition of `%s'";
2244: }
2245: else if (TREE_CODE (newdecl) == FUNCTION_DECL)
2246: {
2247: /* Declarations of functions can insist on internal linkage
2248: but they can't be inconsistent with internal linkage,
2249: so there can be no error on that account.
2250: However defining the same name twice is no good. */
2251: if (DECL_INITIAL (olddecl) != 0 && DECL_INITIAL (newdecl) != 0
2252: /* However, defining once as extern inline and a second
2253: time in another way is ok. */
1.1.1.4 root 2254: && !(DECL_INLINE (olddecl) && DECL_EXTERNAL (olddecl)
2255: && !(DECL_INLINE (newdecl) && DECL_EXTERNAL (newdecl))))
1.1 root 2256: return "redefinition of `%s'";
2257: return 0;
2258: }
2259: else if (current_binding_level == global_binding_level)
2260: {
2261: /* Objects declared at top level: */
2262: /* If at least one is a reference, it's ok. */
1.1.1.4 root 2263: if (DECL_EXTERNAL (newdecl) || DECL_EXTERNAL (olddecl))
1.1 root 2264: return 0;
2265: /* Reject two definitions. */
2266: if (DECL_INITIAL (olddecl) != 0 && DECL_INITIAL (newdecl) != 0)
2267: return "redefinition of `%s'";
2268: /* Now we have two tentative defs, or one tentative and one real def. */
2269: /* Insist that the linkage match. */
2270: if (TREE_PUBLIC (olddecl) != TREE_PUBLIC (newdecl))
2271: return "conflicting declarations of `%s'";
2272: return 0;
2273: }
2274: else if (current_binding_level->parm_flag
2275: && TREE_ASM_WRITTEN (olddecl) && !TREE_ASM_WRITTEN (newdecl))
2276: return 0;
2277: else
2278: {
2279: /* Objects declared with block scope: */
2280: /* Reject two definitions, and reject a definition
2281: together with an external reference. */
1.1.1.4 root 2282: if (!(DECL_EXTERNAL (newdecl) && DECL_EXTERNAL (olddecl)))
1.1 root 2283: return "redeclaration of `%s'";
2284: return 0;
2285: }
2286: }
2287:
2288: /* Get the LABEL_DECL corresponding to identifier ID as a label.
2289: Create one if none exists so far for the current function.
2290: This function is called for both label definitions and label references. */
2291:
2292: tree
2293: lookup_label (id)
2294: tree id;
2295: {
2296: register tree decl = IDENTIFIER_LABEL_VALUE (id);
2297:
1.1.1.5 ! root 2298: if (current_function_decl == 0)
! 2299: {
! 2300: error ("label %s referenced outside of any function",
! 2301: IDENTIFIER_POINTER (id));
! 2302: return 0;
! 2303: }
! 2304:
1.1 root 2305: /* Use a label already defined or ref'd with this name. */
2306: if (decl != 0)
2307: {
2308: /* But not if it is inherited and wasn't declared to be inheritable. */
2309: if (DECL_CONTEXT (decl) != current_function_decl
2310: && ! C_DECLARED_LABEL_FLAG (decl))
2311: return shadow_label (id);
2312: return decl;
2313: }
2314:
2315: decl = build_decl (LABEL_DECL, id, void_type_node);
2316:
1.1.1.4 root 2317: /* Make sure every label has an rtx. */
2318: label_rtx (decl);
2319:
1.1 root 2320: /* A label not explicitly declared must be local to where it's ref'd. */
2321: DECL_CONTEXT (decl) = current_function_decl;
2322:
2323: DECL_MODE (decl) = VOIDmode;
2324:
2325: /* Say where one reference is to the label,
2326: for the sake of the error if it is not defined. */
2327: DECL_SOURCE_LINE (decl) = lineno;
2328: DECL_SOURCE_FILE (decl) = input_filename;
2329:
2330: IDENTIFIER_LABEL_VALUE (id) = decl;
2331:
2332: named_labels = tree_cons (NULL_TREE, decl, named_labels);
2333:
2334: return decl;
2335: }
2336:
2337: /* Make a label named NAME in the current function,
2338: shadowing silently any that may be inherited from containing functions
2339: or containing scopes.
2340:
2341: Note that valid use, if the label being shadowed
2342: comes from another scope in the same function,
2343: requires calling declare_nonlocal_label right away. */
2344:
2345: tree
2346: shadow_label (name)
2347: tree name;
2348: {
2349: register tree decl = IDENTIFIER_LABEL_VALUE (name);
2350:
2351: if (decl != 0)
2352: {
2353: shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels);
2354: IDENTIFIER_LABEL_VALUE (name) = decl = 0;
2355: }
2356:
2357: return lookup_label (name);
2358: }
2359:
2360: /* Define a label, specifying the location in the source file.
2361: Return the LABEL_DECL node for the label, if the definition is valid.
2362: Otherwise return 0. */
2363:
2364: tree
2365: define_label (filename, line, name)
2366: char *filename;
2367: int line;
2368: tree name;
2369: {
2370: tree decl = lookup_label (name);
2371:
2372: /* If label with this name is known from an outer context, shadow it. */
2373: if (decl != 0 && DECL_CONTEXT (decl) != current_function_decl)
2374: {
2375: shadowed_labels = tree_cons (NULL_TREE, decl, shadowed_labels);
2376: IDENTIFIER_LABEL_VALUE (name) = 0;
2377: decl = lookup_label (name);
2378: }
2379:
2380: if (DECL_INITIAL (decl) != 0)
2381: {
1.1.1.5 ! root 2382: error ("duplicate label `%s'", IDENTIFIER_POINTER (name));
1.1 root 2383: return 0;
2384: }
2385: else
2386: {
2387: /* Mark label as having been defined. */
2388: DECL_INITIAL (decl) = error_mark_node;
2389: /* Say where in the source. */
2390: DECL_SOURCE_FILE (decl) = filename;
2391: DECL_SOURCE_LINE (decl) = line;
2392: return decl;
2393: }
2394: }
2395:
2396: /* Return the list of declarations of the current level.
2397: Note that this list is in reverse order unless/until
2398: you nreverse it; and when you do nreverse it, you must
2399: store the result back using `storedecls' or you will lose. */
2400:
2401: tree
2402: getdecls ()
2403: {
2404: return current_binding_level->names;
2405: }
2406:
2407: /* Return the list of type-tags (for structs, etc) of the current level. */
2408:
2409: tree
2410: gettags ()
2411: {
2412: return current_binding_level->tags;
2413: }
2414:
2415: /* Store the list of declarations of the current level.
2416: This is done for the parameter declarations of a function being defined,
2417: after they are modified in the light of any missing parameters. */
2418:
2419: static void
2420: storedecls (decls)
2421: tree decls;
2422: {
2423: current_binding_level->names = decls;
2424: }
2425:
2426: /* Similarly, store the list of tags of the current level. */
2427:
2428: static void
2429: storetags (tags)
2430: tree tags;
2431: {
2432: current_binding_level->tags = tags;
2433: }
2434:
2435: /* Given NAME, an IDENTIFIER_NODE,
2436: return the structure (or union or enum) definition for that name.
2437: Searches binding levels from BINDING_LEVEL up to the global level.
2438: If THISLEVEL_ONLY is nonzero, searches only the specified context
2439: (but skips any tag-transparent contexts to find one that is
2440: meaningful for tags).
2441: CODE says which kind of type the caller wants;
2442: it is RECORD_TYPE or UNION_TYPE or ENUMERAL_TYPE.
2443: If the wrong kind of type is found, an error is reported. */
2444:
2445: static tree
2446: lookup_tag (code, name, binding_level, thislevel_only)
2447: enum tree_code code;
2448: struct binding_level *binding_level;
2449: tree name;
2450: int thislevel_only;
2451: {
2452: register struct binding_level *level;
2453:
2454: for (level = binding_level; level; level = level->level_chain)
2455: {
2456: register tree tail;
2457: for (tail = level->tags; tail; tail = TREE_CHAIN (tail))
2458: {
2459: if (TREE_PURPOSE (tail) == name)
2460: {
2461: if (TREE_CODE (TREE_VALUE (tail)) != code)
2462: {
2463: /* Definition isn't the kind we were looking for. */
2464: pending_invalid_xref = name;
2465: pending_invalid_xref_file = input_filename;
2466: pending_invalid_xref_line = lineno;
2467: }
2468: return TREE_VALUE (tail);
2469: }
2470: }
2471: if (thislevel_only && ! level->tag_transparent)
2472: return NULL_TREE;
2473: }
2474: return NULL_TREE;
2475: }
2476:
2477: /* Print an error message now
2478: for a recent invalid struct, union or enum cross reference.
2479: We don't print them immediately because they are not invalid
2480: when used in the `struct foo;' construct for shadowing. */
2481:
2482: void
2483: pending_xref_error ()
2484: {
2485: if (pending_invalid_xref != 0)
2486: error_with_file_and_line (pending_invalid_xref_file,
2487: pending_invalid_xref_line,
2488: "`%s' defined as wrong kind of tag",
2489: IDENTIFIER_POINTER (pending_invalid_xref));
2490: pending_invalid_xref = 0;
2491: }
2492:
2493: /* Given a type, find the tag that was defined for it and return the tag name.
2494: Otherwise return 0. */
2495:
2496: static tree
2497: lookup_tag_reverse (type)
2498: tree type;
2499: {
2500: register struct binding_level *level;
2501:
2502: for (level = current_binding_level; level; level = level->level_chain)
2503: {
2504: register tree tail;
2505: for (tail = level->tags; tail; tail = TREE_CHAIN (tail))
2506: {
2507: if (TREE_VALUE (tail) == type)
2508: return TREE_PURPOSE (tail);
2509: }
2510: }
2511: return NULL_TREE;
2512: }
2513:
2514: /* Look up NAME in the current binding level and its superiors
2515: in the namespace of variables, functions and typedefs.
2516: Return a ..._DECL node of some kind representing its definition,
2517: or return 0 if it is undefined. */
2518:
2519: tree
2520: lookup_name (name)
2521: tree name;
2522: {
2523: register tree val;
2524: if (current_binding_level != global_binding_level
2525: && IDENTIFIER_LOCAL_VALUE (name))
2526: val = IDENTIFIER_LOCAL_VALUE (name);
2527: else
2528: val = IDENTIFIER_GLOBAL_VALUE (name);
2529: return val;
2530: }
2531:
2532: /* Similar to `lookup_name' but look only at current binding level. */
2533:
1.1.1.5 ! root 2534: tree
1.1 root 2535: lookup_name_current_level (name)
2536: tree name;
2537: {
2538: register tree t;
2539:
2540: if (current_binding_level == global_binding_level)
2541: return IDENTIFIER_GLOBAL_VALUE (name);
2542:
2543: if (IDENTIFIER_LOCAL_VALUE (name) == 0)
2544: return 0;
2545:
2546: for (t = current_binding_level->names; t; t = TREE_CHAIN (t))
2547: if (DECL_NAME (t) == name)
2548: break;
2549:
2550: return t;
2551: }
2552:
2553: /* Create the predefined scalar types of C,
2554: and some nodes representing standard constants (0, 1, (void *)0).
2555: Initialize the global binding level.
2556: Make definitions for built-in primitive functions. */
2557:
2558: void
2559: init_decl_processing ()
2560: {
2561: register tree endlink;
2562: /* Either char* or void*. */
2563: tree traditional_ptr_type_node;
1.1.1.3 root 2564: /* Data types of memcpy and strlen. */
2565: tree memcpy_ftype, strlen_ftype;
2566: tree void_ftype_any;
1.1 root 2567: int wchar_type_size;
2568: tree temp;
1.1.1.5 ! root 2569: tree array_domain_type;
1.1 root 2570:
2571: current_function_decl = NULL;
2572: named_labels = NULL;
2573: current_binding_level = NULL_BINDING_LEVEL;
2574: free_binding_level = NULL_BINDING_LEVEL;
2575: pushlevel (0); /* make the binding_level structure for global names */
2576: global_binding_level = current_binding_level;
2577:
2578: /* Define `int' and `char' first so that dbx will output them first. */
2579:
2580: integer_type_node = make_signed_type (INT_TYPE_SIZE);
2581: pushdecl (build_decl (TYPE_DECL, ridpointers[(int) RID_INT],
2582: integer_type_node));
2583:
2584: /* Define `char', which is like either `signed char' or `unsigned char'
2585: but not the same as either. */
2586:
1.1.1.4 root 2587: char_type_node
2588: = (flag_signed_char
2589: ? make_signed_type (CHAR_TYPE_SIZE)
2590: : make_unsigned_type (CHAR_TYPE_SIZE));
1.1 root 2591: pushdecl (build_decl (TYPE_DECL, get_identifier ("char"),
2592: char_type_node));
2593:
2594: long_integer_type_node = make_signed_type (LONG_TYPE_SIZE);
2595: pushdecl (build_decl (TYPE_DECL, get_identifier ("long int"),
2596: long_integer_type_node));
2597:
2598: unsigned_type_node = make_unsigned_type (INT_TYPE_SIZE);
2599: pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned int"),
2600: unsigned_type_node));
2601:
2602: long_unsigned_type_node = make_unsigned_type (LONG_TYPE_SIZE);
2603: pushdecl (build_decl (TYPE_DECL, get_identifier ("long unsigned int"),
2604: long_unsigned_type_node));
2605:
2606: /* `unsigned long' is the standard type for sizeof.
2607: Traditionally, use a signed type.
2608: Note that stddef.h uses `unsigned long',
2609: and this must agree, even of long and int are the same size. */
2610: if (flag_traditional)
2611: sizetype = long_integer_type_node;
2612: else
2613: sizetype
2614: = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (SIZE_TYPE)));
2615:
2616: ptrdiff_type_node
2617: = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (PTRDIFF_TYPE)));
2618:
2619: TREE_TYPE (TYPE_SIZE (integer_type_node)) = sizetype;
2620: TREE_TYPE (TYPE_SIZE (char_type_node)) = sizetype;
2621: TREE_TYPE (TYPE_SIZE (unsigned_type_node)) = sizetype;
2622: TREE_TYPE (TYPE_SIZE (long_unsigned_type_node)) = sizetype;
2623: TREE_TYPE (TYPE_SIZE (long_integer_type_node)) = sizetype;
2624:
2625: error_mark_node = make_node (ERROR_MARK);
2626: TREE_TYPE (error_mark_node) = error_mark_node;
2627:
2628: short_integer_type_node = make_signed_type (SHORT_TYPE_SIZE);
2629: pushdecl (build_decl (TYPE_DECL, get_identifier ("short int"),
2630: short_integer_type_node));
2631:
2632: long_long_integer_type_node = make_signed_type (LONG_LONG_TYPE_SIZE);
2633: pushdecl (build_decl (TYPE_DECL, get_identifier ("long long int"),
2634: long_long_integer_type_node));
2635:
2636: short_unsigned_type_node = make_unsigned_type (SHORT_TYPE_SIZE);
2637: pushdecl (build_decl (TYPE_DECL, get_identifier ("short unsigned int"),
2638: short_unsigned_type_node));
2639:
2640: long_long_unsigned_type_node = make_unsigned_type (LONG_LONG_TYPE_SIZE);
2641: pushdecl (build_decl (TYPE_DECL, get_identifier ("long long unsigned int"),
2642: long_long_unsigned_type_node));
2643:
2644: /* Define both `signed char' and `unsigned char'. */
2645: signed_char_type_node = make_signed_type (CHAR_TYPE_SIZE);
2646: pushdecl (build_decl (TYPE_DECL, get_identifier ("signed char"),
2647: signed_char_type_node));
2648:
2649: unsigned_char_type_node = make_unsigned_type (CHAR_TYPE_SIZE);
2650: pushdecl (build_decl (TYPE_DECL, get_identifier ("unsigned char"),
2651: unsigned_char_type_node));
2652:
1.1.1.4 root 2653: intQI_type_node = make_signed_type (GET_MODE_BITSIZE (QImode));
2654: pushdecl (build_decl (TYPE_DECL, NULL_TREE, intQI_type_node));
2655:
2656: intHI_type_node = make_signed_type (GET_MODE_BITSIZE (HImode));
2657: pushdecl (build_decl (TYPE_DECL, NULL_TREE, intHI_type_node));
2658:
2659: intSI_type_node = make_signed_type (GET_MODE_BITSIZE (SImode));
2660: pushdecl (build_decl (TYPE_DECL, NULL_TREE, intSI_type_node));
2661:
2662: intDI_type_node = make_signed_type (GET_MODE_BITSIZE (DImode));
2663: pushdecl (build_decl (TYPE_DECL, NULL_TREE, intDI_type_node));
2664:
2665: unsigned_intQI_type_node = make_unsigned_type (GET_MODE_BITSIZE (QImode));
2666: pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intQI_type_node));
2667:
2668: unsigned_intHI_type_node = make_unsigned_type (GET_MODE_BITSIZE (HImode));
2669: pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intHI_type_node));
2670:
2671: unsigned_intSI_type_node = make_unsigned_type (GET_MODE_BITSIZE (SImode));
2672: pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intSI_type_node));
2673:
2674: unsigned_intDI_type_node = make_unsigned_type (GET_MODE_BITSIZE (DImode));
2675: pushdecl (build_decl (TYPE_DECL, NULL_TREE, unsigned_intDI_type_node));
2676:
1.1 root 2677: float_type_node = make_node (REAL_TYPE);
2678: TYPE_PRECISION (float_type_node) = FLOAT_TYPE_SIZE;
2679: pushdecl (build_decl (TYPE_DECL, ridpointers[(int) RID_FLOAT],
2680: float_type_node));
2681: layout_type (float_type_node);
2682:
2683: double_type_node = make_node (REAL_TYPE);
2684: if (flag_short_double)
2685: TYPE_PRECISION (double_type_node) = FLOAT_TYPE_SIZE;
2686: else
2687: TYPE_PRECISION (double_type_node) = DOUBLE_TYPE_SIZE;
2688: pushdecl (build_decl (TYPE_DECL, ridpointers[(int) RID_DOUBLE],
2689: double_type_node));
2690: layout_type (double_type_node);
2691:
2692: long_double_type_node = make_node (REAL_TYPE);
2693: TYPE_PRECISION (long_double_type_node) = LONG_DOUBLE_TYPE_SIZE;
2694: pushdecl (build_decl (TYPE_DECL, get_identifier ("long double"),
2695: long_double_type_node));
2696: layout_type (long_double_type_node);
2697:
1.1.1.5 ! root 2698: complex_integer_type_node = make_node (COMPLEX_TYPE);
! 2699: pushdecl (build_decl (TYPE_DECL, get_identifier ("complex int"),
! 2700: complex_integer_type_node));
! 2701: TREE_TYPE (complex_integer_type_node) = integer_type_node;
! 2702: layout_type (complex_integer_type_node);
! 2703:
! 2704: complex_float_type_node = make_node (COMPLEX_TYPE);
! 2705: pushdecl (build_decl (TYPE_DECL, get_identifier ("complex float"),
! 2706: complex_float_type_node));
! 2707: TREE_TYPE (complex_float_type_node) = float_type_node;
! 2708: layout_type (complex_float_type_node);
! 2709:
! 2710: complex_double_type_node = make_node (COMPLEX_TYPE);
! 2711: pushdecl (build_decl (TYPE_DECL, get_identifier ("complex double"),
! 2712: complex_double_type_node));
! 2713: TREE_TYPE (complex_double_type_node) = double_type_node;
! 2714: layout_type (complex_double_type_node);
! 2715:
! 2716: complex_long_double_type_node = make_node (COMPLEX_TYPE);
! 2717: pushdecl (build_decl (TYPE_DECL, get_identifier ("complex long double"),
! 2718: complex_long_double_type_node));
! 2719: TREE_TYPE (complex_long_double_type_node) = long_double_type_node;
! 2720: layout_type (complex_long_double_type_node);
! 2721:
1.1 root 2722: wchar_type_node
2723: = TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (get_identifier (WCHAR_TYPE)));
2724: wchar_type_size = TYPE_PRECISION (wchar_type_node);
2725: signed_wchar_type_node = type_for_size (wchar_type_size, 0);
2726: unsigned_wchar_type_node = type_for_size (wchar_type_size, 1);
2727:
2728: integer_zero_node = build_int_2 (0, 0);
2729: TREE_TYPE (integer_zero_node) = integer_type_node;
2730: integer_one_node = build_int_2 (1, 0);
2731: TREE_TYPE (integer_one_node) = integer_type_node;
2732:
2733: size_zero_node = build_int_2 (0, 0);
2734: TREE_TYPE (size_zero_node) = sizetype;
2735: size_one_node = build_int_2 (1, 0);
2736: TREE_TYPE (size_one_node) = sizetype;
2737:
2738: void_type_node = make_node (VOID_TYPE);
2739: pushdecl (build_decl (TYPE_DECL,
2740: ridpointers[(int) RID_VOID], void_type_node));
2741: layout_type (void_type_node); /* Uses integer_zero_node */
2742: /* We are not going to have real types in C with less than byte alignment,
2743: so we might as well not have any types that claim to have it. */
2744: TYPE_ALIGN (void_type_node) = BITS_PER_UNIT;
2745:
2746: null_pointer_node = build_int_2 (0, 0);
2747: TREE_TYPE (null_pointer_node) = build_pointer_type (void_type_node);
2748: layout_type (TREE_TYPE (null_pointer_node));
2749:
2750: string_type_node = build_pointer_type (char_type_node);
2751: const_string_type_node
2752: = build_pointer_type (build_type_variant (char_type_node, 1, 0));
2753:
1.1.1.5 ! root 2754: /* Make a type to be the domain of a few array types
! 2755: whose domains don't really matter.
! 2756: 200 is small enough that it always fits in size_t
! 2757: and large enough that it can hold most function names for the
! 2758: initializations of __FUNCTION__ and __PRETTY_FUNCTION__. */
! 2759: array_domain_type = build_index_type (build_int_2 (200, 0));
! 2760:
! 2761: /* make a type for arrays of characters.
1.1 root 2762: With luck nothing will ever really depend on the length of this
2763: array type. */
2764: char_array_type_node
1.1.1.5 ! root 2765: = build_array_type (char_type_node, array_domain_type);
1.1 root 2766: /* Likewise for arrays of ints. */
2767: int_array_type_node
1.1.1.5 ! root 2768: = build_array_type (integer_type_node, array_domain_type);
1.1 root 2769: /* This is for wide string constants. */
2770: wchar_array_type_node
1.1.1.5 ! root 2771: = build_array_type (wchar_type_node, array_domain_type);
1.1 root 2772:
2773: default_function_type
2774: = build_function_type (integer_type_node, NULL_TREE);
2775:
2776: ptr_type_node = build_pointer_type (void_type_node);
2777: const_ptr_type_node
2778: = build_pointer_type (build_type_variant (void_type_node, 1, 0));
2779:
2780: endlink = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
2781:
1.1.1.3 root 2782: void_ftype_any
1.1.1.4 root 2783: = build_function_type (void_type_node, NULL_TREE);
1.1.1.3 root 2784:
1.1 root 2785: double_ftype_double
2786: = build_function_type (double_type_node,
2787: tree_cons (NULL_TREE, double_type_node, endlink));
2788:
2789: double_ftype_double_double
2790: = build_function_type (double_type_node,
2791: tree_cons (NULL_TREE, double_type_node,
2792: tree_cons (NULL_TREE,
2793: double_type_node, endlink)));
2794:
2795: int_ftype_int
2796: = build_function_type (integer_type_node,
2797: tree_cons (NULL_TREE, integer_type_node, endlink));
2798:
2799: long_ftype_long
2800: = build_function_type (long_integer_type_node,
2801: tree_cons (NULL_TREE,
2802: long_integer_type_node, endlink));
2803:
2804: void_ftype_ptr_ptr_int
2805: = build_function_type (void_type_node,
2806: tree_cons (NULL_TREE, ptr_type_node,
2807: tree_cons (NULL_TREE, ptr_type_node,
2808: tree_cons (NULL_TREE,
2809: integer_type_node,
2810: endlink))));
2811:
2812: int_ftype_cptr_cptr_sizet
2813: = build_function_type (integer_type_node,
2814: tree_cons (NULL_TREE, const_ptr_type_node,
2815: tree_cons (NULL_TREE, const_ptr_type_node,
2816: tree_cons (NULL_TREE,
2817: sizetype,
2818: endlink))));
2819:
2820: void_ftype_ptr_int_int
2821: = build_function_type (void_type_node,
2822: tree_cons (NULL_TREE, ptr_type_node,
2823: tree_cons (NULL_TREE, integer_type_node,
2824: tree_cons (NULL_TREE,
2825: integer_type_node,
2826: endlink))));
2827:
2828: string_ftype_ptr_ptr /* strcpy prototype */
2829: = build_function_type (string_type_node,
2830: tree_cons (NULL_TREE, string_type_node,
2831: tree_cons (NULL_TREE,
2832: const_string_type_node,
2833: endlink)));
2834:
2835: int_ftype_string_string /* strcmp prototype */
2836: = build_function_type (integer_type_node,
2837: tree_cons (NULL_TREE, const_string_type_node,
2838: tree_cons (NULL_TREE,
2839: const_string_type_node,
2840: endlink)));
2841:
1.1.1.3 root 2842: strlen_ftype /* strlen prototype */
2843: = build_function_type (flag_traditional ? integer_type_node : sizetype,
1.1 root 2844: tree_cons (NULL_TREE, const_string_type_node,
2845: endlink));
2846:
2847: traditional_ptr_type_node
2848: = (flag_traditional ? string_type_node : ptr_type_node);
2849:
2850: memcpy_ftype /* memcpy prototype */
2851: = build_function_type (traditional_ptr_type_node,
2852: tree_cons (NULL_TREE, ptr_type_node,
2853: tree_cons (NULL_TREE, const_ptr_type_node,
2854: tree_cons (NULL_TREE,
2855: sizetype,
2856: endlink))));
2857:
1.1.1.4 root 2858: builtin_function ("__builtin_constant_p", int_ftype_int,
2859: BUILT_IN_CONSTANT_P, NULL_PTR);
1.1 root 2860:
2861: builtin_function ("__builtin_return_address",
1.1.1.4 root 2862: build_function_type (ptr_type_node,
1.1 root 2863: tree_cons (NULL_TREE,
2864: unsigned_type_node,
2865: endlink)),
1.1.1.4 root 2866: BUILT_IN_RETURN_ADDRESS, NULL_PTR);
1.1 root 2867:
2868: builtin_function ("__builtin_frame_address",
1.1.1.4 root 2869: build_function_type (ptr_type_node,
1.1 root 2870: tree_cons (NULL_TREE,
2871: unsigned_type_node,
2872: endlink)),
1.1.1.4 root 2873: BUILT_IN_FRAME_ADDRESS, NULL_PTR);
1.1 root 2874:
2875: builtin_function ("__builtin_alloca",
2876: build_function_type (ptr_type_node,
2877: tree_cons (NULL_TREE,
2878: sizetype,
2879: endlink)),
2880: BUILT_IN_ALLOCA, "alloca");
1.1.1.5 ! root 2881: builtin_function ("__builtin_ffs", int_ftype_int, BUILT_IN_FFS, NULL_PTR);
! 2882: /* Define alloca, ffs as builtins.
! 2883: Declare _exit just to mark it as volatile. */
1.1.1.3 root 2884: if (! flag_no_builtin && !flag_no_nonansi_builtin)
1.1 root 2885: {
2886: temp = builtin_function ("alloca",
2887: build_function_type (ptr_type_node,
2888: tree_cons (NULL_TREE,
2889: sizetype,
2890: endlink)),
1.1.1.4 root 2891: BUILT_IN_ALLOCA, NULL_PTR);
1.1 root 2892: /* Suppress error if redefined as a non-function. */
2893: DECL_BUILT_IN_NONANSI (temp) = 1;
1.1.1.5 ! root 2894: temp = builtin_function ("ffs", int_ftype_int, BUILT_IN_FFS, NULL_PTR);
! 2895: /* Suppress error if redefined as a non-function. */
! 2896: DECL_BUILT_IN_NONANSI (temp) = 1;
1.1.1.4 root 2897: temp = builtin_function ("_exit", void_ftype_any, NOT_BUILT_IN,
2898: NULL_PTR);
1.1 root 2899: TREE_THIS_VOLATILE (temp) = 1;
2900: TREE_SIDE_EFFECTS (temp) = 1;
2901: /* Suppress error if redefined as a non-function. */
2902: DECL_BUILT_IN_NONANSI (temp) = 1;
2903: }
2904:
1.1.1.4 root 2905: builtin_function ("__builtin_abs", int_ftype_int, BUILT_IN_ABS, NULL_PTR);
2906: builtin_function ("__builtin_fabs", double_ftype_double, BUILT_IN_FABS,
2907: NULL_PTR);
2908: builtin_function ("__builtin_labs", long_ftype_long, BUILT_IN_LABS,
2909: NULL_PTR);
2910: builtin_function ("__builtin_saveregs",
2911: build_function_type (ptr_type_node, NULL_TREE),
2912: BUILT_IN_SAVEREGS, NULL_PTR);
1.1 root 2913: /* EXPAND_BUILTIN_VARARGS is obsolete. */
2914: #if 0
2915: builtin_function ("__builtin_varargs",
2916: build_function_type (ptr_type_node,
2917: tree_cons (NULL_TREE,
2918: integer_type_node,
2919: endlink)),
1.1.1.4 root 2920: BUILT_IN_VARARGS, NULL_PTR);
1.1 root 2921: #endif
2922: builtin_function ("__builtin_classify_type", default_function_type,
1.1.1.4 root 2923: BUILT_IN_CLASSIFY_TYPE, NULL_PTR);
1.1 root 2924: builtin_function ("__builtin_next_arg",
2925: build_function_type (ptr_type_node, endlink),
1.1.1.4 root 2926: BUILT_IN_NEXT_ARG, NULL_PTR);
1.1 root 2927: builtin_function ("__builtin_args_info",
2928: build_function_type (integer_type_node,
2929: tree_cons (NULL_TREE,
2930: integer_type_node,
2931: endlink)),
1.1.1.4 root 2932: BUILT_IN_ARGS_INFO, NULL_PTR);
1.1 root 2933:
1.1.1.5 ! root 2934: /* Untyped call and return. */
! 2935: builtin_function ("__builtin_apply_args",
! 2936: build_function_type (ptr_type_node, NULL_TREE),
! 2937: BUILT_IN_APPLY_ARGS, NULL_PTR);
! 2938:
! 2939: temp = tree_cons (NULL_TREE,
! 2940: build_pointer_type (build_function_type (void_type_node,
! 2941: NULL_TREE)),
! 2942: tree_cons (NULL_TREE,
! 2943: ptr_type_node,
! 2944: tree_cons (NULL_TREE,
! 2945: sizetype,
! 2946: endlink)));
! 2947: builtin_function ("__builtin_apply",
! 2948: build_function_type (ptr_type_node, temp),
! 2949: BUILT_IN_APPLY, NULL_PTR);
! 2950: builtin_function ("__builtin_return",
! 2951: build_function_type (void_type_node,
! 2952: tree_cons (NULL_TREE,
! 2953: ptr_type_node,
! 2954: endlink)),
! 2955: BUILT_IN_RETURN, NULL_PTR);
! 2956:
1.1 root 2957: /* Currently under experimentation. */
2958: builtin_function ("__builtin_memcpy", memcpy_ftype,
2959: BUILT_IN_MEMCPY, "memcpy");
2960: builtin_function ("__builtin_memcmp", int_ftype_cptr_cptr_sizet,
2961: BUILT_IN_MEMCMP, "memcmp");
2962: builtin_function ("__builtin_strcmp", int_ftype_string_string,
2963: BUILT_IN_STRCMP, "strcmp");
2964: builtin_function ("__builtin_strcpy", string_ftype_ptr_ptr,
2965: BUILT_IN_STRCPY, "strcpy");
1.1.1.3 root 2966: builtin_function ("__builtin_strlen", strlen_ftype,
1.1 root 2967: BUILT_IN_STRLEN, "strlen");
1.1.1.2 root 2968: builtin_function ("__builtin_fsqrt", double_ftype_double,
2969: BUILT_IN_FSQRT, "sqrt");
1.1.1.4 root 2970: builtin_function ("__builtin_sin", double_ftype_double,
2971: BUILT_IN_SIN, "sin");
2972: builtin_function ("__builtin_cos", double_ftype_double,
2973: BUILT_IN_COS, "cos");
2974:
1.1 root 2975: /* In an ANSI C program, it is okay to supply built-in meanings
2976: for these functions, since applications cannot validly use them
2977: with any other meaning.
1.1.1.3 root 2978: However, honor the -fno-builtin option. */
2979: if (!flag_no_builtin)
1.1 root 2980: {
1.1.1.4 root 2981: builtin_function ("abs", int_ftype_int, BUILT_IN_ABS, NULL_PTR);
2982: builtin_function ("fabs", double_ftype_double, BUILT_IN_FABS, NULL_PTR);
2983: builtin_function ("labs", long_ftype_long, BUILT_IN_LABS, NULL_PTR);
2984: builtin_function ("memcpy", memcpy_ftype, BUILT_IN_MEMCPY, NULL_PTR);
2985: builtin_function ("memcmp", int_ftype_cptr_cptr_sizet, BUILT_IN_MEMCMP,
2986: NULL_PTR);
2987: builtin_function ("strcmp", int_ftype_string_string, BUILT_IN_STRCMP,
2988: NULL_PTR);
2989: builtin_function ("strcpy", string_ftype_ptr_ptr, BUILT_IN_STRCPY,
2990: NULL_PTR);
2991: builtin_function ("strlen", strlen_ftype, BUILT_IN_STRLEN, NULL_PTR);
2992: builtin_function ("sqrt", double_ftype_double, BUILT_IN_FSQRT, NULL_PTR);
2993: builtin_function ("sin", double_ftype_double, BUILT_IN_SIN, NULL_PTR);
2994: builtin_function ("cos", double_ftype_double, BUILT_IN_COS, NULL_PTR);
1.1.1.3 root 2995:
2996: /* Declare these functions volatile
2997: to avoid spurious "control drops through" warnings. */
2998: /* Don't specify the argument types, to avoid errors
2999: from certain code which isn't valid in ANSI but which exists. */
1.1.1.4 root 3000: temp = builtin_function ("abort", void_ftype_any, NOT_BUILT_IN,
3001: NULL_PTR);
1.1.1.3 root 3002: TREE_THIS_VOLATILE (temp) = 1;
3003: TREE_SIDE_EFFECTS (temp) = 1;
1.1.1.4 root 3004: temp = builtin_function ("exit", void_ftype_any, NOT_BUILT_IN, NULL_PTR);
1.1.1.3 root 3005: TREE_THIS_VOLATILE (temp) = 1;
3006: TREE_SIDE_EFFECTS (temp) = 1;
1.1 root 3007: }
3008:
3009: #if 0
3010: /* Support for these has not been written in either expand_builtin
3011: or build_function_call. */
1.1.1.4 root 3012: builtin_function ("__builtin_div", default_ftype, BUILT_IN_DIV, NULL_PTR);
3013: builtin_function ("__builtin_ldiv", default_ftype, BUILT_IN_LDIV, NULL_PTR);
3014: builtin_function ("__builtin_ffloor", double_ftype_double, BUILT_IN_FFLOOR,
3015: NULL_PTR);
3016: builtin_function ("__builtin_fceil", double_ftype_double, BUILT_IN_FCEIL,
3017: NULL_PTR);
3018: builtin_function ("__builtin_fmod", double_ftype_double_double,
3019: BUILT_IN_FMOD, NULL_PTR);
3020: builtin_function ("__builtin_frem", double_ftype_double_double,
3021: BUILT_IN_FREM, NULL_PTR);
3022: builtin_function ("__builtin_memset", ptr_ftype_ptr_int_int,
3023: BUILT_IN_MEMSET, NULL_PTR);
3024: builtin_function ("__builtin_getexp", double_ftype_double, BUILT_IN_GETEXP,
3025: NULL_PTR);
3026: builtin_function ("__builtin_getman", double_ftype_double, BUILT_IN_GETMAN,
3027: NULL_PTR);
1.1 root 3028: #endif
3029:
1.1.1.3 root 3030: /* Create the global bindings for __FUNCTION__ and __PRETTY_FUNCTION__. */
3031: declare_function_name ();
3032:
1.1 root 3033: start_identifier_warnings ();
3034:
3035: init_format_info_table ();
1.1.1.5 ! root 3036:
! 3037: init_iterators ();
! 3038:
! 3039: incomplete_decl_finalize_hook = finish_incomplete_decl;
1.1 root 3040: }
3041:
3042: /* Return a definition for a builtin function named NAME and whose data type
3043: is TYPE. TYPE should be a function type with argument types.
3044: FUNCTION_CODE tells later passes how to compile calls to this function.
3045: See tree.h for its possible values.
3046:
3047: If LIBRARY_NAME is nonzero, use that for DECL_ASSEMBLER_NAME,
3048: the name to be called if we can't opencode the function. */
3049:
1.1.1.2 root 3050: tree
1.1 root 3051: builtin_function (name, type, function_code, library_name)
3052: char *name;
3053: tree type;
3054: enum built_in_function function_code;
3055: char *library_name;
3056: {
3057: tree decl = build_decl (FUNCTION_DECL, get_identifier (name), type);
1.1.1.4 root 3058: DECL_EXTERNAL (decl) = 1;
1.1 root 3059: TREE_PUBLIC (decl) = 1;
1.1.1.3 root 3060: /* If -traditional, permit redefining a builtin function any way you like.
3061: (Though really, if the program redefines these functions,
3062: it probably won't work right unless compiled with -fno-builtin.) */
3063: if (flag_traditional && name[0] != '_')
3064: DECL_BUILT_IN_NONANSI (decl) = 1;
1.1 root 3065: if (library_name)
3066: DECL_ASSEMBLER_NAME (decl) = get_identifier (library_name);
1.1.1.4 root 3067: make_decl_rtl (decl, NULL_PTR, 1);
1.1 root 3068: pushdecl (decl);
3069: if (function_code != NOT_BUILT_IN)
3070: {
3071: DECL_BUILT_IN (decl) = 1;
3072: DECL_SET_FUNCTION_CODE (decl, function_code);
3073: }
1.1.1.4 root 3074: /* Warn if a function in the namespace for users
3075: is used without an occasion to consider it declared. */
3076: if (name[0] != '_' || name[1] != '_')
3077: C_DECL_ANTICIPATED (decl) = 1;
1.1 root 3078:
3079: return decl;
3080: }
3081:
3082: /* Called when a declaration is seen that contains no names to declare.
3083: If its type is a reference to a structure, union or enum inherited
3084: from a containing scope, shadow that tag name for the current scope
3085: with a forward reference.
3086: If its type defines a new named structure or union
3087: or defines an enum, it is valid but we need not do anything here.
3088: Otherwise, it is an error. */
3089:
3090: void
3091: shadow_tag (declspecs)
3092: tree declspecs;
3093: {
1.1.1.4 root 3094: shadow_tag_warned (declspecs, 0);
3095: }
3096:
3097: void
3098: shadow_tag_warned (declspecs, warned)
3099: tree declspecs;
3100: int warned;
1.1.1.5 ! root 3101: /* 1 => we have done a pedwarn. 2 => we have done a warning, but
! 3102: no pedwarn. */
1.1.1.4 root 3103: {
1.1 root 3104: int found_tag = 0;
3105: register tree link;
3106:
3107: pending_invalid_xref = 0;
3108:
3109: for (link = declspecs; link; link = TREE_CHAIN (link))
3110: {
3111: register tree value = TREE_VALUE (link);
3112: register enum tree_code code = TREE_CODE (value);
3113:
3114: if (code == RECORD_TYPE || code == UNION_TYPE || code == ENUMERAL_TYPE)
3115: /* Used to test also that TYPE_SIZE (value) != 0.
3116: That caused warning for `struct foo;' at top level in the file. */
3117: {
3118: register tree name = lookup_tag_reverse (value);
3119: register tree t;
3120:
3121: found_tag++;
3122:
3123: if (name == 0)
3124: {
1.1.1.5 ! root 3125: if (warned != 1 && code != ENUMERAL_TYPE)
! 3126: /* Empty unnamed enum OK */
1.1 root 3127: {
3128: pedwarn ("unnamed struct/union that defines no instances");
3129: warned = 1;
3130: }
3131: }
3132: else
3133: {
3134: t = lookup_tag (code, name, current_binding_level, 1);
3135:
3136: if (t == 0)
3137: {
3138: t = make_node (code);
3139: pushtag (name, t);
3140: }
3141: }
3142: }
3143: else
3144: {
3145: if (!warned)
1.1.1.5 ! root 3146: {
! 3147: warning ("useless keyword or type name in empty declaration");
! 3148: warned = 2;
! 3149: }
1.1 root 3150: }
3151: }
3152:
1.1.1.5 ! root 3153: if (found_tag > 1)
! 3154: error ("two types specified in one empty declaration");
! 3155:
! 3156: if (warned != 1)
1.1 root 3157: {
3158: if (found_tag == 0)
3159: pedwarn ("empty declaration");
3160: }
3161: }
3162:
3163: /* Decode a "typename", such as "int **", returning a ..._TYPE node. */
3164:
3165: tree
3166: groktypename (typename)
3167: tree typename;
3168: {
3169: if (TREE_CODE (typename) != TREE_LIST)
3170: return typename;
3171: return grokdeclarator (TREE_VALUE (typename),
3172: TREE_PURPOSE (typename),
3173: TYPENAME, 0);
3174: }
3175:
3176: /* Return a PARM_DECL node for a given pair of specs and declarator. */
3177:
3178: tree
3179: groktypename_in_parm_context (typename)
3180: tree typename;
3181: {
3182: if (TREE_CODE (typename) != TREE_LIST)
3183: return typename;
3184: return grokdeclarator (TREE_VALUE (typename),
3185: TREE_PURPOSE (typename),
3186: PARM, 0);
3187: }
3188:
3189: /* Decode a declarator in an ordinary declaration or data definition.
3190: This is called as soon as the type information and variable name
3191: have been parsed, before parsing the initializer if any.
3192: Here we create the ..._DECL node, fill in its type,
3193: and put it on the list of decls for the current context.
3194: The ..._DECL node is returned as the value.
3195:
3196: Exception: for arrays where the length is not specified,
3197: the type is left null, to be filled in by `finish_decl'.
3198:
3199: Function definitions do not come here; they go to start_function
3200: instead. However, external and forward declarations of functions
3201: do go through here. Structure field declarations are done by
3202: grokfield and not through here. */
3203:
3204: /* Set this to zero to debug not using the temporary obstack
3205: to parse initializers. */
3206: int debug_temp_inits = 1;
3207:
3208: tree
3209: start_decl (declarator, declspecs, initialized)
1.1.1.5 ! root 3210: tree declarator, declspecs;
1.1 root 3211: int initialized;
3212: {
3213: register tree decl = grokdeclarator (declarator, declspecs,
3214: NORMAL, initialized);
3215: register tree tem;
3216: int init_written = initialized;
3217:
3218: /* The corresponding pop_obstacks is in finish_decl. */
3219: push_obstacks_nochange ();
3220:
3221: if (initialized)
3222: /* Is it valid for this decl to have an initializer at all?
3223: If not, set INITIALIZED to zero, which will indirectly
3224: tell `finish_decl' to ignore the initializer once it is parsed. */
3225: switch (TREE_CODE (decl))
3226: {
3227: case TYPE_DECL:
3228: /* typedef foo = bar means give foo the same type as bar.
3229: We haven't parsed bar yet, so `finish_decl' will fix that up.
3230: Any other case of an initialization in a TYPE_DECL is an error. */
3231: if (pedantic || list_length (declspecs) > 1)
3232: {
3233: error ("typedef `%s' is initialized",
3234: IDENTIFIER_POINTER (DECL_NAME (decl)));
3235: initialized = 0;
3236: }
3237: break;
3238:
3239: case FUNCTION_DECL:
3240: error ("function `%s' is initialized like a variable",
3241: IDENTIFIER_POINTER (DECL_NAME (decl)));
3242: initialized = 0;
3243: break;
3244:
3245: case PARM_DECL:
3246: /* DECL_INITIAL in a PARM_DECL is really DECL_ARG_TYPE. */
3247: error ("parameter `%s' is initialized",
3248: IDENTIFIER_POINTER (DECL_NAME (decl)));
3249: initialized = 0;
3250: break;
3251:
3252: default:
3253: /* Don't allow initializations for incomplete types
3254: except for arrays which might be completed by the initialization. */
3255: if (TYPE_SIZE (TREE_TYPE (decl)) != 0)
3256: {
3257: /* A complete type is ok if size is fixed. */
3258:
3259: if (TREE_CODE (TYPE_SIZE (TREE_TYPE (decl))) != INTEGER_CST
3260: || C_DECL_VARIABLE_SIZE (decl))
3261: {
3262: error ("variable-sized object may not be initialized");
3263: initialized = 0;
3264: }
3265: }
3266: else if (TREE_CODE (TREE_TYPE (decl)) != ARRAY_TYPE)
3267: {
3268: error ("variable `%s' has initializer but incomplete type",
3269: IDENTIFIER_POINTER (DECL_NAME (decl)));
3270: initialized = 0;
3271: }
3272: else if (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl))) == 0)
3273: {
3274: error ("elements of array `%s' have incomplete type",
3275: IDENTIFIER_POINTER (DECL_NAME (decl)));
3276: initialized = 0;
3277: }
3278: }
3279:
3280: if (initialized)
3281: {
3282: #if 0 /* Seems redundant with grokdeclarator. */
3283: if (current_binding_level != global_binding_level
1.1.1.4 root 3284: && DECL_EXTERNAL (decl)
1.1 root 3285: && TREE_CODE (decl) != FUNCTION_DECL)
3286: warning ("declaration of `%s' has `extern' and is initialized",
3287: IDENTIFIER_POINTER (DECL_NAME (decl)));
3288: #endif
1.1.1.4 root 3289: DECL_EXTERNAL (decl) = 0;
1.1 root 3290: if (current_binding_level == global_binding_level)
3291: TREE_STATIC (decl) = 1;
3292:
3293: /* Tell `pushdecl' this is an initialized decl
3294: even though we don't yet have the initializer expression.
3295: Also tell `finish_decl' it may store the real initializer. */
3296: DECL_INITIAL (decl) = error_mark_node;
3297: }
3298:
3299: /* If this is a function declaration, write a record describing it to the
3300: prototypes file (if requested). */
3301:
3302: if (TREE_CODE (decl) == FUNCTION_DECL)
3303: gen_aux_info_record (decl, 0, 0, TYPE_ARG_TYPES (TREE_TYPE (decl)) != 0);
3304:
3305: /* Add this decl to the current binding level.
3306: TEM may equal DECL or it may be a previous decl of the same name. */
3307: tem = pushdecl (decl);
3308:
3309: /* For a local variable, define the RTL now. */
3310: if (current_binding_level != global_binding_level
3311: /* But not if this is a duplicate decl
3312: and we preserved the rtl from the previous one
3313: (which may or may not happen). */
3314: && DECL_RTL (tem) == 0)
3315: {
3316: if (TYPE_SIZE (TREE_TYPE (tem)) != 0)
3317: expand_decl (tem);
3318: else if (TREE_CODE (TREE_TYPE (tem)) == ARRAY_TYPE
3319: && DECL_INITIAL (tem) != 0)
3320: expand_decl (tem);
3321: }
3322:
3323: if (init_written)
3324: {
3325: /* When parsing and digesting the initializer,
3326: use temporary storage. Do this even if we will ignore the value. */
3327: if (current_binding_level == global_binding_level && debug_temp_inits)
3328: temporary_allocation ();
3329: }
3330:
3331: return tem;
3332: }
3333:
3334: /* Finish processing of a declaration;
3335: install its initial value.
3336: If the length of an array type is not known before,
3337: it must be determined now, from the initial value, or it is an error. */
3338:
3339: void
3340: finish_decl (decl, init, asmspec_tree)
3341: tree decl, init;
3342: tree asmspec_tree;
3343: {
3344: register tree type = TREE_TYPE (decl);
3345: int was_incomplete = (DECL_SIZE (decl) == 0);
3346: int temporary = allocation_temporary_p ();
3347: char *asmspec = 0;
3348:
3349: if (asmspec_tree)
3350: asmspec = TREE_STRING_POINTER (asmspec_tree);
3351:
3352: /* If `start_decl' didn't like having an initialization, ignore it now. */
3353:
3354: if (init != 0 && DECL_INITIAL (decl) == 0)
3355: init = 0;
3356: /* Don't crash if parm is initialized. */
3357: if (TREE_CODE (decl) == PARM_DECL)
3358: init = 0;
3359:
1.1.1.5 ! root 3360: if (ITERATOR_P (decl))
! 3361: {
! 3362: if (init == 0)
! 3363: error_with_decl (decl, "iterator has no initial value");
! 3364: else
! 3365: init = save_expr (init);
! 3366: }
! 3367:
1.1 root 3368: if (init)
3369: {
3370: if (TREE_CODE (decl) != TYPE_DECL)
3371: store_init_value (decl, init);
3372: else
3373: {
3374: /* typedef foo = bar; store the type of bar as the type of foo. */
3375: TREE_TYPE (decl) = TREE_TYPE (init);
3376: DECL_INITIAL (decl) = init = 0;
3377: }
3378: }
3379:
1.1.1.4 root 3380: /* Pop back to the obstack that is current for this binding level.
3381: This is because MAXINDEX, rtl, etc. to be made below
3382: must go in the permanent obstack. But don't discard the
1.1 root 3383: temporary data yet. */
1.1.1.4 root 3384: pop_obstacks ();
3385: #if 0 /* pop_obstacks was near the end; this is what was here. */
1.1 root 3386: if (current_binding_level == global_binding_level && temporary)
3387: end_temporary_allocation ();
1.1.1.4 root 3388: #endif
1.1 root 3389:
3390: /* Deduce size of array from initialization, if not already known */
3391:
3392: if (TREE_CODE (type) == ARRAY_TYPE
3393: && TYPE_DOMAIN (type) == 0
3394: && TREE_CODE (decl) != TYPE_DECL)
3395: {
3396: int do_default
3397: = (TREE_STATIC (decl)
3398: /* Even if pedantic, an external linkage array
3399: may have incomplete type at first. */
3400: ? pedantic && !TREE_PUBLIC (decl)
1.1.1.4 root 3401: : !DECL_EXTERNAL (decl));
1.1 root 3402: int failure
3403: = complete_array_type (type, DECL_INITIAL (decl), do_default);
3404:
3405: /* Get the completed type made by complete_array_type. */
3406: type = TREE_TYPE (decl);
3407:
3408: if (failure == 1)
3409: error_with_decl (decl, "initializer fails to determine size of `%s'");
3410:
3411: if (failure == 2)
3412: {
3413: if (do_default)
3414: error_with_decl (decl, "array size missing in `%s'");
1.1.1.5 ! root 3415: /* If a `static' var's size isn't known,
! 3416: make it extern as well as static, so it does not get
! 3417: allocated.
! 3418: If it is not `static', then do not mark extern;
! 3419: finish_incomplete_decl will give it a default size
! 3420: and it will get allocated. */
! 3421: else if (!pedantic && TREE_STATIC (decl) && ! TREE_PUBLIC (decl))
1.1.1.4 root 3422: DECL_EXTERNAL (decl) = 1;
1.1 root 3423: }
3424:
3425: if (pedantic && TYPE_DOMAIN (type) != 0
3426: && tree_int_cst_lt (TYPE_MAX_VALUE (TYPE_DOMAIN (type)),
3427: integer_zero_node))
3428: error_with_decl (decl, "zero-size array `%s'");
3429:
3430: layout_decl (decl, 0);
3431: }
3432:
3433: if (TREE_CODE (decl) == VAR_DECL)
3434: {
1.1.1.4 root 3435: if (DECL_SIZE (decl) == 0
1.1.1.5 ! root 3436: && TYPE_SIZE (TREE_TYPE (decl)) != 0)
! 3437: layout_decl (decl, 0);
! 3438:
! 3439: if (DECL_SIZE (decl) == 0
1.1.1.4 root 3440: && (TREE_STATIC (decl)
3441: ?
3442: /* A static variable with an incomplete type
3443: is an error if it is initialized or `static'.
3444: Otherwise, let it through, but if it is not `extern'
3445: then it may cause an error message later. */
3446: !TREE_PUBLIC (decl) || DECL_INITIAL (decl)
3447: :
3448: /* An automatic variable with an incomplete type
3449: is an error. */
3450: !DECL_EXTERNAL (decl)))
1.1 root 3451: {
3452: error_with_decl (decl, "storage size of `%s' isn't known");
3453: TREE_TYPE (decl) = error_mark_node;
3454: }
3455:
1.1.1.4 root 3456: if ((DECL_EXTERNAL (decl) || TREE_STATIC (decl))
1.1.1.5 ! root 3457: && DECL_SIZE (decl) != 0)
! 3458: {
! 3459: if (TREE_CODE (DECL_SIZE (decl)) == INTEGER_CST)
! 3460: constant_expression_warning (DECL_SIZE (decl));
! 3461: else
! 3462: error_with_decl (decl, "storage size of `%s' isn't constant");
! 3463: }
1.1 root 3464: }
3465:
3466: /* Output the assembler code and/or RTL code for variables and functions,
3467: unless the type is an undefined structure or union.
3468: If not, it will get done when the type is completed. */
3469:
3470: if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL)
3471: {
3472: if (flag_traditional && allocation_temporary_p ())
3473: {
3474: push_obstacks_nochange ();
3475: end_temporary_allocation ();
3476: /* This is a no-op in c-lang.c or something real in objc-actions.c. */
3477: maybe_objc_check_decl (decl);
3478: rest_of_decl_compilation (decl, asmspec,
3479: current_binding_level == global_binding_level,
3480: 0);
3481: pop_obstacks ();
3482: }
3483: else
3484: {
3485: /* This is a no-op in c-lang.c or something real in objc-actions.c. */
3486: maybe_objc_check_decl (decl);
3487: rest_of_decl_compilation (decl, asmspec,
3488: current_binding_level == global_binding_level,
3489: 0);
3490: }
3491: if (current_binding_level != global_binding_level)
3492: {
3493: /* Recompute the RTL of a local array now
3494: if it used to be an incomplete type. */
3495: if (was_incomplete
1.1.1.4 root 3496: && ! TREE_STATIC (decl) && ! DECL_EXTERNAL (decl))
1.1 root 3497: {
3498: /* If we used it already as memory, it must stay in memory. */
3499: TREE_ADDRESSABLE (decl) = TREE_USED (decl);
3500: /* If it's still incomplete now, no init will save it. */
3501: if (DECL_SIZE (decl) == 0)
3502: DECL_INITIAL (decl) = 0;
3503: expand_decl (decl);
3504: }
3505: /* Compute and store the initial value. */
1.1.1.4 root 3506: if (TREE_CODE (decl) != FUNCTION_DECL)
3507: expand_decl_init (decl);
1.1 root 3508: }
3509: }
3510:
3511: if (TREE_CODE (decl) == TYPE_DECL)
3512: {
3513: /* This is a no-op in c-lang.c or something real in objc-actions.c. */
3514: maybe_objc_check_decl (decl);
1.1.1.4 root 3515: rest_of_decl_compilation (decl, NULL_PTR,
1.1 root 3516: current_binding_level == global_binding_level,
3517: 0);
3518: }
3519:
1.1.1.4 root 3520: /* ??? After 2.3, test (init != 0) instead of TREE_CODE. */
3521: if (!(TREE_CODE (decl) == FUNCTION_DECL && DECL_INLINE (decl))
1.1.1.5 ! root 3522: && temporary && TREE_PERMANENT (decl)
! 3523: /* DECL_INITIAL is not defined in PARM_DECLs, since it shares
! 3524: space with DECL_ARG_TYPE. */
! 3525: && TREE_CODE (decl) != PARM_DECL)
1.1 root 3526: {
3527: /* We need to remember that this array HAD an initialization,
3528: but discard the actual temporary nodes,
3529: since we can't have a permanent node keep pointing to them. */
1.1.1.4 root 3530: /* We make an exception for inline functions, since it's
3531: normal for a local extern redeclaration of an inline function
3532: to have a copy of the top-level decl's DECL_INLINE. */
1.1 root 3533: if (DECL_INITIAL (decl) != 0)
3534: DECL_INITIAL (decl) = error_mark_node;
3535: }
3536:
1.1.1.4 root 3537: #if 0
1.1 root 3538: /* Resume permanent allocation, if not within a function. */
3539: /* The corresponding push_obstacks_nochange is in start_decl,
3540: and in push_parm_decl and in grokfield. */
3541: pop_obstacks ();
1.1.1.4 root 3542: #endif
3543:
3544: /* If we have gone back from temporary to permanent allocation,
3545: actually free the temporary space that we no longer need. */
3546: if (temporary && !allocation_temporary_p ())
1.1 root 3547: permanent_allocation ();
3548:
3549: /* At the end of a declaration, throw away any variable type sizes
3550: of types defined inside that declaration. There is no use
3551: computing them in the following function definition. */
3552: if (current_binding_level == global_binding_level)
3553: get_pending_sizes ();
3554: }
3555:
3556: /* If DECL has a cleanup, build and return that cleanup here.
3557: This is a callback called by expand_expr. */
3558:
3559: tree
3560: maybe_build_cleanup (decl)
3561: tree decl;
3562: {
3563: /* There are no cleanups in C. */
3564: return NULL_TREE;
3565: }
3566:
3567: /* Given a parsed parameter declaration,
3568: decode it into a PARM_DECL and push that on the current binding level.
3569: Also, for the sake of forward parm decls,
3570: record the given order of parms in `parm_order'. */
3571:
3572: void
3573: push_parm_decl (parm)
3574: tree parm;
3575: {
1.1.1.3 root 3576: tree decl, olddecl;
1.1.1.2 root 3577: int old_immediate_size_expand = immediate_size_expand;
3578: /* Don't try computing parm sizes now -- wait till fn is called. */
3579: immediate_size_expand = 0;
1.1 root 3580:
3581: /* The corresponding pop_obstacks is in finish_decl. */
3582: push_obstacks_nochange ();
3583:
3584: decl = grokdeclarator (TREE_VALUE (parm), TREE_PURPOSE (parm), PARM, 0);
1.1.1.5 ! root 3585:
! 3586: #if 0
1.1.1.3 root 3587: if (DECL_NAME (decl))
3588: {
3589: olddecl = lookup_name (DECL_NAME (decl));
3590: if (pedantic && olddecl != 0 && TREE_CODE (olddecl) == TYPE_DECL)
3591: pedwarn_with_decl (decl, "ANSI C forbids parameter `%s' shadowing typedef");
3592: }
1.1.1.5 ! root 3593: #endif
! 3594:
1.1 root 3595: decl = pushdecl (decl);
3596:
1.1.1.2 root 3597: immediate_size_expand = old_immediate_size_expand;
3598:
1.1 root 3599: current_binding_level->parm_order
3600: = tree_cons (NULL_TREE, decl, current_binding_level->parm_order);
3601:
3602: /* Add this decl to the current binding level. */
3603: finish_decl (decl, NULL_TREE, NULL_TREE);
3604: }
3605:
3606: /* Clear the given order of parms in `parm_order'.
3607: Used at start of parm list,
3608: and also at semicolon terminating forward decls. */
3609:
3610: void
3611: clear_parm_order ()
3612: {
3613: current_binding_level->parm_order = NULL_TREE;
3614: }
3615:
3616: /* Make TYPE a complete type based on INITIAL_VALUE.
1.1.1.2 root 3617: Return 0 if successful, 1 if INITIAL_VALUE can't be deciphered,
1.1 root 3618: 2 if there was no information (in which case assume 1 if DO_DEFAULT). */
3619:
3620: int
3621: complete_array_type (type, initial_value, do_default)
3622: tree type;
3623: tree initial_value;
3624: int do_default;
3625: {
3626: register tree maxindex = NULL_TREE;
3627: int value = 0;
3628:
3629: if (initial_value)
3630: {
3631: /* Note MAXINDEX is really the maximum index,
3632: one less than the size. */
3633: if (TREE_CODE (initial_value) == STRING_CST)
3634: {
3635: int eltsize
3636: = int_size_in_bytes (TREE_TYPE (TREE_TYPE (initial_value)));
3637: maxindex = build_int_2 (TREE_STRING_LENGTH (initial_value) / eltsize - 1, 0);
3638: }
3639: else if (TREE_CODE (initial_value) == CONSTRUCTOR)
3640: {
3641: register int nelts
3642: = list_length (CONSTRUCTOR_ELTS (initial_value));
1.1.1.5 ! root 3643: maxindex = build_int_2 (nelts - 1, - (nelts == 0));
1.1 root 3644: }
3645: else
3646: {
3647: /* Make an error message unless that happened already. */
3648: if (initial_value != error_mark_node)
3649: value = 1;
3650:
3651: /* Prevent further error messages. */
1.1.1.5 ! root 3652: maxindex = build_int_2 (0, 0);
1.1 root 3653: }
3654: }
3655:
3656: if (!maxindex)
3657: {
3658: if (do_default)
1.1.1.5 ! root 3659: maxindex = build_int_2 (0, 0);
1.1 root 3660: value = 2;
3661: }
3662:
3663: if (maxindex)
3664: {
3665: TYPE_DOMAIN (type) = build_index_type (maxindex);
3666: if (!TREE_TYPE (maxindex))
3667: TREE_TYPE (maxindex) = TYPE_DOMAIN (type);
1.1.1.5 ! root 3668: #if 0 /* I took out this change
! 3669: together with the change in build_array_type. --rms */
! 3670: change_main_variant (type,
! 3671: build_array_type (TREE_TYPE (type),
! 3672: TYPE_DOMAIN (type)));
! 3673: #endif
1.1 root 3674: }
3675:
3676: /* Lay out the type now that we can get the real answer. */
3677:
3678: layout_type (type);
3679:
3680: return value;
3681: }
3682:
3683: /* Given declspecs and a declarator,
3684: determine the name and type of the object declared
3685: and construct a ..._DECL node for it.
3686: (In one case we can return a ..._TYPE node instead.
3687: For invalid input we sometimes return 0.)
3688:
3689: DECLSPECS is a chain of tree_list nodes whose value fields
3690: are the storage classes and type specifiers.
3691:
3692: DECL_CONTEXT says which syntactic context this declaration is in:
3693: NORMAL for most contexts. Make a VAR_DECL or FUNCTION_DECL or TYPE_DECL.
3694: FUNCDEF for a function definition. Like NORMAL but a few different
3695: error messages in each case. Return value may be zero meaning
3696: this definition is too screwy to try to parse.
3697: PARM for a parameter declaration (either within a function prototype
3698: or before a function body). Make a PARM_DECL, or return void_type_node.
3699: TYPENAME if for a typename (in a cast or sizeof).
3700: Don't make a DECL node; just return the ..._TYPE node.
3701: FIELD for a struct or union field; make a FIELD_DECL.
3702: BITFIELD for a field with specified width.
3703: INITIALIZED is 1 if the decl has an initializer.
3704:
3705: In the TYPENAME case, DECLARATOR is really an absolute declarator.
3706: It may also be so in the PARM case, for a prototype where the
3707: argument type is specified but not the name.
3708:
3709: This function is where the complicated C meanings of `static'
1.1.1.2 root 3710: and `extern' are interpreted. */
1.1 root 3711:
3712: static tree
3713: grokdeclarator (declarator, declspecs, decl_context, initialized)
3714: tree declspecs;
3715: tree declarator;
3716: enum decl_context decl_context;
3717: int initialized;
3718: {
3719: int specbits = 0;
3720: tree spec;
3721: tree type = NULL_TREE;
3722: int longlong = 0;
3723: int constp;
3724: int volatilep;
3725: int inlinep;
3726: int explicit_int = 0;
3727: int explicit_char = 0;
1.1.1.5 ! root 3728: int defaulted_int = 0;
1.1 root 3729: tree typedef_decl = 0;
3730: char *name;
3731: tree typedef_type = 0;
3732: int funcdef_flag = 0;
3733: enum tree_code innermost_code = ERROR_MARK;
3734: int bitfield = 0;
1.1.1.2 root 3735: int size_varies = 0;
1.1 root 3736:
3737: if (decl_context == BITFIELD)
3738: bitfield = 1, decl_context = FIELD;
3739:
3740: if (decl_context == FUNCDEF)
3741: funcdef_flag = 1, decl_context = NORMAL;
3742:
3743: push_obstacks_nochange ();
3744:
3745: if (flag_traditional && allocation_temporary_p ())
3746: end_temporary_allocation ();
3747:
3748: /* Look inside a declarator for the name being declared
3749: and get it as a string, for an error message. */
3750: {
3751: register tree decl = declarator;
3752: name = 0;
3753:
3754: while (decl)
3755: switch (TREE_CODE (decl))
3756: {
3757: case ARRAY_REF:
3758: case INDIRECT_REF:
3759: case CALL_EXPR:
3760: innermost_code = TREE_CODE (decl);
3761: decl = TREE_OPERAND (decl, 0);
3762: break;
3763:
3764: case IDENTIFIER_NODE:
3765: name = IDENTIFIER_POINTER (decl);
3766: decl = 0;
3767: break;
3768:
3769: default:
3770: abort ();
3771: }
3772: if (name == 0)
3773: name = "type name";
3774: }
3775:
3776: /* A function definition's declarator must have the form of
3777: a function declarator. */
3778:
3779: if (funcdef_flag && innermost_code != CALL_EXPR)
3780: return 0;
3781:
3782: /* Anything declared one level down from the top level
3783: must be one of the parameters of a function
3784: (because the body is at least two levels down). */
3785:
3786: /* If this looks like a function definition, make it one,
3787: even if it occurs where parms are expected.
3788: Then store_parm_decls will reject it and not use it as a parm. */
3789: if (decl_context == NORMAL && !funcdef_flag
3790: && current_binding_level->level_chain == global_binding_level)
3791: decl_context = PARM;
3792:
3793: /* Look through the decl specs and record which ones appear.
3794: Some typespecs are defined as built-in typenames.
3795: Others, the ones that are modifiers of other types,
3796: are represented by bits in SPECBITS: set the bits for
3797: the modifiers that appear. Storage class keywords are also in SPECBITS.
3798:
3799: If there is a typedef name or a type, store the type in TYPE.
3800: This includes builtin typedefs such as `int'.
3801:
3802: Set EXPLICIT_INT or EXPLICIT_CHAR if the type is `int' or `char'
3803: and did not come from a user typedef.
3804:
3805: Set LONGLONG if `long' is mentioned twice. */
3806:
3807: for (spec = declspecs; spec; spec = TREE_CHAIN (spec))
3808: {
3809: register int i;
3810: register tree id = TREE_VALUE (spec);
3811:
3812: if (id == ridpointers[(int) RID_INT])
3813: explicit_int = 1;
3814: if (id == ridpointers[(int) RID_CHAR])
3815: explicit_char = 1;
3816:
3817: if (TREE_CODE (id) == IDENTIFIER_NODE)
3818: for (i = (int) RID_FIRST_MODIFIER; i < (int) RID_MAX; i++)
3819: {
3820: if (ridpointers[i] == id)
3821: {
3822: if (i == (int) RID_LONG && specbits & (1<<i))
3823: {
1.1.1.5 ! root 3824: if (longlong)
1.1.1.4 root 3825: error ("`long long long' is too long for GCC");
1.1 root 3826: else
1.1.1.5 ! root 3827: {
! 3828: if (pedantic)
! 3829: pedwarn ("ANSI C does not support `long long'");
! 3830: longlong = 1;
! 3831: }
1.1 root 3832: }
3833: else if (specbits & (1 << i))
1.1.1.3 root 3834: pedwarn ("duplicate `%s'", IDENTIFIER_POINTER (id));
1.1 root 3835: specbits |= 1 << i;
3836: goto found;
3837: }
3838: }
3839: if (type)
3840: error ("two or more data types in declaration of `%s'", name);
3841: /* Actual typedefs come to us as TYPE_DECL nodes. */
3842: else if (TREE_CODE (id) == TYPE_DECL)
3843: {
3844: type = TREE_TYPE (id);
3845: typedef_decl = id;
3846: }
3847: /* Built-in types come as identifiers. */
3848: else if (TREE_CODE (id) == IDENTIFIER_NODE)
3849: {
3850: register tree t = lookup_name (id);
3851: if (TREE_TYPE (t) == error_mark_node)
3852: ;
3853: else if (!t || TREE_CODE (t) != TYPE_DECL)
3854: error ("`%s' fails to be a typedef or built in type",
3855: IDENTIFIER_POINTER (id));
3856: else
3857: {
3858: type = TREE_TYPE (t);
3859: typedef_decl = t;
3860: }
3861: }
3862: else if (TREE_CODE (id) != ERROR_MARK)
3863: type = id;
3864:
3865: found: {}
3866: }
3867:
3868: typedef_type = type;
3869: if (type)
1.1.1.2 root 3870: size_varies = C_TYPE_VARIABLE_SIZE (type);
1.1 root 3871:
1.1.1.5 ! root 3872: /* No type at all: default to `int', and set DEFAULTED_INT
1.1 root 3873: because it was not a user-defined typedef. */
3874:
3875: if (type == 0)
3876: {
3877: if (funcdef_flag && warn_return_type
3878: && ! (specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT)
3879: | (1 << (int) RID_SIGNED) | (1 << (int) RID_UNSIGNED))))
3880: warn_about_return_type = 1;
1.1.1.5 ! root 3881: defaulted_int = 1;
1.1 root 3882: type = integer_type_node;
3883: }
3884:
3885: /* Now process the modifiers that were specified
3886: and check for invalid combinations. */
3887:
3888: /* Long double is a special combination. */
3889:
1.1.1.4 root 3890: if ((specbits & 1 << (int) RID_LONG)
3891: && TYPE_MAIN_VARIANT (type) == double_type_node)
1.1 root 3892: {
3893: specbits &= ~ (1 << (int) RID_LONG);
3894: type = long_double_type_node;
3895: }
3896:
3897: /* Check all other uses of type modifiers. */
3898:
3899: if (specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT)
3900: | (1 << (int) RID_UNSIGNED) | (1 << (int) RID_SIGNED)))
3901: {
3902: int ok = 0;
3903:
3904: if (TREE_CODE (type) != INTEGER_TYPE)
3905: error ("long, short, signed or unsigned invalid for `%s'", name);
3906: else if ((specbits & 1 << (int) RID_LONG)
3907: && (specbits & 1 << (int) RID_SHORT))
3908: error ("long and short specified together for `%s'", name);
3909: else if (((specbits & 1 << (int) RID_LONG)
3910: || (specbits & 1 << (int) RID_SHORT))
3911: && explicit_char)
3912: error ("long or short specified with char for `%s'", name);
3913: else if (((specbits & 1 << (int) RID_LONG)
3914: || (specbits & 1 << (int) RID_SHORT))
3915: && TREE_CODE (type) == REAL_TYPE)
3916: error ("long or short specified with floating type for `%s'", name);
3917: else if ((specbits & 1 << (int) RID_SIGNED)
3918: && (specbits & 1 << (int) RID_UNSIGNED))
3919: error ("signed and unsigned given together for `%s'", name);
3920: else
3921: {
3922: ok = 1;
1.1.1.5 ! root 3923: if (!explicit_int && !defaulted_int && !explicit_char && pedantic)
1.1 root 3924: {
3925: pedwarn ("long, short, signed or unsigned used invalidly for `%s'",
3926: name);
3927: if (flag_pedantic_errors)
3928: ok = 0;
3929: }
3930: }
3931:
3932: /* Discard the type modifiers if they are invalid. */
3933: if (! ok)
3934: {
3935: specbits &= ~((1 << (int) RID_LONG) | (1 << (int) RID_SHORT)
3936: | (1 << (int) RID_UNSIGNED) | (1 << (int) RID_SIGNED));
3937: longlong = 0;
3938: }
3939: }
3940:
3941: /* Decide whether an integer type is signed or not.
3942: Optionally treat bitfields as signed by default. */
3943: if (specbits & 1 << (int) RID_UNSIGNED
3944: /* Traditionally, all bitfields are unsigned. */
1.1.1.4 root 3945: || (bitfield && flag_traditional
3946: && (! explicit_flag_signed_bitfields || !flag_signed_bitfields))
1.1 root 3947: || (bitfield && ! flag_signed_bitfields
1.1.1.5 ! root 3948: && (explicit_int || defaulted_int || explicit_char
1.1 root 3949: /* A typedef for plain `int' without `signed'
3950: can be controlled just like plain `int'. */
3951: || ! (typedef_decl != 0
3952: && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)))
3953: && TREE_CODE (type) != ENUMERAL_TYPE
3954: && !(specbits & 1 << (int) RID_SIGNED)))
3955: {
3956: if (longlong)
3957: type = long_long_unsigned_type_node;
3958: else if (specbits & 1 << (int) RID_LONG)
3959: type = long_unsigned_type_node;
3960: else if (specbits & 1 << (int) RID_SHORT)
3961: type = short_unsigned_type_node;
3962: else if (type == char_type_node)
3963: type = unsigned_char_type_node;
3964: else if (typedef_decl)
3965: type = unsigned_type (type);
3966: else
3967: type = unsigned_type_node;
3968: }
3969: else if ((specbits & 1 << (int) RID_SIGNED)
3970: && type == char_type_node)
3971: type = signed_char_type_node;
3972: else if (longlong)
3973: type = long_long_integer_type_node;
3974: else if (specbits & 1 << (int) RID_LONG)
3975: type = long_integer_type_node;
3976: else if (specbits & 1 << (int) RID_SHORT)
3977: type = short_integer_type_node;
1.1.1.5 ! root 3978: else if (specbits & 1 << (int) RID_COMPLEX)
! 3979: {
! 3980: if (defaulted_int)
! 3981: type = complex_double_type_node;
! 3982: else if (type == integer_type_node)
! 3983: type = complex_integer_type_node;
! 3984: else if (type == float_type_node)
! 3985: type = complex_float_type_node;
! 3986: else if (type == double_type_node)
! 3987: type = complex_double_type_node;
! 3988: else if (type == long_double_type_node)
! 3989: type = complex_long_double_type_node;
! 3990: else
! 3991: error ("invalid complex type");
! 3992: }
1.1 root 3993:
3994: /* Set CONSTP if this declaration is `const', whether by
3995: explicit specification or via a typedef.
3996: Likewise for VOLATILEP. */
3997:
3998: constp = !! (specbits & 1 << (int) RID_CONST) + TYPE_READONLY (type);
3999: volatilep = !! (specbits & 1 << (int) RID_VOLATILE) + TYPE_VOLATILE (type);
4000: inlinep = !! (specbits & (1 << (int) RID_INLINE));
4001: if (constp > 1)
1.1.1.3 root 4002: pedwarn ("duplicate `const'");
1.1 root 4003: if (volatilep > 1)
1.1.1.3 root 4004: pedwarn ("duplicate `volatile'");
1.1 root 4005: if (! flag_gen_aux_info && (TYPE_READONLY (type) || TYPE_VOLATILE (type)))
4006: type = TYPE_MAIN_VARIANT (type);
4007:
4008: /* Warn if two storage classes are given. Default to `auto'. */
4009:
4010: {
4011: int nclasses = 0;
4012:
4013: if (specbits & 1 << (int) RID_AUTO) nclasses++;
4014: if (specbits & 1 << (int) RID_STATIC) nclasses++;
4015: if (specbits & 1 << (int) RID_EXTERN) nclasses++;
4016: if (specbits & 1 << (int) RID_REGISTER) nclasses++;
4017: if (specbits & 1 << (int) RID_TYPEDEF) nclasses++;
1.1.1.5 ! root 4018: if (specbits & 1 << (int) RID_ITERATOR) nclasses++;
1.1 root 4019:
4020: /* Warn about storage classes that are invalid for certain
4021: kinds of declarations (parameters, typenames, etc.). */
4022:
4023: if (nclasses > 1)
4024: error ("multiple storage classes in declaration of `%s'", name);
4025: else if (funcdef_flag
4026: && (specbits
4027: & ((1 << (int) RID_REGISTER)
4028: | (1 << (int) RID_AUTO)
4029: | (1 << (int) RID_TYPEDEF))))
4030: {
4031: if (specbits & 1 << (int) RID_AUTO
4032: && (pedantic || current_binding_level == global_binding_level))
4033: pedwarn ("function definition declared `auto'");
4034: if (specbits & 1 << (int) RID_REGISTER)
4035: error ("function definition declared `register'");
4036: if (specbits & 1 << (int) RID_TYPEDEF)
4037: error ("function definition declared `typedef'");
4038: specbits &= ~ ((1 << (int) RID_TYPEDEF) | (1 << (int) RID_REGISTER)
4039: | (1 << (int) RID_AUTO));
4040: }
4041: else if (decl_context != NORMAL && nclasses > 0)
4042: {
4043: if (decl_context == PARM && specbits & 1 << (int) RID_REGISTER)
4044: ;
4045: else
4046: {
4047: error ((decl_context == FIELD
4048: ? "storage class specified for structure field `%s'"
4049: : (decl_context == PARM
4050: ? "storage class specified for parameter `%s'"
4051: : "storage class specified for typename")),
4052: name);
4053: specbits &= ~ ((1 << (int) RID_TYPEDEF) | (1 << (int) RID_REGISTER)
4054: | (1 << (int) RID_AUTO) | (1 << (int) RID_STATIC)
4055: | (1 << (int) RID_EXTERN));
4056: }
4057: }
4058: else if (specbits & 1 << (int) RID_EXTERN && initialized && ! funcdef_flag)
4059: {
4060: /* `extern' with initialization is invalid if not at top level. */
4061: if (current_binding_level == global_binding_level)
4062: warning ("`%s' initialized and declared `extern'", name);
4063: else
4064: error ("`%s' has both `extern' and initializer", name);
4065: }
4066: else if (specbits & 1 << (int) RID_EXTERN && funcdef_flag
4067: && current_binding_level != global_binding_level)
4068: error ("nested function `%s' declared `extern'", name);
4069: else if (current_binding_level == global_binding_level
4070: && specbits & (1 << (int) RID_AUTO))
4071: error ("top-level declaration of `%s' specifies `auto'", name);
1.1.1.5 ! root 4072: else if ((specbits & 1 << (int) RID_ITERATOR)
! 4073: && TREE_CODE (declarator) != IDENTIFIER_NODE)
! 4074: {
! 4075: error ("iterator `%s' has derived type", name);
! 4076: type = error_mark_node;
! 4077: }
! 4078: else if ((specbits & 1 << (int) RID_ITERATOR)
! 4079: && TREE_CODE (type) != INTEGER_TYPE)
! 4080: {
! 4081: error ("iterator `%s' has noninteger type", name);
! 4082: type = error_mark_node;
! 4083: }
1.1 root 4084: }
4085:
4086: /* Now figure out the structure of the declarator proper.
4087: Descend through it, creating more complex types, until we reach
4088: the declared identifier (or NULL_TREE, in an absolute declarator). */
4089:
4090: while (declarator && TREE_CODE (declarator) != IDENTIFIER_NODE)
4091: {
4092: if (type == error_mark_node)
4093: {
4094: declarator = TREE_OPERAND (declarator, 0);
4095: continue;
4096: }
4097:
4098: /* Each level of DECLARATOR is either an ARRAY_REF (for ...[..]),
4099: an INDIRECT_REF (for *...),
4100: a CALL_EXPR (for ...(...)),
4101: an identifier (for the name being declared)
4102: or a null pointer (for the place in an absolute declarator
4103: where the name was omitted).
4104: For the last two cases, we have just exited the loop.
4105:
4106: At this point, TYPE is the type of elements of an array,
4107: or for a function to return, or for a pointer to point to.
4108: After this sequence of ifs, TYPE is the type of the
4109: array or function or pointer, and DECLARATOR has had its
4110: outermost layer removed. */
4111:
4112: if (TREE_CODE (declarator) == ARRAY_REF)
4113: {
4114: register tree itype = NULL_TREE;
4115: register tree size = TREE_OPERAND (declarator, 1);
1.1.1.5 ! root 4116: /* An uninitialized decl with `extern' is a reference. */
! 4117: int extern_ref = !initialized && (specbits & (1 << (int) RID_EXTERN));
1.1 root 4118:
4119: declarator = TREE_OPERAND (declarator, 0);
4120:
4121: /* Check for some types that there cannot be arrays of. */
4122:
1.1.1.4 root 4123: if (TYPE_MAIN_VARIANT (type) == void_type_node)
1.1 root 4124: {
4125: error ("declaration of `%s' as array of voids", name);
4126: type = error_mark_node;
4127: }
4128:
4129: if (TREE_CODE (type) == FUNCTION_TYPE)
4130: {
4131: error ("declaration of `%s' as array of functions", name);
4132: type = error_mark_node;
4133: }
4134:
4135: if (size == error_mark_node)
4136: type = error_mark_node;
4137:
4138: if (type == error_mark_node)
4139: continue;
4140:
1.1.1.5 ! root 4141: /* If this is a block level extern, it must live past the end
! 4142: of the function so that we can check it against other extern
! 4143: declarations (IDENTIFIER_LIMBO_VALUE). */
! 4144: if (extern_ref && allocation_temporary_p ())
! 4145: end_temporary_allocation ();
! 4146:
1.1 root 4147: /* If size was specified, set ITYPE to a range-type for that size.
4148: Otherwise, ITYPE remains null. finish_decl may figure it out
4149: from an initial value. */
4150:
4151: if (size)
4152: {
4153: /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
1.1.1.4 root 4154: STRIP_TYPE_NOPS (size);
1.1 root 4155:
4156: if (TREE_CODE (TREE_TYPE (size)) != INTEGER_TYPE
4157: && TREE_CODE (TREE_TYPE (size)) != ENUMERAL_TYPE)
4158: {
4159: error ("size of array `%s' has non-integer type", name);
4160: size = integer_one_node;
4161: }
4162: if (pedantic && integer_zerop (size))
4163: pedwarn ("ANSI C forbids zero-size array `%s'", name);
4164: if (TREE_CODE (size) == INTEGER_CST)
4165: {
1.1.1.5 ! root 4166: constant_expression_warning (size);
1.1 root 4167: if (INT_CST_LT (size, integer_zero_node))
4168: {
4169: error ("size of array `%s' is negative", name);
4170: size = integer_one_node;
4171: }
1.1.1.3 root 4172: itype = build_index_type (size_binop (MINUS_EXPR, size,
4173: size_one_node));
1.1 root 4174: }
4175: else
4176: {
4177: if (pedantic)
1.1.1.5 ! root 4178: {
! 4179: if (TREE_CONSTANT (size))
! 4180: pedwarn ("ANSI C forbids array `%s' whose size can't be evaluated", name);
! 4181: else
! 4182: pedwarn ("ANSI C forbids variable-size array `%s'", name);
! 4183: }
1.1 root 4184: itype = build_binary_op (MINUS_EXPR, size, integer_one_node,
4185: 1);
4186: /* Make sure the array size remains visibly nonconstant
4187: even if it is (eg) a const variable with known value. */
1.1.1.2 root 4188: size_varies = 1;
4189: itype = variable_size (itype);
4190: itype = build_index_type (itype);
1.1 root 4191: }
4192: }
4193:
4194: #if 0 /* This had bad results for pointers to arrays, as in
4195: union incomplete (*foo)[4]; */
4196: /* Complain about arrays of incomplete types, except in typedefs. */
4197:
4198: if (TYPE_SIZE (type) == 0
4199: /* Avoid multiple warnings for nested array types. */
4200: && TREE_CODE (type) != ARRAY_TYPE
4201: && !(specbits & (1 << (int) RID_TYPEDEF))
4202: && !C_TYPE_BEING_DEFINED (type))
4203: warning ("array type has incomplete element type");
4204: #endif
4205:
4206: #if 0 /* We shouldn't have a function type here at all!
4207: Functions aren't allowed as array elements. */
4208: if (pedantic && TREE_CODE (type) == FUNCTION_TYPE
4209: && (constp || volatilep))
4210: pedwarn ("ANSI C forbids const or volatile function types");
4211: #endif
1.1.1.5 ! root 4212:
! 4213: /* Build the array type itself, then merge any constancy or
! 4214: volatility into the target type. We must do it in this order
! 4215: to ensure that the TYPE_MAIN_VARIANT field of the array type
! 4216: is set correctly. */
! 4217:
! 4218: type = build_array_type (type, itype);
1.1 root 4219: if (constp || volatilep)
4220: type = c_build_type_variant (type, constp, volatilep);
4221:
4222: #if 0 /* don't clear these; leave them set so that the array type
4223: or the variable is itself const or volatile. */
4224: constp = 0;
4225: volatilep = 0;
4226: #endif
4227:
1.1.1.2 root 4228: if (size_varies)
1.1 root 4229: C_TYPE_VARIABLE_SIZE (type) = 1;
4230: }
4231: else if (TREE_CODE (declarator) == CALL_EXPR)
4232: {
1.1.1.4 root 4233: int extern_ref = (!(specbits & (1 << (int) RID_AUTO))
4234: || current_binding_level == global_binding_level);
1.1 root 4235: tree arg_types;
4236:
4237: /* Declaring a function type.
4238: Make sure we have a valid type for the function to return. */
4239: if (type == error_mark_node)
4240: continue;
4241:
1.1.1.2 root 4242: size_varies = 0;
1.1 root 4243:
4244: /* Warn about some types functions can't return. */
4245:
4246: if (TREE_CODE (type) == FUNCTION_TYPE)
4247: {
4248: error ("`%s' declared as function returning a function", name);
4249: type = integer_type_node;
4250: }
4251: if (TREE_CODE (type) == ARRAY_TYPE)
4252: {
4253: error ("`%s' declared as function returning an array", name);
4254: type = integer_type_node;
4255: }
4256:
4257: #ifndef TRADITIONAL_RETURN_FLOAT
4258: /* Traditionally, declaring return type float means double. */
4259:
1.1.1.4 root 4260: if (flag_traditional && TYPE_MAIN_VARIANT (type) == float_type_node)
1.1 root 4261: type = double_type_node;
4262: #endif /* TRADITIONAL_RETURN_FLOAT */
4263:
1.1.1.4 root 4264: /* If this is a block level extern, it must live past the end
4265: of the function so that we can check it against other extern
4266: declarations (IDENTIFIER_LIMBO_VALUE). */
4267: if (extern_ref && allocation_temporary_p ())
4268: end_temporary_allocation ();
4269:
1.1 root 4270: /* Construct the function type and go to the next
4271: inner layer of declarator. */
4272:
4273: arg_types = grokparms (TREE_OPERAND (declarator, 1),
4274: funcdef_flag
4275: /* Say it's a definition
4276: only for the CALL_EXPR
4277: closest to the identifier. */
4278: && TREE_CODE (TREE_OPERAND (declarator, 0)) == IDENTIFIER_NODE);
4279: #if 0 /* This seems to be false. We turn off temporary allocation
4280: above in this function if -traditional.
4281: And this code caused inconsistent results with prototypes:
4282: callers would ignore them, and pass arguments wrong. */
4283:
4284: /* Omit the arg types if -traditional, since the arg types
4285: and the list links might not be permanent. */
1.1.1.4 root 4286: type = build_function_type (type,
4287: flag_traditional
4288: ? NULL_TREE : arg_types);
1.1 root 4289: #endif
4290: type = build_function_type (type, arg_types);
4291: declarator = TREE_OPERAND (declarator, 0);
4292:
4293: /* Set the TYPE_CONTEXTs for each tagged type which is local to
4294: the formal parameter list of this FUNCTION_TYPE to point to
4295: the FUNCTION_TYPE node itself. */
4296:
4297: {
4298: register tree link;
4299:
4300: for (link = current_function_parm_tags;
4301: link;
4302: link = TREE_CHAIN (link))
4303: TYPE_CONTEXT (TREE_VALUE (link)) = type;
4304: }
4305: }
4306: else if (TREE_CODE (declarator) == INDIRECT_REF)
4307: {
4308: /* Merge any constancy or volatility into the target type
4309: for the pointer. */
4310:
4311: if (pedantic && TREE_CODE (type) == FUNCTION_TYPE
4312: && (constp || volatilep))
4313: pedwarn ("ANSI C forbids const or volatile function types");
4314: if (constp || volatilep)
4315: type = c_build_type_variant (type, constp, volatilep);
4316: constp = 0;
4317: volatilep = 0;
1.1.1.2 root 4318: size_varies = 0;
1.1 root 4319:
4320: type = build_pointer_type (type);
4321:
4322: /* Process a list of type modifier keywords
4323: (such as const or volatile) that were given inside the `*'. */
4324:
4325: if (TREE_TYPE (declarator))
4326: {
4327: register tree typemodlist;
4328: int erred = 0;
4329: for (typemodlist = TREE_TYPE (declarator); typemodlist;
4330: typemodlist = TREE_CHAIN (typemodlist))
4331: {
4332: if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_CONST])
4333: constp++;
4334: else if (TREE_VALUE (typemodlist) == ridpointers[(int) RID_VOLATILE])
4335: volatilep++;
4336: else if (!erred)
4337: {
4338: erred = 1;
4339: error ("invalid type modifier within pointer declarator");
4340: }
4341: }
4342: if (constp > 1)
1.1.1.4 root 4343: pedwarn ("duplicate `const'");
1.1 root 4344: if (volatilep > 1)
1.1.1.4 root 4345: pedwarn ("duplicate `volatile'");
1.1 root 4346: }
4347:
4348: declarator = TREE_OPERAND (declarator, 0);
4349: }
4350: else
4351: abort ();
4352:
4353: }
4354:
4355: /* Now TYPE has the actual type. */
4356:
4357: /* If this is declaring a typedef name, return a TYPE_DECL. */
4358:
4359: if (specbits & (1 << (int) RID_TYPEDEF))
4360: {
4361: tree decl;
4362: /* Note that the grammar rejects storage classes
4363: in typenames, fields or parameters */
4364: if (pedantic && TREE_CODE (type) == FUNCTION_TYPE
4365: && (constp || volatilep))
4366: pedwarn ("ANSI C forbids const or volatile function types");
4367: if (constp || volatilep)
4368: type = c_build_type_variant (type, constp, volatilep);
4369: pop_obstacks ();
4370: decl = build_decl (TYPE_DECL, declarator, type);
4371: if ((specbits & (1 << (int) RID_SIGNED))
4372: || (typedef_decl && C_TYPEDEF_EXPLICITLY_SIGNED (typedef_decl)))
4373: C_TYPEDEF_EXPLICITLY_SIGNED (decl) = 1;
4374: return decl;
4375: }
4376:
4377: /* Detect the case of an array type of unspecified size
4378: which came, as such, direct from a typedef name.
4379: We must copy the type, so that each identifier gets
4380: a distinct type, so that each identifier's size can be
4381: controlled separately by its own initializer. */
4382:
4383: if (type != 0 && typedef_type != 0
4384: && TYPE_MAIN_VARIANT (type) == TYPE_MAIN_VARIANT (typedef_type)
4385: && TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type) == 0)
4386: {
4387: type = build_array_type (TREE_TYPE (type), 0);
1.1.1.2 root 4388: if (size_varies)
1.1 root 4389: C_TYPE_VARIABLE_SIZE (type) = 1;
4390: }
4391:
4392: /* If this is a type name (such as, in a cast or sizeof),
4393: compute the type and return it now. */
4394:
4395: if (decl_context == TYPENAME)
4396: {
4397: /* Note that the grammar rejects storage classes
4398: in typenames, fields or parameters */
4399: if (pedantic && TREE_CODE (type) == FUNCTION_TYPE
4400: && (constp || volatilep))
4401: pedwarn ("ANSI C forbids const or volatile function types");
4402: if (constp || volatilep)
4403: type = c_build_type_variant (type, constp, volatilep);
4404: pop_obstacks ();
4405: return type;
4406: }
4407:
4408: /* `void' at top level (not within pointer)
4409: is allowed only in typedefs or type names.
4410: We don't complain about parms either, but that is because
4411: a better error message can be made later. */
4412:
1.1.1.4 root 4413: if (TYPE_MAIN_VARIANT (type) == void_type_node && decl_context != PARM)
1.1 root 4414: {
4415: error ("variable or field `%s' declared void",
4416: IDENTIFIER_POINTER (declarator));
4417: type = integer_type_node;
4418: }
4419:
4420: /* Now create the decl, which may be a VAR_DECL, a PARM_DECL
4421: or a FUNCTION_DECL, depending on DECL_CONTEXT and TYPE. */
4422:
4423: {
4424: register tree decl;
4425:
4426: if (decl_context == PARM)
4427: {
4428: tree type_as_written = type;
1.1.1.4 root 4429: tree main_type;
1.1 root 4430:
4431: /* A parameter declared as an array of T is really a pointer to T.
4432: One declared as a function is really a pointer to a function. */
4433:
4434: if (TREE_CODE (type) == ARRAY_TYPE)
4435: {
4436: /* Transfer const-ness of array into that of type pointed to. */
4437: type = build_pointer_type
4438: (c_build_type_variant (TREE_TYPE (type), constp, volatilep));
4439: volatilep = constp = 0;
1.1.1.2 root 4440: size_varies = 0;
1.1 root 4441: }
4442: else if (TREE_CODE (type) == FUNCTION_TYPE)
4443: {
4444: if (pedantic && (constp || volatilep))
4445: pedwarn ("ANSI C forbids const or volatile function types");
4446: type = build_pointer_type (c_build_type_variant (type, constp, volatilep));
4447: volatilep = constp = 0;
4448: }
4449:
4450: decl = build_decl (PARM_DECL, declarator, type);
1.1.1.2 root 4451: if (size_varies)
1.1 root 4452: C_DECL_VARIABLE_SIZE (decl) = 1;
4453:
4454: /* Compute the type actually passed in the parmlist,
4455: for the case where there is no prototype.
4456: (For example, shorts and chars are passed as ints.)
4457: When there is a prototype, this is overridden later. */
4458:
4459: DECL_ARG_TYPE (decl) = type;
1.1.1.5 ! root 4460: main_type = (type == error_mark_node
! 4461: ? error_mark_node
! 4462: : TYPE_MAIN_VARIANT (type));
1.1.1.4 root 4463: if (main_type == float_type_node)
1.1 root 4464: DECL_ARG_TYPE (decl) = double_type_node;
1.1.1.5 ! root 4465: /* Don't use TYPE_PRECISION to decide whether to promote,
1.1.1.3 root 4466: because we should convert short if it's the same size as int,
4467: but we should not convert long if it's the same size as int. */
1.1.1.5 ! root 4468: else if (TREE_CODE (main_type) != ERROR_MARK
! 4469: && C_PROMOTING_INTEGER_TYPE_P (main_type))
1.1.1.3 root 4470: {
4471: if (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node)
4472: && TREE_UNSIGNED (type))
4473: DECL_ARG_TYPE (decl) = unsigned_type_node;
4474: else
4475: DECL_ARG_TYPE (decl) = integer_type_node;
4476: }
1.1 root 4477:
4478: DECL_ARG_TYPE_AS_WRITTEN (decl) = type_as_written;
4479: }
4480: else if (decl_context == FIELD)
4481: {
4482: /* Structure field. It may not be a function. */
4483:
4484: if (TREE_CODE (type) == FUNCTION_TYPE)
4485: {
4486: error ("field `%s' declared as a function",
4487: IDENTIFIER_POINTER (declarator));
4488: type = build_pointer_type (type);
4489: }
4490: else if (TREE_CODE (type) != ERROR_MARK && TYPE_SIZE (type) == 0)
4491: {
4492: error ("field `%s' has incomplete type",
4493: IDENTIFIER_POINTER (declarator));
4494: type = error_mark_node;
4495: }
4496: /* Move type qualifiers down to element of an array. */
4497: if (TREE_CODE (type) == ARRAY_TYPE && (constp || volatilep))
4498: {
4499: type = build_array_type (c_build_type_variant (TREE_TYPE (type),
4500: constp, volatilep),
4501: TYPE_DOMAIN (type));
4502: #if 0 /* Leave the field const or volatile as well. */
4503: constp = volatilep = 0;
4504: #endif
4505: }
4506: decl = build_decl (FIELD_DECL, declarator, type);
1.1.1.2 root 4507: if (size_varies)
1.1 root 4508: C_DECL_VARIABLE_SIZE (decl) = 1;
4509: }
4510: else if (TREE_CODE (type) == FUNCTION_TYPE)
4511: {
1.1.1.4 root 4512: /* Every function declaration is "external"
4513: except for those which are inside a function body
4514: in which `auto' is used.
4515: That is a case not specified by ANSI C,
4516: and we use it for forward declarations for nested functions. */
4517: int extern_ref = (!(specbits & (1 << (int) RID_AUTO))
4518: || current_binding_level == global_binding_level);
4519:
1.1 root 4520: if (specbits & (1 << (int) RID_AUTO)
4521: && (pedantic || current_binding_level == global_binding_level))
4522: pedwarn ("invalid storage class for function `%s'",
4523: IDENTIFIER_POINTER (declarator));
4524: if (specbits & (1 << (int) RID_REGISTER))
4525: error ("invalid storage class for function `%s'",
4526: IDENTIFIER_POINTER (declarator));
4527: /* Function declaration not at top level.
4528: Storage classes other than `extern' are not allowed
4529: and `extern' makes no difference. */
4530: if (current_binding_level != global_binding_level
4531: && (specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_INLINE)))
4532: && pedantic)
4533: pedwarn ("invalid storage class for function `%s'",
4534: IDENTIFIER_POINTER (declarator));
1.1.1.4 root 4535:
4536: /* If this is a block level extern, it must live past the end
4537: of the function so that we can check it against other
4538: extern declarations (IDENTIFIER_LIMBO_VALUE). */
4539: if (extern_ref && allocation_temporary_p ())
4540: end_temporary_allocation ();
4541:
1.1 root 4542: decl = build_decl (FUNCTION_DECL, declarator, type);
4543:
1.1.1.4 root 4544: if (pedantic && (constp || volatilep)
4545: && ! DECL_IN_SYSTEM_HEADER (decl))
1.1 root 4546: pedwarn ("ANSI C forbids const or volatile functions");
4547:
1.1.1.4 root 4548: if (extern_ref)
4549: DECL_EXTERNAL (decl) = 1;
1.1 root 4550: /* Record absence of global scope for `static' or `auto'. */
4551: TREE_PUBLIC (decl)
4552: = !(specbits & ((1 << (int) RID_STATIC) | (1 << (int) RID_AUTO)));
4553: /* Record presence of `inline', if it is reasonable. */
4554: if (inlinep)
4555: {
4556: tree last = tree_last (TYPE_ARG_TYPES (type));
4557:
4558: if (! strcmp (IDENTIFIER_POINTER (declarator), "main"))
4559: warning ("cannot inline function `main'");
1.1.1.4 root 4560: else if (last && (TYPE_MAIN_VARIANT (TREE_VALUE (last))
4561: != void_type_node))
1.1 root 4562: warning ("inline declaration ignored for function with `...'");
4563: else
4564: /* Assume that otherwise the function can be inlined. */
1.1.1.4 root 4565: DECL_INLINE (decl) = 1;
1.1 root 4566:
4567: if (specbits & (1 << (int) RID_EXTERN))
4568: current_extern_inline = 1;
4569: }
4570: }
4571: else
4572: {
4573: /* It's a variable. */
1.1.1.4 root 4574: /* An uninitialized decl with `extern' is a reference. */
4575: int extern_ref = !initialized && (specbits & (1 << (int) RID_EXTERN));
1.1 root 4576:
4577: /* Move type qualifiers down to element of an array. */
4578: if (TREE_CODE (type) == ARRAY_TYPE && (constp || volatilep))
4579: {
4580: type = build_array_type (c_build_type_variant (TREE_TYPE (type),
4581: constp, volatilep),
4582: TYPE_DOMAIN (type));
4583: #if 0 /* Leave the variable const or volatile as well. */
4584: constp = volatilep = 0;
4585: #endif
4586: }
4587:
1.1.1.4 root 4588: /* If this is a block level extern, it must live past the end
4589: of the function so that we can check it against other
4590: extern declarations (IDENTIFIER_LIMBO_VALUE). */
4591: if (extern_ref && allocation_temporary_p ())
4592: end_temporary_allocation ();
4593:
1.1 root 4594: decl = build_decl (VAR_DECL, declarator, type);
1.1.1.2 root 4595: if (size_varies)
1.1 root 4596: C_DECL_VARIABLE_SIZE (decl) = 1;
4597:
4598: if (inlinep)
4599: pedwarn_with_decl (decl, "variable `%s' declared `inline'");
4600:
1.1.1.4 root 4601: DECL_EXTERNAL (decl) = extern_ref;
4602: /* At top level, the presence of a `static' or `register' storage
4603: class specifier, or the absence of all storage class specifiers
4604: makes this declaration a definition (perhaps tentative). Also,
4605: the absence of both `static' and `register' makes it public. */
1.1 root 4606: if (current_binding_level == global_binding_level)
4607: {
1.1.1.4 root 4608: TREE_PUBLIC (decl)
4609: = !(specbits
4610: & ((1 << (int) RID_STATIC) | (1 << (int) RID_REGISTER)));
4611: TREE_STATIC (decl) = ! DECL_EXTERNAL (decl);
1.1 root 4612: }
4613: /* Not at top level, only `static' makes a static definition. */
4614: else
4615: {
4616: TREE_STATIC (decl) = (specbits & (1 << (int) RID_STATIC)) != 0;
1.1.1.4 root 4617: TREE_PUBLIC (decl) = DECL_EXTERNAL (decl);
1.1 root 4618: }
1.1.1.5 ! root 4619:
! 4620: if (specbits & 1 << (int) RID_ITERATOR)
! 4621: ITERATOR_P (decl) = 1;
1.1 root 4622: }
4623:
4624: /* Record `register' declaration for warnings on &
4625: and in case doing stupid register allocation. */
4626:
4627: if (specbits & (1 << (int) RID_REGISTER))
1.1.1.4 root 4628: DECL_REGISTER (decl) = 1;
1.1 root 4629:
4630: /* Record constancy and volatility. */
4631:
4632: if (constp)
4633: TREE_READONLY (decl) = 1;
4634: if (volatilep)
4635: {
4636: TREE_SIDE_EFFECTS (decl) = 1;
4637: TREE_THIS_VOLATILE (decl) = 1;
4638: }
4639: /* If a type has volatile components, it should be stored in memory.
4640: Otherwise, the fact that those components are volatile
4641: will be ignored, and would even crash the compiler. */
4642: if (C_TYPE_FIELDS_VOLATILE (TREE_TYPE (decl)))
4643: mark_addressable (decl);
4644:
4645: pop_obstacks ();
4646:
4647: return decl;
4648: }
4649: }
4650:
4651: /* Decode the parameter-list info for a function type or function definition.
4652: The argument is the value returned by `get_parm_info' (or made in parse.y
4653: if there is an identifier list instead of a parameter decl list).
4654: These two functions are separate because when a function returns
4655: or receives functions then each is called multiple times but the order
4656: of calls is different. The last call to `grokparms' is always the one
4657: that contains the formal parameter names of a function definition.
4658:
4659: Store in `last_function_parms' a chain of the decls of parms.
4660: Also store in `last_function_parm_tags' a chain of the struct, union,
4661: and enum tags declared among the parms.
4662:
4663: Return a list of arg types to use in the FUNCTION_TYPE for this function.
4664:
4665: FUNCDEF_FLAG is nonzero for a function definition, 0 for
4666: a mere declaration. A nonempty identifier-list gets an error message
4667: when FUNCDEF_FLAG is zero. */
4668:
4669: static tree
4670: grokparms (parms_info, funcdef_flag)
4671: tree parms_info;
4672: int funcdef_flag;
4673: {
4674: tree first_parm = TREE_CHAIN (parms_info);
4675:
4676: last_function_parms = TREE_PURPOSE (parms_info);
4677: last_function_parm_tags = TREE_VALUE (parms_info);
4678:
1.1.1.4 root 4679: if (warn_strict_prototypes && first_parm == 0 && !funcdef_flag
4680: && !in_system_header)
1.1 root 4681: warning ("function declaration isn't a prototype");
4682:
4683: if (first_parm != 0
4684: && TREE_CODE (TREE_VALUE (first_parm)) == IDENTIFIER_NODE)
4685: {
4686: if (! funcdef_flag)
4687: pedwarn ("parameter names (without types) in function declaration");
4688:
4689: last_function_parms = first_parm;
4690: return 0;
4691: }
4692: else
4693: {
4694: tree parm;
4695: tree typelt;
4696: /* We no longer test FUNCDEF_FLAG.
4697: If the arg types are incomplete in a declaration,
4698: they must include undefined tags.
4699: These tags can never be defined in the scope of the declaration,
4700: so the types can never be completed,
4701: and no call can be compiled successfully. */
4702: #if 0
4703: /* In a fcn definition, arg types must be complete. */
4704: if (funcdef_flag)
4705: #endif
4706: for (parm = last_function_parms, typelt = first_parm;
4707: parm;
4708: parm = TREE_CHAIN (parm))
4709: /* Skip over any enumeration constants declared here. */
4710: if (TREE_CODE (parm) == PARM_DECL)
4711: {
4712: /* Barf if the parameter itself has an incomplete type. */
4713: tree type = TREE_VALUE (typelt);
4714: if (TYPE_SIZE (type) == 0)
4715: {
4716: if (funcdef_flag && DECL_NAME (parm) != 0)
4717: error ("parameter `%s' has incomplete type",
4718: IDENTIFIER_POINTER (DECL_NAME (parm)));
4719: else
4720: warning ("parameter has incomplete type");
4721: if (funcdef_flag)
4722: {
4723: TREE_VALUE (typelt) = error_mark_node;
4724: TREE_TYPE (parm) = error_mark_node;
4725: }
4726: }
4727: #if 0 /* This has been replaced by parm_tags_warning
4728: which uses a more accurate criterion for what to warn about. */
4729: else
4730: {
4731: /* Now warn if is a pointer to an incomplete type. */
4732: while (TREE_CODE (type) == POINTER_TYPE
4733: || TREE_CODE (type) == REFERENCE_TYPE)
4734: type = TREE_TYPE (type);
4735: type = TYPE_MAIN_VARIANT (type);
4736: if (TYPE_SIZE (type) == 0)
4737: {
4738: if (DECL_NAME (parm) != 0)
4739: warning ("parameter `%s' points to incomplete type",
4740: IDENTIFIER_POINTER (DECL_NAME (parm)));
4741: else
4742: warning ("parameter points to incomplete type");
4743: }
4744: }
4745: #endif
4746: typelt = TREE_CHAIN (typelt);
4747: }
4748:
1.1.1.4 root 4749: /* Allocate the list of types the way we allocate a type. */
4750: if (first_parm && ! TREE_PERMANENT (first_parm))
4751: {
4752: /* Construct a copy of the list of types
4753: on the saveable obstack. */
4754: tree result = NULL;
4755: for (typelt = first_parm; typelt; typelt = TREE_CHAIN (typelt))
4756: result = saveable_tree_cons (NULL_TREE, TREE_VALUE (typelt),
4757: result);
4758: return nreverse (result);
4759: }
4760: else
4761: /* The list we have is permanent already. */
4762: return first_parm;
1.1 root 4763: }
4764: }
4765:
4766:
4767: /* Return a tree_list node with info on a parameter list just parsed.
4768: The TREE_PURPOSE is a chain of decls of those parms.
4769: The TREE_VALUE is a list of structure, union and enum tags defined.
4770: The TREE_CHAIN is a list of argument types to go in the FUNCTION_TYPE.
4771: This tree_list node is later fed to `grokparms'.
4772:
4773: VOID_AT_END nonzero means append `void' to the end of the type-list.
4774: Zero means the parmlist ended with an ellipsis so don't append `void'. */
4775:
4776: tree
4777: get_parm_info (void_at_end)
4778: int void_at_end;
4779: {
4780: register tree decl, t;
4781: register tree types = 0;
4782: int erred = 0;
4783: tree tags = gettags ();
4784: tree parms = getdecls ();
4785: tree new_parms = 0;
4786: tree order = current_binding_level->parm_order;
4787:
4788: /* Just `void' (and no ellipsis) is special. There are really no parms. */
4789: if (void_at_end && parms != 0
4790: && TREE_CHAIN (parms) == 0
1.1.1.4 root 4791: && TYPE_MAIN_VARIANT (TREE_TYPE (parms)) == void_type_node
1.1 root 4792: && DECL_NAME (parms) == 0)
4793: {
4794: parms = NULL_TREE;
4795: storedecls (NULL_TREE);
4796: return saveable_tree_cons (NULL_TREE, NULL_TREE,
4797: saveable_tree_cons (NULL_TREE, void_type_node, NULL_TREE));
4798: }
4799:
1.1.1.3 root 4800: /* Extract enumerator values and other non-parms declared with the parms.
4801: Likewise any forward parm decls that didn't have real parm decls. */
1.1 root 4802: for (decl = parms; decl; )
4803: {
4804: tree next = TREE_CHAIN (decl);
4805:
4806: if (TREE_CODE (decl) != PARM_DECL)
4807: {
4808: TREE_CHAIN (decl) = new_parms;
4809: new_parms = decl;
4810: }
1.1.1.3 root 4811: else if (TREE_ASM_WRITTEN (decl))
4812: {
4813: error_with_decl (decl, "parameter `%s' has just a forward declaration");
4814: TREE_CHAIN (decl) = new_parms;
4815: new_parms = decl;
4816: }
1.1 root 4817: decl = next;
4818: }
4819:
4820: /* Put the parm decls back in the order they were in in the parm list. */
4821: for (t = order; t; t = TREE_CHAIN (t))
4822: {
4823: if (TREE_CHAIN (t))
4824: TREE_CHAIN (TREE_VALUE (t)) = TREE_VALUE (TREE_CHAIN (t));
4825: else
4826: TREE_CHAIN (TREE_VALUE (t)) = 0;
4827: }
4828:
4829: new_parms = chainon (order ? nreverse (TREE_VALUE (order)) : 0,
4830: new_parms);
4831:
4832: /* Store the parmlist in the binding level since the old one
4833: is no longer a valid list. (We have changed the chain pointers.) */
4834: storedecls (new_parms);
4835:
4836: for (decl = new_parms; decl; decl = TREE_CHAIN (decl))
4837: /* There may also be declarations for enumerators if an enumeration
4838: type is declared among the parms. Ignore them here. */
4839: if (TREE_CODE (decl) == PARM_DECL)
4840: {
4841: /* Since there is a prototype,
4842: args are passed in their declared types. */
4843: tree type = TREE_TYPE (decl);
4844: DECL_ARG_TYPE (decl) = type;
4845: #ifdef PROMOTE_PROTOTYPES
4846: if (TREE_CODE (type) == INTEGER_TYPE
4847: && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))
4848: DECL_ARG_TYPE (decl) = integer_type_node;
4849: #endif
4850:
4851: types = saveable_tree_cons (NULL_TREE, TREE_TYPE (decl), types);
1.1.1.4 root 4852: if (TYPE_MAIN_VARIANT (TREE_VALUE (types)) == void_type_node && ! erred
1.1 root 4853: && DECL_NAME (decl) == 0)
4854: {
4855: error ("`void' in parameter list must be the entire list");
4856: erred = 1;
4857: }
4858: }
4859:
4860: if (void_at_end)
4861: return saveable_tree_cons (new_parms, tags,
4862: nreverse (saveable_tree_cons (NULL_TREE, void_type_node, types)));
4863:
4864: return saveable_tree_cons (new_parms, tags, nreverse (types));
4865: }
4866:
4867: /* At end of parameter list, warn about any struct, union or enum tags
4868: defined within. Do so because these types cannot ever become complete. */
4869:
4870: void
4871: parmlist_tags_warning ()
4872: {
4873: tree elt;
4874: static int already;
4875:
4876: for (elt = current_binding_level->tags; elt; elt = TREE_CHAIN (elt))
4877: {
4878: enum tree_code code = TREE_CODE (TREE_VALUE (elt));
1.1.1.3 root 4879: /* An anonymous union parm type is meaningful as a GNU extension.
4880: So don't warn for that. */
4881: if (code == UNION_TYPE && !pedantic)
4882: continue;
1.1.1.2 root 4883: if (TREE_PURPOSE (elt) != 0)
4884: warning ("`%s %s' declared inside parameter list",
4885: (code == RECORD_TYPE ? "struct"
4886: : code == UNION_TYPE ? "union"
4887: : "enum"),
4888: IDENTIFIER_POINTER (TREE_PURPOSE (elt)));
4889: else
4890: warning ("anonymous %s declared inside parameter list",
4891: (code == RECORD_TYPE ? "struct"
4892: : code == UNION_TYPE ? "union"
4893: : "enum"));
4894:
1.1 root 4895: if (! already)
4896: {
4897: warning ("its scope is only this definition or declaration,");
4898: warning ("which is probably not what you want.");
4899: already = 1;
4900: }
4901: }
4902: }
4903:
4904: /* Get the struct, enum or union (CODE says which) with tag NAME.
4905: Define the tag as a forward-reference if it is not defined. */
4906:
4907: tree
4908: xref_tag (code, name)
4909: enum tree_code code;
4910: tree name;
4911: {
4912: int temporary = allocation_temporary_p ();
4913:
4914: /* If a cross reference is requested, look up the type
4915: already defined for this tag and return it. */
4916:
4917: register tree ref = lookup_tag (code, name, current_binding_level, 0);
4918: /* Even if this is the wrong type of tag, return what we found.
4919: There will be an error message anyway, from pending_xref_error.
4920: If we create an empty xref just for an invalid use of the type,
1.1.1.2 root 4921: the main result is to create lots of superfluous error messages. */
1.1 root 4922: if (ref)
4923: return ref;
4924:
4925: push_obstacks_nochange ();
4926:
4927: if (current_binding_level == global_binding_level && temporary)
4928: end_temporary_allocation ();
4929:
4930: /* If no such tag is yet defined, create a forward-reference node
4931: and record it as the "definition".
4932: When a real declaration of this type is found,
4933: the forward-reference will be altered into a real type. */
4934:
4935: ref = make_node (code);
4936: if (code == ENUMERAL_TYPE)
4937: {
4938: /* (In ANSI, Enums can be referred to only if already defined.) */
4939: if (pedantic)
4940: pedwarn ("ANSI C forbids forward references to `enum' types");
4941: /* Give the type a default layout like unsigned int
4942: to avoid crashing if it does not get defined. */
4943: TYPE_MODE (ref) = TYPE_MODE (unsigned_type_node);
4944: TYPE_ALIGN (ref) = TYPE_ALIGN (unsigned_type_node);
4945: TREE_UNSIGNED (ref) = 1;
4946: TYPE_PRECISION (ref) = TYPE_PRECISION (unsigned_type_node);
4947: TYPE_MIN_VALUE (ref) = TYPE_MIN_VALUE (unsigned_type_node);
4948: TYPE_MAX_VALUE (ref) = TYPE_MAX_VALUE (unsigned_type_node);
4949: }
4950:
4951: pushtag (name, ref);
4952:
4953: pop_obstacks ();
4954:
4955: return ref;
4956: }
4957:
4958: /* Make sure that the tag NAME is defined *in the current binding level*
4959: at least as a forward reference.
1.1.1.4 root 4960: CODE says which kind of tag NAME ought to be.
4961:
4962: We also do a push_obstacks_nochange
4963: whose matching pop is in finish_struct. */
1.1 root 4964:
4965: tree
4966: start_struct (code, name)
4967: enum tree_code code;
4968: tree name;
4969: {
4970: /* If there is already a tag defined at this binding level
4971: (as a forward reference), just return it. */
4972:
4973: register tree ref = 0;
4974:
1.1.1.4 root 4975: push_obstacks_nochange ();
4976: if (current_binding_level == global_binding_level)
4977: end_temporary_allocation ();
4978:
1.1 root 4979: if (name != 0)
4980: ref = lookup_tag (code, name, current_binding_level, 1);
4981: if (ref && TREE_CODE (ref) == code)
4982: {
4983: C_TYPE_BEING_DEFINED (ref) = 1;
4984: if (TYPE_FIELDS (ref))
4985: error ((code == UNION_TYPE ? "redefinition of `union %s'"
4986: : "redefinition of `struct %s'"),
4987: IDENTIFIER_POINTER (name));
4988:
4989: return ref;
4990: }
4991:
4992: /* Otherwise create a forward-reference just so the tag is in scope. */
4993:
4994: ref = make_node (code);
4995: pushtag (name, ref);
4996: C_TYPE_BEING_DEFINED (ref) = 1;
4997: return ref;
4998: }
4999:
5000: /* Process the specs, declarator (NULL if omitted) and width (NULL if omitted)
5001: of a structure component, returning a FIELD_DECL node.
5002: WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node.
5003:
5004: This is done during the parsing of the struct declaration.
5005: The FIELD_DECL nodes are chained together and the lot of them
5006: are ultimately passed to `build_struct' to make the RECORD_TYPE node. */
5007:
5008: tree
5009: grokfield (filename, line, declarator, declspecs, width)
5010: char *filename;
5011: int line;
5012: tree declarator, declspecs, width;
5013: {
5014: tree value;
5015:
5016: /* The corresponding pop_obstacks is in finish_decl. */
5017: push_obstacks_nochange ();
5018:
5019: value = grokdeclarator (declarator, declspecs, width ? BITFIELD : FIELD, 0);
5020:
1.1.1.4 root 5021: finish_decl (value, NULL_TREE, NULL_TREE);
1.1 root 5022: DECL_INITIAL (value) = width;
5023:
1.1.1.5 ! root 5024: maybe_objc_check_decl (value);
1.1 root 5025: return value;
5026: }
5027:
5028: /* Function to help qsort sort FIELD_DECLs by name order. */
5029:
5030: static int
5031: field_decl_cmp (x, y)
5032: tree *x, *y;
5033: {
5034: return (long)DECL_NAME (*x) - (long)DECL_NAME (*y);
5035: }
5036:
5037: /* Fill in the fields of a RECORD_TYPE or UNION_TYPE node, T.
1.1.1.4 root 5038: FIELDLIST is a chain of FIELD_DECL nodes for the fields.
5039:
5040: We also do a pop_obstacks to match the push in start_struct. */
1.1 root 5041:
5042: tree
5043: finish_struct (t, fieldlist)
5044: register tree t, fieldlist;
5045: {
5046: register tree x;
5047: int old_momentary;
5048: int toplevel = global_binding_level == current_binding_level;
5049:
5050: /* If this type was previously laid out as a forward reference,
5051: make sure we lay it out again. */
5052:
5053: TYPE_SIZE (t) = 0;
5054:
5055: /* Nameless union parm types are useful as GCC extension. */
5056: if (! (TREE_CODE (t) == UNION_TYPE && TYPE_NAME (t) == 0) && !pedantic)
5057: /* Otherwise, warn about any struct or union def. in parmlist. */
5058: if (in_parm_level_p ())
5059: {
5060: if (pedantic)
5061: pedwarn ((TREE_CODE (t) == UNION_TYPE ? "union defined inside parms"
5062: : "structure defined inside parms"));
1.1.1.5 ! root 5063: else if (! flag_traditional)
1.1 root 5064: warning ((TREE_CODE (t) == UNION_TYPE ? "union defined inside parms"
5065: : "structure defined inside parms"));
5066: }
5067:
5068: old_momentary = suspend_momentary ();
5069:
5070: if (fieldlist == 0 && pedantic)
5071: pedwarn ((TREE_CODE (t) == UNION_TYPE ? "union has no members"
5072: : "structure has no members"));
5073:
5074: /* Install struct as DECL_CONTEXT of each field decl.
5075: Also process specified field sizes.
1.1.1.3 root 5076: Set DECL_FIELD_SIZE to the specified size, or 0 if none specified.
1.1 root 5077: The specified size is found in the DECL_INITIAL.
5078: Store 0 there, except for ": 0" fields (so we can find them
5079: and delete them, below). */
5080:
5081: for (x = fieldlist; x; x = TREE_CHAIN (x))
5082: {
5083: DECL_CONTEXT (x) = t;
1.1.1.3 root 5084: DECL_FIELD_SIZE (x) = 0;
1.1 root 5085:
5086: /* If any field is const, the structure type is pseudo-const. */
5087: if (TREE_READONLY (x))
5088: C_TYPE_FIELDS_READONLY (t) = 1;
5089: else
5090: {
5091: /* A field that is pseudo-const makes the structure likewise. */
5092: tree t1 = TREE_TYPE (x);
5093: while (TREE_CODE (t1) == ARRAY_TYPE)
5094: t1 = TREE_TYPE (t1);
5095: if ((TREE_CODE (t1) == RECORD_TYPE || TREE_CODE (t1) == UNION_TYPE)
5096: && C_TYPE_FIELDS_READONLY (t1))
5097: C_TYPE_FIELDS_READONLY (t) = 1;
5098: }
5099:
5100: /* Any field that is volatile means variables of this type must be
5101: treated in some ways as volatile. */
5102: if (TREE_THIS_VOLATILE (x))
5103: C_TYPE_FIELDS_VOLATILE (t) = 1;
5104:
5105: /* Any field of nominal variable size implies structure is too. */
5106: if (C_DECL_VARIABLE_SIZE (x))
5107: C_TYPE_VARIABLE_SIZE (t) = 1;
5108:
1.1.1.4 root 5109: /* Detect invalid nested redefinition. */
5110: if (TREE_TYPE (x) == t)
5111: error ("nested redefinition of `%s'",
5112: IDENTIFIER_POINTER (TYPE_NAME (t)));
5113:
1.1 root 5114: /* Detect invalid bit-field size. */
1.1.1.4 root 5115: if (DECL_INITIAL (x))
5116: STRIP_NOPS (DECL_INITIAL (x));
1.1.1.5 ! root 5117: if (DECL_INITIAL (x))
1.1 root 5118: {
1.1.1.5 ! root 5119: if (TREE_CODE (DECL_INITIAL (x)) == INTEGER_CST)
! 5120: constant_expression_warning (DECL_INITIAL (x));
! 5121: else
! 5122: {
! 5123: error_with_decl (x, "bit-field `%s' width not an integer constant");
! 5124: DECL_INITIAL (x) = NULL;
! 5125: }
1.1 root 5126: }
5127:
5128: /* Detect invalid bit-field type. */
5129: if (DECL_INITIAL (x)
5130: && TREE_CODE (TREE_TYPE (x)) != INTEGER_TYPE
5131: && TREE_CODE (TREE_TYPE (x)) != ENUMERAL_TYPE)
5132: {
5133: error_with_decl (x, "bit-field `%s' has invalid type");
5134: DECL_INITIAL (x) = NULL;
5135: }
5136: if (DECL_INITIAL (x) && pedantic
5137: && TYPE_MAIN_VARIANT (TREE_TYPE (x)) != integer_type_node
5138: && TYPE_MAIN_VARIANT (TREE_TYPE (x)) != unsigned_type_node)
5139: pedwarn_with_decl (x, "bit-field `%s' type invalid in ANSI C");
5140:
5141: /* Detect and ignore out of range field width. */
5142: if (DECL_INITIAL (x))
5143: {
1.1.1.4 root 5144: unsigned HOST_WIDE_INT width = TREE_INT_CST_LOW (DECL_INITIAL (x));
1.1 root 5145:
1.1.1.4 root 5146: if (tree_int_cst_lt (DECL_INITIAL (x), integer_zero_node))
1.1 root 5147: {
5148: DECL_INITIAL (x) = NULL;
5149: error_with_decl (x, "negative width in bit-field `%s'");
5150: }
1.1.1.4 root 5151: else if (TREE_INT_CST_HIGH (DECL_INITIAL (x)) != 0
5152: || width > TYPE_PRECISION (TREE_TYPE (x)))
1.1 root 5153: {
5154: DECL_INITIAL (x) = NULL;
1.1.1.4 root 5155: pedwarn_with_decl (x, "width of `%s' exceeds its type");
1.1 root 5156: }
1.1.1.4 root 5157: else if (width == 0 && DECL_NAME (x) != 0)
1.1 root 5158: {
1.1.1.4 root 5159: error_with_decl (x, "zero width for bit-field `%s'");
1.1 root 5160: DECL_INITIAL (x) = NULL;
5161: }
5162: }
5163:
5164: /* Process valid field width. */
5165: if (DECL_INITIAL (x))
5166: {
5167: register int width = TREE_INT_CST_LOW (DECL_INITIAL (x));
5168:
1.1.1.3 root 5169: DECL_FIELD_SIZE (x) = width;
1.1 root 5170: DECL_BIT_FIELD (x) = 1;
5171: DECL_INITIAL (x) = NULL;
5172:
5173: if (width == 0)
5174: {
5175: /* field size 0 => force desired amount of alignment. */
5176: #ifdef EMPTY_FIELD_BOUNDARY
5177: DECL_ALIGN (x) = MAX (DECL_ALIGN (x), EMPTY_FIELD_BOUNDARY);
5178: #endif
5179: #ifdef PCC_BITFIELD_TYPE_MATTERS
5180: DECL_ALIGN (x) = MAX (DECL_ALIGN (x),
5181: TYPE_ALIGN (TREE_TYPE (x)));
5182: #endif
5183: }
5184: }
5185: else
1.1.1.3 root 5186: {
5187: int min_align = (DECL_PACKED (x) ? BITS_PER_UNIT
5188: : TYPE_ALIGN (TREE_TYPE (x)));
5189: /* Non-bit-fields are aligned for their type, except packed
5190: fields which require only BITS_PER_UNIT alignment. */
5191: DECL_ALIGN (x) = MAX (DECL_ALIGN (x), min_align);
5192: }
1.1 root 5193: }
5194:
5195: /* Now DECL_INITIAL is null on all members. */
5196:
5197: /* Delete all duplicate fields from the fieldlist */
5198: for (x = fieldlist; x && TREE_CHAIN (x);)
5199: /* Anonymous fields aren't duplicates. */
5200: if (DECL_NAME (TREE_CHAIN (x)) == 0)
5201: x = TREE_CHAIN (x);
5202: else
5203: {
5204: register tree y = fieldlist;
5205:
5206: while (1)
5207: {
5208: if (DECL_NAME (y) == DECL_NAME (TREE_CHAIN (x)))
5209: break;
5210: if (y == x)
5211: break;
5212: y = TREE_CHAIN (y);
5213: }
5214: if (DECL_NAME (y) == DECL_NAME (TREE_CHAIN (x)))
5215: {
5216: error_with_decl (TREE_CHAIN (x), "duplicate member `%s'");
5217: TREE_CHAIN (x) = TREE_CHAIN (TREE_CHAIN (x));
5218: }
5219: else x = TREE_CHAIN (x);
5220: }
5221:
5222: /* Now we have the nearly final fieldlist. Record it,
5223: then lay out the structure or union (including the fields). */
5224:
5225: TYPE_FIELDS (t) = fieldlist;
5226:
5227: layout_type (t);
5228:
5229: /* Delete all zero-width bit-fields from the front of the fieldlist */
5230: while (fieldlist
5231: && DECL_INITIAL (fieldlist))
5232: fieldlist = TREE_CHAIN (fieldlist);
5233: /* Delete all such members from the rest of the fieldlist */
5234: for (x = fieldlist; x;)
5235: {
5236: if (TREE_CHAIN (x) && DECL_INITIAL (TREE_CHAIN (x)))
5237: TREE_CHAIN (x) = TREE_CHAIN (TREE_CHAIN (x));
5238: else x = TREE_CHAIN (x);
5239: }
5240:
5241: /* Now we have the truly final field list.
5242: Store it in this type and in the variants. */
5243:
5244: TYPE_FIELDS (t) = fieldlist;
5245:
5246: /* If there are lots of fields, sort so we can look through them fast.
5247: We arbitrarily consider 16 or more elts to be "a lot". */
5248: {
5249: int len = 0;
5250:
5251: for (x = fieldlist; x; x = TREE_CHAIN (x))
5252: {
5253: if (len > 15)
5254: break;
5255: len += 1;
5256: }
5257: if (len > 15)
5258: {
5259: tree *field_array;
5260: char *space;
5261:
5262: len += list_length (x);
5263: /* Use the same allocation policy here that make_node uses, to
5264: ensure that this lives as long as the rest of the struct decl.
5265: All decls in an inline function need to be saved. */
5266: if (allocation_temporary_p ())
5267: space = savealloc (sizeof (struct lang_type) + len * sizeof (tree));
5268: else
5269: space = oballoc (sizeof (struct lang_type) + len * sizeof (tree));
5270:
5271: TYPE_LANG_SPECIFIC (t) = (struct lang_type *) space;
5272: TYPE_LANG_SPECIFIC (t)->len = len;
5273:
5274: field_array = &TYPE_LANG_SPECIFIC (t)->elts[0];
5275: len = 0;
5276: for (x = fieldlist; x; x = TREE_CHAIN (x))
5277: field_array[len++] = x;
5278:
5279: qsort (field_array, len, sizeof (tree), field_decl_cmp);
5280: }
5281: }
5282:
5283: for (x = TYPE_MAIN_VARIANT (t); x; x = TYPE_NEXT_VARIANT (x))
5284: {
5285: TYPE_FIELDS (x) = TYPE_FIELDS (t);
5286: TYPE_LANG_SPECIFIC (x) = TYPE_LANG_SPECIFIC (t);
5287: TYPE_ALIGN (x) = TYPE_ALIGN (t);
5288: }
5289:
5290: /* Promote each bit-field's type to int if it is narrower than that. */
5291: for (x = fieldlist; x; x = TREE_CHAIN (x))
5292: if (DECL_BIT_FIELD (x)
1.1.1.5 ! root 5293: && (C_PROMOTING_INTEGER_TYPE_P (TREE_TYPE (x))
! 5294: || DECL_FIELD_SIZE (x) < TYPE_PRECISION (integer_type_node)))
! 5295: {
! 5296: tree type = TREE_TYPE (x);
1.1.1.4 root 5297:
1.1.1.5 ! root 5298: /* Preserve unsignedness if traditional
! 5299: or if not really getting any wider. */
! 5300: if (TREE_UNSIGNED (type)
! 5301: && (flag_traditional
! 5302: ||
! 5303: (TYPE_PRECISION (type) == TYPE_PRECISION (integer_type_node)
! 5304: &&
! 5305: DECL_FIELD_SIZE (x) == TYPE_PRECISION (integer_type_node))))
! 5306: TREE_TYPE (x) = unsigned_type_node;
! 5307: else
! 5308: TREE_TYPE (x) = integer_type_node;
! 5309: }
1.1 root 5310:
5311: /* If this structure or union completes the type of any previous
5312: variable declaration, lay it out and output its rtl. */
5313:
5314: if (current_binding_level->n_incomplete != 0)
5315: {
5316: tree decl;
5317: for (decl = current_binding_level->names; decl; decl = TREE_CHAIN (decl))
5318: {
5319: if (TREE_TYPE (decl) == t
5320: && TREE_CODE (decl) != TYPE_DECL)
5321: {
5322: layout_decl (decl, 0);
5323: /* This is a no-op in c-lang.c or something real in objc-actions.c. */
5324: maybe_objc_check_decl (decl);
1.1.1.4 root 5325: rest_of_decl_compilation (decl, NULL_PTR, toplevel, 0);
1.1 root 5326: if (! toplevel)
5327: expand_decl (decl);
5328: --current_binding_level->n_incomplete;
5329: }
5330: else if (TYPE_SIZE (TREE_TYPE (decl)) == 0
5331: && TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
5332: {
5333: tree element = TREE_TYPE (decl);
5334: while (TREE_CODE (element) == ARRAY_TYPE)
5335: element = TREE_TYPE (element);
5336: if (element == t)
5337: layout_array_type (TREE_TYPE (decl));
5338: }
5339: }
5340: }
5341:
5342: resume_momentary (old_momentary);
5343:
5344: /* Finish debugging output for this type. */
5345: rest_of_type_compilation (t, toplevel);
5346:
1.1.1.4 root 5347: /* The matching push is in start_struct. */
5348: pop_obstacks ();
5349:
1.1 root 5350: return t;
5351: }
5352:
5353: /* Lay out the type T, and its element type, and so on. */
5354:
5355: static void
5356: layout_array_type (t)
5357: tree t;
5358: {
5359: if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
5360: layout_array_type (TREE_TYPE (t));
5361: layout_type (t);
5362: }
5363:
5364: /* Begin compiling the definition of an enumeration type.
5365: NAME is its name (or null if anonymous).
5366: Returns the type object, as yet incomplete.
5367: Also records info about it so that build_enumerator
5368: may be used to declare the individual values as they are read. */
5369:
5370: tree
5371: start_enum (name)
5372: tree name;
5373: {
5374: register tree enumtype = 0;
5375:
5376: /* If this is the real definition for a previous forward reference,
5377: fill in the contents in the same object that used to be the
5378: forward reference. */
5379:
5380: if (name != 0)
5381: enumtype = lookup_tag (ENUMERAL_TYPE, name, current_binding_level, 1);
5382:
1.1.1.4 root 5383: /* The corresponding pop_obstacks is in finish_enum. */
5384: push_obstacks_nochange ();
5385: /* If these symbols and types are global, make them permanent. */
5386: if (current_binding_level == global_binding_level)
5387: end_temporary_allocation ();
5388:
1.1 root 5389: if (enumtype == 0 || TREE_CODE (enumtype) != ENUMERAL_TYPE)
5390: {
5391: enumtype = make_node (ENUMERAL_TYPE);
5392: pushtag (name, enumtype);
5393: }
5394:
5395: C_TYPE_BEING_DEFINED (enumtype) = 1;
5396:
5397: if (TYPE_VALUES (enumtype) != 0)
5398: {
5399: /* This enum is a named one that has been declared already. */
5400: error ("redeclaration of `enum %s'", IDENTIFIER_POINTER (name));
5401:
5402: /* Completely replace its old definition.
5403: The old enumerators remain defined, however. */
5404: TYPE_VALUES (enumtype) = 0;
5405: }
5406:
5407: enum_next_value = integer_zero_node;
1.1.1.3 root 5408: enum_overflow = 0;
1.1 root 5409:
5410: return enumtype;
5411: }
5412:
5413: /* After processing and defining all the values of an enumeration type,
5414: install their decls in the enumeration type and finish it off.
5415: ENUMTYPE is the type object and VALUES a list of decl-value pairs.
5416: Returns ENUMTYPE. */
5417:
5418: tree
5419: finish_enum (enumtype, values)
5420: register tree enumtype, values;
5421: {
1.1.1.5 ! root 5422: register tree pair, tem;
1.1 root 5423: tree minnode = 0, maxnode = 0;
1.1.1.4 root 5424: register HOST_WIDE_INT maxvalue = 0;
5425: register HOST_WIDE_INT minvalue = 0;
1.1 root 5426: register int i;
5427: unsigned precision = 0;
5428: int toplevel = global_binding_level == current_binding_level;
1.1.1.4 root 5429: int temporary = allocation_temporary_p ();
1.1 root 5430:
5431: if (in_parm_level_p ())
5432: warning ("enum defined inside parms");
5433:
5434: /* Calculate the maximum value of any enumerator in this type. */
5435:
5436: for (pair = values; pair; pair = TREE_CHAIN (pair))
5437: {
5438: tree value = TREE_VALUE (pair);
5439: if (pair == values)
5440: minnode = maxnode = TREE_VALUE (pair);
5441: else
5442: {
5443: if (tree_int_cst_lt (maxnode, value))
5444: maxnode = value;
5445: if (tree_int_cst_lt (value, minnode))
5446: minnode = value;
5447: }
5448: }
5449:
5450: TYPE_MIN_VALUE (enumtype) = minnode;
5451: TYPE_MAX_VALUE (enumtype) = maxnode;
5452:
5453: /* Determine the precision this type needs. */
5454:
5455: if (TREE_INT_CST_HIGH (minnode) >= 0
5456: ? tree_int_cst_lt (TYPE_MAX_VALUE (unsigned_type_node), maxnode)
5457: : (tree_int_cst_lt (minnode, TYPE_MIN_VALUE (integer_type_node))
5458: || tree_int_cst_lt (TYPE_MAX_VALUE (integer_type_node), maxnode)))
5459: precision = TYPE_PRECISION (long_long_integer_type_node);
5460: else
5461: {
1.1.1.4 root 5462: maxvalue = TREE_INT_CST_LOW (maxnode);
5463: minvalue = TREE_INT_CST_LOW (minnode);
1.1 root 5464:
5465: if (maxvalue > 0)
5466: precision = floor_log2 (maxvalue) + 1;
5467: if (minvalue < 0)
5468: {
5469: /* Compute number of bits to represent magnitude of a negative value.
5470: Add one to MINVALUE since range of negative numbers
5471: includes the power of two. */
5472: unsigned negprecision = floor_log2 (-minvalue - 1) + 1;
5473: if (negprecision > precision)
5474: precision = negprecision;
5475: precision += 1; /* room for sign bit */
5476: }
5477:
5478: if (!precision)
5479: precision = 1;
5480: }
5481:
5482: if (flag_short_enums || precision > TYPE_PRECISION (integer_type_node))
5483: /* Use the width of the narrowest normal C type which is wide enough. */
5484: TYPE_PRECISION (enumtype) = TYPE_PRECISION (type_for_size (precision, 1));
5485: else
5486: TYPE_PRECISION (enumtype) = TYPE_PRECISION (integer_type_node);
5487:
5488: TYPE_SIZE (enumtype) = 0;
5489: layout_type (enumtype);
5490:
5491: /* An enum can have some negative values; then it is signed. */
5492: TREE_UNSIGNED (enumtype) = ! tree_int_cst_lt (minnode, integer_zero_node);
5493:
5494: /* If the enumerators might not fit in an int, change their type now. */
5495: /* It seems more useful in the debugger to leave these as int
5496: unless the enumerator is wider than int. */
5497: if (TYPE_PRECISION (enumtype) <= TYPE_PRECISION (integer_type_node))
5498: for (pair = values; pair; pair = TREE_CHAIN (pair))
5499: {
5500: TREE_TYPE (TREE_PURPOSE (pair)) = enumtype;
5501: DECL_SIZE (TREE_PURPOSE (pair)) = TYPE_SIZE (enumtype);
1.1.1.3 root 5502: if (TREE_CODE (TREE_PURPOSE (pair)) != FUNCTION_DECL)
5503: DECL_ALIGN (TREE_PURPOSE (pair)) = TYPE_ALIGN (enumtype);
1.1 root 5504: }
5505:
5506: /* Replace the decl nodes in VALUES with their names. */
5507: for (pair = values; pair; pair = TREE_CHAIN (pair))
5508: TREE_PURPOSE (pair) = DECL_NAME (TREE_PURPOSE (pair));
5509:
5510: TYPE_VALUES (enumtype) = values;
5511:
1.1.1.5 ! root 5512: /* Fix up all variant types of this enum type. */
! 5513: for (tem = TYPE_MAIN_VARIANT (enumtype); tem; tem = TYPE_NEXT_VARIANT (tem))
! 5514: {
! 5515: TYPE_VALUES (tem) = TYPE_VALUES (enumtype);
! 5516: TYPE_MIN_VALUE (tem) = TYPE_MIN_VALUE (enumtype);
! 5517: TYPE_MAX_VALUE (tem) = TYPE_MAX_VALUE (enumtype);
! 5518: TYPE_SIZE (tem) = TYPE_SIZE (enumtype);
! 5519: TYPE_MODE (tem) = TYPE_MODE (enumtype);
! 5520: TYPE_PRECISION (tem) = TYPE_PRECISION (enumtype);
! 5521: TYPE_ALIGN (tem) = TYPE_ALIGN (enumtype);
! 5522: TREE_UNSIGNED (tem) = TREE_UNSIGNED (enumtype);
! 5523: }
! 5524:
1.1 root 5525: /* Finish debugging output for this type. */
5526: rest_of_type_compilation (enumtype, toplevel);
5527:
1.1.1.4 root 5528: /* This matches a push in start_enum. */
5529: pop_obstacks ();
5530:
1.1 root 5531: return enumtype;
5532: }
5533:
5534: /* Build and install a CONST_DECL for one value of the
5535: current enumeration type (one that was begun with start_enum).
5536: Return a tree-list containing the CONST_DECL and its value.
5537: Assignment of sequential values by default is handled here. */
5538:
5539: tree
5540: build_enumerator (name, value)
5541: tree name, value;
5542: {
5543: register tree decl;
5544:
5545: /* Validate and default VALUE. */
5546:
5547: /* Remove no-op casts from the value. */
1.1.1.4 root 5548: if (value)
5549: STRIP_TYPE_NOPS (value);
1.1 root 5550:
1.1.1.5 ! root 5551: if (value != 0)
1.1 root 5552: {
1.1.1.5 ! root 5553: if (TREE_CODE (value) == INTEGER_CST)
! 5554: constant_expression_warning (value);
! 5555: else
! 5556: {
! 5557: error ("enumerator value for `%s' not integer constant",
! 5558: IDENTIFIER_POINTER (name));
! 5559: value = 0;
! 5560: }
1.1 root 5561: }
5562:
5563: /* Default based on previous value. */
5564: /* It should no longer be possible to have NON_LVALUE_EXPR
5565: in the default. */
5566: if (value == 0)
1.1.1.3 root 5567: {
5568: value = enum_next_value;
5569: if (enum_overflow)
5570: error ("overflow in enumeration values");
5571: }
1.1 root 5572:
5573: if (pedantic && ! int_fits_type_p (value, integer_type_node))
5574: {
5575: pedwarn ("ANSI C restricts enumerator values to range of `int'");
5576: value = integer_zero_node;
5577: }
5578:
5579: /* Set basis for default for next value. */
5580: enum_next_value = build_binary_op (PLUS_EXPR, value, integer_one_node, 0);
1.1.1.3 root 5581: enum_overflow = tree_int_cst_lt (enum_next_value, value);
1.1 root 5582:
5583: /* Now create a declaration for the enum value name. */
5584:
5585: decl = build_decl (CONST_DECL, name, integer_type_node);
5586: DECL_INITIAL (decl) = value;
5587: TREE_TYPE (value) = integer_type_node;
5588: pushdecl (decl);
5589:
1.1.1.4 root 5590: return saveable_tree_cons (decl, value, NULL_TREE);
1.1 root 5591: }
5592:
5593: /* Create the FUNCTION_DECL for a function definition.
5594: DECLSPECS and DECLARATOR are the parts of the declaration;
5595: they describe the function's name and the type it returns,
5596: but twisted together in a fashion that parallels the syntax of C.
5597:
5598: This function creates a binding context for the function body
5599: as well as setting up the FUNCTION_DECL in current_function_decl.
5600:
5601: Returns 1 on success. If the DECLARATOR is not suitable for a function
5602: (it defines a datum instead), we return 0, which tells
5603: yyparse to report a parse error.
5604:
5605: NESTED is nonzero for a function nested within another function. */
5606:
5607: int
5608: start_function (declspecs, declarator, nested)
5609: tree declarator, declspecs;
5610: int nested;
5611: {
5612: tree decl1, old_decl;
5613: tree restype;
5614:
5615: current_function_returns_value = 0; /* Assume, until we see it does. */
5616: current_function_returns_null = 0;
5617: warn_about_return_type = 0;
5618: current_extern_inline = 0;
5619: c_function_varargs = 0;
5620: named_labels = 0;
5621: shadowed_labels = 0;
5622:
5623: decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1);
5624:
5625: /* If the declarator is not suitable for a function definition,
5626: cause a syntax error. */
5627: if (decl1 == 0)
5628: return 0;
5629:
5630: announce_function (decl1);
5631:
5632: if (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl1))) == 0)
5633: {
5634: error ("return-type is an incomplete type");
5635: /* Make it return void instead. */
5636: TREE_TYPE (decl1)
5637: = build_function_type (void_type_node,
5638: TYPE_ARG_TYPES (TREE_TYPE (decl1)));
5639: }
5640:
5641: if (warn_about_return_type)
5642: warning ("return-type defaults to `int'");
5643:
5644: /* Save the parm names or decls from this function's declarator
5645: where store_parm_decls will find them. */
5646: current_function_parms = last_function_parms;
5647: current_function_parm_tags = last_function_parm_tags;
5648:
5649: /* Make the init_value nonzero so pushdecl knows this is not tentative.
5650: error_mark_node is replaced below (in poplevel) with the BLOCK. */
5651: DECL_INITIAL (decl1) = error_mark_node;
5652:
5653: /* If this definition isn't a prototype and we had a prototype declaration
5654: before, copy the arg type info from that prototype.
5655: But not if what we had before was a builtin function. */
5656: old_decl = lookup_name_current_level (DECL_NAME (decl1));
5657: if (old_decl != 0 && TREE_CODE (TREE_TYPE (old_decl)) == FUNCTION_TYPE
5658: && !DECL_BUILT_IN (old_decl)
1.1.1.4 root 5659: && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (decl1)))
5660: == TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (old_decl))))
1.1 root 5661: && TYPE_ARG_TYPES (TREE_TYPE (decl1)) == 0)
1.1.1.5 ! root 5662: {
! 5663: TREE_TYPE (decl1) = TREE_TYPE (old_decl);
! 5664: current_function_prototype_file = DECL_SOURCE_FILE (old_decl);
! 5665: current_function_prototype_line = DECL_SOURCE_LINE (old_decl);
! 5666: }
1.1 root 5667:
5668: /* Optionally warn of old-fashioned def with no previous prototype. */
5669: if (warn_strict_prototypes
5670: && TYPE_ARG_TYPES (TREE_TYPE (decl1)) == 0
5671: && !(old_decl != 0 && TYPE_ARG_TYPES (TREE_TYPE (old_decl)) != 0))
5672: warning ("function declaration isn't a prototype");
5673: /* Optionally warn of any global def with no previous prototype. */
5674: else if (warn_missing_prototypes
5675: && TREE_PUBLIC (decl1)
1.1.1.5 ! root 5676: && !(old_decl != 0 && TYPE_ARG_TYPES (TREE_TYPE (old_decl)) != 0)
! 5677: && strcmp ("main", IDENTIFIER_POINTER (DECL_NAME (decl1))))
1.1 root 5678: warning_with_decl (decl1, "no previous prototype for `%s'");
5679: /* Optionally warn of any def with no previous prototype
5680: if the function has already been used. */
5681: else if (warn_missing_prototypes
5682: && old_decl != 0 && TREE_USED (old_decl)
5683: && !(old_decl != 0 && TYPE_ARG_TYPES (TREE_TYPE (old_decl)) != 0))
5684: warning_with_decl (decl1, "`%s' was used with no prototype before its definition");
5685:
5686: /* This is a definition, not a reference.
1.1.1.4 root 5687: So normally clear DECL_EXTERNAL.
1.1 root 5688: However, `extern inline' acts like a declaration
1.1.1.4 root 5689: except for defining how to inline. So set DECL_EXTERNAL in that case. */
5690: DECL_EXTERNAL (decl1) = current_extern_inline;
1.1 root 5691:
5692: /* This function exists in static storage.
5693: (This does not mean `static' in the C sense!) */
5694: TREE_STATIC (decl1) = 1;
5695:
5696: /* A nested function is not global. */
5697: if (current_function_decl != 0)
5698: TREE_PUBLIC (decl1) = 0;
5699:
5700: /* Record the decl so that the function name is defined.
5701: If we already have a decl for this name, and it is a FUNCTION_DECL,
5702: use the old decl. */
5703:
5704: current_function_decl = pushdecl (decl1);
5705:
5706: pushlevel (0);
5707: declare_parm_level (1);
5708: current_binding_level->subblocks_tag_transparent = 1;
5709:
5710: make_function_rtl (current_function_decl);
5711:
5712: restype = TREE_TYPE (TREE_TYPE (current_function_decl));
5713: /* Promote the value to int before returning it. */
1.1.1.4 root 5714: if (C_PROMOTING_INTEGER_TYPE_P (restype))
5715: {
5716: /* It retains unsignedness if traditional
5717: or if not really getting wider. */
5718: if (TREE_UNSIGNED (restype)
5719: && (flag_traditional
5720: || (TYPE_PRECISION (restype)
5721: == TYPE_PRECISION (integer_type_node))))
5722: restype = unsigned_type_node;
5723: else
5724: restype = integer_type_node;
5725: }
5726: DECL_RESULT (current_function_decl)
5727: = build_decl (RESULT_DECL, NULL_TREE, restype);
1.1 root 5728:
5729: if (!nested)
5730: /* Allocate further tree nodes temporarily during compilation
5731: of this function only. */
5732: temporary_allocation ();
5733:
5734: /* If this fcn was already referenced via a block-scope `extern' decl
5735: (or an implicit decl), propagate certain information about the usage. */
5736: if (TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (current_function_decl)))
5737: TREE_ADDRESSABLE (current_function_decl) = 1;
5738:
5739: return 1;
5740: }
5741:
5742: /* Record that this function is going to be a varargs function.
5743: This is called before store_parm_decls, which is too early
5744: to call mark_varargs directly. */
5745:
5746: void
5747: c_mark_varargs ()
5748: {
5749: c_function_varargs = 1;
5750: }
5751:
5752: /* Store the parameter declarations into the current function declaration.
5753: This is called after parsing the parameter declarations, before
5754: digesting the body of the function.
5755:
5756: For an old-style definition, modify the function's type
5757: to specify at least the number of arguments. */
5758:
5759: void
5760: store_parm_decls ()
5761: {
5762: register tree fndecl = current_function_decl;
5763: register tree parm;
5764:
5765: /* This is either a chain of PARM_DECLs (if a prototype was used)
5766: or a list of IDENTIFIER_NODEs (for an old-fashioned C definition). */
5767: tree specparms = current_function_parms;
5768:
5769: /* This is a list of types declared among parms in a prototype. */
5770: tree parmtags = current_function_parm_tags;
5771:
5772: /* This is a chain of PARM_DECLs from old-style parm declarations. */
5773: register tree parmdecls = getdecls ();
5774:
5775: /* This is a chain of any other decls that came in among the parm
5776: declarations. If a parm is declared with enum {foo, bar} x;
5777: then CONST_DECLs for foo and bar are put here. */
5778: tree nonparms = 0;
5779:
5780: /* Nonzero if this definition is written with a prototype. */
5781: int prototype = 0;
5782:
5783: if (specparms != 0 && TREE_CODE (specparms) != TREE_LIST)
5784: {
5785: /* This case is when the function was defined with an ANSI prototype.
5786: The parms already have decls, so we need not do anything here
5787: except record them as in effect
5788: and complain if any redundant old-style parm decls were written. */
5789:
5790: register tree next;
5791: tree others = 0;
5792:
5793: prototype = 1;
5794:
5795: if (parmdecls != 0)
1.1.1.4 root 5796: {
5797: tree decl, link;
5798:
5799: error_with_decl (fndecl,
5800: "parm types given both in parmlist and separately");
5801: /* Get rid of the erroneous decls; don't keep them on
5802: the list of parms, since they might not be PARM_DECLs. */
5803: for (decl = current_binding_level->names;
5804: decl; decl = TREE_CHAIN (decl))
5805: if (DECL_NAME (decl))
5806: IDENTIFIER_LOCAL_VALUE (DECL_NAME (decl)) = 0;
5807: for (link = current_binding_level->shadowed;
5808: link; link = TREE_CHAIN (link))
5809: IDENTIFIER_LOCAL_VALUE (TREE_PURPOSE (link)) = TREE_VALUE (link);
5810: current_binding_level->names = 0;
5811: current_binding_level->shadowed = 0;
5812: }
1.1 root 5813:
5814: specparms = nreverse (specparms);
5815: for (parm = specparms; parm; parm = next)
5816: {
5817: next = TREE_CHAIN (parm);
5818: if (TREE_CODE (parm) == PARM_DECL)
5819: {
5820: if (DECL_NAME (parm) == 0)
5821: error_with_decl (parm, "parameter name omitted");
1.1.1.4 root 5822: else if (TYPE_MAIN_VARIANT (TREE_TYPE (parm)) == void_type_node)
5823: {
5824: error_with_decl (parm, "parameter `%s' declared void");
5825: /* Change the type to error_mark_node so this parameter
5826: will be ignored by assign_parms. */
5827: TREE_TYPE (parm) = error_mark_node;
5828: }
1.1 root 5829: pushdecl (parm);
5830: }
5831: else
5832: {
5833: /* If we find an enum constant or a type tag,
5834: put it aside for the moment. */
5835: TREE_CHAIN (parm) = 0;
5836: others = chainon (others, parm);
5837: }
5838: }
5839:
5840: /* Get the decls in their original chain order
5841: and record in the function. */
5842: DECL_ARGUMENTS (fndecl) = getdecls ();
5843:
5844: #if 0
5845: /* If this function takes a variable number of arguments,
5846: add a phony parameter to the end of the parm list,
5847: to represent the position of the first unnamed argument. */
5848: if (TREE_VALUE (tree_last (TYPE_ARG_TYPES (TREE_TYPE (fndecl))))
5849: != void_type_node)
5850: {
5851: tree dummy = build_decl (PARM_DECL, NULL_TREE, void_type_node);
5852: /* Let's hope the address of the unnamed parm
5853: won't depend on its type. */
5854: TREE_TYPE (dummy) = integer_type_node;
5855: DECL_ARG_TYPE (dummy) = integer_type_node;
5856: DECL_ARGUMENTS (fndecl)
5857: = chainon (DECL_ARGUMENTS (fndecl), dummy);
5858: }
5859: #endif
5860:
5861: /* Now pushdecl the enum constants. */
5862: for (parm = others; parm; parm = next)
5863: {
5864: next = TREE_CHAIN (parm);
5865: if (DECL_NAME (parm) == 0)
5866: ;
1.1.1.4 root 5867: else if (TYPE_MAIN_VARIANT (TREE_TYPE (parm)) == void_type_node)
1.1 root 5868: ;
5869: else if (TREE_CODE (parm) != PARM_DECL)
5870: pushdecl (parm);
5871: }
5872:
5873: storetags (chainon (parmtags, gettags ()));
5874: }
5875: else
5876: {
5877: /* SPECPARMS is an identifier list--a chain of TREE_LIST nodes
5878: each with a parm name as the TREE_VALUE.
5879:
5880: PARMDECLS is a chain of declarations for parameters.
5881: Warning! It can also contain CONST_DECLs which are not parameters
5882: but are names of enumerators of any enum types
5883: declared among the parameters.
5884:
5885: First match each formal parameter name with its declaration.
5886: Associate decls with the names and store the decls
5887: into the TREE_PURPOSE slots. */
5888:
5889: for (parm = parmdecls; parm; parm = TREE_CHAIN (parm))
5890: DECL_RESULT (parm) = 0;
5891:
5892: for (parm = specparms; parm; parm = TREE_CHAIN (parm))
5893: {
5894: register tree tail, found = NULL;
5895:
5896: if (TREE_VALUE (parm) == 0)
5897: {
5898: error_with_decl (fndecl, "parameter name missing from parameter list");
5899: TREE_PURPOSE (parm) = 0;
5900: continue;
5901: }
5902:
5903: /* See if any of the parmdecls specifies this parm by name.
5904: Ignore any enumerator decls. */
5905: for (tail = parmdecls; tail; tail = TREE_CHAIN (tail))
5906: if (DECL_NAME (tail) == TREE_VALUE (parm)
5907: && TREE_CODE (tail) == PARM_DECL)
5908: {
5909: found = tail;
5910: break;
5911: }
5912:
5913: /* If declaration already marked, we have a duplicate name.
5914: Complain, and don't use this decl twice. */
5915: if (found && DECL_RESULT (found) != 0)
5916: {
5917: error_with_decl (found, "multiple parameters named `%s'");
5918: found = 0;
5919: }
5920:
5921: /* If the declaration says "void", complain and ignore it. */
1.1.1.4 root 5922: if (found && TYPE_MAIN_VARIANT (TREE_TYPE (found)) == void_type_node)
1.1 root 5923: {
5924: error_with_decl (found, "parameter `%s' declared void");
5925: TREE_TYPE (found) = integer_type_node;
5926: DECL_ARG_TYPE (found) = integer_type_node;
5927: layout_decl (found, 0);
5928: }
5929:
5930: /* Traditionally, a parm declared float is actually a double. */
5931: if (found && flag_traditional
1.1.1.4 root 5932: && TYPE_MAIN_VARIANT (TREE_TYPE (found)) == float_type_node)
1.1.1.5 ! root 5933: {
! 5934: TREE_TYPE (found) = double_type_node;
! 5935: DECL_ARG_TYPE (found) = double_type_node;
! 5936: layout_decl (found, 0);
! 5937: }
1.1 root 5938:
5939: /* If no declaration found, default to int. */
5940: if (!found)
5941: {
5942: found = build_decl (PARM_DECL, TREE_VALUE (parm),
5943: integer_type_node);
5944: DECL_ARG_TYPE (found) = TREE_TYPE (found);
5945: DECL_SOURCE_LINE (found) = DECL_SOURCE_LINE (fndecl);
5946: DECL_SOURCE_FILE (found) = DECL_SOURCE_FILE (fndecl);
5947: if (extra_warnings)
5948: warning_with_decl (found, "type of `%s' defaults to `int'");
5949: pushdecl (found);
5950: }
5951:
5952: TREE_PURPOSE (parm) = found;
5953:
5954: /* Mark this decl as "already found" -- see test, above.
5955: It is safe to use DECL_RESULT for this
5956: since it is not used in PARM_DECLs or CONST_DECLs. */
5957: DECL_RESULT (found) = error_mark_node;
5958: }
5959:
5960: /* Put anything which is on the parmdecls chain and which is
5961: not a PARM_DECL onto the list NONPARMS. (The types of
5962: non-parm things which might appear on the list include
5963: enumerators and NULL-named TYPE_DECL nodes.) Complain about
5964: any actual PARM_DECLs not matched with any names. */
5965:
5966: nonparms = 0;
5967: for (parm = parmdecls; parm; )
5968: {
5969: tree next = TREE_CHAIN (parm);
5970: TREE_CHAIN (parm) = 0;
5971:
5972: if (TREE_CODE (parm) != PARM_DECL)
5973: nonparms = chainon (nonparms, parm);
5974: else
5975: {
5976: /* Complain about args with incomplete types. */
5977: if (TYPE_SIZE (TREE_TYPE (parm)) == 0)
5978: {
5979: error_with_decl (parm, "parameter `%s' has incomplete type");
5980: TREE_TYPE (parm) = error_mark_node;
5981: }
5982:
5983: if (DECL_RESULT (parm) == 0)
5984: {
5985: error_with_decl (parm,
5986: "declaration for parameter `%s' but no such parameter");
5987: /* Pretend the parameter was not missing.
5988: This gets us to a standard state and minimizes
5989: further error messages. */
5990: specparms
5991: = chainon (specparms,
5992: tree_cons (parm, NULL_TREE, NULL_TREE));
5993: }
5994: }
5995:
5996: parm = next;
5997: }
5998:
5999: /* Chain the declarations together in the order of the list of names. */
6000: /* Store that chain in the function decl, replacing the list of names. */
6001: parm = specparms;
6002: DECL_ARGUMENTS (fndecl) = 0;
6003: {
6004: register tree last;
6005: for (last = 0; parm; parm = TREE_CHAIN (parm))
6006: if (TREE_PURPOSE (parm))
6007: {
6008: if (last == 0)
6009: DECL_ARGUMENTS (fndecl) = TREE_PURPOSE (parm);
6010: else
6011: TREE_CHAIN (last) = TREE_PURPOSE (parm);
6012: last = TREE_PURPOSE (parm);
6013: TREE_CHAIN (last) = 0;
6014: }
6015: }
6016:
6017: /* If there was a previous prototype,
6018: set the DECL_ARG_TYPE of each argument according to
6019: the type previously specified, and report any mismatches. */
6020:
6021: if (TYPE_ARG_TYPES (TREE_TYPE (fndecl)))
6022: {
6023: register tree type;
6024: for (parm = DECL_ARGUMENTS (fndecl),
6025: type = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
1.1.1.4 root 6026: parm || (type && (TYPE_MAIN_VARIANT (TREE_VALUE (type))
6027: != void_type_node));
1.1 root 6028: parm = TREE_CHAIN (parm), type = TREE_CHAIN (type))
6029: {
6030: if (parm == 0 || type == 0
1.1.1.4 root 6031: || TYPE_MAIN_VARIANT (TREE_VALUE (type)) == void_type_node)
1.1 root 6032: {
6033: error ("number of arguments doesn't match prototype");
1.1.1.5 ! root 6034: error_with_file_and_line (current_function_prototype_file,
! 6035: current_function_prototype_line,
! 6036: "prototype declaration");
1.1 root 6037: break;
6038: }
6039: /* Type for passing arg must be consistent
6040: with that declared for the arg. */
1.1.1.3 root 6041: if (! comptypes (DECL_ARG_TYPE (parm), TREE_VALUE (type)))
1.1 root 6042: {
1.1.1.4 root 6043: if (TYPE_MAIN_VARIANT (TREE_TYPE (parm))
6044: == TYPE_MAIN_VARIANT (TREE_VALUE (type)))
1.1 root 6045: {
1.1.1.3 root 6046: /* Adjust argument to match prototype. E.g. a previous
6047: `int foo(float);' prototype causes
6048: `int foo(x) float x; {...}' to be treated like
6049: `int foo(float x) {...}'. This is particularly
6050: useful for argument types like uid_t. */
6051: DECL_ARG_TYPE (parm) = TREE_TYPE (parm);
6052: #ifdef PROMOTE_PROTOTYPES
6053: if (TREE_CODE (TREE_TYPE (parm)) == INTEGER_TYPE
6054: && TYPE_PRECISION (TREE_TYPE (parm))
6055: < TYPE_PRECISION (integer_type_node))
6056: DECL_ARG_TYPE (parm) = integer_type_node;
6057: #endif
6058: if (pedantic)
1.1.1.5 ! root 6059: {
! 6060: pedwarn ("promoted argument `%s' doesn't match prototype",
! 6061: IDENTIFIER_POINTER (DECL_NAME (parm)));
! 6062: warning_with_file_and_line
! 6063: (current_function_prototype_file,
! 6064: current_function_prototype_line,
! 6065: "prototype declaration");
! 6066: }
1.1 root 6067: }
1.1.1.3 root 6068: /* If -traditional, allow `int' argument to match
6069: `unsigned' prototype. */
6070: else if (! (flag_traditional
1.1.1.4 root 6071: && TYPE_MAIN_VARIANT (TREE_TYPE (parm)) == integer_type_node
6072: && TYPE_MAIN_VARIANT (TREE_VALUE (type)) == unsigned_type_node))
1.1.1.5 ! root 6073: {
! 6074: error ("argument `%s' doesn't match prototype",
! 6075: IDENTIFIER_POINTER (DECL_NAME (parm)));
! 6076: error_with_file_and_line (current_function_prototype_file,
! 6077: current_function_prototype_line,
! 6078: "prototype declaration");
! 6079: }
1.1 root 6080: }
6081: }
6082: TYPE_ACTUAL_ARG_TYPES (TREE_TYPE (fndecl)) = 0;
6083: }
6084:
6085: /* Otherwise, create a prototype that would match. */
6086:
6087: else
6088: {
6089: register tree actual, type;
6090: register tree last = 0;
6091:
6092: for (parm = DECL_ARGUMENTS (fndecl); parm; parm = TREE_CHAIN (parm))
6093: {
1.1.1.4 root 6094: type = perm_tree_cons (NULL_TREE, DECL_ARG_TYPE (parm),
6095: NULL_TREE);
1.1 root 6096: if (last)
6097: TREE_CHAIN (last) = type;
6098: else
6099: actual = type;
6100: last = type;
6101: }
1.1.1.4 root 6102: type = perm_tree_cons (NULL_TREE, void_type_node, NULL_TREE);
1.1 root 6103: if (last)
6104: TREE_CHAIN (last) = type;
6105: else
6106: actual = type;
6107:
1.1.1.2 root 6108: /* We are going to assign a new value for the TYPE_ACTUAL_ARG_TYPES
6109: of the type of this function, but we need to avoid having this
6110: affect the types of other similarly-typed functions, so we must
6111: first force the generation of an identical (but separate) type
6112: node for the relevant function type. The new node we create
6113: will be a variant of the main variant of the original function
6114: type. */
6115:
6116: TREE_TYPE (fndecl) = build_type_copy (TREE_TYPE (fndecl));
6117:
1.1 root 6118: TYPE_ACTUAL_ARG_TYPES (TREE_TYPE (fndecl)) = actual;
6119: }
6120:
6121: /* Now store the final chain of decls for the arguments
6122: as the decl-chain of the current lexical scope.
6123: Put the enumerators in as well, at the front so that
6124: DECL_ARGUMENTS is not modified. */
6125:
6126: storedecls (chainon (nonparms, DECL_ARGUMENTS (fndecl)));
6127: }
6128:
6129: /* Make sure the binding level for the top of the function body
6130: gets a BLOCK if there are any in the function.
6131: Otherwise, the dbx output is wrong. */
6132:
6133: keep_next_if_subblocks = 1;
6134:
6135: /* ??? This might be an improvement,
6136: but needs to be thought about some more. */
6137: #if 0
6138: keep_next_level_flag = 1;
6139: #endif
6140:
6141: /* Write a record describing this function definition to the prototypes
6142: file (if requested). */
6143:
6144: gen_aux_info_record (fndecl, 1, 0, prototype);
6145:
6146: /* Initialize the RTL code for the function. */
6147:
6148: init_function_start (fndecl, input_filename, lineno);
6149:
6150: /* If this is a varargs function, inform function.c. */
6151:
6152: if (c_function_varargs)
6153: mark_varargs ();
6154:
1.1.1.3 root 6155: /* Declare __FUNCTION__ and __PRETTY_FUNCTION__ for this function. */
6156:
6157: declare_function_name ();
6158:
1.1 root 6159: /* Set up parameters and prepare for return, for the function. */
6160:
6161: expand_function_start (fndecl, 0);
6162:
6163: /* If this function is `main', emit a call to `__main'
6164: to run global initializers, etc. */
6165: if (DECL_NAME (fndecl)
6166: && strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "main") == 0
6167: && DECL_CONTEXT (fndecl) == NULL_TREE)
6168: expand_main_function ();
6169: }
6170:
6171: /* SPECPARMS is an identifier list--a chain of TREE_LIST nodes
6172: each with a parm name as the TREE_VALUE. A null pointer as TREE_VALUE
6173: stands for an ellipsis in the identifier list.
6174:
6175: PARMLIST is the data returned by get_parm_info for the
6176: parmlist that follows the semicolon.
6177:
6178: We return a value of the same sort that get_parm_info returns,
6179: except that it describes the combination of identifiers and parmlist. */
6180:
6181: tree
6182: combine_parm_decls (specparms, parmlist, void_at_end)
6183: tree specparms, parmlist;
6184: int void_at_end;
6185: {
6186: register tree fndecl = current_function_decl;
6187: register tree parm;
6188:
6189: tree parmdecls = TREE_PURPOSE (parmlist);
6190:
6191: /* This is a chain of any other decls that came in among the parm
6192: declarations. They were separated already by get_parm_info,
6193: so we just need to keep them separate. */
6194: tree nonparms = TREE_VALUE (parmlist);
6195:
6196: tree types = 0;
6197:
6198: for (parm = parmdecls; parm; parm = TREE_CHAIN (parm))
6199: DECL_RESULT (parm) = 0;
6200:
6201: for (parm = specparms; parm; parm = TREE_CHAIN (parm))
6202: {
6203: register tree tail, found = NULL;
6204:
6205: /* See if any of the parmdecls specifies this parm by name. */
6206: for (tail = parmdecls; tail; tail = TREE_CHAIN (tail))
6207: if (DECL_NAME (tail) == TREE_VALUE (parm))
6208: {
6209: found = tail;
6210: break;
6211: }
6212:
6213: /* If declaration already marked, we have a duplicate name.
6214: Complain, and don't use this decl twice. */
6215: if (found && DECL_RESULT (found) != 0)
6216: {
6217: error_with_decl (found, "multiple parameters named `%s'");
6218: found = 0;
6219: }
6220:
6221: /* If the declaration says "void", complain and ignore it. */
1.1.1.4 root 6222: if (found && TYPE_MAIN_VARIANT (TREE_TYPE (found)) == void_type_node)
1.1 root 6223: {
6224: error_with_decl (found, "parameter `%s' declared void");
6225: TREE_TYPE (found) = integer_type_node;
6226: DECL_ARG_TYPE (found) = integer_type_node;
6227: layout_decl (found, 0);
6228: }
6229:
6230: /* Traditionally, a parm declared float is actually a double. */
6231: if (found && flag_traditional
1.1.1.4 root 6232: && TYPE_MAIN_VARIANT (TREE_TYPE (found)) == float_type_node)
1.1.1.5 ! root 6233: {
! 6234: TREE_TYPE (found) = double_type_node;
! 6235: DECL_ARG_TYPE (found) = double_type_node;
! 6236: layout_decl (found, 0);
! 6237: }
1.1 root 6238:
6239: /* If no declaration found, default to int. */
6240: if (!found)
6241: {
6242: found = build_decl (PARM_DECL, TREE_VALUE (parm),
6243: integer_type_node);
6244: DECL_ARG_TYPE (found) = TREE_TYPE (found);
6245: DECL_SOURCE_LINE (found) = DECL_SOURCE_LINE (fndecl);
6246: DECL_SOURCE_FILE (found) = DECL_SOURCE_FILE (fndecl);
1.1.1.5 ! root 6247: error_with_decl (found, "type of parameter `%s' is not declared");
1.1 root 6248: pushdecl (found);
6249: }
6250:
6251: TREE_PURPOSE (parm) = found;
6252:
6253: /* Mark this decl as "already found" -- see test, above.
6254: It is safe to use DECL_RESULT for this
6255: since it is not used in PARM_DECLs or CONST_DECLs. */
6256: DECL_RESULT (found) = error_mark_node;
6257: }
6258:
6259: /* Complain about any actual PARM_DECLs not matched with any names. */
6260:
6261: for (parm = parmdecls; parm; )
6262: {
6263: tree next = TREE_CHAIN (parm);
6264: TREE_CHAIN (parm) = 0;
6265:
6266: /* Complain about args with incomplete types. */
6267: if (TYPE_SIZE (TREE_TYPE (parm)) == 0)
6268: {
6269: error_with_decl (parm, "parameter `%s' has incomplete type");
6270: TREE_TYPE (parm) = error_mark_node;
6271: }
6272:
6273: if (DECL_RESULT (parm) == 0)
6274: {
6275: error_with_decl (parm,
6276: "declaration for parameter `%s' but no such parameter");
6277: /* Pretend the parameter was not missing.
6278: This gets us to a standard state and minimizes
6279: further error messages. */
6280: specparms
6281: = chainon (specparms,
6282: tree_cons (parm, NULL_TREE, NULL_TREE));
6283: }
6284:
6285: parm = next;
6286: }
6287:
6288: /* Chain the declarations together in the order of the list of names.
6289: At the same time, build up a list of their types, in reverse order. */
6290:
6291: parm = specparms;
6292: parmdecls = 0;
6293: {
6294: register tree last;
6295: for (last = 0; parm; parm = TREE_CHAIN (parm))
6296: if (TREE_PURPOSE (parm))
6297: {
6298: if (last == 0)
6299: parmdecls = TREE_PURPOSE (parm);
6300: else
6301: TREE_CHAIN (last) = TREE_PURPOSE (parm);
6302: last = TREE_PURPOSE (parm);
6303: TREE_CHAIN (last) = 0;
6304:
6305: types = saveable_tree_cons (NULL_TREE, TREE_TYPE (parm), types);
6306: }
6307: }
6308:
6309: if (void_at_end)
6310: return saveable_tree_cons (parmdecls, nonparms,
6311: nreverse (saveable_tree_cons (NULL_TREE, void_type_node, types)));
6312:
6313: return saveable_tree_cons (parmdecls, nonparms, nreverse (types));
6314: }
6315:
6316: /* Finish up a function declaration and compile that function
6317: all the way to assembler language output. The free the storage
6318: for the function definition.
6319:
6320: This is called after parsing the body of the function definition.
6321:
6322: NESTED is nonzero if the function being finished is nested in another. */
6323:
6324: void
6325: finish_function (nested)
6326: int nested;
6327: {
6328: register tree fndecl = current_function_decl;
6329:
6330: /* TREE_READONLY (fndecl) = 1;
6331: This caused &foo to be of type ptr-to-const-function
6332: which then got a warning when stored in a ptr-to-function variable. */
6333:
6334: poplevel (1, 0, 1);
1.1.1.4 root 6335: BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
1.1 root 6336:
6337: /* Must mark the RESULT_DECL as being in this function. */
6338:
6339: DECL_CONTEXT (DECL_RESULT (fndecl)) = fndecl;
6340:
6341: /* Obey `register' declarations if `setjmp' is called in this fn. */
6342: if (flag_traditional && current_function_calls_setjmp)
6343: {
6344: setjmp_protect (DECL_INITIAL (fndecl));
6345: setjmp_protect_args ();
6346: }
6347:
6348: #ifdef DEFAULT_MAIN_RETURN
6349: if (! strcmp (IDENTIFIER_POINTER (DECL_NAME (fndecl)), "main"))
6350: {
1.1.1.4 root 6351: if (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (fndecl)))
6352: != integer_type_node)
6353: warning_with_decl (fndecl, "return type of `%s' is not `int'");
6354: else
6355: {
6356: /* Make it so that `main' always returns success by default. */
6357: DEFAULT_MAIN_RETURN;
6358: }
1.1 root 6359: }
6360: #endif
6361:
6362: /* Generate rtl for function exit. */
6363: expand_function_end (input_filename, lineno);
6364:
6365: /* So we can tell if jump_optimize sets it to 1. */
6366: can_reach_end = 0;
6367:
6368: /* Run the optimizers and output the assembler code for this function. */
6369: rest_of_compilation (fndecl);
6370:
6371: current_function_returns_null |= can_reach_end;
6372:
6373: if (TREE_THIS_VOLATILE (fndecl) && current_function_returns_null)
6374: warning ("`volatile' function does return");
1.1.1.4 root 6375: else if (warn_return_type && can_reach_end
1.1 root 6376: && TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (fndecl))) != void_type_node)
6377: /* If this function returns non-void and control can drop through,
6378: complain. */
6379: warning ("control reaches end of non-void function");
6380: /* With just -W, complain only if function returns both with
6381: and without a value. */
6382: else if (extra_warnings
6383: && current_function_returns_value && current_function_returns_null)
6384: warning ("this function may return with or without a value");
6385:
6386: /* Free all the tree nodes making up this function. */
6387: /* Switch back to allocating nodes permanently
6388: until we start another function. */
6389: if (! nested)
6390: permanent_allocation ();
6391:
6392: if (DECL_SAVED_INSNS (fndecl) == 0 && ! nested)
6393: {
6394: /* Stop pointing to the local nodes about to be freed. */
6395: /* But DECL_INITIAL must remain nonzero so we know this
6396: was an actual function definition. */
6397: /* For a nested function, this is done in pop_c_function_context. */
6398: DECL_INITIAL (fndecl) = error_mark_node;
6399: DECL_ARGUMENTS (fndecl) = 0;
6400: }
6401:
6402: if (! nested)
6403: {
6404: /* Let the error reporting routines know that we're outside a
6405: function. For a nested function, this value is used in
6406: pop_c_function_context and then reset via pop_function_context. */
6407: current_function_decl = NULL;
6408: }
6409: }
6410:
6411: /* Save and restore the variables in this file and elsewhere
6412: that keep track of the progress of compilation of the current function.
6413: Used for nested functions. */
6414:
6415: struct c_function
6416: {
6417: struct c_function *next;
6418: tree enum_next_value;
6419: tree named_labels;
6420: tree shadowed_labels;
6421: int returns_value;
6422: int returns_null;
6423: int warn_about_return_type;
6424: int extern_inline;
6425: struct binding_level *binding_level;
6426: };
6427:
6428: struct c_function *c_function_chain;
6429:
6430: /* Save and reinitialize the variables
6431: used during compilation of a C function. */
6432:
6433: void
6434: push_c_function_context ()
6435: {
6436: struct c_function *p
6437: = (struct c_function *) xmalloc (sizeof (struct c_function));
6438:
1.1.1.3 root 6439: if (pedantic)
6440: pedwarn ("ANSI C forbids nested functions");
6441:
1.1 root 6442: push_function_context ();
6443:
6444: p->next = c_function_chain;
6445: c_function_chain = p;
6446:
6447: p->enum_next_value = enum_next_value;
6448: p->named_labels = named_labels;
6449: p->shadowed_labels = shadowed_labels;
6450: p->returns_value = current_function_returns_value;
6451: p->returns_null = current_function_returns_null;
6452: p->warn_about_return_type = warn_about_return_type;
6453: p->extern_inline = current_extern_inline;
6454: p->binding_level = current_binding_level;
6455: }
6456:
6457: /* Restore the variables used during compilation of a C function. */
6458:
6459: void
6460: pop_c_function_context ()
6461: {
6462: struct c_function *p = c_function_chain;
6463: tree link;
6464:
6465: /* Bring back all the labels that were shadowed. */
6466: for (link = shadowed_labels; link; link = TREE_CHAIN (link))
6467: if (DECL_NAME (TREE_VALUE (link)) != 0)
6468: IDENTIFIER_LABEL_VALUE (DECL_NAME (TREE_VALUE (link)))
6469: = TREE_VALUE (link);
6470:
6471: if (DECL_SAVED_INSNS (current_function_decl) == 0)
6472: {
6473: /* Stop pointing to the local nodes about to be freed. */
6474: /* But DECL_INITIAL must remain nonzero so we know this
6475: was an actual function definition. */
6476: DECL_INITIAL (current_function_decl) = error_mark_node;
6477: DECL_ARGUMENTS (current_function_decl) = 0;
6478: }
6479:
6480: pop_function_context ();
6481:
6482: c_function_chain = p->next;
6483:
6484: enum_next_value = p->enum_next_value;
6485: named_labels = p->named_labels;
6486: shadowed_labels = p->shadowed_labels;
6487: current_function_returns_value = p->returns_value;
6488: current_function_returns_null = p->returns_null;
6489: warn_about_return_type = p->warn_about_return_type;
6490: current_extern_inline = p->extern_inline;
6491: current_binding_level = p->binding_level;
6492:
6493: free (p);
6494: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.