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 NULL. */
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 with the parameter converted to
561 their type so that we get their copy constructor and not another
562 constructor that takes current_class_type. */
563 for (t = CLASSTYPE_VBASECLASSES (current_class_type); t;
566 tree type = BINFO_TYPE (TREE_VALUE (t));
567 base_init_list = tree_cons (type, convert_lvalue (type, parm),
571 for (i = 0; i < n_bases; ++i)
573 t = TREE_VEC_ELT (binfos, i);
574 if (TREE_VIA_VIRTUAL (t))
578 base_init_list = tree_cons (t, convert_lvalue (t, parm),
582 for (; fields; fields = TREE_CHAIN (fields))
587 if (TREE_CODE (field) != FIELD_DECL)
591 if (DECL_NAME (field))
593 if (VFIELD_NAME_P (DECL_NAME (field)))
595 if (VBASE_NAME_P (DECL_NAME (field)))
598 /* True for duplicate members. */
599 if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field)) != field)
602 else if ((t = TREE_TYPE (field)) != NULL_TREE
603 && ANON_AGGR_TYPE_P (t)
604 && TYPE_FIELDS (t) != NULL_TREE)
605 /* Just use the field; anonymous types can't have
606 nontrivial copy ctors or assignment ops. */;
610 init = build (COMPONENT_REF,
611 build_qualified_type (TREE_TYPE (field), cvquals),
613 init = build_tree_list (NULL_TREE, init);
616 = tree_cons (field, init, member_init_list);
618 member_init_list = nreverse (member_init_list);
619 base_init_list = nreverse (base_init_list);
620 setup_vtbl_ptr (member_init_list, base_init_list);
625 do_build_assign_ref (fndecl)
628 tree parm = TREE_CHAIN (DECL_ARGUMENTS (fndecl));
631 compound_stmt = begin_compound_stmt (/*has_no_scope=*/0);
632 parm = convert_from_reference (parm);
634 if (TYPE_HAS_TRIVIAL_ASSIGN_REF (current_class_type)
635 && is_empty_class (current_class_type))
636 /* Don't copy the padding byte; it might not have been allocated
637 if *this is a base subobject. */;
638 else if (TYPE_HAS_TRIVIAL_ASSIGN_REF (current_class_type))
640 tree t = build (MODIFY_EXPR, void_type_node, current_class_ref, parm);
641 finish_expr_stmt (t);
645 tree fields = TYPE_FIELDS (current_class_type);
646 int n_bases = CLASSTYPE_N_BASECLASSES (current_class_type);
647 tree binfos = TYPE_BINFO_BASETYPES (current_class_type);
648 int cvquals = CP_TYPE_QUALS (TREE_TYPE (parm));
651 for (i = 0; i < n_bases; ++i)
653 tree basetype = BINFO_TYPE (TREE_VEC_ELT (binfos, i));
654 tree p = convert_lvalue (basetype, parm);
655 p = build_member_call (basetype, ansi_assopname (NOP_EXPR),
656 build_tree_list (NULL_TREE, p));
657 finish_expr_stmt (p);
659 for (; fields; fields = TREE_CHAIN (fields))
664 if (TREE_CODE (field) != FIELD_DECL)
667 if (CP_TYPE_CONST_P (TREE_TYPE (field)))
669 cp_error ("non-static const member `%#D', can't use default assignment operator", field);
672 else if (TREE_CODE (TREE_TYPE (field)) == REFERENCE_TYPE)
674 cp_error ("non-static reference member `%#D', can't use default assignment operator", field);
678 comp = current_class_ref;
681 if (DECL_NAME (field))
683 if (VFIELD_NAME_P (DECL_NAME (field)))
685 if (VBASE_NAME_P (DECL_NAME (field)))
688 /* True for duplicate members. */
689 if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field)) != field)
692 else if ((t = TREE_TYPE (field)) != NULL_TREE
693 && ANON_AGGR_TYPE_P (t)
694 && TYPE_FIELDS (t) != NULL_TREE)
695 /* Just use the field; anonymous types can't have
696 nontrivial copy ctors or assignment ops. */;
700 comp = build (COMPONENT_REF, TREE_TYPE (field), comp, field);
701 init = build (COMPONENT_REF,
702 build_qualified_type (TREE_TYPE (field), cvquals),
705 if (DECL_NAME (field))
706 finish_expr_stmt (build_modify_expr (comp, NOP_EXPR, init));
708 finish_expr_stmt (build (MODIFY_EXPR, TREE_TYPE (comp), comp,
712 finish_return_stmt (current_class_ref);
713 finish_compound_stmt (/*has_no_scope=*/0, compound_stmt);
717 synthesize_method (fndecl)
720 int nested = (current_function_decl != NULL_TREE);
721 tree context = decl_function_context (fndecl);
725 import_export_decl (fndecl);
727 /* If we've been asked to synthesize a clone, just synthesize the
728 cloned function instead. Doing so will automatically fill in the
729 body for the clone. */
730 if (DECL_CLONED_FUNCTION_P (fndecl))
732 synthesize_method (DECL_CLONED_FUNCTION (fndecl));
737 push_to_top_level ();
739 push_function_context_to (context);
741 /* Put the function definition at the position where it is needed,
742 rather than within the body of the class. That way, an error
743 during the generation of the implicit body points at the place
744 where the attempt to generate the function occurs, giving the
745 user a hint as to why we are attempting to generate the
747 DECL_SOURCE_LINE (fndecl) = lineno;
748 DECL_SOURCE_FILE (fndecl) = input_filename;
750 interface_unknown = 1;
751 start_function (NULL_TREE, fndecl, NULL_TREE, SF_DEFAULT | SF_PRE_PARSED);
754 if (DECL_OVERLOADED_OPERATOR_P (fndecl) == NOP_EXPR)
756 do_build_assign_ref (fndecl);
759 else if (DECL_DESTRUCTOR_P (fndecl))
760 setup_vtbl_ptr (NULL_TREE, NULL_TREE);
763 tree arg_chain = FUNCTION_FIRST_USER_PARMTYPE (fndecl);
764 if (arg_chain != void_list_node)
765 do_build_copy_constructor (fndecl);
766 else if (TYPE_NEEDS_CONSTRUCTING (current_class_type))
767 setup_vtbl_ptr (NULL_TREE, NULL_TREE);
770 /* If we haven't yet generated the body of the function, just
771 generate an empty compound statement. */
775 compound_stmt = begin_compound_stmt (/*has_no_scope=*/0);
776 finish_compound_stmt (/*has_no_scope=*/0, compound_stmt);
779 expand_body (finish_function (0));
781 extract_interface_info ();
783 pop_from_top_level ();
785 pop_function_context_from (context);
788 /* Use EXTRACTOR to locate the relevant function called for each base &
789 class field of TYPE. CLIENT allows additional information to be passed
790 to EXTRACTOR. Generates the union of all exceptions generated by
794 synthesize_exception_spec (type, extractor, client)
796 tree (*extractor) (tree, void *);
799 tree raises = empty_except_spec;
800 tree fields = TYPE_FIELDS (type);
801 int i, n_bases = CLASSTYPE_N_BASECLASSES (type);
802 tree binfos = TYPE_BINFO_BASETYPES (type);
804 for (i = 0; i != n_bases; i++)
806 tree base = BINFO_TYPE (TREE_VEC_ELT (binfos, i));
807 tree fn = (*extractor) (base, client);
810 tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
812 raises = merge_exception_specifiers (raises, fn_raises);
815 for (; fields; fields = TREE_CHAIN (fields))
817 tree type = TREE_TYPE (fields);
820 if (TREE_CODE (fields) != FIELD_DECL)
822 while (TREE_CODE (type) == ARRAY_TYPE)
823 type = TREE_TYPE (type);
824 if (TREE_CODE (type) != RECORD_TYPE)
827 fn = (*extractor) (type, client);
830 tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn));
832 raises = merge_exception_specifiers (raises, fn_raises);
838 /* Locate the dtor of TYPE. */
841 locate_dtor (type, client)
843 void *client ATTRIBUTE_UNUSED;
847 if (!TYPE_HAS_DESTRUCTOR (type))
849 fns = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type),
850 CLASSTYPE_DESTRUCTOR_SLOT);
854 /* Locate the default ctor of TYPE. */
857 locate_ctor (type, client)
859 void *client ATTRIBUTE_UNUSED;
863 if (!TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
866 fns = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type),
867 CLASSTYPE_CONSTRUCTOR_SLOT);
868 for (; fns; fns = OVL_NEXT (fns))
870 tree fn = OVL_CURRENT (fns);
871 tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
873 if (sufficient_parms_p (TREE_CHAIN (parms)))
885 /* Locate the copy ctor or copy assignment of TYPE. CLIENT_
886 points to a COPY_DATA holding the name (NULL for the ctor)
887 and desired qualifiers of the source operand. */
890 locate_copy (type, client_)
894 struct copy_data *client = (struct copy_data *)client_;
897 tree best = NULL_TREE;
902 if (TYPE_HAS_ASSIGN_REF (type))
903 ix = lookup_fnfields_1 (type, client->name);
905 else if (TYPE_HAS_INIT_REF (type))
906 ix = CLASSTYPE_CONSTRUCTOR_SLOT;
909 fns = TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (type), ix);
911 for (; fns; fns = OVL_NEXT (fns))
913 tree fn = OVL_CURRENT (fns);
914 tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
919 parms = TREE_CHAIN (parms);
922 src_type = TREE_VALUE (parms);
923 if (TREE_CODE (src_type) == REFERENCE_TYPE)
924 src_type = TREE_TYPE (src_type);
925 if (!same_type_ignoring_top_level_qualifiers_p (src_type, type))
927 if (!sufficient_parms_p (TREE_CHAIN (parms)))
929 quals = CP_TYPE_QUALS (src_type);
930 if (client->quals & ~quals)
932 excess = quals & ~client->quals;
933 if (!best || (excess_p && !excess))
945 /* Implicitly declare the special function indicated by KIND, as a
946 member of TYPE. For copy constructors and assignment operators,
947 CONST_P indicates whether these functions should take a const
948 reference argument or a non-const reference. */
951 implicitly_declare_fn (kind, type, const_p)
952 special_function_kind kind;
956 tree declspecs = NULL_TREE;
957 tree fn, args = NULL_TREE;
958 tree raises = empty_except_spec;
961 tree name = constructor_name (TYPE_IDENTIFIER (type));
967 name = build_nt (BIT_NOT_EXPR, name);
968 args = void_list_node;
969 raises = synthesize_exception_spec (type, &locate_dtor, 0);
972 case sfk_constructor:
973 /* Default constructor. */
974 args = void_list_node;
975 raises = synthesize_exception_spec (type, &locate_ctor, 0);
978 case sfk_copy_constructor:
979 case sfk_assignment_operator:
981 struct copy_data data;
987 if (kind == sfk_assignment_operator)
990 declspecs = build_tree_list (NULL_TREE, type);
992 name = ansi_assopname (NOP_EXPR);
997 data.quals = TYPE_QUAL_CONST;
998 type = build_qualified_type (type, TYPE_QUAL_CONST);
1001 argtype = build_reference_type (type);
1002 args = build_tree_list (hash_tree_chain (argtype, NULL_TREE),
1003 get_identifier ("_ctor_arg"));
1004 args = tree_cons (NULL_TREE, args, void_list_node);
1006 raises = synthesize_exception_spec (type, &locate_copy, &data);
1010 my_friendly_abort (59);
1013 TREE_PARMLIST (args) = 1;
1016 tree declarator = make_call_declarator (name, args, NULL_TREE, raises);
1019 declarator = build_nt (ADDR_EXPR, declarator);
1021 fn = grokfield (declarator, declspecs, NULL_TREE, NULL_TREE, NULL_TREE);
1023 TREE_USED (FUNCTION_FIRST_USER_PARM (fn)) = 1;
1026 my_friendly_assert (TREE_CODE (fn) == FUNCTION_DECL, 20000408);
1028 DECL_ARTIFICIAL (fn) = 1;
1029 DECL_NOT_REALLY_EXTERN (fn) = 1;
1030 DECL_DECLARED_INLINE_P (fn) = 1;
1031 DECL_INLINE (fn) = 1;
1037 /* Given a FUNCTION_DECL FN and a chain LIST, skip as many elements of LIST
1038 as there are artificial parms in FN. */
1041 skip_artificial_parms_for (fn, list)
1044 if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
1045 list = TREE_CHAIN (list);
1049 if (DECL_HAS_IN_CHARGE_PARM_P (fn))
1050 list = TREE_CHAIN (list);
1051 if (DECL_HAS_VTT_PARM_P (fn))
1052 list = TREE_CHAIN (list);