1 /* Handle the hair of processing (but not expanding) inline functions.
2 Also manage function and variable name overloading.
3 Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
4 1999, 2000 Free Software Foundation, Inc.
5 Contributed by Michael Tiemann (tiemann@cygnus.com)
7 This file is part of GNU CC.
9 GNU CC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
14 GNU CC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GNU CC; see the file COPYING. If not, write to
21 the Free Software Foundation, 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA. */
25 /* Handle method declarations. */
39 /* Various flags to control the mangling process. */
45 /* The thing we are presently mangling is part of a template type,
46 rather than a fully instantiated type. Therefore, we may see
47 complex expressions where we would normally expect to see a
48 simple integer constant. */
49 mf_maybe_uninstantiated
= 1,
50 /* When mangling a numeric value, use the form `_XX_' (instead of
51 just `XX') if the value has more than one digit. */
52 mf_use_underscores_around_value
= 2,
55 typedef enum mangling_flags mangling_flags
;
57 #define obstack_chunk_alloc xmalloc
58 #define obstack_chunk_free free
60 static void do_build_assign_ref
PARAMS ((tree
));
61 static void do_build_copy_constructor
PARAMS ((tree
));
62 static tree synthesize_exception_spec
PARAMS ((tree
, tree (*) (tree
, void *), void *));
63 static tree locate_dtor
PARAMS ((tree
, void *));
64 static tree locate_ctor
PARAMS ((tree
, void *));
65 static tree locate_copy
PARAMS ((tree
, void *));
67 /* Called once to initialize method.c. */
76 /* Set the mangled name (DECL_ASSEMBLER_NAME) for DECL. */
79 set_mangled_name_for_decl (decl
)
82 if (processing_template_decl
)
83 /* There's no need to mangle the name of a template function. */
90 /* Given a tree_code CODE, and some arguments (at least one),
91 attempt to use an overloaded operator on the arguments.
93 For unary operators, only the first argument need be checked.
94 For binary operators, both arguments may need to be checked.
96 Member functions can convert class references to class pointers,
97 for one-level deep indirection. More than that is not supported.
98 Operators [](), ()(), and ->() must be member functions.
100 We call function call building calls with LOOKUP_COMPLAIN if they
101 are our only hope. This is true when we see a vanilla operator
102 applied to something of aggregate type. If this fails, we are free
103 to return `error_mark_node', because we will have reported the
106 Operators NEW and DELETE overload in funny ways: operator new takes
107 a single `size' parameter, and operator delete takes a pointer to the
108 storage being deleted. When overloading these operators, success is
109 assumed. If there is a failure, report an error message and return
110 `error_mark_node'. */
114 build_opfncall (code
, flags
, xarg1
, xarg2
, arg3
)
117 tree xarg1
, xarg2
, arg3
;
119 return build_new_op (code
, flags
, xarg1
, xarg2
, arg3
);
122 /* This function takes an identifier, ID, and attempts to figure out what
123 it means. There are a number of possible scenarios, presented in increasing
126 1) not in a class's scope
127 2) in class's scope, member name of the class's method
128 3) in class's scope, but not a member name of the class
129 4) in class's scope, member name of a class's variable
131 NAME is $1 from the bison rule. It is an IDENTIFIER_NODE.
132 VALUE is $$ from the bison rule. It is the value returned by lookup_name ($1)
134 As a last ditch, try to look up the name as a label and return that
137 Values which are declared as being of REFERENCE_TYPE are
138 automatically dereferenced here (as a hack to make the
142 hack_identifier (value
, name
)
147 if (value
== error_mark_node
)
148 return error_mark_node
;
150 type
= TREE_TYPE (value
);
151 if (TREE_CODE (value
) == FIELD_DECL
)
153 if (current_class_ptr
== NULL_TREE
)
155 if (current_function_decl
156 && DECL_STATIC_FUNCTION_P (current_function_decl
))
157 error ("invalid use of member `%D' in static member function",
160 /* We can get here when processing a bad default
162 struct S { int a; void f(int i = a); } */
163 error ("invalid use of member `%D'", value
);
165 return error_mark_node
;
167 TREE_USED (current_class_ptr
) = 1;
169 /* Mark so that if we are in a constructor, and then find that
170 this field was initialized by a base initializer,
171 we can emit an error message. */
172 TREE_USED (value
) = 1;
173 value
= build_component_ref (current_class_ref
, name
, NULL_TREE
, 1);
175 else if ((TREE_CODE (value
) == FUNCTION_DECL
176 && DECL_FUNCTION_MEMBER_P (value
))
177 || (TREE_CODE (value
) == OVERLOAD
178 && DECL_FUNCTION_MEMBER_P (OVL_CURRENT (value
))))
182 if (TREE_CODE (value
) == OVERLOAD
)
183 value
= OVL_CURRENT (value
);
185 decl
= maybe_dummy_object (DECL_CONTEXT (value
), 0);
186 value
= build_component_ref (decl
, name
, NULL_TREE
, 1);
188 else if (really_overloaded_fn (value
))
190 else if (TREE_CODE (value
) == OVERLOAD
)
191 /* not really overloaded function */
192 mark_used (OVL_FUNCTION (value
));
193 else if (TREE_CODE (value
) == TREE_LIST
)
195 /* Ambiguous reference to base members, possibly other cases?. */
197 while (t
&& TREE_CODE (t
) == TREE_LIST
)
199 mark_used (TREE_VALUE (t
));
203 else if (TREE_CODE (value
) == NAMESPACE_DECL
)
205 error ("use of namespace `%D' as expression", value
);
206 return error_mark_node
;
208 else if (DECL_CLASS_TEMPLATE_P (value
))
210 error ("use of class template `%T' as expression", value
);
211 return error_mark_node
;
216 if (TREE_CODE (value
) == VAR_DECL
|| TREE_CODE (value
) == PARM_DECL
217 || TREE_CODE (value
) == RESULT_DECL
)
219 tree context
= decl_function_context (value
);
220 if (context
!= NULL_TREE
&& context
!= current_function_decl
221 && ! TREE_STATIC (value
))
223 error ("use of %s from containing function",
224 (TREE_CODE (value
) == VAR_DECL
225 ? "`auto' variable" : "parameter"));
226 cp_error_at (" `%#D' declared here", value
);
227 value
= error_mark_node
;
231 if (DECL_P (value
) && DECL_NONLOCAL (value
))
233 if (DECL_CLASS_SCOPE_P (value
)
234 && DECL_CONTEXT (value
) != current_class_type
)
237 path
= currently_open_derived_class (DECL_CONTEXT (value
));
238 enforce_access (path
, value
);
241 else if (TREE_CODE (value
) == TREE_LIST
242 && TREE_TYPE (value
) == error_mark_node
)
245 request for member `%D' is ambiguous in multiple inheritance lattice",
247 print_candidates (value
);
248 return error_mark_node
;
251 if (! processing_template_decl
)
252 value
= convert_from_reference (value
);
257 /* Return a thunk to FUNCTION. For a virtual thunk, DELTA is the
258 offset to this used to locate the vptr, and VCALL_INDEX is used to
259 look up the eventual subobject location. For a non-virtual thunk,
260 DELTA is the offset to this and VCALL_INDEX is NULL. */
263 make_thunk (function
, delta
, vcall_index
)
274 /* Scale the VCALL_INDEX to be in terms of bytes. */
277 = size_binop (MULT_EXPR
,
280 TYPE_SIZE_UNIT (vtable_entry_type
)));
282 vcall_offset
= NULL_TREE
;
284 d
= tree_low_cst (delta
, 0);
286 if (TREE_CODE (function
) != ADDR_EXPR
)
288 func_decl
= TREE_OPERAND (function
, 0);
289 if (TREE_CODE (func_decl
) != FUNCTION_DECL
)
292 thunk_id
= mangle_thunk (TREE_OPERAND (function
, 0),
293 delta
, vcall_offset
);
294 thunk
= IDENTIFIER_GLOBAL_VALUE (thunk_id
);
295 if (thunk
&& !DECL_THUNK_P (thunk
))
297 error ("implementation-reserved name `%D' used", thunk_id
);
299 SET_IDENTIFIER_GLOBAL_VALUE (thunk_id
, thunk
);
301 if (thunk
== NULL_TREE
)
303 thunk
= build_decl (FUNCTION_DECL
, thunk_id
, TREE_TYPE (func_decl
));
304 DECL_LANG_SPECIFIC (thunk
) = DECL_LANG_SPECIFIC (func_decl
);
305 copy_lang_decl (func_decl
);
306 SET_DECL_ASSEMBLER_NAME (thunk
, thunk_id
);
307 DECL_CONTEXT (thunk
) = DECL_CONTEXT (func_decl
);
308 TREE_READONLY (thunk
) = TREE_READONLY (func_decl
);
309 TREE_THIS_VOLATILE (thunk
) = TREE_THIS_VOLATILE (func_decl
);
310 TREE_PUBLIC (thunk
) = TREE_PUBLIC (func_decl
);
312 comdat_linkage (thunk
);
313 SET_DECL_THUNK_P (thunk
);
314 DECL_INITIAL (thunk
) = function
;
315 THUNK_DELTA (thunk
) = d
;
316 THUNK_VCALL_OFFSET (thunk
) = vcall_offset
;
317 /* The thunk itself is not a constructor or destructor, even if
318 the thing it is thunking to is. */
319 DECL_INTERFACE_KNOWN (thunk
) = 1;
320 DECL_NOT_REALLY_EXTERN (thunk
) = 1;
321 DECL_SAVED_FUNCTION_DATA (thunk
) = NULL
;
322 DECL_DESTRUCTOR_P (thunk
) = 0;
323 DECL_CONSTRUCTOR_P (thunk
) = 0;
324 /* And neither is it a clone. */
325 DECL_CLONED_FUNCTION (thunk
) = NULL_TREE
;
326 DECL_EXTERNAL (thunk
) = 1;
327 DECL_ARTIFICIAL (thunk
) = 1;
328 /* Even if this thunk is a member of a local class, we don't
329 need a static chain. */
330 DECL_NO_STATIC_CHAIN (thunk
) = 1;
331 /* The THUNK is not a pending inline, even if the FUNC_DECL is. */
332 DECL_PENDING_INLINE_P (thunk
) = 0;
333 /* Nor has it been deferred. */
334 DECL_DEFERRED_FN (thunk
) = 0;
335 /* So that finish_file can write out any thunks that need to be: */
336 pushdecl_top_level (thunk
);
337 SET_IDENTIFIER_GLOBAL_VALUE (thunk_id
, thunk
);
342 /* Emit the definition of a C++ multiple inheritance vtable thunk. If
343 EMIT_P is non-zero, the thunk is emitted immediately. */
346 use_thunk (thunk_fndecl
, emit_p
)
355 if (TREE_ASM_WRITTEN (thunk_fndecl
))
358 fnaddr
= DECL_INITIAL (thunk_fndecl
);
359 if (TREE_CODE (DECL_INITIAL (thunk_fndecl
)) != ADDR_EXPR
)
360 /* We already turned this thunk into an ordinary function.
361 There's no need to process this thunk again. */
364 /* Thunks are always addressable; they only appear in vtables. */
365 TREE_ADDRESSABLE (thunk_fndecl
) = 1;
367 /* Figure out what function is being thunked to. It's referenced in
368 this translation unit. */
369 function
= TREE_OPERAND (fnaddr
, 0);
370 TREE_ADDRESSABLE (function
) = 1;
371 mark_used (function
);
372 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (function
)) = 1;
376 delta
= THUNK_DELTA (thunk_fndecl
);
377 vcall_offset
= THUNK_VCALL_OFFSET (thunk_fndecl
);
379 /* And, if we need to emit the thunk, it's used. */
380 mark_used (thunk_fndecl
);
381 /* This thunk is actually defined. */
382 DECL_EXTERNAL (thunk_fndecl
) = 0;
383 /* The linkage of the function may have changed. FIXME in linkage
385 TREE_PUBLIC (thunk_fndecl
) = TREE_PUBLIC (function
);
387 if (flag_syntax_only
)
389 TREE_ASM_WRITTEN (thunk_fndecl
) = 1;
393 push_to_top_level ();
395 /* The back-end expects DECL_INITIAL to contain a BLOCK, so we
397 DECL_INITIAL (thunk_fndecl
) = make_node (BLOCK
);
398 BLOCK_VARS (DECL_INITIAL (thunk_fndecl
))
399 = DECL_ARGUMENTS (thunk_fndecl
);
401 #ifdef ASM_OUTPUT_MI_THUNK
405 current_function_decl
= thunk_fndecl
;
406 DECL_RESULT (thunk_fndecl
)
407 = build_decl (RESULT_DECL
, 0, integer_type_node
);
408 fnname
= XSTR (XEXP (DECL_RTL (thunk_fndecl
), 0), 0);
409 init_function_start (thunk_fndecl
, input_filename
, lineno
);
410 current_function_is_thunk
= 1;
411 assemble_start_function (thunk_fndecl
, fnname
);
412 ASM_OUTPUT_MI_THUNK (asm_out_file
, thunk_fndecl
, delta
, function
);
413 assemble_end_function (thunk_fndecl
, fnname
);
414 current_function_decl
= 0;
416 TREE_ASM_WRITTEN (thunk_fndecl
) = 1;
419 #endif /* ASM_OUTPUT_MI_THUNK */
421 /* If we don't have the necessary macro for efficient thunks, generate
422 a thunk function that just makes a call to the real function.
423 Unfortunately, this doesn't work for varargs. */
427 if (varargs_function_p (function
))
428 error ("generic thunk code fails for method `%#D' which uses `...'",
431 /* Set up clone argument trees for the thunk. */
433 for (a
= DECL_ARGUMENTS (function
); a
; a
= TREE_CHAIN (a
))
435 tree x
= copy_node (a
);
437 DECL_CONTEXT (x
) = thunk_fndecl
;
441 DECL_ARGUMENTS (thunk_fndecl
) = a
;
442 DECL_RESULT (thunk_fndecl
) = NULL_TREE
;
444 start_function (NULL_TREE
, thunk_fndecl
, NULL_TREE
, SF_PRE_PARSED
);
445 /* We don't bother with a body block for thunks. */
447 /* Adjust the this pointer by the constant. */
448 t
= ssize_int (delta
);
449 t
= fold (build (PLUS_EXPR
, TREE_TYPE (a
), a
, t
));
451 /* If there's a vcall offset, look up that value in the vtable and
452 adjust the `this' pointer again. */
453 if (vcall_offset
&& !integer_zerop (vcall_offset
))
459 /* The vptr is always at offset zero in the object. */
460 t
= build1 (NOP_EXPR
,
461 build_pointer_type (build_pointer_type
462 (vtable_entry_type
)),
464 /* Form the vtable address. */
465 t
= build1 (INDIRECT_REF
, TREE_TYPE (TREE_TYPE (t
)), t
);
466 /* Find the entry with the vcall offset. */
467 t
= build (PLUS_EXPR
, TREE_TYPE (t
), t
, vcall_offset
);
468 /* Calculate the offset itself. */
469 t
= build1 (INDIRECT_REF
, TREE_TYPE (TREE_TYPE (t
)), t
);
470 /* Adjust the `this' pointer. */
471 t
= fold (build (PLUS_EXPR
,
472 TREE_TYPE (orig_this
),
477 /* Build up the call to the real function. */
478 t
= tree_cons (NULL_TREE
, t
, NULL_TREE
);
479 for (a
= TREE_CHAIN (a
); a
; a
= TREE_CHAIN (a
))
480 t
= tree_cons (NULL_TREE
, a
, t
);
482 t
= build_call (function
, t
);
483 if (VOID_TYPE_P (TREE_TYPE (t
)))
484 finish_expr_stmt (t
);
486 finish_return_stmt (t
);
488 /* Since we want to emit the thunk, we explicitly mark its name as
490 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (thunk_fndecl
)) = 1;
492 /* But we don't want debugging information about it. */
493 DECL_IGNORED_P (thunk_fndecl
) = 1;
495 expand_body (finish_function (0));
498 pop_from_top_level ();
501 /* Code for synthesizing methods which have default semantics defined. */
503 /* Generate code for default X(X&) constructor. */
506 do_build_copy_constructor (fndecl
)
509 tree parm
= FUNCTION_FIRST_USER_PARM (fndecl
);
512 parm
= convert_from_reference (parm
);
514 if (TYPE_HAS_TRIVIAL_INIT_REF (current_class_type
)
515 && is_empty_class (current_class_type
))
516 /* Don't copy the padding byte; it might not have been allocated
517 if *this is a base subobject. */;
518 else if (TYPE_HAS_TRIVIAL_INIT_REF (current_class_type
))
520 t
= build (INIT_EXPR
, void_type_node
, current_class_ref
, parm
);
521 finish_expr_stmt (t
);
525 tree fields
= TYPE_FIELDS (current_class_type
);
526 int n_bases
= CLASSTYPE_N_BASECLASSES (current_class_type
);
527 tree binfos
= TYPE_BINFO_BASETYPES (current_class_type
);
528 tree member_init_list
= NULL_TREE
;
529 tree base_init_list
= NULL_TREE
;
530 int cvquals
= cp_type_quals (TREE_TYPE (parm
));
533 /* Initialize all the base-classes with the parameter converted
534 to their type so that we get their copy constructor and not
535 another constructor that takes current_class_type. We must
536 deal with the binfo's directly as a direct base might be
537 inaccessible due to ambiguity. */
538 for (t
= CLASSTYPE_VBASECLASSES (current_class_type
); t
;
541 tree binfo
= TREE_VALUE (t
);
543 base_init_list
= tree_cons (binfo
,
544 build_base_path (PLUS_EXPR
, parm
,
549 for (i
= 0; i
< n_bases
; ++i
)
551 tree binfo
= TREE_VEC_ELT (binfos
, i
);
552 if (TREE_VIA_VIRTUAL (binfo
))
555 base_init_list
= tree_cons (binfo
,
556 build_base_path (PLUS_EXPR
, parm
,
561 for (; fields
; fields
= TREE_CHAIN (fields
))
566 if (TREE_CODE (field
) != FIELD_DECL
)
570 if (DECL_NAME (field
))
572 if (VFIELD_NAME_P (DECL_NAME (field
)))
575 /* True for duplicate members. */
576 if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field
)) != field
)
579 else if ((t
= TREE_TYPE (field
)) != NULL_TREE
580 && ANON_AGGR_TYPE_P (t
)
581 && TYPE_FIELDS (t
) != NULL_TREE
)
582 /* Just use the field; anonymous types can't have
583 nontrivial copy ctors or assignment ops. */;
587 init
= build (COMPONENT_REF
,
588 build_qualified_type (TREE_TYPE (field
), cvquals
),
590 init
= build_tree_list (NULL_TREE
, init
);
593 = tree_cons (field
, init
, member_init_list
);
595 member_init_list
= nreverse (member_init_list
);
596 base_init_list
= nreverse (base_init_list
);
597 emit_base_init (member_init_list
, base_init_list
);
602 do_build_assign_ref (fndecl
)
605 tree parm
= TREE_CHAIN (DECL_ARGUMENTS (fndecl
));
608 compound_stmt
= begin_compound_stmt (/*has_no_scope=*/0);
609 parm
= convert_from_reference (parm
);
611 if (TYPE_HAS_TRIVIAL_ASSIGN_REF (current_class_type
)
612 && is_empty_class (current_class_type
))
613 /* Don't copy the padding byte; it might not have been allocated
614 if *this is a base subobject. */;
615 else if (TYPE_HAS_TRIVIAL_ASSIGN_REF (current_class_type
))
617 tree t
= build (MODIFY_EXPR
, void_type_node
, current_class_ref
, parm
);
618 finish_expr_stmt (t
);
622 tree fields
= TYPE_FIELDS (current_class_type
);
623 int n_bases
= CLASSTYPE_N_BASECLASSES (current_class_type
);
624 tree binfos
= TYPE_BINFO_BASETYPES (current_class_type
);
625 int cvquals
= cp_type_quals (TREE_TYPE (parm
));
628 for (i
= 0; i
< n_bases
; ++i
)
630 /* We must deal with the binfo's directly as a direct base
631 might be inaccessible due to ambiguity. */
632 tree binfo
= TREE_VEC_ELT (binfos
, i
);
633 tree src
= build_base_path (PLUS_EXPR
, parm
, binfo
, 1);
634 tree dst
= build_base_path (PLUS_EXPR
, current_class_ref
, binfo
, 1);
636 tree expr
= build_method_call (dst
,
637 ansi_assopname (NOP_EXPR
),
638 build_tree_list (NULL_TREE
, src
),
640 LOOKUP_NORMAL
| LOOKUP_NONVIRTUAL
);
641 finish_expr_stmt (expr
);
643 for (; fields
; fields
= TREE_CHAIN (fields
))
648 if (TREE_CODE (field
) != FIELD_DECL
)
651 if (CP_TYPE_CONST_P (TREE_TYPE (field
)))
653 error ("non-static const member `%#D', can't use default assignment operator", field
);
656 else if (TREE_CODE (TREE_TYPE (field
)) == REFERENCE_TYPE
)
658 error ("non-static reference member `%#D', can't use default assignment operator", field
);
662 comp
= current_class_ref
;
665 if (DECL_NAME (field
))
667 if (VFIELD_NAME_P (DECL_NAME (field
)))
670 /* True for duplicate members. */
671 if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field
)) != field
)
674 else if ((t
= TREE_TYPE (field
)) != NULL_TREE
675 && ANON_AGGR_TYPE_P (t
)
676 && TYPE_FIELDS (t
) != NULL_TREE
)
677 /* Just use the field; anonymous types can't have
678 nontrivial copy ctors or assignment ops. */;
682 comp
= build (COMPONENT_REF
, TREE_TYPE (field
), comp
, field
);
683 init
= build (COMPONENT_REF
,
684 build_qualified_type (TREE_TYPE (field
), cvquals
),
687 if (DECL_NAME (field
))
688 finish_expr_stmt (build_modify_expr (comp
, NOP_EXPR
, init
));
690 finish_expr_stmt (build (MODIFY_EXPR
, TREE_TYPE (comp
), comp
,
694 finish_return_stmt (current_class_ref
);
695 finish_compound_stmt (/*has_no_scope=*/0, compound_stmt
);
699 synthesize_method (fndecl
)
702 int nested
= (current_function_decl
!= NULL_TREE
);
703 tree context
= decl_function_context (fndecl
);
708 import_export_decl (fndecl
);
710 /* If we've been asked to synthesize a clone, just synthesize the
711 cloned function instead. Doing so will automatically fill in the
712 body for the clone. */
713 if (DECL_CLONED_FUNCTION_P (fndecl
))
715 synthesize_method (DECL_CLONED_FUNCTION (fndecl
));
720 push_to_top_level ();
722 push_function_context_to (context
);
724 /* Put the function definition at the position where it is needed,
725 rather than within the body of the class. That way, an error
726 during the generation of the implicit body points at the place
727 where the attempt to generate the function occurs, giving the
728 user a hint as to why we are attempting to generate the
730 DECL_SOURCE_LINE (fndecl
) = lineno
;
731 DECL_SOURCE_FILE (fndecl
) = input_filename
;
733 interface_unknown
= 1;
734 start_function (NULL_TREE
, fndecl
, NULL_TREE
, SF_DEFAULT
| SF_PRE_PARSED
);
736 stmt
= begin_function_body ();
738 if (DECL_OVERLOADED_OPERATOR_P (fndecl
) == NOP_EXPR
)
740 do_build_assign_ref (fndecl
);
743 else if (DECL_CONSTRUCTOR_P (fndecl
))
745 tree arg_chain
= FUNCTION_FIRST_USER_PARMTYPE (fndecl
);
746 if (arg_chain
!= void_list_node
)
747 do_build_copy_constructor (fndecl
);
748 else if (TYPE_NEEDS_CONSTRUCTING (current_class_type
))
749 finish_mem_initializers (NULL_TREE
);
752 /* If we haven't yet generated the body of the function, just
753 generate an empty compound statement. */
757 compound_stmt
= begin_compound_stmt (/*has_no_scope=*/0);
758 finish_compound_stmt (/*has_no_scope=*/0, compound_stmt
);
761 finish_function_body (stmt
);
762 expand_body (finish_function (0));
764 extract_interface_info ();
766 pop_from_top_level ();
768 pop_function_context_from (context
);
771 /* Use EXTRACTOR to locate the relevant function called for each base &
772 class field of TYPE. CLIENT allows additional information to be passed
773 to EXTRACTOR. Generates the union of all exceptions generated by
777 synthesize_exception_spec (type
, extractor
, client
)
779 tree (*extractor
) (tree
, void *);
782 tree raises
= empty_except_spec
;
783 tree fields
= TYPE_FIELDS (type
);
784 int i
, n_bases
= CLASSTYPE_N_BASECLASSES (type
);
785 tree binfos
= TYPE_BINFO_BASETYPES (type
);
787 for (i
= 0; i
!= n_bases
; i
++)
789 tree base
= BINFO_TYPE (TREE_VEC_ELT (binfos
, i
));
790 tree fn
= (*extractor
) (base
, client
);
793 tree fn_raises
= TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn
));
795 raises
= merge_exception_specifiers (raises
, fn_raises
);
798 for (; fields
; fields
= TREE_CHAIN (fields
))
800 tree type
= TREE_TYPE (fields
);
803 if (TREE_CODE (fields
) != FIELD_DECL
)
805 while (TREE_CODE (type
) == ARRAY_TYPE
)
806 type
= TREE_TYPE (type
);
807 if (TREE_CODE (type
) != RECORD_TYPE
)
810 fn
= (*extractor
) (type
, client
);
813 tree fn_raises
= TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn
));
815 raises
= merge_exception_specifiers (raises
, fn_raises
);
821 /* Locate the dtor of TYPE. */
824 locate_dtor (type
, client
)
826 void *client ATTRIBUTE_UNUSED
;
830 if (!TYPE_HAS_DESTRUCTOR (type
))
832 fns
= TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type
),
833 CLASSTYPE_DESTRUCTOR_SLOT
);
837 /* Locate the default ctor of TYPE. */
840 locate_ctor (type
, client
)
842 void *client ATTRIBUTE_UNUSED
;
846 if (!TYPE_HAS_DEFAULT_CONSTRUCTOR (type
))
849 fns
= TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type
),
850 CLASSTYPE_CONSTRUCTOR_SLOT
);
851 for (; fns
; fns
= OVL_NEXT (fns
))
853 tree fn
= OVL_CURRENT (fns
);
854 tree parms
= TYPE_ARG_TYPES (TREE_TYPE (fn
));
856 if (sufficient_parms_p (TREE_CHAIN (parms
)))
868 /* Locate the copy ctor or copy assignment of TYPE. CLIENT_
869 points to a COPY_DATA holding the name (NULL for the ctor)
870 and desired qualifiers of the source operand. */
873 locate_copy (type
, client_
)
877 struct copy_data
*client
= (struct copy_data
*)client_
;
880 tree best
= NULL_TREE
;
885 if (TYPE_HAS_ASSIGN_REF (type
))
886 ix
= lookup_fnfields_1 (type
, client
->name
);
888 else if (TYPE_HAS_INIT_REF (type
))
889 ix
= CLASSTYPE_CONSTRUCTOR_SLOT
;
892 fns
= TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type
), ix
);
894 for (; fns
; fns
= OVL_NEXT (fns
))
896 tree fn
= OVL_CURRENT (fns
);
897 tree parms
= TYPE_ARG_TYPES (TREE_TYPE (fn
));
902 parms
= TREE_CHAIN (parms
);
905 src_type
= TREE_VALUE (parms
);
906 if (TREE_CODE (src_type
) == REFERENCE_TYPE
)
907 src_type
= TREE_TYPE (src_type
);
908 if (!same_type_ignoring_top_level_qualifiers_p (src_type
, type
))
910 if (!sufficient_parms_p (TREE_CHAIN (parms
)))
912 quals
= cp_type_quals (src_type
);
913 if (client
->quals
& ~quals
)
915 excess
= quals
& ~client
->quals
;
916 if (!best
|| (excess_p
&& !excess
))
928 /* Implicitly declare the special function indicated by KIND, as a
929 member of TYPE. For copy constructors and assignment operators,
930 CONST_P indicates whether these functions should take a const
931 reference argument or a non-const reference. */
934 implicitly_declare_fn (kind
, type
, const_p
)
935 special_function_kind kind
;
939 tree declspecs
= NULL_TREE
;
940 tree fn
, args
= NULL_TREE
;
941 tree raises
= empty_except_spec
;
944 tree name
= constructor_name (TYPE_IDENTIFIER (type
));
950 name
= build_nt (BIT_NOT_EXPR
, name
);
951 args
= void_list_node
;
952 raises
= synthesize_exception_spec (type
, &locate_dtor
, 0);
955 case sfk_constructor
:
956 /* Default constructor. */
957 args
= void_list_node
;
958 raises
= synthesize_exception_spec (type
, &locate_ctor
, 0);
961 case sfk_copy_constructor
:
962 case sfk_assignment_operator
:
964 struct copy_data data
;
970 if (kind
== sfk_assignment_operator
)
973 declspecs
= build_tree_list (NULL_TREE
, type
);
975 name
= ansi_assopname (NOP_EXPR
);
980 data
.quals
= TYPE_QUAL_CONST
;
981 type
= build_qualified_type (type
, TYPE_QUAL_CONST
);
984 argtype
= build_reference_type (type
);
985 args
= build_tree_list (hash_tree_chain (argtype
, NULL_TREE
),
986 get_identifier ("_ctor_arg"));
987 args
= tree_cons (NULL_TREE
, args
, void_list_node
);
989 raises
= synthesize_exception_spec (type
, &locate_copy
, &data
);
996 TREE_PARMLIST (args
) = 1;
999 tree declarator
= make_call_declarator (name
, args
, NULL_TREE
, raises
);
1002 declarator
= build_nt (ADDR_EXPR
, declarator
);
1004 fn
= grokfield (declarator
, declspecs
, NULL_TREE
, NULL_TREE
, NULL_TREE
);
1006 TREE_USED (FUNCTION_FIRST_USER_PARM (fn
)) = 1;
1009 my_friendly_assert (TREE_CODE (fn
) == FUNCTION_DECL
, 20000408);
1011 DECL_ARTIFICIAL (fn
) = 1;
1012 DECL_NOT_REALLY_EXTERN (fn
) = 1;
1013 DECL_DECLARED_INLINE_P (fn
) = 1;
1014 DECL_INLINE (fn
) = 1;
1020 /* Given a FUNCTION_DECL FN and a chain LIST, skip as many elements of LIST
1021 as there are artificial parms in FN. */
1024 skip_artificial_parms_for (fn
, list
)
1027 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn
))
1028 list
= TREE_CHAIN (list
);
1032 if (DECL_HAS_IN_CHARGE_PARM_P (fn
))
1033 list
= TREE_CHAIN (list
);
1034 if (DECL_HAS_VTT_PARM_P (fn
))
1035 list
= TREE_CHAIN (list
);