OSDN Git Service

* cp-tree.h (finish_class_definition): Add parameter.
[pf3gnuchains/gcc-fork.git] / gcc / cp / semantics.c
1 /* Perform the semantic phase of parsing, i.e., the process of
2    building tree structure, checking semantic consistency, and
3    building RTL.  These routines are used both during actual parsing
4    and during the instantiation of template functions. 
5
6    Copyright (C) 1998, 1999 Free Software Foundation, Inc.
7    Written by Mark Mitchell (mmitchell@usa.net) based on code found
8    formerly in parse.y and pt.c.  
9
10    This file is part of GNU CC.
11
12    GNU CC is free software; you can redistribute it and/or modify it
13    under the terms of the GNU General Public License as published by
14    the Free Software Foundation; either version 2, or (at your option)
15    any later version.
16    
17    GNU CC is distributed in the hope that it will be useful, but
18    WITHOUT ANY WARRANTY; without even the implied warranty of
19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20    General Public License for more details.
21    
22    You should have received a copy of the GNU General Public License
23    along with GNU CC; see the file COPYING.  If not, write to the Free
24    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
25    02111-1307, USA.  */
26
27 #include "config.h"
28 #include "system.h"
29 #include "tree.h"
30 #include "cp-tree.h"
31 #include "except.h"
32 #include "lex.h"
33 #include "toplev.h"
34
35 /* There routines provide a modular interface to perform many parsing
36    operations.  They may therefore be used during actual parsing, or
37    during template instantiation, which may be regarded as a
38    degenerate form of parsing.  Since the current g++ parser is
39    lacking in several respects, and will be reimplemented, we are
40    attempting to move most code that is not directly related to
41    parsing into this file; that will make implementing the new parser
42    much easier since it will be able to make use of these routines.  */
43
44 /* When parsing a template, LAST_TREE contains the last statement
45    parsed.  These are chained together through the TREE_CHAIN field,
46    but often need to be re-organized since the parse is performed
47    bottom-up.  This macro makes LAST_TREE the indicated SUBSTMT of
48    STMT.  */
49
50 #define RECHAIN_STMTS(stmt, substmt, last)      \
51   do {                                          \
52     substmt = last;                             \
53     TREE_CHAIN (stmt) = NULL_TREE;              \
54     last_tree = stmt;                           \
55   } while (0)
56
57 #define RECHAIN_STMTS_FROM_LAST(stmt, substmt)  \
58   RECHAIN_STMTS (stmt, substmt, last_tree)
59
60 #define RECHAIN_STMTS_FROM_CHAIN(stmt, substmt) \
61   RECHAIN_STMTS (stmt, substmt, TREE_CHAIN (stmt))
62
63 /* Finish an expression-statement, whose EXPRESSION is as indicated.  */
64
65 void 
66 finish_expr_stmt (expr)
67      tree expr;
68 {
69   if (expr != NULL_TREE)
70     {
71       if (!processing_template_decl)
72         {
73           emit_line_note (input_filename, lineno);
74           /* Do default conversion if safe and possibly important,
75              in case within ({...}).  */
76           if ((TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE
77                && lvalue_p (expr))
78               || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE)
79             expr = default_conversion (expr);
80         }
81       
82       cplus_expand_expr_stmt (expr);
83       clear_momentary ();
84     }
85
86   finish_stmt ();
87 }
88
89 /* Begin an if-statement.  Returns a newly created IF_STMT if
90    appropriate.  */
91
92 tree
93 begin_if_stmt ()
94 {
95   tree r;
96
97   if (processing_template_decl)
98     {
99       r = build_min_nt (IF_STMT, NULL_TREE, NULL_TREE, NULL_TREE);
100       add_tree (r);
101     }
102   else
103     r = NULL_TREE;
104
105   do_pushlevel ();
106
107   return r;
108 }
109
110 /* Process the COND of an if-statement, which may be given by
111    IF_STMT.  */
112
113 void 
114 finish_if_stmt_cond (cond, if_stmt)
115      tree cond;
116      tree if_stmt;
117 {
118   if (processing_template_decl)
119     {
120       if (last_tree != if_stmt)
121         RECHAIN_STMTS_FROM_LAST (if_stmt, IF_COND (if_stmt));
122       else
123         IF_COND (if_stmt) = cond;
124     }
125   else
126     {
127       emit_line_note (input_filename, lineno);
128       expand_start_cond (condition_conversion (cond), 0);
129     }
130 }
131
132 /* Finish the then-clause of an if-statement, which may be given by
133    IF_STMT.  */
134
135 tree
136 finish_then_clause (if_stmt)
137      tree if_stmt;
138 {
139   if (processing_template_decl)
140     {
141       RECHAIN_STMTS_FROM_CHAIN (if_stmt, 
142                                 THEN_CLAUSE (if_stmt));
143       last_tree = if_stmt;
144       return if_stmt;
145     }
146   else
147     return NULL_TREE;
148 }
149
150 /* Begin the else-clause of an if-statement.  */
151
152 void 
153 begin_else_clause ()
154 {
155   if (!processing_template_decl)
156     expand_start_else ();
157 }
158
159 /* Finish the else-clause of an if-statement, which may be given by
160    IF_STMT.  */
161
162 void
163 finish_else_clause (if_stmt)
164      tree if_stmt;
165 {
166   if (processing_template_decl)
167     RECHAIN_STMTS_FROM_CHAIN (if_stmt, ELSE_CLAUSE (if_stmt));
168 }
169
170 /* Finsh an if-statement.  */
171
172 void 
173 finish_if_stmt ()
174 {
175   if (!processing_template_decl)
176     expand_end_cond ();
177
178   do_poplevel ();
179   finish_stmt ();
180 }
181
182 /* Begin a while-statement.  Returns a newly created WHILE_STMT if
183    appropriate.  */
184
185 tree
186 begin_while_stmt ()
187 {
188   tree r;
189
190   if (processing_template_decl)
191     {
192       r = build_min_nt (WHILE_STMT, NULL_TREE, NULL_TREE);
193       add_tree (r);
194     }
195   else
196     {
197       emit_nop ();
198       emit_line_note (input_filename, lineno);
199       expand_start_loop (1); 
200       r = NULL_TREE;
201     }
202
203   do_pushlevel ();
204
205   return r;
206 }
207
208 /* Process the COND of an if-statement, which may be given by
209    WHILE_STMT.  */
210
211 void 
212 finish_while_stmt_cond (cond, while_stmt)
213      tree cond;
214      tree while_stmt;
215 {
216   if (processing_template_decl)
217     {
218       if (last_tree != while_stmt)
219         RECHAIN_STMTS_FROM_LAST (while_stmt, 
220                                       WHILE_COND (while_stmt)); 
221       else
222         TREE_OPERAND (while_stmt, 0) = cond;
223     }
224   else
225     {
226       emit_line_note (input_filename, lineno);
227       expand_exit_loop_if_false (0, condition_conversion (cond));
228     }
229
230   /* If COND wasn't a declaration, clear out the
231      block we made for it and start a new one here so the
232      optimization in expand_end_loop will work.  */
233   if (getdecls () == NULL_TREE)
234     {
235       do_poplevel ();
236       do_pushlevel ();
237     }
238 }
239
240 /* Finish a while-statement, which may be given by WHILE_STMT.  */
241
242 void 
243 finish_while_stmt (while_stmt)
244      tree while_stmt;
245 {
246   do_poplevel ();
247
248   if (processing_template_decl)
249     RECHAIN_STMTS_FROM_CHAIN (while_stmt, WHILE_BODY (while_stmt));
250   else
251     expand_end_loop ();
252   finish_stmt ();
253 }
254
255 /* Begin a do-statement.  Returns a newly created DO_STMT if
256    appropriate.  */
257
258 tree
259 begin_do_stmt ()
260 {
261   if (processing_template_decl)
262     {
263       tree r = build_min_nt (DO_STMT, NULL_TREE, NULL_TREE);
264       add_tree (r);
265       return r;
266     }
267   else
268     {
269       emit_nop ();
270       emit_line_note (input_filename, lineno);
271       expand_start_loop_continue_elsewhere (1);
272       return NULL_TREE;
273     }
274 }
275
276 /* Finish the body of a do-statement, which may be given by DO_STMT.  */
277
278 void
279 finish_do_body (do_stmt)
280      tree do_stmt;
281 {
282   if (processing_template_decl)
283     RECHAIN_STMTS_FROM_CHAIN (do_stmt, DO_BODY (do_stmt));
284   else
285     expand_loop_continue_here ();
286 }
287
288 /* Finish a do-statement, which may be given by DO_STMT, and whose
289    COND is as indicated.  */
290
291 void
292 finish_do_stmt (cond, do_stmt)
293      tree cond;
294      tree do_stmt;
295 {
296   if (processing_template_decl)
297     DO_COND (do_stmt) = cond;
298   else
299     {
300       emit_line_note (input_filename, lineno);
301       expand_exit_loop_if_false (0, condition_conversion (cond));
302       expand_end_loop ();
303     }
304
305   clear_momentary ();
306   finish_stmt ();
307 }
308
309 /* Finish a return-statement.  The EXPRESSION returned, if any, is as
310    indicated.  */
311
312 void
313 finish_return_stmt (expr)
314      tree expr;
315 {
316   emit_line_note (input_filename, lineno);
317   c_expand_return (expr);
318   finish_stmt ();
319 }
320
321 /* Begin a for-statement.  Returns a new FOR_STMT if appropriate.  */
322
323 tree
324 begin_for_stmt ()
325 {
326   tree r;
327
328   if (processing_template_decl)
329     {
330       r = build_min_nt (FOR_STMT, NULL_TREE, NULL_TREE, 
331                         NULL_TREE, NULL_TREE);
332       add_tree (r);
333     }
334   else
335     r = NULL_TREE;
336
337   if (flag_new_for_scope > 0)
338     {
339       do_pushlevel ();
340       note_level_for_for ();
341     }
342
343   return r;
344 }
345
346 /* Finish the for-init-statement of a for-statement, which may be
347    given by FOR_STMT.  */
348
349 void
350 finish_for_init_stmt (for_stmt)
351      tree for_stmt;
352 {
353   if (processing_template_decl)
354     {
355       if (last_tree != for_stmt)
356         RECHAIN_STMTS_FROM_CHAIN (for_stmt, FOR_INIT_STMT (for_stmt));
357     }
358   else
359     {
360       emit_nop ();
361       emit_line_note (input_filename, lineno);
362       expand_start_loop_continue_elsewhere (1); 
363     }
364
365   do_pushlevel ();
366 }
367
368 /* Finish the COND of a for-statement, which may be given by
369    FOR_STMT.  */
370
371 void
372 finish_for_cond (cond, for_stmt)
373      tree cond;
374      tree for_stmt;
375 {
376   if (processing_template_decl)
377     {
378       if (last_tree != for_stmt)
379         RECHAIN_STMTS_FROM_LAST (for_stmt, FOR_COND (for_stmt));
380       else
381         FOR_COND (for_stmt) = cond;
382     }
383   else
384     {
385       emit_line_note (input_filename, lineno);
386       if (cond)
387         expand_exit_loop_if_false (0, condition_conversion (cond));
388     }
389   
390   /* If the cond wasn't a declaration, clear out the
391      block we made for it and start a new one here so the
392      optimization in expand_end_loop will work.  */
393   if (getdecls () == NULL_TREE)
394     {
395       do_poplevel ();
396       do_pushlevel ();
397     }  
398 }
399
400 /* Finish the increment-EXPRESSION in a for-statement, which may be
401    given by FOR_STMT.  */
402
403 void
404 finish_for_expr (expr, for_stmt)
405      tree expr;
406      tree for_stmt;
407 {
408   if (processing_template_decl)
409     FOR_EXPR (for_stmt) = expr;
410
411   /* Don't let the tree nodes for EXPR be discarded
412      by clear_momentary during the parsing of the next stmt.  */
413   push_momentary ();
414 }
415
416 /* Finish the body of a for-statement, which may be given by
417    FOR_STMT.  The increment-EXPR for the loop must be
418    provided.  */
419
420 void
421 finish_for_stmt (expr, for_stmt)
422      tree expr;
423      tree for_stmt;
424 {
425   /* Pop the scope for the body of the loop.  */
426   do_poplevel ();
427
428   if (processing_template_decl)
429     RECHAIN_STMTS_FROM_CHAIN (for_stmt, FOR_BODY (for_stmt));
430   else
431     {
432       emit_line_note (input_filename, lineno);
433       expand_loop_continue_here ();
434       if (expr) 
435         cplus_expand_expr_stmt (expr);
436       expand_end_loop ();
437     }
438
439   pop_momentary ();
440
441   if (flag_new_for_scope > 0)
442     do_poplevel ();
443
444   finish_stmt (); 
445 }
446
447 /* Finish a break-statement.  */
448
449 void
450 finish_break_stmt ()
451 {
452   emit_line_note (input_filename, lineno);
453   if (processing_template_decl)
454     add_tree (build_min_nt (BREAK_STMT));
455   else if ( ! expand_exit_something ())
456     cp_error ("break statement not within loop or switch");
457 }
458
459 /* Finish a continue-statement.  */
460
461 void
462 finish_continue_stmt ()
463 {
464   emit_line_note (input_filename, lineno);
465   if (processing_template_decl)
466     add_tree (build_min_nt (CONTINUE_STMT));
467   else if (! expand_continue_loop (0))
468     cp_error ("continue statement not within a loop");   
469 }
470
471 /* Begin a switch-statement.  */
472
473 void
474 begin_switch_stmt ()
475 {
476   do_pushlevel ();
477 }
478
479 /* Finish the cond of a switch-statement.  Returns a new
480    SWITCH_STMT if appropriate.  */ 
481
482 tree
483 finish_switch_cond (cond)
484      tree cond;
485 {
486   tree r;
487
488   if (processing_template_decl)
489     {
490       r = build_min_nt (SWITCH_STMT, cond, NULL_TREE);
491       add_tree (r);
492     }
493   else if (cond != error_mark_node)
494     {
495       emit_line_note (input_filename, lineno);
496       c_expand_start_case (cond);
497       r = NULL_TREE;
498     }
499   else
500     {
501       /* The code is in error, but we don't want expand_end_case to
502          crash. */
503       c_expand_start_case (boolean_false_node);
504       r = NULL_TREE;
505     }
506
507   push_switch ();
508
509   /* Don't let the tree nodes for COND be discarded by
510      clear_momentary during the parsing of the next stmt.  */
511   push_momentary ();
512
513   return r;
514 }
515
516 /* Finish the body of a switch-statement, which may be given by
517    SWITCH_STMT.  The COND to switch on is indicated.  */
518
519 void
520 finish_switch_stmt (cond, switch_stmt)
521      tree cond;
522      tree switch_stmt;
523 {
524   if (processing_template_decl)
525     RECHAIN_STMTS_FROM_CHAIN (switch_stmt, SWITCH_BODY (switch_stmt));
526   else
527     expand_end_case (cond);
528   pop_momentary ();
529   pop_switch (); 
530   do_poplevel ();
531   finish_stmt ();
532 }
533
534 /* Finish a case-label.  */
535
536 void 
537 finish_case_label (low_value, high_value)
538      tree low_value;
539      tree high_value;
540 {
541   do_case (low_value, high_value);
542 }
543
544
545 /* Finish a goto-statement.  */
546
547 void
548 finish_goto_stmt (destination)
549      tree destination;
550 {
551   if (processing_template_decl)
552     add_tree (build_min_nt (GOTO_STMT, destination));
553   else
554     {
555       emit_line_note (input_filename, lineno);
556
557       if (TREE_CODE (destination) == IDENTIFIER_NODE)
558         {
559           tree decl = lookup_label (destination);
560           TREE_USED (decl) = 1;
561           expand_goto (decl); 
562         }
563       else
564         expand_computed_goto (destination);
565     }
566 }
567
568 /* Begin a try-block.  Returns a newly-created TRY_BLOCK if
569    appropriate.  */
570
571 tree
572 begin_try_block ()
573 {
574   if (processing_template_decl)
575     {
576       tree r = build_min_nt (TRY_BLOCK, NULL_TREE,
577                              NULL_TREE);
578       add_tree (r);
579       return r;
580     }
581   else
582     {
583       emit_line_note (input_filename, lineno);
584       expand_start_try_stmts ();
585       return NULL_TREE;
586     }
587 }
588
589 /* Finish a try-block, which may be given by TRY_BLOCK.  */
590
591 void
592 finish_try_block (try_block)
593      tree try_block;
594 {
595   if (processing_template_decl)
596     RECHAIN_STMTS_FROM_LAST (try_block, TRY_STMTS (try_block));
597   else
598     {
599       expand_start_all_catch ();  
600     }
601 }
602
603 /* Finish a handler-sequence for a try-block, which may be given by
604    TRY_BLOCK.  */
605
606 void
607 finish_handler_sequence (try_block)
608      tree try_block;
609 {
610   if (processing_template_decl)
611     RECHAIN_STMTS_FROM_CHAIN (try_block, TRY_HANDLERS (try_block));
612   else
613     {
614       expand_end_all_catch ();
615     }
616 }
617
618 /* Begin a handler.  Returns a HANDLER if appropriate.  */
619
620 tree
621 begin_handler ()
622 {
623   tree r;
624
625   if (processing_template_decl)
626     {
627       r = build_min_nt (HANDLER, NULL_TREE, NULL_TREE);
628       add_tree (r);
629     }
630   else
631     r = NULL_TREE;
632
633   do_pushlevel ();
634
635   return r;
636 }
637
638 /* Finish the handler-parameters for a handler, which may be given by
639    HANDLER.  */
640
641 void
642 finish_handler_parms (handler)
643      tree handler;
644 {
645   if (processing_template_decl)
646     RECHAIN_STMTS_FROM_CHAIN (handler, HANDLER_PARMS (handler));
647 }
648
649 /* Finish a handler, which may be given by HANDLER.  */
650
651 void
652 finish_handler (handler)
653      tree handler;
654 {
655   if (processing_template_decl)
656     RECHAIN_STMTS_FROM_CHAIN (handler, HANDLER_BODY (handler));
657   else
658     expand_end_catch_block ();
659
660   do_poplevel ();
661 }
662
663 /* Begin a compound-statement.  If HAS_NO_SCOPE is non-zero, the
664    compound-statement does not define a scope.  Returns a new
665    COMPOUND_STMT if appropriate.  */
666
667 tree
668 begin_compound_stmt (has_no_scope)
669      int has_no_scope;
670 {
671   tree r; 
672
673   if (processing_template_decl)
674     {
675       r = build_min_nt (COMPOUND_STMT, NULL_TREE);
676       add_tree (r);
677       if (has_no_scope)
678         COMPOUND_STMT_NO_SCOPE (r) = 1;
679     }
680   else
681     r = NULL_TREE;
682
683   if (!has_no_scope)
684     do_pushlevel ();
685
686   return r;
687 }
688
689
690 /* Finish a compound-statement, which may be given by COMPOUND_STMT.
691    If HAS_NO_SCOPE is non-zero, the compound statement does not define
692    a scope.  */
693
694 tree
695 finish_compound_stmt (has_no_scope, compound_stmt)
696      int has_no_scope;
697      tree compound_stmt;
698 {
699   tree r;
700
701   if (!has_no_scope)
702     r = do_poplevel ();
703   else
704     r = NULL_TREE;
705
706   if (processing_template_decl)
707     RECHAIN_STMTS_FROM_CHAIN (compound_stmt, 
708                               COMPOUND_BODY (compound_stmt));
709
710   finish_stmt ();
711
712   return r;
713 }
714
715 /* Finish an asm-statement, whose components are a CV_QUALIFIER, a
716    STRING, some OUTPUT_OPERANDS, some INPUT_OPERANDS, and some
717    CLOBBERS.  */
718
719 void
720 finish_asm_stmt (cv_qualifier, string, output_operands,
721                       input_operands, clobbers)
722      tree cv_qualifier;
723      tree string;
724      tree output_operands;
725      tree input_operands;
726      tree clobbers;
727 {
728   if (TREE_CHAIN (string))
729     string = combine_strings (string);
730
731   if (processing_template_decl)
732     {
733       tree r = build_min_nt (ASM_STMT, cv_qualifier, string,
734                              output_operands, input_operands,
735                              clobbers);
736       add_tree (r);
737     }
738   else
739     {
740       emit_line_note (input_filename, lineno);
741       if (output_operands != NULL_TREE || input_operands != NULL_TREE
742             || clobbers != NULL_TREE)
743         {
744           if (cv_qualifier != NULL_TREE
745               && cv_qualifier != ridpointers[(int) RID_VOLATILE])
746             cp_warning ("%s qualifier ignored on asm",
747                         IDENTIFIER_POINTER (cv_qualifier));
748           
749           c_expand_asm_operands (string, output_operands,
750                                  input_operands, 
751                                  clobbers,
752                                  cv_qualifier 
753                                  == ridpointers[(int) RID_VOLATILE],
754                                  input_filename, lineno);
755         }
756       else
757         {
758           /* Don't warn about redundant specification of 'volatile' here.  */
759           if (cv_qualifier != NULL_TREE
760               && cv_qualifier != ridpointers[(int) RID_VOLATILE])
761             cp_warning ("%s qualifier ignored on asm",
762                         IDENTIFIER_POINTER (cv_qualifier));
763           expand_asm (string);
764         }
765       
766       finish_stmt ();
767     }
768 }
769
770 /* Finish a parenthesized expression EXPR.  */
771
772 tree
773 finish_parenthesized_expr (expr)
774      tree expr;
775 {
776   if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (expr))))
777     /* This inhibits warnings in truthvalue_conversion.  */
778     C_SET_EXP_ORIGINAL_CODE (expr, ERROR_MARK); 
779
780   return expr;
781 }
782
783 /* Begin a statement-expression.  The value returned must be passed to
784    finish_stmt_expr.  */
785
786 tree 
787 begin_stmt_expr ()
788 {
789   keep_next_level ();
790   /* If we're processing_template_decl, then the upcoming compound
791      statement will be chained onto the tree structure, starting at
792      last_tree.  We return last_tree so that we can later unhook the
793      compound statement.  */
794   return processing_template_decl ? last_tree : expand_start_stmt_expr(); 
795 }
796
797 /* Finish a statement-expression.  RTL_EXPR should be the value
798    returned by the previous begin_stmt_expr; EXPR is the
799    statement-expression.  Returns an expression representing the
800    statement-expression.  */
801
802 tree 
803 finish_stmt_expr (rtl_expr, expr)
804      tree rtl_expr;
805      tree expr;
806 {
807   tree result;
808
809   if (!processing_template_decl)
810     {
811       rtl_expr = expand_end_stmt_expr (rtl_expr);
812       /* The statements have side effects, so the group does.  */
813       TREE_SIDE_EFFECTS (rtl_expr) = 1;
814     }
815
816   if (TREE_CODE (expr) == BLOCK)
817     {
818       /* Make a BIND_EXPR for the BLOCK already made.  */
819       if (processing_template_decl)
820         result = build_min_nt (BIND_EXPR, NULL_TREE, last_tree,
821                                NULL_TREE);
822       else
823         result = build (BIND_EXPR, TREE_TYPE (rtl_expr),
824                         NULL_TREE, rtl_expr, expr);
825       
826       /* Remove the block from the tree at this point.
827          It gets put back at the proper place
828          when the BIND_EXPR is expanded.  */
829       delete_block (expr);
830     }
831   else
832     result = expr;
833
834   if (processing_template_decl)
835     {
836       /* Remove the compound statement from the tree structure; it is
837          now saved in the BIND_EXPR.  */
838       last_tree = rtl_expr;
839       TREE_CHAIN (last_tree) = NULL_TREE;
840     }
841   
842   return result;
843 }
844
845 /* Finish a call to FN with ARGS.  Returns a representation of the
846    call.  */
847
848 tree 
849 finish_call_expr (fn, args, koenig)
850      tree fn;
851      tree args;
852      int koenig;
853 {
854   tree result;
855
856   if (koenig)
857     {
858       if (TREE_CODE (fn) == BIT_NOT_EXPR)
859         fn = build_x_unary_op (BIT_NOT_EXPR, TREE_OPERAND (fn, 0));
860       else if (TREE_CODE (fn) != TEMPLATE_ID_EXPR)
861         fn = do_identifier (fn, 2, args);
862     }
863   result = build_x_function_call (fn, args, current_class_ref);
864
865   if (TREE_CODE (result) == CALL_EXPR
866       && (! TREE_TYPE (result)
867           || TREE_CODE (TREE_TYPE (result)) != VOID_TYPE))
868     result = require_complete_type (result);
869
870   return result;
871 }
872
873 /* Finish a call to a postfix increment or decrement or EXPR.  (Which
874    is indicated by CODE, which should be POSTINCREMENT_EXPR or
875    POSTDECREMENT_EXPR.)  */
876
877 tree 
878 finish_increment_expr (expr, code)
879      tree expr;
880      enum tree_code code;
881 {
882   /* If we get an OFFSET_REF, turn it into what it really means (e.g.,
883      a COMPONENT_REF).  This way if we've got, say, a reference to a
884      static member that's being operated on, we don't end up trying to
885      find a member operator for the class it's in.  */
886
887   if (TREE_CODE (expr) == OFFSET_REF)
888     expr = resolve_offset_ref (expr);
889   return build_x_unary_op (code, expr);  
890 }
891
892 /* Finish a use of `this'.  Returns an expression for `this'.  */
893
894 tree 
895 finish_this_expr ()
896 {
897   tree result;
898
899   if (current_class_ptr)
900     {
901 #ifdef WARNING_ABOUT_CCD
902       TREE_USED (current_class_ptr) = 1;
903 #endif
904       result = current_class_ptr;
905     }
906   else if (current_function_decl
907            && DECL_STATIC_FUNCTION_P (current_function_decl))
908     {
909       error ("`this' is unavailable for static member functions");
910       result = error_mark_node;
911     }
912   else
913     {
914       if (current_function_decl)
915         error ("invalid use of `this' in non-member function");
916       else
917         error ("invalid use of `this' at top level");
918       result = error_mark_node;
919     }
920
921   return result;
922 }
923
924 /* Finish a member function call using OBJECT and ARGS as arguments to
925    FN.  Returns an expression for the call.  */
926
927 tree 
928 finish_object_call_expr (fn, object, args)
929      tree fn;
930      tree object;
931      tree args;
932 {
933 #if 0
934   /* This is a future direction of this code, but because
935      build_x_function_call cannot always undo what is done in
936      build_component_ref entirely yet, we cannot do this.  */
937
938   tree real_fn = build_component_ref (object, fn, NULL_TREE, 1);
939   return finish_call_expr (real_fn, args);
940 #else
941   if (TREE_CODE (fn) == TYPE_DECL)
942     {
943       if (processing_template_decl)
944         /* This can happen on code like:
945
946            class X;
947            template <class T> void f(T t) {
948              t.X();
949            }  
950
951            We just grab the underlying IDENTIFIER.  */
952         fn = DECL_NAME (fn);
953       else
954         {
955           cp_error ("calling type `%T' like a method", fn);
956           return error_mark_node;
957         }
958     }
959
960   return build_method_call (object, fn, args, NULL_TREE, LOOKUP_NORMAL);
961 #endif
962 }
963
964 /* Finish a qualified member function call using OBJECT and ARGS as
965    arguments to FN.  Returns an expressino for the call.  */
966
967 tree 
968 finish_qualified_object_call_expr (fn, object, args)
969      tree fn;
970      tree object;
971      tree args;
972 {
973   if (IS_SIGNATURE (TREE_OPERAND (fn, 0)))
974     {
975       warning ("signature name in scope resolution ignored");
976       return finish_object_call_expr (TREE_OPERAND (fn, 1), object, args);
977     }
978   else
979     return build_scoped_method_call (object, TREE_OPERAND (fn, 0),
980                                      TREE_OPERAND (fn, 1), args);
981 }
982
983 /* Finish a pseudo-destructor call expression of OBJECT, with SCOPE
984    being the scope, if any, of DESTRUCTOR.  Returns an expression for
985    the call.  */
986
987 tree 
988 finish_pseudo_destructor_call_expr (object, scope, destructor)
989      tree object;
990      tree scope;
991      tree destructor;
992 {
993   if (scope && scope != destructor)
994     cp_error ("destructor specifier `%T::~%T()' must have matching names", 
995               scope, destructor);
996
997   if ((scope == NULL_TREE || IDENTIFIER_GLOBAL_VALUE (destructor))
998       && (TREE_CODE (TREE_TYPE (object)) !=
999           TREE_CODE (TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (destructor)))))
1000     cp_error ("`%E' is not of type `%T'", object, destructor);
1001
1002   return cp_convert (void_type_node, object);
1003 }
1004
1005 /* Finish a call to a globally qualified member function FN using
1006    ARGS.  Returns an expression for the call.  */
1007
1008 tree 
1009 finish_qualified_call_expr (fn, args)
1010      tree fn;
1011      tree args;
1012 {
1013   if (processing_template_decl)
1014     return build_min_nt (CALL_EXPR, copy_to_permanent (fn), args,
1015                          NULL_TREE);
1016   else
1017     return build_member_call (TREE_OPERAND (fn, 0),
1018                               TREE_OPERAND (fn, 1),
1019                               args);
1020 }
1021
1022 /* Finish an expression taking the address of LABEL.  Returns an
1023    expression for the address.  */
1024
1025 tree 
1026 finish_label_address_expr (label)
1027      tree label;
1028 {
1029   tree result;
1030
1031   label = lookup_label (label);
1032   if (label == NULL_TREE)
1033     result = null_pointer_node;
1034   else
1035     {
1036       TREE_USED (label) = 1;
1037       result = build1 (ADDR_EXPR, ptr_type_node, label);
1038       TREE_CONSTANT (result) = 1;
1039     }
1040
1041   return result;
1042 }
1043
1044 /* Finish an expression of the form CODE EXPR.  */
1045
1046 tree
1047 finish_unary_op_expr (code, expr)
1048      enum tree_code code;
1049      tree expr;
1050 {
1051   tree result = build_x_unary_op (code, expr);
1052   if (code == NEGATE_EXPR && TREE_CODE (expr) == INTEGER_CST)
1053     TREE_NEGATED_INT (result) = 1;
1054   overflow_warning (result);
1055   return result;
1056 }
1057
1058 /* Finish an id-expression.  */
1059
1060 tree
1061 finish_id_expr (expr)
1062      tree expr;
1063 {
1064   if (TREE_CODE (expr) == IDENTIFIER_NODE)
1065     expr = do_identifier (expr, 1, NULL_TREE);
1066
1067   return expr;
1068 }
1069
1070 /* Begin a new-placement.  */
1071
1072 int
1073 begin_new_placement ()
1074 {
1075   /* The arguments to a placement new might be passed to a
1076      deallocation function, in the event that the allocation throws an
1077      exception.  Since we don't expand exception handlers until the
1078      end of a function, we must make sure the arguments stay around
1079      that long.  */
1080   return suspend_momentary ();
1081 }
1082
1083 /* Finish a new-placement.  The ARGS are the placement arguments.  The
1084    COOKIE is the value returned by the previous call to
1085    begin_new_placement.  */
1086
1087 tree
1088 finish_new_placement (args, cookie)
1089      tree args;
1090      int cookie;
1091 {
1092   resume_momentary (cookie);
1093   return args;
1094 }
1095
1096 /* Begin a function defniition declared with DECL_SPECS and
1097    DECLARATOR.  Returns non-zero if the function-declaration is
1098    legal.  */
1099
1100 int
1101 begin_function_definition (decl_specs, declarator)
1102      tree decl_specs;
1103      tree declarator;
1104 {
1105   tree specs;
1106   tree attrs;
1107   split_specs_attrs (decl_specs, &specs, &attrs);
1108   if (!start_function (specs, declarator, attrs, 0))
1109     return 0;
1110   
1111   reinit_parse_for_function ();
1112   /* The things we're about to see are not directly qualified by any
1113      template headers we've seen thus far.  */
1114   reset_specialization ();
1115
1116   return 1;
1117 }
1118
1119 /* Begin a constructor declarator of the form `SCOPE::NAME'.  Returns
1120    a SCOPE_REF.  */
1121
1122 tree 
1123 begin_constructor_declarator (scope, name)
1124      tree scope;
1125      tree name;
1126 {
1127   tree result = build_parse_node (SCOPE_REF, scope, name);
1128   enter_scope_of (result);
1129   return result;
1130 }
1131
1132 /* Finish an init-declarator.  Returns a DECL.  */
1133
1134 tree
1135 finish_declarator (declarator, declspecs, attributes,
1136                    prefix_attributes, initialized)
1137      tree declarator;
1138      tree declspecs;
1139      tree attributes;
1140      tree prefix_attributes;
1141      int initialized;
1142 {
1143   return start_decl (declarator, declspecs, initialized, attributes,
1144                      prefix_attributes); 
1145 }
1146
1147 /* Finish a translation unit.  */
1148
1149 void 
1150 finish_translation_unit ()
1151 {
1152   /* In case there were missing closebraces,
1153      get us back to the global binding level.  */
1154   while (! toplevel_bindings_p ())
1155     poplevel (0, 0, 0);
1156   while (current_namespace != global_namespace)
1157     pop_namespace ();
1158   finish_file ();
1159 }
1160
1161 /* Finish a template type parameter, specified as AGGR IDENTIFIER.
1162    Returns the parameter.  */
1163
1164 tree 
1165 finish_template_type_parm (aggr, identifier)
1166      tree aggr;
1167      tree identifier;
1168 {
1169   if (aggr == signature_type_node)
1170     sorry ("signature as template type parameter");
1171   else if (aggr != class_type_node)
1172     {
1173       pedwarn ("template type parameters must use the keyword `class' or `typename'");
1174       aggr = class_type_node;
1175     }
1176
1177   return build_tree_list (aggr, identifier);
1178 }
1179
1180 /* Finish a template template parameter, specified as AGGR IDENTIFIER.
1181    Returns the parameter.  */
1182
1183 tree 
1184 finish_template_template_parm (aggr, identifier)
1185      tree aggr;
1186      tree identifier;
1187 {
1188   tree decl = build_decl (TYPE_DECL, identifier, NULL_TREE);
1189   tree tmpl = build_lang_decl (TEMPLATE_DECL, identifier, NULL_TREE);
1190   DECL_TEMPLATE_PARMS (tmpl) = current_template_parms;
1191   DECL_TEMPLATE_RESULT (tmpl) = decl;
1192   SET_DECL_ARTIFICIAL (decl);
1193   end_template_decl ();
1194
1195   return finish_template_type_parm (aggr, tmpl);
1196 }
1197
1198 /* Finish a parameter list, indicated by PARMS.  If ELLIPSIS is
1199    non-zero, the parameter list was terminated by a `...'.  */
1200
1201 tree
1202 finish_parmlist (parms, ellipsis)
1203      tree parms;
1204      int ellipsis;
1205 {
1206   if (!ellipsis)
1207     chainon (parms, void_list_node);
1208   /* We mark the PARMS as a parmlist so that declarator processing can
1209      disambiguate certain constructs.  */
1210   if (parms != NULL_TREE)
1211     TREE_PARMLIST (parms) = 1;
1212
1213   return parms;
1214 }
1215
1216 /* Begin a class definition, as indicated by T.  */
1217
1218 tree
1219 begin_class_definition (t)
1220      tree t;
1221 {
1222   push_obstacks_nochange ();
1223   end_temporary_allocation ();
1224   
1225   if (t == error_mark_node
1226       || ! IS_AGGR_TYPE (t))
1227     {
1228       t = make_lang_type (RECORD_TYPE);
1229       pushtag (make_anon_name (), t, 0);
1230     }
1231
1232   /* In a definition of a member class template, we will get here with an
1233      implicit typename, a TYPENAME_TYPE with a type.  */
1234   if (TREE_CODE (t) == TYPENAME_TYPE)
1235     t = TREE_TYPE (t);
1236   
1237   /* If we generated a partial instantiation of this type, but now
1238      we're seeing a real definition, we're actually looking at a
1239      partial specialization.  Consider:
1240
1241        template <class T, class U>
1242        struct Y {};
1243
1244        template <class T>
1245        struct X {};
1246
1247        template <class T, class U>
1248        void f()
1249        {
1250          typename X<Y<T, U> >::A a;
1251        }
1252
1253        template <class T, class U>
1254        struct X<Y<T, U> >
1255        {
1256        };
1257
1258      We have to undo the effects of the previous partial
1259      instantiation.  */
1260   if (PARTIAL_INSTANTIATION_P (t))
1261     {
1262       if (!pedantic) 
1263         {
1264           /* Unfortunately, when we're not in pedantic mode, we
1265              attempt to actually fill in some of the fields of the
1266              partial instantiation, in order to support the implicit
1267              typename extension.  Clear those fields now, in
1268              preparation for the definition here.  The fields cleared
1269              here must match those set in instantiate_class_template.
1270              Look for a comment mentioning begin_class_definition
1271              there.  */
1272           TYPE_BINFO_BASETYPES (t) = NULL_TREE;
1273           TYPE_FIELDS (t) = NULL_TREE;
1274           TYPE_METHODS (t) = NULL_TREE;
1275           CLASSTYPE_TAGS (t) = NULL_TREE;
1276           TYPE_SIZE (t) = NULL_TREE;
1277         }
1278
1279       /* This isn't a partial instantiation any more.  */
1280       PARTIAL_INSTANTIATION_P (t) = 0;
1281     }
1282   /* If this type was already complete, and we see another definition,
1283      that's an error.  */
1284   else if (TYPE_SIZE (t))
1285     duplicate_tag_error (t);
1286
1287   if (TYPE_BEING_DEFINED (t))
1288     {
1289       t = make_lang_type (TREE_CODE (t));
1290       pushtag (TYPE_IDENTIFIER (t), t, 0);
1291     }
1292   maybe_process_partial_specialization (t);
1293   pushclass (t, 1);
1294   TYPE_BEING_DEFINED (t) = 1;
1295   /* Reset the interface data, at the earliest possible
1296      moment, as it might have been set via a class foo;
1297      before.  */
1298   /* Don't change signatures.  */
1299   if (! IS_SIGNATURE (t))
1300     {
1301       int needs_writing;
1302       tree name = TYPE_IDENTIFIER (t);
1303       
1304       if (! ANON_AGGRNAME_P (name))
1305         {
1306           CLASSTYPE_INTERFACE_ONLY (t) = interface_only;
1307           SET_CLASSTYPE_INTERFACE_UNKNOWN_X
1308             (t, interface_unknown);
1309         }
1310       
1311       /* Record how to set the access of this class's
1312          virtual functions.  If write_virtuals == 3, then
1313          inline virtuals are ``extern inline''.  */
1314       if (write_virtuals == 3)
1315         needs_writing = ! CLASSTYPE_INTERFACE_ONLY (t)
1316           && CLASSTYPE_INTERFACE_KNOWN (t);
1317       else
1318         needs_writing = 1;
1319       CLASSTYPE_VTABLE_NEEDS_WRITING (t) = needs_writing;
1320     }
1321 #if 0
1322   tmp = TYPE_IDENTIFIER ($<ttype>0);
1323   if (tmp && IDENTIFIER_TEMPLATE (tmp))
1324     overload_template_name (tmp, 1);
1325 #endif
1326   reset_specialization();
1327   
1328   /* In case this is a local class within a template
1329      function, we save the current tree structure so
1330      that we can get it back later.  */
1331   begin_tree ();
1332
1333   /* Make a declaration for this class in its own scope.  */
1334   build_self_reference ();
1335
1336   return t;
1337 }
1338
1339 /* Finish the member declaration given by DECL.  */
1340
1341 void
1342 finish_member_declaration (decl)
1343      tree decl;
1344 {
1345   if (decl == error_mark_node || decl == NULL_TREE)
1346     return;
1347
1348   if (decl == void_type_node)
1349     /* The COMPONENT was a friend, not a member, and so there's
1350        nothing for us to do.  */
1351     return;
1352
1353   /* We should see only one DECL at a time.  */
1354   my_friendly_assert (TREE_CHAIN (decl) == NULL_TREE, 0);
1355
1356   /* Set up access control for DECL.  */
1357   TREE_PRIVATE (decl) 
1358     = (current_access_specifier == access_private_node);
1359   TREE_PROTECTED (decl) 
1360     = (current_access_specifier == access_protected_node);
1361   if (TREE_CODE (decl) == TEMPLATE_DECL)
1362     {
1363       TREE_PRIVATE (DECL_RESULT (decl)) = TREE_PRIVATE (decl);
1364       TREE_PROTECTED (DECL_RESULT (decl)) = TREE_PROTECTED (decl);
1365     }
1366
1367   /* Mark the DECL as a member of the current class.  */
1368   if (TREE_CODE (decl) == FUNCTION_DECL 
1369       || DECL_FUNCTION_TEMPLATE_P (decl))
1370     /* Historically, DECL_CONTEXT was not set for a FUNCTION_DECL in
1371        finish_struct.  Presumably it is already set as the function is
1372        parsed.  Perhaps DECL_CLASS_CONTEXT is already set, too?  */
1373     DECL_CLASS_CONTEXT (decl) = current_class_type;
1374   else
1375     DECL_CONTEXT (decl) = current_class_type;
1376
1377   /* Put functions on the TYPE_METHODS list and everything else on the
1378      TYPE_FIELDS list.  Note that these are built up in reverse order.
1379      We reverse them (to obtain declaration order) in finish_struct.  */
1380   if (TREE_CODE (decl) == FUNCTION_DECL 
1381       || DECL_FUNCTION_TEMPLATE_P (decl))
1382     {
1383       /* We also need to add this function to the
1384          CLASSTYPE_METHOD_VEC.  */
1385       add_method (current_class_type, 0, decl);
1386
1387       TREE_CHAIN (decl) = TYPE_METHODS (current_class_type);
1388       TYPE_METHODS (current_class_type) = decl;
1389     }
1390   else
1391     {
1392       /* All TYPE_DECLs go at the end of TYPE_FIELDS.  Ordinary fields
1393          go at the beginning.  The reason is that lookup_field_1
1394          searches the list in order, and we want a field name to
1395          override a type name so that the "struct stat hack" will
1396          work.  In particular:
1397
1398            struct S { enum E { }; int E } s;
1399            s.E = 3;
1400
1401          is legal.  In addition, the FIELD_DECLs must be maintained in
1402          declaration order so that class layout works as expected.
1403          However, we don't need that order until class layout, so we
1404          save a little time by putting FIELD_DECLs on in reverse order
1405          here, and then reversing them in finish_struct_1.  (We could
1406          also keep a pointer to the correct insertion points in the
1407          list.)  */
1408
1409       if (TREE_CODE (decl) == TYPE_DECL)
1410         TYPE_FIELDS (current_class_type) 
1411           = chainon (TYPE_FIELDS (current_class_type), decl);
1412       else
1413         {
1414           TREE_CHAIN (decl) = TYPE_FIELDS (current_class_type);
1415           TYPE_FIELDS (current_class_type) = decl;
1416         }
1417
1418       /* Enter the DECL into the scope of the class.  */
1419       if (TREE_CODE (decl) != USING_DECL)
1420         pushdecl_class_level (decl);
1421     }
1422 }
1423
1424 /* Finish a class definition T with the indicate ATTRIBUTES.  If SEMI,
1425    the definition is immediately followed by a semicolon.  Returns the
1426    type.  */
1427
1428 tree
1429 finish_class_definition (t, attributes, semi, pop_scope_p)
1430      tree t;
1431      tree attributes;
1432      int semi;
1433      int pop_scope_p;
1434 {
1435   /* finish_struct nukes this anyway; if finish_exception does too,
1436      then it can go.  */
1437   if (semi)
1438     note_got_semicolon (t);
1439
1440   /* If we got any attributes in class_head, xref_tag will stick them in
1441      TREE_TYPE of the type.  Grab them now.  */
1442   attributes = chainon (TREE_TYPE (t), attributes);
1443   TREE_TYPE (t) = NULL_TREE;
1444
1445   if (TREE_CODE (t) == ENUMERAL_TYPE)
1446     ;
1447   else
1448     {
1449       t = finish_struct (t, attributes, semi);
1450       if (semi) 
1451         note_got_semicolon (t);
1452     }
1453
1454   pop_obstacks ();
1455
1456   if (! semi)
1457     check_for_missing_semicolon (t); 
1458   if (pop_scope_p)
1459     pop_scope (CP_DECL_CONTEXT (TYPE_MAIN_DECL (t)));
1460   if (current_scope () == current_function_decl)
1461     do_pending_defargs ();
1462
1463   return t;
1464 }
1465
1466 /* Finish processing the default argument expressions cached during
1467    the processing of a class definition.  */
1468
1469 void
1470 begin_inline_definitions ()
1471 {
1472   if (pending_inlines 
1473       && current_scope () == current_function_decl)
1474     do_pending_inlines ();
1475 }
1476
1477 /* Finish processing the inline function definitions cached during the
1478    processing of a class definition.  */
1479
1480 void
1481 finish_inline_definitions ()
1482 {
1483   if (current_class_type == NULL_TREE)
1484     clear_inline_text_obstack (); 
1485   
1486   /* Undo the begin_tree in begin_class_definition.  */
1487   end_tree ();
1488 }
1489
1490 /* Finish processing the declaration of a member class template
1491    TYPES whose template parameters are given by PARMS.  */
1492
1493 tree
1494 finish_member_class_template (types)
1495      tree types;
1496 {
1497   tree t;
1498
1499   /* If there are declared, but undefined, partial specializations
1500      mixed in with the typespecs they will not yet have passed through
1501      maybe_process_partial_specialization, so we do that here.  */
1502   for (t = types; t != NULL_TREE; t = TREE_CHAIN (t))
1503     if (IS_AGGR_TYPE_CODE (TREE_CODE (TREE_VALUE (t))))
1504       maybe_process_partial_specialization (TREE_VALUE (t));
1505
1506   note_list_got_semicolon (types);
1507   grok_x_components (types);
1508   if (TYPE_CONTEXT (TREE_VALUE (types)) != current_class_type)
1509     /* The component was in fact a friend declaration.  We avoid
1510        finish_member_template_decl performing certain checks by
1511        unsetting TYPES.  */
1512     types = NULL_TREE;
1513   
1514   finish_member_template_decl (types);
1515
1516   /* As with other component type declarations, we do
1517      not store the new DECL on the list of
1518      component_decls.  */
1519   return NULL_TREE;
1520 }
1521
1522 /* Finish processsing a complete template declaration.  The PARMS are
1523    the template parameters.  */
1524
1525 void
1526 finish_template_decl (parms)
1527      tree parms;
1528 {
1529   if (parms)
1530     end_template_decl ();
1531   else
1532     end_specialization ();
1533 }
1534
1535 /* Finish processing a a template-id (which names a type) of the form
1536    NAME < ARGS >.  Return the TYPE_DECL for the type named by the
1537    template-id.  If ENTERING_SCOPE is non-zero we are about to enter
1538    the scope of template-id indicated.  */
1539
1540 tree
1541 finish_template_type (name, args, entering_scope)
1542      tree name;
1543      tree args;
1544      int entering_scope;
1545 {
1546   tree decl;
1547
1548   decl = lookup_template_class (name, args,
1549                                 NULL_TREE, NULL_TREE, entering_scope);
1550   if (decl != error_mark_node)
1551     decl = TYPE_STUB_DECL (decl);
1552
1553   return decl;
1554 }
1555
1556 /* SR is a SCOPE_REF node.  Enter the scope of SR, whether it is a
1557    namespace scope or a class scope.  */
1558
1559 void
1560 enter_scope_of (sr)
1561      tree sr;
1562 {
1563   tree scope = TREE_OPERAND (sr, 0);
1564
1565   if (TREE_CODE (scope) == NAMESPACE_DECL)
1566     {
1567       push_decl_namespace (scope);
1568       TREE_COMPLEXITY (sr) = -1;
1569     }
1570   else if (scope != current_class_type)
1571     {
1572       if (TREE_CODE (scope) == TYPENAME_TYPE)
1573         {
1574           /* In a declarator for a template class member, the scope will
1575              get here as an implicit typename, a TYPENAME_TYPE with a type.  */
1576           scope = TREE_TYPE (scope);
1577           TREE_OPERAND (sr, 0) = scope;
1578         }
1579       push_nested_class (scope, 3);
1580       TREE_COMPLEXITY (sr) = current_class_depth;
1581     }
1582 }
1583
1584 /* Finish processing a BASE_CLASS with the indicated ACCESS_SPECIFIER.
1585    Return a TREE_LIST containing the ACCESS_SPECIFIER and the
1586    BASE_CLASS, or NULL_TREE if an error occurred.  The
1587    ACCESSS_SPECIFIER is one of
1588    access_{default,public,protected_private}[_virtual]_node.*/
1589
1590 tree 
1591 finish_base_specifier (access_specifier, base_class,
1592                        current_aggr_is_signature)
1593      tree access_specifier;
1594      tree base_class;
1595      int current_aggr_is_signature;
1596 {
1597   tree type;
1598   tree result;
1599
1600   if (base_class == NULL_TREE)
1601     {
1602       error ("invalid base class");
1603       type = error_mark_node;
1604     }
1605   else
1606     type = TREE_TYPE (base_class);
1607   if (current_aggr_is_signature && access_specifier)
1608     error ("access and source specifiers not allowed in signature");
1609   if (! is_aggr_type (type, 1))
1610     result = NULL_TREE;
1611   else if (current_aggr_is_signature
1612            && (! type) && (! IS_SIGNATURE (type)))
1613     {
1614       error ("class name not allowed as base signature");
1615       result = NULL_TREE;
1616     }
1617   else if (current_aggr_is_signature)
1618     {
1619       sorry ("signature inheritance, base type `%s' ignored",
1620              IDENTIFIER_POINTER (access_specifier));
1621       result = build_tree_list (access_public_node, type);
1622     }
1623   else if (type && IS_SIGNATURE (type))
1624     {
1625       error ("signature name not allowed as base class");
1626       result = NULL_TREE;
1627     }
1628   else
1629     result = build_tree_list (access_specifier, type);
1630
1631   return result;
1632 }
1633
1634 /* Called when multiple declarators are processed.  If that is not
1635    premitted in this context, an error is issued.  */
1636
1637 void
1638 check_multiple_declarators ()
1639 {
1640   /* [temp]
1641      
1642      In a template-declaration, explicit specialization, or explicit
1643      instantiation the init-declarator-list in the declaration shall
1644      contain at most one declarator.  
1645
1646      We don't just use PROCESSING_TEMPLATE_DECL for the first
1647      condition since that would disallow the perfectly legal code, 
1648      like `template <class T> struct S { int i, j; };'.  */
1649   tree scope = current_scope ();
1650
1651   if (scope && TREE_CODE (scope) == FUNCTION_DECL)
1652     /* It's OK to write `template <class T> void f() { int i, j;}'.  */
1653     return;
1654      
1655   if (PROCESSING_REAL_TEMPLATE_DECL_P () 
1656       || processing_explicit_instantiation
1657       || processing_specialization)
1658     cp_error ("multiple declarators in template declaration");
1659 }
1660
1661 tree
1662 finish_typeof (expr)
1663      tree expr;
1664 {
1665   if (processing_template_decl)
1666     {
1667       tree t;
1668
1669       push_obstacks_nochange ();
1670       end_temporary_allocation ();
1671
1672       t = make_lang_type (TYPEOF_TYPE);
1673       TYPE_FIELDS (t) = expr;
1674
1675       pop_obstacks ();
1676
1677       return t;
1678     }
1679
1680   return TREE_TYPE (expr);
1681 }