]> gcc.gnu.org Git - gcc.git/blob - gcc/cp/decl2.c
class.c (instantiate_type): Don't just return a known type if it's wrong.
[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 extern tree sizetype;
2374
2375 tree
2376 coerce_new_type (type)
2377 tree type;
2378 {
2379 int e1 = 0, e2 = 0;
2380
2381 if (TREE_CODE (type) == METHOD_TYPE)
2382 type = build_function_type (TREE_TYPE (type), TREE_CHAIN (TYPE_ARG_TYPES (type)));
2383 if (TREE_TYPE (type) != ptr_type_node)
2384 e1 = 1, error ("`operator new' must return type `void *'");
2385
2386 /* Technically the type must be `size_t', but we may not know
2387 what that is. */
2388 if (TYPE_ARG_TYPES (type) == NULL_TREE)
2389 e1 = 1, error ("`operator new' takes type `size_t' parameter");
2390 else if (TREE_CODE (TREE_VALUE (TYPE_ARG_TYPES (type))) != INTEGER_TYPE
2391 || TYPE_PRECISION (TREE_VALUE (TYPE_ARG_TYPES (type))) != TYPE_PRECISION (sizetype))
2392 e2 = 1, error ("`operator new' takes type `size_t' as first parameter");
2393 if (e2)
2394 type = build_function_type (ptr_type_node, tree_cons (NULL_TREE, sizetype, TREE_CHAIN (TYPE_ARG_TYPES (type))));
2395 else if (e1)
2396 type = build_function_type (ptr_type_node, TYPE_ARG_TYPES (type));
2397 return type;
2398 }
2399
2400 tree
2401 coerce_delete_type (type)
2402 tree type;
2403 {
2404 int e1 = 0, e2 = 0, e3 = 0;
2405 tree arg_types = TYPE_ARG_TYPES (type);
2406
2407 if (TREE_CODE (type) == METHOD_TYPE)
2408 {
2409 type = build_function_type (TREE_TYPE (type), TREE_CHAIN (arg_types));
2410 arg_types = TREE_CHAIN (arg_types);
2411 }
2412
2413 if (TREE_TYPE (type) != void_type_node)
2414 e1 = 1, error ("`operator delete' must return type `void'");
2415
2416 if (arg_types == NULL_TREE
2417 || TREE_VALUE (arg_types) != ptr_type_node)
2418 e2 = 1, error ("`operator delete' takes type `void *' as first parameter");
2419
2420 #if 0
2421 if (arg_types
2422 && TREE_CHAIN (arg_types)
2423 && TREE_CHAIN (arg_types) != void_list_node)
2424 {
2425 /* Again, technically this argument must be `size_t', but again
2426 we may not know what that is. */
2427 tree t2 = TREE_VALUE (TREE_CHAIN (arg_types));
2428 if (TREE_CODE (t2) != INTEGER_TYPE
2429 || TYPE_PRECISION (t2) != TYPE_PRECISION (sizetype))
2430 e3 = 1, error ("second argument to `operator delete' must be of type `size_t'");
2431 else if (TREE_CHAIN (TREE_CHAIN (arg_types)) != void_list_node)
2432 {
2433 e3 = 1;
2434 if (TREE_CHAIN (TREE_CHAIN (arg_types)))
2435 error ("too many arguments in declaration of `operator delete'");
2436 else
2437 error ("`...' invalid in specification of `operator delete'");
2438 }
2439 }
2440
2441 if (e3)
2442 arg_types = tree_cons (NULL_TREE, ptr_type_node,
2443 build_tree_list (NULL_TREE, sizetype));
2444 else if (e3 |= e2)
2445 {
2446 if (arg_types == NULL_TREE)
2447 arg_types = tree_cons (NULL_TREE, ptr_type_node, void_list_node);
2448 else
2449 arg_types = tree_cons (NULL_TREE, ptr_type_node, TREE_CHAIN (arg_types));
2450 }
2451 else e3 |= e1;
2452 #endif
2453
2454 if (e2)
2455 arg_types = tree_cons (NULL_TREE, ptr_type_node,
2456 arg_types ? TREE_CHAIN (arg_types): NULL_TREE);
2457 if (e2 || e1)
2458 type = build_function_type (void_type_node, arg_types);
2459
2460 return type;
2461 }
2462 \f
2463 extern tree abort_fndecl;
2464
2465 static void
2466 mark_vtable_entries (decl)
2467 tree decl;
2468 {
2469 tree entries = CONSTRUCTOR_ELTS (DECL_INITIAL (decl));
2470
2471 if (flag_rtti)
2472 {
2473 tree fnaddr = (flag_vtable_thunks ? TREE_VALUE (TREE_CHAIN (entries))
2474 : FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (entries)));
2475 tree fn = TREE_OPERAND (fnaddr, 0);
2476 TREE_ADDRESSABLE (fn) = 1;
2477 mark_used (fn);
2478 }
2479 skip_rtti_stuff (&entries);
2480
2481 for (; entries; entries = TREE_CHAIN (entries))
2482 {
2483 tree fnaddr = (flag_vtable_thunks ? TREE_VALUE (entries)
2484 : FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (entries)));
2485 tree fn = TREE_OPERAND (fnaddr, 0);
2486 TREE_ADDRESSABLE (fn) = 1;
2487 if (DECL_LANG_SPECIFIC (fn) && DECL_ABSTRACT_VIRTUAL_P (fn))
2488 {
2489 TREE_OPERAND (fnaddr, 0) = fn = copy_node (fn);
2490 DECL_RTL (fn) = DECL_RTL (abort_fndecl);
2491 mark_used (abort_fndecl);
2492 }
2493 if (TREE_CODE (fn) == THUNK_DECL && DECL_EXTERNAL (fn))
2494 {
2495 DECL_EXTERNAL (fn) = 0;
2496 emit_thunk (fn);
2497 }
2498 mark_used (fn);
2499 }
2500 }
2501
2502 /* Set DECL up to have the closest approximation of "initialized common"
2503 linkage available. */
2504
2505 void
2506 comdat_linkage (decl)
2507 tree decl;
2508 {
2509 if (flag_weak)
2510 make_decl_one_only (decl);
2511 else
2512 TREE_PUBLIC (decl) = 0;
2513
2514 if (DECL_LANG_SPECIFIC (decl))
2515 DECL_COMDAT (decl) = 1;
2516 }
2517
2518 /* Set TREE_PUBLIC and/or DECL_EXTERN on the vtable DECL,
2519 based on TYPE and other static flags.
2520
2521 Note that anything public is tagged TREE_PUBLIC, whether
2522 it's public in this file or in another one. */
2523
2524 void
2525 import_export_vtable (decl, type, final)
2526 tree decl, type;
2527 int final;
2528 {
2529 if (DECL_INTERFACE_KNOWN (decl))
2530 return;
2531
2532 /* +e0 or +e1 */
2533 if (write_virtuals < 2 && write_virtuals != 0)
2534 {
2535 TREE_PUBLIC (decl) = 1;
2536 if (write_virtuals < 0)
2537 DECL_EXTERNAL (decl) = 1;
2538 DECL_INTERFACE_KNOWN (decl) = 1;
2539 }
2540 else if (CLASSTYPE_INTERFACE_KNOWN (type))
2541 {
2542 TREE_PUBLIC (decl) = 1;
2543 DECL_EXTERNAL (decl) = ! CLASSTYPE_VTABLE_NEEDS_WRITING (type);
2544 DECL_INTERFACE_KNOWN (decl) = 1;
2545
2546 /* For WIN32 we also want to put explicit instantiations in
2547 linkonce sections. */
2548 if (CLASSTYPE_EXPLICIT_INSTANTIATION (type)
2549 && supports_one_only () && ! SUPPORTS_WEAK)
2550 make_decl_one_only (decl);
2551 }
2552 else
2553 {
2554 /* We can only wait to decide if we have real non-inline virtual
2555 functions in our class, or if we come from a template. */
2556
2557 int found = CLASSTYPE_TEMPLATE_INSTANTIATION (type);
2558
2559 #ifndef MULTIPLE_SYMBOL_SPACES
2560 if (! found && ! final)
2561 {
2562 tree method;
2563 for (method = TYPE_METHODS (type); method != NULL_TREE;
2564 method = TREE_CHAIN (method))
2565 if (DECL_VINDEX (method) != NULL_TREE
2566 && ! DECL_THIS_INLINE (method)
2567 && ! DECL_ABSTRACT_VIRTUAL_P (method))
2568 {
2569 found = 1;
2570 break;
2571 }
2572 }
2573 #endif
2574
2575 if (final || ! found)
2576 {
2577 comdat_linkage (decl);
2578 DECL_EXTERNAL (decl) = 0;
2579 }
2580 else
2581 {
2582 TREE_PUBLIC (decl) = 1;
2583 DECL_EXTERNAL (decl) = 1;
2584 }
2585 }
2586 }
2587
2588 static void
2589 import_export_template (type)
2590 tree type;
2591 {
2592 if (CLASSTYPE_IMPLICIT_INSTANTIATION (type)
2593 && ! flag_implicit_templates
2594 && CLASSTYPE_INTERFACE_UNKNOWN (type))
2595 {
2596 SET_CLASSTYPE_INTERFACE_KNOWN (type);
2597 CLASSTYPE_INTERFACE_ONLY (type) = 1;
2598 CLASSTYPE_VTABLE_NEEDS_WRITING (type) = 0;
2599 }
2600 }
2601
2602 int
2603 finish_prevtable_vardecl (prev, vars)
2604 tree prev, vars;
2605 {
2606 tree ctype = DECL_CONTEXT (vars);
2607 import_export_template (ctype);
2608
2609 #ifndef MULTIPLE_SYMBOL_SPACES
2610 if (CLASSTYPE_INTERFACE_UNKNOWN (ctype) && TYPE_VIRTUAL_P (ctype)
2611 && ! CLASSTYPE_TEMPLATE_INSTANTIATION (ctype))
2612 {
2613 tree method;
2614 for (method = TYPE_METHODS (ctype); method != NULL_TREE;
2615 method = TREE_CHAIN (method))
2616 {
2617 if (DECL_VINDEX (method) != NULL_TREE
2618 && !DECL_THIS_INLINE (method)
2619 && !DECL_ABSTRACT_VIRTUAL_P (method))
2620 {
2621 SET_CLASSTYPE_INTERFACE_KNOWN (ctype);
2622 CLASSTYPE_VTABLE_NEEDS_WRITING (ctype)
2623 = ! DECL_REALLY_EXTERN (method);
2624 CLASSTYPE_INTERFACE_ONLY (ctype) = DECL_REALLY_EXTERN (method);
2625 break;
2626 }
2627 }
2628 }
2629 #endif
2630
2631 import_export_vtable (vars, ctype, 1);
2632 return 1;
2633 }
2634
2635 static int
2636 finish_vtable_vardecl (prev, vars)
2637 tree prev, vars;
2638 {
2639 if (write_virtuals >= 0
2640 && ! DECL_EXTERNAL (vars)
2641 && ((TREE_PUBLIC (vars) && ! DECL_WEAK (vars) && ! DECL_ONE_ONLY (vars))
2642 || CLASSTYPE_EXPLICIT_INSTANTIATION (DECL_CONTEXT (vars))
2643 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (vars))
2644 || (hack_decl_function_context (vars) && TREE_USED (vars)))
2645 && ! TREE_ASM_WRITTEN (vars))
2646 {
2647 /* Write it out. */
2648 mark_vtable_entries (vars);
2649 if (TREE_TYPE (DECL_INITIAL (vars)) == 0)
2650 store_init_value (vars, DECL_INITIAL (vars));
2651
2652 if (write_symbols == DWARF_DEBUG || write_symbols == DWARF2_DEBUG)
2653 {
2654 /* Mark the VAR_DECL node representing the vtable itself as a
2655 "gratuitous" one, thereby forcing dwarfout.c to ignore it.
2656 It is rather important that such things be ignored because
2657 any effort to actually generate DWARF for them will run
2658 into trouble when/if we encounter code like:
2659
2660 #pragma interface
2661 struct S { virtual void member (); };
2662
2663 because the artificial declaration of the vtable itself (as
2664 manufactured by the g++ front end) will say that the vtable
2665 is a static member of `S' but only *after* the debug output
2666 for the definition of `S' has already been output. This causes
2667 grief because the DWARF entry for the definition of the vtable
2668 will try to refer back to an earlier *declaration* of the
2669 vtable as a static member of `S' and there won't be one.
2670 We might be able to arrange to have the "vtable static member"
2671 attached to the member list for `S' before the debug info for
2672 `S' get written (which would solve the problem) but that would
2673 require more intrusive changes to the g++ front end. */
2674
2675 DECL_IGNORED_P (vars) = 1;
2676 }
2677
2678 rest_of_decl_compilation (vars, NULL_PTR, 1, 1);
2679 return 1;
2680 }
2681 else if (! TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (vars)))
2682 /* We don't know what to do with this one yet. */
2683 return 0;
2684
2685 /* We know that PREV must be non-zero here. */
2686 TREE_CHAIN (prev) = TREE_CHAIN (vars);
2687 return 0;
2688 }
2689
2690 static int
2691 prune_vtable_vardecl (prev, vars)
2692 tree prev, vars;
2693 {
2694 /* We know that PREV must be non-zero here. */
2695 TREE_CHAIN (prev) = TREE_CHAIN (vars);
2696 return 1;
2697 }
2698
2699 int
2700 walk_vtables (typedecl_fn, vardecl_fn)
2701 register void (*typedecl_fn) PROTO ((tree, tree));
2702 register int (*vardecl_fn) PROTO ((tree, tree));
2703 {
2704 tree prev, vars;
2705 int flag = 0;
2706
2707 for (prev = 0, vars = getdecls (); vars; vars = TREE_CHAIN (vars))
2708 {
2709 register tree type = TREE_TYPE (vars);
2710
2711 if (TREE_CODE (vars) == VAR_DECL && DECL_VIRTUAL_P (vars))
2712 {
2713 if (vardecl_fn)
2714 flag |= (*vardecl_fn) (prev, vars);
2715
2716 if (prev && TREE_CHAIN (prev) != vars)
2717 continue;
2718 }
2719 else if (TREE_CODE (vars) == TYPE_DECL
2720 && type != error_mark_node
2721 && TYPE_LANG_SPECIFIC (type)
2722 && CLASSTYPE_VSIZE (type))
2723 {
2724 if (typedecl_fn) (*typedecl_fn) (prev, vars);
2725 }
2726
2727 prev = vars;
2728 }
2729
2730 return flag;
2731 }
2732
2733 static void
2734 finish_sigtable_vardecl (prev, vars)
2735 tree prev, vars;
2736 {
2737 /* We don't need to mark sigtable entries as addressable here as is done
2738 for vtables. Since sigtables, unlike vtables, are always written out,
2739 that was already done in build_signature_table_constructor. */
2740
2741 rest_of_decl_compilation (vars, NULL_PTR, 1, 1);
2742
2743 /* We know that PREV must be non-zero here. */
2744 TREE_CHAIN (prev) = TREE_CHAIN (vars);
2745 }
2746
2747 void
2748 walk_sigtables (typedecl_fn, vardecl_fn)
2749 register void (*typedecl_fn) PROTO((tree, tree));
2750 register void (*vardecl_fn) PROTO((tree, tree));
2751 {
2752 tree prev, vars;
2753
2754 for (prev = 0, vars = getdecls (); vars; vars = TREE_CHAIN (vars))
2755 {
2756 register tree type = TREE_TYPE (vars);
2757
2758 if (TREE_CODE (vars) == TYPE_DECL
2759 && type != error_mark_node
2760 && IS_SIGNATURE (type))
2761 {
2762 if (typedecl_fn) (*typedecl_fn) (prev, vars);
2763 }
2764 else if (TREE_CODE (vars) == VAR_DECL
2765 && TREE_TYPE (vars) != error_mark_node
2766 && IS_SIGNATURE (TREE_TYPE (vars)))
2767 {
2768 if (vardecl_fn) (*vardecl_fn) (prev, vars);
2769 }
2770 else
2771 prev = vars;
2772 }
2773 }
2774
2775 /* Determines the proper settings of TREE_PUBLIC and DECL_EXTERNAL for an
2776 inline function or template instantiation at end-of-file. */
2777
2778 void
2779 import_export_decl (decl)
2780 tree decl;
2781 {
2782 if (DECL_INTERFACE_KNOWN (decl))
2783 return;
2784
2785 if (DECL_TEMPLATE_INSTANTIATION (decl))
2786 {
2787 DECL_NOT_REALLY_EXTERN (decl) = 1;
2788 if (DECL_IMPLICIT_INSTANTIATION (decl)
2789 && (flag_implicit_templates || DECL_THIS_INLINE (decl)))
2790 {
2791 if (!TREE_PUBLIC (decl))
2792 /* Templates are allowed to have internal linkage. See
2793 [basic.link]. */
2794 ;
2795 else if (TREE_CODE (decl) == FUNCTION_DECL)
2796 comdat_linkage (decl);
2797 else
2798 DECL_COMDAT (decl) = 1;
2799 }
2800 else
2801 DECL_NOT_REALLY_EXTERN (decl) = 0;
2802 }
2803 else if (DECL_FUNCTION_MEMBER_P (decl))
2804 {
2805 tree ctype = DECL_CLASS_CONTEXT (decl);
2806 if (CLASSTYPE_INTERFACE_KNOWN (ctype)
2807 && (! DECL_ARTIFICIAL (decl) || DECL_VINDEX (decl)))
2808 {
2809 DECL_NOT_REALLY_EXTERN (decl)
2810 = ! (CLASSTYPE_INTERFACE_ONLY (ctype)
2811 || (DECL_THIS_INLINE (decl) && ! flag_implement_inlines));
2812 }
2813 else
2814 comdat_linkage (decl);
2815 }
2816 /* tinfo function */
2817 else if (DECL_ARTIFICIAL (decl) && DECL_MUTABLE_P (decl))
2818 {
2819 tree ctype = TREE_TYPE (DECL_NAME (decl));
2820 if (IS_AGGR_TYPE (ctype) && CLASSTYPE_INTERFACE_KNOWN (ctype)
2821 && TYPE_VIRTUAL_P (ctype))
2822 {
2823 DECL_NOT_REALLY_EXTERN (decl)
2824 = ! (CLASSTYPE_INTERFACE_ONLY (ctype)
2825 || (DECL_THIS_INLINE (decl) && ! flag_implement_inlines));
2826
2827 /* For WIN32 we also want to put explicit instantiations in
2828 linkonce sections. */
2829 if (CLASSTYPE_EXPLICIT_INSTANTIATION (ctype)
2830 && supports_one_only () && ! SUPPORTS_WEAK)
2831 make_decl_one_only (decl);
2832 }
2833 else if (TYPE_BUILT_IN (ctype) && ctype == TYPE_MAIN_VARIANT (ctype))
2834 DECL_NOT_REALLY_EXTERN (decl) = 0;
2835 else
2836 comdat_linkage (decl);
2837 }
2838 else
2839 comdat_linkage (decl);
2840
2841 DECL_INTERFACE_KNOWN (decl) = 1;
2842 }
2843
2844 tree
2845 build_cleanup (decl)
2846 tree decl;
2847 {
2848 tree temp;
2849 tree type = TREE_TYPE (decl);
2850
2851 if (TREE_CODE (type) == ARRAY_TYPE)
2852 temp = decl;
2853 else
2854 {
2855 mark_addressable (decl);
2856 temp = build1 (ADDR_EXPR, build_pointer_type (type), decl);
2857 }
2858 temp = build_delete (TREE_TYPE (temp), temp,
2859 integer_two_node,
2860 LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0);
2861 return temp;
2862 }
2863
2864 extern int parse_time, varconst_time;
2865 extern tree pending_templates;
2866 extern tree maybe_templates;
2867
2868 extern struct obstack permanent_obstack;
2869
2870 static tree
2871 get_sentry (base)
2872 tree base;
2873 {
2874 tree sname = get_id_2 ("__sn", base);
2875 tree sentry = IDENTIFIER_GLOBAL_VALUE (sname);
2876 if (! sentry)
2877 {
2878 push_obstacks (&permanent_obstack, &permanent_obstack);
2879 sentry = build_decl (VAR_DECL, sname, integer_type_node);
2880 TREE_PUBLIC (sentry) = 1;
2881 DECL_ARTIFICIAL (sentry) = 1;
2882 TREE_STATIC (sentry) = 1;
2883 TREE_USED (sentry) = 1;
2884 DECL_COMMON (sentry) = 1;
2885 pushdecl_top_level (sentry);
2886 cp_finish_decl (sentry, NULL_TREE, NULL_TREE, 0, 0);
2887 pop_obstacks ();
2888 }
2889 return sentry;
2890 }
2891
2892 /* This routine is called from the last rule in yyparse ().
2893 Its job is to create all the code needed to initialize and
2894 destroy the global aggregates. We do the destruction
2895 first, since that way we only need to reverse the decls once. */
2896
2897 void
2898 finish_file ()
2899 {
2900 extern int lineno;
2901 int start_time, this_time;
2902
2903 tree fnname;
2904 tree vars;
2905 int needs_cleaning = 0, needs_messing_up = 0;
2906
2907 at_eof = 1;
2908
2909 /* Bad parse errors. Just forget about it. */
2910 if (! global_bindings_p () || current_class_type)
2911 return;
2912
2913 start_time = get_run_time ();
2914
2915 /* Otherwise, GDB can get confused, because in only knows
2916 about source for LINENO-1 lines. */
2917 lineno -= 1;
2918
2919 interface_unknown = 1;
2920 interface_only = 0;
2921
2922 for (fnname = pending_templates; fnname; fnname = TREE_CHAIN (fnname))
2923 {
2924 tree decl = TREE_VALUE (fnname);
2925 if (TREE_CODE_CLASS (TREE_CODE (decl)) == 't')
2926 {
2927 instantiate_class_template (decl);
2928 if (CLASSTYPE_TEMPLATE_INSTANTIATION (decl))
2929 for (vars = TYPE_METHODS (decl); vars; vars = TREE_CHAIN (vars))
2930 if (! DECL_ARTIFICIAL (vars))
2931 instantiate_decl (vars);
2932 }
2933 else
2934 instantiate_decl (decl);
2935 }
2936
2937 for (fnname = maybe_templates; fnname; fnname = TREE_CHAIN (fnname))
2938 {
2939 tree args, fn, decl = TREE_VALUE (fnname);
2940
2941 if (DECL_INITIAL (decl))
2942 continue;
2943
2944 fn = TREE_PURPOSE (fnname);
2945 args = get_bindings (fn, decl, NULL_TREE);
2946 fn = instantiate_template (fn, args);
2947 instantiate_decl (fn);
2948 }
2949
2950 /* Push into C language context, because that's all
2951 we'll need here. */
2952 push_lang_context (lang_name_c);
2953
2954 #if 1
2955 /* The reason for pushing garbage onto the global_binding_level is to
2956 ensure that we can slice out _DECLs which pertain to virtual function
2957 tables. If the last thing pushed onto the global_binding_level was a
2958 virtual function table, then slicing it out would slice away all the
2959 decls (i.e., we lose the head of the chain).
2960
2961 There are several ways of getting the same effect, from changing the
2962 way that iterators over the chain treat the elements that pertain to
2963 virtual function tables, moving the implementation of this code to
2964 decl.c (where we can manipulate global_binding_level directly),
2965 popping the garbage after pushing it and slicing away the vtable
2966 stuff, or just leaving it alone. */
2967
2968 /* Make last thing in global scope not be a virtual function table. */
2969 #if 0 /* not yet, should get fixed properly later */
2970 vars = make_type_decl (get_identifier (" @%$#@!"), integer_type_node);
2971 #else
2972 vars = build_decl (TYPE_DECL, get_identifier (" @%$#@!"), integer_type_node);
2973 #endif
2974 DECL_IGNORED_P (vars) = 1;
2975 SET_DECL_ARTIFICIAL (vars);
2976 pushdecl (vars);
2977 #endif
2978
2979 /* Walk to mark the inline functions we need, then output them so
2980 that we can pick up any other tdecls that those routines need. */
2981 walk_vtables ((void (*) PROTO ((tree, tree))) 0,
2982 finish_prevtable_vardecl);
2983
2984 for (vars = static_aggregates; vars; vars = TREE_CHAIN (vars))
2985 if (! TREE_ASM_WRITTEN (TREE_VALUE (vars)))
2986 rest_of_decl_compilation (TREE_VALUE (vars), 0, 1, 1);
2987 vars = static_aggregates;
2988
2989 if (static_ctors || vars)
2990 needs_messing_up = 1;
2991 if (static_dtors)
2992 needs_cleaning = 1;
2993
2994 /* See if we really need the hassle. */
2995 while (vars && needs_cleaning == 0)
2996 {
2997 tree decl = TREE_VALUE (vars);
2998 tree type = TREE_TYPE (decl);
2999 if (TYPE_NEEDS_DESTRUCTOR (type) && ! TREE_STATIC (vars))
3000 {
3001 needs_cleaning = 1;
3002 break;
3003 }
3004
3005 vars = TREE_CHAIN (vars);
3006 }
3007
3008 if (needs_cleaning == 0)
3009 goto mess_up;
3010
3011 fnname = get_file_function_name ('D');
3012 start_function (void_list_node,
3013 make_call_declarator (fnname, void_list_node, NULL_TREE,
3014 NULL_TREE),
3015 NULL_TREE, 0);
3016 fnname = DECL_ASSEMBLER_NAME (current_function_decl);
3017 store_parm_decls ();
3018
3019 pushlevel (0);
3020 clear_last_expr ();
3021 push_momentary ();
3022 expand_start_bindings (0);
3023
3024 /* These must be done in backward order to destroy,
3025 in which they happen to be! */
3026 for (vars = static_aggregates; vars; vars = TREE_CHAIN (vars))
3027 {
3028 tree decl = TREE_VALUE (vars);
3029 tree type = TREE_TYPE (decl);
3030 tree temp = TREE_PURPOSE (vars);
3031
3032 if (TYPE_NEEDS_DESTRUCTOR (type) && ! TREE_STATIC (vars)
3033 && ! DECL_EXTERNAL (decl))
3034 {
3035 int protect = (TREE_PUBLIC (decl) && (DECL_COMMON (decl)
3036 || DECL_ONE_ONLY (decl)
3037 || DECL_WEAK (decl)));
3038
3039 temp = build_cleanup (decl);
3040
3041 if (protect)
3042 {
3043 tree sentry = get_sentry (DECL_ASSEMBLER_NAME (decl));
3044 sentry = build_unary_op (PREDECREMENT_EXPR, sentry, 0);
3045 sentry = build_binary_op (EQ_EXPR, sentry, integer_zero_node, 1);
3046 expand_start_cond (sentry, 0);
3047 }
3048
3049 expand_expr_stmt (temp);
3050
3051 if (protect)
3052 expand_end_cond ();
3053 }
3054 }
3055
3056 for (; static_dtors; static_dtors = TREE_CHAIN (static_dtors))
3057 expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors),
3058 NULL_TREE));
3059
3060 expand_end_bindings (getdecls (), 1, 0);
3061 poplevel (1, 0, 0);
3062 pop_momentary ();
3063
3064 finish_function (lineno, 0, 0);
3065
3066 assemble_destructor (IDENTIFIER_POINTER (fnname));
3067
3068 /* if it needed cleaning, then it will need messing up: drop through */
3069
3070 mess_up:
3071 /* Must do this while we think we are at the top level. */
3072 vars = nreverse (static_aggregates);
3073 if (needs_messing_up)
3074 {
3075 fnname = get_file_function_name ('I');
3076 start_function (void_list_node,
3077 make_call_declarator (fnname, void_list_node, NULL_TREE,
3078 NULL_TREE),
3079 NULL_TREE, 0);
3080 fnname = DECL_ASSEMBLER_NAME (current_function_decl);
3081 store_parm_decls ();
3082
3083 pushlevel (0);
3084 clear_last_expr ();
3085 push_momentary ();
3086 expand_start_bindings (0);
3087
3088 while (vars)
3089 {
3090 tree decl = TREE_VALUE (vars);
3091 tree init = TREE_PURPOSE (vars);
3092
3093 /* If this was a static attribute within some function's scope,
3094 then don't initialize it here. Also, don't bother
3095 with initializers that contain errors. */
3096 if (TREE_STATIC (vars)
3097 || DECL_EXTERNAL (decl)
3098 || (init && TREE_CODE (init) == TREE_LIST
3099 && value_member (error_mark_node, init)))
3100 goto next_mess;
3101
3102 if (TREE_CODE (decl) == VAR_DECL)
3103 {
3104 int protect = (TREE_PUBLIC (decl) && (DECL_COMMON (decl)
3105 || DECL_ONE_ONLY (decl)
3106 || DECL_WEAK (decl)));
3107
3108 /* Set these global variables so that GDB at least puts
3109 us near the declaration which required the initialization. */
3110 input_filename = DECL_SOURCE_FILE (decl);
3111 lineno = DECL_SOURCE_LINE (decl);
3112 emit_note (input_filename, lineno);
3113
3114 /* 9.5p5: The initializer of a static member of a class has
3115 the same access rights as a member function. */
3116 DECL_CLASS_CONTEXT (current_function_decl) = DECL_CONTEXT (decl);
3117 DECL_STATIC_FUNCTION_P (current_function_decl) = 1;
3118
3119 if (protect)
3120 {
3121 tree sentry = get_sentry (DECL_ASSEMBLER_NAME (decl));
3122 sentry = build_unary_op (PREINCREMENT_EXPR, sentry, 0);
3123 sentry = build_binary_op
3124 (EQ_EXPR, sentry, integer_one_node, 1);
3125 expand_start_cond (sentry, 0);
3126 }
3127
3128 expand_start_target_temps ();
3129
3130 if (IS_AGGR_TYPE (TREE_TYPE (decl))
3131 || TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
3132 expand_aggr_init (decl, init, 0, 0);
3133 else if (TREE_CODE (init) == TREE_VEC)
3134 {
3135 expand_expr (expand_vec_init (decl, TREE_VEC_ELT (init, 0),
3136 TREE_VEC_ELT (init, 1),
3137 TREE_VEC_ELT (init, 2), 0),
3138 const0_rtx, VOIDmode, EXPAND_NORMAL);
3139 }
3140 else
3141 expand_assignment (decl, init, 0, 0);
3142
3143 /* Cleanup any temporaries needed for the initial value. */
3144 expand_end_target_temps ();
3145
3146 if (protect)
3147 expand_end_cond ();
3148
3149 DECL_CLASS_CONTEXT (current_function_decl) = NULL_TREE;
3150 DECL_STATIC_FUNCTION_P (current_function_decl) = 0;
3151 }
3152 else if (decl == error_mark_node)
3153 ;
3154 else my_friendly_abort (22);
3155
3156 next_mess:
3157 vars = TREE_CHAIN (vars);
3158 }
3159
3160 for (; static_ctors; static_ctors = TREE_CHAIN (static_ctors))
3161 expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors),
3162 NULL_TREE));
3163
3164 expand_end_bindings (getdecls (), 1, 0);
3165 poplevel (1, 0, 0);
3166 pop_momentary ();
3167
3168 finish_function (lineno, 0, 0);
3169 assemble_constructor (IDENTIFIER_POINTER (fnname));
3170 }
3171
3172 permanent_allocation (1);
3173
3174 /* Done with C language context needs. */
3175 pop_lang_context ();
3176
3177 /* Now write out any static class variables (which may have since
3178 learned how to be initialized). */
3179 while (pending_statics)
3180 {
3181 tree decl = TREE_VALUE (pending_statics);
3182
3183 /* Output DWARF debug information. */
3184 #ifdef DWARF_DEBUGGING_INFO
3185 if (write_symbols == DWARF_DEBUG)
3186 dwarfout_file_scope_decl (decl, 1);
3187 #endif
3188 #ifdef DWARF2_DEBUGGING_INFO
3189 if (write_symbols == DWARF2_DEBUG)
3190 dwarf2out_decl (decl);
3191 #endif
3192
3193 DECL_DEFER_OUTPUT (decl) = 0;
3194 rest_of_decl_compilation
3195 (decl, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), 1, 1);
3196
3197 pending_statics = TREE_CHAIN (pending_statics);
3198 }
3199
3200 this_time = get_run_time ();
3201 parse_time -= this_time - start_time;
3202 varconst_time += this_time - start_time;
3203
3204 start_time = get_run_time ();
3205
3206 if (flag_handle_signatures)
3207 walk_sigtables ((void (*) PROTO ((tree, tree))) 0,
3208 finish_sigtable_vardecl);
3209
3210 for (fnname = saved_inlines; fnname; fnname = TREE_CHAIN (fnname))
3211 {
3212 tree decl = TREE_VALUE (fnname);
3213 import_export_decl (decl);
3214 }
3215
3216 /* Now write out inline functions which had their addresses taken and
3217 which were not declared virtual and which were not declared `extern
3218 inline'. */
3219 {
3220 int reconsider = 1; /* More may be referenced; check again */
3221
3222 while (reconsider)
3223 {
3224 tree *p = &saved_inlines;
3225 reconsider = 0;
3226
3227 /* We need to do this each time so that newly completed template
3228 types don't wind up at the front of the list. Sigh. */
3229 vars = build_decl (TYPE_DECL, make_anon_name (), integer_type_node);
3230 DECL_IGNORED_P (vars) = 1;
3231 SET_DECL_ARTIFICIAL (vars);
3232 pushdecl (vars);
3233
3234 reconsider |= walk_vtables ((void (*) PROTO((tree, tree))) 0,
3235 finish_vtable_vardecl);
3236
3237 while (*p)
3238 {
3239 tree decl = TREE_VALUE (*p);
3240
3241 if (DECL_ARTIFICIAL (decl) && ! DECL_INITIAL (decl)
3242 && TREE_USED (decl)
3243 && (! DECL_REALLY_EXTERN (decl) || DECL_INLINE (decl)))
3244 {
3245 if (DECL_MUTABLE_P (decl))
3246 synthesize_tinfo_fn (decl);
3247 else
3248 synthesize_method (decl);
3249 reconsider = 1;
3250 }
3251
3252 /* Catch new template instantiations. */
3253 if (decl != TREE_VALUE (*p))
3254 continue;
3255
3256 if (TREE_ASM_WRITTEN (decl)
3257 || (DECL_SAVED_INSNS (decl) == 0 && ! DECL_ARTIFICIAL (decl)))
3258 *p = TREE_CHAIN (*p);
3259 else if (DECL_INITIAL (decl) == 0)
3260 p = &TREE_CHAIN (*p);
3261 else if ((TREE_PUBLIC (decl) && ! DECL_COMDAT (decl))
3262 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
3263 || flag_keep_inline_functions)
3264 {
3265 if (DECL_NOT_REALLY_EXTERN (decl))
3266 {
3267 DECL_EXTERNAL (decl) = 0;
3268 reconsider = 1;
3269 /* We can't inline this function after it's been
3270 emitted. We want a variant of
3271 output_inline_function that doesn't prevent
3272 subsequent integration... */
3273 DECL_INLINE (decl) = 0;
3274 output_inline_function (decl);
3275 permanent_allocation (1);
3276 }
3277
3278 *p = TREE_CHAIN (*p);
3279 }
3280 else
3281 p = &TREE_CHAIN (*p);
3282 }
3283 }
3284 }
3285
3286 /* Now delete from the chain of variables all virtual function tables.
3287 We output them all ourselves, because each will be treated specially. */
3288
3289 walk_vtables ((void (*) PROTO((tree, tree))) 0,
3290 prune_vtable_vardecl);
3291
3292 if (write_virtuals == 2)
3293 {
3294 /* Now complain about an virtual function tables promised
3295 but not delivered. */
3296 while (pending_vtables)
3297 {
3298 if (TREE_PURPOSE (pending_vtables) == NULL_TREE)
3299 error ("virtual function table for `%s' not defined",
3300 IDENTIFIER_POINTER (TREE_VALUE (pending_vtables)));
3301 pending_vtables = TREE_CHAIN (pending_vtables);
3302 }
3303 }
3304
3305 finish_repo ();
3306
3307 this_time = get_run_time ();
3308 parse_time -= this_time - start_time;
3309 varconst_time += this_time - start_time;
3310
3311 if (flag_detailed_statistics)
3312 {
3313 dump_tree_statistics ();
3314 dump_time_statistics ();
3315 }
3316 }
3317
3318 /* This is something of the form 'A()()()()()+1' that has turned out to be an
3319 expr. Since it was parsed like a type, we need to wade through and fix
3320 that. Unfortunately, since operator() is left-associative, we can't use
3321 tail recursion. In the above example, TYPE is `A', and DECL is
3322 `()()()()()'.
3323
3324 Maybe this shouldn't be recursive, but how often will it actually be
3325 used? (jason) */
3326
3327 tree
3328 reparse_absdcl_as_expr (type, decl)
3329 tree type, decl;
3330 {
3331 /* do build_functional_cast (type, NULL_TREE) at bottom */
3332 if (TREE_OPERAND (decl, 0) == NULL_TREE)
3333 return build_functional_cast (type, NULL_TREE);
3334
3335 /* recurse */
3336 decl = reparse_decl_as_expr (type, TREE_OPERAND (decl, 0));
3337
3338 decl = build_x_function_call (decl, NULL_TREE, current_class_ref);
3339
3340 if (TREE_CODE (decl) == CALL_EXPR && TREE_TYPE (decl) != void_type_node)
3341 decl = require_complete_type (decl);
3342
3343 return decl;
3344 }
3345
3346 /* This is something of the form `int ((int)(int)(int)1)' that has turned
3347 out to be an expr. Since it was parsed like a type, we need to wade
3348 through and fix that. Since casts are right-associative, we are
3349 reversing the order, so we don't have to recurse.
3350
3351 In the above example, DECL is the `(int)(int)(int)', and EXPR is the
3352 `1'. */
3353
3354 tree
3355 reparse_absdcl_as_casts (decl, expr)
3356 tree decl, expr;
3357 {
3358 tree type;
3359
3360 if (TREE_CODE (expr) == CONSTRUCTOR
3361 && TREE_TYPE (expr) == 0)
3362 {
3363 type = groktypename (TREE_VALUE (TREE_OPERAND (decl, 1)));
3364 decl = TREE_OPERAND (decl, 0);
3365
3366 if (IS_SIGNATURE (type))
3367 {
3368 error ("cast specifies signature type");
3369 return error_mark_node;
3370 }
3371
3372 expr = digest_init (type, expr, (tree *) 0);
3373 if (TREE_CODE (type) == ARRAY_TYPE && TYPE_SIZE (type) == 0)
3374 {
3375 int failure = complete_array_type (type, expr, 1);
3376 if (failure)
3377 my_friendly_abort (78);
3378 }
3379 }
3380
3381 while (decl)
3382 {
3383 type = groktypename (TREE_VALUE (TREE_OPERAND (decl, 1)));
3384 decl = TREE_OPERAND (decl, 0);
3385 expr = build_c_cast (type, expr);
3386 }
3387
3388 if (warn_old_style_cast)
3389 warning ("use of old-style cast");
3390
3391 return expr;
3392 }
3393
3394 /* Given plain tree nodes for an expression, build up the full semantics. */
3395
3396 tree
3397 build_expr_from_tree (t)
3398 tree t;
3399 {
3400 if (t == NULL_TREE || t == error_mark_node)
3401 return t;
3402
3403 switch (TREE_CODE (t))
3404 {
3405 case IDENTIFIER_NODE:
3406 return do_identifier (t, 0);
3407
3408 case LOOKUP_EXPR:
3409 if (LOOKUP_EXPR_GLOBAL (t))
3410 return do_scoped_id (TREE_OPERAND (t, 0), 0);
3411 else
3412 return do_identifier (TREE_OPERAND (t, 0), 0);
3413
3414 case TEMPLATE_ID_EXPR:
3415 return (lookup_template_function
3416 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3417 build_expr_from_tree (TREE_OPERAND (t, 1))));
3418
3419 case INDIRECT_REF:
3420 return build_x_indirect_ref
3421 (build_expr_from_tree (TREE_OPERAND (t, 0)), "unary *");
3422
3423 case CAST_EXPR:
3424 return build_functional_cast
3425 (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3426
3427 case REINTERPRET_CAST_EXPR:
3428 return build_reinterpret_cast
3429 (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3430
3431 case CONST_CAST_EXPR:
3432 return build_const_cast
3433 (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3434
3435 case DYNAMIC_CAST_EXPR:
3436 return build_dynamic_cast
3437 (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3438
3439 case STATIC_CAST_EXPR:
3440 return build_static_cast
3441 (TREE_TYPE (t), build_expr_from_tree (TREE_OPERAND (t, 0)));
3442
3443 case PREDECREMENT_EXPR:
3444 case PREINCREMENT_EXPR:
3445 case POSTDECREMENT_EXPR:
3446 case POSTINCREMENT_EXPR:
3447 case NEGATE_EXPR:
3448 case BIT_NOT_EXPR:
3449 case ABS_EXPR:
3450 case TRUTH_NOT_EXPR:
3451 case ADDR_EXPR:
3452 case CONVERT_EXPR: /* Unary + */
3453 if (TREE_TYPE (t))
3454 return t;
3455 return build_x_unary_op (TREE_CODE (t),
3456 build_expr_from_tree (TREE_OPERAND (t, 0)));
3457
3458 case PLUS_EXPR:
3459 case MINUS_EXPR:
3460 case MULT_EXPR:
3461 case TRUNC_DIV_EXPR:
3462 case CEIL_DIV_EXPR:
3463 case FLOOR_DIV_EXPR:
3464 case ROUND_DIV_EXPR:
3465 case EXACT_DIV_EXPR:
3466 case BIT_AND_EXPR:
3467 case BIT_ANDTC_EXPR:
3468 case BIT_IOR_EXPR:
3469 case BIT_XOR_EXPR:
3470 case TRUNC_MOD_EXPR:
3471 case FLOOR_MOD_EXPR:
3472 case TRUTH_ANDIF_EXPR:
3473 case TRUTH_ORIF_EXPR:
3474 case TRUTH_AND_EXPR:
3475 case TRUTH_OR_EXPR:
3476 case RSHIFT_EXPR:
3477 case LSHIFT_EXPR:
3478 case RROTATE_EXPR:
3479 case LROTATE_EXPR:
3480 case EQ_EXPR:
3481 case NE_EXPR:
3482 case MAX_EXPR:
3483 case MIN_EXPR:
3484 case LE_EXPR:
3485 case GE_EXPR:
3486 case LT_EXPR:
3487 case GT_EXPR:
3488 case MEMBER_REF:
3489 return build_x_binary_op
3490 (TREE_CODE (t),
3491 build_expr_from_tree (TREE_OPERAND (t, 0)),
3492 build_expr_from_tree (TREE_OPERAND (t, 1)));
3493
3494 case DOTSTAR_EXPR:
3495 return build_m_component_ref
3496 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3497 build_expr_from_tree (TREE_OPERAND (t, 1)));
3498
3499 case SCOPE_REF:
3500 return build_offset_ref (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1));
3501
3502 case ARRAY_REF:
3503 if (TREE_OPERAND (t, 0) == NULL_TREE)
3504 /* new-type-id */
3505 return build_parse_node (ARRAY_REF, NULL_TREE,
3506 build_expr_from_tree (TREE_OPERAND (t, 1)));
3507 return grok_array_decl (build_expr_from_tree (TREE_OPERAND (t, 0)),
3508 build_expr_from_tree (TREE_OPERAND (t, 1)));
3509
3510 case SIZEOF_EXPR:
3511 case ALIGNOF_EXPR:
3512 {
3513 tree r = build_expr_from_tree (TREE_OPERAND (t, 0));
3514 if (TREE_CODE_CLASS (TREE_CODE (r)) != 't')
3515 r = TREE_TYPE (r);
3516 return TREE_CODE (t) == SIZEOF_EXPR ? c_sizeof (r) : c_alignof (r);
3517 }
3518
3519 case MODOP_EXPR:
3520 return build_x_modify_expr
3521 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3522 TREE_CODE (TREE_OPERAND (t, 1)),
3523 build_expr_from_tree (TREE_OPERAND (t, 2)));
3524
3525 case ARROW_EXPR:
3526 return build_x_arrow
3527 (build_expr_from_tree (TREE_OPERAND (t, 0)));
3528
3529 case NEW_EXPR:
3530 return build_new
3531 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3532 build_expr_from_tree (TREE_OPERAND (t, 1)),
3533 build_expr_from_tree (TREE_OPERAND (t, 2)),
3534 NEW_EXPR_USE_GLOBAL (t));
3535
3536 case DELETE_EXPR:
3537 return delete_sanity
3538 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3539 build_expr_from_tree (TREE_OPERAND (t, 1)),
3540 DELETE_EXPR_USE_VEC (t), DELETE_EXPR_USE_GLOBAL (t));
3541
3542 case COMPOUND_EXPR:
3543 if (TREE_OPERAND (t, 1) == NULL_TREE)
3544 return build_x_compound_expr
3545 (build_expr_from_tree (TREE_OPERAND (t, 0)));
3546 else
3547 my_friendly_abort (42);
3548
3549 case METHOD_CALL_EXPR:
3550 if (TREE_CODE (TREE_OPERAND (t, 0)) == SCOPE_REF)
3551 {
3552 tree ref = TREE_OPERAND (t, 0);
3553 return build_scoped_method_call
3554 (build_expr_from_tree (TREE_OPERAND (t, 1)),
3555 build_expr_from_tree (TREE_OPERAND (ref, 0)),
3556 TREE_OPERAND (ref, 1),
3557 build_expr_from_tree (TREE_OPERAND (t, 2)));
3558 }
3559 return build_method_call
3560 (build_expr_from_tree (TREE_OPERAND (t, 1)),
3561 TREE_OPERAND (t, 0),
3562 build_expr_from_tree (TREE_OPERAND (t, 2)),
3563 NULL_TREE, LOOKUP_NORMAL);
3564
3565 case CALL_EXPR:
3566 if (TREE_CODE (TREE_OPERAND (t, 0)) == SCOPE_REF)
3567 {
3568 tree ref = TREE_OPERAND (t, 0);
3569 return build_member_call
3570 (build_expr_from_tree (TREE_OPERAND (ref, 0)),
3571 TREE_OPERAND (ref, 1),
3572 build_expr_from_tree (TREE_OPERAND (t, 1)));
3573 }
3574 else
3575 {
3576 tree name = TREE_OPERAND (t, 0);
3577 if (TREE_CODE (name) == TEMPLATE_ID_EXPR
3578 || ! really_overloaded_fn (name))
3579 name = build_expr_from_tree (name);
3580 return build_x_function_call
3581 (name, build_expr_from_tree (TREE_OPERAND (t, 1)),
3582 current_class_ref);
3583 }
3584
3585 case COND_EXPR:
3586 return build_x_conditional_expr
3587 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3588 build_expr_from_tree (TREE_OPERAND (t, 1)),
3589 build_expr_from_tree (TREE_OPERAND (t, 2)));
3590
3591 case TREE_LIST:
3592 {
3593 tree purpose, value, chain;
3594
3595 if (t == void_list_node)
3596 return t;
3597
3598 purpose = TREE_PURPOSE (t);
3599 if (purpose)
3600 purpose = build_expr_from_tree (purpose);
3601 value = TREE_VALUE (t);
3602 if (value)
3603 value = build_expr_from_tree (value);
3604 chain = TREE_CHAIN (t);
3605 if (chain && chain != void_type_node)
3606 chain = build_expr_from_tree (chain);
3607 return expr_tree_cons (purpose, value, chain);
3608 }
3609
3610 case COMPONENT_REF:
3611 return build_x_component_ref
3612 (build_expr_from_tree (TREE_OPERAND (t, 0)),
3613 TREE_OPERAND (t, 1), NULL_TREE, 1);
3614
3615 case THROW_EXPR:
3616 return build_throw (build_expr_from_tree (TREE_OPERAND (t, 0)));
3617
3618 case CONSTRUCTOR:
3619 {
3620 tree r = build_nt (CONSTRUCTOR, NULL_TREE,
3621 build_expr_from_tree (CONSTRUCTOR_ELTS (t)));
3622
3623 if (TREE_TYPE (t))
3624 return digest_init (TREE_TYPE (t), r, 0);
3625 return r;
3626 }
3627
3628 case TYPEID_EXPR:
3629 if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t, 0))) == 't')
3630 return get_typeid (TREE_OPERAND (t, 0));
3631 return build_x_typeid (build_expr_from_tree (TREE_OPERAND (t, 0)));
3632
3633 case VAR_DECL:
3634 return convert_from_reference (t);
3635
3636 default:
3637 return t;
3638 }
3639 }
3640
3641 /* This is something of the form `int (*a)++' that has turned out to be an
3642 expr. It was only converted into parse nodes, so we need to go through
3643 and build up the semantics. Most of the work is done by
3644 build_expr_from_tree, above.
3645
3646 In the above example, TYPE is `int' and DECL is `*a'. */
3647
3648 tree
3649 reparse_decl_as_expr (type, decl)
3650 tree type, decl;
3651 {
3652 decl = build_expr_from_tree (decl);
3653 if (type)
3654 return build_functional_cast (type, build_expr_list (NULL_TREE, decl));
3655 else
3656 return decl;
3657 }
3658
3659 /* This is something of the form `int (*a)' that has turned out to be a
3660 decl. It was only converted into parse nodes, so we need to do the
3661 checking that make_{pointer,reference}_declarator do. */
3662
3663 tree
3664 finish_decl_parsing (decl)
3665 tree decl;
3666 {
3667 extern int current_class_depth;
3668
3669 switch (TREE_CODE (decl))
3670 {
3671 case IDENTIFIER_NODE:
3672 return decl;
3673 case INDIRECT_REF:
3674 return make_pointer_declarator
3675 (NULL_TREE, finish_decl_parsing (TREE_OPERAND (decl, 0)));
3676 case ADDR_EXPR:
3677 return make_reference_declarator
3678 (NULL_TREE, finish_decl_parsing (TREE_OPERAND (decl, 0)));
3679 case BIT_NOT_EXPR:
3680 TREE_OPERAND (decl, 0) = finish_decl_parsing (TREE_OPERAND (decl, 0));
3681 return decl;
3682 case SCOPE_REF:
3683 push_nested_class (TREE_TYPE (TREE_OPERAND (decl, 0)), 3);
3684 TREE_COMPLEXITY (decl) = current_class_depth;
3685 return decl;
3686 case ARRAY_REF:
3687 TREE_OPERAND (decl, 0) = finish_decl_parsing (TREE_OPERAND (decl, 0));
3688 return decl;
3689 default:
3690 my_friendly_abort (5);
3691 return NULL_TREE;
3692 }
3693 }
3694
3695 tree
3696 check_cp_case_value (value)
3697 tree value;
3698 {
3699 if (value == NULL_TREE)
3700 return value;
3701
3702 /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */
3703 STRIP_TYPE_NOPS (value);
3704
3705 if (TREE_READONLY_DECL_P (value))
3706 {
3707 value = decl_constant_value (value);
3708 STRIP_TYPE_NOPS (value);
3709 }
3710 value = fold (value);
3711
3712 if (TREE_CODE (value) != INTEGER_CST
3713 && value != error_mark_node)
3714 {
3715 cp_error ("case label `%E' does not reduce to an integer constant",
3716 value);
3717 value = error_mark_node;
3718 }
3719 else
3720 /* Promote char or short to int. */
3721 value = default_conversion (value);
3722
3723 constant_expression_warning (value);
3724
3725 return value;
3726 }
3727
3728 tree current_namespace;
3729
3730 /* Get the inner part of a namespace id. It doesn't have any prefix, nor
3731 postfix. Returns 0 if in global namespace. */
3732
3733 tree
3734 get_namespace_id ()
3735 {
3736 tree x = current_namespace;
3737 if (x)
3738 x = TREE_PURPOSE (x);
3739 return x;
3740 }
3741
3742 /* Build up a DECL_ASSEMBLER_NAME for NAME in the current namespace. */
3743
3744 tree
3745 current_namespace_id (name)
3746 tree name;
3747 {
3748 tree old_id = get_namespace_id ();
3749 char *buf;
3750
3751 /* Global names retain old encoding. */
3752 if (! old_id)
3753 return name;
3754
3755 buf = (char *) alloca (8 + IDENTIFIER_LENGTH (old_id)
3756 + IDENTIFIER_LENGTH (name));
3757 sprintf (buf, "__ns_%s_%s", IDENTIFIER_POINTER (old_id),
3758 IDENTIFIER_POINTER (name));
3759 return get_identifier (buf);
3760 }
3761
3762 void
3763 do_namespace_alias (alias, namespace)
3764 tree alias, namespace;
3765 {
3766 sorry ("namespace alias");
3767 }
3768
3769 void
3770 do_toplevel_using_decl (decl)
3771 tree decl;
3772 {
3773 #if 1
3774 if (TREE_CODE (decl) == SCOPE_REF
3775 && TREE_OPERAND (decl, 0) == std_node)
3776 return;
3777 sorry ("using-declaration");
3778 #else
3779 if (decl == NULL_TREE || decl == error_mark_node)
3780 return;
3781
3782 if (TREE_CODE (decl) == SCOPE_REF)
3783 decl = resolve_scope_to_name (NULL_TREE, decl);
3784
3785 /* Is this the right way to do an id list? */
3786 if (TREE_CODE (decl) != TREE_LIST)
3787 {
3788 pushdecl (decl);
3789 }
3790 else
3791 while (decl)
3792 {
3793 pushdecl (TREE_VALUE (decl));
3794 decl = TREE_CHAIN (decl);
3795 }
3796 #endif
3797 }
3798
3799 tree
3800 do_class_using_decl (decl)
3801 tree decl;
3802 {
3803 tree name, value;
3804
3805 if (TREE_CODE (decl) != SCOPE_REF)
3806 {
3807 cp_error ("using-declaration for non-member at class scope");
3808 return NULL_TREE;
3809 }
3810 name = TREE_OPERAND (decl, 1);
3811 if (TREE_CODE (name) == BIT_NOT_EXPR)
3812 {
3813 cp_error ("using-declaration for destructor");
3814 return NULL_TREE;
3815 }
3816
3817 value = build_lang_field_decl (USING_DECL, name, void_type_node);
3818 DECL_INITIAL (value) = TREE_OPERAND (decl, 0);
3819 return value;
3820 }
3821
3822 void
3823 do_using_directive (namespace)
3824 tree namespace;
3825 {
3826 if (namespace == std_node)
3827 return;
3828 sorry ("using directive");
3829 }
3830
3831 void
3832 check_default_args (x)
3833 tree x;
3834 {
3835 tree arg = TYPE_ARG_TYPES (TREE_TYPE (x));
3836 int saw_def = 0, i = 0 - (TREE_CODE (TREE_TYPE (x)) == METHOD_TYPE);
3837 for (; arg && arg != void_list_node; arg = TREE_CHAIN (arg), ++i)
3838 {
3839 if (TREE_PURPOSE (arg))
3840 saw_def = 1;
3841 else if (saw_def)
3842 {
3843 cp_error ("default argument missing for parameter %P of `%#D'",
3844 i, x);
3845 break;
3846 }
3847 }
3848 }
3849
3850 void
3851 mark_used (decl)
3852 tree decl;
3853 {
3854 TREE_USED (decl) = 1;
3855 if (processing_template_decl)
3856 return;
3857 assemble_external (decl);
3858 /* Is it a synthesized method that needs to be synthesized? */
3859 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_CLASS_CONTEXT (decl)
3860 && DECL_ARTIFICIAL (decl) && ! DECL_INITIAL (decl)
3861 /* Kludge: don't synthesize for default args. */
3862 && current_function_decl)
3863 synthesize_method (decl);
3864 if (DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl))
3865 instantiate_decl (decl);
3866 }
3867
3868 /* Helper function for named_class_head_sans_basetype nonterminal. */
3869
3870 tree
3871 handle_class_head (aggr, scope, id)
3872 tree aggr, scope, id;
3873 {
3874 if (TREE_CODE (id) == TYPE_DECL)
3875 return id;
3876
3877 if (scope)
3878 cp_error ("`%T' does not have a nested type named `%D'", scope, id);
3879 else
3880 cp_error ("no file-scope type named `%D'", id);
3881
3882 id = xref_tag
3883 (aggr, make_anon_name (), NULL_TREE, 1);
3884 return TYPE_MAIN_DECL (id);
3885 }
This page took 0.217136 seconds and 6 git commands to generate.