diff options
Diffstat (limited to 'gcc/cp/method.c')
-rw-r--r-- | gcc/cp/method.c | 94 |
1 files changed, 47 insertions, 47 deletions
diff --git a/gcc/cp/method.c b/gcc/cp/method.c index f5c7d2a..c5d68d6 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -1,11 +1,11 @@ /* Handle the hair of processing (but not expanding) inline functions. Also manage function and variable name overloading. - Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, + Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@cygnus.com) This file is part of GCC. - + GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) @@ -89,22 +89,22 @@ make_thunk (tree function, bool this_adjusting, { HOST_WIDE_INT d; tree thunk; - + gcc_assert (TREE_CODE (function) == FUNCTION_DECL); /* We can have this thunks to covariant thunks, but not vice versa. */ gcc_assert (!DECL_THIS_THUNK_P (function)); gcc_assert (!DECL_RESULT_THUNK_P (function) || this_adjusting); - + /* Scale the VIRTUAL_OFFSET to be in terms of bytes. */ if (this_adjusting && virtual_offset) - virtual_offset + virtual_offset = size_binop (MULT_EXPR, virtual_offset, convert (ssizetype, TYPE_SIZE_UNIT (vtable_entry_type))); - + d = tree_low_cst (fixed_offset, 0); - + /* See if we already have the thunk in question. For this_adjusting thunks VIRTUAL_OFFSET will be an INTEGER_CST, for covariant thunks it will be a BINFO. */ @@ -118,7 +118,7 @@ make_thunk (tree function, bool this_adjusting, virtual_offset) : THUNK_VIRTUAL_OFFSET (thunk) == virtual_offset))) return thunk; - + /* All thunks must be created before FUNCTION is actually emitted; the ABI requires that all thunks be emitted together with the function to which they transfer control. */ @@ -132,7 +132,7 @@ make_thunk (tree function, bool this_adjusting, DECL_LANG_SPECIFIC (thunk) = DECL_LANG_SPECIFIC (function); cxx_dup_lang_specific_decl (thunk); DECL_THUNKS (thunk) = NULL_TREE; - + DECL_CONTEXT (thunk) = DECL_CONTEXT (function); TREE_READONLY (thunk) = TREE_READONLY (function); TREE_THIS_VOLATILE (thunk) = TREE_THIS_VOLATILE (function); @@ -144,7 +144,7 @@ make_thunk (tree function, bool this_adjusting, THUNK_FIXED_OFFSET (thunk) = d; THUNK_VIRTUAL_OFFSET (thunk) = virtual_offset; THUNK_ALIAS (thunk) = NULL_TREE; - + /* The thunk itself is not a constructor or destructor, even if the thing it is thunking to is. */ DECL_INTERFACE_KNOWN (thunk) = 1; @@ -163,7 +163,7 @@ make_thunk (tree function, bool this_adjusting, DECL_DECLARED_INLINE_P (thunk) = 0; /* Nor has it been deferred. */ DECL_DEFERRED_FN (thunk) = 0; - + /* Add it to the list of thunks associated with FUNCTION. */ TREE_CHAIN (thunk) = DECL_THUNKS (function); DECL_THUNKS (function) = thunk; @@ -206,7 +206,7 @@ finish_thunk (tree thunk) break; } } - + DECL_NAME (thunk) = name; SET_DECL_ASSEMBLER_NAME (thunk, name); } @@ -234,7 +234,7 @@ thunk_adjust (tree ptr, bool this_adjusting, ptr = save_expr (ptr); /* The vptr is always at offset zero in the object. */ vtable = build1 (NOP_EXPR, - build_pointer_type (build_pointer_type + build_pointer_type (build_pointer_type (vtable_entry_type)), ptr); /* Form the vtable address. */ @@ -246,7 +246,7 @@ thunk_adjust (tree ptr, bool this_adjusting, /* Adjust the `this' pointer. */ ptr = fold_build2 (PLUS_EXPR, TREE_TYPE (ptr), ptr, vtable); } - + if (!this_adjusting) /* Adjust the pointer by the constant. */ ptr = fold_build2 (PLUS_EXPR, TREE_TYPE (ptr), ptr, @@ -332,7 +332,7 @@ use_thunk (tree thunk_fndecl, bool emit_p) if (TREE_ASM_WRITTEN (thunk_fndecl)) return; - + function = THUNK_TARGET (thunk_fndecl); if (DECL_RESULT (thunk_fndecl)) /* We already turned this thunk into an ordinary function. @@ -342,7 +342,7 @@ use_thunk (tree thunk_fndecl, bool emit_p) if (DECL_THUNK_P (function)) /* The target is itself a thunk, process it now. */ use_thunk (function, emit_p); - + /* Thunks are always addressable; they only appear in vtables. */ TREE_ADDRESSABLE (thunk_fndecl) = 1; @@ -370,7 +370,7 @@ use_thunk (tree thunk_fndecl, bool emit_p) } else virtual_value = 0; - + /* And, if we need to emit the thunk, it's used. */ mark_used (thunk_fndecl); /* This thunk is actually defined. */ @@ -379,7 +379,7 @@ use_thunk (tree thunk_fndecl, bool emit_p) rewrite. */ TREE_PUBLIC (thunk_fndecl) = TREE_PUBLIC (function); DECL_VISIBILITY (thunk_fndecl) = DECL_VISIBILITY (function); - DECL_VISIBILITY_SPECIFIED (thunk_fndecl) + DECL_VISIBILITY_SPECIFIED (thunk_fndecl) = DECL_VISIBILITY_SPECIFIED (function); if (flag_weak && TREE_PUBLIC (thunk_fndecl)) comdat_linkage (thunk_fndecl); @@ -423,7 +423,7 @@ use_thunk (tree thunk_fndecl, bool emit_p) a = nreverse (t); DECL_ARGUMENTS (thunk_fndecl) = a; BLOCK_VARS (DECL_INITIAL (thunk_fndecl)) = a; - + if (this_adjusting && targetm.asm_out.can_output_mi_thunk (thunk_fndecl, fixed_offset, virtual_value, alias)) @@ -468,7 +468,7 @@ use_thunk (tree thunk_fndecl, bool emit_p) if (this_adjusting) t = thunk_adjust (t, /*this_adjusting=*/1, fixed_offset, virtual_offset); - + /* Build up the call to the real function. */ t = tree_cons (NULL_TREE, t, NULL_TREE); for (a = TREE_CHAIN (a); a; a = TREE_CHAIN (a)) @@ -476,7 +476,7 @@ use_thunk (tree thunk_fndecl, bool emit_p) t = nreverse (t); t = build_call (alias, t); CALL_FROM_THUNK_P (t) = 1; - + if (VOID_TYPE_P (TREE_TYPE (t))) finish_expr_stmt (t); else @@ -494,7 +494,7 @@ use_thunk (tree thunk_fndecl, bool emit_p) t = save_expr (t); cond = cp_convert (boolean_type_node, t); } - + t = thunk_adjust (t, /*this_adjusting=*/0, fixed_offset, virtual_offset); if (cond) @@ -560,7 +560,7 @@ do_build_copy_constructor (tree fndecl) for (vbases = CLASSTYPE_VBASECLASSES (current_class_type), i = 0; VEC_iterate (tree, vbases, i, binfo); i++) { - member_init_list + member_init_list = tree_cons (binfo, build_tree_list (NULL_TREE, build_base_path (PLUS_EXPR, parm, @@ -572,9 +572,9 @@ do_build_copy_constructor (tree fndecl) BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) { if (BINFO_VIRTUAL_P (base_binfo)) - continue; + continue; - member_init_list + member_init_list = tree_cons (base_binfo, build_tree_list (NULL_TREE, build_base_path (PLUS_EXPR, parm, @@ -611,12 +611,12 @@ do_build_copy_constructor (tree fndecl) if (TREE_CODE (expr_type) != REFERENCE_TYPE) { int quals = cvquals; - + if (DECL_MUTABLE_P (field)) quals &= ~TYPE_QUAL_CONST; expr_type = cp_build_qualified_type (expr_type, quals); } - + init = build3 (COMPONENT_REF, expr_type, init, field, NULL_TREE); init = build_tree_list (NULL_TREE, init); @@ -661,18 +661,18 @@ do_build_assign_ref (tree fndecl) explicitly since the base class may be ambiguous. */ converted_parm = build_base_path (PLUS_EXPR, parm, base_binfo, 1); /* Call the base class assignment operator. */ - finish_expr_stmt - (build_special_member_call (current_class_ref, + finish_expr_stmt + (build_special_member_call (current_class_ref, ansi_assopname (NOP_EXPR), - build_tree_list (NULL_TREE, + build_tree_list (NULL_TREE, converted_parm), base_binfo, LOOKUP_NORMAL | LOOKUP_NONVIRTUAL)); } /* Assign to each of the non-static data members. */ - for (fields = TYPE_FIELDS (current_class_type); - fields; + for (fields = TYPE_FIELDS (current_class_type); + fields; fields = TREE_CHAIN (fields)) { tree comp = current_class_ref; @@ -685,7 +685,7 @@ do_build_assign_ref (tree fndecl) continue; expr_type = TREE_TYPE (field); - + if (CP_TYPE_CONST_P (expr_type)) { error ("non-static const member %q#D, can't use default " @@ -712,13 +712,13 @@ do_build_assign_ref (tree fndecl) continue; comp = build3 (COMPONENT_REF, expr_type, comp, field, NULL_TREE); - + /* Compute the type of init->field */ quals = cvquals; if (DECL_MUTABLE_P (field)) quals &= ~TYPE_QUAL_CONST; expr_type = cp_build_qualified_type (expr_type, quals); - + init = build3 (COMPONENT_REF, expr_type, init, field, NULL_TREE); if (DECL_NAME (field)) @@ -749,7 +749,7 @@ synthesize_method (tree fndecl) deferred, and thus have saved where we were first needed. */ DECL_SOURCE_LOCATION (fndecl) = DECL_SOURCE_LOCATION (TYPE_NAME (DECL_CONTEXT (fndecl))); - + /* If we've been asked to synthesize a clone, just synthesize the cloned function instead. Doing so will automatically fill in the body for the clone. */ @@ -832,7 +832,7 @@ synthesize_exception_spec (tree type, tree (*extractor) (tree, void*), if (fn) { tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn)); - + raises = merge_exception_specifiers (raises, fn_raises); } } @@ -840,19 +840,19 @@ synthesize_exception_spec (tree type, tree (*extractor) (tree, void*), { tree type = TREE_TYPE (fields); tree fn; - + if (TREE_CODE (fields) != FIELD_DECL || DECL_ARTIFICIAL (fields)) continue; while (TREE_CODE (type) == ARRAY_TYPE) type = TREE_TYPE (type); if (TREE_CODE (type) != RECORD_TYPE) continue; - + fn = (*extractor) (type, client); if (fn) { tree fn_raises = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (fn)); - + raises = merge_exception_specifiers (raises, fn_raises); } } @@ -873,7 +873,7 @@ static tree locate_ctor (tree type, void *client ATTRIBUTE_UNUSED) { tree fns; - + if (!TYPE_HAS_DEFAULT_CONSTRUCTOR (type)) return NULL_TREE; @@ -886,7 +886,7 @@ locate_ctor (tree type, void *client ATTRIBUTE_UNUSED) { tree fn = OVL_CURRENT (fns); tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn)); - + if (sufficient_parms_p (TREE_CHAIN (parms))) return fn; } @@ -910,7 +910,7 @@ locate_copy (tree type, void *client_) tree fns; tree best = NULL_TREE; bool excess_p = false; - + if (client->name) { int ix; @@ -936,7 +936,7 @@ locate_copy (tree type, void *client_) tree src_type; int excess; int quals; - + parms = TREE_CHAIN (parms); if (!parms) continue; @@ -1022,7 +1022,7 @@ implicitly_declare_fn (special_function_kind kind, tree type, bool const_p) case sfk_assignment_operator: { struct copy_data data; - + data.name = NULL; data.quals = 0; if (kind == sfk_assignment_operator) @@ -1121,7 +1121,7 @@ lazily_declare_fn (special_function_kind sfk, tree type) /* Add it to CLASSTYPE_METHOD_VEC. */ add_method (type, fn, NULL_TREE); /* Add it to TYPE_METHODS. */ - if (sfk == sfk_destructor + if (sfk == sfk_destructor && DECL_VIRTUAL_P (fn) && abi_version_at_least (2)) /* The ABI requires that a virtual destructor go at the end of the @@ -1131,7 +1131,7 @@ lazily_declare_fn (special_function_kind sfk, tree type) { /* G++ 3.2 put the implicit destructor at the *beginning* of the TYPE_METHODS list, which cause the destructor to be emitted - in an incorrect location in the vtable. */ + in an incorrect location in the vtable. */ if (warn_abi && DECL_VIRTUAL_P (fn)) warning (0, "vtable layout for class %qT may not be ABI-compliant" "and may change in a future version of GCC due to " |