4290f71b696cb364ada684d4300cf38c4f0451e3
[gcc.git] / gcc / cp / decl2.c
1 /* Process declarations and variables for C compiler.
2 Copyright (C) 1988, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
3 Hacked by Michael Tiemann (tiemann@cygnus.com)
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, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22
23 /* Process declarations and symbol lookup for C front end.
24 Also constructs types; the standard scalar types at initialization,
25 and structure, union, array and enum types when they are declared. */
26
27 /* ??? not all decl nodes are given the most useful possible
28 line numbers. For example, the CONST_DECLs for enum values. */
29
30 #include "config.h"
31 #include <stdio.h>
32 #include "tree.h"
33 #include "rtl.h"
34 #include "flags.h"
35 #include "cp-tree.h"
36 #include "decl.h"
37 #include "lex.h"
38 #include "output.h"
39 #include "except.h"
40 #include "expr.h"
41 #include "defaults.h"
42
43 #ifdef HAVE_STDLIB_H
44 #include <stdlib.h>
45 #endif
46
47 #ifdef HAVE_STRING_H
48 #include <string.h>
49 #endif
50
51 static tree get_sentry PROTO((tree));
52 static void mark_vtable_entries PROTO((tree));
53 static void import_export_template PROTO((tree));
54 static void grok_function_init PROTO((tree, tree));
55 static int finish_vtable_vardecl PROTO((tree, tree));
56 static int prune_vtable_vardecl PROTO((tree, tree));
57 static void finish_sigtable_vardecl PROTO((tree, tree));
58
59 extern int current_class_depth;
60
61 /* A list of virtual function tables we must make sure to write out. */
62 tree pending_vtables;
63
64 /* A list of static class variables. This is needed, because a
65 static class variable can be declared inside the class without
66 an initializer, and then initialized, staticly, outside the class. */
67 tree pending_statics;
68
69 /* A list of functions which were declared inline, but which we
70 may need to emit outline anyway. */
71 static tree saved_inlines;
72
73 /* Used to help generate temporary names which are unique within
74 a function. Reset to 0 by start_function. */
75
76 int temp_name_counter;
77
78 /* Same, but not reset. Local temp variables and global temp variables
79 can have the same name. */
80 static int global_temp_name_counter;
81
82 /* Flag used when debugging spew.c */
83
84 extern int spew_debug;
85
86 /* Nonzero if we're done parsing and into end-of-file activities. */
87
88 int at_eof;
89
90 /* Functions called along with real static constructors and destructors. */
91
92 tree static_ctors, static_dtors;
93 \f
94 /* C (and C++) language-specific option variables. */
95
96 /* Nonzero means allow type mismatches in conditional expressions;
97 just make their values `void'. */
98
99 int flag_cond_mismatch;
100
101 /* Nonzero means give `double' the same size as `float'. */
102
103 int flag_short_double;
104
105 /* Nonzero means don't recognize the keyword `asm'. */
106
107 int flag_no_asm;
108
109 /* Nonzero means don't recognize any extension keywords. */
110
111 int flag_no_gnu_keywords;
112
113 /* Nonzero means don't recognize the non-ANSI builtin functions. */
114
115 int flag_no_builtin;
116
117 /* Nonzero means don't recognize the non-ANSI builtin functions.
118 -ansi sets this. */
119
120 int flag_no_nonansi_builtin;
121
122 /* Nonzero means do some things the same way PCC does. Only provided so
123 the compiler will link. */
124
125 int flag_traditional;
126
127 /* Nonzero means to treat bitfields as unsigned unless they say `signed'. */
128
129 int flag_signed_bitfields = 1;
130
131 /* Nonzero means handle `#ident' directives. 0 means ignore them. */
132
133 int flag_no_ident;
134
135 /* Nonzero means enable obscure ANSI features and disable GNU extensions
136 that might cause ANSI-compliant code to be miscompiled. */
137
138 int flag_ansi;
139
140 /* Nonzero means do argument matching for overloading according to the
141 ANSI rules, rather than what g++ used to believe to be correct. */
142
143 int flag_ansi_overloading = 1;
144
145 /* Nonzero means do emit exported implementations of functions even if
146 they can be inlined. */
147
148 int flag_implement_inlines = 1;
149
150 /* Nonzero means do emit exported implementations of templates, instead of
151 multiple static copies in each file that needs a definition. */
152
153 int flag_external_templates;
154
155 /* Nonzero means that the decision to emit or not emit the implementation of a
156 template depends on where the template is instantiated, rather than where
157 it is defined. */
158
159 int flag_alt_external_templates;
160
161 /* Nonzero means that implicit instantiations will be emitted if needed. */
162
163 int flag_implicit_templates = 1;
164
165 /* Nonzero means warn about implicit declarations. */
166
167 int warn_implicit = 1;
168
169 /* Nonzero means warn when all ctors or dtors are private, and the class
170 has no friends. */
171
172 int warn_ctor_dtor_privacy = 1;
173
174 /* True if we want to implement vtables using "thunks".
175 The default is off. */
176
177 #ifndef DEFAULT_VTABLE_THUNKS
178 #define DEFAULT_VTABLE_THUNKS 0
179 #endif
180 int flag_vtable_thunks = DEFAULT_VTABLE_THUNKS;
181
182 /* True if we want to deal with repository information. */
183
184 int flag_use_repository;
185
186 /* Nonzero means give string constants the type `const char *'
187 to get extra warnings from them. These warnings will be too numerous
188 to be useful, except in thoroughly ANSIfied programs. */
189
190 int warn_write_strings;
191
192 /* Nonzero means warn about pointer casts that can drop a type qualifier
193 from the pointer target type. */
194
195 int warn_cast_qual;
196
197 /* Nonzero means warn that dbx info for template class methods isn't fully
198 supported yet. */
199
200 int warn_template_debugging;
201
202 /* Nonzero means warn about sizeof(function) or addition/subtraction
203 of function pointers. */
204
205 int warn_pointer_arith = 1;
206
207 /* Nonzero means warn for any function def without prototype decl. */
208
209 int warn_missing_prototypes;
210
211 /* Nonzero means warn about multiple (redundant) decls for the same single
212 variable or function. */
213
214 int warn_redundant_decls;
215
216 /* Warn if initializer is not completely bracketed. */
217
218 int warn_missing_braces;
219
220 /* Warn about comparison of signed and unsigned values. */
221
222 int warn_sign_compare;
223
224 /* Warn about *printf or *scanf format/argument anomalies. */
225
226 int warn_format;
227
228 /* Warn about a subscript that has type char. */
229
230 int warn_char_subscripts;
231
232 /* Warn if a type conversion is done that might have confusing results. */
233
234 int warn_conversion;
235
236 /* Warn if adding () is suggested. */
237
238 int warn_parentheses;
239
240 /* Non-zero means warn in function declared in derived class has the
241 same name as a virtual in the base class, but fails to match the
242 type signature of any virtual function in the base class. */
243 int warn_overloaded_virtual;
244
245 /* Non-zero means warn when declaring a class that has a non virtual
246 destructor, when it really ought to have a virtual one. */
247 int warn_nonvdtor;
248
249 /* Non-zero means warn when a function is declared extern and later inline. */
250 int warn_extern_inline;
251
252 /* Non-zero means warn when the compiler will reorder code. */
253 int warn_reorder;
254
255 /* Non-zero means warn when synthesis behavior differs from Cfront's. */
256 int warn_synth;
257
258 /* Non-zero means warn when we convert a pointer to member function
259 into a pointer to (void or function). */
260 int warn_pmf2ptr = 1;
261
262 /* Nonzero means warn about violation of some Effective C++ style rules. */
263
264 int warn_ecpp;
265
266 /* Nonzero means warn where overload resolution chooses a promotion from
267 unsigned to signed over a conversion to an unsigned of the same size. */
268
269 int warn_sign_promo;
270
271 /* Nonzero means warn when an old-style cast is used. */
272
273 int warn_old_style_cast;
274
275 /* Warn about #pragma directives that are not recognised. */
276
277 int warn_unknown_pragmas = 0; /* Tri state variable. */
278
279 /* Nonzero means `$' can be in an identifier. */
280
281 #ifndef DOLLARS_IN_IDENTIFIERS
282 #define DOLLARS_IN_IDENTIFIERS 1
283 #endif
284 int dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
285
286 /* Nonzero for -fno-strict-prototype switch: do not consider empty
287 argument prototype to mean function takes no arguments. */
288
289 int flag_strict_prototype = 2;
290 int strict_prototype = 1;
291 int strict_prototypes_lang_c, strict_prototypes_lang_cplusplus = 1;
292
293 /* Nonzero means that labels can be used as first-class objects */
294
295 int flag_labels_ok;
296
297 /* Non-zero means to collect statistics which might be expensive
298 and to print them when we are done. */
299 int flag_detailed_statistics;
300
301 /* C++ specific flags. */
302 /* Nonzero for -fall-virtual: make every member function (except
303 constructors) lay down in the virtual function table. Calls
304 can then either go through the virtual function table or not,
305 depending. */
306
307 int flag_all_virtual;
308
309 /* Zero means that `this' is a *const. This gives nice behavior in the
310 2.0 world. 1 gives 1.2-compatible behavior. 2 gives Spring behavior.
311 -2 means we're constructing an object and it has fixed type. */
312
313 int flag_this_is_variable;
314
315 /* Nonzero means memoize our member lookups. */
316
317 int flag_memoize_lookups; int flag_save_memoized_contexts;
318
319 /* 3 means write out only virtuals function tables `defined'
320 in this implementation file.
321 2 means write out only specific virtual function tables
322 and give them (C) public access.
323 1 means write out virtual function tables and give them
324 (C) public access.
325 0 means write out virtual function tables and give them
326 (C) static access (default).
327 -1 means declare virtual function tables extern. */
328
329 int write_virtuals;
330
331 /* Nonzero means we should attempt to elide constructors when possible.
332 FIXME: This flag is obsolete, and should be torn out along with the
333 old overloading code. */
334
335 int flag_elide_constructors;
336
337 /* Nonzero means recognize and handle signature language constructs. */
338
339 int flag_handle_signatures;
340
341 /* Nonzero means that member functions defined in class scope are
342 inline by default. */
343
344 int flag_default_inline = 1;
345
346 /* Controls whether enums and ints freely convert.
347 1 means with complete freedom.
348 0 means enums can convert to ints, but not vice-versa. */
349 int flag_int_enum_equivalence;
350
351 /* Controls whether compiler generates 'type descriptor' that give
352 run-time type information. */
353 int flag_rtti = 1;
354
355 /* Nonzero if we wish to output cross-referencing information
356 for the GNU class browser. */
357 extern int flag_gnu_xref;
358
359 /* Nonzero if compiler can make `reasonable' assumptions about
360 references and objects. For example, the compiler must be
361 conservative about the following and not assume that `a' is nonnull:
362
363 obj &a = g ();
364 a.f (2);
365
366 In general, it is `reasonable' to assume that for many programs,
367 and better code can be generated in that case. */
368
369 int flag_assume_nonnull_objects = 1;
370
371 /* Nonzero if we want to support huge (> 2^(sizeof(short)*8-1) bytes)
372 objects. */
373
374 int flag_huge_objects;
375
376 /* Nonzero if we want to conserve space in the .o files. We do this
377 by putting uninitialized data and runtime initialized data into
378 .common instead of .data at the expense of not flagging multiple
379 definitions. */
380
381 int flag_conserve_space;
382
383 /* Nonzero if we want to obey access control semantics. */
384
385 int flag_access_control = 1;
386
387 /* Nonzero if we want to understand the operator names, i.e. 'bitand'. */
388
389 int flag_operator_names;
390
391 /* Nonzero if we want to check the return value of new and avoid calling
392 constructors if it is a null pointer. */
393
394 int flag_check_new;
395
396 /* Nonzero if we want the new ANSI rules for pushing a new scope for `for'
397 initialization variables.
398 0: Old rules, set by -fno-for-scope.
399 2: New ANSI rules, set by -ffor-scope.
400 1: Try to implement new ANSI rules, but with backup compatibility
401 (and warnings). This is the default, for now. */
402
403 int flag_new_for_scope = 1;
404
405 /* Nonzero if we want to emit defined symbols with common-like linkage as
406 weak symbols where possible, in order to conform to C++ semantics.
407 Otherwise, emit them as local symbols. */
408
409 int flag_weak = 1;
410
411 /* Maximum template instantiation depth. Must be at least 17 for ANSI
412 compliance. */
413
414 int max_tinst_depth = 17;
415
416 /* The name-mangling scheme to use. Must be 1 or greater to support
417 template functions with identical types, but different template
418 arguments. */
419 int name_mangling_version = 1;
420
421 /* Nonzero means that guiding declarations are allowed. */
422 int flag_guiding_decls;
423
424 /* Table of language-dependent -f options.
425 STRING is the option name. VARIABLE is the address of the variable.
426 ON_VALUE is the value to store in VARIABLE
427 if `-fSTRING' is seen as an option.
428 (If `-fno-STRING' is seen as an option, the opposite value is stored.) */
429
430 static struct { char *string; int *variable; int on_value;} lang_f_options[] =
431 {
432 {"signed-char", &flag_signed_char, 1},
433 {"unsigned-char", &flag_signed_char, 0},
434 {"signed-bitfields", &flag_signed_bitfields, 1},
435 {"unsigned-bitfields", &flag_signed_bitfields, 0},
436 {"short-enums", &flag_short_enums, 1},
437 {"short-double", &flag_short_double, 1},
438 {"cond-mismatch", &flag_cond_mismatch, 1},
439 {"asm", &flag_no_asm, 0},
440 {"builtin", &flag_no_builtin, 0},
441 {"ident", &flag_no_ident, 0},
442 {"labels-ok", &flag_labels_ok, 1},
443 {"stats", &flag_detailed_statistics, 1},
444 {"this-is-variable", &flag_this_is_variable, 1},
445 {"strict-prototype", &flag_strict_prototype, 1},
446 {"all-virtual", &flag_all_virtual, 1},
447 {"memoize-lookups", &flag_memoize_lookups, 1},
448 {"elide-constructors", &flag_elide_constructors, 1},
449 {"handle-exceptions", &flag_exceptions, 1},
450 {"handle-signatures", &flag_handle_signatures, 1},
451 {"default-inline", &flag_default_inline, 1},
452 {"dollars-in-identifiers", &dollars_in_ident, 1},
453 {"enum-int-equiv", &flag_int_enum_equivalence, 1},
454 {"rtti", &flag_rtti, 1},
455 {"xref", &flag_gnu_xref, 1},
456 {"nonnull-objects", &flag_assume_nonnull_objects, 1},
457 {"implement-inlines", &flag_implement_inlines, 1},
458 {"external-templates", &flag_external_templates, 1},
459 {"implicit-templates", &flag_implicit_templates, 1},
460 {"ansi-overloading", &flag_ansi_overloading, 1},
461 {"huge-objects", &flag_huge_objects, 1},
462 {"conserve-space", &flag_conserve_space, 1},
463 {"vtable-thunks", &flag_vtable_thunks, 1},
464 {"access-control", &flag_access_control, 1},
465 {"nonansi-builtins", &flag_no_nonansi_builtin, 0},
466 {"gnu-keywords", &flag_no_gnu_keywords, 0},
467 {"operator-names", &flag_operator_names, 1},
468 {"check-new", &flag_check_new, 1},
469 {"repo", &flag_use_repository, 1},
470 {"for-scope", &flag_new_for_scope, 2},
471 {"weak", &flag_weak, 1}
472 };
473
474 /* Decode the string P as a language-specific option.
475 Return 1 if it is recognized (and handle it);
476 return 0 if not recognized. */
477
478 int
479 lang_decode_option (p)
480 char *p;
481 {
482 if (!strcmp (p, "-ftraditional") || !strcmp (p, "-traditional"))
483 flag_writable_strings = 1,
484 flag_this_is_variable = 1, flag_new_for_scope = 0;
485 /* The +e options are for cfront compatibility. They come in as
486 `-+eN', to kludge around gcc.c's argument handling. */
487 else if (p[0] == '-' && p[1] == '+' && p[2] == 'e')
488 {
489 int old_write_virtuals = write_virtuals;
490 if (p[3] == '1')
491 write_virtuals = 1;
492 else if (p[3] == '0')
493 write_virtuals = -1;
494 else if (p[3] == '2')
495 write_virtuals = 2;
496 else error ("invalid +e option");
497 if (old_write_virtuals != 0
498 && write_virtuals != old_write_virtuals)
499 error ("conflicting +e options given");
500 }
501 else if (p[0] == '-' && p[1] == 'f')
502 {
503 /* Some kind of -f option.
504 P's value is the option sans `-f'.
505 Search for it in the table of options. */
506 int found = 0, j;
507
508 p += 2;
509 /* Try special -f options. */
510
511 if (!strcmp (p, "handle-exceptions")
512 || !strcmp (p, "no-handle-exceptions"))
513 warning ("-fhandle-exceptions has been renamed to -fexceptions (and is now on by default)");
514
515 if (!strcmp (p, "save-memoized"))
516 {
517 flag_memoize_lookups = 1;
518 flag_save_memoized_contexts = 1;
519 found = 1;
520 }
521 else if (!strcmp (p, "no-save-memoized"))
522 {
523 flag_memoize_lookups = 0;
524 flag_save_memoized_contexts = 0;
525 found = 1;
526 }
527 else if (! strcmp (p, "alt-external-templates"))
528 {
529 flag_external_templates = 1;
530 flag_alt_external_templates = 1;
531 found = 1;
532 }
533 else if (! strcmp (p, "no-alt-external-templates"))
534 {
535 flag_alt_external_templates = 0;
536 found = 1;
537 }
538 else if (!strcmp (p, "repo"))
539 {
540 flag_use_repository = 1;
541 flag_implicit_templates = 0;
542 found = 1;
543 }
544 else if (!strcmp (p, "guiding-decls"))
545 {
546 flag_guiding_decls = 1;
547 name_mangling_version = 0;
548 found = 1;
549 }
550 else if (!strcmp (p, "no-guiding-decls"))
551 {
552 flag_guiding_decls = 0;
553 found = 1;
554 }
555 else if (!strncmp (p, "template-depth-", 15))
556 {
557 char *endp = p + 15;
558 while (*endp)
559 {
560 if (*endp >= '0' && *endp <= '9')
561 endp++;
562 else
563 {
564 error ("Invalid option `%s'", p - 2);
565 goto template_depth_lose;
566 }
567 }
568 max_tinst_depth = atoi (p + 15);
569 template_depth_lose: ;
570 }
571 else if (!strncmp (p, "name-mangling-version-", 22))
572 {
573 char *endp = p + 22;
574 while (*endp)
575 {
576 if (*endp >= '0' && *endp <= '9')
577 endp++;
578 else
579 {
580 error ("Invalid option `%s'", p - 2);
581 goto mangling_version_lose;
582 }
583 }
584 name_mangling_version = atoi (p + 22);
585 mangling_version_lose: ;
586 }
587 else for (j = 0;
588 !found && j < sizeof (lang_f_options) / sizeof (lang_f_options[0]);
589 j++)
590 {
591 if (!strcmp (p, lang_f_options[j].string))
592 {
593 *lang_f_options[j].variable = lang_f_options[j].on_value;
594 /* A goto here would be cleaner,
595 but breaks the vax pcc. */
596 found = 1;
597 }
598 if (p[0] == 'n' && p[1] == 'o' && p[2] == '-'
599 && ! strcmp (p+3, lang_f_options[j].string))
600 {
601 *lang_f_options[j].variable = ! lang_f_options[j].on_value;
602 found = 1;
603 }
604 }
605 return found;
606 }
607 else if (p[0] == '-' && p[1] == 'W')
608 {
609 int setting = 1;
610
611 /* The -W options control the warning behavior of the compiler. */
612 p += 2;
613
614 if (p[0] == 'n' && p[1] == 'o' && p[2] == '-')
615 setting = 0, p += 3;
616
617 if (!strcmp (p, "implicit"))
618 warn_implicit = setting;
619 else if (!strcmp (p, "return-type"))
620 warn_return_type = setting;
621 else if (!strcmp (p, "ctor-dtor-privacy"))
622 warn_ctor_dtor_privacy = setting;
623 else if (!strcmp (p, "write-strings"))
624 warn_write_strings = setting;
625 else if (!strcmp (p, "cast-qual"))
626 warn_cast_qual = setting;
627 else if (!strcmp (p, "char-subscripts"))
628 warn_char_subscripts = setting;
629 else if (!strcmp (p, "pointer-arith"))
630 warn_pointer_arith = setting;
631 else if (!strcmp (p, "missing-prototypes"))
632 warn_missing_prototypes = setting;
633 else if (!strcmp (p, "redundant-decls"))
634 warn_redundant_decls = setting;
635 else if (!strcmp (p, "missing-braces"))
636 warn_missing_braces = setting;
637 else if (!strcmp (p, "sign-compare"))
638 warn_sign_compare = setting;
639 else if (!strcmp (p, "format"))
640 warn_format = setting;
641 else if (!strcmp (p, "conversion"))
642 warn_conversion = setting;
643 else if (!strcmp (p, "parentheses"))
644 warn_parentheses = setting;
645 else if (!strcmp (p, "non-virtual-dtor"))
646 warn_nonvdtor = setting;
647 else if (!strcmp (p, "extern-inline"))
648 warn_extern_inline = setting;
649 else if (!strcmp (p, "reorder"))
650 warn_reorder = setting;
651 else if (!strcmp (p, "synth"))
652 warn_synth = setting;
653 else if (!strcmp (p, "pmf-conversions"))
654 warn_pmf2ptr = setting;
655 else if (!strcmp (p, "effc++"))
656 warn_ecpp = setting;
657 else if (!strcmp (p, "sign-promo"))
658 warn_sign_promo = setting;
659 else if (!strcmp (p, "old-style-cast"))
660 warn_old_style_cast = setting;
661 else if (!strcmp (p, "unknown-pragmas"))
662 /* Set to greater than 1, so that even unknown pragmas in
663 system headers will be warned about. */
664 warn_unknown_pragmas = setting * 2;
665 else if (!strcmp (p, "comment"))
666 ; /* cpp handles this one. */
667 else if (!strcmp (p, "comments"))
668 ; /* cpp handles this one. */
669 else if (!strcmp (p, "trigraphs"))
670 ; /* cpp handles this one. */
671 else if (!strcmp (p, "import"))
672 ; /* cpp handles this one. */
673 else if (!strcmp (p, "all"))
674 {
675 warn_return_type = setting;
676 warn_unused = setting;
677 warn_implicit = setting;
678 warn_ctor_dtor_privacy = setting;
679 warn_switch = setting;
680 warn_format = setting;
681 warn_parentheses = setting;
682 warn_missing_braces = setting;
683 warn_sign_compare = setting;
684 warn_extern_inline = setting;
685 warn_nonvdtor = setting;
686 /* We save the value of warn_uninitialized, since if they put
687 -Wuninitialized on the command line, we need to generate a
688 warning about not using it without also specifying -O. */
689 if (warn_uninitialized != 1)
690 warn_uninitialized = (setting ? 2 : 0);
691 warn_template_debugging = setting;
692 warn_reorder = setting;
693 warn_sign_promo = setting;
694 /* Only warn about unknown pragmas that are not in system
695 headers. */
696 warn_unknown_pragmas = 1;
697 }
698
699 else if (!strcmp (p, "overloaded-virtual"))
700 warn_overloaded_virtual = setting;
701 else return 0;
702 }
703 else if (!strcmp (p, "-ansi"))
704 flag_no_nonansi_builtin = 1, flag_ansi = 1,
705 flag_no_gnu_keywords = 1, flag_operator_names = 1;
706 #ifdef SPEW_DEBUG
707 /* Undocumented, only ever used when you're invoking cc1plus by hand, since
708 it's probably safe to assume no sane person would ever want to use this
709 under normal circumstances. */
710 else if (!strcmp (p, "-spew-debug"))
711 spew_debug = 1;
712 #endif
713 else
714 return 0;
715
716 return 1;
717 }
718 \f
719 /* Incorporate `const' and `volatile' qualifiers for member functions.
720 FUNCTION is a TYPE_DECL or a FUNCTION_DECL.
721 QUALS is a list of qualifiers. */
722
723 tree
724 grok_method_quals (ctype, function, quals)
725 tree ctype, function, quals;
726 {
727 tree fntype = TREE_TYPE (function);
728 tree raises = TYPE_RAISES_EXCEPTIONS (fntype);
729
730 do
731 {
732 extern tree ridpointers[];
733
734 if (TREE_VALUE (quals) == ridpointers[(int)RID_CONST])
735 {
736 if (TYPE_READONLY (ctype))
737 error ("duplicate `%s' %s",
738 IDENTIFIER_POINTER (TREE_VALUE (quals)),
739 (TREE_CODE (function) == FUNCTION_DECL
740 ? "for member function" : "in type declaration"));
741 ctype = build_type_variant (ctype, 1, TYPE_VOLATILE (ctype));
742 build_pointer_type (ctype);
743 }
744 else if (TREE_VALUE (quals) == ridpointers[(int)RID_VOLATILE])
745 {
746 if (TYPE_VOLATILE (ctype))
747 error ("duplicate `%s' %s",
748 IDENTIFIER_POINTER (TREE_VALUE (quals)),
749 (TREE_CODE (function) == FUNCTION_DECL
750 ? "for member function" : "in type declaration"));
751 ctype = build_type_variant (ctype, TYPE_READONLY (ctype), 1);
752 build_pointer_type (ctype);
753 }
754 else
755 my_friendly_abort (20);
756 quals = TREE_CHAIN (quals);
757 }
758 while (quals);
759 fntype = build_cplus_method_type (ctype, TREE_TYPE (fntype),
760 (TREE_CODE (fntype) == METHOD_TYPE
761 ? TREE_CHAIN (TYPE_ARG_TYPES (fntype))
762 : TYPE_ARG_TYPES (fntype)));
763 if (raises)
764 fntype = build_exception_variant (fntype, raises);
765
766 TREE_TYPE (function) = fntype;
767 return ctype;
768 }
769
770 #if 0 /* Not used. */
771 /* This routine replaces cryptic DECL_NAMEs with readable DECL_NAMEs.
772 It leaves DECL_ASSEMBLER_NAMEs with the correct value. */
773 /* This does not yet work with user defined conversion operators
774 It should. */
775
776 static void
777 substitute_nice_name (decl)
778 tree decl;
779 {
780 if (DECL_NAME (decl) && TREE_CODE (DECL_NAME (decl)) == IDENTIFIER_NODE)
781 {
782 char *n = decl_as_string (DECL_NAME (decl), 1);
783 if (n[strlen (n) - 1] == ' ')
784 n[strlen (n) - 1] = 0;
785 DECL_NAME (decl) = get_identifier (n);
786 }
787 }
788 #endif
789
790 /* Warn when -fexternal-templates is used and #pragma
791 interface/implementation is not used all the times it should be,
792 inform the user. */
793
794 void
795 warn_if_unknown_interface (decl)
796 tree decl;
797 {
798 static int already_warned = 0;
799 if (already_warned++)
800 return;
801
802 if (flag_alt_external_templates)
803 {
804 struct tinst_level *til = tinst_for_decl ();
805 int sl = lineno;
806 char *sf = input_filename;
807
808 if (til)
809 {
810 lineno = til->line;
811 input_filename = til->file;
812 }
813 cp_warning ("template `%#D' instantiated in file without #pragma interface",
814 decl);
815 lineno = sl;
816 input_filename = sf;
817 }
818 else
819 cp_warning_at ("template `%#D' defined in file without #pragma interface",
820 decl);
821 }
822
823 /* A subroutine of the parser, to handle a component list. */
824
825 tree
826 grok_x_components (specs, components)
827 tree specs, components;
828 {
829 register tree t, x, tcode;
830
831 /* We just got some friends. They have been recorded elsewhere. */
832 if (components == void_type_node)
833 return NULL_TREE;
834
835 if (components == NULL_TREE)
836 {
837 t = groktypename (build_decl_list (specs, NULL_TREE));
838
839 if (t == NULL_TREE)
840 {
841 error ("error in component specification");
842 return NULL_TREE;
843 }
844
845 switch (TREE_CODE (t))
846 {
847 case VAR_DECL:
848 /* Static anonymous unions come out as VAR_DECLs. */
849 if (TREE_CODE (TREE_TYPE (t)) == UNION_TYPE
850 && ANON_AGGRNAME_P (TYPE_IDENTIFIER (TREE_TYPE (t))))
851 return t;
852
853 /* We return SPECS here, because in the parser it was ending
854 up with not doing anything to $$, which is what SPECS
855 represents. */
856 return specs;
857 break;
858
859 case RECORD_TYPE:
860 /* This code may be needed for UNION_TYPEs as
861 well. */
862 tcode = record_type_node;
863 if (CLASSTYPE_DECLARED_CLASS (t))
864 tcode = class_type_node;
865 else if (IS_SIGNATURE (t))
866 tcode = signature_type_node;
867
868 t = xref_tag (tcode, TYPE_IDENTIFIER (t), NULL_TREE, 0);
869 if (TYPE_CONTEXT (t))
870 CLASSTYPE_NO_GLOBALIZE (t) = 1;
871 return NULL_TREE;
872 break;
873
874 case UNION_TYPE:
875 case ENUMERAL_TYPE:
876 if (TREE_CODE (t) == UNION_TYPE)
877 tcode = union_type_node;
878 else
879 tcode = enum_type_node;
880
881 t = xref_tag (tcode, TYPE_IDENTIFIER (t), NULL_TREE, 0);
882 if (TREE_CODE (t) == UNION_TYPE && TYPE_CONTEXT (t))
883 CLASSTYPE_NO_GLOBALIZE (t) = 1;
884 if (TREE_CODE (t) == UNION_TYPE
885 && ANON_AGGRNAME_P (TYPE_IDENTIFIER (t)))
886 {
887 /* See also shadow_tag. */
888
889 struct pending_inline **p;
890 tree *q;
891 x = build_lang_field_decl (FIELD_DECL, NULL_TREE, t);
892
893 /* Wipe out memory of synthesized methods */
894 TYPE_HAS_CONSTRUCTOR (t) = 0;
895 TYPE_HAS_DEFAULT_CONSTRUCTOR (t) = 0;
896 TYPE_HAS_INIT_REF (t) = 0;
897 TYPE_HAS_CONST_INIT_REF (t) = 0;
898 TYPE_HAS_ASSIGN_REF (t) = 0;
899 TYPE_HAS_ASSIGNMENT (t) = 0;
900 TYPE_HAS_CONST_ASSIGN_REF (t) = 0;
901
902 q = &TYPE_METHODS (t);
903 while (*q)
904 {
905 if (DECL_ARTIFICIAL (*q))
906 *q = TREE_CHAIN (*q);
907 else
908 q = &TREE_CHAIN (*q);
909 }
910 if (TYPE_METHODS (t))
911 error ("an anonymous union cannot have function members");
912
913 p = &pending_inlines;
914 for (; *p; *p = (*p)->next)
915 if (DECL_CONTEXT ((*p)->fndecl) != t)
916 break;
917 }
918 else if (TREE_CODE (t) == ENUMERAL_TYPE)
919 x = grok_enum_decls (NULL_TREE);
920 else
921 x = NULL_TREE;
922 return x;
923 break;
924
925 default:
926 if (t != void_type_node)
927 error ("empty component declaration");
928 return NULL_TREE;
929 }
930 }
931 else
932 /* There may or may not be any enum decls to grok, but
933 grok_enum_decls will just return components, if there aren't
934 any. We used to try to figure out whether or not there were
935 any enum decls based on the type of components, but that's too
936 hard; it might be something like `enum { a } *p;'. */
937 return grok_enum_decls (components);
938 }
939
940 /* Classes overload their constituent function names automatically.
941 When a function name is declared in a record structure,
942 its name is changed to it overloaded name. Since names for
943 constructors and destructors can conflict, we place a leading
944 '$' for destructors.
945
946 CNAME is the name of the class we are grokking for.
947
948 FUNCTION is a FUNCTION_DECL. It was created by `grokdeclarator'.
949
950 FLAGS contains bits saying what's special about today's
951 arguments. 1 == DESTRUCTOR. 2 == OPERATOR.
952
953 If FUNCTION is a destructor, then we must add the `auto-delete' field
954 as a second parameter. There is some hair associated with the fact
955 that we must "declare" this variable in the manner consistent with the
956 way the rest of the arguments were declared.
957
958 QUALS are the qualifiers for the this pointer. */
959
960 void
961 grokclassfn (ctype, cname, function, flags, quals)
962 tree ctype, cname, function;
963 enum overload_flags flags;
964 tree quals;
965 {
966 tree fn_name = DECL_NAME (function);
967 tree arg_types;
968 tree parm;
969 tree qualtype;
970 tree fntype = TREE_TYPE (function);
971 tree raises = TYPE_RAISES_EXCEPTIONS (fntype);
972
973 if (fn_name == NULL_TREE)
974 {
975 error ("name missing for member function");
976 fn_name = get_identifier ("<anonymous>");
977 DECL_NAME (function) = fn_name;
978 }
979
980 if (quals)
981 qualtype = grok_method_quals (ctype, function, quals);
982 else
983 qualtype = ctype;
984
985 arg_types = TYPE_ARG_TYPES (TREE_TYPE (function));
986 if (TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE)
987 {
988 /* Must add the class instance variable up front. */
989 /* Right now we just make this a pointer. But later
990 we may wish to make it special. */
991 tree type = TREE_VALUE (arg_types);
992 int constp = 1;
993
994 if ((flag_this_is_variable > 0)
995 && (flags == DTOR_FLAG || DECL_CONSTRUCTOR_P (function)))
996 constp = 0;
997
998 if (DECL_CONSTRUCTOR_P (function))
999 {
1000 if (TYPE_USES_VIRTUAL_BASECLASSES (ctype))
1001 {
1002 DECL_CONSTRUCTOR_FOR_VBASE_P (function) = 1;
1003 /* In this case we need "in-charge" flag saying whether
1004 this constructor is responsible for initialization
1005 of virtual baseclasses or not. */
1006 parm = build_decl (PARM_DECL, in_charge_identifier, integer_type_node);
1007 /* Mark the artificial `__in_chrg' parameter as "artificial". */
1008 SET_DECL_ARTIFICIAL (parm);
1009 DECL_ARG_TYPE (parm) = integer_type_node;
1010 TREE_READONLY (parm) = 1;
1011 TREE_CHAIN (parm) = last_function_parms;
1012 last_function_parms = parm;
1013 }
1014 }
1015
1016 parm = build_decl (PARM_DECL, this_identifier, type);
1017 /* Mark the artificial `this' parameter as "artificial". */
1018 SET_DECL_ARTIFICIAL (parm);
1019 DECL_ARG_TYPE (parm) = type;
1020 /* We can make this a register, so long as we don't
1021 accidentally complain if someone tries to take its address. */
1022 DECL_REGISTER (parm) = 1;
1023 if (constp)
1024 TREE_READONLY (parm) = 1;
1025 TREE_CHAIN (parm) = last_function_parms;
1026 last_function_parms = parm;
1027 }
1028
1029 if (flags == DTOR_FLAG)
1030 {
1031 char *buf, *dbuf;
1032 int len = sizeof (DESTRUCTOR_DECL_PREFIX)-1;
1033
1034 arg_types = hash_tree_chain (integer_type_node, void_list_node);
1035 TREE_SIDE_EFFECTS (arg_types) = 1;
1036 /* Build the overload name. It will look like `7Example'. */
1037 if (IDENTIFIER_TYPE_VALUE (cname))
1038 dbuf = build_overload_name (IDENTIFIER_TYPE_VALUE (cname), 1, 1);
1039 else if (IDENTIFIER_LOCAL_VALUE (cname))
1040 dbuf = build_overload_name (TREE_TYPE (IDENTIFIER_LOCAL_VALUE (cname)), 1, 1);
1041 else
1042 /* Using ctype fixes the `X::Y::~Y()' crash. The cname has no type when
1043 it's defined out of the class definition, since poplevel_class wipes
1044 it out. This used to be internal error 346. */
1045 dbuf = build_overload_name (ctype, 1, 1);
1046 buf = (char *) alloca (strlen (dbuf) + sizeof (DESTRUCTOR_DECL_PREFIX));
1047 bcopy (DESTRUCTOR_DECL_PREFIX, buf, len);
1048 buf[len] = '\0';
1049 strcat (buf, dbuf);
1050 DECL_ASSEMBLER_NAME (function) = get_identifier (buf);
1051 parm = build_decl (PARM_DECL, in_charge_identifier, integer_type_node);
1052 /* Mark the artificial `__in_chrg' parameter as "artificial". */
1053 SET_DECL_ARTIFICIAL (parm);
1054 TREE_READONLY (parm) = 1;
1055 DECL_ARG_TYPE (parm) = integer_type_node;
1056 /* This is the same chain as DECL_ARGUMENTS (...). */
1057 TREE_CHAIN (last_function_parms) = parm;
1058
1059 fntype = build_cplus_method_type (qualtype, void_type_node,
1060 arg_types);
1061 if (raises)
1062 {
1063 fntype = build_exception_variant (fntype, raises);
1064 }
1065 TREE_TYPE (function) = fntype;
1066 TYPE_HAS_DESTRUCTOR (ctype) = 1;
1067 }
1068 else
1069 {
1070 tree these_arg_types;
1071
1072 if (DECL_CONSTRUCTOR_FOR_VBASE_P (function))
1073 {
1074 arg_types = hash_tree_chain (integer_type_node,
1075 TREE_CHAIN (arg_types));
1076 fntype = build_cplus_method_type (qualtype,
1077 TREE_TYPE (TREE_TYPE (function)),
1078 arg_types);
1079 if (raises)
1080 {
1081 fntype = build_exception_variant (fntype, raises);
1082 }
1083 TREE_TYPE (function) = fntype;
1084 arg_types = TYPE_ARG_TYPES (TREE_TYPE (function));
1085 }
1086
1087 these_arg_types = arg_types;
1088
1089 if (TREE_CODE (TREE_TYPE (function)) == FUNCTION_TYPE)
1090 /* Only true for static member functions. */
1091 these_arg_types = hash_tree_chain (build_pointer_type (qualtype),
1092 arg_types);
1093
1094 DECL_ASSEMBLER_NAME (function)
1095 = build_decl_overload (fn_name, these_arg_types,
1096 1 + DECL_CONSTRUCTOR_P (function));
1097
1098 #if 0
1099 /* This code is going into the compiler, but currently, it makes
1100 libg++/src/Integer.cc not compile. The problem is that the nice name
1101 winds up going into the symbol table, and conversion operations look
1102 for the manged name. */
1103 substitute_nice_name (function);
1104 #endif
1105 }
1106
1107 DECL_ARGUMENTS (function) = last_function_parms;
1108 /* First approximations. */
1109 DECL_CONTEXT (function) = ctype;
1110 DECL_CLASS_CONTEXT (function) = ctype;
1111 }
1112
1113 /* Work on the expr used by alignof (this is only called by the parser). */
1114
1115 tree
1116 grok_alignof (expr)
1117 tree expr;
1118 {
1119 tree best, t;
1120 int bestalign;
1121
1122 if (processing_template_decl)
1123 return build_min (ALIGNOF_EXPR, sizetype, expr);
1124
1125 if (TREE_CODE (expr) == COMPONENT_REF
1126 && DECL_BIT_FIELD (TREE_OPERAND (expr, 1)))
1127 error ("`__alignof__' applied to a bit-field");
1128
1129 if (TREE_CODE (expr) == INDIRECT_REF)
1130 {
1131 best = t = TREE_OPERAND (expr, 0);
1132 bestalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t)));
1133
1134 while (TREE_CODE (t) == NOP_EXPR
1135 && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == POINTER_TYPE)
1136 {
1137 int thisalign;
1138 t = TREE_OPERAND (t, 0);
1139 thisalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t)));
1140 if (thisalign > bestalign)
1141 best = t, bestalign = thisalign;
1142 }
1143 return c_alignof (TREE_TYPE (TREE_TYPE (best)));
1144 }
1145 else
1146 {
1147 /* ANSI says arrays and fns are converted inside comma.
1148 But we can't convert them in build_compound_expr
1149 because that would break commas in lvalues.
1150 So do the conversion here if operand was a comma. */
1151 if (TREE_CODE (expr) == COMPOUND_EXPR
1152 && (TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE
1153 || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE))
1154 expr = default_conversion (expr);
1155 return c_alignof (TREE_TYPE (expr));
1156 }
1157 }
1158
1159 /* Create an ARRAY_REF, checking for the user doing things backwards
1160 along the way. */
1161
1162 tree
1163 grok_array_decl (array_expr, index_exp)
1164 tree array_expr, index_exp;
1165 {
1166 tree type = TREE_TYPE (array_expr);
1167 tree p1, p2, i1, i2;
1168
1169 if (type == error_mark_node || index_exp == error_mark_node)
1170 return error_mark_node;
1171 if (processing_template_decl)
1172 return build_min (ARRAY_REF, type ? TREE_TYPE (type) : NULL_TREE,
1173 array_expr, index_exp);
1174
1175 if (type == NULL_TREE)
1176 {
1177 /* Something has gone very wrong. Assume we are mistakenly reducing
1178 an expression instead of a declaration. */
1179 error ("parser may be lost: is there a '{' missing somewhere?");
1180 return NULL_TREE;
1181 }
1182
1183 if (TREE_CODE (type) == OFFSET_TYPE
1184 || TREE_CODE (type) == REFERENCE_TYPE)
1185 type = TREE_TYPE (type);
1186
1187 /* If they have an `operator[]', use that. */
1188 if (TYPE_LANG_SPECIFIC (type)
1189 && TYPE_OVERLOADS_ARRAY_REF (complete_type (type)))
1190 return build_opfncall (ARRAY_REF, LOOKUP_NORMAL,
1191 array_expr, index_exp, NULL_TREE);
1192
1193 /* Otherwise, create an ARRAY_REF for a pointer or array type. */
1194
1195 if (TREE_CODE (type) == ARRAY_TYPE)
1196 p1 = array_expr;
1197 else
1198 p1 = build_expr_type_conversion (WANT_POINTER, array_expr, 0);
1199
1200 if (TREE_CODE (TREE_TYPE (index_exp)) == ARRAY_TYPE)
1201 p2 = index_exp;
1202 else
1203 p2 = build_expr_type_conversion (WANT_POINTER, index_exp, 0);
1204
1205 i1 = build_expr_type_conversion (WANT_INT | WANT_ENUM, array_expr, 0);
1206 i2 = build_expr_type_conversion (WANT_INT | WANT_ENUM, index_exp, 0);
1207
1208 if ((p1 && i2) && (i1 && p2))
1209 error ("ambiguous conversion for array subscript");
1210
1211 if (p1 && i2)
1212 array_expr = p1, index_exp = i2;
1213 else if (i1 && p2)
1214 array_expr = p2, index_exp = i1;
1215 else
1216 {
1217 cp_error ("invalid types `%T[%T]' for array subscript",
1218 type, TREE_TYPE (index_exp));
1219 return error_mark_node;
1220 }
1221
1222 if (array_expr == error_mark_node || index_exp == error_mark_node)
1223 error ("ambiguous conversion for array subscript");
1224
1225 return build_array_ref (array_expr, index_exp);
1226 }
1227
1228 /* Given the cast expression EXP, checking out its validity. Either return
1229 an error_mark_node if there was an unavoidable error, return a cast to
1230 void for trying to delete a pointer w/ the value 0, or return the
1231 call to delete. If DOING_VEC is 1, we handle things differently
1232 for doing an array delete. If DOING_VEC is 2, they gave us the
1233 array size as an argument to delete.
1234 Implements ARM $5.3.4. This is called from the parser. */
1235
1236 tree
1237 delete_sanity (exp, size, doing_vec, use_global_delete)
1238 tree exp, size;
1239 int doing_vec, use_global_delete;
1240 {
1241 tree t;
1242 tree type;
1243 enum tree_code code;
1244 /* For a regular vector delete (aka, no size argument) we will pass
1245 this down as a NULL_TREE into build_vec_delete. */
1246 tree maxindex = NULL_TREE;
1247
1248 if (exp == error_mark_node)
1249 return exp;
1250
1251 if (processing_template_decl)
1252 {
1253 t = build_min (DELETE_EXPR, void_type_node, exp, size);
1254 DELETE_EXPR_USE_GLOBAL (t) = use_global_delete;
1255 DELETE_EXPR_USE_VEC (t) = doing_vec;
1256 return t;
1257 }
1258
1259 t = exp;
1260 if (TREE_CODE (t) == OFFSET_REF)
1261 t = resolve_offset_ref (t);
1262 t = stabilize_reference (convert_from_reference (t));
1263 type = TREE_TYPE (t);
1264 code = TREE_CODE (type);
1265
1266 switch (doing_vec)
1267 {
1268 case 2:
1269 maxindex = build_binary_op (MINUS_EXPR, size, integer_one_node, 1);
1270 pedwarn ("anachronistic use of array size in vector delete");
1271 /* Fall through. */
1272 case 1:
1273 break;
1274 default:
1275 if (code != POINTER_TYPE)
1276 {
1277 cp_error ("type `%#T' argument given to `delete', expected pointer",
1278 type);
1279 return error_mark_node;
1280 }
1281
1282 /* Deleting a pointer with the value zero is valid and has no effect. */
1283 if (integer_zerop (t))
1284 return build1 (NOP_EXPR, void_type_node, t);
1285 }
1286
1287 if (code == POINTER_TYPE)
1288 {
1289 #if 0
1290 /* As of Valley Forge, you can delete a pointer to const. */
1291 if (TREE_READONLY (TREE_TYPE (type)))
1292 {
1293 error ("`const *' cannot be deleted");
1294 return error_mark_node;
1295 }
1296 #endif
1297 /* You can't delete functions. */
1298 if (TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
1299 {
1300 error ("cannot delete a function");
1301 return error_mark_node;
1302 }
1303 }
1304
1305 #if 0
1306 /* If the type has no destructor, then we should build a regular
1307 delete, instead of a vector delete. Otherwise, we would end
1308 up passing a bogus offset into __builtin_delete, which is
1309 not expecting it. */
1310 if (doing_vec
1311 && TREE_CODE (type) == POINTER_TYPE
1312 && !TYPE_HAS_DESTRUCTOR (TREE_TYPE (type)))
1313 {
1314 doing_vec = 0;
1315 use_global_delete = 1;
1316 }
1317 #endif
1318
1319 if (doing_vec)
1320 return build_vec_delete (t, maxindex, integer_one_node,
1321 integer_two_node, use_global_delete);
1322 else
1323 {
1324 if (IS_AGGR_TYPE (TREE_TYPE (type))
1325 && TYPE_GETS_REG_DELETE (TREE_TYPE (type)))
1326 {
1327 /* Only do access checking here; we'll be calling op delete
1328 from the destructor. */
1329 tree tmp = build_op_delete_call (DELETE_EXPR, t,
1330 size_zero_node, LOOKUP_NORMAL);
1331 if (tmp == error_mark_node)
1332 return error_mark_node;
1333 }
1334
1335 return build_delete (type, t, integer_three_node,
1336 LOOKUP_NORMAL, use_global_delete);
1337 }
1338 }
1339
1340 /* Report an error if the indicated template declaration is not the
1341 sort of thing that should be a member template. */
1342
1343 void
1344 check_member_template (tmpl)
1345 tree tmpl;
1346 {
1347 tree decl;
1348
1349 my_friendly_assert (TREE_CODE (tmpl) == TEMPLATE_DECL, 0);
1350 decl = DECL_TEMPLATE_RESULT (tmpl);
1351
1352 if (TREE_CODE (decl) == FUNCTION_DECL)
1353 {
1354 if (current_function_decl)
1355 /* 14.5.2.2 [temp.mem]
1356
1357 A local class shall not have member templates. */
1358 cp_error ("declaration of of member template `%#D' in local class",
1359 decl);
1360
1361 if (DECL_VIRTUAL_P (decl))
1362 {
1363 /* 14.5.2.3 [temp.mem]
1364
1365 A member function template shall not be virtual. */
1366 cp_error
1367 ("invalid use of `virtual' in template declaration of `%#D'",
1368 decl);
1369 DECL_VIRTUAL_P (decl) = 0;
1370 }
1371
1372 /* The debug-information generating code doesn't know what to do
1373 with member templates. */
1374 DECL_IGNORED_P (tmpl) = 1;
1375 }
1376 else if (TREE_CODE (decl) == TYPE_DECL &&
1377 AGGREGATE_TYPE_P (TREE_TYPE (decl)))
1378 {
1379 if (current_function_decl)
1380 /* 14.5.2.2 [temp.mem]
1381
1382 A local class shall not have member templates. */
1383 cp_error ("declaration of of member template `%#D' in local class",
1384 decl);
1385
1386 /* We don't handle member template classes yet. */
1387 sorry ("member templates classes");
1388 }
1389 else
1390 cp_error ("template declaration of `%#D'", decl);
1391 }
1392
1393 /* Sanity check: report error if this function FUNCTION is not
1394 really a member of the class (CTYPE) it is supposed to belong to.
1395 CNAME is the same here as it is for grokclassfn above. */
1396
1397 tree
1398 check_classfn (ctype, function)
1399 tree ctype, function;
1400 {
1401 tree fn_name = DECL_NAME (function);
1402 tree fndecl;
1403 tree method_vec = CLASSTYPE_METHOD_VEC (complete_type (ctype));
1404 tree *methods = 0;
1405 tree *end = 0;
1406 tree templates = NULL_TREE;
1407
1408 if (method_vec != 0)
1409 {
1410 methods = &TREE_VEC_ELT (method_vec, 0);
1411 end = TREE_VEC_END (method_vec);
1412
1413 /* First suss out ctors and dtors. */
1414 if (*methods && fn_name == DECL_NAME (*methods)
1415 && DECL_CONSTRUCTOR_P (function))
1416 goto got_it;
1417 if (*++methods && fn_name == DECL_NAME (*methods)
1418 && DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (function)))
1419 goto got_it;
1420
1421 while (++methods != end)
1422 {
1423 fndecl = *methods;
1424 if (fn_name == DECL_NAME (*methods))
1425 {
1426 got_it:
1427 fndecl = *methods;
1428 while (fndecl)
1429 {
1430 if (DECL_ASSEMBLER_NAME (function) == DECL_ASSEMBLER_NAME (fndecl))
1431 return fndecl;
1432 #if 0
1433 /* This doesn't work for static member functions that are
1434 pretending to be methods. */
1435 /* We have to do more extensive argument checking here, as
1436 the name may have been changed by asm("new_name"). */
1437 if (decls_match (function, fndecl))
1438 return fndecl;
1439 #else
1440 if (DECL_NAME (function) == DECL_NAME (fndecl))
1441 {
1442 tree p1 = TYPE_ARG_TYPES (TREE_TYPE (function));
1443 tree p2 = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
1444
1445 /* Get rid of the this parameter on functions that become
1446 static. */
1447 if (DECL_STATIC_FUNCTION_P (fndecl)
1448 && TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE)
1449 p1 = TREE_CHAIN (p1);
1450
1451 if (comptypes (TREE_TYPE (TREE_TYPE (function)),
1452 TREE_TYPE (TREE_TYPE (fndecl)), 1)
1453 && compparms (p1, p2, 3)
1454 && (DECL_TEMPLATE_SPECIALIZATION (function)
1455 == DECL_TEMPLATE_SPECIALIZATION (fndecl))
1456 && (!DECL_TEMPLATE_SPECIALIZATION (function)
1457 || (DECL_TI_TEMPLATE (function)
1458 == DECL_TI_TEMPLATE (fndecl))))
1459 return fndecl;
1460
1461 if (is_member_template (fndecl))
1462 /* This function might be an instantiation
1463 or specialization of fndecl. */
1464 templates =
1465 scratch_tree_cons (NULL_TREE, fndecl, templates);
1466 }
1467 #endif
1468 fndecl = DECL_CHAIN (fndecl);
1469 }
1470 break; /* loser */
1471 }
1472 else if (TREE_CODE (fndecl) == TEMPLATE_DECL
1473 && IDENTIFIER_TYPENAME_P (DECL_NAME (fndecl))
1474 && IDENTIFIER_TYPENAME_P (fn_name))
1475 /* The method in the class is a member template
1476 conversion operator. We are declaring another
1477 conversion operator. It is possible that even though
1478 the names don't match, there is some specialization
1479 occurring. */
1480 templates =
1481 scratch_tree_cons (NULL_TREE, fndecl, templates);
1482 }
1483 }
1484
1485 if (templates)
1486 /* This function might be an instantiation or a specialization.
1487 We should verify that this is possible. If it is, we must
1488 somehow add the new declaration to the method vector for the
1489 class. Perhaps we should use add_method? For now, we simply
1490 return NULL_TREE, which lets the caller know that this
1491 function is new, but we don't print an error message. */
1492 return NULL_TREE;
1493
1494 if (methods != end)
1495 {
1496 tree fndecl = *methods;
1497 cp_error ("prototype for `%#D' does not match any in class `%T'",
1498 function, ctype);
1499 cp_error_at ("candidate%s: %+#D", DECL_CHAIN (fndecl) ? "s are" : " is",
1500 fndecl);
1501 while (fndecl = DECL_CHAIN (fndecl), fndecl)
1502 cp_error_at (" %#D", fndecl);
1503 }
1504 else
1505 {
1506 methods = 0;
1507 cp_error ("no `%#D' member function declared in class `%T'",
1508 function, ctype);
1509 }
1510
1511 /* If we did not find the method in the class, add it to avoid
1512 spurious errors. */
1513 add_method (ctype, methods, function);
1514 return NULL_TREE;
1515 }
1516
1517 /* Process the specs, declarator (NULL if omitted) and width (NULL if omitted)
1518 of a structure component, returning a FIELD_DECL node.
1519 QUALS is a list of type qualifiers for this decl (such as for declaring
1520 const member functions).
1521
1522 This is done during the parsing of the struct declaration.
1523 The FIELD_DECL nodes are chained together and the lot of them
1524 are ultimately passed to `build_struct' to make the RECORD_TYPE node.
1525
1526 C++:
1527
1528 If class A defines that certain functions in class B are friends, then
1529 the way I have set things up, it is B who is interested in permission
1530 granted by A. However, it is in A's context that these declarations
1531 are parsed. By returning a void_type_node, class A does not attempt
1532 to incorporate the declarations of the friends within its structure.
1533
1534 DO NOT MAKE ANY CHANGES TO THIS CODE WITHOUT MAKING CORRESPONDING
1535 CHANGES TO CODE IN `start_method'. */
1536
1537 tree
1538 grokfield (declarator, declspecs, init, asmspec_tree, attrlist)
1539 tree declarator, declspecs, init, asmspec_tree, attrlist;
1540 {
1541 register tree value;
1542 char *asmspec = 0;
1543 int flags = LOOKUP_ONLYCONVERTING;
1544
1545 /* Convert () initializers to = initializers. */
1546 if (init == NULL_TREE && declarator != NULL_TREE
1547 && TREE_CODE (declarator) == CALL_EXPR
1548 && TREE_OPERAND (declarator, 0)
1549 && (TREE_CODE (TREE_OPERAND (declarator, 0)) == IDENTIFIER_NODE
1550 || TREE_CODE (TREE_OPERAND (declarator, 0)) == SCOPE_REF)
1551 && parmlist_is_exprlist (TREE_OPERAND (declarator, 1)))
1552 {
1553 init = TREE_OPERAND (declarator, 1);
1554 declarator = TREE_OPERAND (declarator, 0);
1555 flags = 0;
1556 }
1557
1558 if (declspecs == NULL_TREE
1559 && TREE_CODE (declarator) == SCOPE_REF
1560 && TREE_CODE (TREE_OPERAND (declarator, 1)) == IDENTIFIER_NODE)
1561 {
1562 /* Access declaration */
1563 if (! IS_AGGR_TYPE_CODE (TREE_CODE (TREE_OPERAND (declarator, 0))))
1564 ;
1565 else if (TREE_COMPLEXITY (declarator) == current_class_depth)
1566 pop_nested_class (1);
1567 return do_class_using_decl (declarator);
1568 }
1569
1570 if (init
1571 && TREE_CODE (init) == TREE_LIST
1572 && TREE_VALUE (init) == error_mark_node
1573 && TREE_CHAIN (init) == NULL_TREE)
1574 init = NULL_TREE;
1575
1576 value = grokdeclarator (declarator, declspecs, FIELD, init != 0, NULL_TREE);
1577 if (! value)
1578 return value; /* friend or constructor went bad. */
1579
1580 /* Pass friendly classes back. */
1581 if (TREE_CODE (value) == VOID_TYPE)
1582 return void_type_node;
1583
1584 if (DECL_NAME (value) != NULL_TREE
1585 && IDENTIFIER_POINTER (DECL_NAME (value))[0] == '_'
1586 && ! strcmp (IDENTIFIER_POINTER (DECL_NAME (value)), "_vptr"))
1587 cp_error ("member `%D' conflicts with virtual function table field name", value);
1588
1589 /* Stash away type declarations. */
1590 if (TREE_CODE (value) == TYPE_DECL)
1591 {
1592 DECL_NONLOCAL (value) = 1;
1593 DECL_CONTEXT (value) = current_class_type;
1594 DECL_CLASS_CONTEXT (value) = current_class_type;
1595 CLASSTYPE_LOCAL_TYPEDECLS (current_class_type) = 1;
1596
1597 pushdecl_class_level (value);
1598 return value;
1599 }
1600
1601 if (IS_SIGNATURE (current_class_type)
1602 && TREE_CODE (value) != FUNCTION_DECL)
1603 {
1604 error ("field declaration not allowed in signature");
1605 return void_type_node;
1606 }
1607
1608 if (DECL_IN_AGGR_P (value))
1609 {
1610 cp_error ("`%D' is already defined in the class %T", value,
1611 DECL_CONTEXT (value));
1612 return void_type_node;
1613 }
1614
1615 if (asmspec_tree)
1616 asmspec = TREE_STRING_POINTER (asmspec_tree);
1617
1618 if (init)
1619 {
1620 if (IS_SIGNATURE (current_class_type)
1621 && TREE_CODE (value) == FUNCTION_DECL)
1622 {
1623 error ("function declarations cannot have initializers in signature");
1624 init = NULL_TREE;
1625 }
1626 else if (TREE_CODE (value) == FUNCTION_DECL)
1627 {
1628 grok_function_init (value, init);
1629 init = NULL_TREE;
1630 }
1631 else if (pedantic && TREE_CODE (value) != VAR_DECL)
1632 /* Already complained in grokdeclarator. */
1633 init = NULL_TREE;
1634 else
1635 {
1636 /* We allow initializers to become parameters to base
1637 initializers. */
1638 if (TREE_CODE (init) == TREE_LIST)
1639 {
1640 if (TREE_CHAIN (init) == NULL_TREE)
1641 init = TREE_VALUE (init);
1642 else
1643 init = digest_init (TREE_TYPE (value), init, (tree *)0);
1644 }
1645
1646 if (TREE_CODE (init) == CONST_DECL)
1647 init = DECL_INITIAL (init);
1648 else if (TREE_READONLY_DECL_P (init))
1649 init = decl_constant_value (init);
1650 else if (TREE_CODE (init) == CONSTRUCTOR)
1651 init = digest_init (TREE_TYPE (value), init, (tree *)0);
1652 my_friendly_assert (TREE_PERMANENT (init), 192);
1653 if (init == error_mark_node)
1654 /* We must make this look different than `error_mark_node'
1655 because `decl_const_value' would mis-interpret it
1656 as only meaning that this VAR_DECL is defined. */
1657 init = build1 (NOP_EXPR, TREE_TYPE (value), init);
1658 else if (processing_template_decl)
1659 ;
1660 else if (! TREE_CONSTANT (init))
1661 {
1662 /* We can allow references to things that are effectively
1663 static, since references are initialized with the address. */
1664 if (TREE_CODE (TREE_TYPE (value)) != REFERENCE_TYPE
1665 || (TREE_STATIC (init) == 0
1666 && (TREE_CODE_CLASS (TREE_CODE (init)) != 'd'
1667 || DECL_EXTERNAL (init) == 0)))
1668 {
1669 error ("field initializer is not constant");
1670 init = error_mark_node;
1671 }
1672 }
1673 }
1674 }
1675
1676 /* The corresponding pop_obstacks is in cp_finish_decl. */
1677 push_obstacks_nochange ();
1678
1679 if (processing_template_decl && ! current_function_decl
1680 && (TREE_CODE (value) == VAR_DECL || TREE_CODE (value) == FUNCTION_DECL))
1681 push_template_decl (value);
1682
1683 if (attrlist)
1684 cplus_decl_attributes (value, TREE_PURPOSE (attrlist),
1685 TREE_VALUE (attrlist));
1686
1687 if (TREE_CODE (value) == VAR_DECL)
1688 {
1689 /* We cannot call pushdecl here, because that would
1690 fill in the value of our TREE_CHAIN. Instead, we
1691 modify cp_finish_decl to do the right thing, namely, to
1692 put this decl out straight away. */
1693 if (TREE_PUBLIC (value))
1694 {
1695 /* current_class_type can be NULL_TREE in case of error. */
1696 if (asmspec == 0 && current_class_type)
1697 {
1698 TREE_PUBLIC (value) = 1;
1699 DECL_INITIAL (value) = error_mark_node;
1700 DECL_ASSEMBLER_NAME (value)
1701 = build_static_name (current_class_type, DECL_NAME (value));
1702 }
1703 if (! processing_template_decl)
1704 pending_statics = perm_tree_cons (NULL_TREE, value, pending_statics);
1705
1706 /* Static consts need not be initialized in the class definition. */
1707 if (init != NULL_TREE && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (value)))
1708 {
1709 static int explanation = 0;
1710
1711 error ("initializer invalid for static member with constructor");
1712 if (explanation++ == 0)
1713 error ("(you really want to initialize it separately)");
1714 init = 0;
1715 }
1716 /* Force the compiler to know when an uninitialized static
1717 const member is being used. */
1718 if (TYPE_READONLY (value) && init == 0)
1719 TREE_USED (value) = 1;
1720 }
1721 DECL_INITIAL (value) = init;
1722 DECL_IN_AGGR_P (value) = 1;
1723 DECL_CONTEXT (value) = current_class_type;
1724 DECL_CLASS_CONTEXT (value) = current_class_type;
1725
1726 cp_finish_decl (value, init, asmspec_tree, 1, flags);
1727 pushdecl_class_level (value);
1728 return value;
1729 }
1730 if (TREE_CODE (value) == FIELD_DECL)
1731 {
1732 if (asmspec)
1733 {
1734 /* This must override the asm specifier which was placed
1735 by grokclassfn. Lay this out fresh. */
1736 DECL_RTL (value) = NULL_RTX;
1737 DECL_ASSEMBLER_NAME (value) = get_identifier (asmspec);
1738 }
1739 if (DECL_INITIAL (value) == error_mark_node)
1740 init = error_mark_node;
1741 cp_finish_decl (value, init, asmspec_tree, 1, flags);
1742 DECL_INITIAL (value) = init;
1743 DECL_IN_AGGR_P (value) = 1;
1744 return value;
1745 }
1746 if (TREE_CODE (value) == FUNCTION_DECL)
1747 {
1748 check_default_args (value);
1749 if (DECL_CHAIN (value) != NULL_TREE)
1750 {
1751 /* Need a fresh node here so that we don't get circularity
1752 when we link these together. */
1753 value = copy_node (value);
1754 /* When does this happen? */
1755 my_friendly_assert (init == NULL_TREE, 193);
1756 }
1757 if (asmspec)
1758 {
1759 /* This must override the asm specifier which was placed
1760 by grokclassfn. Lay this out fresh. */
1761 DECL_RTL (value) = NULL_RTX;
1762 DECL_ASSEMBLER_NAME (value) = get_identifier (asmspec);
1763 }
1764 cp_finish_decl (value, init, asmspec_tree, 1, flags);
1765
1766 /* Pass friends back this way. */
1767 if (DECL_FRIEND_P (value))
1768 return void_type_node;
1769
1770 #if 0 /* Just because a fn is declared doesn't mean we'll try to define it. */
1771 if (current_function_decl && ! IS_SIGNATURE (current_class_type))
1772 cp_error ("method `%#D' of local class must be defined in class body",
1773 value);
1774 #endif
1775
1776 DECL_IN_AGGR_P (value) = 1;
1777 return value;
1778 }
1779 my_friendly_abort (21);
1780 /* NOTREACHED */
1781 return NULL_TREE;
1782 }
1783
1784 /* Like `grokfield', but for bitfields.
1785 WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node. */
1786
1787 tree
1788 grokbitfield (declarator, declspecs, width)
1789 tree declarator, declspecs, width;
1790 {
1791 register tree value = grokdeclarator (declarator, declspecs, BITFIELD,
1792 0, NULL_TREE);
1793
1794 if (! value) return NULL_TREE; /* friends went bad. */
1795
1796 /* Pass friendly classes back. */
1797 if (TREE_CODE (value) == VOID_TYPE)
1798 return void_type_node;
1799
1800 if (TREE_CODE (value) == TYPE_DECL)
1801 {
1802 cp_error ("cannot declare `%D' to be a bitfield type", value);
1803 return NULL_TREE;
1804 }
1805
1806 if (IS_SIGNATURE (current_class_type))
1807 {
1808 error ("field declaration not allowed in signature");
1809 return void_type_node;
1810 }
1811
1812 if (DECL_IN_AGGR_P (value))
1813 {
1814 cp_error ("`%D' is already defined in the class %T", value,
1815 DECL_CONTEXT (value));
1816 return void_type_node;
1817 }
1818
1819 GNU_xref_member (current_class_name, value);
1820
1821 if (TREE_STATIC (value))
1822 {
1823 cp_error ("static member `%D' cannot be a bitfield", value);
1824 return NULL_TREE;
1825 }
1826 cp_finish_decl (value, NULL_TREE, NULL_TREE, 0, 0);
1827
1828 if (width != error_mark_node)
1829 {
1830 constant_expression_warning (width);
1831 DECL_INITIAL (value) = width;
1832 DECL_BIT_FIELD (value) = 1;
1833 }
1834
1835 DECL_IN_AGGR_P (value) = 1;
1836 return value;
1837 }
1838
1839 tree
1840 grokoptypename (declspecs, declarator)
1841 tree declspecs, declarator;
1842 {
1843 tree t = grokdeclarator (declarator, declspecs, TYPENAME, 0, NULL_TREE);
1844 return build_typename_overload (t);
1845 }
1846
1847 /* When a function is declared with an initializer,
1848 do the right thing. Currently, there are two possibilities:
1849
1850 class B
1851 {
1852 public:
1853 // initialization possibility #1.
1854 virtual void f () = 0;
1855 int g ();
1856 };
1857
1858 class D1 : B
1859 {
1860 public:
1861 int d1;
1862 // error, no f ();
1863 };
1864
1865 class D2 : B
1866 {
1867 public:
1868 int d2;
1869 void f ();
1870 };
1871
1872 class D3 : B
1873 {
1874 public:
1875 int d3;
1876 // initialization possibility #2
1877 void f () = B::f;
1878 };
1879
1880 */
1881
1882 int
1883 copy_assignment_arg_p (parmtype, virtualp)
1884 tree parmtype;
1885 int virtualp;
1886 {
1887 if (current_class_type == NULL_TREE)
1888 return 0;
1889
1890 if (TREE_CODE (parmtype) == REFERENCE_TYPE)
1891 parmtype = TREE_TYPE (parmtype);
1892
1893 if ((TYPE_MAIN_VARIANT (parmtype) == current_class_type)
1894 #if 0
1895 /* Non-standard hack to support old Booch components. */
1896 || (! virtualp && DERIVED_FROM_P (parmtype, current_class_type))
1897 #endif
1898 )
1899 return 1;
1900
1901 return 0;
1902 }
1903
1904 static void
1905 grok_function_init (decl, init)
1906 tree decl;
1907 tree init;
1908 {
1909 /* An initializer for a function tells how this function should
1910 be inherited. */
1911 tree type = TREE_TYPE (decl);
1912
1913 if (TREE_CODE (type) == FUNCTION_TYPE)
1914 cp_error ("initializer specified for non-member function `%D'", decl);
1915 #if 0
1916 /* We'll check for this in finish_struct_1. */
1917 else if (DECL_VINDEX (decl) == NULL_TREE)
1918 cp_error ("initializer specified for non-virtual method `%D'", decl);
1919 #endif
1920 else if (integer_zerop (init))
1921 {
1922 #if 0
1923 /* Mark this function as being "defined". */
1924 DECL_INITIAL (decl) = error_mark_node;
1925 /* pure virtual destructors must be defined. */
1926 /* pure virtual needs to be defined (as abort) only when put in
1927 vtbl. For wellformed call, it should be itself. pr4737 */
1928 if (!DESTRUCTOR_NAME_P (DECL_ASSEMBLER_NAME (decl)))
1929 {
1930 extern tree abort_fndecl;
1931 /* Give this node rtl from `abort'. */
1932 DECL_RTL (decl) = DECL_RTL (abort_fndecl);
1933 }
1934 #endif
1935 DECL_ABSTRACT_VIRTUAL_P (decl) = 1;
1936 if (DECL_NAME (decl) == ansi_opname [(int) MODIFY_EXPR])
1937 {
1938 tree parmtype
1939 = TREE_VALUE (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (decl))));
1940
1941 if (copy_assignment_arg_p (parmtype, 1))
1942 TYPE_HAS_ABSTRACT_ASSIGN_REF (current_class_type) = 1;
1943 }
1944 }
1945 else if (TREE_CODE (init) == OFFSET_REF
1946 && TREE_OPERAND (init, 0) == NULL_TREE
1947 && TREE_CODE (TREE_TYPE (init)) == METHOD_TYPE)
1948 {
1949 tree basetype = DECL_CLASS_CONTEXT (init);
1950 tree basefn = TREE_OPERAND (init, 1);
1951 if (TREE_CODE (basefn) != FUNCTION_DECL)
1952 cp_error ("non-method initializer invalid for method `%D'", decl);
1953 else if (! BINFO_OFFSET_ZEROP (TYPE_BINFO (DECL_CLASS_CONTEXT (basefn))))
1954 sorry ("base member function from other than first base class");
1955 else
1956 {
1957 tree binfo = get_binfo (basetype, TYPE_METHOD_BASETYPE (type), 1);
1958 if (binfo == error_mark_node)
1959 ;
1960 else if (binfo == 0)
1961 error_not_base_type (TYPE_METHOD_BASETYPE (TREE_TYPE (init)),
1962 TYPE_METHOD_BASETYPE (type));
1963 else
1964 {
1965 /* Mark this function as being defined,
1966 and give it new rtl. */
1967 DECL_INITIAL (decl) = error_mark_node;
1968 DECL_RTL (decl) = DECL_RTL (basefn);
1969 }
1970 }
1971 }
1972 else
1973 cp_error ("invalid initializer for virtual method `%D'", decl);
1974 }
1975 \f
1976 void
1977 cplus_decl_attributes (decl, attributes, prefix_attributes)
1978 tree decl, attributes, prefix_attributes;
1979 {
1980 if (decl == NULL_TREE || decl == void_type_node)
1981 return;
1982
1983 if (TREE_CODE (decl) == TEMPLATE_DECL)
1984 decl = DECL_TEMPLATE_RESULT (decl);
1985
1986 decl_attributes (decl, attributes, prefix_attributes);
1987
1988 if (TREE_CODE (decl) == TYPE_DECL)
1989 SET_IDENTIFIER_TYPE_VALUE (DECL_NAME (decl), TREE_TYPE (decl));
1990 }
1991 \f
1992 /* CONSTRUCTOR_NAME:
1993 Return the name for the constructor (or destructor) for the
1994 specified class. Argument can be RECORD_TYPE, TYPE_DECL, or
1995 IDENTIFIER_NODE. When given a template, this routine doesn't
1996 lose the specialization. */
1997
1998 tree
1999 constructor_name_full (thing)
2000 tree thing;
2001 {
2002 if (TREE_CODE (thing) == TEMPLATE_TYPE_PARM
2003 || TREE_CODE (thing) == TEMPLATE_TEMPLATE_PARM)
2004 thing = TYPE_NAME (thing);
2005 else if (IS_AGGR_TYPE_CODE (TREE_CODE (thing)))
2006 {
2007 if (TYPE_WAS_ANONYMOUS (thing) && TYPE_HAS_CONSTRUCTOR (thing))
2008 thing = DECL_NAME (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (thing), 0));
2009 else
2010 thing = TYPE_NAME (thing);
2011 }
2012 if (TREE_CODE (thing) == TYPE_DECL
2013 || (TREE_CODE (thing) == TEMPLATE_DECL
2014 && TREE_CODE (DECL_TEMPLATE_RESULT (thing)) == TYPE_DECL))
2015 thing = DECL_NAME (thing);
2016 my_friendly_assert (TREE_CODE (thing) == IDENTIFIER_NODE, 197);
2017 return thing;
2018 }
2019
2020 /* CONSTRUCTOR_NAME:
2021 Return the name for the constructor (or destructor) for the
2022 specified class. Argument can be RECORD_TYPE, TYPE_DECL, or
2023 IDENTIFIER_NODE. When given a template, return the plain
2024 unspecialized name. */
2025
2026 tree
2027 constructor_name (thing)
2028 tree thing;
2029 {
2030 tree t;
2031 thing = constructor_name_full (thing);
2032 t = IDENTIFIER_TEMPLATE (thing);
2033 if (!t)
2034 return thing;
2035 return t;
2036 }
2037 \f
2038 /* Cache the value of this class's main virtual function table pointer
2039 in a register variable. This will save one indirection if a
2040 more than one virtual function call is made this function. */
2041
2042 void
2043 setup_vtbl_ptr ()
2044 {
2045 extern tree base_init_expr;
2046
2047 if (base_init_expr == 0
2048 && DECL_CONSTRUCTOR_P (current_function_decl))
2049 {
2050 if (processing_template_decl)
2051 add_tree (build_min_nt
2052 (CTOR_INITIALIZER,
2053 current_member_init_list, current_base_init_list));
2054 else
2055 emit_base_init (current_class_type, 0);
2056 }
2057 }
2058
2059 /* Record the existence of an addressable inline function. */
2060
2061 void
2062 mark_inline_for_output (decl)
2063 tree decl;
2064 {
2065 decl = DECL_MAIN_VARIANT (decl);
2066 if (DECL_SAVED_INLINE (decl))
2067 return;
2068 my_friendly_assert (TREE_PERMANENT (decl), 363);
2069 DECL_SAVED_INLINE (decl) = 1;
2070 #if 0
2071 if (DECL_PENDING_INLINE_INFO (decl) != 0
2072 && ! DECL_PENDING_INLINE_INFO (decl)->deja_vu)
2073 {
2074 struct pending_inline *t = pending_inlines;
2075 my_friendly_assert (DECL_SAVED_INSNS (decl) == 0, 198);
2076 while (t)
2077 {
2078 if (t == DECL_PENDING_INLINE_INFO (decl))
2079 break;
2080 t = t->next;
2081 }
2082 if (t == 0)
2083 {
2084 t = DECL_PENDING_INLINE_INFO (decl);
2085 t->next = pending_inlines;
2086 pending_inlines = t;
2087 }
2088 DECL_PENDING_INLINE_INFO (decl) = 0;
2089 }
2090 #endif
2091 saved_inlines = perm_tree_cons (NULL_TREE, decl, saved_inlines);
2092 }
2093
2094 void
2095 clear_temp_name ()
2096 {
2097 temp_name_counter = 0;
2098 }
2099
2100 /* Hand off a unique name which can be used for variable we don't really
2101 want to know about anyway, for example, the anonymous variables which
2102 are needed to make references work. Declare this thing so we can use it.
2103 The variable created will be of type TYPE.
2104
2105 STATICP is nonzero if this variable should be static. */
2106
2107 tree
2108 get_temp_name (type, staticp)
2109 tree type;
2110 int staticp;
2111 {
2112 char buf[sizeof (AUTO_TEMP_FORMAT) + 20];
2113 tree decl;
2114 int toplev = toplevel_bindings_p ();
2115
2116 push_obstacks_nochange ();
2117 if (toplev || staticp)
2118 {
2119 end_temporary_allocation ();
2120 sprintf (buf, AUTO_TEMP_FORMAT, global_temp_name_counter++);
2121 decl = pushdecl_top_level (build_decl (VAR_DECL, get_identifier (buf), type));
2122 }
2123 else
2124 {
2125 sprintf (buf, AUTO_TEMP_FORMAT, temp_name_counter++);
2126 decl = pushdecl (build_decl (VAR_DECL, get_identifier (buf), type));
2127 }
2128 TREE_USED (decl) = 1;
2129 TREE_STATIC (decl) = staticp;
2130 DECL_ARTIFICIAL (decl) = 1;
2131
2132 /* If this is a local variable, then lay out its rtl now.
2133 Otherwise, callers of this function are responsible for dealing
2134 with this variable's rtl. */
2135 if (! toplev)
2136 {
2137 expand_decl (decl);
2138 expand_decl_init (decl);
2139 }
2140 pop_obstacks ();
2141
2142 return decl;
2143 }
2144
2145 /* Get a variable which we can use for multiple assignments.
2146 It is not entered into current_binding_level, because
2147 that breaks things when it comes time to do final cleanups
2148 (which take place "outside" the binding contour of the function). */
2149
2150 tree
2151 get_temp_regvar (type, init)
2152 tree type, init;
2153 {
2154 tree decl;
2155
2156 decl = build_decl (VAR_DECL, NULL_TREE, type);
2157 TREE_USED (decl) = 1;
2158 DECL_REGISTER (decl) = 1;
2159 DECL_ARTIFICIAL (decl) = 1;
2160
2161 DECL_RTL (decl) = assign_temp (type, 2, 0, 1);
2162 /* We can expand these without fear, since they cannot need
2163 constructors or destructors. */
2164 expand_expr (build_modify_expr (decl, INIT_EXPR, init),
2165 NULL_RTX, VOIDmode, 0);
2166
2167 return decl;
2168 }
2169
2170 /* Finish off the processing of a UNION_TYPE structure.
2171 If there are static members, then all members are
2172 static, and must be laid out together. If the
2173 union is an anonymous union, we arrange for that
2174 as well. PUBLIC_P is nonzero if this union is
2175 not declared static. */
2176
2177 void
2178 finish_anon_union (anon_union_decl)
2179 tree anon_union_decl;
2180 {
2181 tree type = TREE_TYPE (anon_union_decl);
2182 tree field, main_decl = NULL_TREE;
2183 tree elems = NULL_TREE;
2184 int public_p = TREE_PUBLIC (anon_union_decl);
2185 int static_p = TREE_STATIC (anon_union_decl);
2186 int external_p = DECL_EXTERNAL (anon_union_decl);
2187
2188 if ((field = TYPE_FIELDS (type)) == NULL_TREE)
2189 return;
2190
2191 if (public_p)
2192 {
2193 error ("global anonymous unions must be declared static");
2194 return;
2195 }
2196
2197 for (; field; field = TREE_CHAIN (field))
2198 {
2199 tree decl;
2200 if (TREE_CODE (field) != FIELD_DECL)
2201 continue;
2202
2203 if (TREE_PRIVATE (field))
2204 cp_pedwarn_at ("private member `%#D' in anonymous union", field);
2205 else if (TREE_PROTECTED (field))
2206 cp_pedwarn_at ("protected member `%#D' in anonymous union", field);
2207
2208 decl = build_decl (VAR_DECL, DECL_NAME (field), TREE_TYPE (field));
2209 /* tell `pushdecl' that this is not tentative. */
2210 DECL_INITIAL (decl) = error_mark_node;
2211 TREE_PUBLIC (decl) = public_p;
2212 TREE_STATIC (decl) = static_p;
2213 DECL_EXTERNAL (decl) = external_p;
2214 decl = pushdecl (decl);
2215
2216 /* Only write out one anon union element--choose the one that
2217 can hold them all. */
2218 if (main_decl == NULL_TREE
2219 && 1 == simple_cst_equal (DECL_SIZE (decl),
2220 DECL_SIZE (anon_union_decl)))
2221 {
2222 main_decl = decl;
2223 }
2224 else
2225 {
2226 /* ??? This causes there to be no debug info written out
2227 about this decl. */
2228 TREE_ASM_WRITTEN (decl) = 1;
2229 }
2230
2231 DECL_INITIAL (decl) = NULL_TREE;
2232 /* If there's a cleanup to do, it belongs in the
2233 TREE_PURPOSE of the following TREE_LIST. */
2234 elems = scratch_tree_cons (NULL_TREE, decl, elems);
2235 TREE_TYPE (elems) = type;
2236 }
2237 if (static_p)
2238 {
2239 if (main_decl)
2240 {
2241 make_decl_rtl (main_decl, 0, toplevel_bindings_p ());
2242 DECL_RTL (anon_union_decl) = DECL_RTL (main_decl);
2243 }
2244 else
2245 {
2246 warning ("anonymous union with no members");
2247 return;
2248 }
2249 }
2250
2251 /* The following call assumes that there are never any cleanups
2252 for anonymous unions--a reasonable assumption. */
2253 expand_anon_union_decl (anon_union_decl, NULL_TREE, elems);
2254 }
2255
2256 /* Finish and output a table which is generated by the compiler.
2257 NAME is the name to give the table.
2258 TYPE is the type of the table entry.
2259 INIT is all the elements in the table.
2260 PUBLICP is non-zero if this table should be given external access. */
2261
2262 tree
2263 finish_table (name, type, init, publicp)
2264 tree name, type, init;
2265 int publicp;
2266 {
2267 tree itype, atype, decl;
2268 static tree empty_table;
2269 int is_empty = 0;
2270 tree asmspec;
2271
2272 itype = build_index_type (size_int (list_length (init) - 1));
2273 atype = build_cplus_array_type (type, itype);
2274 layout_type (atype);
2275
2276 if (TREE_VALUE (init) == integer_zero_node
2277 && TREE_CHAIN (init) == NULL_TREE)
2278 {
2279 #if 0
2280 if (empty_table == NULL_TREE)
2281 #endif
2282 {
2283 empty_table = get_temp_name (atype, 1);
2284 init = build (CONSTRUCTOR, atype, NULL_TREE, init);
2285 TREE_CONSTANT (init) = 1;
2286 TREE_STATIC (init) = 1;
2287 DECL_INITIAL (empty_table) = init;
2288 asmspec = build_string (IDENTIFIER_LENGTH (DECL_NAME (empty_table)),
2289 IDENTIFIER_POINTER (DECL_NAME (empty_table)));
2290 cp_finish_decl (empty_table, NULL_TREE, asmspec, 0, 0);
2291 }
2292 is_empty = 1;
2293 }
2294
2295 if (name == NULL_TREE)
2296 {
2297 if (is_empty)
2298 return empty_table;
2299 decl = get_temp_name (atype, 1);
2300 }
2301 else
2302 {
2303 decl = build_decl (VAR_DECL, name, atype);
2304 decl = pushdecl (decl);
2305 TREE_STATIC (decl) = 1;
2306 }
2307
2308 if (is_empty == 0)
2309 {
2310 TREE_PUBLIC (decl) = publicp;
2311 init = build (CONSTRUCTOR, atype, NULL_TREE, init);
2312 TREE_CONSTANT (init) = 1;
2313 TREE_STATIC (init) = 1;
2314 DECL_INITIAL (decl) = init;
2315 asmspec = build_string (IDENTIFIER_LENGTH (DECL_NAME (decl)),
2316 IDENTIFIER_POINTER (DECL_NAME (decl)));
2317 }
2318 else
2319 {
2320 /* This will cause DECL to point to EMPTY_TABLE in rtl-land. */
2321 DECL_EXTERNAL (decl) = 1;
2322 TREE_STATIC (decl) = 0;
2323 init = 0;
2324 asmspec = build_string (IDENTIFIER_LENGTH (DECL_NAME (empty_table)),
2325 IDENTIFIER_POINTER (DECL_NAME (empty_table)));
2326 }
2327
2328 cp_finish_decl (decl, NULL_TREE, asmspec, 0, 0);
2329 return decl;
2330 }
2331
2332 /* Finish processing a builtin type TYPE. It's name is NAME,
2333 its fields are in the array FIELDS. LEN is the number of elements
2334 in FIELDS minus one, or put another way, it is the maximum subscript
2335 used in FIELDS.
2336
2337 It is given the same alignment as ALIGN_TYPE. */
2338
2339 void
2340 finish_builtin_type (type, name, fields, len, align_type)
2341 tree type;
2342 char *name;
2343 tree fields[];
2344 int len;
2345 tree align_type;
2346 {
2347 register int i;
2348
2349 TYPE_FIELDS (type) = fields[0];
2350 for (i = 0; i < len; i++)
2351 {
2352 layout_type (TREE_TYPE (fields[i]));
2353 DECL_FIELD_CONTEXT (fields[i]) = type;
2354 TREE_CHAIN (fields[i]) = fields[i+1];
2355 }
2356 DECL_FIELD_CONTEXT (fields[i]) = type;
2357 DECL_CLASS_CONTEXT (fields[i]) = type;
2358 TYPE_ALIGN (type) = TYPE_ALIGN (align_type);
2359 layout_type (type);
2360 #if 0 /* not yet, should get fixed properly later */
2361 TYPE_NAME (type) = make_type_decl (get_identifier (name), type);
2362 #else
2363 TYPE_NAME (type) = build_decl (TYPE_DECL, get_identifier (name), type);
2364 #endif
2365 TYPE_STUB_DECL (type) = TYPE_NAME (type);
2366 layout_decl (TYPE_NAME (type), 0);
2367 }
2368 \f
2369 /* Auxiliary functions to make type signatures for
2370 `operator new' and `operator delete' correspond to
2371 what compiler will be expecting. */
2372
2373 tree
2374 coerce_new_type (type)
2375 tree type;
2376 {
2377 int e1 = 0, e2 = 0;
2378
2379 if (TREE_CODE (type) == METHOD_TYPE)
2380 type = build_function_type (TREE_TYPE (type), TREE_CHAIN (TYPE_ARG_TYPES (type)));
2381 if (TREE_TYPE (type) != ptr_type_node)
2382 e1 = 1, error ("`operator new' must return type `void *'");
2383
2384 /* Technically the type must be `size_t', but we may not know
2385 what that is. */
2386 if (TYPE_ARG_TYPES (type) == NULL_TREE)
2387 e1 = 1, error ("`operator new' takes type `size_t' parameter");
2388 else if (TREE_CODE (TREE_VALUE (TYPE_ARG_TYPES (type))) != INTEGER_TYPE
2389 || TYPE_PRECISION (TREE_VALUE (TYPE_ARG_TYPES (type))) != TYPE_PRECISION (sizetype))
2390 e2 = 1, error ("`operator new' takes type `size_t' as first parameter");
2391 if (e2)
2392 type = build_function_type (ptr_type_node, tree_cons (NULL_TREE, sizetype, TREE_CHAIN (TYPE_ARG_TYPES (type))));
2393 else if (e1)
2394 type = build_function_type (ptr_type_node, TYPE_ARG_TYPES (type));
2395 return type;
2396 }
2397
2398 tree
2399 coerce_delete_type (type)
2400 tree type;
2401 {
2402 int e1 = 0, e2 = 0, e3 = 0;
2403 tree arg_types = TYPE_ARG_TYPES (type);
2404
2405 if (TREE_CODE (type) == METHOD_TYPE)
2406 {
2407 type = build_function_type (TREE_TYPE (type), TREE_CHAIN (arg_types));
2408 arg_types = TREE_CHAIN (arg_types);
2409 }
2410
2411 if (TREE_TYPE (type) != void_type_node)
2412 e1 = 1, error ("`operator delete' must return type `void'");
2413
2414 if (arg_types == NULL_TREE
2415 || TREE_VALUE (arg_types) != ptr_type_node)
2416 e2 = 1, error ("`operator delete' takes type `void *' as first parameter");
2417
2418 #if 0
2419 if (arg_types
2420 && TREE_CHAIN (arg_types)
2421 && TREE_CHAIN (arg_types) != void_list_node)
2422 {
2423 /* Again, technically this argument must be `size_t', but again
2424 we may not know what that is. */
2425 tree t2 = TREE_VALUE (TREE_CHAIN (arg_types));
2426 if (TREE_CODE (t2) != INTEGER_TYPE
2427 || TYPE_PRECISION (t2) != TYPE_PRECISION (sizetype))
2428 e3 = 1, error ("second argument to `operator delete' must be of type `size_t'");
2429 else if (TREE_CHAIN (TREE_CHAIN (arg_types)) != void_list_node)
2430 {
2431 e3 = 1;
2432 if (TREE_CHAIN (TREE_CHAIN (arg_types)))
2433 error ("too many arguments in declaration of `operator delete'");
2434 else
2435 error ("`...' invalid in specification of `operator delete'");
2436 }
2437 }
2438
2439 if (e3)
2440 arg_types = tree_cons (NULL_TREE, ptr_type_node,
2441 build_tree_list (NULL_TREE, sizetype));
2442 else if (e3 |= e2)
2443 {
2444 if (arg_types == NULL_TREE)
2445 arg_types = tree_cons (NULL_TREE, ptr_type_node, void_list_node);
2446 else
2447 arg_types = tree_cons (NULL_TREE, ptr_type_node, TREE_CHAIN (arg_types));
2448 }
2449 else e3 |= e1;
2450 #endif
2451
2452 if (e2)
2453 arg_types = tree_cons (NULL_TREE, ptr_type_node,
2454 arg_types ? TREE_CHAIN (arg_types): NULL_TREE);
2455 if (e2 || e1)
2456 type = build_function_type (void_type_node, arg_types);
2457
2458 return type;
2459 }
2460 \f
2461 extern tree abort_fndecl;
2462
2463 static void
2464 mark_vtable_entries (decl)
2465 tree decl;
2466 {
2467 tree entries = CONSTRUCTOR_ELTS (DECL_INITIAL (decl));
2468
2469 if (flag_rtti)
2470 {
2471 tree fnaddr = (flag_vtable_thunks ? TREE_VALUE (TREE_CHAIN (entries))
2472 : FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (entries)));
2473 tree fn = TREE_OPERAND (fnaddr, 0);
2474 TREE_ADDRESSABLE (fn) = 1;
2475 mark_used (fn);
2476 }
2477 skip_rtti_stuff (&entries);
2478
2479 for (; entries; entries = TREE_CHAIN (entries))
2480 {
2481 tree fnaddr = (flag_vtable_thunks ? TREE_VALUE (entries)
2482 : FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (entries)));
2483 tree fn = TREE_OPERAND (fnaddr, 0);
2484 TREE_ADDRESSABLE (fn) = 1;
2485 if (DECL_LANG_SPECIFIC (fn) && DECL_ABSTRACT_VIRTUAL_P (fn))
2486 {
2487 TREE_OPERAND (fnaddr, 0) = fn = copy_node (fn);
2488 DECL_RTL (fn) = DECL_RTL (abort_fndecl);
2489 mark_used (abort_fndecl);
2490 }
2491 if (TREE_CODE (fn) == THUNK_DECL && DECL_EXTERNAL (fn))
2492 {
2493 DECL_EXTERNAL (fn) = 0;
2494 emit_thunk (fn);
2495 }
2496 mark_used (fn);
2497 }
2498 }
2499
2500 /* Set DECL up to have the closest approximation of "initialized common"
2501 linkage available. */
2502
2503 void
2504 comdat_linkage (decl)
2505 tree decl;
2506 {
2507 if (flag_weak)
2508 make_decl_one_only (decl);
2509 else
2510 TREE_PUBLIC (decl) = 0;
2511
2512 if (DECL_LANG_SPECIFIC (decl))
2513 DECL_COMDAT (decl) = 1;
2514 }
2515
2516 /* Set TREE_PUBLIC and/or DECL_EXTERN on the vtable DECL,
2517 based on TYPE and other static flags.
2518
2519 Note that anything public is tagged TREE_PUBLIC, whether
2520 it's public in this file or in another one. */
2521
2522 void
2523 import_export_vtable (decl, type, final)
2524 tree decl, type;
2525 int final;
2526 {
2527 if (DECL_INTERFACE_KNOWN (decl))
2528 return;
2529
2530 /* +e0 or +e1 */
2531 if (write_virtuals < 2 && write_virtuals != 0)
2532 {
2533 TREE_PUBLIC (decl) = 1;
2534 if (write_virtuals < 0)
2535 DECL_EXTERNAL (decl) = 1;
2536 DECL_INTERFACE_KNOWN (decl) = 1;
2537 }
2538 else if (CLASSTYPE_INTERFACE_KNOWN (type))
2539 {
2540 TREE_PUBLIC (decl) = 1;
2541 DECL_EXTERNAL (decl) = ! CLASSTYPE_VTABLE_NEEDS_WRITING (type);
2542 DECL_INTERFACE_KNOWN (decl) = 1;
2543
2544 /* For WIN32 we also want to put explicit instantiations in
2545 linkonce sections. */
2546 if (CLASSTYPE_EXPLICIT_INSTANTIATION (type)
2547 && supports_one_only () && ! SUPPORTS_WEAK)
2548 make_decl_one_only (decl);
2549 }
2550 else
2551 {
2552 /* We can only wait to decide if we have real non-inline virtual
2553 functions in our class, or if we come from a template. */
2554
2555 int found = CLASSTYPE_TEMPLATE_INSTANTIATION (type);
2556
2557 #ifndef MULTIPLE_SYMBOL_SPACES
2558 if (! found && ! final)
2559 {
2560 tree method;
2561 for (method = TYPE_METHODS (type); method != NULL_TREE;
2562 method = TREE_CHAIN (method))
2563 if (DECL_VINDEX (method) != NULL_TREE
2564 && ! DECL_THIS_INLINE (method)
2565 && ! DECL_ABSTRACT_VIRTUAL_P (method))
2566 {
2567 found = 1;
2568 break;
2569 }
2570 }
2571 #endif
2572
2573 if (final || ! found)
2574 {
2575 comdat_linkage (decl);
2576 DECL_EXTERNAL (decl) = 0;
2577 }
2578 else
2579 {
2580 TREE_PUBLIC (decl) = 1;
2581 DECL_EXTERNAL (decl) = 1;
2582 }
2583 }
2584 }
2585
2586 static void
2587 import_export_template (type)
2588 tree type;
2589 {
2590 if (CLASSTYPE_IMPLICIT_INSTANTIATION (type)
2591 && ! flag_implicit_templates
2592 && CLASSTYPE_INTERFACE_UNKNOWN (type))
2593 {
2594 SET_CLASSTYPE_INTERFACE_KNOWN (type);
2595 CLASSTYPE_INTERFACE_ONLY (type) = 1;
2596 CLASSTYPE_VTABLE_NEEDS_WRITING (type) = 0;
2597 }
2598 }
2599
2600 int
2601 finish_prevtable_vardecl (prev, vars)
2602 tree prev, vars;
2603 {
2604 tree ctype = DECL_CONTEXT (vars);
2605 import_export_template (ctype);
2606
2607 #ifndef MULTIPLE_SYMBOL_SPACES
2608 if (CLASSTYPE_INTERFACE_UNKNOWN (ctype) && TYPE_VIRTUAL_P (ctype)
2609 && ! CLASSTYPE_TEMPLATE_INSTANTIATION (ctype))
2610 {
2611 tree method;
2612 for (method = TYPE_METHODS (ctype); method != NULL_TREE;
2613 method = TREE_CHAIN (method))
2614 {
2615 if (DECL_VINDEX (method) != NULL_TREE
2616 && !DECL_THIS_INLINE (method)
2617 && !DECL_ABSTRACT_VIRTUAL_P (method))
2618 {
2619 SET_CLASSTYPE_INTERFACE_KNOWN (ctype);
2620 CLASSTYPE_VTABLE_NEEDS_WRITING (ctype)
2621 = ! DECL_REALLY_EXTERN (method);
2622 CLASSTYPE_INTERFACE_ONLY (ctype) = DECL_REALLY_EXTERN (method);
2623 break;
2624 }
2625 }
2626 }
2627 #endif
2628
2629 import_export_vtable (vars, ctype, 1);
2630 return 1;
2631 }
2632
2633 static int
2634 finish_vtable_vardecl (prev, vars)
2635 tree prev, vars;
2636 {
2637 if (write_virtuals >= 0
2638 && ! DECL_EXTERNAL (vars)
2639 && ((TREE_PUBLIC (vars) && ! DECL_WEAK (vars) && ! DECL_ONE_ONLY (vars))
2640 || CLASSTYPE_EXPLICIT_INSTANTIATION (DECL_CONTEXT (vars))
2641 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (vars))
2642 || (hack_decl_function_context (vars) && TREE_USED (vars)))
2643 && ! TREE_ASM_WRITTEN (vars))
2644 {
2645 /* Write it out. */
2646 mark_vtable_entries (vars);
2647 if (TREE_TYPE (DECL_INITIAL (vars)) == 0)
2648 store_init_value (vars, DECL_INITIAL (vars));
2649
2650 if (write_symbols == DWARF_DEBUG || write_symbols == DWARF2_DEBUG)
2651 {
2652 /* Mark the VAR_DECL node representing the vtable itself as a
2653 "gratuitous" one, thereby forcing dwarfout.c to ignore it.
2654 It is rather important that such things be ignored because
2655 any effort to actually generate DWARF for them will run
2656 into trouble when/if we encounter code like:
2657
2658 #pragma interface
2659 struct S { virtual void member (); };
2660
2661 because the artificial declaration of the vtable itself (as
2662 manufactured by the g++ front end) will say that the vtable
2663 is a static member of `S' but only *after* the debug output
2664 for the definition of `S' has already been output. This causes
2665 grief because the DWARF entry for the definition of the vtable
2666 will try to refer back to an earlier *declaration* of the
2667 vtable as a static member of `S' and there won't be one.
2668 We might be able to arrange to have the "vtable static member"
2669 attached to the member list for `S' before the debug info for
2670 `S' get written (which would solve the problem) but that would
2671 require more intrusive changes to the g++ front end. */
2672
2673 DECL_IGNORED_P (vars) = 1;
2674 }
2675
2676 rest_of_decl_compilation (vars, NULL_PTR, 1, 1);
2677 return 1;
2678 }
2679 else if (! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (vars)))
2680 /* We don't know what to do with this one yet. */
2681 return 0;
2682
2683 /* We know that PREV must be non-zero here. */
2684 TREE_CHAIN (prev) = TREE_CHAIN (vars);
2685 return 0;
2686 }
2687
2688 static int
2689 prune_vtable_vardecl (prev, vars)
2690 tree prev, vars;
2691 {
2692 /* We know that PREV must be non-zero here. */
2693 TREE_CHAIN (prev) = TREE_CHAIN (vars);
2694 return 1;
2695 }
2696
2697 int
2698 walk_vtables (typedecl_fn, vardecl_fn)
2699 register void (*typedecl_fn) PROTO ((tree, tree));
2700 register int (*vardecl_fn) PROTO ((tree, tree));
2701 {
2702 tree prev, vars;
2703 int flag = 0;
2704
2705 for (prev = 0, vars = getdecls (); vars; vars = TREE_CHAIN (vars))
2706 {
2707 register tree type = TREE_TYPE (vars);
2708
2709 if (TREE_CODE (vars) == VAR_DECL && DECL_VIRTUAL_P (vars))
2710 {
2711 if (vardecl_fn)
2712 flag |= (*vardecl_fn) (prev, vars);
2713
2714 if (prev && TREE_CHAIN (prev) != vars)
2715 continue;
2716 }
2717 else if (TREE_CODE (vars) == TYPE_DECL
2718 && type != error_mark_node
2719 && TYPE_LANG_SPECIFIC (type)
2720 && CLASSTYPE_VSIZE (type))
2721 {
2722 if (typedecl_fn) (*typedecl_fn) (prev, vars);
2723 }
2724
2725 prev = vars;
2726 }
2727
2728 return flag;
2729 }
2730
2731 static void
2732 finish_sigtable_vardecl (prev, vars)
2733 tree prev, vars;
2734 {
2735 /* We don't need to mark sigtable entries as addressable here as is done
2736 for vtables. Since sigtables, unlike vtables, are always written out,
2737 that was already done in build_signature_table_constructor. */
2738
2739 rest_of_decl_compilation (vars, NULL_PTR, 1, 1);
2740
2741 /* We know that PREV must be non-zero here. */
2742 TREE_CHAIN (prev) = TREE_CHAIN (vars);
2743 }
2744
2745 void
2746 walk_sigtables (typedecl_fn, vardecl_fn)
2747 register void (*typedecl_fn) PROTO((tree, tree));
2748 register void (*vardecl_fn) PROTO((tree, tree));
2749 {
2750 tree prev, vars;
2751
2752 for (prev = 0, vars = getdecls (); vars; vars = TREE_CHAIN (vars))
2753 {
2754 register tree type = TREE_TYPE (vars);
2755
2756 if (TREE_CODE (vars) == TYPE_DECL
2757 && type != error_mark_node
2758 && IS_SIGNATURE (type))
2759 {
2760 if (typedecl_fn) (*typedecl_fn) (prev, vars);
2761 }
2762 else if (TREE_CODE (vars) == VAR_DECL
2763 && TREE_TYPE (vars) != error_mark_node
2764 && IS_SIGNATURE (TREE_TYPE (vars)))
2765 {
2766 if (vardecl_fn) (*vardecl_fn) (prev, vars);
2767 }
2768 else
2769 prev = vars;
2770 }
2771 }
2772
2773 /* Determines the proper settings of TREE_PUBLIC and DECL_EXTERNAL for an
2774 inline function or template instantiation at end-of-file. */
2775
2776 void
2777 import_export_decl (decl)
2778 tree decl;
2779 {
2780 if (DECL_INTERFACE_KNOWN (decl))
2781 return;
2782
2783 if (DECL_TEMPLATE_INSTANTIATION (decl))
2784 {
2785 DECL_NOT_REALLY_EXTERN (decl) = 1;
2786 if (DECL_IMPLICIT_INSTANTIATION (decl)
2787 && (flag_implicit_templates || DECL_THIS_INLINE (decl)))
2788 {
2789 if (!TREE_PUBLIC (decl))
2790 /* Templates are allowed to have internal linkage. See
2791 [basic.link]. */
2792 ;
2793 else if (TREE_CODE (decl) == FUNCTION_DECL)
2794 comdat_linkage (decl);
2795 else
2796 DECL_COMDAT (decl) = 1;
2797 }
2798 else
2799 DECL_NOT_REALLY_EXTERN (decl) = 0;
2800 }
2801 else if (DECL_FUNCTION_MEMBER_P (decl))
2802 {
2803 tree ctype = DECL_CLASS_CONTEXT (decl);
2804 if (CLASSTYPE_INTERFACE_KNOWN (ctype)
2805 && (! DECL_ARTIFICIAL (decl) || DECL_VINDEX (decl)))
2806 {
2807 DECL_NOT_REALLY_EXTERN (decl)
2808 = ! (CLASSTYPE_INTERFACE_ONLY (ctype)
2809 || (DECL_THIS_INLINE (decl) && ! flag_implement_inlines));
2810 }
2811 else
2812 comdat_linkage (decl);
2813 }
2814 /* tinfo function */
2815 else if (DECL_ARTIFICIAL (decl) && DECL_MUTABLE_P (decl))
2816 {
2817 tree ctype = TREE_TYPE (DECL_NAME (decl));
2818 if (IS_AGGR_TYPE (ctype) && CLASSTYPE_INTERFACE_KNOWN (ctype)
2819 && TYPE_VIRTUAL_P (ctype))
2820 {
2821 DECL_NOT_REALLY_EXTERN (decl)
2822 = ! (CLASSTYPE_INTERFACE_ONLY (ctype)
2823 || (DECL_THIS_INLINE (decl) && ! flag_implement_inlines));
2824
2825 /* For WIN32 we also want to put explicit instantiations in
2826 linkonce sections. */
2827 if (CLASSTYPE_EXPLICIT_INSTANTIATION (ctype)
2828 && supports_one_only () && ! SUPPORTS_WEAK)
2829 make_decl_one_only (decl);
2830 }
2831 else if (TYPE_BUILT_IN (ctype) && ctype == TYPE_MAIN_VARIANT (ctype))
2832 DECL_NOT_REALLY_EXTERN (decl) = 0;
2833 else
2834 comdat_linkage (decl);
2835 }
2836 else
2837 comdat_linkage (decl);
2838
2839 DECL_INTERFACE_KNOWN (decl) = 1;
2840 }
2841
2842 tree
2843 build_cleanup (decl)
2844 tree decl;
2845 {
2846 tree temp;
2847 tree type = TREE_TYPE (decl);
2848
2849 if (TREE_CODE (type) == ARRAY_TYPE)
2850 temp = decl;
2851 else
2852 {
2853 mark_addressable (decl);
2854 temp = build1 (ADDR_EXPR, build_pointer_type (type), decl);
2855 }
2856 temp = build_delete (TREE_TYPE (temp), temp,
2857 integer_two_node,
2858 LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0);
2859 return temp;
2860 }
2861
2862 extern int parse_time, varconst_time;
2863 extern tree pending_templates;
2864 extern tree maybe_templates;
2865
2866 extern struct obstack permanent_obstack;
2867
2868 static tree
2869 get_sentry (base)
2870 tree base;
2871 {
2872 tree sname = get_id_2 ("__sn", base);
2873 tree sentry = IDENTIFIER_GLOBAL_VALUE (sname);
2874 if (! sentry)
2875 {
2876 push_obstacks (&permanent_obstack, &permanent_obstack);
2877 sentry = build_decl (VAR_DECL, sname, integer_type_node);
2878 TREE_PUBLIC (sentry) = 1;
2879 DECL_ARTIFICIAL (sentry) = 1;
2880 TREE_STATIC (sentry) = 1;
2881 TREE_USED (sentry) = 1;
2882 DECL_COMMON (sentry) = 1;
2883 pushdecl_top_level (sentry);
2884 cp_finish_decl (sentry, NULL_TREE, NULL_TREE, 0, 0);
2885 pop_obstacks ();
2886 }
2887 return sentry;
2888 }
2889
2890 /* This routine is called from the last rule in yyparse ().
2891 Its job is to create all the code needed to initialize and
2892 destroy the global aggregates. We do the destruction
2893 first, since that way we only need to reverse the decls once. */
2894
2895 void
2896 finish_file ()
2897 {
2898 extern int lineno;
2899 int start_time, this_time;
2900
2901 tree fnname;
2902 tree vars;
2903 int needs_cleaning = 0, needs_messing_up = 0;
2904
2905 at_eof = 1;
2906
2907 /* Bad parse errors. Just forget about it. */
2908 if (! global_bindings_p () || current_class_type)
2909 return;
2910
2911 start_time = get_run_time ();
2912
2913 /* Otherwise, GDB can get confused, because in only knows
2914 about source for LINENO-1 lines. */
2915 lineno -= 1;
2916
2917 interface_unknown = 1;
2918 interface_only = 0;
2919
2920 for (fnname = pending_templates; fnname; fnname = TREE_CHAIN (fnname))
2921 {
2922 tree decl = TREE_VALUE (fnname);
2923 if (TREE_CODE_CLASS (TREE_CODE (decl)) == 't')
2924 {
2925 instantiate_class_template (decl);
2926 if (CLASSTYPE_TEMPLATE_INSTANTIATION (decl))
2927 for (vars = TYPE_METHODS (decl); vars; vars = TREE_CHAIN (vars))
2928 if (! DECL_ARTIFICIAL (vars))
2929 instantiate_decl (vars);
2930 }
2931 else
2932 instantiate_decl (decl);
2933 }
2934
2935 for (fnname = maybe_templates; fnname; fnname = TREE_CHAIN (fnname))
2936 {
2937 tree args, fn, decl = TREE_VALUE (fnname);
2938
2939 if (DECL_INITIAL (decl))
2940 continue;
2941
2942 fn = TREE_PURPOSE (fnname);
2943 args = get_bindings (fn, decl, NULL_TREE);
2944 fn = instantiate_template (fn, args);
2945 instantiate_decl (fn);
2946 }
2947
2948 /* Push into C language context, because that's all
2949 we'll need here. */
2950 push_lang_context (lang_name_c);
2951
2952 #if 1
2953 /* The reason for pushing garbage onto the global_binding_level is to
2954 ensure that we can slice out _DECLs which pertain to virtual function
2955 tables. If the last thing pushed onto the global_binding_level was a
2956 virtual function table, then slicing it out would slice away all the
2957 decls (i.e., we lose the head of the chain).
2958
2959 There are several ways of getting the same effect, from changing the
2960 way that iterators over the chain treat the elements that pertain to
2961 virtual function tables, moving the implementation of this code to
2962 decl.c (where we can manipulate global_binding_level directly),
2963 popping the garbage after pushing it and slicing away the vtable
2964 stuff, or just leaving it alone. */
2965
2966 /* Make last thing in global scope not be a virtual function table. */
2967 #if 0 /* not yet, should get fixed properly later */
2968 vars = make_type_decl (get_identifier (" @%$#@!"), integer_type_node);
2969 #else
2970 vars = build_decl (TYPE_DECL, get_identifier (" @%$#@!"), integer_type_node);
2971 #endif
2972 DECL_IGNORED_P (vars) = 1;
2973 SET_DECL_ARTIFICIAL (vars);
2974 pushdecl (vars);
2975 #endif
2976
2977 /* Walk to mark the inline functions we need, then output them so
2978 that we can pick up any other tdecls that those routines need. */
2979 walk_vtables ((void (*) PROTO ((tree, tree))) 0,
2980 finish_prevtable_vardecl);
2981
2982 for (vars = static_aggregates; vars; vars = TREE_CHAIN (vars))
2983 if (! TREE_ASM_WRITTEN (TREE_VALUE (vars)))
2984 rest_of_decl_compilation (TREE_VALUE (vars), 0, 1, 1);
2985 vars = static_aggregates;
2986
2987 if (static_ctors || vars)
2988 needs_messing_up = 1;
2989 if (static_dtors)
2990 needs_cleaning = 1;
2991
2992 /* See if we really need the hassle. */
2993 while (vars && needs_cleaning == 0)
2994 {
2995 tree decl = TREE_VALUE (vars);
2996 tree type = TREE_TYPE (decl);
2997 if (TYPE_NEEDS_DESTRUCTOR (type) && ! TREE_STATIC (vars))
2998 {
2999 needs_cleaning = 1;
3000 break;
3001 }
3002
3003 vars = TREE_CHAIN (vars);
3004 }
3005
3006 if (needs_cleaning == 0)
3007 goto mess_up;
3008
3009 fnname = get_file_function_name ('D');
3010 start_function (void_list_node,
3011 make_call_declarator (fnname, void_list_node, NULL_TREE,
3012 NULL_TREE),
3013 NULL_TREE, 0);
3014 fnname = DECL_ASSEMBLER_NAME (current_function_decl);
3015 store_parm_decls ();
3016
3017 pushlevel (0);
3018 clear_last_expr ();
3019 push_momentary ();
3020 expand_start_bindings (0);
3021
3022 /* These must be done in backward order to destroy,
3023 in which they happen to be! */
3024 for (vars = static_aggregates; vars; vars = TREE_CHAIN (vars))
3025 {
3026 tree decl = TREE_VALUE (vars);
3027 tree type = TREE_TYPE (decl);
3028 tree temp = TREE_PURPOSE (vars);
3029
3030 if (TYPE_NEEDS_DESTRUCTOR (type) && ! TREE_STATIC (vars)
3031 && ! DECL_EXTERNAL (decl))
3032 {
3033 int protect = (TREE_PUBLIC (decl) && (DECL_COMMON (decl)
3034 || DECL_ONE_ONLY (decl)
3035 || DECL_WEAK (decl)));
3036
3037 temp = build_cleanup (decl);
3038
3039 if (protect)
3040 {
3041 tree sentry = get_sentry (DECL_ASSEMBLER_NAME (decl));
3042 sentry = build_unary_op (PREDECREMENT_EXPR, sentry, 0);
3043 sentry = build_binary_op (EQ_EXPR, sentry, integer_zero_node, 1);
3044 expand_start_cond (sentry, 0);
3045 }
3046
3047 expand_expr_stmt (temp);
3048
3049 if (protect)
3050 expand_end_cond ();
3051 }
3052 }
3053
3054 for (; static_dtors; static_dtors = TREE_CHAIN (static_dtors))
3055 expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors),
3056 NULL_TREE));
3057
3058 expand_end_bindings (getdecls (), 1, 0);
3059 poplevel (1, 0, 0);
3060 pop_momentary ();
3061
3062 finish_function (lineno, 0, 0);
3063
3064 assemble_destructor (IDENTIFIER_POINTER (fnname));
3065
3066 /* if it needed cleaning, then it will need messing up: drop through */
3067
3068 mess_up:
3069 /* Must do this while we think we are at the top level. */
3070 vars = nreverse (static_aggregates);
3071 if (needs_messing_up)
3072 {
3073 fnname = get_file_function_name ('I');
3074 start_function (void_list_node,
3075 make_call_declarator (fnname, void_list_node, NULL_TREE,
3076 NULL_TREE),
3077 NULL_TREE, 0);
3078 fnname = DECL_ASSEMBLER_NAME (current_function_decl);
3079 store_parm_decls ();
3080
3081 pushlevel (0);
3082 clear_last_expr ();
3083 push_momentary ();
3084 expand_start_bindings (0);
3085
3086 while (vars)
3087 {
3088 tree decl = TREE_VALUE (vars);
3089 tree init = TREE_PURPOSE (vars);
3090
3091 /* If this was a static attribute within some function's scope,
3092 then don't initialize it here. Also, don't bother
3093 with initializers that contain errors. */
3094 if (TREE_STATIC (vars)
3095 || DECL_EXTERNAL (decl)
3096 || (init && TREE_CODE (init) == TREE_LIST
3097 && value_member (error_mark_node, init)))
3098 goto next_mess;
3099
3100 if (TREE_CODE (decl) == VAR_DECL)
3101 {
3102 int protect = (TREE_PUBLIC (decl) && (DECL_COMMON (decl)
3103 || DECL_ONE_ONLY (decl)
3104 || DECL_WEAK (decl)));
3105
3106 /* Set these global variables so that GDB at least puts
3107 us near the declaration which required the initialization. */
3108 input_filename = DECL_SOURCE_FILE (decl);
3109 lineno = DECL_SOURCE_LINE (decl);
3110 emit_note (input_filename, lineno);
3111
3112 /* 9.5p5: The initializer of a static member of a class has
3113 the same access rights as a member function. */
3114 DECL_CLASS_CONTEXT (current_function_decl) = DECL_CONTEXT (decl);
3115 DECL_STATIC_FUNCTION_P (current_function_decl) = 1;
3116
3117 if (protect)
3118 {
3119 tree sentry = get_sentry (DECL_ASSEMBLER_NAME (decl));
3120 sentry = build_unary_op (PREINCREMENT_EXPR, sentry, 0);
3121 sentry = build_binary_op
3122 (EQ_EXPR, sentry, integer_one_node, 1);
3123 expand_start_cond (sentry, 0);
3124 }
3125
3126 expand_start_target_temps ();
3127
3128 if (IS_AGGR_TYPE (TREE_TYPE (decl))
3129 || TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
3130 expand_aggr_init (decl, init, 0, 0);
3131 else if (TREE_CODE (init) == TREE_VEC)
3132 {
3133 expand_expr (expand_vec_init (decl, TREE_VEC_ELT (init, 0),
3134 TREE_VEC_ELT (init, 1),
3135 TREE_VEC_ELT (init, 2), 0),
3136 const0_rtx, VOIDmode, EXPAND_NORMAL);
3137 }
3138 else
3139 expand_assignment (decl, init, 0, 0);
3140
3141 /* Cleanup any temporaries needed for the initial value. */
3142 expand_end_target_temps ();
3143
3144 if (protect)
3145 expand_end_cond ();
3146
3147 DECL_CLASS_CONTEXT (current_function_decl) = NULL_TREE;
3148 DECL_STATIC_FUNCTION_P (current_function_decl) = 0;
3149 }
3150 else if (decl == error_mark_node)
3151 ;
3152 else my_friendly_abort (22);
3153
3154 next_mess:
3155 vars = TREE_CHAIN (vars);
3156 }
3157
3158 for (; static_ctors; static_ctors = TREE_CHAIN (static_ctors))
3159 expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors),
3160 NULL_TREE));
3161
3162 expand_end_bindings (getdecls (), 1, 0);
3163 poplevel (1, 0, 0);
3164 pop_momentary ();
3165
3166 finish_function (lineno, 0, 0);
3167 assemble_constructor (IDENTIFIER_POINTER (fnname));
3168 }
3169
3170 permanent_allocation (1);
3171
3172 /* Done with C language context needs. */
3173 pop_lang_context ();
3174
3175 /* Now write out any static class variables (which may have since
3176 learned how to be initialized). */
3177 while (pending_statics)
3178 {
3179 tree decl = TREE_VALUE (pending_statics);
3180
3181 /* Output DWARF debug information. */
3182 #ifdef DWARF_DEBUGGING_INFO
3183 if (write_symbols == DWARF_DEBUG)
3184 dwarfout_file_scope_decl (decl, 1);
3185 #endif
3186 #ifdef DWARF2_DEBUGGING_INFO
3187 if (write_symbols == DWARF2_DEBUG)
3188 dwarf2out_decl (decl);
3189 #endif
3190
3191 DECL_DEFER_OUTPUT (decl) = 0;
3192 rest_of_decl_compilation
3193 (decl, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), 1, 1);
3194
3195 pending_statics = TREE_CHAIN (pending_statics);
3196 }
3197
3198 this_time = get_run_time ();
3199 parse_time -= this_time - start_time;
3200 varconst_time += this_time - start_time;
3201
3202 start_time = get_run_time ();
3203
3204 if (flag_handle_signatures)
3205 walk_sigtables ((void (*) PROTO ((tree, tree))) 0,
3206 finish_sigtable_vardecl);
3207
3208 for (fnname = saved_inlines; fnname; fnname = TREE_CHAIN (fnname))
3209 {
3210 tree decl = TREE_VALUE (fnname);
3211 import_export_decl (decl);
3212 }
3213
3214 /* Now write out inline functions which had their addresses taken and
3215 which were not declared virtual and which were not declared `extern
3216 inline'. */
3217 {
3218 int reconsider = 1; /* More may be referenced; check again */
3219
3220 while (reconsider)
3221 {
3222 tree *p = &saved_inlines;
3223 reconsider = 0;
3224
3225 /* We need to do this each time so that newly completed template
3226 types don't wind up at the front of the list. Sigh. */
3227 vars = build_decl (TYPE_DECL, make_anon_name (), integer_type_node);
3228 DECL_IGNORED_P (vars) = 1;
3229 SET_DECL_ARTIFICIAL (vars);
3230 pushdecl (vars);
3231
3232 reconsider |= walk_vtables ((void (*) PROTO((tree, tree))) 0,
3233 finish_vtable_vardecl);
3234
3235 while (*p)
3236 {
3237 tree decl = TREE_VALUE (*p);
3238
3239 if (DECL_ARTIFICIAL (decl) && ! DECL_INITIAL (decl)
3240 && TREE_USED (decl)
3241 && (! DECL_REALLY_EXTERN (decl) || DECL_INLINE (decl)))
3242 {
3243 if (DECL_MUTABLE_P (decl))
3244 synthesize_tinfo_fn (decl);
3245 else
3246 synthesize_method (decl);
3247 reconsider = 1;
3248 }
3249
3250 /* Catch new template instantiations. */
3251 if (decl != TREE_VALUE (*p))
3252 continue;
3253
3254 if (TREE_ASM_WRITTEN (decl)
3255 || (DECL_SAVED_INSNS (decl) == 0 && ! DECL_ARTIFICIAL (decl)))
3256 *p = TREE_CHAIN (*p);
3257 else if (DECL_INITIAL (decl) == 0)
3258 p = &TREE_CHAIN (*p);
3259 else if ((TREE_PUBLIC (decl) && ! DECL_COMDAT (decl))
3260 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
3261 || flag_keep_inline_functions)
3262 {
3263 if (DECL_NOT_REALLY_EXTERN (decl))
3264 {
3265 DECL_EXTERNAL (decl) = 0;
3266 reconsider = 1;
3267 /* We can't inline this function after it's been
3268 emitted. We want a variant of
3269 output_inline_function that doesn't prevent
3270 subsequent integration... */
3271 DECL_INLINE (decl) = 0;
3272 output_inline_function (decl);
3273 permanent_allocation (1);
3274 }
3275
3276 *p = TREE_CHAIN (*p);
3277 }
3278 else
3279 p = &TREE_CHAIN (*p);
3280 }
3281 }
3282 }
3283
3284 /* Now delete from the chain of variables all virtual function tables.
3285 We output them all ourselves, because each will be treated specially. */
3286
3287 walk_vtables ((void (*) PROTO((tree, tree))) 0,
3288 prune_vtable_vardecl);
3289
3290 if (write_virtuals == 2)
3291 {
3292 /* Now complain about an virtual function tables promised
3293 but not delivered. */
3294 while (pending_vtables)
3295 {
3296 if (TREE_PURPOSE (pending_vtables) == NULL_TREE)
3297 error ("virtual function table for `%s' not defined",
3298 IDENTIFIER_POINTER (TREE_VALUE (pending_vtables)));
3299 pending_vtables = TREE_CHAIN (pending_vtables);
3300 }
3301 }
3302
3303 finish_repo ();
3304
3305 this_time = get_run_time ();
3306 parse_time -= this_time - start_time;
3307 varconst_time += this_time - start_time;
3308
3309 if (flag_detailed_statistics)
3310 {
3311 dump_tree_statistics ();
3312 dump_time_statistics ();
3313 }
3314 }
3315
3316 /* This is something of the form 'A()()()()()+1' that has turned out to be an
3317 expr. Since it was parsed like a type, we need to wade through and fix
3318 that. Unfortunately, since operator() is left-associative, we can't use
3319 tail recursion. In the above example, TYPE is `A', and DECL is
3320 `()()()()()'.
3321
3322 Maybe this shouldn't be recursive, but how often will it actually be
3323 used? (jason) */
3324
3325 tree
3326 reparse_absdcl_as_expr (type, decl)
3327 tree type, decl;
3328 {
3329 /* do build_functional_cast (type, NULL_TREE) at bottom */
3330 if (TREE_OPERAND (decl, 0) == NULL_TREE)
3331 return build_functional_cast (type, NULL_TREE);
3332
3333 /* recurse */
3334 decl = reparse_decl_as_expr (type, TREE_OPERAND (decl, 0));
3335
3336 decl = build_x_function_call (decl, NULL_TREE, current_class_ref);
3337
3338 if (TREE_CODE (decl) == CALL_EXPR && TREE_TYPE (decl) != void_type_node)
3339 decl = require_complete_type (decl);
3340
3341 return decl;
3342 }
3343
3344 /* This is something of the form `int ((int)(int)(int)1)' that has turned
3345 out to be an expr. Since it was parsed like a type, we need to wade
3346 through and fix that. Since casts are right-associative, we are
3347 reversing the order, so we don't have to recurse.
3348
3349 In the above example, DECL is the `(int)(int)(int)', and EXPR is the
3350 `1'. */
3351
3352 tree
3353 reparse_absdcl_as_casts (decl, expr)
3354 tree decl, expr;
3355 {
3356 tree type;
3357
3358 if (TREE_CODE (expr) == CONSTRUCTOR
3359 && TREE_TYPE (expr) == 0)
3360 {
3361 type = groktypename (TREE_VALUE (TREE_OPERAND (decl, 1)));
3362 decl = TREE_OPERAND (decl, 0);
3363
3364 if (IS_SIGNATURE (type))
3365 {
3366 error ("cast specifies signature type");
3367 return error_mark_node;
3368 }
3369
3370 expr = digest_init (type, expr, (tree *) 0);
3371 if (TREE_CODE (type) == ARRAY_TYPE && TYPE_SIZE (type) == 0)
3372 {
3373 int failure = complete_array_type (type, expr, 1);
3374 if (failure)
3375 my_friendly_abort (78);
3376 }
3377 }
3378
3379 while (decl)
3380 {
3381 type = groktypename (TREE_VALUE (TREE_OPERAND (decl, 1)));
3382 decl = TREE_OPERAND (decl, 0);
3383 expr = build_c_cast (type, expr);
3384 }
3385
3386 if (warn_old_style_cast)
3387 warning ("use of old-style cast");
3388
3389 return expr;
3390 }
3391
3392 /* Given plain tree nodes for an expression, build up the full semantics. */
3393
3394 tree
3395 build_expr_from_tree (t)
3396 tree t;
3397 {
3398 if (t == NULL_TREE || t == error_mark_node)
3399 return t;
3400
3401 switch (TREE_CODE (t))
3402 {
3403 case IDENTIFIER_NODE:
3404 return do_identifier (t, 0);
3405
3406 case LOOKUP_EXPR:
3407 if (LOOKUP_EXPR_GLOBAL (t))
3408 return do_scoped_id (TREE_OPERAND (t, 0), 0);
3409 else
3410 return do_identifier (TREE_OPERAND (t, 0), 0);
3411
3412 case TEMPLATE_ID_EXPR:
3413 return (lookup_template_function
3414 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3415 build_expr_from_tree (TREE_OPERAND (t, 1))));
3416
3417 case INDIRECT_REF:
3418 return build_x_indirect_ref
3419 (build_expr_from_tree (TREE_OPERAND (t, 0)), "unary *");
3420
3421 case CAST_EXPR:
3422 return build_functional_cast
3423 (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3424
3425 case REINTERPRET_CAST_EXPR:
3426 return build_reinterpret_cast
3427 (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3428
3429 case CONST_CAST_EXPR:
3430 return build_const_cast
3431 (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3432
3433 case DYNAMIC_CAST_EXPR:
3434 return build_dynamic_cast
3435 (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3436
3437 case STATIC_CAST_EXPR:
3438 return build_static_cast
3439 (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3440
3441 case PREDECREMENT_EXPR:
3442 case PREINCREMENT_EXPR:
3443 case POSTDECREMENT_EXPR:
3444 case POSTINCREMENT_EXPR:
3445 case NEGATE_EXPR:
3446 case BIT_NOT_EXPR:
3447 case ABS_EXPR:
3448 case TRUTH_NOT_EXPR:
3449 case ADDR_EXPR:
3450 case CONVERT_EXPR: /* Unary + */
3451 if (TREE_TYPE (t))
3452 return t;
3453 return build_x_unary_op (TREE_CODE (t),
3454 build_expr_from_tree (TREE_OPERAND (t, 0)));
3455
3456 case PLUS_EXPR:
3457 case MINUS_EXPR:
3458 case MULT_EXPR:
3459 case TRUNC_DIV_EXPR:
3460 case CEIL_DIV_EXPR:
3461 case FLOOR_DIV_EXPR:
3462 case ROUND_DIV_EXPR:
3463 case EXACT_DIV_EXPR:
3464 case BIT_AND_EXPR:
3465 case BIT_ANDTC_EXPR:
3466 case BIT_IOR_EXPR:
3467 case BIT_XOR_EXPR:
3468 case TRUNC_MOD_EXPR:
3469 case FLOOR_MOD_EXPR:
3470 case TRUTH_ANDIF_EXPR:
3471 case TRUTH_ORIF_EXPR:
3472 case TRUTH_AND_EXPR:
3473 case TRUTH_OR_EXPR:
3474 case RSHIFT_EXPR:
3475 case LSHIFT_EXPR:
3476 case RROTATE_EXPR:
3477 case LROTATE_EXPR:
3478 case EQ_EXPR:
3479 case NE_EXPR:
3480 case MAX_EXPR:
3481 case MIN_EXPR:
3482 case LE_EXPR:
3483 case GE_EXPR:
3484 case LT_EXPR:
3485 case GT_EXPR:
3486 case MEMBER_REF:
3487 return build_x_binary_op
3488 (TREE_CODE (t),
3489 build_expr_from_tree (TREE_OPERAND (t, 0)),
3490 build_expr_from_tree (TREE_OPERAND (t, 1)));
3491
3492 case DOTSTAR_EXPR:
3493 return build_m_component_ref
3494 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3495 build_expr_from_tree (TREE_OPERAND (t, 1)));
3496
3497 case SCOPE_REF:
3498 return build_offset_ref (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1));
3499
3500 case ARRAY_REF:
3501 if (TREE_OPERAND (t, 0) == NULL_TREE)
3502 /* new-type-id */
3503 return build_parse_node (ARRAY_REF, NULL_TREE,
3504 build_expr_from_tree (TREE_OPERAND (t, 1)));
3505 return grok_array_decl (build_expr_from_tree (TREE_OPERAND (t, 0)),
3506 build_expr_from_tree (TREE_OPERAND (t, 1)));
3507
3508 case SIZEOF_EXPR:
3509 case ALIGNOF_EXPR:
3510 {
3511 tree r = build_expr_from_tree (TREE_OPERAND (t, 0));
3512 if (TREE_CODE_CLASS (TREE_CODE (r)) != 't')
3513 r = TREE_TYPE (r);
3514 return TREE_CODE (t) == SIZEOF_EXPR ? c_sizeof (r) : c_alignof (r);
3515 }
3516
3517 case MODOP_EXPR:
3518 return build_x_modify_expr
3519 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3520 TREE_CODE (TREE_OPERAND (t, 1)),
3521 build_expr_from_tree (TREE_OPERAND (t, 2)));
3522
3523 case ARROW_EXPR:
3524 return build_x_arrow
3525 (build_expr_from_tree (TREE_OPERAND (t, 0)));
3526
3527 case NEW_EXPR:
3528 return build_new
3529 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3530 build_expr_from_tree (TREE_OPERAND (t, 1)),
3531 build_expr_from_tree (TREE_OPERAND (t, 2)),
3532 NEW_EXPR_USE_GLOBAL (t));
3533
3534 case DELETE_EXPR:
3535 return delete_sanity
3536 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3537 build_expr_from_tree (TREE_OPERAND (t, 1)),
3538 DELETE_EXPR_USE_VEC (t), DELETE_EXPR_USE_GLOBAL (t));
3539
3540 case COMPOUND_EXPR:
3541 if (TREE_OPERAND (t, 1) == NULL_TREE)
3542 return build_x_compound_expr
3543 (build_expr_from_tree (TREE_OPERAND (t, 0)));
3544 else
3545 my_friendly_abort (42);
3546
3547 case METHOD_CALL_EXPR:
3548 if (TREE_CODE (TREE_OPERAND (t, 0)) == SCOPE_REF)
3549 {
3550 tree ref = TREE_OPERAND (t, 0);
3551 return build_scoped_method_call
3552 (build_expr_from_tree (TREE_OPERAND (t, 1)),
3553 build_expr_from_tree (TREE_OPERAND (ref, 0)),
3554 TREE_OPERAND (ref, 1),
3555 build_expr_from_tree (TREE_OPERAND (t, 2)));
3556 }
3557 return build_method_call
3558 (build_expr_from_tree (TREE_OPERAND (t, 1)),
3559 TREE_OPERAND (t, 0),
3560 build_expr_from_tree (TREE_OPERAND (t, 2)),
3561 NULL_TREE, LOOKUP_NORMAL);
3562
3563 case CALL_EXPR:
3564 if (TREE_CODE (TREE_OPERAND (t, 0)) == SCOPE_REF)
3565 {
3566 tree ref = TREE_OPERAND (t, 0);
3567 return build_member_call
3568 (build_expr_from_tree (TREE_OPERAND (ref, 0)),
3569 TREE_OPERAND (ref, 1),
3570 build_expr_from_tree (TREE_OPERAND (t, 1)));
3571 }
3572 else
3573 {
3574 tree name = TREE_OPERAND (t, 0);
3575 if (TREE_CODE (name) == TEMPLATE_ID_EXPR
3576 || ! really_overloaded_fn (name))
3577 name = build_expr_from_tree (name);
3578 return build_x_function_call
3579 (name, build_expr_from_tree (TREE_OPERAND (t, 1)),
3580 current_class_ref);
3581 }
3582
3583 case COND_EXPR:
3584 return build_x_conditional_expr
3585 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3586 build_expr_from_tree (TREE_OPERAND (t, 1)),
3587 build_expr_from_tree (TREE_OPERAND (t, 2)));
3588
3589 case TREE_LIST:
3590 {
3591 tree purpose, value, chain;
3592
3593 if (t == void_list_node)
3594 return t;
3595
3596 purpose = TREE_PURPOSE (t);
3597 if (purpose)
3598 purpose = build_expr_from_tree (purpose);
3599 value = TREE_VALUE (t);
3600 if (value)
3601 value = build_expr_from_tree (value);
3602 chain = TREE_CHAIN (t);
3603 if (chain && chain != void_type_node)
3604 chain = build_expr_from_tree (chain);
3605 return expr_tree_cons (purpose, value, chain);
3606 }
3607
3608 case COMPONENT_REF:
3609 return build_x_component_ref
3610 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3611 TREE_OPERAND (t, 1), NULL_TREE, 1);
3612
3613 case THROW_EXPR:
3614 return build_throw (build_expr_from_tree (TREE_OPERAND (t, 0)));
3615
3616 case CONSTRUCTOR:
3617 {
3618 tree r = build_nt (CONSTRUCTOR, NULL_TREE,
3619 build_expr_from_tree (CONSTRUCTOR_ELTS (t)));
3620
3621 if (TREE_TYPE (t))
3622 return digest_init (TREE_TYPE (t), r, 0);
3623 return r;
3624 }
3625
3626 case TYPEID_EXPR:
3627 if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t, 0))) == 't')
3628 return get_typeid (TREE_OPERAND (t, 0));
3629 return build_x_typeid (build_expr_from_tree (TREE_OPERAND (t, 0)));
3630
3631 case VAR_DECL:
3632 return convert_from_reference (t);
3633
3634 default:
3635 return t;
3636 }
3637 }
3638
3639 /* This is something of the form `int (*a)++' that has turned out to be an
3640 expr. It was only converted into parse nodes, so we need to go through
3641 and build up the semantics. Most of the work is done by
3642 build_expr_from_tree, above.
3643
3644 In the above example, TYPE is `int' and DECL is `*a'. */
3645
3646 tree
3647 reparse_decl_as_expr (type, decl)
3648 tree type, decl;
3649 {
3650 decl = build_expr_from_tree (decl);
3651 if (type)
3652 return build_functional_cast (type, build_expr_list (NULL_TREE, decl));
3653 else
3654 return decl;
3655 }
3656
3657 /* This is something of the form `int (*a)' that has turned out to be a
3658 decl. It was only converted into parse nodes, so we need to do the
3659 checking that make_{pointer,reference}_declarator do. */
3660
3661 tree
3662 finish_decl_parsing (decl)
3663 tree decl;
3664 {
3665 extern int current_class_depth;
3666
3667 switch (TREE_CODE (decl))
3668 {
3669 case IDENTIFIER_NODE:
3670 return decl;
3671 case INDIRECT_REF:
3672 return make_pointer_declarator
3673 (NULL_TREE, finish_decl_parsing (TREE_OPERAND (decl, 0)));
3674 case ADDR_EXPR:
3675 return make_reference_declarator
3676 (NULL_TREE, finish_decl_parsing (TREE_OPERAND (decl, 0)));
3677 case BIT_NOT_EXPR:
3678 TREE_OPERAND (decl, 0) = finish_decl_parsing (TREE_OPERAND (decl, 0));
3679 return decl;
3680 case SCOPE_REF:
3681 push_nested_class (TREE_TYPE (TREE_OPERAND (decl, 0)), 3);
3682 TREE_COMPLEXITY (decl) = current_class_depth;
3683 return decl;
3684 case ARRAY_REF:
3685 TREE_OPERAND (decl, 0) = finish_decl_parsing (TREE_OPERAND (decl, 0));
3686 return decl;
3687 default:
3688 my_friendly_abort (5);
3689 return NULL_TREE;
3690 }
3691 }
3692
3693 tree
3694 check_cp_case_value (value)
3695 tree value;
3696 {
3697 if (value == NULL_TREE)
3698 return value;
3699
3700 /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
3701 STRIP_TYPE_NOPS (value);
3702
3703 if (TREE_READONLY_DECL_P (value))
3704 {
3705 value = decl_constant_value (value);
3706 STRIP_TYPE_NOPS (value);
3707 }
3708 value = fold (value);
3709
3710 if (TREE_CODE (value) != INTEGER_CST
3711 && value != error_mark_node)
3712 {
3713 cp_error ("case label `%E' does not reduce to an integer constant",
3714 value);
3715 value = error_mark_node;
3716 }
3717 else
3718 /* Promote char or short to int. */
3719 value = default_conversion (value);
3720
3721 constant_expression_warning (value);
3722
3723 return value;
3724 }
3725
3726 tree current_namespace;
3727
3728 /* Get the inner part of a namespace id. It doesn't have any prefix, nor
3729 postfix. Returns 0 if in global namespace. */
3730
3731 tree
3732 get_namespace_id ()
3733 {
3734 tree x = current_namespace;
3735 if (x)
3736 x = TREE_PURPOSE (x);
3737 return x;
3738 }
3739
3740 /* Build up a DECL_ASSEMBLER_NAME for NAME in the current namespace. */
3741
3742 tree
3743 current_namespace_id (name)
3744 tree name;
3745 {
3746 tree old_id = get_namespace_id ();
3747 char *buf;
3748
3749 /* Global names retain old encoding. */
3750 if (! old_id)
3751 return name;
3752
3753 buf = (char *) alloca (8 + IDENTIFIER_LENGTH (old_id)
3754 + IDENTIFIER_LENGTH (name));
3755 sprintf (buf, "__ns_%s_%s", IDENTIFIER_POINTER (old_id),
3756 IDENTIFIER_POINTER (name));
3757 return get_identifier (buf);
3758 }
3759
3760 void
3761 do_namespace_alias (alias, namespace)
3762 tree alias, namespace;
3763 {
3764 sorry ("namespace alias");
3765 }
3766
3767 void
3768 do_toplevel_using_decl (decl)
3769 tree decl;
3770 {
3771 #if 1
3772 if (TREE_CODE (decl) == SCOPE_REF
3773 && TREE_OPERAND (decl, 0) == std_node)
3774 return;
3775 sorry ("using-declaration");
3776 #else
3777 if (decl == NULL_TREE || decl == error_mark_node)
3778 return;
3779
3780 if (TREE_CODE (decl) == SCOPE_REF)
3781 decl = resolve_scope_to_name (NULL_TREE, decl);
3782
3783 /* Is this the right way to do an id list? */
3784 if (TREE_CODE (decl) != TREE_LIST)
3785 {
3786 pushdecl (decl);
3787 }
3788 else
3789 while (decl)
3790 {
3791 pushdecl (TREE_VALUE (decl));
3792 decl = TREE_CHAIN (decl);
3793 }
3794 #endif
3795 }
3796
3797 tree
3798 do_class_using_decl (decl)
3799 tree decl;
3800 {
3801 tree name, value;
3802
3803 if (TREE_CODE (decl) != SCOPE_REF)
3804 {
3805 cp_error ("using-declaration for non-member at class scope");
3806 return NULL_TREE;
3807 }
3808 name = TREE_OPERAND (decl, 1);
3809 if (TREE_CODE (name) == BIT_NOT_EXPR)
3810 {
3811 cp_error ("using-declaration for destructor");
3812 return NULL_TREE;
3813 }
3814
3815 value = build_lang_field_decl (USING_DECL, name, void_type_node);
3816 DECL_INITIAL (value) = TREE_OPERAND (decl, 0);
3817 return value;
3818 }
3819
3820 void
3821 do_using_directive (namespace)
3822 tree namespace;
3823 {
3824 if (namespace == std_node)
3825 return;
3826 sorry ("using directive");
3827 }
3828
3829 void
3830 check_default_args (x)
3831 tree x;
3832 {
3833 tree arg = TYPE_ARG_TYPES (TREE_TYPE (x));
3834 int saw_def = 0, i = 0 - (TREE_CODE (TREE_TYPE (x)) == METHOD_TYPE);
3835 for (; arg && arg != void_list_node; arg = TREE_CHAIN (arg), ++i)
3836 {
3837 if (TREE_PURPOSE (arg))
3838 saw_def = 1;
3839 else if (saw_def)
3840 {
3841 cp_error ("default argument missing for parameter %P of `%#D'",
3842 i, x);
3843 break;
3844 }
3845 }
3846 }
3847
3848 void
3849 mark_used (decl)
3850 tree decl;
3851 {
3852 TREE_USED (decl) = 1;
3853 if (processing_template_decl)
3854 return;
3855 assemble_external (decl);
3856 /* Is it a synthesized method that needs to be synthesized? */
3857 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_CLASS_CONTEXT (decl)
3858 && DECL_ARTIFICIAL (decl) && ! DECL_INITIAL (decl)
3859 /* Kludge: don't synthesize for default args. */
3860 && current_function_decl)
3861 synthesize_method (decl);
3862 if (DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl))
3863 instantiate_decl (decl);
3864 }
3865
3866 /* Helper function for named_class_head_sans_basetype nonterminal. */
3867
3868 tree
3869 handle_class_head (aggr, scope, id)
3870 tree aggr, scope, id;
3871 {
3872 if (TREE_CODE (id) == TYPE_DECL)
3873 return id;
3874
3875 if (scope)
3876 cp_error ("`%T' does not have a nested type named `%D'", scope, id);
3877 else
3878 cp_error ("no file-scope type named `%D'", id);
3879
3880 id = xref_tag
3881 (aggr, make_anon_name (), NULL_TREE, 1);
3882 return TYPE_MAIN_DECL (id);
3883 }