parent
f82da7d270
commit
72b7eeff72
546
gcc/cp/ChangeLog
546
gcc/cp/ChangeLog
|
@ -1,3 +1,336 @@
|
||||||
|
Mon Dec 18 15:51:33 1995 Jason Merrill <jason@yorick.cygnus.com>
|
||||||
|
|
||||||
|
* cp-tree.h, decl2.c (flag_weak): New flag to control the use of
|
||||||
|
weak symbols.
|
||||||
|
* lang-options.h: Add -f{no-,}weak.
|
||||||
|
* decl.c (init_decl_processing): If the target does not support weak
|
||||||
|
symbols, don't use them.
|
||||||
|
* decl2.c, pt.c: s/SUPPORTS_WEAK/flag_weak/.
|
||||||
|
|
||||||
|
Sun Dec 17 21:13:23 1995 Rusty Russell <rusty@adelaide.maptek.com.au>
|
||||||
|
|
||||||
|
* init.c (expand_member_init): warning for base init after members.
|
||||||
|
|
||||||
|
Sun Dec 17 22:06:56 1995 Jeffrey A Law (law@cygnus.com)
|
||||||
|
|
||||||
|
* tree.c (tree_copy_lang_decl_for_deferred_output): Handle
|
||||||
|
CONST_DECLs correctly.
|
||||||
|
|
||||||
|
Fri Dec 15 15:32:18 1995 Jason Merrill <jason@yorick.cygnus.com>
|
||||||
|
|
||||||
|
* cvt.c (build_expr_type_conversion): Don't convert to a reference
|
||||||
|
type.
|
||||||
|
|
||||||
|
Thu Dec 14 16:05:58 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* method.c (report_type_mismatch): Improve wording for volatile
|
||||||
|
mismatches.
|
||||||
|
|
||||||
|
Thu Dec 14 14:16:26 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* init.c (expand_aggr_init_1): Use expand_aggr_init_1 instead of
|
||||||
|
expand_assignment, as the later doesn't handle things that have
|
||||||
|
copy constructors well. The compiler would do bitwise copying,
|
||||||
|
instead of ctor calling in some cases.
|
||||||
|
|
||||||
|
Wed Dec 13 17:05:54 PST 1995 Paul Eggert <eggert@twinsun.com>
|
||||||
|
|
||||||
|
* g++.c (my_strerror): Return "cannot access" if errno is 0.
|
||||||
|
(pfatal_with_name, perror_exec): Don't assume that
|
||||||
|
the returned value from my_strerror contains no '%'s.
|
||||||
|
(concat): Remove.
|
||||||
|
(sys_nerror): Declare only if HAVE_STRERROR is not defined.
|
||||||
|
|
||||||
|
Wed Dec 13 16:22:38 1995 Jason Merrill <jason@yorick.cygnus.com>
|
||||||
|
|
||||||
|
Lose CLASSTYPE_METHODS/DECL_NEXT_METHOD chain; make
|
||||||
|
TYPE_METHODS/TREE_CHAIN mean what they used to.
|
||||||
|
* decl2.c (constructor_name_full): Refer to CLASSTYPE_METHOD_VEC
|
||||||
|
instead of TYPE_METHODS.
|
||||||
|
* decl.c (duplicate_decls): Lose references to DECL_NEXT_METHOD.
|
||||||
|
* tree.c (tree_copy_lang_decl_for_deferred_output): Ditto.
|
||||||
|
* cp-tree.h (CLASSTYPE_METHODS): Lose.
|
||||||
|
(CLASSTYPE_METHOD_VEC): Point to lang_spec->methods instead of
|
||||||
|
TYPE_METHODS.
|
||||||
|
(struct lang_decl): Lose next_method field.
|
||||||
|
(DECL_NEXT_METHOD): Lose.
|
||||||
|
* class.c (finish_struct_methods): Don't mess with TYPE_METHODS.
|
||||||
|
(finish_struct): Just use TYPE_METHODS; we don't need fn_fields
|
||||||
|
anymore.
|
||||||
|
(finish_struct_methods): Don't mess with the TREE_CHAINs in
|
||||||
|
fn_fields.
|
||||||
|
|
||||||
|
* search.c (add_conversions): Don't use TREE_CHAIN to traverse method
|
||||||
|
vector.
|
||||||
|
|
||||||
|
* call.c (build_method_call): Synthesize here even when not inlining.
|
||||||
|
* typeck.c (build_function_call_real): Ditto.
|
||||||
|
|
||||||
|
Wed Dec 13 15:02:39 1995 Ian Lance Taylor <ian@cygnus.com>
|
||||||
|
|
||||||
|
* cp/lex.c (check_newline): If DBX_DEBUGGING_INFO and write_symbols
|
||||||
|
== DBX_DEBUG, call dbxout_start_new_source_file and
|
||||||
|
dbxout_resume_previous_source_file when appropriate.
|
||||||
|
|
||||||
|
Tue Dec 12 20:38:55 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* except.c (start_anon_func): Push to the top level.
|
||||||
|
(end_anon_func): Pop from the top level.
|
||||||
|
|
||||||
|
Mon Dec 11 18:56:14 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* cp-tree.h (build_cleanup): New routine to build cleanups.
|
||||||
|
* decl.c (expand_static_init): Use build_cleanup to build a cleanup
|
||||||
|
call at ctor time and use atexit to run it later.
|
||||||
|
* decl2.c (build_cleanup): New routine, taken from finish_file.
|
||||||
|
(finish_file): Use build_cleanup instead, and don't put function
|
||||||
|
local statics in global dtor list.
|
||||||
|
|
||||||
|
Wed Dec 6 14:34:29 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* except.c (expand_throw): Ensure that we have cleanups, if we try
|
||||||
|
and expand cleanups.
|
||||||
|
|
||||||
|
Wed Dec 6 11:48:21 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* except.c (expand_throw): Add logic to manage dynamic cleanups for
|
||||||
|
the EH object.
|
||||||
|
(expand_end_catch_block): Use the magic of expand_goto, instead of
|
||||||
|
emit_jump so that we get the cleanup for any catch clause parameter
|
||||||
|
and the cleanup for the exception object. Update to reflect label
|
||||||
|
changes.
|
||||||
|
(push_eh_cleanup): New routine to register a cleanup for an
|
||||||
|
exception object.
|
||||||
|
(empty_fndecl): Used to default cleanup actions to
|
||||||
|
nothing.
|
||||||
|
(init_exception_processing): Setup empty_fndecl. Setup
|
||||||
|
saved_cleanup.
|
||||||
|
(expand_start_catch_block): Update to reflect label changes. Call
|
||||||
|
push_eh_object to register the cleanup for the EH object.
|
||||||
|
(start_anon_func): New routine to start building lambda expressions
|
||||||
|
from trees.
|
||||||
|
(end_anon_func): New routine to end them.
|
||||||
|
(struct labelNode): Change so that we can use tree labels, or rtx
|
||||||
|
labels.
|
||||||
|
(saved_cleanup): Object to check for dynamic cleanups for the
|
||||||
|
exception handling object.
|
||||||
|
(push_label_entry): Change so that we can use tree labels, or rtx
|
||||||
|
labels.
|
||||||
|
(pop_label_entry): Ditto.
|
||||||
|
(top_label_entry): Ditto.
|
||||||
|
(expand_start_all_catch): Use tree label instead of rtx label, so
|
||||||
|
that we can get the magic of expand_goto.
|
||||||
|
(expand_end_all_catch): Update to reflect label changes.
|
||||||
|
|
||||||
|
* class.c (build_vfn_ref): Remove building_cleanup logic, as we now
|
||||||
|
use UNSAVE_EXPRs.
|
||||||
|
typeck.c (get_member_function_from_ptrfunc): Remove remnants of
|
||||||
|
building_cleanup logic, as we now use UNSAVE_EXPRs.
|
||||||
|
* cp-tree.h (unsave_expr): Declare it.
|
||||||
|
* decl.c (building_cleanup): Remove.
|
||||||
|
(maybe_build_cleanup): Remove building_cleanup logic, and use
|
||||||
|
UNSAVE_EXPR instead.
|
||||||
|
|
||||||
|
Sun Dec 3 01:34:58 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* gc.c (build_t_desc): Update error message to say <typeinfo>.
|
||||||
|
|
||||||
|
Thu Nov 30 12:30:05 1995 Brendan Kehoe <brendan@lisa.cygnus.com>
|
||||||
|
|
||||||
|
* decl.c (pushdecl): Only warn about shadowing a local variable if
|
||||||
|
warn_shadow is true.
|
||||||
|
|
||||||
|
Sun Nov 26 16:06:55 1995 Rusty Russell <rusty@adelaide.maptek.com.au>
|
||||||
|
|
||||||
|
* typeck.c (build_binary_op_nodefault): Added warning about
|
||||||
|
comparisons between different enum types with -Wall, unless
|
||||||
|
-fenum-int-equiv set.
|
||||||
|
|
||||||
|
Wed Nov 22 15:44:02 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* class.c (finish_struct_1): Skip down to the inner type in
|
||||||
|
multidimensional arrays. Ensures ctors will be made for types that
|
||||||
|
need constructing.
|
||||||
|
|
||||||
|
Wed Nov 22 14:19:22 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* decl.c (last_dtor_insn): New to track the last compiler generated
|
||||||
|
insn in a dtor.
|
||||||
|
(store_parm_decls): Set it.
|
||||||
|
(finish_function): Use it to see if the dtor is empty. Avoid doing
|
||||||
|
vtable setup all the time, if we can.
|
||||||
|
(struct cp_function): Add last_dtor_insn.
|
||||||
|
(push_cp_function_context): Save it.
|
||||||
|
(pop_cp_function_context): Restore it.
|
||||||
|
|
||||||
|
Wed Nov 22 11:52:19 1995 Paul Russell <Rusty.Russell@adelaide.maptek.com.au>
|
||||||
|
|
||||||
|
* typeck.c (build_unary_op): Set TREE_NO_UNUSED_WARNING to avoid
|
||||||
|
warnings.
|
||||||
|
|
||||||
|
Tue Nov 21 17:15:23 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* typeck.c (expand_target_expr): Make sure targets get put into the
|
||||||
|
current temp_slot_level, so that the free_temp_slots call will reuse
|
||||||
|
them.
|
||||||
|
|
||||||
|
Tue Nov 21 13:32:03 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* class.c (finish_struct_1): Delay delta fixups for virtual bases
|
||||||
|
until after we have done the hard virtuals, to avoid a bogus `every
|
||||||
|
virtual function must have a unique final overrider' for virtual
|
||||||
|
functions that are only overridden by hard virtuals.
|
||||||
|
|
||||||
|
Thu Nov 9 13:35:30 1995 Jason Merrill <jason@yorick.cygnus.com>
|
||||||
|
|
||||||
|
* pt.c (do_function_instantiation): Don't try to find a file-scope
|
||||||
|
template for a member function.
|
||||||
|
|
||||||
|
Tue Nov 14 06:20:35 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* g++.c (main): Add handling of -nodefaultlibs.
|
||||||
|
|
||||||
|
Mon Nov 13 15:45:34 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* cp-tree.h (INDIRECT_BIND): Add a way for the frontend to
|
||||||
|
distinguish between direct bindings of reference variables, and
|
||||||
|
indirect bindings of reference variables.
|
||||||
|
* cvt.c (build_up_reference): Use it.
|
||||||
|
* typeck.c (convert_arguments): Use it to indicate this is an
|
||||||
|
indirect binding.
|
||||||
|
* decl.c (cp_finish_decl): Ensure that we reuse stack slots as fast
|
||||||
|
as they are unused.
|
||||||
|
(expand_static_init): Diotto.
|
||||||
|
(cplus_expand_expr_stmt): Ditto.
|
||||||
|
* decl2.c (finish_file): Ditto.
|
||||||
|
* init.c (perform_member_init): Ditto.
|
||||||
|
(emit_base_init): Ditto.
|
||||||
|
(expand_aggr_vbase_init_1): Ditto.
|
||||||
|
|
||||||
|
Fri Nov 10 09:19:31 1995 Jeffrey A Law (law@cygnus.com)
|
||||||
|
|
||||||
|
* tree.c (tree_copy_lang_decl_for_deferred_output): Handle
|
||||||
|
copying of DECL_ARGUMENTS field.
|
||||||
|
(tree_copy_lang_type_for_deferred_output): Handle disgusting
|
||||||
|
re-use of TYPE_LANG_SPECIFIC for pointer to member function
|
||||||
|
type nodes.
|
||||||
|
|
||||||
|
Fri Nov 10 09:18:09 1995 Brendan Kehoe <brendan@lisa.cygnus.com>
|
||||||
|
|
||||||
|
* decl.c (push_namespace): Rewrite to use build_lang_decl, so we
|
||||||
|
get a DECL_LANG_SPECIFIC node.
|
||||||
|
* cp-tree.h (lang_decl_flags): Add new member `level'.
|
||||||
|
(NAMESPACE_LEVEL): Don't use decl.arguments, instead use the
|
||||||
|
decl_flags level member.
|
||||||
|
|
||||||
|
Mon Nov 6 18:36:13 1995 Brendan Kehoe <brendan@lisa.cygnus.com>
|
||||||
|
|
||||||
|
* call.c (build_method_call): Make sure instance has a
|
||||||
|
TYPE_LANG_SPECIFIC node before we dive into it.
|
||||||
|
|
||||||
|
Sat Nov 4 20:01:52 1995 Jason Molenda (crash@phydeaux.cygnus.com)
|
||||||
|
|
||||||
|
* method.c (make_thunk): use TREE_SET_CODE to set thunk's tree code.
|
||||||
|
|
||||||
|
Thu Nov 2 17:56:57 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* decl.c (duplicate_decls): When smashing decls, smash staticness in
|
||||||
|
the usual way.
|
||||||
|
|
||||||
|
Thu Nov 2 16:44:02 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* decl.c (poplevel): Handle the merging of subblocks of cleanups
|
||||||
|
when finishing blocks that have already been created (usually due to
|
||||||
|
the fixup goto code). Fixes bad debugging information.
|
||||||
|
|
||||||
|
Wed Nov 1 12:33:53 1995 Jason Merrill <jason@yorick.cygnus.com>
|
||||||
|
|
||||||
|
* method.c (hack_identifier): Don't abort when we get a TREE_LIST
|
||||||
|
that's not a list of overloaded functions.
|
||||||
|
|
||||||
|
Wed Nov 1 11:38:58 1995 Brendan Kehoe <brendan@lisa.cygnus.com>
|
||||||
|
|
||||||
|
* decl2.c (mark_vtable_entries): Check DECL_LANG_SPECIFIC on fn
|
||||||
|
before trying to use DECL_ABSTRACT_VIRTUAL_P.
|
||||||
|
|
||||||
|
Tue Oct 31 11:56:55 1995 Jason Merrill <jason@yorick.cygnus.com>
|
||||||
|
|
||||||
|
* decl2.c (mark_used): New function for hooking into setting of
|
||||||
|
TREE_USED on decls.
|
||||||
|
* call.c (build_method_call): Use it.
|
||||||
|
* class.c (instantiate_type): Ditto.
|
||||||
|
* init.c (build_offset_ref): Ditto. Don't call assemble_external
|
||||||
|
for all like-named functions.
|
||||||
|
* method.c (hack_identifier): Ditto.
|
||||||
|
(emit_thunk): Don't call assemble_external.
|
||||||
|
(make_thunk): Create thunk as a FUNCTION_DECL so that it
|
||||||
|
gets the right mode and ENCODE_SECTION_INFO works.
|
||||||
|
|
||||||
|
* parse.y: Use mark_used. Pass operator names to do_identifier.
|
||||||
|
* lex.c (do_identifier): Handle operator names.
|
||||||
|
|
||||||
|
* decl2.c (grokclassfn): Tweak __in_chrg attributes.
|
||||||
|
|
||||||
|
Thu Oct 26 20:58:59 1995 Jeffrey A Law (law@cygnus.com)
|
||||||
|
|
||||||
|
* cp/tree.c (tree_copy_lang_decl_for_deferred_output): Handle
|
||||||
|
FIELD_DECLs and VAR_DECLs correctly.
|
||||||
|
|
||||||
|
Thu Oct 26 16:45:58 1995 Brendan Kehoe <brendan@lisa.cygnus.com>
|
||||||
|
|
||||||
|
* errfn.c: Include stdio.h.
|
||||||
|
(cp_sprintf): Take out decl of sprintf, and cast sprintf to errorfn*.
|
||||||
|
|
||||||
|
Wed Oct 25 18:58:41 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* typeck2.c (digest_init): Always convert initializers to the
|
||||||
|
right type.
|
||||||
|
|
||||||
|
Wed Oct 25 13:25:24 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* init.c (member_init_ok_or_else): Don't allow member initializers
|
||||||
|
for indirect members, as it is invalid.
|
||||||
|
|
||||||
|
Wed Oct 25 11:35:28 1995 Brendan Kehoe <brendan@lisa.cygnus.com>
|
||||||
|
|
||||||
|
* decl.c (grokdeclarator): Don't allow `friend signed ()'.
|
||||||
|
|
||||||
|
Fri Oct 20 10:30:59 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* parse.y (for.init.statement): Catch compound statements inside for
|
||||||
|
initializations, if we're being pedantic.
|
||||||
|
|
||||||
|
Fri Oct 20 10:03:42 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* decl.c (lookup_tag): Return NULL_TREE if we don't find what we are
|
||||||
|
looking for.
|
||||||
|
|
||||||
|
Thu Oct 19 14:26:10 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* error.c (dump_expr): Don't core dump when a boolean expression is
|
||||||
|
used as a default argument.
|
||||||
|
|
||||||
|
Thu Oct 19 10:36:30 1995 Jason Merrill <jason@yorick.cygnus.com>
|
||||||
|
|
||||||
|
* class.c (finish_struct_bits): Check aggregate_value_p instead of
|
||||||
|
RETURN_IN_MEMORY.
|
||||||
|
|
||||||
|
Wed Oct 18 18:12:32 1995 Jason Merrill <jason@yorick.cygnus.com>
|
||||||
|
|
||||||
|
* class.c (finish_struct_bits): Also set TREE_ADDRESSABLE on a
|
||||||
|
BLKmode type that would otherwise be returned in registers.
|
||||||
|
|
||||||
|
Mon Oct 16 12:32:19 1995 Brendan Kehoe <brendan@lisa.cygnus.com>
|
||||||
|
|
||||||
|
* g++.c (WITHLIBC): New macro.
|
||||||
|
(main): Declare saw_libc. Use WITHLIBC if `-lc' was used; set
|
||||||
|
saw_libc and pass it at the end if it was set.
|
||||||
|
|
||||||
|
Wed Oct 11 16:30:34 1995 Brendan Kehoe <brendan@lisa.cygnus.com>
|
||||||
|
|
||||||
|
* parse.y (fn.def1): Call split_specs_attrs in
|
||||||
|
declmods notype_declarator case.
|
||||||
|
|
||||||
Mon Nov 20 14:06:28 1995 Mike Stump <mrs@cygnus.com>
|
Mon Nov 20 14:06:28 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
* Version 2.7.2 released.
|
* Version 2.7.2 released.
|
||||||
|
@ -811,10 +1144,6 @@ Wed Jul 5 14:05:04 1995 Brendan Kehoe <brendan@lisa.cygnus.com>
|
||||||
* typeck.c (comptypes, case OFFSET_REF): If either offset basetype
|
* typeck.c (comptypes, case OFFSET_REF): If either offset basetype
|
||||||
is a TEMPLATE_TYPE_PARM, give a match.
|
is a TEMPLATE_TYPE_PARM, give a match.
|
||||||
|
|
||||||
Mon Jul 3 15:17:20 1995 Steve Chamberlain <sac@slash.cygnus.com>
|
|
||||||
|
|
||||||
* g++.c (sys/file.h): Remove change of Jun 28.
|
|
||||||
|
|
||||||
Fri Jun 30 15:42:57 1995 Mike Stump <mrs@cygnus.com>
|
Fri Jun 30 15:42:57 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
* method.c (build_overload_value): Handle encoding of null pointer
|
* method.c (build_overload_value): Handle encoding of null pointer
|
||||||
|
@ -862,12 +1191,6 @@ Thu Jun 29 03:43:55 1995 Jason Merrill <jason@phydeaux.cygnus.com>
|
||||||
* decl.c (revert_static_member_fn): But only if DECL_ARGUMENTS is
|
* decl.c (revert_static_member_fn): But only if DECL_ARGUMENTS is
|
||||||
set.
|
set.
|
||||||
|
|
||||||
Wed Jun 28 23:34:58 1995 Steve Chamberlain <sac@slash.cygnus.com>
|
|
||||||
|
|
||||||
* g++.c (pfatal_with_name): Use my_strerror to get error
|
|
||||||
string.
|
|
||||||
(sys/file.h): Include if HAVE_FILE_H defined.
|
|
||||||
|
|
||||||
Wed Jun 28 18:39:03 1995 Jason Merrill <jason@phydeaux.cygnus.com>
|
Wed Jun 28 18:39:03 1995 Jason Merrill <jason@phydeaux.cygnus.com>
|
||||||
|
|
||||||
* decl.c (revert_static_member_fn): Also remove 'this' from
|
* decl.c (revert_static_member_fn): Also remove 'this' from
|
||||||
|
@ -985,14 +1308,8 @@ Fri Jun 16 13:20:38 1995 Mike Stump <mrs@cygnus.com>
|
||||||
* decl.c (get_unique_name): New routine to name unnamed namespaces.
|
* decl.c (get_unique_name): New routine to name unnamed namespaces.
|
||||||
(push_namespace): Use get_unique_name for naming unnamed namespaces.
|
(push_namespace): Use get_unique_name for naming unnamed namespaces.
|
||||||
|
|
||||||
Fri Jun 16 15:07:29 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
|
|
||||||
|
|
||||||
* Make-lang.in (DEMANGLER_PROG): Add LIBS.
|
|
||||||
|
|
||||||
Thu Jun 15 15:00:41 1995 Jason Merrill <jason@phydeaux.cygnus.com>
|
Thu Jun 15 15:00:41 1995 Jason Merrill <jason@phydeaux.cygnus.com>
|
||||||
|
|
||||||
* decl.c (define_function): Don't set DECL_INTERFACE_KNOWN.
|
|
||||||
|
|
||||||
* parse.y: Call cplus_decl_attributes with prefix_attributes where
|
* parse.y: Call cplus_decl_attributes with prefix_attributes where
|
||||||
appropriate.
|
appropriate.
|
||||||
|
|
||||||
|
@ -1037,23 +1354,6 @@ Thu Jun 8 15:44:38 1995 Jason Merrill <jason@phydeaux.cygnus.com>
|
||||||
* gc.c (build_dynamic_cast): Build up a reference to a parameter of
|
* gc.c (build_dynamic_cast): Build up a reference to a parameter of
|
||||||
aggregate type.
|
aggregate type.
|
||||||
|
|
||||||
Wed Jun 7 20:00:31 1995 Mike Stump <mrs@cygnus.com>
|
|
||||||
|
|
||||||
* *.[chy]: Change all callers of finish_decl to cp_finish_decl.
|
|
||||||
* decl.c (finish_decl): New routine to handle call backs from the
|
|
||||||
mid end (declare_hidden_char_array).
|
|
||||||
|
|
||||||
Wed Jun 7 19:02:50 1995 Jason Merrill <jason@phydeaux.cygnus.com>
|
|
||||||
|
|
||||||
* decl.c (start_function): Handle setting C_C_D here.
|
|
||||||
(set_C_C_D): Removed.
|
|
||||||
(struct saved_scope): Remove class_decl.
|
|
||||||
(push_to_top_level): Don't save current_class_decl.
|
|
||||||
(pop_from_top_level): Don't restore current_class_decl or C_C_D.
|
|
||||||
(struct cp_function): Add C_C_D.
|
|
||||||
(push_cp_function_context): Save C_C_D.
|
|
||||||
(pop_cp_function_context): Restore C_C_D.
|
|
||||||
|
|
||||||
Wed Jun 7 15:31:57 1995 Brendan Kehoe (brendan@lisa.cygnus.com)
|
Wed Jun 7 15:31:57 1995 Brendan Kehoe (brendan@lisa.cygnus.com)
|
||||||
|
|
||||||
* init.c (build_vec_delete): Resolve an offset ref before we try to
|
* init.c (build_vec_delete): Resolve an offset ref before we try to
|
||||||
|
@ -1155,29 +1455,6 @@ Mon Jun 5 11:20:34 1995 Gerald Baumgartner (gb@alexander.cs.purdue.edu)
|
||||||
to tag and delta, respectively.
|
to tag and delta, respectively.
|
||||||
(build_signature_method_call): Ditto. Use above variables.
|
(build_signature_method_call): Ditto. Use above variables.
|
||||||
|
|
||||||
Fri Jun 2 11:05:58 1995 Jason Merrill <jason@phydeaux.cygnus.com>
|
|
||||||
|
|
||||||
* decl.c (set_C_C_D): New function. suspend_momentary before
|
|
||||||
building C_C_D.
|
|
||||||
(pop_from_top_level): Call it.
|
|
||||||
(start_function): Ditto.
|
|
||||||
(pop_cp_function_context): Ditto.
|
|
||||||
|
|
||||||
* class.c, cp-tree.h, decl.c, decl2.c, parse.y: Lose all references
|
|
||||||
to current_vtable_decl, CLASSTYPE_INST_VAR and CLASSTYPE_VTBL_PTR.
|
|
||||||
|
|
||||||
* decl.c (push_cp_function_context): Save current_class_decl.
|
|
||||||
(pop_cp_function_context): Restore current_class_decl and set C_C_D.
|
|
||||||
(pop_from_top_level): Don't use CLASSTYPE_INST_VAR to set C_C_D.
|
|
||||||
(start_function): Ditto.
|
|
||||||
|
|
||||||
* class.c (popclass): Don't mess with current_class_decl,
|
|
||||||
current_vtable_decl, or C_C_D.
|
|
||||||
|
|
||||||
Mon May 29 12:45:10 1995 Paul Eggert <eggert@twinsun.com>
|
|
||||||
|
|
||||||
* Make-lang.in (c++.mostlyclean): Remove $(DEMANGLER_PROG).
|
|
||||||
|
|
||||||
Thu Jun 1 17:03:51 1995 Jason Merrill <jason@phydeaux.cygnus.com>
|
Thu Jun 1 17:03:51 1995 Jason Merrill <jason@phydeaux.cygnus.com>
|
||||||
|
|
||||||
* decl.c (lookup_name_real): Don't try to look anything up in an
|
* decl.c (lookup_name_real): Don't try to look anything up in an
|
||||||
|
@ -1209,6 +1486,58 @@ Wed May 31 11:39:43 1995 Jason Merrill <jason@phydeaux.cygnus.com>
|
||||||
reference type.
|
reference type.
|
||||||
(build_indirect_ref): Fix check for *&.
|
(build_indirect_ref): Fix check for *&.
|
||||||
|
|
||||||
|
Fri Jun 16 06:54:03 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* Version 2.7.0 released.
|
||||||
|
|
||||||
|
Fri Jun 16 15:07:29 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
|
||||||
|
|
||||||
|
* Make-lang.in (DEMANGLER_PROG): Add LIBS.
|
||||||
|
|
||||||
|
Thu Jun 15 15:00:41 1995 Jason Merrill <jason@phydeaux.cygnus.com>
|
||||||
|
|
||||||
|
* decl.c (define_function): Don't set DECL_INTERFACE_KNOWN.
|
||||||
|
|
||||||
|
Wed Jun 7 20:00:31 1995 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* *.[chy]: Change all callers of finish_decl to cp_finish_decl.
|
||||||
|
* decl.c (finish_decl): New routine to handle call backs from the
|
||||||
|
mid end (declare_hidden_char_array).
|
||||||
|
|
||||||
|
Wed Jun 7 19:02:50 1995 Jason Merrill <jason@phydeaux.cygnus.com>
|
||||||
|
|
||||||
|
* decl.c (start_function): Handle setting C_C_D here.
|
||||||
|
(set_C_C_D): Removed.
|
||||||
|
(struct saved_scope): Remove class_decl.
|
||||||
|
(push_to_top_level): Don't save current_class_decl.
|
||||||
|
(pop_from_top_level): Don't restore current_class_decl or C_C_D.
|
||||||
|
(struct cp_function): Add C_C_D.
|
||||||
|
(push_cp_function_context): Save C_C_D.
|
||||||
|
(pop_cp_function_context): Restore C_C_D.
|
||||||
|
|
||||||
|
Fri Jun 2 11:05:58 1995 Jason Merrill <jason@phydeaux.cygnus.com>
|
||||||
|
|
||||||
|
* decl.c (set_C_C_D): New function. suspend_momentary before
|
||||||
|
building C_C_D.
|
||||||
|
(pop_from_top_level): Call it.
|
||||||
|
(start_function): Ditto.
|
||||||
|
(pop_cp_function_context): Ditto.
|
||||||
|
|
||||||
|
* class.c, cp-tree.h, decl.c, decl2.c, parse.y: Lose all references
|
||||||
|
to current_vtable_decl, CLASSTYPE_INST_VAR and CLASSTYPE_VTBL_PTR.
|
||||||
|
|
||||||
|
* decl.c (push_cp_function_context): Save current_class_decl.
|
||||||
|
(pop_cp_function_context): Restore current_class_decl and set C_C_D.
|
||||||
|
(pop_from_top_level): Don't use CLASSTYPE_INST_VAR to set C_C_D.
|
||||||
|
(start_function): Ditto.
|
||||||
|
|
||||||
|
* class.c (popclass): Don't mess with current_class_decl,
|
||||||
|
current_vtable_decl, or C_C_D.
|
||||||
|
|
||||||
|
Mon May 29 12:45:10 1995 Paul Eggert <eggert@twinsun.com>
|
||||||
|
|
||||||
|
* Make-lang.in (c++.mostlyclean): Remove $(DEMANGLER_PROG).
|
||||||
|
|
||||||
Wed May 24 15:55:18 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
|
Wed May 24 15:55:18 1995 Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
|
||||||
|
|
||||||
* decl.c (duplicate_decls): Check simple_cst_equal result against 0.
|
* decl.c (duplicate_decls): Check simple_cst_equal result against 0.
|
||||||
|
@ -3366,11 +3695,6 @@ Mon Jan 9 18:16:23 1995 Jason Merrill <jason@phydeaux.cygnus.com>
|
||||||
(pushdecl): Set the nested typename if the decl doesn't have one,
|
(pushdecl): Set the nested typename if the decl doesn't have one,
|
||||||
rather than if the type's canonical decl doesn't have one.
|
rather than if the type's canonical decl doesn't have one.
|
||||||
|
|
||||||
Mon Jan 9 16:48:16 1995 Steve Chamberlain (sac@jonny.cygnus.com)
|
|
||||||
|
|
||||||
* typeck.c (pointer_int_sum): Use offset size when calculating
|
|
||||||
index expression.
|
|
||||||
|
|
||||||
Mon Jan 9 03:44:33 1995 Jason Merrill <jason@phydeaux.cygnus.com>
|
Mon Jan 9 03:44:33 1995 Jason Merrill <jason@phydeaux.cygnus.com>
|
||||||
|
|
||||||
* typeck.c (convert_for_assignment): Complain about contravariance
|
* typeck.c (convert_for_assignment): Complain about contravariance
|
||||||
|
@ -3778,11 +4102,6 @@ Thu Nov 17 20:11:24 1994 Doug Evans <dje@cygnus.com>
|
||||||
(c++.install-man): Use program_transform_name on g++.1.
|
(c++.install-man): Use program_transform_name on g++.1.
|
||||||
(c++.uninstall): Likewise.
|
(c++.uninstall): Likewise.
|
||||||
|
|
||||||
Thu Nov 3 18:48:19 1994 Paul Eggert <eggert@twinsun.com>
|
|
||||||
|
|
||||||
* Makefile.in (spew.o, lex.o, pt.o):
|
|
||||||
Depend on $(srcdir)/parse.h, not parse.h.
|
|
||||||
|
|
||||||
Mon Nov 28 13:53:03 1994 Mike Stump <mrs@cygnus.com>
|
Mon Nov 28 13:53:03 1994 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
* parse.y (THROW): Fix precedence of throw expressions.
|
* parse.y (THROW): Fix precedence of throw expressions.
|
||||||
|
@ -3833,43 +4152,6 @@ Thu Nov 17 15:30:50 1994 Mike Stump <mrs@cygnus.com>
|
||||||
to add support for explicit, namespace, typename, and using, support
|
to add support for explicit, namespace, typename, and using, support
|
||||||
for the rest is already in.
|
for the rest is already in.
|
||||||
|
|
||||||
Thu Nov 17 10:56:50 1994 Jason Merrill <jason@phydeaux.cygnus.com>
|
|
||||||
|
|
||||||
* typeck2.c (build_m_component_ref): Check the basetype of the
|
|
||||||
member pointer against the main variant of the object type.
|
|
||||||
|
|
||||||
Mon Nov 14 14:21:52 1994 Jason Merrill <jason@phydeaux.cygnus.com>
|
|
||||||
|
|
||||||
* cvt.c (convert_to_reference): Make sure that the original expr
|
|
||||||
gets its type back when converting a reference.
|
|
||||||
|
|
||||||
* method.c (build_overload_name): Clear numeric_outputed_need_bar here.
|
|
||||||
(build_decl_overload): Instead of here.
|
|
||||||
|
|
||||||
Tue Nov 8 17:11:24 1994 Jason Merrill <jason@phydeaux.cygnus.com>
|
|
||||||
|
|
||||||
* cvt.c (cp_convert): Don't build a TARGET_EXPR if we're not in a
|
|
||||||
function.
|
|
||||||
|
|
||||||
* typeck.c (convert_for_initialization): Handle initialization from
|
|
||||||
a TARGET_EXPR.
|
|
||||||
|
|
||||||
Sun Nov 6 01:34:24 1994 Jason Merrill (jason@phydeaux.cygnus.com)
|
|
||||||
|
|
||||||
* pt.c (lookup_nested_type_by_name): Fix list-walking logic.
|
|
||||||
(tsubst): When replacing a TEMPLATE_TYPE_PARM, propagate
|
|
||||||
TYPE_READONLY and TYPE_VOLATILE from the argument.
|
|
||||||
(unify): When unifying with a TEMPLATE_TYPE_PARM, remove cv-quals
|
|
||||||
present in parm from arg.
|
|
||||||
(type_unification): Strip REFERENCE_TYPE from the argument type.
|
|
||||||
(unify): Don't strip REFERENCE_TYPE from the argument type.
|
|
||||||
|
|
||||||
Sat Nov 5 22:42:15 1994 Greg McGary (gkm@magilla.cichlid.com)
|
|
||||||
|
|
||||||
* pt.c (do_type_instantiation): Check to see if there's a
|
|
||||||
IDENTIFIER_TEMPLATE on a class before calling
|
|
||||||
instantiate_member_templates().
|
|
||||||
|
|
||||||
Fri Nov 4 19:04:18 1994 Mike Stump <mrs@cygnus.com>
|
Fri Nov 4 19:04:18 1994 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
* gc.c (get_bad_cast_node): New routine to support compile time
|
* gc.c (get_bad_cast_node): New routine to support compile time
|
||||||
|
@ -3964,6 +4246,60 @@ Tue Oct 25 13:37:41 1994 Jason Merrill (jason@phydeaux.cygnus.com)
|
||||||
* call.c (convert_harshness): Check for TREE_UNSIGNED differences
|
* call.c (convert_harshness): Check for TREE_UNSIGNED differences
|
||||||
after checking for integral conversions.
|
after checking for integral conversions.
|
||||||
|
|
||||||
|
Wed Nov 30 19:13:50 1994 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* Version 2.6.3 released.
|
||||||
|
|
||||||
|
Thu Nov 17 10:56:50 1994 Jason Merrill <jason@phydeaux.cygnus.com>
|
||||||
|
|
||||||
|
* typeck2.c (build_m_component_ref): Check the basetype of the
|
||||||
|
member pointer against the main variant of the object type.
|
||||||
|
|
||||||
|
Mon Nov 14 14:21:52 1994 Jason Merrill <jason@phydeaux.cygnus.com>
|
||||||
|
|
||||||
|
* cvt.c (convert_to_reference): Make sure that the original expr
|
||||||
|
gets its type back when converting a reference.
|
||||||
|
|
||||||
|
* method.c (build_overload_name): Clear numeric_outputed_need_bar here.
|
||||||
|
(build_decl_overload): Instead of here.
|
||||||
|
|
||||||
|
Tue Nov 8 17:11:24 1994 Jason Merrill <jason@phydeaux.cygnus.com>
|
||||||
|
|
||||||
|
* cvt.c (cp_convert): Don't build a TARGET_EXPR if we're not in a
|
||||||
|
function.
|
||||||
|
|
||||||
|
* typeck.c (convert_for_initialization): Handle initialization from
|
||||||
|
a TARGET_EXPR.
|
||||||
|
|
||||||
|
Sun Nov 6 01:34:24 1994 Jason Merrill (jason@phydeaux.cygnus.com)
|
||||||
|
|
||||||
|
* pt.c (lookup_nested_type_by_name): Fix list-walking logic.
|
||||||
|
(tsubst): When replacing a TEMPLATE_TYPE_PARM, propagate
|
||||||
|
TYPE_READONLY and TYPE_VOLATILE from the argument.
|
||||||
|
(unify): When unifying with a TEMPLATE_TYPE_PARM, remove cv-quals
|
||||||
|
present in parm from arg.
|
||||||
|
(type_unification): Strip REFERENCE_TYPE from the argument type.
|
||||||
|
(unify): Don't strip REFERENCE_TYPE from the argument type.
|
||||||
|
|
||||||
|
Sat Nov 5 22:42:15 1994 Greg McGary (gkm@magilla.cichlid.com)
|
||||||
|
|
||||||
|
* pt.c (do_type_instantiation): Check to see if there's a
|
||||||
|
IDENTIFIER_TEMPLATE on a class before calling
|
||||||
|
instantiate_member_templates().
|
||||||
|
|
||||||
|
Sat Nov 12 06:35:42 1994 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* Version 2.6.2 released.
|
||||||
|
|
||||||
|
Thu Nov 3 18:48:19 1994 Paul Eggert <eggert@twinsun.com>
|
||||||
|
|
||||||
|
* Makefile.in (spew.o, lex.o, pt.o):
|
||||||
|
Depend on $(srcdir)/parse.h, not parse.h.
|
||||||
|
|
||||||
|
Tue Nov 1 19:19:41 1994 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* Version 2.6.1 released.
|
||||||
|
|
||||||
Sun Oct 23 13:19:55 1994 Jason Merrill (jason@phydeaux.cygnus.com)
|
Sun Oct 23 13:19:55 1994 Jason Merrill (jason@phydeaux.cygnus.com)
|
||||||
|
|
||||||
* decl2.c: Declare flag_access_control.
|
* decl2.c: Declare flag_access_control.
|
||||||
|
@ -4946,6 +5282,10 @@ Tue Jul 19 17:55:37 1994 Jason Merrill (jason@deneb.cygnus.com)
|
||||||
* call.c (build_method_call): Accept using a typedef name (or
|
* call.c (build_method_call): Accept using a typedef name (or
|
||||||
template type parameter) for explicit destructor calls.
|
template type parameter) for explicit destructor calls.
|
||||||
|
|
||||||
|
Thu Jul 14 09:42:23 1994 Mike Stump <mrs@cygnus.com>
|
||||||
|
|
||||||
|
* Version 2.6.0 released.
|
||||||
|
|
||||||
Wed Jul 13 03:57:54 1994 Jason Merrill (jason@deneb.cygnus.com)
|
Wed Jul 13 03:57:54 1994 Jason Merrill (jason@deneb.cygnus.com)
|
||||||
|
|
||||||
* method.c (hack_identifier): Put back old code so lists of
|
* method.c (hack_identifier): Put back old code so lists of
|
||||||
|
|
|
@ -1658,6 +1658,7 @@ build_method_call (instance, name, parms, basetype_path, flags)
|
||||||
}
|
}
|
||||||
/* We already know whether it's needed or not for vec delete. */
|
/* We already know whether it's needed or not for vec delete. */
|
||||||
else if (name == ansi_opname[(int) VEC_DELETE_EXPR]
|
else if (name == ansi_opname[(int) VEC_DELETE_EXPR]
|
||||||
|
&& TYPE_LANG_SPECIFIC (TREE_TYPE (instance))
|
||||||
&& ! TYPE_VEC_DELETE_TAKES_SIZE (TREE_TYPE (instance)))
|
&& ! TYPE_VEC_DELETE_TAKES_SIZE (TREE_TYPE (instance)))
|
||||||
TREE_CHAIN (parms) = NULL_TREE;
|
TREE_CHAIN (parms) = NULL_TREE;
|
||||||
|
|
||||||
|
@ -2464,17 +2465,13 @@ build_method_call (instance, name, parms, basetype_path, flags)
|
||||||
return build_signature_method_call (basetype, instance, function, parms);
|
return build_signature_method_call (basetype, instance, function, parms);
|
||||||
|
|
||||||
function = DECL_MAIN_VARIANT (function);
|
function = DECL_MAIN_VARIANT (function);
|
||||||
/* Declare external function if necessary. */
|
mark_used (function);
|
||||||
assemble_external (function);
|
|
||||||
|
|
||||||
#if 1
|
|
||||||
/* Is it a synthesized method that needs to be synthesized? */
|
/* Is it a synthesized method that needs to be synthesized? */
|
||||||
if (DECL_ARTIFICIAL (function) && ! flag_no_inline
|
if (DECL_ARTIFICIAL (function) && ! DECL_INITIAL (function)
|
||||||
&& ! DECL_INITIAL (function)
|
|
||||||
/* Kludge: don't synthesize for default args. */
|
/* Kludge: don't synthesize for default args. */
|
||||||
&& current_function_decl)
|
&& current_function_decl)
|
||||||
synthesize_method (function);
|
synthesize_method (function);
|
||||||
#endif
|
|
||||||
|
|
||||||
if (pedantic && DECL_THIS_INLINE (function) && ! DECL_ARTIFICIAL (function)
|
if (pedantic && DECL_THIS_INLINE (function) && ! DECL_ARTIFICIAL (function)
|
||||||
&& ! DECL_INITIAL (function) && ! DECL_PENDING_INLINE_INFO (function))
|
&& ! DECL_INITIAL (function) && ! DECL_PENDING_INLINE_INFO (function))
|
||||||
|
@ -2670,7 +2667,6 @@ build_method_call (instance, name, parms, basetype_path, flags)
|
||||||
if (TREE_CODE (function) == FUNCTION_DECL)
|
if (TREE_CODE (function) == FUNCTION_DECL)
|
||||||
{
|
{
|
||||||
is_constructor = DECL_CONSTRUCTOR_P (function);
|
is_constructor = DECL_CONSTRUCTOR_P (function);
|
||||||
TREE_USED (function) = 1;
|
|
||||||
function = default_conversion (function);
|
function = default_conversion (function);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
107
gcc/cp/class.c
107
gcc/cp/class.c
|
@ -424,7 +424,6 @@ build_vfn_ref (ptr_to_instptr, instance, idx)
|
||||||
tree *ptr_to_instptr, instance;
|
tree *ptr_to_instptr, instance;
|
||||||
tree idx;
|
tree idx;
|
||||||
{
|
{
|
||||||
extern int building_cleanup;
|
|
||||||
tree vtbl, aref;
|
tree vtbl, aref;
|
||||||
tree basetype = TREE_TYPE (instance);
|
tree basetype = TREE_TYPE (instance);
|
||||||
|
|
||||||
|
@ -481,7 +480,7 @@ build_vfn_ref (ptr_to_instptr, instance, idx)
|
||||||
|
|
||||||
/* Save the intermediate result in a SAVE_EXPR so we don't have to
|
/* Save the intermediate result in a SAVE_EXPR so we don't have to
|
||||||
compute each component of the virtual function pointer twice. */
|
compute each component of the virtual function pointer twice. */
|
||||||
if (!building_cleanup && TREE_CODE (aref) == INDIRECT_REF)
|
if (TREE_CODE (aref) == INDIRECT_REF)
|
||||||
TREE_OPERAND (aref, 0) = save_expr (TREE_OPERAND (aref, 0));
|
TREE_OPERAND (aref, 0) = save_expr (TREE_OPERAND (aref, 0));
|
||||||
|
|
||||||
if (flag_vtable_thunks)
|
if (flag_vtable_thunks)
|
||||||
|
@ -1720,8 +1719,14 @@ finish_struct_bits (t, max_has_virtual)
|
||||||
/* If this type has a copy constructor, force its mode to be BLKmode, and
|
/* If this type has a copy constructor, force its mode to be BLKmode, and
|
||||||
force its TREE_ADDRESSABLE bit to be nonzero. This will cause it to
|
force its TREE_ADDRESSABLE bit to be nonzero. This will cause it to
|
||||||
be passed by invisible reference and prevent it from being returned in
|
be passed by invisible reference and prevent it from being returned in
|
||||||
a register. */
|
a register.
|
||||||
if (! TYPE_HAS_TRIVIAL_INIT_REF (t))
|
|
||||||
|
Also do this if the class has BLKmode but can still be returned in
|
||||||
|
registers, since function_cannot_inline_p won't let us inline
|
||||||
|
functions returning such a type. This affects the HP-PA. */
|
||||||
|
if (! TYPE_HAS_TRIVIAL_INIT_REF (t)
|
||||||
|
|| (TYPE_MODE (t) == BLKmode && ! aggregate_value_p (t)
|
||||||
|
&& CLASSTYPE_NON_AGGREGATE (t)))
|
||||||
{
|
{
|
||||||
tree variants;
|
tree variants;
|
||||||
if (TREE_CODE (TYPE_NAME (t)) == TYPE_DECL)
|
if (TREE_CODE (TYPE_NAME (t)) == TYPE_DECL)
|
||||||
|
@ -1812,15 +1817,14 @@ grow_method (fn, method_vec_ptr)
|
||||||
us to reduce search time in places like `build_method_call' to
|
us to reduce search time in places like `build_method_call' to
|
||||||
consider only reasonably likely functions. */
|
consider only reasonably likely functions. */
|
||||||
|
|
||||||
static tree
|
tree
|
||||||
finish_struct_methods (t, fn_fields, nonprivate_method)
|
finish_struct_methods (t, fn_fields, nonprivate_method)
|
||||||
tree t;
|
tree t;
|
||||||
tree fn_fields;
|
tree fn_fields;
|
||||||
int nonprivate_method;
|
int nonprivate_method;
|
||||||
{
|
{
|
||||||
tree method_vec;
|
tree method_vec;
|
||||||
tree save_fn_fields = tree_cons (NULL_TREE, NULL_TREE, fn_fields);
|
tree save_fn_fields = fn_fields;
|
||||||
tree lastp;
|
|
||||||
tree name = constructor_name (t);
|
tree name = constructor_name (t);
|
||||||
int i, n_baseclasses = CLASSTYPE_N_BASECLASSES (t);
|
int i, n_baseclasses = CLASSTYPE_N_BASECLASSES (t);
|
||||||
|
|
||||||
|
@ -1837,7 +1841,7 @@ finish_struct_methods (t, fn_fields, nonprivate_method)
|
||||||
/* First fill in entry 0 with the constructors, and the next few with
|
/* First fill in entry 0 with the constructors, and the next few with
|
||||||
type conversion operators (if any). */
|
type conversion operators (if any). */
|
||||||
|
|
||||||
for (lastp = save_fn_fields; fn_fields; fn_fields = TREE_CHAIN (lastp))
|
for (; fn_fields; fn_fields = TREE_CHAIN (fn_fields))
|
||||||
{
|
{
|
||||||
tree fn_name = DECL_NAME (fn_fields);
|
tree fn_name = DECL_NAME (fn_fields);
|
||||||
if (fn_name == NULL_TREE)
|
if (fn_name == NULL_TREE)
|
||||||
|
@ -1887,26 +1891,17 @@ finish_struct_methods (t, fn_fields, nonprivate_method)
|
||||||
|
|
||||||
grow_method (fn_fields, &method_vec);
|
grow_method (fn_fields, &method_vec);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
lastp = fn_fields;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TREE_CHAIN (lastp) = TREE_CHAIN (fn_fields);
|
|
||||||
TREE_CHAIN (fn_fields) = NULL_TREE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn_fields = TREE_CHAIN (save_fn_fields);
|
fn_fields = save_fn_fields;
|
||||||
while (fn_fields)
|
for (; fn_fields; fn_fields = TREE_CHAIN (fn_fields))
|
||||||
{
|
{
|
||||||
tree nextp;
|
|
||||||
tree fn_name = DECL_NAME (fn_fields);
|
tree fn_name = DECL_NAME (fn_fields);
|
||||||
if (fn_name == NULL_TREE)
|
if (fn_name == NULL_TREE)
|
||||||
fn_name = name;
|
fn_name = name;
|
||||||
|
|
||||||
nextp = TREE_CHAIN (fn_fields);
|
if (fn_name == name || IDENTIFIER_TYPENAME_P (fn_name))
|
||||||
TREE_CHAIN (fn_fields) = NULL_TREE;
|
continue;
|
||||||
|
|
||||||
if (fn_name == ansi_opname[(int) MODIFY_EXPR])
|
if (fn_name == ansi_opname[(int) MODIFY_EXPR])
|
||||||
{
|
{
|
||||||
|
@ -1922,7 +1917,6 @@ finish_struct_methods (t, fn_fields, nonprivate_method)
|
||||||
}
|
}
|
||||||
|
|
||||||
grow_method (fn_fields, &method_vec);
|
grow_method (fn_fields, &method_vec);
|
||||||
fn_fields = nextp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TREE_VEC_LENGTH (method_vec) = (tree *)obstack_next_free (&class_obstack)
|
TREE_VEC_LENGTH (method_vec) = (tree *)obstack_next_free (&class_obstack)
|
||||||
|
@ -2005,6 +1999,7 @@ finish_struct_methods (t, fn_fields, nonprivate_method)
|
||||||
obstack_free (current_obstack, baselink_vec);
|
obstack_free (current_obstack, baselink_vec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
/* Now add the methods to the TYPE_METHODS of T, arranged in a chain. */
|
/* Now add the methods to the TYPE_METHODS of T, arranged in a chain. */
|
||||||
{
|
{
|
||||||
tree x, last_x = NULL_TREE;
|
tree x, last_x = NULL_TREE;
|
||||||
|
@ -2040,6 +2035,7 @@ finish_struct_methods (t, fn_fields, nonprivate_method)
|
||||||
}
|
}
|
||||||
|
|
||||||
TYPE_METHODS (t) = method_vec;
|
TYPE_METHODS (t) = method_vec;
|
||||||
|
#endif
|
||||||
|
|
||||||
return method_vec;
|
return method_vec;
|
||||||
}
|
}
|
||||||
|
@ -2765,7 +2761,7 @@ finish_struct_1 (t, warn_anon)
|
||||||
tree name = TYPE_IDENTIFIER (t);
|
tree name = TYPE_IDENTIFIER (t);
|
||||||
enum tree_code code = TREE_CODE (t);
|
enum tree_code code = TREE_CODE (t);
|
||||||
tree fields = TYPE_FIELDS (t);
|
tree fields = TYPE_FIELDS (t);
|
||||||
tree fn_fields = CLASSTYPE_METHODS (t);
|
tree fn_fields = TYPE_METHODS (t);
|
||||||
tree x, last_x, method_vec;
|
tree x, last_x, method_vec;
|
||||||
int needs_virtual_dtor;
|
int needs_virtual_dtor;
|
||||||
int all_virtual;
|
int all_virtual;
|
||||||
|
@ -2920,7 +2916,7 @@ finish_struct_1 (t, warn_anon)
|
||||||
else
|
else
|
||||||
all_virtual = 0;
|
all_virtual = 0;
|
||||||
|
|
||||||
for (x = CLASSTYPE_METHODS (t); x; x = TREE_CHAIN (x))
|
for (x = TYPE_METHODS (t); x; x = TREE_CHAIN (x))
|
||||||
{
|
{
|
||||||
GNU_xref_member (current_class_name, x);
|
GNU_xref_member (current_class_name, x);
|
||||||
|
|
||||||
|
@ -3197,7 +3193,7 @@ finish_struct_1 (t, warn_anon)
|
||||||
{
|
{
|
||||||
tree type = TREE_TYPE (x);
|
tree type = TREE_TYPE (x);
|
||||||
|
|
||||||
if (TREE_CODE (type) == ARRAY_TYPE)
|
while (TREE_CODE (type) == ARRAY_TYPE)
|
||||||
type = TREE_TYPE (type);
|
type = TREE_TYPE (type);
|
||||||
|
|
||||||
if (TYPE_LANG_SPECIFIC (type) && ! ANON_UNION_P (x)
|
if (TYPE_LANG_SPECIFIC (type) && ! ANON_UNION_P (x)
|
||||||
|
@ -3681,19 +3677,6 @@ finish_struct_1 (t, warn_anon)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now fixup any virtual function entries from virtual bases
|
|
||||||
that have different deltas. */
|
|
||||||
vbases = CLASSTYPE_VBASECLASSES (t);
|
|
||||||
while (vbases)
|
|
||||||
{
|
|
||||||
/* We might be able to shorten the amount of work we do by
|
|
||||||
only doing this for vtables that come from virtual bases
|
|
||||||
that have differing offsets, but don't want to miss any
|
|
||||||
entries. */
|
|
||||||
fixup_vtable_deltas (vbases, 1, t);
|
|
||||||
vbases = TREE_CHAIN (vbases);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up the DECL_FIELD_BITPOS of the vfield if we need to, as we
|
/* Set up the DECL_FIELD_BITPOS of the vfield if we need to, as we
|
||||||
|
@ -3736,6 +3719,27 @@ finish_struct_1 (t, warn_anon)
|
||||||
TREE_VALUE (pending_hard_virtuals));
|
TREE_VALUE (pending_hard_virtuals));
|
||||||
pending_hard_virtuals = TREE_CHAIN (pending_hard_virtuals);
|
pending_hard_virtuals = TREE_CHAIN (pending_hard_virtuals);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (TYPE_USES_VIRTUAL_BASECLASSES (t))
|
||||||
|
{
|
||||||
|
tree vbases;
|
||||||
|
/* Now fixup any virtual function entries from virtual bases
|
||||||
|
that have different deltas. This has to come after we do the
|
||||||
|
pending hard virtuals, as we might have a function that comes
|
||||||
|
from multiple virtual base instances that is only overridden
|
||||||
|
by a hard virtual above. */
|
||||||
|
vbases = CLASSTYPE_VBASECLASSES (t);
|
||||||
|
while (vbases)
|
||||||
|
{
|
||||||
|
/* We might be able to shorten the amount of work we do by
|
||||||
|
only doing this for vtables that come from virtual bases
|
||||||
|
that have differing offsets, but don't want to miss any
|
||||||
|
entries. */
|
||||||
|
fixup_vtable_deltas (vbases, 1, t);
|
||||||
|
vbases = TREE_CHAIN (vbases);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
doing_hard_virtuals = 0;
|
doing_hard_virtuals = 0;
|
||||||
|
|
||||||
/* Under our model of GC, every C++ class gets its own virtual
|
/* Under our model of GC, every C++ class gets its own virtual
|
||||||
|
@ -4045,8 +4049,8 @@ finish_struct (t, list_of_fieldlists, warn_anon)
|
||||||
tree list_of_fieldlists;
|
tree list_of_fieldlists;
|
||||||
int warn_anon;
|
int warn_anon;
|
||||||
{
|
{
|
||||||
tree fields = NULL_TREE, fn_fields, *tail;
|
tree fields = NULL_TREE;
|
||||||
tree *tail_user_methods = &CLASSTYPE_METHODS (t);
|
tree *tail = &TYPE_METHODS (t);
|
||||||
tree name = TYPE_NAME (t);
|
tree name = TYPE_NAME (t);
|
||||||
tree x, last_x = NULL_TREE;
|
tree x, last_x = NULL_TREE;
|
||||||
enum access_type access;
|
enum access_type access;
|
||||||
|
@ -4071,7 +4075,6 @@ finish_struct (t, list_of_fieldlists, warn_anon)
|
||||||
if (IS_SIGNATURE (t))
|
if (IS_SIGNATURE (t))
|
||||||
append_signature_fields (list_of_fieldlists);
|
append_signature_fields (list_of_fieldlists);
|
||||||
|
|
||||||
tail = &fn_fields;
|
|
||||||
if (last_x && list_of_fieldlists)
|
if (last_x && list_of_fieldlists)
|
||||||
TREE_CHAIN (last_x) = TREE_VALUE (list_of_fieldlists);
|
TREE_CHAIN (last_x) = TREE_VALUE (list_of_fieldlists);
|
||||||
|
|
||||||
|
@ -4130,11 +4133,9 @@ finish_struct (t, list_of_fieldlists, warn_anon)
|
||||||
{
|
{
|
||||||
if (last_x)
|
if (last_x)
|
||||||
TREE_CHAIN (last_x) = TREE_CHAIN (x);
|
TREE_CHAIN (last_x) = TREE_CHAIN (x);
|
||||||
/* Link x onto end of fn_fields and CLASSTYPE_METHODS. */
|
/* Link x onto end of TYPE_METHODS. */
|
||||||
*tail = x;
|
*tail = x;
|
||||||
tail = &TREE_CHAIN (x);
|
tail = &TREE_CHAIN (x);
|
||||||
*tail_user_methods = x;
|
|
||||||
tail_user_methods = &DECL_NEXT_METHOD (x);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4167,12 +4168,12 @@ finish_struct (t, list_of_fieldlists, warn_anon)
|
||||||
}
|
}
|
||||||
|
|
||||||
*tail = NULL_TREE;
|
*tail = NULL_TREE;
|
||||||
*tail_user_methods = NULL_TREE;
|
|
||||||
TYPE_FIELDS (t) = fields;
|
TYPE_FIELDS (t) = fields;
|
||||||
|
|
||||||
if (0 && processing_template_defn)
|
if (0 && processing_template_defn)
|
||||||
{
|
{
|
||||||
CLASSTYPE_METHOD_VEC (t) = finish_struct_methods (t, fn_fields, 1);
|
CLASSTYPE_METHOD_VEC (t)
|
||||||
|
= finish_struct_methods (t, TYPE_METHODS (t), 1);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -4671,6 +4672,7 @@ instantiate_type (lhstype, rhs, complain)
|
||||||
return error_mark_node;
|
return error_mark_node;
|
||||||
return build_vfn_ref (&base_ptr, base, DECL_VINDEX (function));
|
return build_vfn_ref (&base_ptr, base, DECL_VINDEX (function));
|
||||||
}
|
}
|
||||||
|
mark_used (function);
|
||||||
return function;
|
return function;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4687,6 +4689,7 @@ instantiate_type (lhstype, rhs, complain)
|
||||||
if (field)
|
if (field)
|
||||||
{
|
{
|
||||||
TREE_OPERAND (rhs, 1) = field;
|
TREE_OPERAND (rhs, 1) = field;
|
||||||
|
mark_used (field);
|
||||||
return rhs;
|
return rhs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4760,7 +4763,10 @@ instantiate_type (lhstype, rhs, complain)
|
||||||
if (! comptypes (lhstype, TREE_TYPE (elem), 1))
|
if (! comptypes (lhstype, TREE_TYPE (elem), 1))
|
||||||
elem = DECL_CHAIN (elem);
|
elem = DECL_CHAIN (elem);
|
||||||
else
|
else
|
||||||
return elem;
|
{
|
||||||
|
mark_used (elem);
|
||||||
|
return elem;
|
||||||
|
}
|
||||||
|
|
||||||
/* No exact match found, look for a compatible template. */
|
/* No exact match found, look for a compatible template. */
|
||||||
{
|
{
|
||||||
|
@ -4815,6 +4821,7 @@ instantiate_type (lhstype, rhs, complain)
|
||||||
}
|
}
|
||||||
return error_mark_node;
|
return error_mark_node;
|
||||||
}
|
}
|
||||||
|
mark_used (save_elem);
|
||||||
return save_elem;
|
return save_elem;
|
||||||
}
|
}
|
||||||
if (complain)
|
if (complain)
|
||||||
|
@ -4848,7 +4855,10 @@ instantiate_type (lhstype, rhs, complain)
|
||||||
elem = TREE_VALUE (baselink);
|
elem = TREE_VALUE (baselink);
|
||||||
while (elem)
|
while (elem)
|
||||||
if (comptypes (lhstype, TREE_TYPE (elem), 1))
|
if (comptypes (lhstype, TREE_TYPE (elem), 1))
|
||||||
return elem;
|
{
|
||||||
|
mark_used (elem);
|
||||||
|
return elem;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
elem = DECL_CHAIN (elem);
|
elem = DECL_CHAIN (elem);
|
||||||
}
|
}
|
||||||
|
@ -4874,6 +4884,7 @@ instantiate_type (lhstype, rhs, complain)
|
||||||
error ("ambiguous overload for overloaded method requested");
|
error ("ambiguous overload for overloaded method requested");
|
||||||
return error_mark_node;
|
return error_mark_node;
|
||||||
}
|
}
|
||||||
|
mark_used (save_elem);
|
||||||
return save_elem;
|
return save_elem;
|
||||||
}
|
}
|
||||||
name = DECL_NAME (TREE_VALUE (rhs));
|
name = DECL_NAME (TREE_VALUE (rhs));
|
||||||
|
|
|
@ -636,10 +636,6 @@ struct lang_type
|
||||||
/* The is the VAR_DECL that contains NODE's rtti. */
|
/* The is the VAR_DECL that contains NODE's rtti. */
|
||||||
#define CLASSTYPE_RTTI(NODE) (TYPE_LANG_SPECIFIC(NODE)->rtti)
|
#define CLASSTYPE_RTTI(NODE) (TYPE_LANG_SPECIFIC(NODE)->rtti)
|
||||||
|
|
||||||
/* List of all explicit methods (chained using DECL_NEXT_METHOD),
|
|
||||||
in order they were parsed. */
|
|
||||||
#define CLASSTYPE_METHODS(NODE) (TYPE_LANG_SPECIFIC(NODE)->methods)
|
|
||||||
|
|
||||||
/* Nonzero means that this _CLASSTYPE node overloads operator(). */
|
/* Nonzero means that this _CLASSTYPE node overloads operator(). */
|
||||||
#define TYPE_OVERLOADS_CALL_EXPR(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_call_overloaded)
|
#define TYPE_OVERLOADS_CALL_EXPR(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_call_overloaded)
|
||||||
|
|
||||||
|
@ -660,7 +656,7 @@ struct lang_type
|
||||||
#define TYPE_USES_VIRTUAL_BASECLASSES(NODE) (TREE_LANG_FLAG_3(NODE))
|
#define TYPE_USES_VIRTUAL_BASECLASSES(NODE) (TREE_LANG_FLAG_3(NODE))
|
||||||
|
|
||||||
/* List of lists of member functions defined in this class. */
|
/* List of lists of member functions defined in this class. */
|
||||||
#define CLASSTYPE_METHOD_VEC(NODE) TYPE_METHODS(NODE)
|
#define CLASSTYPE_METHOD_VEC(NODE) (TYPE_LANG_SPECIFIC(NODE)->methods)
|
||||||
|
|
||||||
/* The first type conversion operator in the class (the others can be
|
/* The first type conversion operator in the class (the others can be
|
||||||
searched with TREE_CHAIN), or the first non-constructor function if
|
searched with TREE_CHAIN), or the first non-constructor function if
|
||||||
|
@ -924,7 +920,7 @@ struct lang_type
|
||||||
#define TYPE_RAISES_EXCEPTIONS(NODE) TYPE_NONCOPIED_PARTS (NODE)
|
#define TYPE_RAISES_EXCEPTIONS(NODE) TYPE_NONCOPIED_PARTS (NODE)
|
||||||
|
|
||||||
/* The binding level associated with the namespace. */
|
/* The binding level associated with the namespace. */
|
||||||
#define NAMESPACE_LEVEL(NODE) ((NODE)->decl.arguments)
|
#define NAMESPACE_LEVEL(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.level)
|
||||||
|
|
||||||
struct lang_decl_flags
|
struct lang_decl_flags
|
||||||
{
|
{
|
||||||
|
@ -960,6 +956,7 @@ struct lang_decl_flags
|
||||||
tree access;
|
tree access;
|
||||||
tree context;
|
tree context;
|
||||||
tree memfunc_pointer_to;
|
tree memfunc_pointer_to;
|
||||||
|
struct binding_level *level;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct lang_decl
|
struct lang_decl
|
||||||
|
@ -969,7 +966,6 @@ struct lang_decl
|
||||||
struct template_info *template_info;
|
struct template_info *template_info;
|
||||||
tree main_decl_variant;
|
tree main_decl_variant;
|
||||||
struct pending_inline *pending_inline_info;
|
struct pending_inline *pending_inline_info;
|
||||||
tree next_method;
|
|
||||||
tree chain;
|
tree chain;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1068,9 +1064,6 @@ struct lang_decl
|
||||||
#define DECL_CHAIN(NODE) (TREE_CHAIN (NODE))
|
#define DECL_CHAIN(NODE) (TREE_CHAIN (NODE))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Next method in CLASSTYPE_METHODS list. */
|
|
||||||
#define DECL_NEXT_METHOD(NODE) (DECL_LANG_SPECIFIC(NODE)->next_method)
|
|
||||||
|
|
||||||
/* In a VAR_DECL for a variable declared in a for statement,
|
/* In a VAR_DECL for a variable declared in a for statement,
|
||||||
this is the shadowed variable. */
|
this is the shadowed variable. */
|
||||||
#define DECL_SHADOWED_FOR_VAR(NODE) DECL_RESULT(NODE)
|
#define DECL_SHADOWED_FOR_VAR(NODE) DECL_RESULT(NODE)
|
||||||
|
@ -1401,6 +1394,9 @@ extern int flag_new_for_scope;
|
||||||
#define UPT_TEMPLATE(NODE) TREE_PURPOSE(TYPE_VALUES(NODE))
|
#define UPT_TEMPLATE(NODE) TREE_PURPOSE(TYPE_VALUES(NODE))
|
||||||
#define UPT_PARMS(NODE) TREE_VALUE(TYPE_VALUES(NODE))
|
#define UPT_PARMS(NODE) TREE_VALUE(TYPE_VALUES(NODE))
|
||||||
|
|
||||||
|
#define builtin_function(NAME, TYPE, CODE, LIBNAME) \
|
||||||
|
define_function (NAME, TYPE, CODE, (void (*)())pushdecl, LIBNAME)
|
||||||
|
|
||||||
/* An enumeration of the kind of tags that C++ accepts. */
|
/* An enumeration of the kind of tags that C++ accepts. */
|
||||||
enum tag_types { record_type, class_type, union_type, enum_type,
|
enum tag_types { record_type, class_type, union_type, enum_type,
|
||||||
signature_type };
|
signature_type };
|
||||||
|
@ -1809,6 +1805,12 @@ extern int flag_alt_external_templates;
|
||||||
|
|
||||||
extern int flag_implicit_templates;
|
extern int flag_implicit_templates;
|
||||||
|
|
||||||
|
/* Nonzero if we want to emit defined symbols with common-like linkage as
|
||||||
|
weak symbols where possible, in order to conform to C++ semantics.
|
||||||
|
Otherwise, emit them as local symbols. */
|
||||||
|
|
||||||
|
extern int flag_weak;
|
||||||
|
|
||||||
/* Current end of entries in the gc obstack for stack pointer variables. */
|
/* Current end of entries in the gc obstack for stack pointer variables. */
|
||||||
|
|
||||||
extern int current_function_obstack_index;
|
extern int current_function_obstack_index;
|
||||||
|
@ -1844,6 +1846,9 @@ extern tree current_class_type; /* _TYPE: the type of the current class */
|
||||||
LOOKUP_HAS_IN_CHARGE means that the "in charge" variable is already
|
LOOKUP_HAS_IN_CHARGE means that the "in charge" variable is already
|
||||||
in the parameter list.
|
in the parameter list.
|
||||||
LOOKUP_ONLYCONVERTING means that non-conversion constructors are not tried.
|
LOOKUP_ONLYCONVERTING means that non-conversion constructors are not tried.
|
||||||
|
INDIRECT_BIND means that if a temporary is created, it should be created so
|
||||||
|
that it lives only as long as WITH_CLEANUP_EXPRs live, else if a temporary
|
||||||
|
is created then it should live as long as the current variable bindings.
|
||||||
LOOKUP_SPECULATIVELY means return NULL_TREE if we cannot find what we are
|
LOOKUP_SPECULATIVELY means return NULL_TREE if we cannot find what we are
|
||||||
after. Note, LOOKUP_COMPLAIN is checked and error messages printed
|
after. Note, LOOKUP_COMPLAIN is checked and error messages printed
|
||||||
before LOOKUP_SPECULATIVELY is checked.
|
before LOOKUP_SPECULATIVELY is checked.
|
||||||
|
@ -1860,7 +1865,7 @@ extern tree current_class_type; /* _TYPE: the type of the current class */
|
||||||
#define LOOKUP_HAS_IN_CHARGE (32)
|
#define LOOKUP_HAS_IN_CHARGE (32)
|
||||||
#define LOOKUP_SPECULATIVELY (64)
|
#define LOOKUP_SPECULATIVELY (64)
|
||||||
#define LOOKUP_ONLYCONVERTING (128)
|
#define LOOKUP_ONLYCONVERTING (128)
|
||||||
/* 256 is free */
|
#define INDIRECT_BIND (256)
|
||||||
#define LOOKUP_NO_CONVERSION (512)
|
#define LOOKUP_NO_CONVERSION (512)
|
||||||
#define LOOKUP_DESTRUCTOR (512)
|
#define LOOKUP_DESTRUCTOR (512)
|
||||||
|
|
||||||
|
@ -2131,6 +2136,8 @@ extern void init_exception_processing PROTO((void));
|
||||||
extern void expand_builtin_throw PROTO((void));
|
extern void expand_builtin_throw PROTO((void));
|
||||||
extern void expand_start_eh_spec PROTO((void));
|
extern void expand_start_eh_spec PROTO((void));
|
||||||
extern void expand_end_eh_spec PROTO((tree));
|
extern void expand_end_eh_spec PROTO((tree));
|
||||||
|
extern tree build_cleanup PROTO((tree));
|
||||||
|
extern tree start_anon_func PROTO((void));
|
||||||
|
|
||||||
/* in expr.c */
|
/* in expr.c */
|
||||||
/* skip cplus_expand_expr */
|
/* skip cplus_expand_expr */
|
||||||
|
@ -2395,6 +2402,7 @@ extern tree array_type_nelts_total PROTO((tree));
|
||||||
extern tree array_type_nelts_top PROTO((tree));
|
extern tree array_type_nelts_top PROTO((tree));
|
||||||
extern tree break_out_target_exprs PROTO((tree));
|
extern tree break_out_target_exprs PROTO((tree));
|
||||||
extern tree build_unsave_expr PROTO((tree));
|
extern tree build_unsave_expr PROTO((tree));
|
||||||
|
extern tree unsave_expr PROTO((tree));
|
||||||
extern int cp_expand_decl_cleanup PROTO((tree, tree));
|
extern int cp_expand_decl_cleanup PROTO((tree, tree));
|
||||||
|
|
||||||
/* in typeck.c */
|
/* in typeck.c */
|
||||||
|
|
20
gcc/cp/cvt.c
20
gcc/cp/cvt.c
|
@ -311,6 +311,7 @@ convert_to_pointer_force (type, expr)
|
||||||
value we have to begin with is in ARG.
|
value we have to begin with is in ARG.
|
||||||
|
|
||||||
FLAGS controls how we manage access checking.
|
FLAGS controls how we manage access checking.
|
||||||
|
INDIRECT_BIND in FLAGS controls how any temporarys are generated.
|
||||||
CHECKCONST controls if we report error messages on const subversion. */
|
CHECKCONST controls if we report error messages on const subversion. */
|
||||||
static tree
|
static tree
|
||||||
build_up_reference (type, arg, flags, checkconst)
|
build_up_reference (type, arg, flags, checkconst)
|
||||||
|
@ -589,7 +590,15 @@ build_up_reference (type, arg, flags, checkconst)
|
||||||
{
|
{
|
||||||
tree temp;
|
tree temp;
|
||||||
|
|
||||||
if (TREE_CODE (targ) == CALL_EXPR && IS_AGGR_TYPE (argtype))
|
if (flags&INDIRECT_BIND)
|
||||||
|
{
|
||||||
|
tree slot = build (VAR_DECL, argtype);
|
||||||
|
layout_decl (slot, 0);
|
||||||
|
rval = build (TARGET_EXPR, argtype, slot, arg, 0);
|
||||||
|
rval = build1 (ADDR_EXPR, type, rval);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
else if (TREE_CODE (targ) == CALL_EXPR && IS_AGGR_TYPE (argtype))
|
||||||
{
|
{
|
||||||
temp = build_cplus_new (argtype, targ, 1);
|
temp = build_cplus_new (argtype, targ, 1);
|
||||||
if (TREE_CODE (temp) == WITH_CLEANUP_EXPR)
|
if (TREE_CODE (temp) == WITH_CLEANUP_EXPR)
|
||||||
|
@ -1634,8 +1643,13 @@ build_expr_type_conversion (desires, expr, complain)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (winner)
|
if (winner)
|
||||||
return build_type_conversion_1 (TREE_VALUE (winner), basetype, expr,
|
{
|
||||||
TREE_PURPOSE (winner), 1);
|
tree type = TREE_VALUE (winner);
|
||||||
|
if (TREE_CODE (type) == REFERENCE_TYPE)
|
||||||
|
type = TREE_TYPE (type);
|
||||||
|
return build_type_conversion_1 (type, basetype, expr,
|
||||||
|
TREE_PURPOSE (winner), 1);
|
||||||
|
}
|
||||||
|
|
||||||
return NULL_TREE;
|
return NULL_TREE;
|
||||||
}
|
}
|
||||||
|
|
237
gcc/cp/decl.c
237
gcc/cp/decl.c
|
@ -38,6 +38,7 @@ Boston, MA 02111-1307, USA. */
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include "obstack.h"
|
#include "obstack.h"
|
||||||
|
#include "defaults.h"
|
||||||
|
|
||||||
#define obstack_chunk_alloc xmalloc
|
#define obstack_chunk_alloc xmalloc
|
||||||
#define obstack_chunk_free free
|
#define obstack_chunk_free free
|
||||||
|
@ -267,6 +268,11 @@ tree vtbl_type_node;
|
||||||
|
|
||||||
tree dtor_label;
|
tree dtor_label;
|
||||||
|
|
||||||
|
/* In a destructor, the last insn emitted after the start of the
|
||||||
|
function and the parms. */
|
||||||
|
|
||||||
|
rtx last_dtor_insn;
|
||||||
|
|
||||||
/* In a constructor, the point at which we are ready to return
|
/* In a constructor, the point at which we are ready to return
|
||||||
the pointer to the initialized object. */
|
the pointer to the initialized object. */
|
||||||
|
|
||||||
|
@ -1092,15 +1098,30 @@ poplevel (keep, reverse, functionbody)
|
||||||
block = make_node (BLOCK);
|
block = make_node (BLOCK);
|
||||||
if (block != NULL_TREE)
|
if (block != NULL_TREE)
|
||||||
{
|
{
|
||||||
BLOCK_VARS (block) = decls;
|
if (block_previously_created)
|
||||||
BLOCK_TYPE_TAGS (block) = tags;
|
{
|
||||||
BLOCK_SUBBLOCKS (block) = subblocks;
|
if (decls || tags || subblocks)
|
||||||
/* If we created the block earlier on, and we are just diddling it now,
|
{
|
||||||
then it already should have a proper BLOCK_END_NOTE value associated
|
if (BLOCK_VARS (block) || BLOCK_TYPE_TAGS (block) || BLOCK_SUBBLOCKS (block))
|
||||||
with it, so avoid trashing that. Otherwise, for a new block, install
|
{
|
||||||
a new BLOCK_END_NOTE value. */
|
warning ("internal compiler error: debugging info corrupted");
|
||||||
if (! block_previously_created)
|
}
|
||||||
remember_end_note (block);
|
BLOCK_VARS (block) = decls;
|
||||||
|
BLOCK_TYPE_TAGS (block) = tags;
|
||||||
|
/* Recover from too many blocks by chaining them together. */
|
||||||
|
BLOCK_SUBBLOCKS (block) = chainon (BLOCK_SUBBLOCKS (block), subblocks);
|
||||||
|
}
|
||||||
|
/* If we created the block earlier on, and we are just diddling it now, then
|
||||||
|
it already should have a proper BLOCK_END_NOTE value associated with it. */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
BLOCK_VARS (block) = decls;
|
||||||
|
BLOCK_TYPE_TAGS (block) = tags;
|
||||||
|
BLOCK_SUBBLOCKS (block) = subblocks;
|
||||||
|
/* Otherwise, for a new block, install a new BLOCK_END_NOTE value. */
|
||||||
|
remember_end_note (block);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* In each subblock, record that this is its superior. */
|
/* In each subblock, record that this is its superior. */
|
||||||
|
@ -1700,7 +1721,7 @@ push_namespace (name)
|
||||||
extern tree current_namespace;
|
extern tree current_namespace;
|
||||||
tree old_id = get_namespace_id ();
|
tree old_id = get_namespace_id ();
|
||||||
char *buf;
|
char *buf;
|
||||||
tree d = make_node (NAMESPACE_DECL);
|
tree d;
|
||||||
|
|
||||||
if (! name)
|
if (! name)
|
||||||
{
|
{
|
||||||
|
@ -1708,12 +1729,11 @@ push_namespace (name)
|
||||||
name = get_unique_name ();
|
name = get_unique_name ();
|
||||||
}
|
}
|
||||||
|
|
||||||
DECL_NAME (d) = name;
|
d = build_lang_decl (NAMESPACE_DECL, name, void_type_node);
|
||||||
DECL_ASSEMBLER_NAME (d) = name;
|
|
||||||
/* pushdecl wants to check the size of it to see if it is incomplete... */
|
|
||||||
TREE_TYPE (d) = void_type_node;
|
|
||||||
/* Mark them as external, so redeclaration_error_message doesn't think
|
/* Mark them as external, so redeclaration_error_message doesn't think
|
||||||
they are duplicates. */
|
they are duplicates. */
|
||||||
|
|
||||||
DECL_EXTERNAL (d) = 1;
|
DECL_EXTERNAL (d) = 1;
|
||||||
d = pushdecl (d);
|
d = pushdecl (d);
|
||||||
|
|
||||||
|
@ -1722,12 +1742,10 @@ push_namespace (name)
|
||||||
/* This is new for this compilation unit. */
|
/* This is new for this compilation unit. */
|
||||||
pushlevel (0);
|
pushlevel (0);
|
||||||
declare_namespace_level ();
|
declare_namespace_level ();
|
||||||
NAMESPACE_LEVEL (d) = (tree)current_binding_level;
|
NAMESPACE_LEVEL (d) = current_binding_level;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
resume_level (NAMESPACE_LEVEL (d));
|
||||||
resume_level ((struct binding_level*)NAMESPACE_LEVEL (d));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This code is just is bit old now... */
|
/* This code is just is bit old now... */
|
||||||
current_namespace = tree_cons (NULL_TREE, name, current_namespace);
|
current_namespace = tree_cons (NULL_TREE, name, current_namespace);
|
||||||
|
@ -2400,8 +2418,20 @@ decls_match (newdecl, olddecl)
|
||||||
types_match = TREE_TYPE (newdecl) == NULL_TREE;
|
types_match = TREE_TYPE (newdecl) == NULL_TREE;
|
||||||
else if (TREE_TYPE (newdecl) == NULL_TREE)
|
else if (TREE_TYPE (newdecl) == NULL_TREE)
|
||||||
types_match = 0;
|
types_match = 0;
|
||||||
|
/* Qualifiers must match, and they may be present on either, the type
|
||||||
|
or the decl. */
|
||||||
|
else if ((TREE_READONLY (newdecl)
|
||||||
|
|| TYPE_READONLY (TREE_TYPE (newdecl)))
|
||||||
|
== (TREE_READONLY (olddecl)
|
||||||
|
|| TYPE_READONLY (TREE_TYPE (olddecl)))
|
||||||
|
&& (TREE_THIS_VOLATILE (newdecl)
|
||||||
|
|| TYPE_VOLATILE (TREE_TYPE (newdecl)))
|
||||||
|
== (TREE_THIS_VOLATILE (olddecl)
|
||||||
|
|| TYPE_VOLATILE (TREE_TYPE (olddecl))))
|
||||||
|
types_match = comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (newdecl)),
|
||||||
|
TYPE_MAIN_VARIANT (TREE_TYPE (olddecl)), 1);
|
||||||
else
|
else
|
||||||
types_match = comptypes (TREE_TYPE (newdecl), TREE_TYPE (olddecl), 1);
|
types_match = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return types_match;
|
return types_match;
|
||||||
|
@ -2722,8 +2752,6 @@ duplicate_decls (newdecl, olddecl)
|
||||||
DECL_CLASS_CONTEXT (newdecl) = DECL_CLASS_CONTEXT (olddecl);
|
DECL_CLASS_CONTEXT (newdecl) = DECL_CLASS_CONTEXT (olddecl);
|
||||||
if (DECL_CHAIN (newdecl) == NULL_TREE)
|
if (DECL_CHAIN (newdecl) == NULL_TREE)
|
||||||
DECL_CHAIN (newdecl) = DECL_CHAIN (olddecl);
|
DECL_CHAIN (newdecl) = DECL_CHAIN (olddecl);
|
||||||
if (DECL_NEXT_METHOD (newdecl) == NULL_TREE)
|
|
||||||
DECL_NEXT_METHOD (newdecl) = DECL_NEXT_METHOD (olddecl);
|
|
||||||
if (DECL_PENDING_INLINE_INFO (newdecl) == (struct pending_inline *)0)
|
if (DECL_PENDING_INLINE_INFO (newdecl) == (struct pending_inline *)0)
|
||||||
DECL_PENDING_INLINE_INFO (newdecl) = DECL_PENDING_INLINE_INFO (olddecl);
|
DECL_PENDING_INLINE_INFO (newdecl) = DECL_PENDING_INLINE_INFO (olddecl);
|
||||||
DECL_STATIC_CONSTRUCTOR (newdecl) |= DECL_STATIC_CONSTRUCTOR (olddecl);
|
DECL_STATIC_CONSTRUCTOR (newdecl) |= DECL_STATIC_CONSTRUCTOR (olddecl);
|
||||||
|
@ -2888,7 +2916,7 @@ duplicate_decls (newdecl, olddecl)
|
||||||
|
|
||||||
if (TREE_CODE (newdecl) == FUNCTION_DECL)
|
if (TREE_CODE (newdecl) == FUNCTION_DECL)
|
||||||
{
|
{
|
||||||
DECL_C_STATIC (newdecl) = DECL_C_STATIC (olddecl);
|
DECL_C_STATIC (newdecl) |= DECL_C_STATIC (olddecl);
|
||||||
DECL_INTERFACE_KNOWN (newdecl) |= DECL_INTERFACE_KNOWN (olddecl);
|
DECL_INTERFACE_KNOWN (newdecl) |= DECL_INTERFACE_KNOWN (olddecl);
|
||||||
DECL_NOT_REALLY_EXTERN (newdecl) |= DECL_NOT_REALLY_EXTERN (olddecl);
|
DECL_NOT_REALLY_EXTERN (newdecl) |= DECL_NOT_REALLY_EXTERN (olddecl);
|
||||||
}
|
}
|
||||||
|
@ -3379,7 +3407,7 @@ pushdecl (x)
|
||||||
if (b->parm_flag == 1)
|
if (b->parm_flag == 1)
|
||||||
cp_error ("declaration of `%#D' shadows a parameter", name);
|
cp_error ("declaration of `%#D' shadows a parameter", name);
|
||||||
}
|
}
|
||||||
else if (oldlocal != NULL_TREE && b->is_for_scope
|
else if (warn_shadow && oldlocal != NULL_TREE && b->is_for_scope
|
||||||
&& !DECL_DEAD_FOR_LOCAL (oldlocal))
|
&& !DECL_DEAD_FOR_LOCAL (oldlocal))
|
||||||
{
|
{
|
||||||
warning ("variable `%s' shadows local",
|
warning ("variable `%s' shadows local",
|
||||||
|
@ -4173,6 +4201,7 @@ lookup_tag (form, name, binding_level, thislevel_only)
|
||||||
/* Definition isn't the kind we were looking for. */
|
/* Definition isn't the kind we were looking for. */
|
||||||
cp_error ("`%#D' redeclared as %C", TREE_VALUE (tail),
|
cp_error ("`%#D' redeclared as %C", TREE_VALUE (tail),
|
||||||
form);
|
form);
|
||||||
|
return NULL_TREE;
|
||||||
}
|
}
|
||||||
return TREE_VALUE (tail);
|
return TREE_VALUE (tail);
|
||||||
}
|
}
|
||||||
|
@ -4208,6 +4237,7 @@ lookup_tag (form, name, binding_level, thislevel_only)
|
||||||
{
|
{
|
||||||
cp_error ("`%#D' redeclared as %C in class scope",
|
cp_error ("`%#D' redeclared as %C in class scope",
|
||||||
TREE_VALUE (tail), form);
|
TREE_VALUE (tail), form);
|
||||||
|
return NULL_TREE;
|
||||||
}
|
}
|
||||||
return TREE_VALUE (tail);
|
return TREE_VALUE (tail);
|
||||||
}
|
}
|
||||||
|
@ -4690,9 +4720,6 @@ push_overloaded_decl_1 (x)
|
||||||
push_overloaded_decl (x, 0);
|
push_overloaded_decl (x, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define builtin_function(NAME, TYPE, CODE, LIBNAME) \
|
|
||||||
define_function (NAME, TYPE, CODE, (void (*)())pushdecl, LIBNAME)
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
__inline
|
__inline
|
||||||
#endif
|
#endif
|
||||||
|
@ -5230,21 +5257,21 @@ init_decl_processing ()
|
||||||
#if 0
|
#if 0
|
||||||
/* Support for these has not been written in either expand_builtin
|
/* Support for these has not been written in either expand_builtin
|
||||||
or build_function_call. */
|
or build_function_call. */
|
||||||
builtin_function ("__builtin_div", default_ftype, BUILT_IN_DIV, 0);
|
builtin_function ("__builtin_div", default_ftype, BUILT_IN_DIV, NULL_PTR);
|
||||||
builtin_function ("__builtin_ldiv", default_ftype, BUILT_IN_LDIV, 0);
|
builtin_function ("__builtin_ldiv", default_ftype, BUILT_IN_LDIV, NULL_PTR);
|
||||||
builtin_function ("__builtin_ffloor", double_ftype_double, BUILT_IN_FFLOOR,
|
builtin_function ("__builtin_ffloor", double_ftype_double, BUILT_IN_FFLOOR,
|
||||||
0);
|
NULL_PTR);
|
||||||
builtin_function ("__builtin_fceil", double_ftype_double, BUILT_IN_FCEIL, 0);
|
builtin_function ("__builtin_fceil", double_ftype_double, BUILT_IN_FCEIL, NULL_PTR);
|
||||||
builtin_function ("__builtin_fmod", double_ftype_double_double,
|
builtin_function ("__builtin_fmod", double_ftype_double_double,
|
||||||
BUILT_IN_FMOD, 0);
|
BUILT_IN_FMOD, NULL_PTR);
|
||||||
builtin_function ("__builtin_frem", double_ftype_double_double,
|
builtin_function ("__builtin_frem", double_ftype_double_double,
|
||||||
BUILT_IN_FREM, 0);
|
BUILT_IN_FREM, NULL_PTR);
|
||||||
builtin_function ("__builtin_memset", ptr_ftype_ptr_int_int, BUILT_IN_MEMSET,
|
builtin_function ("__builtin_memset", ptr_ftype_ptr_int_int, BUILT_IN_MEMSET,
|
||||||
0);
|
NULL_PTR);
|
||||||
builtin_function ("__builtin_getexp", double_ftype_double, BUILT_IN_GETEXP,
|
builtin_function ("__builtin_getexp", double_ftype_double, BUILT_IN_GETEXP,
|
||||||
0);
|
NULL_PTR);
|
||||||
builtin_function ("__builtin_getman", double_ftype_double, BUILT_IN_GETMAN,
|
builtin_function ("__builtin_getman", double_ftype_double, BUILT_IN_GETMAN,
|
||||||
0);
|
NULL_PTR);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* C++ extensions */
|
/* C++ extensions */
|
||||||
|
@ -5299,7 +5326,7 @@ init_decl_processing ()
|
||||||
real gc code. */
|
real gc code. */
|
||||||
if (flag_gc)
|
if (flag_gc)
|
||||||
{
|
{
|
||||||
builtin_function ("__gc_main", default_function_type, NOT_BUILT_IN, 0);
|
builtin_function ("__gc_main", default_function_type, NOT_BUILT_IN, NULL_PTR);
|
||||||
pushdecl (lookup_name (get_identifier ("__gc_main"), 0));
|
pushdecl (lookup_name (get_identifier ("__gc_main"), 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5553,6 +5580,8 @@ init_decl_processing ()
|
||||||
}
|
}
|
||||||
if (flag_cadillac)
|
if (flag_cadillac)
|
||||||
init_cadillac ();
|
init_cadillac ();
|
||||||
|
if (! SUPPORTS_WEAK)
|
||||||
|
flag_weak = 0;
|
||||||
|
|
||||||
/* Create the global bindings for __FUNCTION__ and __PRETTY_FUNCTION__. */
|
/* Create the global bindings for __FUNCTION__ and __PRETTY_FUNCTION__. */
|
||||||
declare_function_name ();
|
declare_function_name ();
|
||||||
|
@ -6819,7 +6848,11 @@ cp_finish_decl (decl, init, asmspec_tree, need_pop, flags)
|
||||||
}
|
}
|
||||||
else if (! toplev)
|
else if (! toplev)
|
||||||
{
|
{
|
||||||
|
extern int temp_slot_level;
|
||||||
|
extern int target_temp_slot_level;
|
||||||
tree old_cleanups = cleanups_this_call;
|
tree old_cleanups = cleanups_this_call;
|
||||||
|
int old_temp_level = target_temp_slot_level;
|
||||||
|
|
||||||
/* This is a declared decl which must live until the
|
/* This is a declared decl which must live until the
|
||||||
end of the binding contour. It may need a cleanup. */
|
end of the binding contour. It may need a cleanup. */
|
||||||
|
|
||||||
|
@ -6854,6 +6887,10 @@ cp_finish_decl (decl, init, asmspec_tree, need_pop, flags)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
push_temp_slots ();
|
||||||
|
push_temp_slots ();
|
||||||
|
target_temp_slot_level = temp_slot_level;
|
||||||
|
|
||||||
if (DECL_SIZE (decl) && type != error_mark_node)
|
if (DECL_SIZE (decl) && type != error_mark_node)
|
||||||
{
|
{
|
||||||
/* Compute and store the initial value. */
|
/* Compute and store the initial value. */
|
||||||
|
@ -6883,6 +6920,9 @@ cp_finish_decl (decl, init, asmspec_tree, need_pop, flags)
|
||||||
}
|
}
|
||||||
/* Cleanup any temporaries needed for the initial value. */
|
/* Cleanup any temporaries needed for the initial value. */
|
||||||
expand_cleanups_to (old_cleanups);
|
expand_cleanups_to (old_cleanups);
|
||||||
|
pop_temp_slots ();
|
||||||
|
pop_temp_slots ();
|
||||||
|
target_temp_slot_level = old_temp_level;
|
||||||
}
|
}
|
||||||
finish_end0:
|
finish_end0:
|
||||||
|
|
||||||
|
@ -6961,7 +7001,6 @@ expand_static_init (decl, init)
|
||||||
tree init;
|
tree init;
|
||||||
{
|
{
|
||||||
tree oldstatic = value_member (decl, static_aggregates);
|
tree oldstatic = value_member (decl, static_aggregates);
|
||||||
tree old_cleanups;
|
|
||||||
|
|
||||||
if (oldstatic)
|
if (oldstatic)
|
||||||
{
|
{
|
||||||
|
@ -6973,6 +7012,11 @@ expand_static_init (decl, init)
|
||||||
/* Emit code to perform this initialization but once. */
|
/* Emit code to perform this initialization but once. */
|
||||||
tree temp;
|
tree temp;
|
||||||
|
|
||||||
|
extern int temp_slot_level;
|
||||||
|
extern int target_temp_slot_level;
|
||||||
|
tree old_cleanups;
|
||||||
|
int old_temp_level;
|
||||||
|
|
||||||
/* Remember this information until end of file. */
|
/* Remember this information until end of file. */
|
||||||
push_obstacks (&permanent_obstack, &permanent_obstack);
|
push_obstacks (&permanent_obstack, &permanent_obstack);
|
||||||
|
|
||||||
|
@ -6982,6 +7026,11 @@ expand_static_init (decl, init)
|
||||||
expand_start_cond (build_binary_op (EQ_EXPR, temp,
|
expand_start_cond (build_binary_op (EQ_EXPR, temp,
|
||||||
integer_zero_node, 1), 0);
|
integer_zero_node, 1), 0);
|
||||||
old_cleanups = cleanups_this_call;
|
old_cleanups = cleanups_this_call;
|
||||||
|
old_temp_level = target_temp_slot_level;
|
||||||
|
push_temp_slots ();
|
||||||
|
push_temp_slots ();
|
||||||
|
target_temp_slot_level = temp_slot_level;
|
||||||
|
|
||||||
expand_assignment (temp, integer_one_node, 0, 0);
|
expand_assignment (temp, integer_one_node, 0, 0);
|
||||||
if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl))
|
if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl))
|
||||||
|| (init && TREE_CODE (init) == TREE_LIST))
|
|| (init && TREE_CODE (init) == TREE_LIST))
|
||||||
|
@ -6994,6 +7043,44 @@ expand_static_init (decl, init)
|
||||||
|
|
||||||
/* Cleanup any temporaries needed for the initial value. */
|
/* Cleanup any temporaries needed for the initial value. */
|
||||||
expand_cleanups_to (old_cleanups);
|
expand_cleanups_to (old_cleanups);
|
||||||
|
pop_temp_slots ();
|
||||||
|
pop_temp_slots ();
|
||||||
|
target_temp_slot_level = old_temp_level;
|
||||||
|
|
||||||
|
if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (decl)))
|
||||||
|
{
|
||||||
|
tree cleanup, fcall;
|
||||||
|
static tree Atexit = 0;
|
||||||
|
if (Atexit == 0)
|
||||||
|
{
|
||||||
|
tree atexit_fndecl, PFV, pfvlist;
|
||||||
|
/* Remember this information until end of file. */
|
||||||
|
push_obstacks (&permanent_obstack, &permanent_obstack);
|
||||||
|
PFV = build_pointer_type (build_function_type
|
||||||
|
(void_type_node, void_list_node));
|
||||||
|
|
||||||
|
pfvlist = tree_cons (NULL_TREE, PFV, void_list_node);
|
||||||
|
|
||||||
|
push_lang_context (lang_name_c);
|
||||||
|
atexit_fndecl =
|
||||||
|
builtin_function ("atexit",
|
||||||
|
build_function_type (void_type_node,
|
||||||
|
pfvlist),
|
||||||
|
NOT_BUILT_IN, NULL_PTR);
|
||||||
|
Atexit = default_conversion (atexit_fndecl);
|
||||||
|
pop_lang_context ();
|
||||||
|
pop_obstacks ();
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup = start_anon_func ();
|
||||||
|
expand_expr_stmt (build_cleanup (decl));
|
||||||
|
end_anon_func ();
|
||||||
|
mark_addressable (cleanup);
|
||||||
|
cleanup = build_unary_op (ADDR_EXPR, cleanup, 0);
|
||||||
|
fcall = build_function_call (Atexit, tree_cons (NULL_TREE, cleanup, NULL_TREE));
|
||||||
|
expand_expr_stmt (fcall);
|
||||||
|
}
|
||||||
|
|
||||||
expand_end_cond ();
|
expand_end_cond ();
|
||||||
if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (decl)))
|
if (TYPE_NEEDS_DESTRUCTOR (TREE_TYPE (decl)))
|
||||||
{
|
{
|
||||||
|
@ -9439,6 +9526,15 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises, attrli
|
||||||
{
|
{
|
||||||
int publicp = 0;
|
int publicp = 0;
|
||||||
|
|
||||||
|
/* We catch the others as conflicts with the builtin
|
||||||
|
typedefs. */
|
||||||
|
if (friendp && declarator == ridpointers[(int) RID_SIGNED])
|
||||||
|
{
|
||||||
|
cp_error ("function `%D' cannot be declared friend",
|
||||||
|
declarator);
|
||||||
|
friendp = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (friendp == 0)
|
if (friendp == 0)
|
||||||
{
|
{
|
||||||
if (ctype == NULL_TREE)
|
if (ctype == NULL_TREE)
|
||||||
|
@ -11667,6 +11763,7 @@ store_parm_decls ()
|
||||||
if (insns)
|
if (insns)
|
||||||
store_in_parms (insns);
|
store_in_parms (insns);
|
||||||
}
|
}
|
||||||
|
last_dtor_insn = get_last_insn ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Bind a name and initialization to the return value of
|
/* Bind a name and initialization to the return value of
|
||||||
|
@ -11793,6 +11890,7 @@ finish_function (lineno, call_poplevel, nested)
|
||||||
tree in_charge_node = lookup_name (in_charge_identifier, 0);
|
tree in_charge_node = lookup_name (in_charge_identifier, 0);
|
||||||
tree virtual_size;
|
tree virtual_size;
|
||||||
int ok_to_optimize_dtor = 0;
|
int ok_to_optimize_dtor = 0;
|
||||||
|
int empty_dtor = get_last_insn () == last_dtor_insn;
|
||||||
|
|
||||||
if (current_function_assigns_this)
|
if (current_function_assigns_this)
|
||||||
cond = build (NE_EXPR, boolean_type_node,
|
cond = build (NE_EXPR, boolean_type_node,
|
||||||
|
@ -11805,7 +11903,7 @@ finish_function (lineno, call_poplevel, nested)
|
||||||
whether `this' is NULL in some cases. */
|
whether `this' is NULL in some cases. */
|
||||||
if ((flag_this_is_variable & 1) == 0)
|
if ((flag_this_is_variable & 1) == 0)
|
||||||
ok_to_optimize_dtor = 1;
|
ok_to_optimize_dtor = 1;
|
||||||
else if (get_last_insn () == get_first_nonparm_insn ())
|
else if (empty_dtor)
|
||||||
ok_to_optimize_dtor
|
ok_to_optimize_dtor
|
||||||
= (n_baseclasses == 0
|
= (n_baseclasses == 0
|
||||||
|| (n_baseclasses == 1
|
|| (n_baseclasses == 1
|
||||||
|
@ -11926,12 +12024,25 @@ finish_function (lineno, call_poplevel, nested)
|
||||||
|
|
||||||
start_sequence ();
|
start_sequence ();
|
||||||
|
|
||||||
/* Make all virtual function table pointers in non-virtual base
|
/* If the dtor is empty, and we know there is not possible way we could
|
||||||
classes point to CURRENT_CLASS_TYPE's virtual function
|
use any vtable entries, before they are possibly set by a base class
|
||||||
tables. */
|
dtor, we don't have to setup the vtables, as we know that any base
|
||||||
expand_direct_vtbls_init (binfo, binfo, 1, 0, current_class_decl);
|
class dtoring will set up any vtables it needs. We avoid MI,
|
||||||
if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
|
because one base class dtor can do a virtual dispatch to an
|
||||||
expand_indirect_vtbls_init (binfo, C_C_D, current_class_decl, 0);
|
overridden function that would need to have a non-related vtable set
|
||||||
|
up, we cannot avoid setting up vtables in that case. We could
|
||||||
|
change this to see if there is just one vtable. */
|
||||||
|
if (! empty_dtor || TYPE_USES_COMPLEX_INHERITANCE (current_class_type))
|
||||||
|
{
|
||||||
|
/* Make all virtual function table pointers in non-virtual base
|
||||||
|
classes point to CURRENT_CLASS_TYPE's virtual function
|
||||||
|
tables. */
|
||||||
|
expand_direct_vtbls_init (binfo, binfo, 1, 0, current_class_decl);
|
||||||
|
|
||||||
|
if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
|
||||||
|
expand_indirect_vtbls_init (binfo, C_C_D, current_class_decl, 0);
|
||||||
|
}
|
||||||
|
|
||||||
if (! ok_to_optimize_dtor)
|
if (! ok_to_optimize_dtor)
|
||||||
{
|
{
|
||||||
cond = build_binary_op (NE_EXPR,
|
cond = build_binary_op (NE_EXPR,
|
||||||
|
@ -12490,15 +12601,6 @@ hack_incomplete_structures (type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Nonzero if presently building a cleanup. Needed because
|
|
||||||
SAVE_EXPRs are not the right things to use inside of cleanups.
|
|
||||||
They are only ever evaluated once, where the cleanup
|
|
||||||
might be evaluated several times. In this case, a later evaluation
|
|
||||||
of the cleanup might fill in the SAVE_EXPR_RTL, and it will
|
|
||||||
not be valid for an earlier cleanup. */
|
|
||||||
|
|
||||||
int building_cleanup;
|
|
||||||
|
|
||||||
/* If DECL is of a type which needs a cleanup, build that cleanup here.
|
/* If DECL is of a type which needs a cleanup, build that cleanup here.
|
||||||
We don't build cleanups if just going for syntax checking, since
|
We don't build cleanups if just going for syntax checking, since
|
||||||
fixup_cleanups does not know how to not handle them.
|
fixup_cleanups does not know how to not handle them.
|
||||||
|
@ -12514,8 +12616,6 @@ maybe_build_cleanup (decl)
|
||||||
{
|
{
|
||||||
int temp = 0, flags = LOOKUP_NORMAL|LOOKUP_DESTRUCTOR;
|
int temp = 0, flags = LOOKUP_NORMAL|LOOKUP_DESTRUCTOR;
|
||||||
tree rval;
|
tree rval;
|
||||||
int old_building_cleanup = building_cleanup;
|
|
||||||
building_cleanup = 1;
|
|
||||||
|
|
||||||
if (TREE_CODE (decl) != PARM_DECL)
|
if (TREE_CODE (decl) != PARM_DECL)
|
||||||
temp = suspend_momentary ();
|
temp = suspend_momentary ();
|
||||||
|
@ -12540,11 +12640,12 @@ maybe_build_cleanup (decl)
|
||||||
rval = build_compound_expr (tree_cons (NULL_TREE, rval,
|
rval = build_compound_expr (tree_cons (NULL_TREE, rval,
|
||||||
build_tree_list (NULL_TREE, build_vbase_delete (type, decl))));
|
build_tree_list (NULL_TREE, build_vbase_delete (type, decl))));
|
||||||
|
|
||||||
|
/* Since this is a cleanup, UNSAVE it now. */
|
||||||
|
rval = unsave_expr (rval);
|
||||||
|
|
||||||
if (TREE_CODE (decl) != PARM_DECL)
|
if (TREE_CODE (decl) != PARM_DECL)
|
||||||
resume_momentary (temp);
|
resume_momentary (temp);
|
||||||
|
|
||||||
building_cleanup = old_building_cleanup;
|
|
||||||
|
|
||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -12563,6 +12664,14 @@ void
|
||||||
cplus_expand_expr_stmt (exp)
|
cplus_expand_expr_stmt (exp)
|
||||||
tree exp;
|
tree exp;
|
||||||
{
|
{
|
||||||
|
extern int temp_slot_level;
|
||||||
|
extern int target_temp_slot_level;
|
||||||
|
tree old_cleanups = cleanups_this_call;
|
||||||
|
int old_temp_level = target_temp_slot_level;
|
||||||
|
push_temp_slots ();
|
||||||
|
push_temp_slots ();
|
||||||
|
target_temp_slot_level = temp_slot_level;
|
||||||
|
|
||||||
if (TREE_TYPE (exp) == unknown_type_node)
|
if (TREE_TYPE (exp) == unknown_type_node)
|
||||||
{
|
{
|
||||||
if (TREE_CODE (exp) == ADDR_EXPR || TREE_CODE (exp) == TREE_LIST)
|
if (TREE_CODE (exp) == ADDR_EXPR || TREE_CODE (exp) == TREE_LIST)
|
||||||
|
@ -12590,7 +12699,16 @@ cplus_expand_expr_stmt (exp)
|
||||||
|
|
||||||
/* Clean up any pending cleanups. This happens when a function call
|
/* Clean up any pending cleanups. This happens when a function call
|
||||||
returns a cleanup-needing value that nobody uses. */
|
returns a cleanup-needing value that nobody uses. */
|
||||||
expand_cleanups_to (NULL_TREE);
|
expand_cleanups_to (old_cleanups);
|
||||||
|
pop_temp_slots ();
|
||||||
|
pop_temp_slots ();
|
||||||
|
target_temp_slot_level = old_temp_level;
|
||||||
|
/* There might something left from building the trees. */
|
||||||
|
if (cleanups_this_call)
|
||||||
|
{
|
||||||
|
expand_cleanups_to (NULL_TREE);
|
||||||
|
}
|
||||||
|
free_temp_slots ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* When a stmt has been parsed, this function is called.
|
/* When a stmt has been parsed, this function is called.
|
||||||
|
@ -12679,6 +12797,7 @@ struct cp_function
|
||||||
tree shadowed_labels;
|
tree shadowed_labels;
|
||||||
tree ctor_label;
|
tree ctor_label;
|
||||||
tree dtor_label;
|
tree dtor_label;
|
||||||
|
rtx last_dtor_insn;
|
||||||
tree protect_list;
|
tree protect_list;
|
||||||
tree base_init_list;
|
tree base_init_list;
|
||||||
tree member_init_list;
|
tree member_init_list;
|
||||||
|
@ -12717,6 +12836,7 @@ push_cp_function_context (context)
|
||||||
p->binding_level = current_binding_level;
|
p->binding_level = current_binding_level;
|
||||||
p->ctor_label = ctor_label;
|
p->ctor_label = ctor_label;
|
||||||
p->dtor_label = dtor_label;
|
p->dtor_label = dtor_label;
|
||||||
|
p->last_dtor_insn = last_dtor_insn;
|
||||||
p->assigns_this = current_function_assigns_this;
|
p->assigns_this = current_function_assigns_this;
|
||||||
p->just_assigned_this = current_function_just_assigned_this;
|
p->just_assigned_this = current_function_just_assigned_this;
|
||||||
p->parms_stored = current_function_parms_stored;
|
p->parms_stored = current_function_parms_stored;
|
||||||
|
@ -12768,6 +12888,7 @@ pop_cp_function_context (context)
|
||||||
current_binding_level = p->binding_level;
|
current_binding_level = p->binding_level;
|
||||||
ctor_label = p->ctor_label;
|
ctor_label = p->ctor_label;
|
||||||
dtor_label = p->dtor_label;
|
dtor_label = p->dtor_label;
|
||||||
|
last_dtor_insn = p->last_dtor_insn;
|
||||||
protect_list = p->protect_list;
|
protect_list = p->protect_list;
|
||||||
current_function_assigns_this = p->assigns_this;
|
current_function_assigns_this = p->assigns_this;
|
||||||
current_function_just_assigned_this = p->just_assigned_this;
|
current_function_just_assigned_this = p->just_assigned_this;
|
||||||
|
|
122
gcc/cp/decl2.c
122
gcc/cp/decl2.c
|
@ -36,7 +36,6 @@ Boston, MA 02111-1307, USA. */
|
||||||
#include "decl.h"
|
#include "decl.h"
|
||||||
#include "lex.h"
|
#include "lex.h"
|
||||||
#include "output.h"
|
#include "output.h"
|
||||||
#include "defaults.h"
|
|
||||||
|
|
||||||
extern tree get_file_function_name ();
|
extern tree get_file_function_name ();
|
||||||
extern tree cleanups_this_call;
|
extern tree cleanups_this_call;
|
||||||
|
@ -369,6 +368,12 @@ int flag_check_new;
|
||||||
|
|
||||||
int flag_new_for_scope = 1;
|
int flag_new_for_scope = 1;
|
||||||
|
|
||||||
|
/* Nonzero if we want to emit defined symbols with common-like linkage as
|
||||||
|
weak symbols where possible, in order to conform to C++ semantics.
|
||||||
|
Otherwise, emit them as local symbols. */
|
||||||
|
|
||||||
|
int flag_weak = 1;
|
||||||
|
|
||||||
/* Table of language-dependent -f options.
|
/* Table of language-dependent -f options.
|
||||||
STRING is the option name. VARIABLE is the address of the variable.
|
STRING is the option name. VARIABLE is the address of the variable.
|
||||||
ON_VALUE is the value to store in VARIABLE
|
ON_VALUE is the value to store in VARIABLE
|
||||||
|
@ -416,7 +421,8 @@ static struct { char *string; int *variable; int on_value;} lang_f_options[] =
|
||||||
{"operator-names", &flag_operator_names, 1},
|
{"operator-names", &flag_operator_names, 1},
|
||||||
{"check-new", &flag_check_new, 1},
|
{"check-new", &flag_check_new, 1},
|
||||||
{"repo", &flag_use_repository, 1},
|
{"repo", &flag_use_repository, 1},
|
||||||
{"for-scope", &flag_new_for_scope, 2}
|
{"for-scope", &flag_new_for_scope, 2},
|
||||||
|
{"weak", &flag_weak, 1}
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Decode the string P as a language-specific option.
|
/* Decode the string P as a language-specific option.
|
||||||
|
@ -906,7 +912,7 @@ grokclassfn (ctype, cname, function, flags, quals)
|
||||||
/* Mark the artificial `__in_chrg' parameter as "artificial". */
|
/* Mark the artificial `__in_chrg' parameter as "artificial". */
|
||||||
SET_DECL_ARTIFICIAL (parm);
|
SET_DECL_ARTIFICIAL (parm);
|
||||||
DECL_ARG_TYPE (parm) = integer_type_node;
|
DECL_ARG_TYPE (parm) = integer_type_node;
|
||||||
DECL_REGISTER (parm) = 1;
|
TREE_READONLY (parm) = 1;
|
||||||
TREE_CHAIN (parm) = last_function_parms;
|
TREE_CHAIN (parm) = last_function_parms;
|
||||||
last_function_parms = parm;
|
last_function_parms = parm;
|
||||||
}
|
}
|
||||||
|
@ -948,18 +954,11 @@ grokclassfn (ctype, cname, function, flags, quals)
|
||||||
buf[len] = '\0';
|
buf[len] = '\0';
|
||||||
strcat (buf, dbuf);
|
strcat (buf, dbuf);
|
||||||
DECL_ASSEMBLER_NAME (function) = get_identifier (buf);
|
DECL_ASSEMBLER_NAME (function) = get_identifier (buf);
|
||||||
parm = build_decl (PARM_DECL, in_charge_identifier, const_integer_type);
|
parm = build_decl (PARM_DECL, in_charge_identifier, integer_type_node);
|
||||||
/* Mark the artificial `__in_chrg' parameter as "artificial". */
|
/* Mark the artificial `__in_chrg' parameter as "artificial". */
|
||||||
SET_DECL_ARTIFICIAL (parm);
|
SET_DECL_ARTIFICIAL (parm);
|
||||||
TREE_USED (parm) = 1;
|
|
||||||
#if 0
|
|
||||||
/* We don't need to mark the __in_chrg parameter itself as `const'
|
|
||||||
since its type is already `const int'. In fact we MUST NOT mark
|
|
||||||
it as `const' cuz that will screw up the debug info (causing it
|
|
||||||
to say that the type of __in_chrg is `const const int'). */
|
|
||||||
TREE_READONLY (parm) = 1;
|
TREE_READONLY (parm) = 1;
|
||||||
#endif
|
DECL_ARG_TYPE (parm) = integer_type_node;
|
||||||
DECL_ARG_TYPE (parm) = const_integer_type;
|
|
||||||
/* This is the same chain as DECL_ARGUMENTS (...). */
|
/* This is the same chain as DECL_ARGUMENTS (...). */
|
||||||
TREE_CHAIN (last_function_parms) = parm;
|
TREE_CHAIN (last_function_parms) = parm;
|
||||||
|
|
||||||
|
@ -2030,7 +2029,7 @@ constructor_name_full (thing)
|
||||||
if (IS_AGGR_TYPE_CODE (TREE_CODE (thing)))
|
if (IS_AGGR_TYPE_CODE (TREE_CODE (thing)))
|
||||||
{
|
{
|
||||||
if (TYPE_WAS_ANONYMOUS (thing) && TYPE_HAS_CONSTRUCTOR (thing))
|
if (TYPE_WAS_ANONYMOUS (thing) && TYPE_HAS_CONSTRUCTOR (thing))
|
||||||
thing = DECL_NAME (TREE_VEC_ELT (TYPE_METHODS (thing), 0));
|
thing = DECL_NAME (TREE_VEC_ELT (CLASSTYPE_METHOD_VEC (thing), 0));
|
||||||
else
|
else
|
||||||
thing = TYPE_NAME (thing);
|
thing = TYPE_NAME (thing);
|
||||||
}
|
}
|
||||||
|
@ -2479,6 +2478,8 @@ coerce_delete_type (type)
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern tree abort_fndecl;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mark_vtable_entries (decl)
|
mark_vtable_entries (decl)
|
||||||
tree decl;
|
tree decl;
|
||||||
|
@ -2489,16 +2490,12 @@ mark_vtable_entries (decl)
|
||||||
|
|
||||||
for (; entries; entries = TREE_CHAIN (entries))
|
for (; entries; entries = TREE_CHAIN (entries))
|
||||||
{
|
{
|
||||||
tree fnaddr = FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (entries));
|
tree fnaddr = (flag_vtable_thunks ? TREE_VALUE (entries)
|
||||||
|
: FNADDR_FROM_VTABLE_ENTRY (TREE_VALUE (entries)));
|
||||||
tree fn = TREE_OPERAND (fnaddr, 0);
|
tree fn = TREE_OPERAND (fnaddr, 0);
|
||||||
TREE_ADDRESSABLE (fn) = 1;
|
TREE_ADDRESSABLE (fn) = 1;
|
||||||
if (DECL_ABSTRACT_VIRTUAL_P (fn))
|
if (DECL_LANG_SPECIFIC (fn) && DECL_ABSTRACT_VIRTUAL_P (fn))
|
||||||
{
|
TREE_OPERAND (fnaddr, 0) = fn = abort_fndecl;
|
||||||
extern tree abort_fndecl;
|
|
||||||
if (flag_vtable_thunks)
|
|
||||||
fnaddr = TREE_VALUE (entries);
|
|
||||||
TREE_OPERAND (fnaddr, 0) = fn = abort_fndecl;
|
|
||||||
}
|
|
||||||
assemble_external (fn);
|
assemble_external (fn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2541,8 +2538,8 @@ import_export_vtable (decl, type, final)
|
||||||
if (! found && ! final)
|
if (! found && ! final)
|
||||||
{
|
{
|
||||||
tree method;
|
tree method;
|
||||||
for (method = CLASSTYPE_METHODS (type); method != NULL_TREE;
|
for (method = TYPE_METHODS (type); method != NULL_TREE;
|
||||||
method = DECL_NEXT_METHOD (method))
|
method = TREE_CHAIN (method))
|
||||||
if (DECL_VINDEX (method) != NULL_TREE
|
if (DECL_VINDEX (method) != NULL_TREE
|
||||||
&& ! DECL_THIS_INLINE (method)
|
&& ! DECL_THIS_INLINE (method)
|
||||||
&& ! DECL_ABSTRACT_VIRTUAL_P (method))
|
&& ! DECL_ABSTRACT_VIRTUAL_P (method))
|
||||||
|
@ -2558,7 +2555,7 @@ import_export_vtable (decl, type, final)
|
||||||
if (TREE_PUBLIC (decl))
|
if (TREE_PUBLIC (decl))
|
||||||
cp_error ("all virtual functions redeclared inline");
|
cp_error ("all virtual functions redeclared inline");
|
||||||
#endif
|
#endif
|
||||||
if (SUPPORTS_WEAK)
|
if (flag_weak)
|
||||||
DECL_WEAK (decl) = 1;
|
DECL_WEAK (decl) = 1;
|
||||||
else
|
else
|
||||||
TREE_PUBLIC (decl) = 0;
|
TREE_PUBLIC (decl) = 0;
|
||||||
|
@ -2597,8 +2594,8 @@ finish_prevtable_vardecl (prev, vars)
|
||||||
&& ! CLASSTYPE_TEMPLATE_INSTANTIATION (ctype))
|
&& ! CLASSTYPE_TEMPLATE_INSTANTIATION (ctype))
|
||||||
{
|
{
|
||||||
tree method;
|
tree method;
|
||||||
for (method = CLASSTYPE_METHODS (ctype); method != NULL_TREE;
|
for (method = TYPE_METHODS (ctype); method != NULL_TREE;
|
||||||
method = DECL_NEXT_METHOD (method))
|
method = TREE_CHAIN (method))
|
||||||
{
|
{
|
||||||
if (DECL_VINDEX (method) != NULL_TREE
|
if (DECL_VINDEX (method) != NULL_TREE
|
||||||
&& !DECL_THIS_INLINE (method)
|
&& !DECL_THIS_INLINE (method)
|
||||||
|
@ -2782,7 +2779,7 @@ import_export_inline (decl)
|
||||||
{
|
{
|
||||||
if (DECL_IMPLICIT_INSTANTIATION (decl) && flag_implicit_templates)
|
if (DECL_IMPLICIT_INSTANTIATION (decl) && flag_implicit_templates)
|
||||||
{
|
{
|
||||||
if (SUPPORTS_WEAK)
|
if (flag_weak)
|
||||||
DECL_WEAK (decl) = 1;
|
DECL_WEAK (decl) = 1;
|
||||||
else
|
else
|
||||||
TREE_PUBLIC (decl) = 0;
|
TREE_PUBLIC (decl) = 0;
|
||||||
|
@ -2799,14 +2796,14 @@ import_export_inline (decl)
|
||||||
= ! (CLASSTYPE_INTERFACE_ONLY (ctype)
|
= ! (CLASSTYPE_INTERFACE_ONLY (ctype)
|
||||||
|| (DECL_THIS_INLINE (decl) && ! flag_implement_inlines));
|
|| (DECL_THIS_INLINE (decl) && ! flag_implement_inlines));
|
||||||
}
|
}
|
||||||
else if (SUPPORTS_WEAK)
|
else if (flag_weak)
|
||||||
DECL_WEAK (decl) = 1;
|
DECL_WEAK (decl) = 1;
|
||||||
else
|
else
|
||||||
TREE_PUBLIC (decl) = 0;
|
TREE_PUBLIC (decl) = 0;
|
||||||
}
|
}
|
||||||
else if (DECL_C_STATIC (decl))
|
else if (DECL_C_STATIC (decl))
|
||||||
TREE_PUBLIC (decl) = 0;
|
TREE_PUBLIC (decl) = 0;
|
||||||
else if (SUPPORTS_WEAK)
|
else if (flag_weak)
|
||||||
DECL_WEAK (decl) = 1;
|
DECL_WEAK (decl) = 1;
|
||||||
else
|
else
|
||||||
TREE_PUBLIC (decl) = 0;
|
TREE_PUBLIC (decl) = 0;
|
||||||
|
@ -2814,6 +2811,26 @@ import_export_inline (decl)
|
||||||
DECL_INTERFACE_KNOWN (decl) = 1;
|
DECL_INTERFACE_KNOWN (decl) = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tree
|
||||||
|
build_cleanup (decl)
|
||||||
|
tree decl;
|
||||||
|
{
|
||||||
|
tree temp;
|
||||||
|
tree type = TREE_TYPE (decl);
|
||||||
|
|
||||||
|
if (TREE_CODE (type) == ARRAY_TYPE)
|
||||||
|
temp = decl;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mark_addressable (decl);
|
||||||
|
temp = build1 (ADDR_EXPR, build_pointer_type (type), decl);
|
||||||
|
}
|
||||||
|
temp = build_delete (TREE_TYPE (temp), temp,
|
||||||
|
integer_two_node,
|
||||||
|
LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0);
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
extern int parse_time, varconst_time;
|
extern int parse_time, varconst_time;
|
||||||
|
|
||||||
#define TIMEVAR(VAR, BODY) \
|
#define TIMEVAR(VAR, BODY) \
|
||||||
|
@ -2895,14 +2912,12 @@ finish_file ()
|
||||||
{
|
{
|
||||||
tree decl = TREE_VALUE (vars);
|
tree decl = TREE_VALUE (vars);
|
||||||
tree type = TREE_TYPE (decl);
|
tree type = TREE_TYPE (decl);
|
||||||
if (TYPE_NEEDS_DESTRUCTOR (type))
|
if (TYPE_NEEDS_DESTRUCTOR (type) && ! TREE_STATIC (vars))
|
||||||
{
|
{
|
||||||
needs_cleaning = 1;
|
needs_cleaning = 1;
|
||||||
needs_messing_up = 1;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
needs_messing_up |= TYPE_NEEDS_CONSTRUCTING (type);
|
|
||||||
vars = TREE_CHAIN (vars);
|
vars = TREE_CHAIN (vars);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2930,23 +2945,10 @@ finish_file ()
|
||||||
tree type = TREE_TYPE (decl);
|
tree type = TREE_TYPE (decl);
|
||||||
tree temp = TREE_PURPOSE (vars);
|
tree temp = TREE_PURPOSE (vars);
|
||||||
|
|
||||||
if (TYPE_NEEDS_DESTRUCTOR (type))
|
if (TYPE_NEEDS_DESTRUCTOR (type) && ! TREE_STATIC (vars))
|
||||||
{
|
{
|
||||||
if (TREE_STATIC (vars))
|
temp = build_cleanup (decl);
|
||||||
expand_start_cond (build_binary_op (NE_EXPR, temp, integer_zero_node, 1), 0);
|
|
||||||
if (TREE_CODE (type) == ARRAY_TYPE)
|
|
||||||
temp = decl;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mark_addressable (decl);
|
|
||||||
temp = build1 (ADDR_EXPR, build_pointer_type (type), decl);
|
|
||||||
}
|
|
||||||
temp = build_delete (TREE_TYPE (temp), temp,
|
|
||||||
integer_two_node, LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR, 0);
|
|
||||||
expand_expr_stmt (temp);
|
expand_expr_stmt (temp);
|
||||||
|
|
||||||
if (TREE_STATIC (vars))
|
|
||||||
expand_end_cond ();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2987,9 +2989,15 @@ finish_file ()
|
||||||
|
|
||||||
while (vars)
|
while (vars)
|
||||||
{
|
{
|
||||||
|
extern int temp_slot_level;
|
||||||
|
extern int target_temp_slot_level;
|
||||||
tree decl = TREE_VALUE (vars);
|
tree decl = TREE_VALUE (vars);
|
||||||
tree init = TREE_PURPOSE (vars);
|
tree init = TREE_PURPOSE (vars);
|
||||||
tree old_cleanups = cleanups_this_call;
|
tree old_cleanups = cleanups_this_call;
|
||||||
|
int old_temp_level = target_temp_slot_level;
|
||||||
|
push_temp_slots ();
|
||||||
|
push_temp_slots ();
|
||||||
|
target_temp_slot_level = temp_slot_level;
|
||||||
|
|
||||||
/* If this was a static attribute within some function's scope,
|
/* If this was a static attribute within some function's scope,
|
||||||
then don't initialize it here. Also, don't bother
|
then don't initialize it here. Also, don't bother
|
||||||
|
@ -3024,7 +3032,6 @@ finish_file ()
|
||||||
TREE_VEC_ELT (init, 1),
|
TREE_VEC_ELT (init, 1),
|
||||||
TREE_VEC_ELT (init, 2), 0),
|
TREE_VEC_ELT (init, 2), 0),
|
||||||
const0_rtx, VOIDmode, 0);
|
const0_rtx, VOIDmode, 0);
|
||||||
free_temp_slots ();
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
expand_assignment (decl, init, 0, 0);
|
expand_assignment (decl, init, 0, 0);
|
||||||
|
@ -3037,14 +3044,12 @@ finish_file ()
|
||||||
{
|
{
|
||||||
/* a `new' expression at top level. */
|
/* a `new' expression at top level. */
|
||||||
expand_expr (decl, const0_rtx, VOIDmode, 0);
|
expand_expr (decl, const0_rtx, VOIDmode, 0);
|
||||||
free_temp_slots ();
|
|
||||||
if (TREE_CODE (init) == TREE_VEC)
|
if (TREE_CODE (init) == TREE_VEC)
|
||||||
{
|
{
|
||||||
expand_expr (expand_vec_init (decl, TREE_VEC_ELT (init, 0),
|
expand_expr (expand_vec_init (decl, TREE_VEC_ELT (init, 0),
|
||||||
TREE_VEC_ELT (init, 1),
|
TREE_VEC_ELT (init, 1),
|
||||||
TREE_VEC_ELT (init, 2), 0),
|
TREE_VEC_ELT (init, 2), 0),
|
||||||
const0_rtx, VOIDmode, 0);
|
const0_rtx, VOIDmode, 0);
|
||||||
free_temp_slots ();
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
expand_aggr_init (build_indirect_ref (decl, NULL_PTR), init, 0, 0);
|
expand_aggr_init (build_indirect_ref (decl, NULL_PTR), init, 0, 0);
|
||||||
|
@ -3053,9 +3058,14 @@ finish_file ()
|
||||||
else if (decl == error_mark_node)
|
else if (decl == error_mark_node)
|
||||||
;
|
;
|
||||||
else my_friendly_abort (22);
|
else my_friendly_abort (22);
|
||||||
vars = TREE_CHAIN (vars);
|
|
||||||
/* Cleanup any temporaries needed for the initial value. */
|
/* Cleanup any temporaries needed for the initial value. */
|
||||||
expand_cleanups_to (old_cleanups);
|
expand_cleanups_to (old_cleanups);
|
||||||
|
pop_temp_slots ();
|
||||||
|
pop_temp_slots ();
|
||||||
|
target_temp_slot_level = old_temp_level;
|
||||||
|
|
||||||
|
vars = TREE_CHAIN (vars);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; static_ctors; static_ctors = TREE_CHAIN (static_ctors))
|
for (; static_ctors; static_ctors = TREE_CHAIN (static_ctors))
|
||||||
|
@ -3509,3 +3519,11 @@ check_default_args (x)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mark_used (decl)
|
||||||
|
tree decl;
|
||||||
|
{
|
||||||
|
TREE_USED (decl) = 1;
|
||||||
|
assemble_external (decl);
|
||||||
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@ Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "tree.h"
|
#include "tree.h"
|
||||||
|
#include <stdio.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
/* cp_printer is the type of a function which converts an argument into
|
/* cp_printer is the type of a function which converts an argument into
|
||||||
|
@ -195,8 +196,7 @@ cp_sprintf (format, arglist)
|
||||||
char *format;
|
char *format;
|
||||||
arglist_dcl
|
arglist_dcl
|
||||||
{
|
{
|
||||||
extern errorfn sprintf;
|
cp_thing ((errorfn *) sprintf, 0, format, arglist);
|
||||||
cp_thing (sprintf, 0, format, arglist);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -950,12 +950,12 @@ dump_expr (t, nop)
|
||||||
}
|
}
|
||||||
else if (type == boolean_type_node)
|
else if (type == boolean_type_node)
|
||||||
{
|
{
|
||||||
if (t == boolean_false_node)
|
if (t == boolean_false_node
|
||||||
|
|| (TREE_INT_CST_LOW (t) == 0
|
||||||
|
&& TREE_INT_CST_HIGH (t) == 0))
|
||||||
OB_PUTS ("false");
|
OB_PUTS ("false");
|
||||||
else if (t == boolean_true_node)
|
else if (t == boolean_true_node)
|
||||||
OB_PUTS ("true");
|
OB_PUTS ("true");
|
||||||
else
|
|
||||||
my_friendly_abort (366);
|
|
||||||
}
|
}
|
||||||
else if (type == char_type_node)
|
else if (type == char_type_node)
|
||||||
{
|
{
|
||||||
|
|
216
gcc/cp/except.c
216
gcc/cp/except.c
|
@ -264,6 +264,8 @@ static tree Unwind;
|
||||||
/* holds a ready to emit call to "terminate ()". */
|
/* holds a ready to emit call to "terminate ()". */
|
||||||
static tree TerminateFunctionCall;
|
static tree TerminateFunctionCall;
|
||||||
|
|
||||||
|
static tree empty_fndecl;
|
||||||
|
|
||||||
/* ====================================================================== */
|
/* ====================================================================== */
|
||||||
|
|
||||||
|
|
||||||
|
@ -275,7 +277,10 @@ static tree TerminateFunctionCall;
|
||||||
/* =================================================================== */
|
/* =================================================================== */
|
||||||
|
|
||||||
struct labelNode {
|
struct labelNode {
|
||||||
rtx label;
|
union {
|
||||||
|
rtx rlabel;
|
||||||
|
tree tlabel;
|
||||||
|
} u;
|
||||||
struct labelNode *chain;
|
struct labelNode *chain;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -319,6 +324,8 @@ tree saved_pc;
|
||||||
tree saved_throw_type;
|
tree saved_throw_type;
|
||||||
/* Holds the value being thrown. */
|
/* Holds the value being thrown. */
|
||||||
tree saved_throw_value;
|
tree saved_throw_value;
|
||||||
|
/* Holds the cleanup for the value being thrown. */
|
||||||
|
tree saved_cleanup;
|
||||||
|
|
||||||
int throw_used;
|
int throw_used;
|
||||||
|
|
||||||
|
@ -339,9 +346,9 @@ static rtx push_eh_entry PROTO((struct ehStack *stack));
|
||||||
static struct ehEntry *dequeue_eh_entry PROTO((struct ehQueue *queue));
|
static struct ehEntry *dequeue_eh_entry PROTO((struct ehQueue *queue));
|
||||||
static void new_eh_queue PROTO((struct ehQueue *queue));
|
static void new_eh_queue PROTO((struct ehQueue *queue));
|
||||||
static void new_eh_stack PROTO((struct ehStack *stack));
|
static void new_eh_stack PROTO((struct ehStack *stack));
|
||||||
static void push_label_entry PROTO((struct labelNode **labelstack, rtx label));
|
static void push_label_entry PROTO((struct labelNode **labelstack, rtx rlabel, tree tlabel));
|
||||||
static rtx pop_label_entry PROTO((struct labelNode **labelstack));
|
static rtx pop_label_entry PROTO((struct labelNode **labelstack));
|
||||||
static rtx top_label_entry PROTO((struct labelNode **labelstack));
|
static tree top_label_entry PROTO((struct labelNode **labelstack));
|
||||||
static struct ehEntry *copy_eh_entry PROTO((struct ehEntry *entry));
|
static struct ehEntry *copy_eh_entry PROTO((struct ehEntry *entry));
|
||||||
|
|
||||||
|
|
||||||
|
@ -351,13 +358,17 @@ static struct ehEntry *copy_eh_entry PROTO((struct ehEntry *entry));
|
||||||
========================================================================= */
|
========================================================================= */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
push_label_entry (labelstack, label)
|
push_label_entry (labelstack, rlabel, tlabel)
|
||||||
struct labelNode **labelstack;
|
struct labelNode **labelstack;
|
||||||
rtx label;
|
rtx rlabel;
|
||||||
|
tree tlabel;
|
||||||
{
|
{
|
||||||
struct labelNode *newnode=(struct labelNode*)xmalloc (sizeof (struct labelNode));
|
struct labelNode *newnode=(struct labelNode*)xmalloc (sizeof (struct labelNode));
|
||||||
|
|
||||||
newnode->label = label;
|
if (rlabel)
|
||||||
|
newnode->u.rlabel = rlabel;
|
||||||
|
else
|
||||||
|
newnode->u.tlabel = tlabel;
|
||||||
newnode->chain = *labelstack;
|
newnode->chain = *labelstack;
|
||||||
*labelstack = newnode;
|
*labelstack = newnode;
|
||||||
}
|
}
|
||||||
|
@ -372,20 +383,20 @@ pop_label_entry (labelstack)
|
||||||
if (! *labelstack) return NULL_RTX;
|
if (! *labelstack) return NULL_RTX;
|
||||||
|
|
||||||
tempnode = *labelstack;
|
tempnode = *labelstack;
|
||||||
label = tempnode->label;
|
label = tempnode->u.rlabel;
|
||||||
*labelstack = (*labelstack)->chain;
|
*labelstack = (*labelstack)->chain;
|
||||||
free (tempnode);
|
free (tempnode);
|
||||||
|
|
||||||
return label;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
static rtx
|
static tree
|
||||||
top_label_entry (labelstack)
|
top_label_entry (labelstack)
|
||||||
struct labelNode **labelstack;
|
struct labelNode **labelstack;
|
||||||
{
|
{
|
||||||
if (! *labelstack) return NULL_RTX;
|
if (! *labelstack) return NULL_TREE;
|
||||||
|
|
||||||
return (*labelstack)->label;
|
return (*labelstack)->u.tlabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Push to permanent obstack for rtl generation.
|
/* Push to permanent obstack for rtl generation.
|
||||||
|
@ -623,41 +634,39 @@ init_exception_processing ()
|
||||||
push_lang_context (lang_name_c);
|
push_lang_context (lang_name_c);
|
||||||
|
|
||||||
catch_match_fndecl =
|
catch_match_fndecl =
|
||||||
define_function (flag_rtti
|
builtin_function (flag_rtti
|
||||||
? "__throw_type_match_rtti"
|
? "__throw_type_match_rtti"
|
||||||
: "__throw_type_match",
|
: "__throw_type_match",
|
||||||
build_function_type (ptr_type_node,
|
build_function_type (ptr_type_node,
|
||||||
tree_cons (NULL_TREE, ptr_type_node,
|
tree_cons (NULL_TREE, ptr_type_node,
|
||||||
tree_cons (NULL_TREE, ptr_type_node,
|
tree_cons (NULL_TREE, ptr_type_node,
|
||||||
tree_cons (NULL_TREE, ptr_type_node,
|
tree_cons (NULL_TREE, ptr_type_node,
|
||||||
void_list_node)))),
|
void_list_node)))),
|
||||||
NOT_BUILT_IN,
|
NOT_BUILT_IN, NULL_PTR);
|
||||||
pushdecl,
|
|
||||||
0);
|
|
||||||
find_first_exception_match_fndecl =
|
find_first_exception_match_fndecl =
|
||||||
define_function ("__find_first_exception_table_match",
|
builtin_function ("__find_first_exception_table_match",
|
||||||
build_function_type (ptr_type_node,
|
build_function_type (ptr_type_node,
|
||||||
tree_cons (NULL_TREE, ptr_type_node,
|
tree_cons (NULL_TREE, ptr_type_node,
|
||||||
void_list_node)),
|
void_list_node)),
|
||||||
NOT_BUILT_IN,
|
NOT_BUILT_IN, NULL_PTR);
|
||||||
pushdecl,
|
|
||||||
0);
|
|
||||||
unwind_fndecl =
|
unwind_fndecl =
|
||||||
define_function ("__unwind_function",
|
builtin_function ("__unwind_function",
|
||||||
build_function_type (void_type_node,
|
build_function_type (void_type_node,
|
||||||
tree_cons (NULL_TREE, ptr_type_node,
|
tree_cons (NULL_TREE, ptr_type_node,
|
||||||
void_list_node)),
|
void_list_node)),
|
||||||
NOT_BUILT_IN,
|
NOT_BUILT_IN, NULL_PTR);
|
||||||
pushdecl,
|
|
||||||
0);
|
|
||||||
throw_fndecl =
|
throw_fndecl =
|
||||||
define_function ("__throw",
|
builtin_function ("__throw",
|
||||||
build_function_type (void_type_node, void_list_node),
|
build_function_type (void_type_node, void_list_node),
|
||||||
NOT_BUILT_IN,
|
NOT_BUILT_IN, NULL_PTR);
|
||||||
pushdecl,
|
|
||||||
0);
|
|
||||||
DECL_EXTERNAL (throw_fndecl) = 0;
|
DECL_EXTERNAL (throw_fndecl) = 0;
|
||||||
TREE_PUBLIC (throw_fndecl) = 0;
|
TREE_PUBLIC (throw_fndecl) = 0;
|
||||||
|
empty_fndecl =
|
||||||
|
builtin_function ("__empty",
|
||||||
|
build_function_type (void_type_node, void_list_node),
|
||||||
|
NOT_BUILT_IN, NULL_PTR);
|
||||||
|
DECL_EXTERNAL (empty_fndecl) = 1;
|
||||||
|
TREE_PUBLIC (empty_fndecl) = 1;
|
||||||
|
|
||||||
Unexpected = default_conversion (unexpected_fndecl);
|
Unexpected = default_conversion (unexpected_fndecl);
|
||||||
Terminate = default_conversion (terminate_fndecl);
|
Terminate = default_conversion (terminate_fndecl);
|
||||||
|
@ -697,6 +706,14 @@ init_exception_processing ()
|
||||||
DECL_COMMON (d) = 1;
|
DECL_COMMON (d) = 1;
|
||||||
cp_finish_decl (d, NULL_TREE, NULL_TREE, 0, 0);
|
cp_finish_decl (d, NULL_TREE, NULL_TREE, 0, 0);
|
||||||
saved_throw_value = lookup_name (get_identifier ("__eh_value"), 0);
|
saved_throw_value = lookup_name (get_identifier ("__eh_value"), 0);
|
||||||
|
|
||||||
|
declspecs = tree_cons (NULL_TREE, get_identifier ("void"), NULL_TREE);
|
||||||
|
d = build_parse_node (INDIRECT_REF, get_identifier ("__eh_cleanup"));
|
||||||
|
d = build_parse_node (CALL_EXPR, d, void_list_node, NULL_TREE);
|
||||||
|
d = start_decl (d, declspecs, 0, NULL_TREE);
|
||||||
|
DECL_COMMON (d) = 1;
|
||||||
|
cp_finish_decl (d, NULL_TREE, NULL_TREE, 0, 0);
|
||||||
|
saved_cleanup = lookup_name (get_identifier ("__eh_cleanup"), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* call this to begin a block of unwind protection (ie: when an object is
|
/* call this to begin a block of unwind protection (ie: when an object is
|
||||||
|
@ -759,17 +776,17 @@ void
|
||||||
expand_start_all_catch ()
|
expand_start_all_catch ()
|
||||||
{
|
{
|
||||||
struct ehEntry *entry;
|
struct ehEntry *entry;
|
||||||
rtx label;
|
tree label;
|
||||||
|
|
||||||
if (! doing_eh (1))
|
if (! doing_eh (1))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
emit_line_note (input_filename, lineno);
|
emit_line_note (input_filename, lineno);
|
||||||
label = gen_label_rtx ();
|
label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
|
||||||
|
|
||||||
/* The label for the exception handling block we will save. This is
|
/* The label for the exception handling block we will save. This is
|
||||||
Lresume, in the documention. */
|
Lresume, in the documention. */
|
||||||
emit_label (label);
|
expand_label (label);
|
||||||
|
|
||||||
/* Put in something that takes up space, as otherwise the end
|
/* Put in something that takes up space, as otherwise the end
|
||||||
address for the EH region could have the exact same address as
|
address for the EH region could have the exact same address as
|
||||||
|
@ -778,7 +795,7 @@ expand_start_all_catch ()
|
||||||
region. */
|
region. */
|
||||||
emit_insn (gen_nop ());
|
emit_insn (gen_nop ());
|
||||||
|
|
||||||
push_label_entry (&caught_return_label_stack, label);
|
push_label_entry (&caught_return_label_stack, NULL_RTX, label);
|
||||||
|
|
||||||
/* Start a new sequence for all the catch blocks. We will add this
|
/* Start a new sequence for all the catch blocks. We will add this
|
||||||
to the gloabl sequence catch_clauses, when we have completed all
|
to the gloabl sequence catch_clauses, when we have completed all
|
||||||
|
@ -821,7 +838,7 @@ expand_end_all_catch ()
|
||||||
documentation. */
|
documentation. */
|
||||||
expand_internal_throw (gen_rtx (LABEL_REF,
|
expand_internal_throw (gen_rtx (LABEL_REF,
|
||||||
Pmode,
|
Pmode,
|
||||||
top_label_entry (&caught_return_label_stack)));
|
DECL_RTL (top_label_entry (&caught_return_label_stack))));
|
||||||
|
|
||||||
/* Now we have the complete catch sequence. */
|
/* Now we have the complete catch sequence. */
|
||||||
new_catch_clause = get_insns ();
|
new_catch_clause = get_insns ();
|
||||||
|
@ -884,6 +901,21 @@ build_eh_type (exp)
|
||||||
return build_eh_type_type (TREE_TYPE (exp));
|
return build_eh_type_type (TREE_TYPE (exp));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This routine creates the cleanup for the exception handling object. */
|
||||||
|
void
|
||||||
|
push_eh_cleanup ()
|
||||||
|
{
|
||||||
|
/* All cleanups must last longer than normal. */
|
||||||
|
int yes = suspend_momentary ();
|
||||||
|
|
||||||
|
/* Arrange to do a dynamically scoped cleanup upon exit from this region. */
|
||||||
|
tree cleanup = build_function_call (saved_cleanup, NULL_TREE);
|
||||||
|
cp_expand_decl_cleanup (NULL_TREE, cleanup);
|
||||||
|
|
||||||
|
resume_momentary (yes);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* call this to start a catch block. Typename is the typename, and identifier
|
/* call this to start a catch block. Typename is the typename, and identifier
|
||||||
is the variable to place the object in or NULL if the variable doesn't
|
is the variable to place the object in or NULL if the variable doesn't
|
||||||
matter. If typename is NULL, that means its a "catch (...)" or catch
|
matter. If typename is NULL, that means its a "catch (...)" or catch
|
||||||
|
@ -897,6 +929,7 @@ expand_start_catch_block (declspecs, declarator)
|
||||||
rtx protect_label_rtx;
|
rtx protect_label_rtx;
|
||||||
tree decl = NULL_TREE;
|
tree decl = NULL_TREE;
|
||||||
tree init;
|
tree init;
|
||||||
|
tree cleanup;
|
||||||
|
|
||||||
if (! doing_eh (1))
|
if (! doing_eh (1))
|
||||||
return;
|
return;
|
||||||
|
@ -909,8 +942,8 @@ expand_start_catch_block (declspecs, declarator)
|
||||||
push_rtl_perm ();
|
push_rtl_perm ();
|
||||||
protect_label_rtx = gen_label_rtx ();
|
protect_label_rtx = gen_label_rtx ();
|
||||||
pop_rtl_from_perm ();
|
pop_rtl_from_perm ();
|
||||||
push_label_entry (&false_label_stack, false_label_rtx);
|
push_label_entry (&false_label_stack, false_label_rtx, NULL_TREE);
|
||||||
push_label_entry (&false_label_stack, protect_label_rtx);
|
push_label_entry (&false_label_stack, protect_label_rtx, NULL_TREE);
|
||||||
|
|
||||||
if (declspecs)
|
if (declspecs)
|
||||||
{
|
{
|
||||||
|
@ -952,6 +985,8 @@ expand_start_catch_block (declspecs, declarator)
|
||||||
/* if it returned FALSE, jump over the catch block, else fall into it */
|
/* if it returned FALSE, jump over the catch block, else fall into it */
|
||||||
emit_jump_insn (gen_beq (false_label_rtx));
|
emit_jump_insn (gen_beq (false_label_rtx));
|
||||||
|
|
||||||
|
push_eh_cleanup ();
|
||||||
|
|
||||||
init = convert_from_reference (save_expr (make_tree (init_type, call_rtx)));
|
init = convert_from_reference (save_expr (make_tree (init_type, call_rtx)));
|
||||||
|
|
||||||
/* Do we need the below two lines? */
|
/* Do we need the below two lines? */
|
||||||
|
@ -962,6 +997,8 @@ expand_start_catch_block (declspecs, declarator)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
push_eh_cleanup ();
|
||||||
|
|
||||||
/* Fall into the catch all section. */
|
/* Fall into the catch all section. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1024,7 +1061,7 @@ void expand_end_catch_block ()
|
||||||
/* fall to outside the try statement when done executing handler and
|
/* fall to outside the try statement when done executing handler and
|
||||||
we fall off end of handler. This is jump Lresume in the
|
we fall off end of handler. This is jump Lresume in the
|
||||||
documentation. */
|
documentation. */
|
||||||
emit_jump (top_label_entry (&caught_return_label_stack));
|
expand_goto (top_label_entry (&caught_return_label_stack));
|
||||||
|
|
||||||
/* We end the rethrow protection region as soon as we hit a label. */
|
/* We end the rethrow protection region as soon as we hit a label. */
|
||||||
end_protect_label_rtx = expand_leftover_cleanups ();
|
end_protect_label_rtx = expand_leftover_cleanups ();
|
||||||
|
@ -1039,7 +1076,7 @@ void expand_end_catch_block ()
|
||||||
emit_label (entry.exception_handler_label);
|
emit_label (entry.exception_handler_label);
|
||||||
expand_internal_throw (gen_rtx (LABEL_REF,
|
expand_internal_throw (gen_rtx (LABEL_REF,
|
||||||
Pmode,
|
Pmode,
|
||||||
top_label_entry (&caught_return_label_stack)));
|
DECL_RTL (top_label_entry (&caught_return_label_stack))));
|
||||||
|
|
||||||
/* No associated finalization. */
|
/* No associated finalization. */
|
||||||
entry.finalization = NULL_TREE;
|
entry.finalization = NULL_TREE;
|
||||||
|
@ -1487,6 +1524,51 @@ expand_exception_blocks ()
|
||||||
emit_insns (insns);
|
emit_insns (insns);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tree
|
||||||
|
start_anon_func ()
|
||||||
|
{
|
||||||
|
static int counter = 0;
|
||||||
|
char name[32];
|
||||||
|
tree params;
|
||||||
|
tree t;
|
||||||
|
|
||||||
|
push_cp_function_context (NULL_TREE);
|
||||||
|
push_to_top_level ();
|
||||||
|
|
||||||
|
/* No need to mangle this. */
|
||||||
|
push_lang_context (lang_name_c);
|
||||||
|
|
||||||
|
params = void_list_node;
|
||||||
|
/* tcf stands for throw clean funciton. */
|
||||||
|
sprintf (name, "__tcf_%d", counter++);
|
||||||
|
t = build_parse_node (CALL_EXPR, get_identifier (name), params, NULL_TREE);
|
||||||
|
start_function (decl_tree_cons (NULL_TREE, get_identifier ("static"),
|
||||||
|
void_list_node),
|
||||||
|
t, NULL_TREE, NULL_TREE, 0);
|
||||||
|
store_parm_decls ();
|
||||||
|
pushlevel (0);
|
||||||
|
clear_last_expr ();
|
||||||
|
push_momentary ();
|
||||||
|
expand_start_bindings (0);
|
||||||
|
emit_line_note (input_filename, lineno);
|
||||||
|
|
||||||
|
pop_lang_context ();
|
||||||
|
|
||||||
|
return current_function_decl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
end_anon_func ()
|
||||||
|
{
|
||||||
|
expand_end_bindings (getdecls(), 1, 0);
|
||||||
|
poplevel (1, 0, 0);
|
||||||
|
pop_momentary ();
|
||||||
|
|
||||||
|
finish_function (lineno, 0, 0);
|
||||||
|
|
||||||
|
pop_from_top_level ();
|
||||||
|
pop_cp_function_context (NULL_TREE);
|
||||||
|
}
|
||||||
|
|
||||||
/* call this to expand a throw statement. This follows the following
|
/* call this to expand a throw statement. This follows the following
|
||||||
algorithm:
|
algorithm:
|
||||||
|
@ -1515,7 +1597,7 @@ expand_throw (exp)
|
||||||
if (exp)
|
if (exp)
|
||||||
{
|
{
|
||||||
tree throw_type;
|
tree throw_type;
|
||||||
tree e;
|
tree cleanup = empty_fndecl, e;
|
||||||
|
|
||||||
/* throw expression */
|
/* throw expression */
|
||||||
/* First, decay it. */
|
/* First, decay it. */
|
||||||
|
@ -1528,6 +1610,8 @@ expand_throw (exp)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
rtx cleanup_insns;
|
||||||
|
tree object;
|
||||||
/* Make a copy of the thrown object. WP 15.1.5 */
|
/* Make a copy of the thrown object. WP 15.1.5 */
|
||||||
exp = build_new (NULL_TREE, TREE_TYPE (exp),
|
exp = build_new (NULL_TREE, TREE_TYPE (exp),
|
||||||
build_tree_list (NULL_TREE, exp),
|
build_tree_list (NULL_TREE, exp),
|
||||||
|
@ -1536,14 +1620,44 @@ expand_throw (exp)
|
||||||
if (exp == error_mark_node)
|
if (exp == error_mark_node)
|
||||||
error (" in thrown expression");
|
error (" in thrown expression");
|
||||||
|
|
||||||
throw_type = build_eh_type (build_indirect_ref (exp, NULL_PTR));
|
object = build_indirect_ref (exp, NULL_PTR);
|
||||||
|
throw_type = build_eh_type (object);
|
||||||
|
|
||||||
|
start_sequence ();
|
||||||
|
object = build_reinterpret_cast (TREE_TYPE (exp), saved_throw_value);
|
||||||
|
object = build_indirect_ref (object, NULL_PTR);
|
||||||
|
cleanup = maybe_build_cleanup (object);
|
||||||
|
if (cleanup)
|
||||||
|
expand_expr (cleanup, const0_rtx, VOIDmode, 0);
|
||||||
|
cleanup_insns = get_insns ();
|
||||||
|
end_sequence ();
|
||||||
|
|
||||||
|
if (cleanup && cleanup_insns)
|
||||||
|
{
|
||||||
|
cleanup = start_anon_func ();
|
||||||
|
|
||||||
|
expand_expr (maybe_build_cleanup (object), const0_rtx, VOIDmode, 0);
|
||||||
|
|
||||||
|
end_anon_func ();
|
||||||
|
|
||||||
|
mark_addressable (cleanup);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cleanup = empty_fndecl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
e = build_modify_expr (saved_throw_type, NOP_EXPR, throw_type);
|
e = build_modify_expr (saved_throw_type, NOP_EXPR, throw_type);
|
||||||
expand_expr (e, const0_rtx, VOIDmode, 0);
|
expand_expr (e, const0_rtx, VOIDmode, 0);
|
||||||
|
|
||||||
e = build_modify_expr (saved_throw_value, NOP_EXPR, exp);
|
e = build_modify_expr (saved_throw_value, NOP_EXPR, exp);
|
||||||
e = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (e), e);
|
e = build1 (CLEANUP_POINT_EXPR, TREE_TYPE (e), e);
|
||||||
expand_expr (e, const0_rtx, VOIDmode, 0);
|
expand_expr (e, const0_rtx, VOIDmode, 0);
|
||||||
|
|
||||||
|
cleanup = build_unary_op (ADDR_EXPR, cleanup, 0);
|
||||||
|
cleanup = build_modify_expr (saved_cleanup, NOP_EXPR, cleanup);
|
||||||
|
expand_expr (cleanup, const0_rtx, VOIDmode, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -43,6 +43,8 @@ Boston, MA 02111-1307, USA. */
|
||||||
line. Perhaps this was not intended. */
|
line. Perhaps this was not intended. */
|
||||||
tree current_base_init_list, current_member_init_list;
|
tree current_base_init_list, current_member_init_list;
|
||||||
|
|
||||||
|
extern tree cleanups_this_call;
|
||||||
|
|
||||||
void emit_base_init ();
|
void emit_base_init ();
|
||||||
void check_base_init ();
|
void check_base_init ();
|
||||||
static void expand_aggr_vbase_init ();
|
static void expand_aggr_vbase_init ();
|
||||||
|
@ -160,6 +162,13 @@ perform_member_init (member, name, init, explicit, protect_list)
|
||||||
{
|
{
|
||||||
tree decl;
|
tree decl;
|
||||||
tree type = TREE_TYPE (member);
|
tree type = TREE_TYPE (member);
|
||||||
|
extern int temp_slot_level;
|
||||||
|
extern int target_temp_slot_level;
|
||||||
|
tree old_cleanups = cleanups_this_call;
|
||||||
|
int old_temp_level = target_temp_slot_level;
|
||||||
|
push_temp_slots ();
|
||||||
|
push_temp_slots ();
|
||||||
|
target_temp_slot_level = temp_slot_level;
|
||||||
|
|
||||||
if (TYPE_NEEDS_CONSTRUCTING (type)
|
if (TYPE_NEEDS_CONSTRUCTING (type)
|
||||||
|| (init && TYPE_HAS_CONSTRUCTOR (type)))
|
|| (init && TYPE_HAS_CONSTRUCTOR (type)))
|
||||||
|
@ -219,7 +228,16 @@ perform_member_init (member, name, init, explicit, protect_list)
|
||||||
expand_expr_stmt (build_modify_expr (decl, INIT_EXPR, init));
|
expand_expr_stmt (build_modify_expr (decl, INIT_EXPR, init));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expand_cleanups_to (NULL_TREE);
|
expand_cleanups_to (old_cleanups);
|
||||||
|
pop_temp_slots ();
|
||||||
|
pop_temp_slots ();
|
||||||
|
target_temp_slot_level = old_temp_level;
|
||||||
|
/* There might something left from building the trees. */
|
||||||
|
if (cleanups_this_call)
|
||||||
|
{
|
||||||
|
expand_cleanups_to (NULL_TREE);
|
||||||
|
}
|
||||||
|
free_temp_slots ();
|
||||||
|
|
||||||
if (TYPE_NEEDS_DESTRUCTOR (type))
|
if (TYPE_NEEDS_DESTRUCTOR (type))
|
||||||
{
|
{
|
||||||
|
@ -577,11 +595,28 @@ emit_base_init (t, immediately)
|
||||||
|
|
||||||
if (init != void_list_node)
|
if (init != void_list_node)
|
||||||
{
|
{
|
||||||
|
extern int temp_slot_level;
|
||||||
|
extern int target_temp_slot_level;
|
||||||
|
tree old_cleanups = cleanups_this_call;
|
||||||
|
int old_temp_level = target_temp_slot_level;
|
||||||
|
push_temp_slots ();
|
||||||
|
push_temp_slots ();
|
||||||
|
target_temp_slot_level = temp_slot_level;
|
||||||
|
|
||||||
member = convert_pointer_to_real (base_binfo, current_class_decl);
|
member = convert_pointer_to_real (base_binfo, current_class_decl);
|
||||||
expand_aggr_init_1 (base_binfo, 0,
|
expand_aggr_init_1 (base_binfo, 0,
|
||||||
build_indirect_ref (member, NULL_PTR), init,
|
build_indirect_ref (member, NULL_PTR), init,
|
||||||
BINFO_OFFSET_ZEROP (base_binfo), LOOKUP_NORMAL);
|
BINFO_OFFSET_ZEROP (base_binfo), LOOKUP_NORMAL);
|
||||||
expand_cleanups_to (NULL_TREE);
|
expand_cleanups_to (old_cleanups);
|
||||||
|
pop_temp_slots ();
|
||||||
|
pop_temp_slots ();
|
||||||
|
target_temp_slot_level = old_temp_level;
|
||||||
|
/* There might something left from building the trees. */
|
||||||
|
if (cleanups_this_call)
|
||||||
|
{
|
||||||
|
expand_cleanups_to (NULL_TREE);
|
||||||
|
}
|
||||||
|
free_temp_slots ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo)))
|
if (TYPE_NEEDS_DESTRUCTOR (BINFO_TYPE (base_binfo)))
|
||||||
|
@ -749,11 +784,30 @@ expand_aggr_vbase_init_1 (binfo, exp, addr, init_list)
|
||||||
{
|
{
|
||||||
tree init = purpose_member (binfo, init_list);
|
tree init = purpose_member (binfo, init_list);
|
||||||
tree ref = build_indirect_ref (addr, NULL_PTR);
|
tree ref = build_indirect_ref (addr, NULL_PTR);
|
||||||
|
|
||||||
|
extern int temp_slot_level;
|
||||||
|
extern int target_temp_slot_level;
|
||||||
|
tree old_cleanups = cleanups_this_call;
|
||||||
|
int old_temp_level = target_temp_slot_level;
|
||||||
|
push_temp_slots ();
|
||||||
|
push_temp_slots ();
|
||||||
|
target_temp_slot_level = temp_slot_level;
|
||||||
|
|
||||||
if (init)
|
if (init)
|
||||||
init = TREE_VALUE (init);
|
init = TREE_VALUE (init);
|
||||||
/* Call constructors, but don't set up vtables. */
|
/* Call constructors, but don't set up vtables. */
|
||||||
expand_aggr_init_1 (binfo, exp, ref, init, 0, LOOKUP_COMPLAIN);
|
expand_aggr_init_1 (binfo, exp, ref, init, 0, LOOKUP_COMPLAIN);
|
||||||
expand_cleanups_to (NULL_TREE);
|
|
||||||
|
expand_cleanups_to (old_cleanups);
|
||||||
|
pop_temp_slots ();
|
||||||
|
pop_temp_slots ();
|
||||||
|
target_temp_slot_level = old_temp_level;
|
||||||
|
/* There might something left from building the trees. */
|
||||||
|
if (cleanups_this_call)
|
||||||
|
{
|
||||||
|
expand_cleanups_to (NULL_TREE);
|
||||||
|
}
|
||||||
|
free_temp_slots ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize this object's virtual base class pointers. This must be
|
/* Initialize this object's virtual base class pointers. This must be
|
||||||
|
@ -818,8 +872,7 @@ do_member_init (s_id, name, init)
|
||||||
/* Function to give error message if member initialization specification
|
/* Function to give error message if member initialization specification
|
||||||
is erroneous. FIELD is the member we decided to initialize.
|
is erroneous. FIELD is the member we decided to initialize.
|
||||||
TYPE is the type for which the initialization is being performed.
|
TYPE is the type for which the initialization is being performed.
|
||||||
FIELD must be a member of TYPE, or the base type from which FIELD
|
FIELD must be a member of TYPE.
|
||||||
comes must not need a constructor.
|
|
||||||
|
|
||||||
MEMBER_NAME is the name of the member. */
|
MEMBER_NAME is the name of the member. */
|
||||||
|
|
||||||
|
@ -831,23 +884,12 @@ member_init_ok_or_else (field, type, member_name)
|
||||||
{
|
{
|
||||||
if (field == error_mark_node)
|
if (field == error_mark_node)
|
||||||
return 0;
|
return 0;
|
||||||
if (field == NULL_TREE)
|
if (field == NULL_TREE || DECL_CONTEXT (field) != type)
|
||||||
{
|
{
|
||||||
cp_error ("class `%T' does not have any field named `%s'", type,
|
cp_error ("class `%T' does not have any field named `%s'", type,
|
||||||
member_name);
|
member_name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (DECL_CONTEXT (field) != type
|
|
||||||
&& TYPE_NEEDS_CONSTRUCTING (DECL_CONTEXT (field)))
|
|
||||||
{
|
|
||||||
if (current_function_decl && DECL_CONSTRUCTOR_P (current_function_decl))
|
|
||||||
cp_error ("initialization of `%D' inside constructor for `%T'",
|
|
||||||
field, type);
|
|
||||||
else
|
|
||||||
cp_error ("member `%D' comes from base class needing constructor",
|
|
||||||
field);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (TREE_STATIC (field))
|
if (TREE_STATIC (field))
|
||||||
{
|
{
|
||||||
cp_error ("field `%#D' is static; only point of initialization is its declaration",
|
cp_error ("field `%#D' is static; only point of initialization is its declaration",
|
||||||
|
@ -960,6 +1002,12 @@ expand_member_init (exp, name, init)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (warn_reorder && current_member_init_list)
|
||||||
|
{
|
||||||
|
warning ("base initializer for `%s'", IDENTIFIER_POINTER (name));
|
||||||
|
warning (" will be re-ordered to precede member initializations");
|
||||||
|
}
|
||||||
|
|
||||||
base_init = build_tree_list (name, init);
|
base_init = build_tree_list (name, init);
|
||||||
TREE_TYPE (base_init) = basetype;
|
TREE_TYPE (base_init) = basetype;
|
||||||
current_base_init_list = chainon (current_base_init_list, base_init);
|
current_base_init_list = chainon (current_base_init_list, base_init);
|
||||||
|
@ -1354,12 +1402,15 @@ expand_aggr_init_1 (binfo, true_exp, exp, init, alias_this, flags)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
|
/* This causes testcase return2.C to fail. */
|
||||||
init = TREE_OPERAND (init, 1);
|
init = TREE_OPERAND (init, 1);
|
||||||
init = build (CALL_EXPR, init_type,
|
init = build (CALL_EXPR, init_type,
|
||||||
TREE_OPERAND (init, 0), TREE_OPERAND (init, 1), 0);
|
TREE_OPERAND (init, 0), TREE_OPERAND (init, 1), 0);
|
||||||
TREE_SIDE_EFFECTS (init) = 1;
|
TREE_SIDE_EFFECTS (init) = 1;
|
||||||
if (init_list)
|
if (init_list)
|
||||||
TREE_VALUE (init_list) = init;
|
TREE_VALUE (init_list) = init;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1508,7 +1559,7 @@ expand_aggr_init_1 (binfo, true_exp, exp, init, alias_this, flags)
|
||||||
cp_error ("ambiguity between conversion to `%T' and constructor",
|
cp_error ("ambiguity between conversion to `%T' and constructor",
|
||||||
type);
|
type);
|
||||||
else
|
else
|
||||||
expand_assignment (exp, rval, 0, 0);
|
expand_aggr_init_1 (binfo, true_exp, exp, rval, alias_this, flags);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1920,7 +1971,7 @@ build_offset_ref (cname, name)
|
||||||
if (TREE_CODE (t) == TYPE_DECL || TREE_CODE (t) == VAR_DECL
|
if (TREE_CODE (t) == TYPE_DECL || TREE_CODE (t) == VAR_DECL
|
||||||
|| TREE_CODE (t) == CONST_DECL)
|
|| TREE_CODE (t) == CONST_DECL)
|
||||||
{
|
{
|
||||||
TREE_USED (t) = 1;
|
mark_used (t);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
if (TREE_CODE (t) == FIELD_DECL)
|
if (TREE_CODE (t) == FIELD_DECL)
|
||||||
|
@ -2010,7 +2061,7 @@ build_offset_ref (cname, name)
|
||||||
error ("in this context");
|
error ("in this context");
|
||||||
return error_mark_node;
|
return error_mark_node;
|
||||||
}
|
}
|
||||||
assemble_external (t);
|
mark_used (t);
|
||||||
return build (OFFSET_REF, TREE_TYPE (t), decl, t);
|
return build (OFFSET_REF, TREE_TYPE (t), decl, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2037,8 +2088,10 @@ build_offset_ref (cname, name)
|
||||||
|| ! allocation_temporary_p ()))
|
|| ! allocation_temporary_p ()))
|
||||||
fnfields = copy_list (fnfields);
|
fnfields = copy_list (fnfields);
|
||||||
|
|
||||||
|
#if 0
|
||||||
for (t = TREE_VALUE (fnfields); t; t = DECL_CHAIN (t))
|
for (t = TREE_VALUE (fnfields); t; t = DECL_CHAIN (t))
|
||||||
assemble_external (t);
|
assemble_external (t);
|
||||||
|
#endif
|
||||||
|
|
||||||
t = build_tree_list (error_mark_node, fnfields);
|
t = build_tree_list (error_mark_node, fnfields);
|
||||||
TREE_TYPE (t) = build_offset_type (type, unknown_type_node);
|
TREE_TYPE (t) = build_offset_type (type, unknown_type_node);
|
||||||
|
@ -2070,8 +2123,7 @@ build_offset_ref (cname, name)
|
||||||
values can be returned without further ado. */
|
values can be returned without further ado. */
|
||||||
if (TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == CONST_DECL)
|
if (TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == CONST_DECL)
|
||||||
{
|
{
|
||||||
assemble_external (t);
|
mark_used (t);
|
||||||
TREE_USED (t) = 1;
|
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,8 @@ Boston, MA 02111-1307, USA. */
|
||||||
"-fno-this-is-variable",
|
"-fno-this-is-variable",
|
||||||
"-fvtable-thunks",
|
"-fvtable-thunks",
|
||||||
"-fno-vtable-thunks",
|
"-fno-vtable-thunks",
|
||||||
|
"-fweak",
|
||||||
|
"-fno-weak",
|
||||||
"-fxref",
|
"-fxref",
|
||||||
"-fno-xref",
|
"-fno-xref",
|
||||||
|
|
||||||
|
|
30
gcc/cp/lex.c
30
gcc/cp/lex.c
|
@ -883,24 +883,29 @@ yyprint (file, yychar, yylval)
|
||||||
static int *reduce_count;
|
static int *reduce_count;
|
||||||
int *token_count;
|
int *token_count;
|
||||||
|
|
||||||
|
#if 0
|
||||||
#define REDUCE_LENGTH (sizeof (yyr2) / sizeof (yyr2[0]))
|
#define REDUCE_LENGTH (sizeof (yyr2) / sizeof (yyr2[0]))
|
||||||
#define TOKEN_LENGTH (256 + sizeof (yytname) / sizeof (yytname[0]))
|
#define TOKEN_LENGTH (256 + sizeof (yytname) / sizeof (yytname[0]))
|
||||||
|
#endif
|
||||||
|
|
||||||
int *
|
int *
|
||||||
init_parse ()
|
init_parse ()
|
||||||
{
|
{
|
||||||
#ifdef GATHER_STATISTICS
|
#ifdef GATHER_STATISTICS
|
||||||
|
#ifdef REDUCE_LENGTH
|
||||||
reduce_count = (int *)malloc (sizeof (int) * (REDUCE_LENGTH + 1));
|
reduce_count = (int *)malloc (sizeof (int) * (REDUCE_LENGTH + 1));
|
||||||
bzero (reduce_count, sizeof (int) * (REDUCE_LENGTH + 1));
|
bzero (reduce_count, sizeof (int) * (REDUCE_LENGTH + 1));
|
||||||
reduce_count += 1;
|
reduce_count += 1;
|
||||||
token_count = (int *)malloc (sizeof (int) * (TOKEN_LENGTH + 1));
|
token_count = (int *)malloc (sizeof (int) * (TOKEN_LENGTH + 1));
|
||||||
bzero (token_count, sizeof (int) * (TOKEN_LENGTH + 1));
|
bzero (token_count, sizeof (int) * (TOKEN_LENGTH + 1));
|
||||||
token_count += 1;
|
token_count += 1;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
return token_count;
|
return token_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GATHER_STATISTICS
|
#ifdef GATHER_STATISTICS
|
||||||
|
#ifdef REDUCE_LENGTH
|
||||||
void
|
void
|
||||||
yyhook (yyn)
|
yyhook (yyn)
|
||||||
int yyn;
|
int yyn;
|
||||||
|
@ -922,11 +927,13 @@ token_cmp (p, q)
|
||||||
return token_count[*q] - token_count[*p];
|
return token_count[*q] - token_count[*p];
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
print_parse_statistics ()
|
print_parse_statistics ()
|
||||||
{
|
{
|
||||||
#ifdef GATHER_STATISTICS
|
#ifdef GATHER_STATISTICS
|
||||||
|
#ifdef REDUCE_LENGTH
|
||||||
#if YYDEBUG != 0
|
#if YYDEBUG != 0
|
||||||
int i;
|
int i;
|
||||||
int maxlen = REDUCE_LENGTH;
|
int maxlen = REDUCE_LENGTH;
|
||||||
|
@ -969,6 +976,7 @@ print_parse_statistics ()
|
||||||
fprintf (stderr, "\n");
|
fprintf (stderr, "\n");
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sets the value of the 'yydebug' variable to VALUE.
|
/* Sets the value of the 'yydebug' variable to VALUE.
|
||||||
|
@ -2590,6 +2598,10 @@ linenum:
|
||||||
p->name = input_filename;
|
p->name = input_filename;
|
||||||
input_file_stack = p;
|
input_file_stack = p;
|
||||||
input_file_stack_tick++;
|
input_file_stack_tick++;
|
||||||
|
#ifdef DBX_DEBUGGING_INFO
|
||||||
|
if (write_symbols == DBX_DEBUG)
|
||||||
|
dbxout_start_new_source_file (input_filename);
|
||||||
|
#endif
|
||||||
#ifdef DWARF_DEBUGGING_INFO
|
#ifdef DWARF_DEBUGGING_INFO
|
||||||
if (debug_info_level == DINFO_LEVEL_VERBOSE
|
if (debug_info_level == DINFO_LEVEL_VERBOSE
|
||||||
&& write_symbols == DWARF_DEBUG)
|
&& write_symbols == DWARF_DEBUG)
|
||||||
|
@ -2627,6 +2639,10 @@ linenum:
|
||||||
input_file_stack = p->next;
|
input_file_stack = p->next;
|
||||||
free (p);
|
free (p);
|
||||||
input_file_stack_tick++;
|
input_file_stack_tick++;
|
||||||
|
#ifdef DBX_DEBUGGING_INFO
|
||||||
|
if (write_symbols == DBX_DEBUG)
|
||||||
|
dbxout_resume_previous_source_file ();
|
||||||
|
#endif
|
||||||
#ifdef DWARF_DEBUGGING_INFO
|
#ifdef DWARF_DEBUGGING_INFO
|
||||||
if (debug_info_level == DINFO_LEVEL_VERBOSE
|
if (debug_info_level == DINFO_LEVEL_VERBOSE
|
||||||
&& write_symbols == DWARF_DEBUG)
|
&& write_symbols == DWARF_DEBUG)
|
||||||
|
@ -2872,6 +2888,9 @@ do_identifier (token)
|
||||||
{
|
{
|
||||||
register tree id = lastiddecl;
|
register tree id = lastiddecl;
|
||||||
|
|
||||||
|
if (IDENTIFIER_OPNAME_P (token))
|
||||||
|
id = lookup_name (token, 0);
|
||||||
|
|
||||||
if (yychar == YYEMPTY)
|
if (yychar == YYEMPTY)
|
||||||
yychar = yylex ();
|
yychar = yylex ();
|
||||||
/* Scope class declarations before global
|
/* Scope class declarations before global
|
||||||
|
@ -2920,7 +2939,14 @@ do_identifier (token)
|
||||||
if (id && id != error_mark_node && TREE_TYPE (id) == error_mark_node)
|
if (id && id != error_mark_node && TREE_TYPE (id) == error_mark_node)
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
if (yychar == '(' || yychar == LEFT_RIGHT)
|
|
||||||
|
if (IDENTIFIER_OPNAME_P (token))
|
||||||
|
{
|
||||||
|
if (token != ansi_opname[ERROR_MARK])
|
||||||
|
cp_error ("operator %O not defined", token);
|
||||||
|
id = error_mark_node;
|
||||||
|
}
|
||||||
|
else if (yychar == '(' || yychar == LEFT_RIGHT)
|
||||||
{
|
{
|
||||||
id = implicitly_declare (token);
|
id = implicitly_declare (token);
|
||||||
}
|
}
|
||||||
|
@ -4360,7 +4386,9 @@ real_yylex ()
|
||||||
done:
|
done:
|
||||||
/* yylloc.last_line = lineno; */
|
/* yylloc.last_line = lineno; */
|
||||||
#ifdef GATHER_STATISTICS
|
#ifdef GATHER_STATISTICS
|
||||||
|
#ifdef REDUCE_LENGTH
|
||||||
token_count[value] += 1;
|
token_count[value] += 1;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
|
|
|
@ -178,8 +178,13 @@ report_type_mismatch (cp, parmtypes, name_kind)
|
||||||
/* Happens when the implicit object parameter is rejected. */
|
/* Happens when the implicit object parameter is rejected. */
|
||||||
my_friendly_assert (! TYPE_READONLY (TREE_TYPE (TREE_VALUE (parmtypes))),
|
my_friendly_assert (! TYPE_READONLY (TREE_TYPE (TREE_VALUE (parmtypes))),
|
||||||
241);
|
241);
|
||||||
cp_error ("call to non-const %s `%#D' with const object",
|
if (TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (TREE_VALUE (parmtypes))))
|
||||||
name_kind, cp->function);
|
&& ! TYPE_VOLATILE (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (cp->function))))))
|
||||||
|
cp_error ("call to non-volatile %s `%#D' with volatile object",
|
||||||
|
name_kind, cp->function);
|
||||||
|
else
|
||||||
|
cp_error ("call to non-const %s `%#D' with const object",
|
||||||
|
name_kind, cp->function);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1547,6 +1552,7 @@ hack_identifier (value, name, yychar)
|
||||||
|
|
||||||
if (really_overloaded_fn (value))
|
if (really_overloaded_fn (value))
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
tree t = get_first_fn (value);
|
tree t = get_first_fn (value);
|
||||||
for (; t; t = DECL_CHAIN (t))
|
for (; t; t = DECL_CHAIN (t))
|
||||||
{
|
{
|
||||||
|
@ -1556,22 +1562,20 @@ hack_identifier (value, name, yychar)
|
||||||
assemble_external (t);
|
assemble_external (t);
|
||||||
TREE_USED (t) = 1;
|
TREE_USED (t) = 1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else if (TREE_CODE (value) == TREE_LIST)
|
else if (TREE_CODE (value) == TREE_LIST)
|
||||||
{
|
{
|
||||||
|
/* Ambiguous reference to base members, possibly other cases?. */
|
||||||
tree t = value;
|
tree t = value;
|
||||||
while (t && TREE_CODE (t) == TREE_LIST)
|
while (t && TREE_CODE (t) == TREE_LIST)
|
||||||
{
|
{
|
||||||
assemble_external (TREE_VALUE (t));
|
mark_used (TREE_VALUE (t));
|
||||||
TREE_USED (t) = 1;
|
|
||||||
t = TREE_CHAIN (t);
|
t = TREE_CHAIN (t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
mark_used (value);
|
||||||
assemble_external (value);
|
|
||||||
TREE_USED (value) = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TREE_CODE_CLASS (TREE_CODE (value)) == 'd' && DECL_NONLOCAL (value))
|
if (TREE_CODE_CLASS (TREE_CODE (value)) == 'd' && DECL_NONLOCAL (value))
|
||||||
{
|
{
|
||||||
|
@ -1800,14 +1804,17 @@ make_thunk (function, delta)
|
||||||
}
|
}
|
||||||
if (thunk == NULL_TREE)
|
if (thunk == NULL_TREE)
|
||||||
{
|
{
|
||||||
thunk = build_decl (THUNK_DECL, thunk_id, TREE_TYPE (func_decl));
|
thunk = build_decl (FUNCTION_DECL, thunk_id, TREE_TYPE (func_decl));
|
||||||
DECL_RESULT (thunk)
|
DECL_RESULT (thunk)
|
||||||
= build_decl (RESULT_DECL, 0, TYPE_MAIN_VARIANT (TREE_TYPE (vtable_entry_type)));
|
= build_decl (RESULT_DECL, 0, TYPE_MAIN_VARIANT (TREE_TYPE (vtable_entry_type)));
|
||||||
TREE_READONLY (thunk) = TYPE_READONLY (TREE_TYPE (vtable_entry_type));
|
TREE_READONLY (thunk) = TYPE_READONLY (TREE_TYPE (vtable_entry_type));
|
||||||
TREE_THIS_VOLATILE (thunk) = TYPE_VOLATILE (TREE_TYPE (vtable_entry_type));
|
TREE_THIS_VOLATILE (thunk) = TYPE_VOLATILE (TREE_TYPE (vtable_entry_type));
|
||||||
make_function_rtl (thunk);
|
make_function_rtl (thunk);
|
||||||
|
TREE_SET_CODE (thunk, THUNK_DECL);
|
||||||
DECL_INITIAL (thunk) = function;
|
DECL_INITIAL (thunk) = function;
|
||||||
THUNK_DELTA (thunk) = delta;
|
THUNK_DELTA (thunk) = delta;
|
||||||
|
DECL_EXTERNAL (thunk) = 1;
|
||||||
|
TREE_PUBLIC (thunk) = 1;
|
||||||
/* So that finish_file can write out any thunks that need to be: */
|
/* So that finish_file can write out any thunks that need to be: */
|
||||||
pushdecl_top_level (thunk);
|
pushdecl_top_level (thunk);
|
||||||
}
|
}
|
||||||
|
@ -1845,16 +1852,11 @@ emit_thunk (thunk_fndecl)
|
||||||
|
|
||||||
TREE_ASM_WRITTEN (thunk_fndecl) = 1;
|
TREE_ASM_WRITTEN (thunk_fndecl) = 1;
|
||||||
|
|
||||||
if (TREE_PUBLIC (function))
|
if (! TREE_PUBLIC (function))
|
||||||
{
|
TREE_PUBLIC (thunk_fndecl) = 0;
|
||||||
TREE_PUBLIC (thunk_fndecl) = 1;
|
if (DECL_EXTERNAL (function))
|
||||||
if (DECL_EXTERNAL (function))
|
return;
|
||||||
{
|
DECL_EXTERNAL (thunk_fndecl) = 0;
|
||||||
DECL_EXTERNAL (thunk_fndecl) = 1;
|
|
||||||
assemble_external (thunk_fndecl);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
decl_printable_name = thunk_printable_name;
|
decl_printable_name = thunk_printable_name;
|
||||||
if (current_function_decl)
|
if (current_function_decl)
|
||||||
|
|
|
@ -661,8 +661,9 @@ fn.def1:
|
||||||
reinit_parse_for_function ();
|
reinit_parse_for_function ();
|
||||||
$$ = NULL_TREE; }
|
$$ = NULL_TREE; }
|
||||||
| declmods notype_declarator exception_specification_opt
|
| declmods notype_declarator exception_specification_opt
|
||||||
{ tree specs = strip_attrs ($1);
|
{ tree specs, attrs;
|
||||||
if (! start_function (specs, $2, $3, NULL_TREE, 0))
|
split_specs_attrs ($1, &specs, &attrs);
|
||||||
|
if (! start_function (specs, $2, $3, attrs, 0))
|
||||||
YYERROR1;
|
YYERROR1;
|
||||||
reinit_parse_for_function ();
|
reinit_parse_for_function ();
|
||||||
$$ = NULL_TREE; }
|
$$ = NULL_TREE; }
|
||||||
|
@ -1306,18 +1307,6 @@ primary:
|
||||||
{
|
{
|
||||||
if (TREE_CODE ($$) == BIT_NOT_EXPR)
|
if (TREE_CODE ($$) == BIT_NOT_EXPR)
|
||||||
$$ = build_x_unary_op (BIT_NOT_EXPR, TREE_OPERAND ($$, 0));
|
$$ = build_x_unary_op (BIT_NOT_EXPR, TREE_OPERAND ($$, 0));
|
||||||
else if (IDENTIFIER_OPNAME_P ($$))
|
|
||||||
{
|
|
||||||
tree op = $$;
|
|
||||||
$$ = lookup_name (op, 0);
|
|
||||||
if ($$ == NULL_TREE)
|
|
||||||
{
|
|
||||||
if (op != ansi_opname[ERROR_MARK])
|
|
||||||
error ("operator %s not defined",
|
|
||||||
operator_name_string (op));
|
|
||||||
$$ = error_mark_node;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
$$ = do_identifier ($$);
|
$$ = do_identifier ($$);
|
||||||
}
|
}
|
||||||
|
@ -1531,10 +1520,9 @@ primary:
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (TREE_CODE ($$) == ADDR_EXPR)
|
if (TREE_CODE ($$) == ADDR_EXPR)
|
||||||
assemble_external (TREE_OPERAND ($$, 0));
|
mark_used (TREE_OPERAND ($$, 0));
|
||||||
else
|
else
|
||||||
assemble_external ($$);
|
mark_used ($$);
|
||||||
TREE_USED ($$) = 1;
|
|
||||||
}
|
}
|
||||||
if (TREE_CODE ($$) == CONST_DECL)
|
if (TREE_CODE ($$) == CONST_DECL)
|
||||||
{
|
{
|
||||||
|
@ -3545,6 +3533,9 @@ for.init.statement:
|
||||||
{ if ($1) cplus_expand_expr_stmt ($1); }
|
{ if ($1) cplus_expand_expr_stmt ($1); }
|
||||||
| decl
|
| decl
|
||||||
| '{' compstmtend
|
| '{' compstmtend
|
||||||
|
{ if (pedantic)
|
||||||
|
pedwarn ("ANSI C++ forbids compound statements inside for initializations");
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
/* Either a type-qualifier or nothing. First thing in an `asm' statement. */
|
/* Either a type-qualifier or nothing. First thing in an `asm' statement. */
|
||||||
|
|
|
@ -2400,7 +2400,7 @@ do_pending_expansions ()
|
||||||
if (i->interface == 1)
|
if (i->interface == 1)
|
||||||
/* OK, it was an implicit instantiation. */
|
/* OK, it was an implicit instantiation. */
|
||||||
{
|
{
|
||||||
if (SUPPORTS_WEAK)
|
if (flag_weak)
|
||||||
DECL_WEAK (t) = 1;
|
DECL_WEAK (t) = 1;
|
||||||
else
|
else
|
||||||
TREE_PUBLIC (t) = 0;
|
TREE_PUBLIC (t) = 0;
|
||||||
|
@ -2533,6 +2533,8 @@ do_function_instantiation (declspecs, declarator, storage)
|
||||||
fn = IDENTIFIER_GLOBAL_VALUE (name),
|
fn = IDENTIFIER_GLOBAL_VALUE (name),
|
||||||
fn && DECL_TEMPLATE_INSTANTIATION (fn))
|
fn && DECL_TEMPLATE_INSTANTIATION (fn))
|
||||||
result = fn;
|
result = fn;
|
||||||
|
else if (fn && DECL_CONTEXT (fn))
|
||||||
|
;
|
||||||
else if (name = DECL_NAME (decl), fn = IDENTIFIER_GLOBAL_VALUE (name), fn)
|
else if (name = DECL_NAME (decl), fn = IDENTIFIER_GLOBAL_VALUE (name), fn)
|
||||||
{
|
{
|
||||||
for (fn = get_first_fn (fn); fn; fn = DECL_CHAIN (fn))
|
for (fn = get_first_fn (fn); fn; fn = DECL_CHAIN (fn))
|
||||||
|
|
|
@ -3507,11 +3507,17 @@ static void
|
||||||
add_conversions (binfo)
|
add_conversions (binfo)
|
||||||
tree binfo;
|
tree binfo;
|
||||||
{
|
{
|
||||||
tree tmp = CLASSTYPE_FIRST_CONVERSION (BINFO_TYPE (binfo));
|
int i;
|
||||||
for (; tmp && IDENTIFIER_TYPENAME_P (DECL_NAME (tmp));
|
tree vec = CLASSTYPE_METHOD_VEC (BINFO_TYPE (binfo));
|
||||||
tmp = TREE_CHAIN (tmp))
|
|
||||||
conversions = tree_cons (DECL_NAME (tmp), TREE_TYPE (TREE_TYPE (tmp)),
|
for (i = 1; i < TREE_VEC_LENGTH (vec); ++i)
|
||||||
conversions);
|
{
|
||||||
|
tree tmp = TREE_VEC_ELT (vec, i);
|
||||||
|
if (! IDENTIFIER_TYPENAME_P (DECL_NAME (tmp)))
|
||||||
|
break;
|
||||||
|
conversions = tree_cons (DECL_NAME (tmp), TREE_TYPE (TREE_TYPE (tmp)),
|
||||||
|
conversions);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tree
|
tree
|
||||||
|
|
|
@ -1766,7 +1766,7 @@ build_component_ref (datum, component, basetype_path, protect)
|
||||||
my_friendly_assert (datum != error_mark_node, 310);
|
my_friendly_assert (datum != error_mark_node, 310);
|
||||||
fndecl = build_vfn_ref (&addr, datum, DECL_VINDEX (fndecl));
|
fndecl = build_vfn_ref (&addr, datum, DECL_VINDEX (fndecl));
|
||||||
}
|
}
|
||||||
assemble_external (fndecl);
|
mark_used (fndecl);
|
||||||
return fndecl;
|
return fndecl;
|
||||||
}
|
}
|
||||||
if (access == access_protected)
|
if (access == access_protected)
|
||||||
|
@ -1781,8 +1781,10 @@ build_component_ref (datum, component, basetype_path, protect)
|
||||||
not matter unless we're actually calling the function. */
|
not matter unless we're actually calling the function. */
|
||||||
tree t;
|
tree t;
|
||||||
|
|
||||||
|
#if 0
|
||||||
for (t = TREE_VALUE (fndecls); t; t = DECL_CHAIN (t))
|
for (t = TREE_VALUE (fndecls); t; t = DECL_CHAIN (t))
|
||||||
assemble_external (t);
|
assemble_external (t);
|
||||||
|
#endif
|
||||||
|
|
||||||
t = build_tree_list (error_mark_node, fndecls);
|
t = build_tree_list (error_mark_node, fndecls);
|
||||||
TREE_TYPE (t) = build_offset_type (basetype,
|
TREE_TYPE (t) = build_offset_type (basetype,
|
||||||
|
@ -1809,9 +1811,10 @@ build_component_ref (datum, component, basetype_path, protect)
|
||||||
cp_error ("invalid use of type decl `%#D' as expression", field);
|
cp_error ("invalid use of type decl `%#D' as expression", field);
|
||||||
return error_mark_node;
|
return error_mark_node;
|
||||||
}
|
}
|
||||||
if (DECL_RTL (field) != 0)
|
else if (DECL_RTL (field) != 0)
|
||||||
assemble_external (field);
|
mark_used (field);
|
||||||
TREE_USED (field) = 1;
|
else
|
||||||
|
TREE_USED (field) = 1;
|
||||||
return field;
|
return field;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2347,7 +2350,7 @@ get_member_function_from_ptrfunc (instance_ptrptr, function)
|
||||||
|
|
||||||
/* Save the intermediate result in a SAVE_EXPR so we don't have to
|
/* Save the intermediate result in a SAVE_EXPR so we don't have to
|
||||||
compute each component of the virtual function pointer twice. */
|
compute each component of the virtual function pointer twice. */
|
||||||
if (/* !building_cleanup && */ TREE_CODE (aref) == INDIRECT_REF)
|
if (TREE_CODE (aref) == INDIRECT_REF)
|
||||||
TREE_OPERAND (aref, 0) = save_expr (TREE_OPERAND (aref, 0));
|
TREE_OPERAND (aref, 0) = save_expr (TREE_OPERAND (aref, 0));
|
||||||
|
|
||||||
delta = build_binary_op (PLUS_EXPR,
|
delta = build_binary_op (PLUS_EXPR,
|
||||||
|
@ -2400,7 +2403,7 @@ build_function_call_real (function, params, require_complete, flags)
|
||||||
GNU_xref_call (current_function_decl,
|
GNU_xref_call (current_function_decl,
|
||||||
IDENTIFIER_POINTER (name ? name
|
IDENTIFIER_POINTER (name ? name
|
||||||
: TYPE_IDENTIFIER (DECL_CLASS_CONTEXT (function))));
|
: TYPE_IDENTIFIER (DECL_CLASS_CONTEXT (function))));
|
||||||
assemble_external (function);
|
mark_used (function);
|
||||||
fndecl = function;
|
fndecl = function;
|
||||||
|
|
||||||
/* Convert anything with function type to a pointer-to-function. */
|
/* Convert anything with function type to a pointer-to-function. */
|
||||||
|
@ -2426,8 +2429,7 @@ build_function_call_real (function, params, require_complete, flags)
|
||||||
if (DECL_INLINE (function))
|
if (DECL_INLINE (function))
|
||||||
{
|
{
|
||||||
/* Is it a synthesized method that needs to be synthesized? */
|
/* Is it a synthesized method that needs to be synthesized? */
|
||||||
if (DECL_ARTIFICIAL (function) && ! flag_no_inline
|
if (DECL_ARTIFICIAL (function) && ! DECL_INITIAL (function)
|
||||||
&& ! DECL_INITIAL (function)
|
|
||||||
/* Kludge: don't synthesize for default args. */
|
/* Kludge: don't synthesize for default args. */
|
||||||
&& current_function_decl)
|
&& current_function_decl)
|
||||||
synthesize_method (function);
|
synthesize_method (function);
|
||||||
|
@ -2438,11 +2440,7 @@ build_function_call_real (function, params, require_complete, flags)
|
||||||
function = build1 (ADDR_EXPR, build_pointer_type (fntype), function);
|
function = build1 (ADDR_EXPR, build_pointer_type (fntype), function);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
function = default_conversion (function);
|
||||||
assemble_external (function);
|
|
||||||
TREE_USED (function) = 1;
|
|
||||||
function = default_conversion (function);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2718,7 +2716,8 @@ convert_arguments (return_loc, typelist, values, fndecl, flags)
|
||||||
&& (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)))
|
&& (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)))
|
||||||
type = integer_type_node;
|
type = integer_type_node;
|
||||||
#endif
|
#endif
|
||||||
parmval = convert_for_initialization (return_loc, type, val, flags,
|
parmval = convert_for_initialization (return_loc, type, val,
|
||||||
|
flags|INDIRECT_BIND,
|
||||||
"argument passing", fndecl, i);
|
"argument passing", fndecl, i);
|
||||||
#ifdef PROMOTE_PROTOTYPES
|
#ifdef PROMOTE_PROTOTYPES
|
||||||
if ((TREE_CODE (type) == INTEGER_TYPE
|
if ((TREE_CODE (type) == INTEGER_TYPE
|
||||||
|
@ -3554,6 +3553,17 @@ build_binary_op_nodefault (code, orig_op0, orig_op1, error_code)
|
||||||
tree primop0 = get_narrower (op0, &unsignedp0);
|
tree primop0 = get_narrower (op0, &unsignedp0);
|
||||||
tree primop1 = get_narrower (op1, &unsignedp1);
|
tree primop1 = get_narrower (op1, &unsignedp1);
|
||||||
|
|
||||||
|
/* Check for comparison of different enum types. */
|
||||||
|
if (flag_int_enum_equivalence == 0
|
||||||
|
&& TREE_CODE (TREE_TYPE (orig_op0)) == ENUMERAL_TYPE
|
||||||
|
&& TREE_CODE (TREE_TYPE (orig_op1)) == ENUMERAL_TYPE
|
||||||
|
&& TYPE_MAIN_VARIANT (TREE_TYPE (orig_op0))
|
||||||
|
!= TYPE_MAIN_VARIANT (TREE_TYPE (orig_op1)))
|
||||||
|
{
|
||||||
|
cp_warning ("comparison between `%#T' and `%#T'",
|
||||||
|
TREE_TYPE (orig_op0), TREE_TYPE (orig_op1));
|
||||||
|
}
|
||||||
|
|
||||||
/* Give warnings for comparisons between signed and unsigned
|
/* Give warnings for comparisons between signed and unsigned
|
||||||
quantities that may fail. */
|
quantities that may fail. */
|
||||||
/* Do the checking based on the original operand trees, so that
|
/* Do the checking based on the original operand trees, so that
|
||||||
|
@ -4068,7 +4078,7 @@ build_unary_op (code, xarg, noconvert)
|
||||||
case FIX_ROUND_EXPR:
|
case FIX_ROUND_EXPR:
|
||||||
case FIX_CEIL_EXPR:
|
case FIX_CEIL_EXPR:
|
||||||
{
|
{
|
||||||
tree incremented, modify, value;
|
tree incremented, modify, value, compound;
|
||||||
if (! lvalue_p (arg) && pedantic)
|
if (! lvalue_p (arg) && pedantic)
|
||||||
pedwarn ("cast to non-reference type used as lvalue");
|
pedwarn ("cast to non-reference type used as lvalue");
|
||||||
arg = stabilize_reference (arg);
|
arg = stabilize_reference (arg);
|
||||||
|
@ -4081,8 +4091,13 @@ build_unary_op (code, xarg, noconvert)
|
||||||
? PLUS_EXPR : MINUS_EXPR),
|
? PLUS_EXPR : MINUS_EXPR),
|
||||||
argtype, value, inc);
|
argtype, value, inc);
|
||||||
TREE_SIDE_EFFECTS (incremented) = 1;
|
TREE_SIDE_EFFECTS (incremented) = 1;
|
||||||
|
|
||||||
modify = build_modify_expr (arg, NOP_EXPR, incremented);
|
modify = build_modify_expr (arg, NOP_EXPR, incremented);
|
||||||
return build (COMPOUND_EXPR, TREE_TYPE (arg), modify, value);
|
compound = build (COMPOUND_EXPR, TREE_TYPE (arg), modify, value);
|
||||||
|
|
||||||
|
/* Eliminate warning about unused result of + or -. */
|
||||||
|
TREE_NO_UNUSED_WARNING (compound) = 1;
|
||||||
|
return compound;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4549,8 +4564,6 @@ mark_addressable (exp)
|
||||||
TREE_ADDRESSABLE (x) = 1;
|
TREE_ADDRESSABLE (x) = 1;
|
||||||
TREE_USED (x) = 1;
|
TREE_USED (x) = 1;
|
||||||
TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (x)) = 1;
|
TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (x)) = 1;
|
||||||
if (asm_out_file)
|
|
||||||
assemble_external (x);
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -5563,9 +5576,19 @@ tree
|
||||||
expand_target_expr (t)
|
expand_target_expr (t)
|
||||||
tree t;
|
tree t;
|
||||||
{
|
{
|
||||||
|
extern int temp_slot_level;
|
||||||
|
extern int target_temp_slot_level;
|
||||||
|
int old_temp_level = target_temp_slot_level;
|
||||||
|
|
||||||
tree xval = make_node (RTL_EXPR);
|
tree xval = make_node (RTL_EXPR);
|
||||||
rtx rtxval;
|
rtx rtxval;
|
||||||
|
|
||||||
|
/* Any TARGET_EXPR temps live only as long as the outer temp level.
|
||||||
|
Since they are preserved in this new inner level, we know they
|
||||||
|
will make it into the outer level. */
|
||||||
|
push_temp_slots ();
|
||||||
|
target_temp_slot_level = temp_slot_level;
|
||||||
|
|
||||||
do_pending_stack_adjust ();
|
do_pending_stack_adjust ();
|
||||||
start_sequence_for_rtl_expr (xval);
|
start_sequence_for_rtl_expr (xval);
|
||||||
emit_note (0, -1);
|
emit_note (0, -1);
|
||||||
|
@ -5576,6 +5599,10 @@ expand_target_expr (t)
|
||||||
end_sequence ();
|
end_sequence ();
|
||||||
RTL_EXPR_RTL (xval) = rtxval;
|
RTL_EXPR_RTL (xval) = rtxval;
|
||||||
TREE_TYPE (xval) = TREE_TYPE (t);
|
TREE_TYPE (xval) = TREE_TYPE (t);
|
||||||
|
|
||||||
|
pop_temp_slots ();
|
||||||
|
target_temp_slot_level = old_temp_level;
|
||||||
|
|
||||||
return xval;
|
return xval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -569,8 +569,6 @@ store_init_value (decl, init)
|
||||||
if (TREE_CODE (init) == CONSTRUCTOR)
|
if (TREE_CODE (init) == CONSTRUCTOR)
|
||||||
{
|
{
|
||||||
tree field;
|
tree field;
|
||||||
tree funcs;
|
|
||||||
int func;
|
|
||||||
|
|
||||||
/* Check that we're really an aggregate as ARM 8.4.1 defines it. */
|
/* Check that we're really an aggregate as ARM 8.4.1 defines it. */
|
||||||
if (CLASSTYPE_N_BASECLASSES (type))
|
if (CLASSTYPE_N_BASECLASSES (type))
|
||||||
|
@ -588,16 +586,11 @@ store_init_value (decl, init)
|
||||||
cp_error_at ("initializer list construction invalid for `%D'", decl);
|
cp_error_at ("initializer list construction invalid for `%D'", decl);
|
||||||
cp_error_at ("due to non-public access of member `%D'", field);
|
cp_error_at ("due to non-public access of member `%D'", field);
|
||||||
}
|
}
|
||||||
funcs = TYPE_METHODS (type);
|
for (field = TYPE_METHODS (type); field; field = TREE_CHAIN (field))
|
||||||
if (funcs)
|
if (TREE_PRIVATE (field) || TREE_PROTECTED (field))
|
||||||
for (func = 0; func < TREE_VEC_LENGTH (funcs); func++)
|
|
||||||
{
|
{
|
||||||
field = TREE_VEC_ELT (funcs, func);
|
cp_error_at ("initializer list construction invalid for `%D'", decl);
|
||||||
if (field && (TREE_PRIVATE (field) || TREE_PROTECTED (field)))
|
cp_error_at ("due to non-public access of member `%D'", field);
|
||||||
{
|
|
||||||
cp_error_at ("initializer list construction invalid for `%D'", decl);
|
|
||||||
cp_error_at ("due to non-public access of member `%D'", field);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -894,10 +887,16 @@ digest_init (type, init, tail)
|
||||||
return process_init_constructor (type, init, (tree *)0);
|
return process_init_constructor (type, init, (tree *)0);
|
||||||
else if (TYPE_NON_AGGREGATE_CLASS (type))
|
else if (TYPE_NON_AGGREGATE_CLASS (type))
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
|
/* This isn't true. */
|
||||||
/* This can only be reached when caller is initializing
|
/* This can only be reached when caller is initializing
|
||||||
ARRAY_TYPE. In that case, we don't want to convert
|
ARRAY_TYPE. In that case, we don't want to convert
|
||||||
INIT to TYPE. We will let `expand_vec_init' do it. */
|
INIT to TYPE. We will let `expand_vec_init' do it. */
|
||||||
return init;
|
return init;
|
||||||
|
#else
|
||||||
|
return convert_for_initialization (0, type, init, LOOKUP_NORMAL,
|
||||||
|
"initialization", NULL_TREE, 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else if (tail != 0)
|
else if (tail != 0)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue