source: trunk/third/gcc/cp/decl2.c @ 8834

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