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 /* TREE_LIST of the current inline functions that need to be
59 struct pending_inline *pending_inlines;
61 #define obstack_chunk_alloc xmalloc
62 #define obstack_chunk_free free
64 static void do_build_assign_ref PARAMS ((tree));
65 static void do_build_copy_constructor PARAMS ((tree));
66 static tree synthesize_exception_spec PARAMS ((tree, tree (*) (tree, void *), void *));
67 static tree locate_dtor PARAMS ((tree, void *));
68 static tree locate_ctor PARAMS ((tree, void *));
69 static tree locate_copy PARAMS ((tree, void *));
71 /* Called once to initialize method.c. */
80 /* Set the mangled name (DECL_ASSEMBLER_NAME) for DECL. */
83 set_mangled_name_for_decl (decl)
86 if (processing_template_decl)
87 /* There's no need to mangle the name of a template function. */
94 /* Given a tree_code CODE, and some arguments (at least one),
95 attempt to use an overloaded operator on the arguments.
97 For unary operators, only the first argument need be checked.
98 For binary operators, both arguments may need to be checked.
100 Member functions can convert class references to class pointers,
101 for one-level deep indirection. More than that is not supported.
102 Operators [](), ()(), and ->() must be member functions.
104 We call function call building calls with LOOKUP_COMPLAIN if they
105 are our only hope. This is true when we see a vanilla operator
106 applied to something of aggregate type. If this fails, we are free
107 to return `error_mark_node', because we will have reported the
110 Operators NEW and DELETE overload in funny ways: operator new takes
111 a single `size' parameter, and operator delete takes a pointer to the
112 storage being deleted. When overloading these operators, success is
113 assumed. If there is a failure, report an error message and return
114 `error_mark_node'. */
118 build_opfncall (code, flags, xarg1, xarg2, arg3)
121 tree xarg1, xarg2, arg3;
123 return build_new_op (code, flags, xarg1, xarg2, arg3);
126 /* This function takes an identifier, ID, and attempts to figure out what
127 it means. There are a number of possible scenarios, presented in increasing
130 1) not in a class's scope
131 2) in class's scope, member name of the class's method
132 3) in class's scope, but not a member name of the class
133 4) in class's scope, member name of a class's variable
135 NAME is $1 from the bison rule. It is an IDENTIFIER_NODE.
136 VALUE is $$ from the bison rule. It is the value returned by lookup_name ($1)
138 As a last ditch, try to look up the name as a label and return that
141 Values which are declared as being of REFERENCE_TYPE are
142 automatically dereferenced here (as a hack to make the
146 hack_identifier (value, name)
151 if (value == error_mark_node)
153 if (current_class_name)
155 tree fields = lookup_fnfields (TYPE_BINFO (current_class_type),
157 if (fields == error_mark_node)
158 return error_mark_node;
163 fndecl = TREE_VALUE (fields);
164 my_friendly_assert (TREE_CODE (fndecl) == FUNCTION_DECL, 251);
165 /* I could not trigger this code. MvL */
166 my_friendly_abort (980325);
168 if (DECL_CHAIN (fndecl) == NULL_TREE)
170 warning ("methods cannot be converted to function pointers");
175 error ("ambiguous request for method pointer `%s'",
176 IDENTIFIER_POINTER (name));
177 return error_mark_node;
182 return error_mark_node;
185 type = TREE_TYPE (value);
186 if (TREE_CODE (value) == FIELD_DECL)
188 if (current_class_ptr == NULL_TREE)
190 if (current_function_decl
191 && DECL_STATIC_FUNCTION_P (current_function_decl))
192 cp_error ("invalid use of member `%D' in static member function",
195 /* We can get here when processing a bad default
197 struct S { int a; void f(int i = a); } */
198 cp_error ("invalid use of member `%D'", value);
200 return error_mark_node;
202 TREE_USED (current_class_ptr) = 1;
204 /* Mark so that if we are in a constructor, and then find that
205 this field was initialized by a base initializer,
206 we can emit an error message. */
207 TREE_USED (value) = 1;
208 value = build_component_ref (current_class_ref, name, NULL_TREE, 1);
210 else if ((TREE_CODE (value) == FUNCTION_DECL
211 && DECL_FUNCTION_MEMBER_P (value))
212 || (TREE_CODE (value) == OVERLOAD
213 && DECL_FUNCTION_MEMBER_P (OVL_CURRENT (value))))
217 if (TREE_CODE (value) == OVERLOAD)
218 value = OVL_CURRENT (value);
220 decl = maybe_dummy_object (DECL_CONTEXT (value), 0);
221 value = build_component_ref (decl, name, NULL_TREE, 1);
223 else if (really_overloaded_fn (value))
225 else if (TREE_CODE (value) == OVERLOAD)
226 /* not really overloaded function */
227 mark_used (OVL_FUNCTION (value));
228 else if (TREE_CODE (value) == TREE_LIST)
230 /* Ambiguous reference to base members, possibly other cases?. */
232 while (t && TREE_CODE (t) == TREE_LIST)
234 mark_used (TREE_VALUE (t));
238 else if (TREE_CODE (value) == NAMESPACE_DECL)
240 cp_error ("use of namespace `%D' as expression", value);
241 return error_mark_node;
243 else if (DECL_CLASS_TEMPLATE_P (value))
245 cp_error ("use of class template `%T' as expression", value);
246 return error_mark_node;
251 if (TREE_CODE (value) == VAR_DECL || TREE_CODE (value) == PARM_DECL
252 || TREE_CODE (value) == RESULT_DECL)
254 tree context = decl_function_context (value);
255 if (context != NULL_TREE && context != current_function_decl
256 && ! TREE_STATIC (value))
258 cp_error ("use of %s from containing function",
259 (TREE_CODE (value) == VAR_DECL
260 ? "`auto' variable" : "parameter"));
261 cp_error_at (" `%#D' declared here", value);
262 value = error_mark_node;
266 if (DECL_P (value) && DECL_NONLOCAL (value))
268 if (DECL_CLASS_SCOPE_P (value)
269 && DECL_CONTEXT (value) != current_class_type)
272 path = currently_open_derived_class (DECL_CONTEXT (value));
273 enforce_access (path, value);
276 else if (TREE_CODE (value) == TREE_LIST
277 && TREE_TYPE (value) == error_mark_node)
280 request for member `%D' is ambiguous in multiple inheritance lattice",
282 print_candidates (value);
283 return error_mark_node;
286 if (! processing_template_decl)
287 value = convert_from_reference (value);
292 /* Return a thunk to FUNCTION. For a virtual thunk, DELTA is the
293 offset to this used to locate the vptr, and VCALL_INDEX is used to
294 look up the eventual subobject location. For a non-virtual thunk,
295 DELTA is the offset to this and VCALL_INDEX is zero. */
298 make_thunk (function, delta, vcall_index)
309 /* Scale the VCALL_INDEX to be in terms of bytes. */
312 = size_binop (MULT_EXPR,
315 TYPE_SIZE_UNIT (vtable_entry_type)));
317 vcall_offset = NULL_TREE;
319 d = tree_low_cst (delta, 0);
321 if (TREE_CODE (function) != ADDR_EXPR)
323 func_decl = TREE_OPERAND (function, 0);
324 if (TREE_CODE (func_decl) != FUNCTION_DECL)
327 thunk_id = mangle_thunk (TREE_OPERAND (function, 0),
328 delta, vcall_offset);
329 thunk = IDENTIFIER_GLOBAL_VALUE (thunk_id);
330 if (thunk && !DECL_THUNK_P (thunk))
332 cp_error ("implementation-reserved name `%D' used", thunk_id);
334 SET_IDENTIFIER_GLOBAL_VALUE (thunk_id, thunk);
336 if (thunk == NULL_TREE)
338 thunk = build_decl (FUNCTION_DECL, thunk_id, TREE_TYPE (func_decl));
339 DECL_LANG_SPECIFIC (thunk) = DECL_LANG_SPECIFIC (func_decl);
340 copy_lang_decl (func_decl);
341 SET_DECL_ASSEMBLER_NAME (thunk, thunk_id);
342 DECL_CONTEXT (thunk) = DECL_CONTEXT (func_decl);
343 TREE_READONLY (thunk) = TREE_READONLY (func_decl);
344 TREE_THIS_VOLATILE (thunk) = TREE_THIS_VOLATILE (func_decl);
345 comdat_linkage (thunk);
346 SET_DECL_THUNK_P (thunk);
347 DECL_INITIAL (thunk) = function;
348 THUNK_DELTA (thunk) = d;
349 THUNK_VCALL_OFFSET (thunk) = vcall_offset;
350 /* The thunk itself is not a constructor or destructor, even if
351 the thing it is thunking to is. */
352 DECL_INTERFACE_KNOWN (thunk) = 1;
353 DECL_NOT_REALLY_EXTERN (thunk) = 1;
354 DECL_SAVED_FUNCTION_DATA (thunk) = NULL;
355 DECL_DESTRUCTOR_P (thunk) = 0;
356 DECL_CONSTRUCTOR_P (thunk) = 0;
357 /* And neither is it a clone. */
358 DECL_CLONED_FUNCTION (thunk) = NULL_TREE;
359 DECL_EXTERNAL (thunk) = 1;
360 DECL_ARTIFICIAL (thunk) = 1;
361 /* Even if this thunk is a member of a local class, we don't
362 need a static chain. */
363 DECL_NO_STATIC_CHAIN (thunk) = 1;
364 /* The THUNK is not a pending inline, even if the FUNC_DECL is. */
365 DECL_PENDING_INLINE_P (thunk) = 0;
366 /* Nor has it been deferred. */
367 DECL_DEFERRED_FN (thunk) = 0;
368 /* So that finish_file can write out any thunks that need to be: */
369 pushdecl_top_level (thunk);
370 SET_IDENTIFIER_GLOBAL_VALUE (thunk_id, thunk);
375 /* Emit the definition of a C++ multiple inheritance vtable thunk. If
376 EMIT_P is non-zero, the thunk is emitted immediately. */
379 use_thunk (thunk_fndecl, emit_p)
388 if (TREE_ASM_WRITTEN (thunk_fndecl))
391 fnaddr = DECL_INITIAL (thunk_fndecl);
392 if (TREE_CODE (DECL_INITIAL (thunk_fndecl)) != ADDR_EXPR)
393 /* We already turned this thunk into an ordinary function.
394 There's no need to process this thunk again. (We can't just
395 clear DECL_THUNK_P because that will confuse
396 FNADDR_FROM_VTABLE_ENTRY and friends.) */
399 /* Thunks are always addressable; they only appear in vtables. */
400 TREE_ADDRESSABLE (thunk_fndecl) = 1;
402 /* Figure out what function is being thunked to. It's referenced in
403 this translation unit. */
404 function = TREE_OPERAND (fnaddr, 0);
405 TREE_ADDRESSABLE (function) = 1;
406 mark_used (function);
407 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (function)) = 1;
411 delta = THUNK_DELTA (thunk_fndecl);
412 vcall_offset = THUNK_VCALL_OFFSET (thunk_fndecl);
414 /* And, if we need to emit the thunk, it's used. */
415 mark_used (thunk_fndecl);
416 /* This thunk is actually defined. */
417 DECL_EXTERNAL (thunk_fndecl) = 0;
419 if (flag_syntax_only)
421 TREE_ASM_WRITTEN (thunk_fndecl) = 1;
425 push_to_top_level ();
427 #ifdef ASM_OUTPUT_MI_THUNK
431 current_function_decl = thunk_fndecl;
432 DECL_RESULT (thunk_fndecl)
433 = build_decl (RESULT_DECL, 0, integer_type_node);
434 fnname = XSTR (XEXP (DECL_RTL (thunk_fndecl), 0), 0);
435 init_function_start (thunk_fndecl, input_filename, lineno);
436 current_function_is_thunk = 1;
437 assemble_start_function (thunk_fndecl, fnname);
438 ASM_OUTPUT_MI_THUNK (asm_out_file, thunk_fndecl, delta, function);
439 assemble_end_function (thunk_fndecl, fnname);
440 current_function_decl = 0;
442 TREE_ASM_WRITTEN (thunk_fndecl) = 1;
445 #endif /* ASM_OUTPUT_MI_THUNK */
447 /* If we don't have the necessary macro for efficient thunks, generate a
448 thunk function that just makes a call to the real function.
449 Unfortunately, this doesn't work for varargs. */
453 if (varargs_function_p (function))
454 cp_error ("generic thunk code fails for method `%#D' which uses `...'",
457 /* Set up clone argument trees for the thunk. */
459 for (a = DECL_ARGUMENTS (function); a; a = TREE_CHAIN (a))
461 tree x = copy_node (a);
463 DECL_CONTEXT (x) = thunk_fndecl;
467 DECL_ARGUMENTS (thunk_fndecl) = a;
468 DECL_RESULT (thunk_fndecl) = NULL_TREE;
470 start_function (NULL_TREE, thunk_fndecl, NULL_TREE, SF_PRE_PARSED);
472 /* Adjust the this pointer by the constant. */
473 t = ssize_int (delta);
474 t = fold (build (PLUS_EXPR, TREE_TYPE (a), a, t));
475 /* If there's a vcall offset, look up that value in the vtable and
476 adjust the `this' pointer again. */
477 if (vcall_offset && !integer_zerop (vcall_offset))
483 /* The vptr is always at offset zero in the object. */
484 t = build1 (NOP_EXPR,
485 build_pointer_type (build_pointer_type
486 (vtable_entry_type)),
488 /* Form the vtable address. */
489 t = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (t)), t);
490 /* Find the entry with the vcall offset. */
491 t = build (PLUS_EXPR, TREE_TYPE (t), t, vcall_offset);
492 /* Calculate the offset itself. */
493 t = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (t)), t);
494 /* Adjust the `this' pointer. */
495 t = fold (build (PLUS_EXPR,
496 TREE_TYPE (orig_this),
501 /* Build up the call to the real function. */
502 t = tree_cons (NULL_TREE, t, NULL_TREE);
503 for (a = TREE_CHAIN (a); a; a = TREE_CHAIN (a))
504 t = tree_cons (NULL_TREE, a, t);
506 t = build_call (function, t);
507 if (VOID_TYPE_P (TREE_TYPE (t)))
508 finish_expr_stmt (t);
510 finish_return_stmt (t);
512 /* The back-end expects DECL_INITIAL to contain a BLOCK, so we
514 DECL_INITIAL (thunk_fndecl) = make_node (BLOCK);
515 BLOCK_VARS (DECL_INITIAL (thunk_fndecl))
516 = DECL_ARGUMENTS (thunk_fndecl);
518 /* Since we want to emit the thunk, we explicitly mark its name as
520 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (thunk_fndecl)) = 1;
522 expand_body (finish_function (0));
525 pop_from_top_level ();
528 /* Code for synthesizing methods which have default semantics defined. */
530 /* Generate code for default X(X&) constructor. */
533 do_build_copy_constructor (fndecl)
536 tree parm = FUNCTION_FIRST_USER_PARM (fndecl);
539 parm = convert_from_reference (parm);
541 if (TYPE_HAS_TRIVIAL_INIT_REF (current_class_type)
542 && is_empty_class (current_class_type))
543 /* Don't copy the padding byte; it might not have been allocated
544 if *this is a base subobject. */;
545 else if (TYPE_HAS_TRIVIAL_INIT_REF (current_class_type))
547 t = build (INIT_EXPR, void_type_node, current_class_ref, parm);
548 finish_expr_stmt (t);
552 tree fields = TYPE_FIELDS (current_class_type);
553 int n_bases = CLASSTYPE_N_BASECLASSES (current_class_type);
554 tree binfos = TYPE_BINFO_BASETYPES (current_class_type);
555 tree member_init_list = NULL_TREE;
556 tree base_init_list = NULL_TREE;
557 int cvquals = CP_TYPE_QUALS (TREE_TYPE (parm));
560 /* Initialize all the base-classes. */
561 for (t = CLASSTYPE_VBASECLASSES (current_class_type); t;
564 = tree_cons (BINFO_TYPE (TREE_VALUE (t)), parm,
566 for (i = 0; i < n_bases; ++i)
568 t = TREE_VEC_ELT (binfos, i);
569 if (TREE_VIA_VIRTUAL (t))
573 = tree_cons (BINFO_TYPE (t), parm, base_init_list);
576 for (; fields; fields = TREE_CHAIN (fields))
581 if (TREE_CODE (field) != FIELD_DECL)
585 if (DECL_NAME (field))
587 if (VFIELD_NAME_P (DECL_NAME (field)))
589 if (VBASE_NAME_P (DECL_NAME (field)))
592 /* True for duplicate members. */
593 if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field)) != field)
596 else if ((t = TREE_TYPE (field)) != NULL_TREE
597 && ANON_AGGR_TYPE_P (t)
598 && TYPE_FIELDS (t) != NULL_TREE)
599 /* Just use the field; anonymous types can't have
600 nontrivial copy ctors or assignment ops. */;
604 init = build (COMPONENT_REF,
605 build_qualified_type (TREE_TYPE (field), cvquals),
607 init = build_tree_list (NULL_TREE, init);
610 = tree_cons (field, init, member_init_list);
612 member_init_list = nreverse (member_init_list);
613 base_init_list = nreverse (base_init_list);
614 setup_vtbl_ptr (member_init_list, base_init_list);
619 do_build_assign_ref (fndecl)
622 tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl));
625 compound_stmt = begin_compound_stmt (/*has_no_scope=*/0);
626 parm = convert_from_reference (parm);
628 if (TYPE_HAS_TRIVIAL_ASSIGN_REF (current_class_type)
629 && is_empty_class (current_class_type))
630 /* Don't copy the padding byte; it might not have been allocated
631 if *this is a base subobject. */;
632 else if (TYPE_HAS_TRIVIAL_ASSIGN_REF (current_class_type))
634 tree t = build (MODIFY_EXPR, void_type_node, current_class_ref, parm);
635 finish_expr_stmt (t);
639 tree fields = TYPE_FIELDS (current_class_type);
640 int n_bases = CLASSTYPE_N_BASECLASSES (current_class_type);
641 tree binfos = TYPE_BINFO_BASETYPES (current_class_type);
642 int cvquals = CP_TYPE_QUALS (TREE_TYPE (parm));
645 for (i = 0; i < n_bases; ++i)
647 tree basetype = BINFO_TYPE (TREE_VEC_ELT (binfos, i));
648 tree p = build_qualified_type (basetype, cvquals);
650 p = convert_to_reference
651 (build_reference_type (p), parm,
652 CONV_IMPLICIT, LOOKUP_COMPLAIN, NULL_TREE);
653 p = convert_from_reference (p);
654 p = build_member_call (basetype, ansi_assopname (NOP_EXPR),
655 build_tree_list (NULL_TREE, p));
656 finish_expr_stmt (p);
658 for (; fields; fields = TREE_CHAIN (fields))
663 if (TREE_CODE (field) != FIELD_DECL)
666 if (CP_TYPE_CONST_P (TREE_TYPE (field)))
668 cp_error ("non-static const member `%#D', can't use default assignment operator", field);
671 else if (TREE_CODE (TREE_TYPE (field)) == REFERENCE_TYPE)
673 cp_error ("non-static reference member `%#D', can't use default assignment operator", field);
677 comp = current_class_ref;
680 if (DECL_NAME (field))
682 if (VFIELD_NAME_P (DECL_NAME (field)))
684 if (VBASE_NAME_P (DECL_NAME (field)))
687 /* True for duplicate members. */
688 if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field)) != field)
691 else if ((t = TREE_TYPE (field)) != NULL_TREE
692 && ANON_AGGR_TYPE_P (t)
693 && TYPE_FIELDS (t) != NULL_TREE)
694 /* Just use the field; anonymous types can't have
695 nontrivial copy ctors or assignment ops. */;
699 comp = build (COMPONENT_REF, TREE_TYPE (field), comp, field);
700 init = build (COMPONENT_REF,
701 build_qualified_type (TREE_TYPE (field), cvquals),
704 if (DECL_NAME (field))
705 finish_expr_stmt (build_modify_expr (comp, NOP_EXPR, init));
707 finish_expr_stmt (build (MODIFY_EXPR, TREE_TYPE (comp), comp,
711 finish_return_stmt (current_class_ref);
712 finish_compound_stmt (/*has_no_scope=*/0, compound_stmt);
716 synthesize_method (fndecl)
719 int nested = (current_function_decl != NULL_TREE);
720 tree context = decl_function_context (fndecl);
724 import_export_decl (fndecl);
726 /* If we've been asked to synthesize a clone, just synthesize the
727 cloned function instead. Doing so will automatically fill in the
728 body for the clone. */
729 if (DECL_CLONED_FUNCTION_P (fndecl))
731 synthesize_method (DECL_CLONED_FUNCTION (fndecl));
736 push_to_top_level ();
738 push_function_context_to (context);
740 /* Put the function definition at the position where it is needed,
741 rather than within the body of the class. That way, an error
742 during the generation of the implicit body points at the place
743 where the attempt to generate the function occurs, giving the
744 user a hint as to why we are attempting to generate the
746 DECL_SOURCE_LINE (fndecl) = lineno;
747 DECL_SOURCE_FILE (fndecl) = input_filename;
749 interface_unknown = 1;
750 start_function (NULL_TREE, fndecl, NULL_TREE, SF_DEFAULT | SF_PRE_PARSED);
753 if (DECL_OVERLOADED_OPERATOR_P (fndecl) == NOP_EXPR)
755 do_build_assign_ref (fndecl);
758 else if (DECL_DESTRUCTOR_P (fndecl))
759 setup_vtbl_ptr (NULL_TREE, NULL_TREE);
762 tree arg_chain = FUNCTION_FIRST_USER_PARMTYPE (fndecl);
763 if (arg_chain != void_list_node)
764 do_build_copy_constructor (fndecl);
765 else if (TYPE_NEEDS_CONSTRUCTING (current_class_type))
766 setup_vtbl_ptr (NULL_TREE, NULL_TREE);
769 /* If we haven't yet generated the body of the function, just
770 generate an empty compound statement. */
774 compound_stmt = begin_compound_stmt (/*has_no_scope=*/0);
775 finish_compound_stmt (/*has_no_scope=*/0, compound_stmt);
778 expand_body (finish_function (0));
780 extract_interface_info ();
782 pop_from_top_level ();
784 pop_function_context_from (context);
787 /* Use EXTRACTOR to locate the relevant function called for each base &
788 class field of TYPE. CLIENT allows additional information to be passed
789 to EXTRACTOR. Generates the union of all exceptions generated by
793 synthesize_exception_spec (type, extractor, client)
795 tree (*extractor) (tree, void *);
798 tree raises = empty_except_spec;
799 tree fields = TYPE_FIELDS (type);
800 int i, n_bases = CLASSTYPE_N_BASECLASSES (type);
801 tree binfos = TYPE_BINFO_BASETYPES (type);
803 for (i = 0; i != n_bases; i++)
805 tree base = BINFO_TYPE (TREE_VEC_ELT (binfos, i));
806 tree fn = (*extractor) (base, client);
809 tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
811 raises = merge_exception_specifiers (raises, fn_raises);
814 for (; fields; fields = TREE_CHAIN (fields))
816 tree type = TREE_TYPE (fields);
819 if (TREE_CODE (fields) != FIELD_DECL)
821 while (TREE_CODE (type) == ARRAY_TYPE)
822 type = TREE_TYPE (type);
823 if (TREE_CODE (type) != RECORD_TYPE)
826 fn = (*extractor) (type, client);
829 tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
831 raises = merge_exception_specifiers (raises, fn_raises);
837 /* Locate the dtor of TYPE. */
840 locate_dtor (type, client)
842 void *client ATTRIBUTE_UNUSED;
846 if (!TYPE_HAS_DESTRUCTOR (type))
848 fns = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type),
849 CLASSTYPE_DESTRUCTOR_SLOT);
853 /* Locate the default ctor of TYPE. */
856 locate_ctor (type, client)
858 void *client ATTRIBUTE_UNUSED;
862 if (!TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
865 fns = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type),
866 CLASSTYPE_CONSTRUCTOR_SLOT);
867 for (; fns; fns = OVL_NEXT (fns))
869 tree fn = OVL_CURRENT (fns);
870 tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
872 if (sufficient_parms_p (TREE_CHAIN (parms)))
884 /* Locate the copy ctor or copy assignment of TYPE. CLIENT_
885 points to a COPY_DATA holding the name (NULL for the ctor)
886 and desired qualifiers of the source operand. */
889 locate_copy (type, client_)
893 struct copy_data *client = (struct copy_data *)client_;
896 tree best = NULL_TREE;
901 if (TYPE_HAS_ASSIGN_REF (type))
902 ix = lookup_fnfields_1 (type, client->name);
904 else if (TYPE_HAS_INIT_REF (type))
905 ix = CLASSTYPE_CONSTRUCTOR_SLOT;
908 fns = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type), ix);
910 for (; fns; fns = OVL_NEXT (fns))
912 tree fn = OVL_CURRENT (fns);
913 tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
918 parms = TREE_CHAIN (parms);
921 src_type = TREE_VALUE (parms);
922 if (TREE_CODE (src_type) == REFERENCE_TYPE)
923 src_type = TREE_TYPE (src_type);
924 if (!same_type_ignoring_top_level_qualifiers_p (src_type, type))
926 if (!sufficient_parms_p (TREE_CHAIN (parms)))
928 quals = CP_TYPE_QUALS (src_type);
929 if (client->quals & ~quals)
931 excess = quals & ~client->quals;
932 if (!best || (excess_p && !excess))
944 /* Implicitly declare the special function indicated by KIND, as a
945 member of TYPE. For copy constructors and assignment operators,
946 CONST_P indicates whether these functions should take a const
947 reference argument or a non-const reference. */
950 implicitly_declare_fn (kind, type, const_p)
951 special_function_kind kind;
955 tree declspecs = NULL_TREE;
956 tree fn, args = NULL_TREE;
957 tree raises = empty_except_spec;
960 tree name = constructor_name (TYPE_IDENTIFIER (type));
966 name = build_nt (BIT_NOT_EXPR, name);
967 args = void_list_node;
968 raises = synthesize_exception_spec (type, &locate_dtor, 0);
971 case sfk_constructor:
972 /* Default constructor. */
973 args = void_list_node;
974 raises = synthesize_exception_spec (type, &locate_ctor, 0);
977 case sfk_copy_constructor:
978 case sfk_assignment_operator:
980 struct copy_data data;
986 if (kind == sfk_assignment_operator)
989 declspecs = build_tree_list (NULL_TREE, type);
991 name = ansi_assopname (NOP_EXPR);
996 data.quals = TYPE_QUAL_CONST;
997 type = build_qualified_type (type, TYPE_QUAL_CONST);
1000 argtype = build_reference_type (type);
1001 args = build_tree_list (hash_tree_chain (argtype, NULL_TREE),
1002 get_identifier ("_ctor_arg"));
1003 args = tree_cons (NULL_TREE, args, void_list_node);
1005 raises = synthesize_exception_spec (type, &locate_copy, &data);
1009 my_friendly_abort (59);
1012 TREE_PARMLIST (args) = 1;
1015 tree declarator = make_call_declarator (name, args, NULL_TREE, raises);
1018 declarator = build_nt (ADDR_EXPR, declarator);
1020 fn = grokfield (declarator, declspecs, NULL_TREE, NULL_TREE, NULL_TREE);
1022 TREE_USED (FUNCTION_FIRST_USER_PARM (fn)) = 1;
1025 my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL, 20000408);
1027 DECL_ARTIFICIAL (fn) = 1;
1028 DECL_NOT_REALLY_EXTERN (fn) = 1;
1029 DECL_DECLARED_INLINE_P (fn) = 1;
1030 DECL_INLINE (fn) = 1;
1036 /* Given a FUNCTION_DECL FN and a chain LIST, skip as many elements of LIST
1037 as there are artificial parms in FN. */
1040 skip_artificial_parms_for (fn, list)
1043 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
1044 list = TREE_CHAIN (list);
1048 if (DECL_HAS_IN_CHARGE_PARM_P (fn))
1049 list = TREE_CHAIN (list);
1050 if (DECL_HAS_VTT_PARM_P (fn))
1051 list = TREE_CHAIN (list);