|
|
1.1 root 1: /* Process declarations and variables for C compiler.
2: Copyright (C) 1988, 1992, 1993 Free Software Foundation, Inc.
3: Hacked by Michael Tiemann ([email protected])
4:
5: This file is part of GNU CC.
6:
7: GNU CC is free software; you can redistribute it and/or modify
8: it under the terms of the GNU General Public License as published by
9: the Free Software Foundation; either version 2, or (at your option)
10: any later version.
11:
12: GNU CC is distributed in the hope that it will be useful,
13: but WITHOUT ANY WARRANTY; without even the implied warranty of
14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: GNU General Public License for more details.
16:
17: You should have received a copy of the GNU General Public License
18: along with GNU CC; see the file COPYING. If not, write to
19: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
20:
21:
22: /* Process declarations and symbol lookup for C front end.
23: Also constructs types; the standard scalar types at initialization,
24: and structure, union, array and enum types when they are declared. */
25:
26: /* ??? not all decl nodes are given the most useful possible
27: line numbers. For example, the CONST_DECLs for enum values. */
28:
29: #include "config.h"
30: #include <stdio.h>
31: #include "tree.h"
32: #include "rtl.h"
33: #include "flags.h"
34: #include "cp-tree.h"
35: #include "decl.h"
36: #include "lex.h"
37:
38: extern tree grokdeclarator ();
39: extern tree get_file_function_name ();
40: extern tree cleanups_this_call;
41: static void grok_function_init ();
42:
43: /* A list of virtual function tables we must make sure to write out. */
44: tree pending_vtables;
45:
46: /* A list of static class variables. This is needed, because a
47: static class variable can be declared inside the class without
48: an initializer, and then initialized, staticly, outside the class. */
49: tree pending_statics;
50:
51: /* A list of functions which were declared inline, but which we
52: may need to emit outline anyway. */
53: static tree saved_inlines;
54:
55: /* Used to help generate temporary names which are unique within
56: a function. Reset to 0 by start_function. */
57:
58: static int temp_name_counter;
59:
60: /* Same, but not reset. Local temp variables and global temp variables
61: can have the same name. */
62: static int global_temp_name_counter;
63:
64: /* Flag used when debugging spew.c */
65:
66: extern int spew_debug;
67:
68: /* C (and C++) language-specific option variables. */
69:
70: /* Nonzero means allow type mismatches in conditional expressions;
71: just make their values `void'. */
72:
73: int flag_cond_mismatch;
74:
75: /* Nonzero means give `double' the same size as `float'. */
76:
77: int flag_short_double;
78:
79: /* Nonzero means don't recognize the keyword `asm'. */
80:
81: int flag_no_asm;
82:
83: /* Nonzero means don't recognize the non-ANSI builtin functions. */
84:
85: int flag_no_builtin;
86:
87: /* Nonzero means don't recognize the non-ANSI builtin functions.
88: -ansi sets this. */
89:
90: int flag_no_nonansi_builtin;
91:
92: /* Nonzero means do some things the same way PCC does. */
93:
94: int flag_traditional;
95:
96: /* Nonzero means to treat bitfields as unsigned unless they say `signed'. */
97:
98: int flag_signed_bitfields = 1;
99:
100: /* Nonzero means handle `#ident' directives. 0 means ignore them. */
101:
102: int flag_no_ident = 0;
103:
104: /* Nonzero means disable GNU extensions. */
105:
106: int flag_ansi = 0;
107:
108: /* Nonzero means do emit exported implementations of functions even if
109: they can be inlined. */
110:
111: int flag_implement_inlines = 1;
112:
113: /* Nonzero means do emit exported implementations of templates, instead of
114: multiple static copies in each file that needs a definition. */
115:
116: int flag_external_templates = 0;
117:
118: /* Nonzero means that the decision to emit or not emit the implementation of a
119: template depends on where the template is instantiated, rather than where
120: it is defined. */
121:
122: int flag_alt_external_templates = 0;
123:
124: /* Nonzero means that implicit instantiations will be emitted if needed. */
125:
126: int flag_implicit_templates = 1;
127:
128: /* Nonzero means warn about implicit declarations. */
129:
130: int warn_implicit = 1;
131:
132: /* Nonzero means warn when all ctors or dtors are private, and the class
133: has no friends. */
134:
135: int warn_ctor_dtor_privacy = 1;
136:
137: /* True if we want to implement vtbvales using "thunks".
138: The default is off now, but will be on later.
139:
140: Also causes output of vtables to be controlled by whether
141: we seen the class's first non-inline virtual function. */
142: int flag_vtable_thunks = 0;
143:
144: /* Nonzero means give string constants the type `const char *'
145: to get extra warnings from them. These warnings will be too numerous
146: to be useful, except in thoroughly ANSIfied programs. */
147:
148: int warn_write_strings;
149:
150: /* Nonzero means warn about pointer casts that can drop a type qualifier
151: from the pointer target type. */
152:
153: int warn_cast_qual;
154:
155: /* Nonzero means warn that dbx info for template class methods isn't fully
156: supported yet. */
157:
158: int warn_template_debugging;
159:
160: /* Warn about traditional constructs whose meanings changed in ANSI C. */
161:
162: int warn_traditional;
163:
164: /* Nonzero means warn about sizeof(function) or addition/subtraction
165: of function pointers. */
166:
167: int warn_pointer_arith;
168:
169: /* Nonzero means warn for non-prototype function decls
170: or non-prototyped defs without previous prototype. */
171:
172: int warn_strict_prototypes;
173:
174: /* Nonzero means warn for any function def without prototype decl. */
175:
176: int warn_missing_prototypes;
177:
178: /* Nonzero means warn about multiple (redundant) decls for the same single
179: variable or function. */
180:
181: int warn_redundant_decls;
182:
183: /* Warn if initializer is not completely bracketed. */
184:
185: int warn_missing_braces;
186:
187: /* Warn about *printf or *scanf format/argument anomalies. */
188:
189: int warn_format;
190:
191: /* Warn about a subscript that has type char. */
192:
193: int warn_char_subscripts;
194:
195: /* Warn if a type conversion is done that might have confusing results. */
196:
197: int warn_conversion;
198:
199: /* Warn if adding () is suggested. */
200:
201: int warn_parentheses = 1;
202:
203: /* Non-zero means warn in function declared in derived class has the
204: same name as a virtual in the base class, but fails to match the
205: type signature of any virtual function in the base class. */
206: int warn_overloaded_virtual;
207:
208: /* Non-zero means warn when declaring a class that has a non virtual
209: destructor, when it really ought to have a virtual one. */
210: int warn_nonvdtor;
211:
212: /* Non-zero means warn when a function is declared extern and later inline. */
213: int warn_extern_inline;
214:
215: /* Non-zero means warn when the compiler will reorder code. */
216: int warn_reorder;
217:
218: /* Non-zero means warn when sysnthesis behavior differs from Cfront's. */
219: int warn_synth;
220:
221: /* Nonzero means `$' can be in an identifier.
222: See cccp.c for reasons why this breaks some obscure ANSI C programs. */
223:
224: #ifndef DOLLARS_IN_IDENTIFIERS
225: #define DOLLARS_IN_IDENTIFIERS 1
226: #endif
227: int dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
228:
229: /* Nonzero for -fno-strict-prototype switch: do not consider empty
230: argument prototype to mean function takes no arguments. */
231:
232: int strict_prototype = 1;
233: int strict_prototypes_lang_c, strict_prototypes_lang_cplusplus = 1;
234:
235: /* Nonzero means that labels can be used as first-class objects */
236:
237: int flag_labels_ok;
238:
239: /* Non-zero means to collect statistics which might be expensive
240: and to print them when we are done. */
241: int flag_detailed_statistics;
242:
243: /* C++ specific flags. */
244: /* Nonzero for -fall-virtual: make every member function (except
245: constructors) lay down in the virtual function table. Calls
246: can then either go through the virtual function table or not,
247: depending. */
248:
249: int flag_all_virtual;
250:
251: /* Zero means that `this' is a *const. This gives nice behavior in the
252: 2.0 world. 1 gives 1.2-compatible behavior. 2 gives Spring behavior.
253: -2 means we're constructing an object and it has fixed type. */
254:
255: int flag_this_is_variable;
256:
257: /* Nonzero means memoize our member lookups. */
258:
259: int flag_memoize_lookups; int flag_save_memoized_contexts;
260:
261: /* 3 means write out only virtuals function tables `defined'
262: in this implementation file.
263: 2 means write out only specific virtual function tables
264: and give them (C) public access.
265: 1 means write out virtual function tables and give them
266: (C) public access.
267: 0 means write out virtual function tables and give them
268: (C) static access (default).
269: -1 means declare virtual function tables extern. */
270:
271: int write_virtuals;
272:
273: /* Nonzero means we should attempt to elide constructors when possible. */
274:
275: int flag_elide_constructors;
276:
277: /* Nonzero means recognize and handle exception handling constructs.
278: Use ansi syntax and semantics. WORK IN PROGRESS! */
279:
280: int flag_handle_exceptions;
281:
282: /* Nonzero means recognize and handle signature language constructs. */
283:
284: int flag_handle_signatures;
285:
286: /* Nonzero means that member functions defined in class scope are
287: inline by default. */
288:
289: int flag_default_inline = 1;
290:
291: /* Controls whether enums and ints freely convert.
292: 1 means with complete freedom.
293: 0 means enums can convert to ints, but not vice-versa. */
294: int flag_int_enum_equivalence;
295:
296: /* Controls whether compiler is operating under LUCID's Cadillac
297: system. 1 means yes, 0 means no. */
298: int flag_cadillac;
299:
300: /* Controls whether compiler generates code to build objects
301: that can be collected when they become garbage. */
302: int flag_gc;
303:
304: /* Controls whether compiler generates 'dossiers' that give
305: run-time type information. */
306: int flag_dossier;
307:
308: /* Nonzero if we wish to output cross-referencing information
309: for the GNU class browser. */
310: extern int flag_gnu_xref;
311:
312: /* Nonzero if compiler can make `reasonable' assumptions about
313: references and objects. For example, the compiler must be
314: conservative about the following and not assume that `a' is nonnull:
315:
316: obj &a = g ();
317: a.f (2);
318:
319: In general, it is `reasonable' to assume that for many programs,
320: and better code can be generated in that case. */
321:
322: int flag_assume_nonnull_objects;
323:
324: /* Nonzero if we want to support huge (> 2^(sizeof(short)*8-1) bytes)
325: objects. */
326: int flag_huge_objects;
327:
328: /* Nonzero if we want to conserve space in the .o files. We do this
329: by putting uninitialized data and runtime initialized data into
330: .common instead of .data at the expense of not flaging multiple
331: definitions. */
332: int flag_conserve_space;
333:
334: /* Nonzero if we want to obey access control semantics. */
335: int flag_access_control = 1;
336:
337: /* Table of language-dependent -f options.
338: STRING is the option name. VARIABLE is the address of the variable.
339: ON_VALUE is the value to store in VARIABLE
340: if `-fSTRING' is seen as an option.
341: (If `-fno-STRING' is seen as an option, the opposite value is stored.) */
342:
343: static struct { char *string; int *variable; int on_value;} lang_f_options[] =
344: {
345: {"signed-char", &flag_signed_char, 1},
346: {"unsigned-char", &flag_signed_char, 0},
347: {"signed-bitfields", &flag_signed_bitfields, 1},
348: {"unsigned-bitfields", &flag_signed_bitfields, 0},
349: {"short-enums", &flag_short_enums, 1},
350: {"short-double", &flag_short_double, 1},
351: {"cond-mismatch", &flag_cond_mismatch, 1},
352: {"asm", &flag_no_asm, 0},
353: {"builtin", &flag_no_builtin, 0},
354: {"ident", &flag_no_ident, 0},
355: {"labels-ok", &flag_labels_ok, 1},
356: {"stats", &flag_detailed_statistics, 1},
357: {"this-is-variable", &flag_this_is_variable, 1},
358: {"strict-prototype", &strict_prototypes_lang_cplusplus, 1},
359: {"all-virtual", &flag_all_virtual, 1},
360: {"memoize-lookups", &flag_memoize_lookups, 1},
361: {"elide-constructors", &flag_elide_constructors, 1},
362: {"handle-exceptions", &flag_handle_exceptions, 1},
363: {"handle-signatures", &flag_handle_signatures, 1},
364: {"default-inline", &flag_default_inline, 1},
365: {"dollars-in-identifiers", &dollars_in_ident, 1},
366: {"enum-int-equiv", &flag_int_enum_equivalence, 1},
367: {"gc", &flag_gc, 1},
368: {"dossier", &flag_dossier, 1},
369: {"xref", &flag_gnu_xref, 1},
370: {"nonnull-objects", &flag_assume_nonnull_objects, 1},
371: {"implement-inlines", &flag_implement_inlines, 1},
372: {"external-templates", &flag_external_templates, 1},
373: {"implicit-templates", &flag_implicit_templates, 1},
374: {"huge-objects", &flag_huge_objects, 1},
375: {"conserve-space", &flag_conserve_space, 1},
376: {"vtable-thunks", &flag_vtable_thunks, 1},
377: {"short-temps", &flag_short_temps, 1},
378: {"access-control", &flag_access_control, 1},
379: {"nonansi-builtins", &flag_no_nonansi_builtin, 0}
380: };
381:
382: /* Decode the string P as a language-specific option.
383: Return 1 if it is recognized (and handle it);
384: return 0 if not recognized. */
385:
386: int
387: lang_decode_option (p)
388: char *p;
389: {
390: if (!strcmp (p, "-ftraditional") || !strcmp (p, "-traditional"))
391: flag_traditional = 1, dollars_in_ident = 1, flag_writable_strings = 1,
392: flag_this_is_variable = 1;
393: /* The +e options are for cfront compatibility. They come in as
394: `-+eN', to kludge around gcc.c's argument handling. */
395: else if (p[0] == '-' && p[1] == '+' && p[2] == 'e')
396: {
397: int old_write_virtuals = write_virtuals;
398: if (p[3] == '1')
399: write_virtuals = 1;
400: else if (p[3] == '0')
401: write_virtuals = -1;
402: else if (p[3] == '2')
403: write_virtuals = 2;
404: else error ("invalid +e option");
405: if (old_write_virtuals != 0
406: && write_virtuals != old_write_virtuals)
407: error ("conflicting +e options given");
408: }
409: else if (p[0] == '-' && p[1] == 'f')
410: {
411: /* Some kind of -f option.
412: P's value is the option sans `-f'.
413: Search for it in the table of options. */
414: int found = 0, j;
415:
416: p += 2;
417: /* Try special -f options. */
418:
419: if (!strcmp (p, "save-memoized"))
420: {
421: flag_memoize_lookups = 1;
422: flag_save_memoized_contexts = 1;
423: found = 1;
424: }
425: if (!strcmp (p, "no-save-memoized"))
426: {
427: flag_memoize_lookups = 0;
428: flag_save_memoized_contexts = 0;
429: found = 1;
430: }
431: else if (! strncmp (p, "cadillac", 8))
432: {
433: flag_cadillac = atoi (p+9);
434: found = 1;
435: }
436: else if (! strncmp (p, "no-cadillac", 11))
437: {
438: flag_cadillac = 0;
439: found = 1;
440: }
441: else if (! strcmp (p, "gc"))
442: {
443: flag_gc = 1;
444: /* This must come along for the ride. */
445: flag_dossier = 1;
446: found = 1;
447: }
448: else if (! strcmp (p, "no-gc"))
449: {
450: flag_gc = 0;
451: /* This must come along for the ride. */
452: flag_dossier = 0;
453: found = 1;
454: }
455: else if (! strcmp (p, "alt-external-templates"))
456: {
457: flag_external_templates = 1;
458: flag_alt_external_templates = 1;
459: found = 1;
460: }
461: else if (! strcmp (p, "no-alt-external-templates"))
462: {
463: flag_alt_external_templates = 0;
464: found = 1;
465: }
466: else if (!strcmp (p, "ansi-overloading"))
467: {
468: warning ("-fansi-overloading is no longer meaningful");
469: }
470: else for (j = 0;
471: !found && j < sizeof (lang_f_options) / sizeof (lang_f_options[0]);
472: j++)
473: {
474: if (!strcmp (p, lang_f_options[j].string))
475: {
476: *lang_f_options[j].variable = lang_f_options[j].on_value;
477: /* A goto here would be cleaner,
478: but breaks the vax pcc. */
479: found = 1;
480: }
481: if (p[0] == 'n' && p[1] == 'o' && p[2] == '-'
482: && ! strcmp (p+3, lang_f_options[j].string))
483: {
484: *lang_f_options[j].variable = ! lang_f_options[j].on_value;
485: found = 1;
486: }
487: }
488: return found;
489: }
490: else if (p[0] == '-' && p[1] == 'W')
491: {
492: int setting = 1;
493:
494: /* The -W options control the warning behavior of the compiler. */
495: p += 2;
496:
497: if (p[0] == 'n' && p[1] == 'o' && p[2] == '-')
498: setting = 0, p += 3;
499:
500: if (!strcmp (p, "implicit"))
501: warn_implicit = setting;
502: else if (!strcmp (p, "return-type"))
503: warn_return_type = setting;
504: else if (!strcmp (p, "ctor-dtor-privacy"))
505: warn_ctor_dtor_privacy = setting;
506: else if (!strcmp (p, "write-strings"))
507: warn_write_strings = setting;
508: else if (!strcmp (p, "cast-qual"))
509: warn_cast_qual = setting;
510: else if (!strcmp (p, "traditional"))
511: warn_traditional = setting;
512: else if (!strcmp (p, "char-subscripts"))
513: warn_char_subscripts = setting;
514: else if (!strcmp (p, "pointer-arith"))
515: warn_pointer_arith = setting;
516: else if (!strcmp (p, "strict-prototypes"))
517: warn_strict_prototypes = setting;
518: else if (!strcmp (p, "missing-prototypes"))
519: warn_missing_prototypes = setting;
520: else if (!strcmp (p, "redundant-decls"))
521: warn_redundant_decls = setting;
522: else if (!strcmp (p, "missing-braces"))
523: warn_missing_braces = setting;
524: else if (!strcmp (p, "format"))
525: warn_format = setting;
526: else if (!strcmp (p, "conversion"))
527: warn_conversion = setting;
528: else if (!strcmp (p, "parentheses"))
529: warn_parentheses = setting;
530: else if (!strcmp (p, "non-virtual-dtor"))
531: warn_nonvdtor = setting;
532: else if (!strcmp (p, "extern-inline"))
533: warn_extern_inline = setting;
534: else if (!strcmp (p, "reorder"))
535: warn_reorder = setting;
536: else if (!strcmp (p, "synth"))
537: warn_synth = setting;
538: else if (!strcmp (p, "comment"))
539: ; /* cpp handles this one. */
540: else if (!strcmp (p, "comments"))
541: ; /* cpp handles this one. */
542: else if (!strcmp (p, "trigraphs"))
543: ; /* cpp handles this one. */
544: else if (!strcmp (p, "import"))
545: ; /* cpp handles this one. */
546: else if (!strcmp (p, "all"))
547: {
548: extra_warnings = setting;
549: warn_return_type = setting;
550: warn_unused = setting;
551: warn_implicit = setting;
552: warn_ctor_dtor_privacy = setting;
553: warn_switch = setting;
554: warn_format = setting;
555: warn_missing_braces = setting;
556: warn_extern_inline = setting;
557: warn_nonvdtor = setting;
558: /* We save the value of warn_uninitialized, since if they put
559: -Wuninitialized on the command line, we need to generate a
560: warning about not using it without also specifying -O. */
561: if (warn_uninitialized != 1)
562: warn_uninitialized = (setting ? 2 : 0);
563: warn_template_debugging = setting;
564: warn_reorder = setting;
565: }
566:
567: else if (!strcmp (p, "overloaded-virtual"))
568: warn_overloaded_virtual = setting;
569: else return 0;
570: }
571: else if (!strcmp (p, "-ansi"))
572: flag_no_asm = 1, dollars_in_ident = 0, flag_no_nonansi_builtin = 1,
573: flag_ansi = 1;
574: #ifdef SPEW_DEBUG
575: /* Undocumented, only ever used when you're invoking cc1plus by hand, since
576: it's probably safe to assume no sane person would ever want to use this
577: under normal circumstances. */
578: else if (!strcmp (p, "-spew-debug"))
579: spew_debug = 1;
580: #endif
581: else
582: return 0;
583:
584: return 1;
585: }
586:
587: /* Incorporate `const' and `volatile' qualifiers for member functions.
588: FUNCTION is a TYPE_DECL or a FUNCTION_DECL.
589: QUALS is a list of qualifiers. */
590: tree
591: grok_method_quals (ctype, function, quals)
592: tree ctype, function, quals;
593: {
594: tree fntype = TREE_TYPE (function);
595: tree raises = TYPE_RAISES_EXCEPTIONS (fntype);
596:
597: do
598: {
599: extern tree ridpointers[];
600:
601: if (TREE_VALUE (quals) == ridpointers[(int)RID_CONST])
602: {
603: if (TYPE_READONLY (ctype))
604: error ("duplicate `%s' %s",
605: IDENTIFIER_POINTER (TREE_VALUE (quals)),
606: (TREE_CODE (function) == FUNCTION_DECL
607: ? "for member function" : "in type declaration"));
608: ctype = build_type_variant (ctype, 1, TYPE_VOLATILE (ctype));
609: build_pointer_type (ctype);
610: }
611: else if (TREE_VALUE (quals) == ridpointers[(int)RID_VOLATILE])
612: {
613: if (TYPE_VOLATILE (ctype))
614: error ("duplicate `%s' %s",
615: IDENTIFIER_POINTER (TREE_VALUE (quals)),
616: (TREE_CODE (function) == FUNCTION_DECL
617: ? "for member function" : "in type declaration"));
618: ctype = build_type_variant (ctype, TYPE_READONLY (ctype), 1);
619: build_pointer_type (ctype);
620: }
621: else
622: my_friendly_abort (20);
623: quals = TREE_CHAIN (quals);
624: }
625: while (quals);
626: fntype = build_cplus_method_type (ctype, TREE_TYPE (fntype),
627: (TREE_CODE (fntype) == METHOD_TYPE
628: ? TREE_CHAIN (TYPE_ARG_TYPES (fntype))
629: : TYPE_ARG_TYPES (fntype)));
630: if (raises)
631: fntype = build_exception_variant (ctype, fntype, raises);
632:
633: TREE_TYPE (function) = fntype;
634: return ctype;
635: }
636:
637: #if 0 /* Not used. */
638: /* This routine replaces cryptic DECL_NAMEs with readable DECL_NAMEs.
639: It leaves DECL_ASSEMBLER_NAMEs with the correct value. */
640: /* This does not yet work with user defined conversion operators
641: It should. */
642: static void
643: substitute_nice_name (decl)
644: tree decl;
645: {
646: if (DECL_NAME (decl) && TREE_CODE (DECL_NAME (decl)) == IDENTIFIER_NODE)
647: {
648: char *n = decl_as_string (DECL_NAME (decl), 1);
649: if (n[strlen (n) - 1] == ' ')
650: n[strlen (n) - 1] = 0;
651: DECL_NAME (decl) = get_identifier (n);
652: }
653: }
654: #endif
655:
656: /* Warn when -fexternal-templates is used and #pragma
657: interface/implementation is not used all the times it should be,
658: inform the user. */
659: void
660: warn_if_unknown_interface ()
661: {
662: static int already_warned = 0;
663: if (++already_warned == 1)
664: warning ("templates that are built with -fexternal-templates should be in files that have #pragma interface/implementation");
665: }
666:
667: /* A subroutine of the parser, to handle a component list. */
668: tree
669: grok_x_components (specs, components)
670: tree specs, components;
671: {
672: register tree t, x, tcode;
673:
674: /* We just got some friends. They have been recorded elsewhere. */
675: if (components == void_type_node)
676: return NULL_TREE;
677:
678: if (components == NULL_TREE)
679: {
680: t = groktypename (build_decl_list (specs, NULL_TREE));
681:
682: if (t == NULL_TREE)
683: {
684: error ("error in component specification");
685: return NULL_TREE;
686: }
687:
688: switch (TREE_CODE (t))
689: {
690: case VAR_DECL:
691: /* Static anonymous unions come out as VAR_DECLs. */
692: if (TREE_CODE (TREE_TYPE (t)) == UNION_TYPE
693: && ANON_AGGRNAME_P (TYPE_IDENTIFIER (TREE_TYPE (t))))
694: return t;
695:
696: /* We return SPECS here, because in the parser it was ending
697: up with not doing anything to $$, which is what SPECS
698: represents. */
699: return specs;
700: break;
701:
702: case RECORD_TYPE:
703: /* This code may be needed for UNION_TYPEs as
704: well. */
705: tcode = record_type_node;
706: if (CLASSTYPE_DECLARED_CLASS(t))
707: tcode = class_type_node;
708: else if (IS_SIGNATURE(t))
709: tcode = signature_type_node;
710: else if (CLASSTYPE_DECLARED_EXCEPTION(t))
711: tcode = exception_type_node;
712:
713: t = xref_defn_tag(tcode, TYPE_IDENTIFIER(t), NULL_TREE);
714: if (TYPE_CONTEXT(t))
715: CLASSTYPE_NO_GLOBALIZE(t) = 1;
716: if (TYPE_LANG_SPECIFIC (t)
717: && CLASSTYPE_DECLARED_EXCEPTION (t))
718: shadow_tag (specs);
719: return NULL_TREE;
720: break;
721:
722: case UNION_TYPE:
723: case ENUMERAL_TYPE:
724: if (TREE_CODE(t) == UNION_TYPE)
725: tcode = union_type_node;
726: else
727: tcode = enum_type_node;
728:
729: t = xref_defn_tag(tcode, TYPE_IDENTIFIER(t), NULL_TREE);
730: if (TREE_CODE(t) == UNION_TYPE && TYPE_CONTEXT(t))
731: CLASSTYPE_NO_GLOBALIZE(t) = 1;
732: if (TREE_CODE (t) == UNION_TYPE
733: && ANON_AGGRNAME_P (TYPE_IDENTIFIER (t)))
734: {
735: struct pending_inline **p;
736: x = build_lang_field_decl (FIELD_DECL, NULL_TREE, t);
737:
738: /* Wipe out memory of synthesized methods */
739: TYPE_HAS_CONSTRUCTOR (t) = 0;
740: TYPE_HAS_DEFAULT_CONSTRUCTOR (t) = 0;
741: TYPE_HAS_INIT_REF (t) = 0;
742: TYPE_HAS_CONST_INIT_REF (t) = 0;
743: TYPE_HAS_ASSIGN_REF (t) = 0;
744: TYPE_HAS_ASSIGNMENT (t) = 0;
745: TYPE_HAS_CONST_ASSIGN_REF (t) = 0;
746:
747: p = &pending_inlines;
748: for (; *p; *p = (*p)->next)
749: if (DECL_CONTEXT ((*p)->fndecl) != t)
750: break;
751: }
752: else if (TREE_CODE (t) == ENUMERAL_TYPE)
753: x = grok_enum_decls (t, NULL_TREE);
754: else
755: x = NULL_TREE;
756: return x;
757: break;
758:
759: default:
760: if (t != void_type_node)
761: error ("empty component declaration");
762: return NULL_TREE;
763: }
764: }
765: else
766: {
767: t = TREE_TYPE (components);
768: if (TREE_CODE (t) == ENUMERAL_TYPE && TREE_NONLOCAL_FLAG (t))
769: return grok_enum_decls (t, components);
770: else
771: return components;
772: }
773: }
774:
775: /* Classes overload their constituent function names automatically.
776: When a function name is declared in a record structure,
777: its name is changed to it overloaded name. Since names for
778: constructors and destructors can conflict, we place a leading
779: '$' for destructors.
780:
781: CNAME is the name of the class we are grokking for.
782:
783: FUNCTION is a FUNCTION_DECL. It was created by `grokdeclarator'.
784:
785: FLAGS contains bits saying what's special about today's
786: arguments. 1 == DESTRUCTOR. 2 == OPERATOR.
787:
788: If FUNCTION is a destructor, then we must add the `auto-delete' field
789: as a second parameter. There is some hair associated with the fact
790: that we must "declare" this variable in the manner consistent with the
791: way the rest of the arguments were declared.
792:
793: QUALS are the qualifiers for the this pointer. */
794:
795: void
796: grokclassfn (ctype, cname, function, flags, quals)
797: tree ctype, cname, function;
798: enum overload_flags flags;
799: tree quals;
800: {
801: tree fn_name = DECL_NAME (function);
802: tree arg_types;
803: tree parm;
804: tree qualtype;
805:
806: if (fn_name == NULL_TREE)
807: {
808: error ("name missing for member function");
809: fn_name = get_identifier ("<anonymous>");
810: DECL_NAME (function) = fn_name;
811: }
812:
813: if (quals)
814: qualtype = grok_method_quals (ctype, function, quals);
815: else
816: qualtype = ctype;
817:
818: arg_types = TYPE_ARG_TYPES (TREE_TYPE (function));
819: if (TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE)
820: {
821: /* Must add the class instance variable up front. */
822: /* Right now we just make this a pointer. But later
823: we may wish to make it special. */
824: tree type = TREE_VALUE (arg_types);
825:
826: if ((flag_this_is_variable > 0)
827: && (flags == DTOR_FLAG || DECL_CONSTRUCTOR_P (function)))
828: type = TYPE_MAIN_VARIANT (type);
829:
830: if (DECL_CONSTRUCTOR_P (function))
831: {
832: if (TYPE_USES_VIRTUAL_BASECLASSES (ctype))
833: {
834: DECL_CONSTRUCTOR_FOR_VBASE_P (function) = 1;
835: /* In this case we need "in-charge" flag saying whether
836: this constructor is responsible for initialization
837: of virtual baseclasses or not. */
838: parm = build_decl (PARM_DECL, in_charge_identifier, integer_type_node);
839: /* Mark the artificial `__in_chrg' parameter as "artificial". */
840: SET_DECL_ARTIFICIAL (parm);
841: DECL_ARG_TYPE (parm) = integer_type_node;
842: DECL_REGISTER (parm) = 1;
843: TREE_CHAIN (parm) = last_function_parms;
844: last_function_parms = parm;
845: }
846: }
847:
848: parm = build_decl (PARM_DECL, this_identifier, type);
849: /* Mark the artificial `this' parameter as "artificial". */
850: SET_DECL_ARTIFICIAL (parm);
851: DECL_ARG_TYPE (parm) = type;
852: /* We can make this a register, so long as we don't
853: accidentally complain if someone tries to take its address. */
854: DECL_REGISTER (parm) = 1;
855: if (TYPE_READONLY (type))
856: TREE_READONLY (parm) = 1;
857: TREE_CHAIN (parm) = last_function_parms;
858: last_function_parms = parm;
859: }
860:
861: if (flags == DTOR_FLAG)
862: {
863: char *buf, *dbuf;
864: tree const_integer_type = build_type_variant (integer_type_node, 1, 0);
865: int len = sizeof (DESTRUCTOR_DECL_PREFIX)-1;
866:
867: arg_types = hash_tree_chain (const_integer_type, void_list_node);
868: TREE_SIDE_EFFECTS (arg_types) = 1;
869: /* Build the overload name. It will look like `7Example'. */
870: if (IDENTIFIER_TYPE_VALUE (cname))
871: dbuf = build_overload_name (IDENTIFIER_TYPE_VALUE (cname), 1, 1);
872: else if (IDENTIFIER_LOCAL_VALUE (cname))
873: dbuf = build_overload_name (TREE_TYPE (IDENTIFIER_LOCAL_VALUE (cname)), 1, 1);
874: else
875: /* Using ctype fixes the `X::Y::~Y()' crash. The cname has no type when
876: it's defined out of the class definition, since poplevel_class wipes
877: it out. This used to be internal error 346. */
878: dbuf = build_overload_name (ctype, 1, 1);
879: buf = (char *) alloca (strlen (dbuf) + sizeof (DESTRUCTOR_DECL_PREFIX));
880: bcopy (DESTRUCTOR_DECL_PREFIX, buf, len);
881: buf[len] = '\0';
882: strcat (buf, dbuf);
883: DECL_ASSEMBLER_NAME (function) = get_identifier (buf);
884: parm = build_decl (PARM_DECL, in_charge_identifier, const_integer_type);
885: /* Mark the artificial `__in_chrg' parameter as "artificial". */
886: SET_DECL_ARTIFICIAL (parm);
887: TREE_USED (parm) = 1;
888: #if 0
889: /* We don't need to mark the __in_chrg parameter itself as `const'
890: since its type is already `const int'. In fact we MUST NOT mark
891: it as `const' cuz that will screw up the debug info (causing it
892: to say that the type of __in_chrg is `const const int'). */
893: TREE_READONLY (parm) = 1;
894: #endif
895: DECL_ARG_TYPE (parm) = const_integer_type;
896: /* This is the same chain as DECL_ARGUMENTS (...). */
897: TREE_CHAIN (last_function_parms) = parm;
898:
899: TREE_TYPE (function) = build_cplus_method_type (qualtype, void_type_node,
900: arg_types);
901: TYPE_HAS_DESTRUCTOR (ctype) = 1;
902: }
903: else
904: {
905: tree these_arg_types;
906:
907: if (DECL_CONSTRUCTOR_FOR_VBASE_P (function))
908: {
909: arg_types = hash_tree_chain (integer_type_node,
910: TREE_CHAIN (arg_types));
911: TREE_TYPE (function)
912: = build_cplus_method_type (qualtype,
913: TREE_TYPE (TREE_TYPE (function)),
914: arg_types);
915: arg_types = TYPE_ARG_TYPES (TREE_TYPE (function));
916: }
917:
918: these_arg_types = arg_types;
919:
920: if (TREE_CODE (TREE_TYPE (function)) == FUNCTION_TYPE)
921: /* Only true for static member functions. */
922: these_arg_types = hash_tree_chain (TYPE_POINTER_TO (qualtype),
923: arg_types);
924:
925: DECL_ASSEMBLER_NAME (function)
926: = build_decl_overload (fn_name, these_arg_types,
927: 1 + DECL_CONSTRUCTOR_P (function));
928:
929: #if 0
930: /* This code is going into the compiler, but currently, it makes
931: libg++/src/Interger.cc not compile. The problem is that the nice name
932: winds up going into the symbol table, and conversion operations look
933: for the manged name. */
934: substitute_nice_name (function);
935: #endif
936: }
937:
938: DECL_ARGUMENTS (function) = last_function_parms;
939: /* First approximations. */
940: DECL_CONTEXT (function) = ctype;
941: DECL_CLASS_CONTEXT (function) = ctype;
942: }
943:
944: /* Work on the expr used by alignof (this is only called by the parser). */
945: tree
946: grok_alignof (expr)
947: tree expr;
948: {
949: tree best, t;
950: int bestalign;
951:
952: if (TREE_CODE (expr) == COMPONENT_REF
953: && DECL_BIT_FIELD (TREE_OPERAND (expr, 1)))
954: error ("`__alignof__' applied to a bit-field");
955:
956: if (TREE_CODE (expr) == INDIRECT_REF)
957: {
958: best = t = TREE_OPERAND (expr, 0);
959: bestalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t)));
960:
961: while (TREE_CODE (t) == NOP_EXPR
962: && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == POINTER_TYPE)
963: {
964: int thisalign;
965: t = TREE_OPERAND (t, 0);
966: thisalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t)));
967: if (thisalign > bestalign)
968: best = t, bestalign = thisalign;
969: }
970: return c_alignof (TREE_TYPE (TREE_TYPE (best)));
971: }
972: else
973: {
974: /* ANSI says arrays and fns are converted inside comma.
975: But we can't convert them in build_compound_expr
976: because that would break commas in lvalues.
977: So do the conversion here if operand was a comma. */
978: if (TREE_CODE (expr) == COMPOUND_EXPR
979: && (TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE
980: || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE))
981: expr = default_conversion (expr);
982: return c_alignof (TREE_TYPE (expr));
983: }
984: }
985:
986: /* Create an ARRAY_REF, checking for the user doing things backwards
987: along the way. */
988: tree
989: grok_array_decl (array_expr, index_exp)
990: tree array_expr, index_exp;
991: {
992: tree type = TREE_TYPE (array_expr);
993:
994: if (type == error_mark_node || index_exp == error_mark_node)
995: return error_mark_node;
996: if (type == NULL_TREE)
997: {
998: /* Something has gone very wrong. Assume we are mistakenly reducing
999: an expression instead of a declaration. */
1000: error ("parser may be lost: is there a '{' missing somewhere?");
1001: return NULL_TREE;
1002: }
1003:
1004: if (TREE_CODE (type) == OFFSET_TYPE
1005: || TREE_CODE (type) == REFERENCE_TYPE)
1006: type = TREE_TYPE (type);
1007:
1008: /* If they have an `operator[]', use that. */
1009: if (TYPE_LANG_SPECIFIC (type)
1010: && TYPE_OVERLOADS_ARRAY_REF (type))
1011: return build_opfncall (ARRAY_REF, LOOKUP_NORMAL,
1012: array_expr, index_exp, NULL_TREE);
1013:
1014: /* Otherwise, create an ARRAY_REF for a pointer or array type. */
1015: if (TREE_CODE (type) == POINTER_TYPE
1016: || TREE_CODE (type) == ARRAY_TYPE)
1017: return build_array_ref (array_expr, index_exp);
1018:
1019: /* Woops, looks like they did something like `5[a]' instead of `a[5]'.
1020: We don't emit a warning or error for this, since it's allowed
1021: by ARM $8.2.4. */
1022:
1023: type = TREE_TYPE (index_exp);
1024:
1025: if (TREE_CODE (type) == OFFSET_TYPE
1026: || TREE_CODE (type) == REFERENCE_TYPE)
1027: type = TREE_TYPE (type);
1028:
1029: if (TREE_CODE (type) == POINTER_TYPE
1030: || TREE_CODE (type) == ARRAY_TYPE)
1031: return build_array_ref (index_exp, array_expr);
1032:
1033: /* The expression E1[E2] is identical (by definition) to *((E1)+(E2)). */
1034: return build_indirect_ref (build_binary_op (PLUS_EXPR, array_expr,
1035: index_exp, 1),
1036: "array indexing");
1037: }
1038:
1039: /* Given the cast expression EXP, checking out its validity. Either return
1040: an error_mark_node if there was an unavoidable error, return a cast to
1041: void for trying to delete a pointer w/ the value 0, or return the
1042: call to delete. If DOING_VEC is 1, we handle things differently
1043: for doing an array delete. If DOING_VEC is 2, they gave us the
1044: array size as an argument to delete.
1045: Implements ARM $5.3.4. This is called from the parser. */
1046: tree
1047: delete_sanity (exp, size, doing_vec, use_global_delete)
1048: tree exp, size;
1049: int doing_vec, use_global_delete;
1050: {
1051: tree t = stabilize_reference (convert_from_reference (exp));
1052: tree type = TREE_TYPE (t);
1053: enum tree_code code = TREE_CODE (type);
1054: /* For a regular vector delete (aka, no size argument) we will pass
1055: this down as a NULL_TREE into build_vec_delete. */
1056: tree maxindex = NULL_TREE;
1057: /* This is used for deleting arrays. */
1058: tree elt_size;
1059:
1060: switch (doing_vec)
1061: {
1062: case 2:
1063: maxindex = build_binary_op (MINUS_EXPR, size, integer_one_node, 1);
1064: if (! flag_traditional)
1065: pedwarn ("anachronistic use of array size in vector delete");
1066: /* Fall through. */
1067: case 1:
1068: elt_size = c_sizeof (type);
1069: break;
1070: default:
1071: if (code != POINTER_TYPE)
1072: {
1073: cp_error ("type `%#T' argument given to `delete', expected pointer",
1074: type);
1075: return error_mark_node;
1076: }
1077:
1078: /* Deleting a pointer with the value zero is legal and has no effect. */
1079: if (integer_zerop (t))
1080: return build1 (NOP_EXPR, void_type_node, t);
1081: }
1082:
1083: if (code == POINTER_TYPE)
1084: {
1085: /* You can't delete a pointer to constant. */
1086: if (TREE_READONLY (TREE_TYPE (type)))
1087: {
1088: error ("`const *' cannot be deleted");
1089: return error_mark_node;
1090: }
1091: /* You also can't delete functions. */
1092: if (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
1093: {
1094: error ("cannot delete a function");
1095: return error_mark_node;
1096: }
1097: }
1098:
1099: #if 0
1100: /* If the type has no destructor, then we should build a regular
1101: delete, instead of a vector delete. Otherwise, we would end
1102: up passing a bogus offset into __builtin_delete, which is
1103: not expecting it. */
1104: if (doing_vec
1105: && TREE_CODE (type) == POINTER_TYPE
1106: && !TYPE_HAS_DESTRUCTOR (TREE_TYPE (type)))
1107: {
1108: doing_vec = 0;
1109: use_global_delete = 1;
1110: }
1111: #endif
1112:
1113: if (doing_vec)
1114: return build_vec_delete (t, maxindex, elt_size, integer_one_node,
1115: integer_two_node, use_global_delete);
1116: else
1117: return build_delete (type, t, integer_three_node,
1118: LOOKUP_NORMAL|LOOKUP_HAS_IN_CHARGE,
1119: use_global_delete);
1120: }
1121:
1122: /* Sanity check: report error if this function FUNCTION is not
1123: really a member of the class (CTYPE) it is supposed to belong to.
1124: CNAME is the same here as it is for grokclassfn above. */
1125:
1126: void
1127: check_classfn (ctype, cname, function)
1128: tree ctype, cname, function;
1129: {
1130: tree fn_name = DECL_NAME (function);
1131: tree fndecl;
1132: tree method_vec = CLASSTYPE_METHOD_VEC (ctype);
1133: tree *methods = 0;
1134: tree *end = 0;
1135:
1136: if (method_vec != 0)
1137: {
1138: methods = &TREE_VEC_ELT (method_vec, 0);
1139: end = TREE_VEC_END (method_vec);
1140:
1141: /* First suss out ctors and dtors. */
1142: if (*methods && fn_name == cname)
1143: goto got_it;
1144:
1145: while (++methods != end)
1146: {
1147: if (fn_name == DECL_NAME (*methods))
1148: {
1149: got_it:
1150: fndecl = *methods;
1151: while (fndecl)
1152: {
1153: if (DECL_ASSEMBLER_NAME (function) == DECL_ASSEMBLER_NAME (fndecl))
1154: return;
1155: fndecl = DECL_CHAIN (fndecl);
1156: }
1157: break; /* loser */
1158: }
1159: }
1160: }
1161:
1162: if (methods != end)
1163: cp_error ("argument list for `%#D' does not match any in class `%T'",
1164: function, ctype);
1165: else
1166: {
1167: methods = 0;
1168: cp_error ("no `%#D' member function declared in class `%T'",
1169: function, ctype);
1170: }
1171:
1172: /* If we did not find the method in the class, add it to
1173: avoid spurious errors. */
1174: add_method (ctype, methods, function);
1175: }
1176:
1177: /* Process the specs, declarator (NULL if omitted) and width (NULL if omitted)
1178: of a structure component, returning a FIELD_DECL node.
1179: QUALS is a list of type qualifiers for this decl (such as for declaring
1180: const member functions).
1181:
1182: This is done during the parsing of the struct declaration.
1183: The FIELD_DECL nodes are chained together and the lot of them
1184: are ultimately passed to `build_struct' to make the RECORD_TYPE node.
1185:
1186: C++:
1187:
1188: If class A defines that certain functions in class B are friends, then
1189: the way I have set things up, it is B who is interested in permission
1190: granted by A. However, it is in A's context that these declarations
1191: are parsed. By returning a void_type_node, class A does not attempt
1192: to incorporate the declarations of the friends within its structure.
1193:
1194: DO NOT MAKE ANY CHANGES TO THIS CODE WITHOUT MAKING CORRESPONDING
1195: CHANGES TO CODE IN `start_method'. */
1196:
1197: tree
1198: grokfield (declarator, declspecs, raises, init, asmspec_tree)
1199: tree declarator, declspecs, raises, init, asmspec_tree;
1200: {
1201: register tree value;
1202: char *asmspec = 0;
1203:
1204: /* Convert () initializers to = initializers. */
1205: if (init == NULL_TREE && declarator != NULL_TREE
1206: && TREE_CODE (declarator) == CALL_EXPR
1207: && TREE_OPERAND (declarator, 0)
1208: && (TREE_CODE (TREE_OPERAND (declarator, 0)) == IDENTIFIER_NODE
1209: || TREE_CODE (TREE_OPERAND (declarator, 0)) == SCOPE_REF)
1210: && parmlist_is_exprlist (TREE_OPERAND (declarator, 1)))
1211: {
1212: init = TREE_OPERAND (declarator, 1);
1213: declarator = TREE_OPERAND (declarator, 0);
1214: }
1215:
1216: if (init
1217: && TREE_CODE (init) == TREE_LIST
1218: && TREE_VALUE (init) == error_mark_node
1219: && TREE_CHAIN (init) == NULL_TREE)
1220: init = NULL_TREE;
1221:
1222: value = grokdeclarator (declarator, declspecs, FIELD, init != 0, raises);
1223: if (! value)
1224: return value; /* friend or constructor went bad. */
1225:
1226: /* Pass friendly classes back. */
1227: if (TREE_CODE (value) == VOID_TYPE)
1228: return void_type_node;
1229:
1230: if (DECL_NAME (value) != NULL_TREE
1231: && IDENTIFIER_POINTER (DECL_NAME (value))[0] == '_'
1232: && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (value)), "_vptr"))
1233: cp_error ("member `%D' conflicts with virtual function table field name", value);
1234:
1235: /* Stash away type declarations. */
1236: if (TREE_CODE (value) == TYPE_DECL)
1237: {
1238: DECL_NONLOCAL (value) = 1;
1239: DECL_CONTEXT (value) = current_class_type;
1240: DECL_CLASS_CONTEXT (value) = current_class_type;
1241: CLASSTYPE_LOCAL_TYPEDECLS (current_class_type) = 1;
1242: pushdecl_class_level (value);
1243: return value;
1244: }
1245:
1246: if (IS_SIGNATURE (current_class_type)
1247: && TREE_CODE (value) != FUNCTION_DECL)
1248: {
1249: error ("field declaration not allowed in signature");
1250: return void_type_node;
1251: }
1252:
1253: if (DECL_IN_AGGR_P (value))
1254: {
1255: cp_error ("`%D' is already defined in the class %T", value,
1256: DECL_CONTEXT (value));
1257: return void_type_node;
1258: }
1259:
1260: if (flag_cadillac)
1261: cadillac_start_decl (value);
1262:
1263: if (asmspec_tree)
1264: asmspec = TREE_STRING_POINTER (asmspec_tree);
1265:
1266: if (init)
1267: {
1268: if (IS_SIGNATURE (current_class_type)
1269: && TREE_CODE (value) == FUNCTION_DECL)
1270: {
1271: error ("function declarations cannot have initializers in signature");
1272: init = NULL_TREE;
1273: }
1274: else if (TREE_CODE (value) == FUNCTION_DECL)
1275: {
1276: grok_function_init (value, init);
1277: init = NULL_TREE;
1278: }
1279: else if (pedantic && TREE_CODE (value) != VAR_DECL)
1280: /* Already complained in grokdeclarator. */
1281: init = NULL_TREE;
1282: else
1283: {
1284: /* We allow initializers to become parameters to base
1285: initializers. */
1286: if (TREE_CODE (init) == TREE_LIST)
1287: {
1288: if (TREE_CHAIN (init) == NULL_TREE)
1289: init = TREE_VALUE (init);
1290: else
1291: init = digest_init (TREE_TYPE (value), init, (tree *)0);
1292: }
1293:
1294: if (TREE_CODE (init) == CONST_DECL)
1295: init = DECL_INITIAL (init);
1296: else if (TREE_READONLY_DECL_P (init))
1297: init = decl_constant_value (init);
1298: else if (TREE_CODE (init) == CONSTRUCTOR)
1299: init = digest_init (TREE_TYPE (value), init, (tree *)0);
1300: my_friendly_assert (TREE_PERMANENT (init), 192);
1301: if (init == error_mark_node)
1302: /* We must make this look different than `error_mark_node'
1303: because `decl_const_value' would mis-interpret it
1304: as only meaning that this VAR_DECL is defined. */
1305: init = build1 (NOP_EXPR, TREE_TYPE (value), init);
1306: else if (! TREE_CONSTANT (init))
1307: {
1308: /* We can allow references to things that are effectively
1309: static, since references are initialized with the address. */
1310: if (TREE_CODE (TREE_TYPE (value)) != REFERENCE_TYPE
1311: || (TREE_STATIC (init) == 0
1312: && (TREE_CODE_CLASS (TREE_CODE (init)) != 'd'
1313: || DECL_EXTERNAL (init) == 0)))
1314: {
1315: error ("field initializer is not constant");
1316: init = error_mark_node;
1317: }
1318: }
1319: }
1320: }
1321:
1322: /* The corresponding pop_obstacks is in finish_decl. */
1323: push_obstacks_nochange ();
1324:
1325: if (TREE_CODE (value) == VAR_DECL)
1326: {
1327: /* We cannot call pushdecl here, because that would
1328: fill in the value of our TREE_CHAIN. Instead, we
1329: modify finish_decl to do the right thing, namely, to
1330: put this decl out straight away. */
1331: if (TREE_PUBLIC (value))
1332: {
1333: /* current_class_type can be NULL_TREE in case of error. */
1334: if (asmspec == 0 && current_class_type)
1335: {
1336: TREE_PUBLIC (value) = 1;
1337: DECL_INITIAL (value) = error_mark_node;
1338: DECL_ASSEMBLER_NAME (value)
1339: = build_static_name (current_class_type, DECL_NAME (value));
1340: }
1341: pending_statics = perm_tree_cons (NULL_TREE, value, pending_statics);
1342:
1343: /* Static consts need not be initialized in the class definition. */
1344: if (init != NULL_TREE && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (value)))
1345: {
1346: static int explanation = 0;
1347:
1348: error ("initializer invalid for static member with constructor");
1349: if (explanation++ == 0)
1350: error ("(you really want to initialize it separately)");
1351: init = 0;
1352: }
1353: /* Force the compiler to know when an uninitialized static
1354: const member is being used. */
1355: if (TYPE_READONLY (value) && init == 0)
1356: TREE_USED (value) = 1;
1357: }
1358: DECL_INITIAL (value) = init;
1359: DECL_IN_AGGR_P (value) = 1;
1360:
1361: finish_decl (value, init, asmspec_tree, 1);
1362: pushdecl_class_level (value);
1363: return value;
1364: }
1365: if (TREE_CODE (value) == FIELD_DECL)
1366: {
1367: if (asmspec)
1368: DECL_ASSEMBLER_NAME (value) = get_identifier (asmspec);
1369: if (DECL_INITIAL (value) == error_mark_node)
1370: init = error_mark_node;
1371: finish_decl (value, init, asmspec_tree, 1);
1372: DECL_INITIAL (value) = init;
1373: DECL_IN_AGGR_P (value) = 1;
1374: return value;
1375: }
1376: if (TREE_CODE (value) == FUNCTION_DECL)
1377: {
1378: if (DECL_CHAIN (value) != NULL_TREE)
1379: {
1380: /* Need a fresh node here so that we don't get circularity
1381: when we link these together. */
1382: value = copy_node (value);
1383: /* When does this happen? */
1384: my_friendly_assert (init == NULL_TREE, 193);
1385: }
1386: finish_decl (value, init, asmspec_tree, 1);
1387:
1388: /* Pass friends back this way. */
1389: if (DECL_FRIEND_P (value))
1390: return void_type_node;
1391:
1392: #if 0 /* Just because a fn is declared doesn't mean we'll try to define it. */
1393: if (current_function_decl && ! IS_SIGNATURE (current_class_type))
1394: cp_error ("method `%#D' of local class must be defined in class body",
1395: value);
1396: #endif
1397:
1398: DECL_IN_AGGR_P (value) = 1;
1399: return value;
1400: }
1401: my_friendly_abort (21);
1402: /* NOTREACHED */
1403: return NULL_TREE;
1404: }
1405:
1406: /* Like `grokfield', but for bitfields.
1407: WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node. */
1408:
1409: tree
1410: grokbitfield (declarator, declspecs, width)
1411: tree declarator, declspecs, width;
1412: {
1413: register tree value = grokdeclarator (declarator, declspecs, BITFIELD, 0, NULL_TREE);
1414:
1415: if (! value) return NULL_TREE; /* friends went bad. */
1416:
1417: /* Pass friendly classes back. */
1418: if (TREE_CODE (value) == VOID_TYPE)
1419: return void_type_node;
1420:
1421: if (TREE_CODE (value) == TYPE_DECL)
1422: {
1423: cp_error ("cannot declare `%D' to be a bitfield type", value);
1424: return NULL_TREE;
1425: }
1426:
1427: if (IS_SIGNATURE (current_class_type))
1428: {
1429: error ("field declaration not allowed in signature");
1430: return void_type_node;
1431: }
1432:
1433: if (DECL_IN_AGGR_P (value))
1434: {
1435: cp_error ("`%D' is already defined in the class %T", value,
1436: DECL_CONTEXT (value));
1437: return void_type_node;
1438: }
1439:
1440: GNU_xref_member (current_class_name, value);
1441:
1442: if (TREE_STATIC (value))
1443: {
1444: cp_error ("static member `%D' cannot be a bitfield", value);
1445: return NULL_TREE;
1446: }
1447: finish_decl (value, NULL_TREE, NULL_TREE, 0);
1448:
1449: if (width != error_mark_node)
1450: {
1451: /* detect invalid field size. */
1452: if (TREE_CODE (width) == CONST_DECL)
1453: width = DECL_INITIAL (width);
1454: else if (TREE_READONLY_DECL_P (width))
1455: width = decl_constant_value (width);
1456: if (TREE_CODE (width) != INTEGER_CST)
1457: {
1458: cp_error ("structure field `%D' width not an integer constant",
1459: value);
1460: DECL_INITIAL (value) = NULL_TREE;
1461: }
1462: else
1463: {
1464: constant_expression_warning (width);
1465: DECL_INITIAL (value) = width;
1466: DECL_BIT_FIELD (value) = 1;
1467: }
1468: }
1469:
1470: DECL_IN_AGGR_P (value) = 1;
1471: return value;
1472: }
1473:
1474: #if 0
1475: /* Like GROKFIELD, except that the declarator has been
1476: buried in DECLSPECS. Find the declarator, and
1477: return something that looks like it came from
1478: GROKFIELD. */
1479: tree
1480: groktypefield (declspecs, parmlist)
1481: tree declspecs;
1482: tree parmlist;
1483: {
1484: tree spec = declspecs;
1485: tree prev = NULL_TREE;
1486:
1487: tree type_id = NULL_TREE;
1488: tree quals = NULL_TREE;
1489: tree lengths = NULL_TREE;
1490: tree decl = NULL_TREE;
1491:
1492: while (spec)
1493: {
1494: register tree id = TREE_VALUE (spec);
1495:
1496: if (TREE_CODE (spec) != TREE_LIST)
1497: /* Certain parse errors slip through. For example,
1498: `int class ();' is not caught by the parser. Try
1499: weakly to recover here. */
1500: return NULL_TREE;
1501:
1502: if (TREE_CODE (id) == TYPE_DECL
1503: || (TREE_CODE (id) == IDENTIFIER_NODE && TREE_TYPE (id)))
1504: {
1505: /* We have a constructor/destructor or
1506: conversion operator. Use it. */
1507: if (prev)
1508: TREE_CHAIN (prev) = TREE_CHAIN (spec);
1509: else
1510: declspecs = TREE_CHAIN (spec);
1511:
1512: type_id = id;
1513: goto found;
1514: }
1515: prev = spec;
1516: spec = TREE_CHAIN (spec);
1517: }
1518:
1519: /* Nope, we have a conversion operator to a scalar type or something
1520: else, that includes things like constructor declarations for
1521: templates. */
1522: spec = declspecs;
1523: while (spec)
1524: {
1525: tree id = TREE_VALUE (spec);
1526:
1527: if (TREE_CODE (id) == IDENTIFIER_NODE)
1528: {
1529: if (id == ridpointers[(int)RID_INT]
1530: || id == ridpointers[(int)RID_DOUBLE]
1531: || id == ridpointers[(int)RID_FLOAT]
1532: || id == ridpointers[(int)RID_WCHAR])
1533: {
1534: if (type_id)
1535: error ("extra `%s' ignored",
1536: IDENTIFIER_POINTER (id));
1537: else
1538: type_id = id;
1539: }
1540: else if (id == ridpointers[(int)RID_LONG]
1541: || id == ridpointers[(int)RID_SHORT]
1542: || id == ridpointers[(int)RID_CHAR])
1543: {
1544: lengths = tree_cons (NULL_TREE, id, lengths);
1545: }
1546: else if (id == ridpointers[(int)RID_VOID])
1547: {
1548: if (type_id)
1549: error ("spurious `void' type ignored");
1550: else
1551: error ("conversion to `void' type invalid");
1552: }
1553: else if (id == ridpointers[(int)RID_AUTO]
1554: || id == ridpointers[(int)RID_REGISTER]
1555: || id == ridpointers[(int)RID_TYPEDEF]
1556: || id == ridpointers[(int)RID_CONST]
1557: || id == ridpointers[(int)RID_VOLATILE])
1558: {
1559: error ("type specifier `%s' used invalidly",
1560: IDENTIFIER_POINTER (id));
1561: }
1562: else if (id == ridpointers[(int)RID_FRIEND]
1563: || id == ridpointers[(int)RID_VIRTUAL]
1564: || id == ridpointers[(int)RID_INLINE]
1565: || id == ridpointers[(int)RID_UNSIGNED]
1566: || id == ridpointers[(int)RID_SIGNED]
1567: || id == ridpointers[(int)RID_STATIC]
1568: || id == ridpointers[(int)RID_EXTERN])
1569: {
1570: quals = tree_cons (NULL_TREE, id, quals);
1571: }
1572: else
1573: {
1574: /* Happens when we have a global typedef
1575: and a class-local member function with
1576: the same name. */
1577: type_id = id;
1578: goto found;
1579: }
1580: }
1581: else if (TREE_CODE (id) == RECORD_TYPE)
1582: {
1583: type_id = TYPE_NAME (id);
1584: if (TREE_CODE (type_id) == TYPE_DECL)
1585: type_id = DECL_NAME (type_id);
1586: if (type_id == NULL_TREE)
1587: error ("identifier for aggregate type conversion omitted");
1588: }
1589: else if (TREE_CODE_CLASS (TREE_CODE (id)) == 't')
1590: error ("`operator' missing on conversion operator or tag missing from type");
1591: else
1592: my_friendly_abort (194);
1593: spec = TREE_CHAIN (spec);
1594: }
1595:
1596: if (type_id)
1597: declspecs = chainon (lengths, quals);
1598: else if (lengths)
1599: {
1600: if (TREE_CHAIN (lengths))
1601: error ("multiple length specifiers");
1602: type_id = ridpointers[(int)RID_INT];
1603: declspecs = chainon (lengths, quals);
1604: }
1605: else if (quals)
1606: {
1607: error ("no type given, defaulting to `operator int ...'");
1608: type_id = ridpointers[(int)RID_INT];
1609: declspecs = quals;
1610: }
1611: else
1612: return NULL_TREE;
1613:
1614: found:
1615: decl = grokdeclarator (build_parse_node (CALL_EXPR, type_id, parmlist, NULL_TREE),
1616: declspecs, FIELD, 0, NULL_TREE);
1617: if (decl == NULL_TREE)
1618: return NULL_TREE;
1619:
1620: if (TREE_CODE (decl) == FUNCTION_DECL && DECL_CHAIN (decl) != NULL_TREE)
1621: {
1622: /* Need a fresh node here so that we don't get circularity
1623: when we link these together. */
1624: decl = copy_node (decl);
1625: }
1626:
1627: if (decl == void_type_node
1628: || (TREE_CODE (decl) == FUNCTION_DECL
1629: && TREE_CODE (TREE_TYPE (decl)) != METHOD_TYPE))
1630: /* bunch of friends. */
1631: return decl;
1632:
1633: if (DECL_IN_AGGR_P (decl))
1634: {
1635: cp_error ("`%D' already defined in the class ", decl);
1636: return void_type_node;
1637: }
1638:
1639: finish_decl (decl, NULL_TREE, NULL_TREE, 0);
1640:
1641: /* If this declaration is common to another declaration
1642: complain about such redundancy, and return NULL_TREE
1643: so that we don't build a circular list. */
1644: if (DECL_CHAIN (decl))
1645: {
1646: cp_error ("function `%D' declared twice in class %T", decl,
1647: DECL_CONTEXT (decl));
1648: return NULL_TREE;
1649: }
1650: DECL_IN_AGGR_P (decl) = 1;
1651: return decl;
1652: }
1653: #endif
1654:
1655: tree
1656: grokoptypename (declspecs, declarator)
1657: tree declspecs, declarator;
1658: {
1659: tree t = grokdeclarator (declarator, declspecs, TYPENAME, 0, NULL_TREE);
1660: return build_typename_overload (t);
1661: }
1662:
1663: /* When a function is declared with an initializer,
1664: do the right thing. Currently, there are two possibilities:
1665:
1666: class B
1667: {
1668: public:
1669: // initialization possibility #1.
1670: virtual void f () = 0;
1671: int g ();
1672: };
1673:
1674: class D1 : B
1675: {
1676: public:
1677: int d1;
1678: // error, no f ();
1679: };
1680:
1681: class D2 : B
1682: {
1683: public:
1684: int d2;
1685: void f ();
1686: };
1687:
1688: class D3 : B
1689: {
1690: public:
1691: int d3;
1692: // initialization possibility #2
1693: void f () = B::f;
1694: };
1695:
1696: */
1697:
1698: int
1699: copy_assignment_arg_p (parmtype, virtualp)
1700: tree parmtype;
1701: int virtualp;
1702: {
1703: if (TREE_CODE (parmtype) == REFERENCE_TYPE)
1704: parmtype = TREE_TYPE (parmtype);
1705:
1706: if ((TYPE_MAIN_VARIANT (parmtype) == current_class_type)
1707: || (virtualp && DERIVED_FROM_P (parmtype, current_class_type)))
1708: return 1;
1709:
1710: return 0;
1711: }
1712:
1713: static void
1714: grok_function_init (decl, init)
1715: tree decl;
1716: tree init;
1717: {
1718: /* An initializer for a function tells how this function should
1719: be inherited. */
1720: tree type = TREE_TYPE (decl);
1721:
1722: if (TREE_CODE (type) == FUNCTION_TYPE)
1723: cp_error ("initializer specified for non-member function `%D'", decl);
1724: else if (DECL_VINDEX (decl) == NULL_TREE)
1725: cp_error ("initializer specified for non-virtual method `%D'", decl);
1726: else if (integer_zerop (init))
1727: {
1728: #if 0
1729: /* Mark this function as being "defined". */
1730: DECL_INITIAL (decl) = error_mark_node;
1731: /* pure virtual destructors must be defined. */
1732: /* pure virtual needs to be defined (as abort) only when put in
1733: vtbl. For wellformed call, it should be itself. pr4737 */
1734: if (!DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (decl)))
1735: {
1736: extern tree abort_fndecl;
1737: /* Give this node rtl from `abort'. */
1738: DECL_RTL (decl) = DECL_RTL (abort_fndecl);
1739: }
1740: #endif
1741: DECL_ABSTRACT_VIRTUAL_P (decl) = 1;
1742: if (DECL_NAME (decl) == ansi_opname [(int) MODIFY_EXPR])
1743: {
1744: tree parmtype
1745: = TREE_VALUE (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (decl))));
1746:
1747: if (copy_assignment_arg_p (parmtype, 1))
1748: TYPE_HAS_ABSTRACT_ASSIGN_REF (current_class_type) = 1;
1749: }
1750: }
1751: else if (TREE_CODE (init) == OFFSET_REF
1752: && TREE_OPERAND (init, 0) == NULL_TREE
1753: && TREE_CODE (TREE_TYPE (init)) == METHOD_TYPE)
1754: {
1755: tree basetype = DECL_CLASS_CONTEXT (init);
1756: tree basefn = TREE_OPERAND (init, 1);
1757: if (TREE_CODE (basefn) != FUNCTION_DECL)
1758: cp_error ("non-method initializer invalid for method `%D'", decl);
1759: else if (! BINFO_OFFSET_ZEROP (TYPE_BINFO (DECL_CLASS_CONTEXT (basefn))))
1760: sorry ("base member function from other than first base class");
1761: else
1762: {
1763: tree binfo = get_binfo (basetype, TYPE_METHOD_BASETYPE (type), 1);
1764: if (binfo == error_mark_node)
1765: ;
1766: else if (binfo == 0)
1767: error_not_base_type (TYPE_METHOD_BASETYPE (TREE_TYPE (init)),
1768: TYPE_METHOD_BASETYPE (type));
1769: else
1770: {
1771: /* Mark this function as being defined,
1772: and give it new rtl. */
1773: DECL_INITIAL (decl) = error_mark_node;
1774: DECL_RTL (decl) = DECL_RTL (basefn);
1775: }
1776: }
1777: }
1778: else
1779: cp_error ("invalid initializer for virtual method `%D'", decl);
1780: }
1781:
1782: /* When we get a declaration of the form
1783:
1784: type cname::fname ...
1785:
1786: the node for `cname::fname' gets built here in a special way.
1787: Namely, we push into `cname's scope. When this declaration is
1788: processed, we pop back out. */
1789: tree
1790: build_push_scope (cname, name)
1791: tree cname;
1792: tree name;
1793: {
1794: extern int current_class_depth;
1795: tree ctype, rval;
1796: int is_ttp = 0;
1797:
1798: if (cname == error_mark_node)
1799: return error_mark_node;
1800:
1801: ctype = IDENTIFIER_TYPE_VALUE (cname);
1802:
1803: if (TREE_CODE (ctype) == TEMPLATE_TYPE_PARM)
1804: is_ttp = 1;
1805: else if (ctype == NULL_TREE || ! IS_AGGR_TYPE (ctype))
1806: {
1807: cp_error ("`%T' not defined as aggregate type", cname);
1808: return name;
1809: }
1810: else if (IS_SIGNATURE (ctype))
1811: {
1812: error ("cannot push into signature scope, scope resolution operator ignored");
1813: return name;
1814: }
1815:
1816: rval = build_parse_node (SCOPE_REF, cname, name);
1817:
1818: /* Don't need to push the scope if we're already in it.
1819: We also don't need to push the scope for a ptr-to-member/method. */
1820:
1821: if (ctype == current_class_type || TREE_CODE (name) != IDENTIFIER_NODE
1822: || is_ttp)
1823: return rval;
1824:
1825: /* We do need to push the scope in this case, since CTYPE helps
1826: determine subsequent intializers (i.e., Foo::Bar x = foo_enum_1;). */
1827:
1828: push_nested_class (ctype, 3);
1829: TREE_COMPLEXITY (rval) = current_class_depth;
1830: return rval;
1831: }
1832:
1833: void cplus_decl_attributes (decl, attributes)
1834: tree decl, attributes;
1835: {
1836: if (decl && decl != void_type_node)
1837: decl_attributes (decl, attributes);
1838: }
1839:
1840: /* CONSTRUCTOR_NAME:
1841: Return the name for the constructor (or destructor) for the
1842: specified class. Argument can be RECORD_TYPE, TYPE_DECL, or
1843: IDENTIFIER_NODE. When given a template, this routine doesn't
1844: lose the specialization. */
1845: tree
1846: constructor_name_full (thing)
1847: tree thing;
1848: {
1849: if (TREE_CODE (thing) == UNINSTANTIATED_P_TYPE)
1850: return DECL_NAME (UPT_TEMPLATE (thing));
1851: if (IS_AGGR_TYPE_CODE (TREE_CODE (thing)))
1852: {
1853: if (TYPE_WAS_ANONYMOUS (thing) && TYPE_HAS_CONSTRUCTOR (thing))
1854: thing = DECL_NAME (TREE_VEC_ELT (TYPE_METHODS (thing), 0));
1855: else
1856: thing = TYPE_NAME (thing);
1857: }
1858: if (TREE_CODE (thing) == TYPE_DECL
1859: || (TREE_CODE (thing) == TEMPLATE_DECL
1860: && DECL_TEMPLATE_IS_CLASS (thing)))
1861: thing = DECL_NAME (thing);
1862: my_friendly_assert (TREE_CODE (thing) == IDENTIFIER_NODE, 197);
1863: return thing;
1864: }
1865:
1866: /* CONSTRUCTOR_NAME:
1867: Return the name for the constructor (or destructor) for the
1868: specified class. Argument can be RECORD_TYPE, TYPE_DECL, or
1869: IDENTIFIER_NODE. When given a template, return the plain
1870: unspecialized name. */
1871: tree
1872: constructor_name (thing)
1873: tree thing;
1874: {
1875: tree t;
1876: thing = constructor_name_full (thing);
1877: t = IDENTIFIER_TEMPLATE (thing);
1878: if (!t)
1879: return thing;
1880: t = TREE_PURPOSE (t);
1881: return DECL_NAME (t);
1882: }
1883:
1884: /* Cache the value of this class's main virtual function table pointer
1885: in a register variable. This will save one indirection if a
1886: more than one virtual function call is made this function. */
1887: void
1888: setup_vtbl_ptr ()
1889: {
1890: extern rtx base_init_insns;
1891:
1892: if (base_init_insns == 0
1893: && DECL_CONSTRUCTOR_P (current_function_decl))
1894: emit_base_init (current_class_type, 0);
1895:
1896: #if 0
1897: /* This has something a little wrong with it.
1898:
1899: On a sun4, code like:
1900:
1901: be L6
1902: ld [%i0],%o1
1903:
1904: is generated, when the below is used when -O4 is given. The delay
1905: slot it filled with an instruction that is safe, when this isn't
1906: used, like in:
1907:
1908: be L6
1909: sethi %hi(LC1),%o0
1910: ld [%i0],%o1
1911:
1912: on code like:
1913:
1914: struct A {
1915: virtual void print() { printf("xxx"); }
1916: void f();
1917: };
1918:
1919: void A::f() {
1920: if (this) {
1921: print();
1922: } else {
1923: printf("0");
1924: }
1925: }
1926:
1927: And that is why this is disabled for now. (mrs)
1928: */
1929:
1930: if ((flag_this_is_variable & 1) == 0
1931: && optimize
1932: && current_class_type
1933: && CLASSTYPE_VSIZE (current_class_type)
1934: && ! DECL_STATIC_FUNCTION_P (current_function_decl))
1935: {
1936: tree vfield = build_vfield_ref (C_C_D, current_class_type);
1937: current_vtable_decl = CLASSTYPE_VTBL_PTR (current_class_type);
1938: DECL_RTL (current_vtable_decl) = 0;
1939: DECL_INITIAL (current_vtable_decl) = error_mark_node;
1940: /* Have to cast the initializer, since it may have come from a
1941: more base class then we ascribe CURRENT_VTABLE_DECL to be. */
1942: finish_decl (current_vtable_decl, convert_force (TREE_TYPE (current_vtable_decl), vfield), 0, 0);
1943: current_vtable_decl = build_indirect_ref (current_vtable_decl, NULL_PTR);
1944: }
1945: else
1946: #endif
1947: current_vtable_decl = NULL_TREE;
1948: }
1949:
1950: /* Record the existence of an addressable inline function. */
1951: void
1952: mark_inline_for_output (decl)
1953: tree decl;
1954: {
1955: if (DECL_SAVED_INLINE (decl))
1956: return;
1957: DECL_SAVED_INLINE (decl) = 1;
1958: if (DECL_PENDING_INLINE_INFO (decl) != 0
1959: && ! DECL_PENDING_INLINE_INFO (decl)->deja_vu)
1960: {
1961: struct pending_inline *t = pending_inlines;
1962: my_friendly_assert (DECL_SAVED_INSNS (decl) == 0, 198);
1963: while (t)
1964: {
1965: if (t == DECL_PENDING_INLINE_INFO (decl))
1966: break;
1967: t = t->next;
1968: }
1969: if (t == 0)
1970: {
1971: t = DECL_PENDING_INLINE_INFO (decl);
1972: t->next = pending_inlines;
1973: pending_inlines = t;
1974: }
1975: DECL_PENDING_INLINE_INFO (decl) = 0;
1976: }
1977: saved_inlines = perm_tree_cons (NULL_TREE, decl, saved_inlines);
1978: }
1979:
1980: void
1981: clear_temp_name ()
1982: {
1983: temp_name_counter = 0;
1984: }
1985:
1986: /* Hand off a unique name which can be used for variable we don't really
1987: want to know about anyway, for example, the anonymous variables which
1988: are needed to make references work. Declare this thing so we can use it.
1989: The variable created will be of type TYPE.
1990:
1991: STATICP is nonzero if this variable should be static. */
1992:
1993: tree
1994: get_temp_name (type, staticp)
1995: tree type;
1996: int staticp;
1997: {
1998: char buf[sizeof (AUTO_TEMP_FORMAT) + 20];
1999: tree decl;
2000: int toplev = global_bindings_p ();
2001:
2002: push_obstacks_nochange ();
2003: if (toplev || staticp)
2004: {
2005: end_temporary_allocation ();
2006: sprintf (buf, AUTO_TEMP_FORMAT, global_temp_name_counter++);
2007: decl = pushdecl_top_level (build_decl (VAR_DECL, get_identifier (buf), type));
2008: }
2009: else
2010: {
2011: sprintf (buf, AUTO_TEMP_FORMAT, temp_name_counter++);
2012: decl = pushdecl (build_decl (VAR_DECL, get_identifier (buf), type));
2013: }
2014: TREE_USED (decl) = 1;
2015: TREE_STATIC (decl) = staticp;
2016:
2017: /* If this is a local variable, then lay out its rtl now.
2018: Otherwise, callers of this function are responsible for dealing
2019: with this variable's rtl. */
2020: if (! toplev)
2021: {
2022: expand_decl (decl);
2023: expand_decl_init (decl);
2024: }
2025: pop_obstacks ();
2026:
2027: return decl;
2028: }
2029:
2030: /* Get a variable which we can use for multiple assignments.
2031: It is not entered into current_binding_level, because
2032: that breaks things when it comes time to do final cleanups
2033: (which take place "outside" the binding contour of the function). */
2034: tree
2035: get_temp_regvar (type, init)
2036: tree type, init;
2037: {
2038: static char buf[sizeof (AUTO_TEMP_FORMAT) + 20] = { '_' };
2039: tree decl;
2040:
2041: sprintf (buf+1, AUTO_TEMP_FORMAT, temp_name_counter++);
2042: decl = build_decl (VAR_DECL, get_identifier (buf), type);
2043: TREE_USED (decl) = 1;
2044: DECL_REGISTER (decl) = 1;
2045:
2046: if (init)
2047: store_init_value (decl, init);
2048:
2049: /* We can expand these without fear, since they cannot need
2050: constructors or destructors. */
2051: expand_decl (decl);
2052: expand_decl_init (decl);
2053:
2054: if (type_needs_gc_entry (type))
2055: DECL_GC_OFFSET (decl) = size_int (++current_function_obstack_index);
2056:
2057: return decl;
2058: }
2059:
2060: /* Make the macro TEMP_NAME_P available to units which do not
2061: include c-tree.h. */
2062: int
2063: temp_name_p (decl)
2064: tree decl;
2065: {
2066: return TEMP_NAME_P (decl);
2067: }
2068:
2069: /* Finish off the processing of a UNION_TYPE structure.
2070: If there are static members, then all members are
2071: static, and must be laid out together. If the
2072: union is an anonymous union, we arrange for that
2073: as well. PUBLIC_P is nonzero if this union is
2074: not declared static. */
2075: void
2076: finish_anon_union (anon_union_decl)
2077: tree anon_union_decl;
2078: {
2079: tree type = TREE_TYPE (anon_union_decl);
2080: tree field, main_decl = NULL_TREE;
2081: tree elems = NULL_TREE;
2082: int public_p = TREE_PUBLIC (anon_union_decl);
2083: int static_p = TREE_STATIC (anon_union_decl);
2084: int external_p = DECL_EXTERNAL (anon_union_decl);
2085:
2086: if ((field = TYPE_FIELDS (type)) == NULL_TREE)
2087: return;
2088:
2089: if (public_p)
2090: {
2091: error ("global anonymous unions must be declared static");
2092: return;
2093: }
2094:
2095: for (; field; field = TREE_CHAIN (field))
2096: {
2097: tree decl;
2098: if (TREE_CODE (field) != FIELD_DECL)
2099: continue;
2100:
2101: decl = build_decl (VAR_DECL, DECL_NAME (field), TREE_TYPE (field));
2102: /* tell `pushdecl' that this is not tentative. */
2103: DECL_INITIAL (decl) = error_mark_node;
2104: TREE_PUBLIC (decl) = public_p;
2105: TREE_STATIC (decl) = static_p;
2106: DECL_EXTERNAL (decl) = external_p;
2107: decl = pushdecl (decl);
2108:
2109: /* Only write out one anon union element--choose the one that
2110: can hold them all. */
2111: if (main_decl == NULL_TREE
2112: && simple_cst_equal (DECL_SIZE (decl), DECL_SIZE (anon_union_decl)))
2113: {
2114: main_decl = decl;
2115: }
2116: else
2117: {
2118: /* ??? This causes there to be no debug info written out
2119: about this decl. */
2120: TREE_ASM_WRITTEN (decl) = 1;
2121: }
2122:
2123: DECL_INITIAL (decl) = NULL_TREE;
2124: /* If there's a cleanup to do, it belongs in the
2125: TREE_PURPOSE of the following TREE_LIST. */
2126: elems = tree_cons (NULL_TREE, decl, elems);
2127: TREE_TYPE (elems) = type;
2128: }
2129: if (static_p)
2130: {
2131: if (main_decl)
2132: {
2133: make_decl_rtl (main_decl, 0, global_bindings_p ());
2134: DECL_RTL (anon_union_decl) = DECL_RTL (main_decl);
2135: }
2136: else
2137: {
2138: warning ("anonymous union with no members");
2139: return;
2140: }
2141: }
2142:
2143: /* The following call assumes that there are never any cleanups
2144: for anonymous unions--a reasonable assumption. */
2145: expand_anon_union_decl (anon_union_decl, NULL_TREE, elems);
2146:
2147: if (flag_cadillac)
2148: cadillac_finish_anon_union (anon_union_decl);
2149: }
2150:
2151: /* Finish and output a table which is generated by the compiler.
2152: NAME is the name to give the table.
2153: TYPE is the type of the table entry.
2154: INIT is all the elements in the table.
2155: PUBLICP is non-zero if this table should be given external access. */
2156: tree
2157: finish_table (name, type, init, publicp)
2158: tree name, type, init;
2159: int publicp;
2160: {
2161: tree itype, atype, decl;
2162: static tree empty_table;
2163: int is_empty = 0;
2164: tree asmspec;
2165:
2166: itype = build_index_type (size_int (list_length (init) - 1));
2167: atype = build_cplus_array_type (type, itype);
2168: layout_type (atype);
2169:
2170: if (TREE_VALUE (init) == integer_zero_node
2171: && TREE_CHAIN (init) == NULL_TREE)
2172: {
2173: if (empty_table == NULL_TREE)
2174: {
2175: empty_table = get_temp_name (atype, 1);
2176: init = build (CONSTRUCTOR, atype, NULL_TREE, init);
2177: TREE_CONSTANT (init) = 1;
2178: TREE_STATIC (init) = 1;
2179: DECL_INITIAL (empty_table) = init;
2180: asmspec = build_string (IDENTIFIER_LENGTH (DECL_NAME (empty_table)),
2181: IDENTIFIER_POINTER (DECL_NAME (empty_table)));
2182: finish_decl (empty_table, init, asmspec, 0);
2183: }
2184: is_empty = 1;
2185: }
2186:
2187: if (name == NULL_TREE)
2188: {
2189: if (is_empty)
2190: return empty_table;
2191: decl = get_temp_name (atype, 1);
2192: }
2193: else
2194: {
2195: decl = build_decl (VAR_DECL, name, atype);
2196: decl = pushdecl (decl);
2197: TREE_STATIC (decl) = 1;
2198: }
2199:
2200: if (is_empty == 0)
2201: {
2202: TREE_PUBLIC (decl) = publicp;
2203: init = build (CONSTRUCTOR, atype, NULL_TREE, init);
2204: TREE_CONSTANT (init) = 1;
2205: TREE_STATIC (init) = 1;
2206: DECL_INITIAL (decl) = init;
2207: asmspec = build_string (IDENTIFIER_LENGTH (DECL_NAME (decl)),
2208: IDENTIFIER_POINTER (DECL_NAME (decl)));
2209: }
2210: else
2211: {
2212: /* This will cause DECL to point to EMPTY_TABLE in rtl-land. */
2213: DECL_EXTERNAL (decl) = 1;
2214: TREE_STATIC (decl) = 0;
2215: init = 0;
2216: asmspec = build_string (IDENTIFIER_LENGTH (DECL_NAME (empty_table)),
2217: IDENTIFIER_POINTER (DECL_NAME (empty_table)));
2218: }
2219:
2220: finish_decl (decl, init, asmspec, 0);
2221: return decl;
2222: }
2223:
2224: /* Finish processing a builtin type TYPE. It's name is NAME,
2225: its fields are in the array FIELDS. LEN is the number of elements
2226: in FIELDS minus one, or put another way, it is the maximum subscript
2227: used in FIELDS.
2228:
2229: It is given the same alignment as ALIGN_TYPE. */
2230: void
2231: finish_builtin_type (type, name, fields, len, align_type)
2232: tree type;
2233: char *name;
2234: tree fields[];
2235: int len;
2236: tree align_type;
2237: {
2238: register int i;
2239:
2240: TYPE_FIELDS (type) = fields[0];
2241: for (i = 0; i < len; i++)
2242: {
2243: layout_type (TREE_TYPE (fields[i]));
2244: DECL_FIELD_CONTEXT (fields[i]) = type;
2245: TREE_CHAIN (fields[i]) = fields[i+1];
2246: }
2247: DECL_FIELD_CONTEXT (fields[i]) = type;
2248: DECL_CLASS_CONTEXT (fields[i]) = type;
2249: TYPE_ALIGN (type) = TYPE_ALIGN (align_type);
2250: layout_type (type);
2251: #if 0 /* not yet, should get fixed properly later */
2252: TYPE_NAME (type) = make_type_decl (get_identifier (name), type);
2253: #else
2254: TYPE_NAME (type) = build_decl (TYPE_DECL, get_identifier (name), type);
2255: #endif
2256: layout_decl (TYPE_NAME (type), 0);
2257: }
2258:
2259: /* Auxiliary functions to make type signatures for
2260: `operator new' and `operator delete' correspond to
2261: what compiler will be expecting. */
2262:
2263: extern tree sizetype;
2264:
2265: tree
2266: coerce_new_type (type)
2267: tree type;
2268: {
2269: int e1 = 0, e2 = 0;
2270:
2271: if (TREE_CODE (type) == METHOD_TYPE)
2272: type = build_function_type (TREE_TYPE (type), TREE_CHAIN (TYPE_ARG_TYPES (type)));
2273: if (TREE_TYPE (type) != ptr_type_node)
2274: e1 = 1, error ("`operator new' must return type `void *'");
2275:
2276: /* Technically the type must be `size_t', but we may not know
2277: what that is. */
2278: if (TYPE_ARG_TYPES (type) == NULL_TREE)
2279: e1 = 1, error ("`operator new' takes type `size_t' parameter");
2280: else if (TREE_CODE (TREE_VALUE (TYPE_ARG_TYPES (type))) != INTEGER_TYPE
2281: || TYPE_PRECISION (TREE_VALUE (TYPE_ARG_TYPES (type))) != TYPE_PRECISION (sizetype))
2282: e2 = 1, error ("`operator new' takes type `size_t' as first parameter");
2283: if (e2)
2284: type = build_function_type (ptr_type_node, tree_cons (NULL_TREE, sizetype, TREE_CHAIN (TYPE_ARG_TYPES (type))));
2285: else if (e1)
2286: type = build_function_type (ptr_type_node, TYPE_ARG_TYPES (type));
2287: return type;
2288: }
2289:
2290: tree
2291: coerce_delete_type (type)
2292: tree type;
2293: {
2294: int e1 = 0, e2 = 0, e3 = 0;
2295: tree arg_types = TYPE_ARG_TYPES (type);
2296:
2297: if (TREE_CODE (type) == METHOD_TYPE)
2298: {
2299: type = build_function_type (TREE_TYPE (type), TREE_CHAIN (arg_types));
2300: arg_types = TREE_CHAIN (arg_types);
2301: }
2302: if (TREE_TYPE (type) != void_type_node)
2303: e1 = 1, error ("`operator delete' must return type `void'");
2304: if (arg_types == NULL_TREE
2305: || TREE_VALUE (arg_types) != ptr_type_node)
2306: e2 = 1, error ("`operator delete' takes type `void *' as first parameter");
2307:
2308: if (arg_types
2309: && TREE_CHAIN (arg_types)
2310: && TREE_CHAIN (arg_types) != void_list_node)
2311: {
2312: /* Again, technically this argument must be `size_t', but again
2313: we may not know what that is. */
2314: tree t2 = TREE_VALUE (TREE_CHAIN (arg_types));
2315: if (TREE_CODE (t2) != INTEGER_TYPE
2316: || TYPE_PRECISION (t2) != TYPE_PRECISION (sizetype))
2317: e3 = 1, error ("second argument to `operator delete' must be of type `size_t'");
2318: else if (TREE_CHAIN (TREE_CHAIN (arg_types)) != void_list_node)
2319: {
2320: e3 = 1;
2321: if (TREE_CHAIN (TREE_CHAIN (arg_types)))
2322: error ("too many arguments in declaration of `operator delete'");
2323: else
2324: error ("`...' invalid in specification of `operator delete'");
2325: }
2326: }
2327: if (e3)
2328: arg_types = tree_cons (NULL_TREE, ptr_type_node, build_tree_list (NULL_TREE, sizetype));
2329: else if (e3 |= e2)
2330: {
2331: if (arg_types == NULL_TREE)
2332: arg_types = tree_cons (NULL_TREE, ptr_type_node, void_list_node);
2333: else
2334: arg_types = tree_cons (NULL_TREE, ptr_type_node, TREE_CHAIN (arg_types));
2335: }
2336: else e3 |= e1;
2337:
2338: if (e3)
2339: type = build_function_type (void_type_node, arg_types);
2340:
2341: return type;
2342: }
2343:
2344: static void
2345: mark_vtable_entries (decl)
2346: tree decl;
2347: {
2348: tree entries = TREE_CHAIN (CONSTRUCTOR_ELTS (DECL_INITIAL (decl)));
2349:
2350: if (flag_dossier)
2351: entries = TREE_CHAIN (entries);
2352:
2353: for (; entries; entries = TREE_CHAIN (entries))
2354: {
2355: tree fnaddr = FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (entries));
2356: tree fn = TREE_OPERAND (fnaddr, 0);
2357: TREE_ADDRESSABLE (fn) = 1;
2358: if (DECL_ABSTRACT_VIRTUAL_P (fn))
2359: {
2360: extern tree abort_fndecl;
2361: if (flag_vtable_thunks)
2362: fnaddr = TREE_VALUE (entries);
2363: TREE_OPERAND (fnaddr, 0) = abort_fndecl;
2364: }
2365: }
2366: }
2367:
2368: /* Set TREE_PUBLIC and/or TREE_EXTERN on the vtable DECL,
2369: based on TYPE and other static flags.
2370:
2371: Note that anything public is tagged TREE_PUBLIC, whether
2372: it's public in this file or in another one. */
2373:
2374: void
2375: import_export_vtable (decl, type)
2376: tree decl, type;
2377: {
2378: if (write_virtuals >= 2
2379: || CLASSTYPE_TEMPLATE_INSTANTIATION (type))
2380: {
2381: if (CLASSTYPE_INTERFACE_KNOWN (type))
2382: {
2383: TREE_PUBLIC (decl) = 1;
2384: DECL_EXTERNAL (decl) = ! CLASSTYPE_VTABLE_NEEDS_WRITING (type);
2385: }
2386: }
2387: else if (write_virtuals != 0)
2388: {
2389: TREE_PUBLIC (decl) = 1;
2390: if (write_virtuals < 0)
2391: DECL_EXTERNAL (decl) = 1;
2392: }
2393: }
2394:
2395: static void
2396: import_export_template (type)
2397: tree type;
2398: {
2399: if (CLASSTYPE_IMPLICIT_INSTANTIATION (type)
2400: && ! flag_implicit_templates
2401: && CLASSTYPE_INTERFACE_UNKNOWN (type))
2402: {
2403: SET_CLASSTYPE_INTERFACE_KNOWN (type);
2404: CLASSTYPE_INTERFACE_ONLY (type) = 1;
2405: CLASSTYPE_VTABLE_NEEDS_WRITING (type) = 0;
2406: }
2407: }
2408:
2409: static void
2410: finish_vtable_vardecl (prev, vars)
2411: tree prev, vars;
2412: {
2413: tree ctype = DECL_CONTEXT (vars);
2414: import_export_template (ctype);
2415: import_export_vtable (vars, ctype);
2416:
2417: if (flag_vtable_thunks && !CLASSTYPE_INTERFACE_KNOWN (ctype))
2418: {
2419: tree method;
2420: for (method = CLASSTYPE_METHODS (ctype); method != NULL_TREE;
2421: method = DECL_NEXT_METHOD (method))
2422: {
2423: if (DECL_VINDEX (method) != NULL_TREE && !DECL_SAVED_INSNS (method)
2424: && !DECL_ABSTRACT_VIRTUAL_P (method))
2425: {
2426: SET_CLASSTYPE_INTERFACE_KNOWN (ctype);
2427: CLASSTYPE_INTERFACE_ONLY (ctype) = DECL_EXTERNAL (method);
2428: TREE_PUBLIC (vars) = 1;
2429: DECL_EXTERNAL (vars) = DECL_EXTERNAL (method);
2430: break;
2431: }
2432: }
2433: }
2434:
2435: if (write_virtuals >= 0
2436: && ! DECL_EXTERNAL (vars) && (TREE_PUBLIC (vars) || TREE_USED (vars)))
2437: {
2438: extern tree the_null_vtable_entry;
2439:
2440: /* Stuff this virtual function table's size into
2441: `pfn' slot of `the_null_vtable_entry'. */
2442: tree nelts = array_type_nelts (TREE_TYPE (vars));
2443: if (flag_vtable_thunks)
2444: TREE_VALUE (CONSTRUCTOR_ELTS (DECL_INITIAL (vars))) = nelts;
2445: else
2446: SET_FNADDR_FROM_VTABLE_ENTRY (the_null_vtable_entry, nelts);
2447: /* Kick out the dossier before writing out the vtable. */
2448: if (flag_dossier)
2449: rest_of_decl_compilation (TREE_OPERAND (FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (TREE_CHAIN (CONSTRUCTOR_ELTS (DECL_INITIAL (vars))))), 0), 0, 1, 1);
2450:
2451: /* Write it out. */
2452: mark_vtable_entries (vars);
2453: if (TREE_TYPE (DECL_INITIAL (vars)) == 0)
2454: store_init_value (vars, DECL_INITIAL (vars));
2455:
2456: #ifdef DWARF_DEBUGGING_INFO
2457: if (write_symbols == DWARF_DEBUG)
2458: {
2459: /* Mark the VAR_DECL node representing the vtable itself as a
2460: "gratuitous" one, thereby forcing dwarfout.c to ignore it.
2461: It is rather important that such things be ignored because
2462: any effort to actually generate DWARF for them will run
2463: into trouble when/if we encounter code like:
2464:
2465: #pragma interface
2466: struct S { virtual void member (); };
2467:
2468: because the artificial declaration of the vtable itself (as
2469: manufactured by the g++ front end) will say that the vtable
2470: is a static member of `S' but only *after* the debug output
2471: for the definition of `S' has already been output. This causes
2472: grief because the DWARF entry for the definition of the vtable
2473: will try to refer back to an earlier *declaration* of the
2474: vtable as a static member of `S' and there won't be one.
2475: We might be able to arrange to have the "vtable static member"
2476: attached to the member list for `S' before the debug info for
2477: `S' get written (which would solve the problem) but that would
2478: require more intrusive changes to the g++ front end. */
2479:
2480: DECL_IGNORED_P (vars) = 1;
2481: }
2482: #endif /* DWARF_DEBUGGING_INFO */
2483:
2484: rest_of_decl_compilation (vars, NULL_PTR, 1, 1);
2485: }
2486: else if (TREE_USED (vars) && flag_vtable_thunks)
2487: assemble_external (vars);
2488: /* We know that PREV must be non-zero here. */
2489: TREE_CHAIN (prev) = TREE_CHAIN (vars);
2490: }
2491:
2492: void
2493: walk_vtables (typedecl_fn, vardecl_fn)
2494: register void (*typedecl_fn)();
2495: register void (*vardecl_fn)();
2496: {
2497: tree prev, vars;
2498:
2499: for (prev = 0, vars = getdecls (); vars; vars = TREE_CHAIN (vars))
2500: {
2501: register tree type = TREE_TYPE (vars);
2502:
2503: if (TREE_CODE (vars) == TYPE_DECL
2504: && type != error_mark_node
2505: && TYPE_LANG_SPECIFIC (type)
2506: && CLASSTYPE_VSIZE (type))
2507: {
2508: if (typedecl_fn) (*typedecl_fn) (prev, vars);
2509: }
2510: else if (TREE_CODE (vars) == VAR_DECL && DECL_VIRTUAL_P (vars))
2511: {
2512: if (vardecl_fn) (*vardecl_fn) (prev, vars);
2513: }
2514: else
2515: prev = vars;
2516: }
2517: }
2518:
2519: static void
2520: finish_sigtable_vardecl (prev, vars)
2521: tree prev, vars;
2522: {
2523: /* We don't need to mark sigtable entries as addressable here as is done
2524: for vtables. Since sigtables, unlike vtables, are always written out,
2525: that was already done in build_signature_table_constructor. */
2526:
2527: rest_of_decl_compilation (vars, NULL_PTR, 1, 1);
2528:
2529: /* We know that PREV must be non-zero here. */
2530: TREE_CHAIN (prev) = TREE_CHAIN (vars);
2531: }
2532:
2533: void
2534: walk_sigtables (typedecl_fn, vardecl_fn)
2535: register void (*typedecl_fn)();
2536: register void (*vardecl_fn)();
2537: {
2538: tree prev, vars;
2539:
2540: for (prev = 0, vars = getdecls (); vars; vars = TREE_CHAIN (vars))
2541: {
2542: register tree type = TREE_TYPE (vars);
2543:
2544: if (TREE_CODE (vars) == TYPE_DECL
2545: && type != error_mark_node
2546: && IS_SIGNATURE (type))
2547: {
2548: if (typedecl_fn) (*typedecl_fn) (prev, vars);
2549: }
2550: else if (TREE_CODE (vars) == VAR_DECL
2551: && TREE_TYPE (vars) != error_mark_node
2552: && IS_SIGNATURE (TREE_TYPE (vars)))
2553: {
2554: if (vardecl_fn) (*vardecl_fn) (prev, vars);
2555: }
2556: else
2557: prev = vars;
2558: }
2559: }
2560:
2561: /* Determines the proper settings of TREE_PUBLIC and DECL_EXTERNAL for an
2562: inline function at end-of-file. */
2563:
2564: void
2565: import_export_inline (decl)
2566: tree decl;
2567: {
2568: if (TREE_PUBLIC (decl))
2569: return;
2570:
2571: /* If an explicit instantiation doesn't have TREE_PUBLIC set, it was with
2572: 'extern'. */
2573: if (DECL_EXPLICIT_INSTANTIATION (decl)
2574: || (DECL_IMPLICIT_INSTANTIATION (decl) && ! flag_implicit_templates))
2575: {
2576: TREE_PUBLIC (decl) = 1;
2577: DECL_EXTERNAL (decl) = 1;
2578: }
2579: else if (DECL_FUNCTION_MEMBER_P (decl))
2580: {
2581: tree ctype = DECL_CLASS_CONTEXT (decl);
2582: if (CLASSTYPE_INTERFACE_KNOWN (ctype))
2583: {
2584: TREE_PUBLIC (decl) = 1;
2585: DECL_EXTERNAL (decl)
2586: = (CLASSTYPE_INTERFACE_ONLY (ctype)
2587: || (DECL_INLINE (decl) && ! flag_implement_inlines));
2588: }
2589: }
2590: }
2591:
2592: extern int parse_time, varconst_time;
2593:
2594: #define TIMEVAR(VAR, BODY) \
2595: do { int otime = get_run_time (); BODY; VAR += get_run_time () - otime; } while (0)
2596:
2597: /* This routine is called from the last rule in yyparse ().
2598: Its job is to create all the code needed to initialize and
2599: destroy the global aggregates. We do the destruction
2600: first, since that way we only need to reverse the decls once. */
2601:
2602: void
2603: finish_file ()
2604: {
2605: extern int lineno;
2606: int start_time, this_time;
2607:
2608: tree fnname;
2609: tree vars = static_aggregates;
2610: int needs_cleaning = 0, needs_messing_up = 0;
2611: int have_exception_handlers = build_exception_table ();
2612:
2613: if (flag_detailed_statistics)
2614: dump_tree_statistics ();
2615:
2616: /* Bad parse errors. Just forget about it. */
2617: if (! global_bindings_p () || current_class_type)
2618: return;
2619:
2620: start_time = get_run_time ();
2621:
2622: /* Push into C language context, because that's all
2623: we'll need here. */
2624: push_lang_context (lang_name_c);
2625:
2626: /* Set up the name of the file-level functions we may need. */
2627: /* Use a global object (which is already required to be unique over
2628: the program) rather than the file name (which imposes extra
2629: constraints). -- [email protected], 10 Jan 1990. */
2630:
2631: /* See if we really need the hassle. */
2632: while (vars && needs_cleaning == 0)
2633: {
2634: tree decl = TREE_VALUE (vars);
2635: tree type = TREE_TYPE (decl);
2636: if (TYPE_NEEDS_DESTRUCTOR (type))
2637: {
2638: needs_cleaning = 1;
2639: needs_messing_up = 1;
2640: break;
2641: }
2642: else
2643: needs_messing_up |= TYPE_NEEDS_CONSTRUCTING (type);
2644: vars = TREE_CHAIN (vars);
2645: }
2646: if (needs_cleaning == 0)
2647: goto mess_up;
2648:
2649: /* Otherwise, GDB can get confused, because in only knows
2650: about source for LINENO-1 lines. */
2651: lineno -= 1;
2652:
2653: fnname = get_file_function_name ('D');
2654: start_function (void_list_node, build_parse_node (CALL_EXPR, fnname, void_list_node, NULL_TREE), 0, 0);
2655: fnname = DECL_ASSEMBLER_NAME (current_function_decl);
2656: store_parm_decls ();
2657:
2658: pushlevel (0);
2659: clear_last_expr ();
2660: push_momentary ();
2661: expand_start_bindings (0);
2662:
2663: /* These must be done in backward order to destroy,
2664: in which they happen to be! */
2665: while (vars)
2666: {
2667: tree decl = TREE_VALUE (vars);
2668: tree type = TREE_TYPE (decl);
2669: tree temp = TREE_PURPOSE (vars);
2670:
2671: if (TYPE_NEEDS_DESTRUCTOR (type))
2672: {
2673: if (TREE_STATIC (vars))
2674: expand_start_cond (build_binary_op (NE_EXPR, temp, integer_zero_node, 1), 0);
2675: if (TREE_CODE (type) == ARRAY_TYPE)
2676: temp = decl;
2677: else
2678: {
2679: mark_addressable (decl);
2680: temp = build1 (ADDR_EXPR, TYPE_POINTER_TO (type), decl);
2681: }
2682: temp = build_delete (TREE_TYPE (temp), temp,
2683: integer_two_node, LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0);
2684: expand_expr_stmt (temp);
2685:
2686: if (TREE_STATIC (vars))
2687: expand_end_cond ();
2688: }
2689: vars = TREE_CHAIN (vars);
2690: }
2691:
2692: expand_end_bindings (getdecls(), 1, 0);
2693: poplevel (1, 0, 0);
2694: pop_momentary ();
2695:
2696: finish_function (lineno, 0);
2697:
2698: assemble_destructor (IDENTIFIER_POINTER (fnname));
2699:
2700: /* if it needed cleaning, then it will need messing up: drop through */
2701:
2702: mess_up:
2703: /* Must do this while we think we are at the top level. */
2704: vars = nreverse (static_aggregates);
2705: if (vars != NULL_TREE || have_exception_handlers)
2706: {
2707: fnname = get_file_function_name ('I');
2708: start_function (void_list_node, build_parse_node (CALL_EXPR, fnname, void_list_node, NULL_TREE), 0, 0);
2709: fnname = DECL_ASSEMBLER_NAME (current_function_decl);
2710: store_parm_decls ();
2711:
2712: pushlevel (0);
2713: clear_last_expr ();
2714: push_momentary ();
2715: expand_start_bindings (0);
2716:
2717: if (have_exception_handlers)
2718: register_exception_table ();
2719:
2720: while (vars)
2721: {
2722: tree decl = TREE_VALUE (vars);
2723: tree init = TREE_PURPOSE (vars);
2724: tree old_cleanups = cleanups_this_call;
2725:
2726: /* If this was a static attribute within some function's scope,
2727: then don't initialize it here. Also, don't bother
2728: with initializers that contain errors. */
2729: if (TREE_STATIC (vars)
2730: || (init && TREE_CODE (init) == TREE_LIST
2731: && value_member (error_mark_node, init)))
2732: {
2733: vars = TREE_CHAIN (vars);
2734: continue;
2735: }
2736:
2737: if (TREE_CODE (decl) == VAR_DECL)
2738: {
2739: /* Set these global variables so that GDB at least puts
2740: us near the declaration which required the initialization. */
2741: input_filename = DECL_SOURCE_FILE (decl);
2742: lineno = DECL_SOURCE_LINE (decl);
2743: emit_note (input_filename, lineno);
2744:
2745: /* 9.5p5: The initializer of a static member of a class has
2746: the same acess rights as a member function. */
2747: DECL_CLASS_CONTEXT (current_function_decl) = DECL_CONTEXT (decl);
2748:
2749: if (init)
2750: {
2751: if (TREE_CODE (init) == VAR_DECL)
2752: {
2753: /* This behavior results when there are
2754: multiple declarations of an aggregate,
2755: the last of which defines it. */
2756: if (DECL_RTL (init) == DECL_RTL (decl))
2757: {
2758: my_friendly_assert (DECL_INITIAL (decl) == error_mark_node
2759: || (TREE_CODE (DECL_INITIAL (decl)) == CONSTRUCTOR
2760: && CONSTRUCTOR_ELTS (DECL_INITIAL (decl)) == NULL_TREE),
2761: 199);
2762: init = DECL_INITIAL (init);
2763: if (TREE_CODE (init) == CONSTRUCTOR
2764: && CONSTRUCTOR_ELTS (init) == NULL_TREE)
2765: init = NULL_TREE;
2766: }
2767: #if 0
2768: else if (TREE_TYPE (decl) == TREE_TYPE (init))
2769: {
2770: #if 1
2771: my_friendly_abort (200);
2772: #else
2773: /* point to real decl's rtl anyway. */
2774: DECL_RTL (init) = DECL_RTL (decl);
2775: my_friendly_assert (DECL_INITIAL (decl) == error_mark_node,
2776: 201);
2777: init = DECL_INITIAL (init);
2778: #endif /* 1 */
2779: }
2780: #endif /* 0 */
2781: }
2782: }
2783: if (IS_AGGR_TYPE (TREE_TYPE (decl))
2784: || TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
2785: expand_aggr_init (decl, init, 0);
2786: else if (TREE_CODE (init) == TREE_VEC)
2787: {
2788: expand_expr (expand_vec_init (decl, TREE_VEC_ELT (init, 0),
2789: TREE_VEC_ELT (init, 1),
2790: TREE_VEC_ELT (init, 2), 0),
2791: const0_rtx, VOIDmode, 0);
2792: free_temp_slots ();
2793: }
2794: else
2795: expand_assignment (decl, init, 0, 0);
2796:
2797: DECL_CLASS_CONTEXT (current_function_decl) = NULL_TREE;
2798: }
2799: else if (TREE_CODE (decl) == SAVE_EXPR)
2800: {
2801: if (! PARM_DECL_EXPR (decl))
2802: {
2803: /* a `new' expression at top level. */
2804: expand_expr (decl, const0_rtx, VOIDmode, 0);
2805: free_temp_slots ();
2806: expand_aggr_init (build_indirect_ref (decl, NULL_PTR), init, 0);
2807: }
2808: }
2809: else if (decl == error_mark_node)
2810: ;
2811: else my_friendly_abort (22);
2812: vars = TREE_CHAIN (vars);
2813: /* Cleanup any temporaries needed for the initial value. */
2814: expand_cleanups_to (old_cleanups);
2815: }
2816:
2817: expand_end_bindings (getdecls(), 1, 0);
2818: poplevel (1, 0, 0);
2819: pop_momentary ();
2820:
2821: finish_function (lineno, 0);
2822: assemble_constructor (IDENTIFIER_POINTER (fnname));
2823: }
2824:
2825: /* Done with C language context needs. */
2826: pop_lang_context ();
2827:
2828: /* Now write out any static class variables (which may have since
2829: learned how to be initialized). */
2830: while (pending_statics)
2831: {
2832: tree decl = TREE_VALUE (pending_statics);
2833: if (TREE_USED (decl) == 1
2834: || TREE_READONLY (decl) == 0
2835: || DECL_INITIAL (decl) == 0)
2836: rest_of_decl_compilation (decl, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), 1, 1);
2837: pending_statics = TREE_CHAIN (pending_statics);
2838: }
2839:
2840: this_time = get_run_time ();
2841: parse_time -= this_time - start_time;
2842: varconst_time += this_time - start_time;
2843:
2844: start_time = get_run_time ();
2845:
2846: /* Now delete from the chain of variables all virtual function tables.
2847: We output them all ourselves, because each will be treated specially. */
2848:
2849: #if 1
2850: /* The reason for pushing garbage onto the global_binding_level is to
2851: ensure that we can slice out _DECLs which pertain to virtual function
2852: tables. If the last thing pushed onto the global_binding_level was a
2853: virtual function table, then slicing it out would slice away all the
2854: decls (i.e., we lose the head of the chain).
2855:
2856: There are several ways of getting the same effect, from changing the
2857: way that iterators over the chain treat the elements that pertain to
2858: virtual function tables, moving the implementation of this code to
2859: decl.c (where we can manipulate global_binding_level directly),
2860: popping the garbage after pushing it and slicing away the vtable
2861: stuff, or just leaving it alone. */
2862:
2863: /* Make last thing in global scope not be a virtual function table. */
2864: #if 0 /* not yet, should get fixed properly later */
2865: vars = make_type_decl (get_identifier (" @%$#@!"), integer_type_node);
2866: #else
2867: vars = build_decl (TYPE_DECL, get_identifier (" @%$#@!"), integer_type_node);
2868: #endif
2869: DECL_IGNORED_P (vars) = 1;
2870: SET_DECL_ARTIFICIAL (vars);
2871: pushdecl (vars);
2872: #endif
2873:
2874: walk_vtables ((void (*)())0, finish_vtable_vardecl);
2875: if (flag_handle_signatures)
2876: walk_sigtables ((void (*)())0, finish_sigtable_vardecl);
2877:
2878: for (vars = getdecls (); vars; vars = TREE_CHAIN (vars))
2879: {
2880: if (TREE_CODE (vars) == THUNK_DECL)
2881: emit_thunk (vars);
2882: }
2883:
2884: {
2885: int reconsider = 0; /* More may be referenced; check again */
2886: tree delayed = NULL_TREE; /* These might be referenced later */
2887:
2888: /* Now write out inline functions which had their addresses taken and
2889: which were not declared virtual and which were not declared `extern
2890: inline'. */
2891: while (saved_inlines)
2892: {
2893: tree decl = TREE_VALUE (saved_inlines);
2894: saved_inlines = TREE_CHAIN (saved_inlines);
2895: /* Redefinition of a member function can cause DECL_SAVED_INSNS to be
2896: 0; don't crash. */
2897: if (TREE_ASM_WRITTEN (decl) || DECL_SAVED_INSNS (decl) == 0)
2898: continue;
2899: import_export_inline (decl);
2900: if (TREE_PUBLIC (decl)
2901: || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
2902: || flag_keep_inline_functions)
2903: {
2904: if (DECL_EXTERNAL (decl))
2905: assemble_external (decl);
2906: else
2907: {
2908: reconsider = 1;
2909: temporary_allocation ();
2910: output_inline_function (decl);
2911: permanent_allocation (1);
2912: }
2913: }
2914: else if (TREE_USED (decl)
2915: || TREE_USED (DECL_ASSEMBLER_NAME (decl)))
2916: delayed = tree_cons (NULL_TREE, decl, delayed);
2917: }
2918:
2919: if (reconsider && delayed)
2920: {
2921: while (reconsider)
2922: {
2923: tree place;
2924: reconsider = 0;
2925: for (place = delayed; place; place = TREE_CHAIN (place))
2926: {
2927: tree decl = TREE_VALUE (place);
2928: if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
2929: && ! TREE_ASM_WRITTEN (decl))
2930: {
2931: if (DECL_EXTERNAL (decl))
2932: assemble_external (decl);
2933: else
2934: {
2935: reconsider = 1;
2936: temporary_allocation ();
2937: output_inline_function (decl);
2938: permanent_allocation (1);
2939: }
2940: }
2941: }
2942: }
2943: }
2944: }
2945:
2946: if (write_virtuals == 2)
2947: {
2948: /* Now complain about an virtual function tables promised
2949: but not delivered. */
2950: while (pending_vtables)
2951: {
2952: if (TREE_PURPOSE (pending_vtables) == NULL_TREE)
2953: error ("virtual function table for `%s' not defined",
2954: IDENTIFIER_POINTER (TREE_VALUE (pending_vtables)));
2955: pending_vtables = TREE_CHAIN (pending_vtables);
2956: }
2957: }
2958:
2959: permanent_allocation (1);
2960: this_time = get_run_time ();
2961: parse_time -= this_time - start_time;
2962: varconst_time += this_time - start_time;
2963:
2964: if (flag_detailed_statistics)
2965: dump_time_statistics ();
2966: }
2967:
2968: /* This is something of the form 'A()()()()()+1' that has turned out to be an
2969: expr. Since it was parsed like a type, we need to wade through and fix
2970: that. Unfortunately, since operator() is left-associative, we can't use
2971: tail recursion. In the above example, TYPE is `A', and DECL is
2972: `()()()()()'.
2973:
2974: Maybe this shouldn't be recursive, but how often will it actually be
2975: used? (jason) */
2976: tree
2977: reparse_absdcl_as_expr (type, decl)
2978: tree type, decl;
2979: {
2980: /* do build_functional_cast (type, NULL_TREE) at bottom */
2981: if (TREE_OPERAND (decl, 0) == NULL_TREE)
2982: return build_functional_cast (type, NULL_TREE);
2983:
2984: /* recurse */
2985: decl = reparse_decl_as_expr (type, TREE_OPERAND (decl, 0));
2986:
2987: decl = build_x_function_call (decl, NULL_TREE, current_class_decl);
2988:
2989: if (TREE_CODE (decl) == CALL_EXPR && TREE_TYPE (decl) != void_type_node)
2990: decl = require_complete_type (decl);
2991:
2992: return decl;
2993: }
2994:
2995: /* This is something of the form `int ((int)(int)(int)1)' that has turned
2996: out to be an expr. Since it was parsed like a type, we need to wade
2997: through and fix that. Since casts are right-associative, we are
2998: reversing the order, so we don't have to recurse.
2999:
3000: In the above example, DECL is the `(int)(int)(int)', and EXPR is the
3001: `1'. */
3002: tree
3003: reparse_absdcl_as_casts (decl, expr)
3004: tree decl, expr;
3005: {
3006: tree type;
3007:
3008: if (TREE_CODE (expr) == CONSTRUCTOR)
3009: {
3010: type = groktypename (TREE_VALUE (TREE_OPERAND (decl, 1)));
3011: decl = TREE_OPERAND (decl, 0);
3012:
3013: if (IS_SIGNATURE (type))
3014: {
3015: error ("cast specifies signature type");
3016: return error_mark_node;
3017: }
3018:
3019: expr = digest_init (type, expr, (tree *) 0);
3020: if (TREE_CODE (type) == ARRAY_TYPE && TYPE_SIZE (type) == 0)
3021: {
3022: int failure = complete_array_type (type, expr, 1);
3023: if (failure)
3024: my_friendly_abort (78);
3025: }
3026: }
3027:
3028: while (decl)
3029: {
3030: type = groktypename (TREE_VALUE (TREE_OPERAND (decl, 1)));
3031: decl = TREE_OPERAND (decl, 0);
3032: expr = build_c_cast (type, expr);
3033: }
3034:
3035: return expr;
3036: }
3037:
3038: /* Recursive helper function for reparse_decl_as_expr. It may be a good
3039: idea to reimplement this using an explicit stack, rather than recursion. */
3040: static tree
3041: reparse_decl_as_expr1 (decl)
3042: tree decl;
3043: {
3044: switch (TREE_CODE (decl))
3045: {
3046: case IDENTIFIER_NODE:
3047: return do_identifier (decl);
3048: case INDIRECT_REF:
3049: return build_x_indirect_ref
3050: (reparse_decl_as_expr1 (TREE_OPERAND (decl, 0)), "unary *");
3051: case ADDR_EXPR:
3052: return build_x_unary_op (ADDR_EXPR,
3053: reparse_decl_as_expr1 (TREE_OPERAND (decl, 0)));
3054: case BIT_NOT_EXPR:
3055: return build_x_unary_op (BIT_NOT_EXPR,
3056: reparse_decl_as_expr1 (TREE_OPERAND (decl, 0)));
3057: case SCOPE_REF:
3058: return build_offset_ref (TREE_OPERAND (decl, 0), TREE_OPERAND (decl, 1));
3059: case ARRAY_REF:
3060: return grok_array_decl (reparse_decl_as_expr1 (TREE_OPERAND (decl, 0)),
3061: TREE_OPERAND (decl, 1));
3062: default:
3063: my_friendly_abort (5);
3064: return NULL_TREE;
3065: }
3066: }
3067:
3068: /* This is something of the form `int (*a)++' that has turned out to be an
3069: expr. It was only converted into parse nodes, so we need to go through
3070: and build up the semantics. Most of the work is done by
3071: reparse_decl_as_expr1, above.
3072:
3073: In the above example, TYPE is `int' and DECL is `*a'. */
3074: tree
3075: reparse_decl_as_expr (type, decl)
3076: tree type, decl;
3077: {
3078: decl = build_tree_list (NULL_TREE, reparse_decl_as_expr1 (decl));
3079: return build_functional_cast (type, decl);
3080: }
3081:
3082: /* This is something of the form `int (*a)' that has turned out to be a
3083: decl. It was only converted into parse nodes, so we need to do the
3084: checking that make_{pointer,reference}_declarator do. */
3085:
3086: tree
3087: finish_decl_parsing (decl)
3088: tree decl;
3089: {
3090: extern int current_class_depth;
3091:
3092: switch (TREE_CODE (decl))
3093: {
3094: case IDENTIFIER_NODE:
3095: return decl;
3096: case INDIRECT_REF:
3097: return make_pointer_declarator
3098: (NULL_TREE, finish_decl_parsing (TREE_OPERAND (decl, 0)));
3099: case ADDR_EXPR:
3100: return make_reference_declarator
3101: (NULL_TREE, finish_decl_parsing (TREE_OPERAND (decl, 0)));
3102: case BIT_NOT_EXPR:
3103: TREE_OPERAND (decl, 0) = finish_decl_parsing (TREE_OPERAND (decl, 0));
3104: return decl;
3105: case SCOPE_REF:
3106: push_nested_class (TREE_TYPE (TREE_OPERAND (decl, 0)), 3);
3107: TREE_COMPLEXITY (decl) = current_class_depth;
3108: return decl;
3109: case ARRAY_REF:
3110: TREE_OPERAND (decl, 0) = finish_decl_parsing (TREE_OPERAND (decl, 0));
3111: return decl;
3112: default:
3113: my_friendly_abort (5);
3114: return NULL_TREE;
3115: }
3116: }
3117:
3118: tree
3119: check_cp_case_value (value)
3120: tree value;
3121: {
3122: if (value == NULL_TREE)
3123: return value;
3124:
3125: /* build_c_cast puts on a NOP_EXPR to make a non-lvalue.
3126: Strip such NOP_EXPRs. */
3127: if (TREE_CODE (value) == NOP_EXPR
3128: && TREE_TYPE (value) == TREE_TYPE (TREE_OPERAND (value, 0)))
3129: value = TREE_OPERAND (value, 0);
3130:
3131: if (TREE_READONLY_DECL_P (value))
3132: {
3133: value = decl_constant_value (value);
3134: /* build_c_cast puts on a NOP_EXPR to make a non-lvalue.
3135: Strip such NOP_EXPRs. */
3136: if (TREE_CODE (value) == NOP_EXPR
3137: && TREE_TYPE (value) == TREE_TYPE (TREE_OPERAND (value, 0)))
3138: value = TREE_OPERAND (value, 0);
3139: }
3140: value = fold (value);
3141:
3142: if (TREE_CODE (value) != INTEGER_CST
3143: && value != error_mark_node)
3144: {
3145: cp_error ("case label `%E' does not reduce to an integer constant",
3146: value);
3147: value = error_mark_node;
3148: }
3149: else
3150: /* Promote char or short to int. */
3151: value = default_conversion (value);
3152:
3153: constant_expression_warning (value);
3154:
3155: return value;
3156: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.