Commit 6060a796 by Mike Stump

50th Cygnus<->FSF merge

From-SVN: r8657
parent 27efbf21
Thu Dec 15 16:32:12 1994 Mike Stump <mrs@cygnus.com>
* decl2.c (check_classfn): Use decls_match to check if this has
already been declared, as the DECL_ASSEMBLER_NAME may have been
changed via asm("new_name").
* decl.c (decls_match): Make public.
Thu Dec 15 15:17:55 1994 Mike Stump <mrs@cygnus.com>
* *.[chy] (expand_aggr_init) Add fourth argument to handle
distinction between = init and (init) style of initializations.
* *.[chy] (finish_decl): Add fifth argument to to handle
distinction between = init and (init) style of initializations.
Tue Dec 13 19:16:05 1994 Mike Stump <mrs@cygnus.com>
Fix some random `explicit' bugs.
* cvt.c (convert_to_reference): Add third parameter to
convert_force.
(convert_force): Ditto.
* call.c (build_method_call): Ditto.
* decl2.c (setup_vtbl_ptr): Ditto.
* init.c (expand_virtual_init): Ditto.
(build_member_call): Ditto.
(build_delete): Ditto.
(build_vbase_delete): Ditto.
* typeck.c (build_component_addr): Ditto.
(build_c_cast): Ditto.
(build_modify_expr): Ditto.
* cp-tree.h (CONV_NONCONVERTING): Ditto. Add so that we can
distinguish the context in which the conversion appears. Add thrid
argument to build_c_cast.
* cvt.c (cp_convert): Pass whether or not we want to consider
non-converting constructors down to build_method_call.
* decl2.c (reparse_absdcl_as_casts): Add third argument to
build_c_cast.
* gc.c (build_m_desc): Ditto.
* init.c (build_new): Ditto.
* parse.y (expr_no_commas): Ditto.
(primary): Ditto.
* typeck.c (build_x_function_call): Ditto.
(build_static_cast): Ditto.
(build_reinterpret_cast): Ditto.
(build_const_cast): Ditto.
(build_c_cast): Ditto.
(build_ptrmemfunc): Ditto.
* typeck2.c (build_functional_cast): Ditto.
* init.c (expand_aggr_init): Added LOOKUP_ONLYCONVERTING to
expand_aggr_init_1 as inits are converted to the destination type.
Tue Dec 13 16:18:57 1994 Jason Merrill <jason@phydeaux.cygnus.com>
* Make-lang.in (cc1plus): Depends on c-pragma.o.
* Makefile.in (OBJ{DEP,}S): Add ../c-pragma.o.
* lex.c (check_newline): If the #pragma is not recognized by g++,
try machine-specific ones too.
(handle_sysv_pragma): Copied from c-lex.c.
Mon Dec 12 23:53:06 1994 Mike Stump <mrs@cygnus.com>
* except.c (expand_throw): Fix Dec 6th change, build_new likes a
reference better.
Mon Dec 12 18:01:00 1994 Jason Merrill <jason@phydeaux.cygnus.com>
* typeck.c (build_binary_op): Lose checks on TYPE_PTRMEMFUNC_P with
IS_AGGR_TYPE, since now they will not both be set on the same type.
* pt.c (do_pending_expansions): Don't clear TREE_PUBLIC on
instantiations controlled by -fexternal-templates.
* decl.c (duplicate_decls): Don't complain about different values of
__attribute__ ((const)) and ((noreturn)).
Fri Dec 9 18:17:37 1994 Doug Evans <dje@cygnus.com> Fri Dec 9 18:17:37 1994 Doug Evans <dje@cygnus.com>
* Makefile.in (BISONFLAGS): Delete --yacc. * Makefile.in (BISONFLAGS): Delete --yacc.
...@@ -9,6 +86,148 @@ Fri Dec 2 10:44:36 1994 Mike Stump (mrs@wombat.gnu.ai.mit.edu) ...@@ -9,6 +86,148 @@ Fri Dec 2 10:44:36 1994 Mike Stump (mrs@wombat.gnu.ai.mit.edu)
* Makefile.in (BISONFLAGS): Add --yacc so that output winds up in * Makefile.in (BISONFLAGS): Add --yacc so that output winds up in
y.tab.c. y.tab.c.
Thu Dec 8 17:39:46 1994 Jason Merrill <jason@phydeaux.cygnus.com>
* decl.c (finish_decl): Don't call obscure_complex_init for decls
of indeterminate size.
Wed Dec 7 16:49:22 1994 Jason Merrill <jason@phydeaux.cygnus.com>
* decl.c (obscure_complex_init): Function to tweak the decl to
prevent expand_decl from tring to initialize it.
(finish_decl): Use it rather than writing the same code in three
different places.
* parse.y (bad_parm): Stop trying to support parms without types.
Wed Dec 7 12:06:56 1994 Mike Stump <mrs@cygnus.com>
* decl2.c (grokfield): Make asm specs on static member functions
work.
Tue Dec 6 15:43:20 1994 Mike Stump <mrs@cygnus.com>
* except.c (expand_throw): Make a copy of the thrown object.
Tue Dec 6 14:16:34 1994 Jason Merrill <jason@phydeaux.cygnus.com>
* parse.y: : has lower precedence than =.
Tue Dec 6 12:46:17 1994 Mike Stump <mrs@cygnus.com>
* decl.c (pushdecl): Use DECL_NAME of VAR_DECLs to avoid namespace
manglings.
(grokvardecl): Add namespace into variable name.
Tue Dec 6 11:26:55 1994 Mike Stump <mrs@cygnus.com>
* decl2.c (current_namespace_id): New routine to transform a simple
name into a name in a namespace.
* decl.c (grokdeclarator): Use it.
* decl2.c (get_namespace_id): Find the name of the current
namespace.
(push_namespace, pop_namespace): Complete out missing
functionality.
Mon Dec 5 17:11:51 1994 Jason Merrill <jason@phydeaux.cygnus.com>
* class.c (finish_struct): Don't use LONG_LONG_TYPE_SIZE, as it may
not be defined. Fix warning message for enums and restore warning
for non-enums.
* decl2.c (push_namespace): Dummy function.
(pop_namespace): Ditto.
(do_namespace_alias): Ditto.
(do_using_decl): Ditto.
(do_using_directive): Ditto.
* parse.y: New token NSNAME for namespace names.
(extdef): Add namespace, using definitions.
(using_decl): New rule for using declarations.
(any_id): New rule for identifiers with any degree of scoping.
(identifier): Add NSNAME.
(notype_identifier): Ditto.
(component_decl): Add using_decl.
(nested_name_specifier): Add NSNAME SCOPE.
* typeck.c (convert_for_assignment): Handle conversions between
enums and bool.
* decl.c (duplicate_decls): Only propagate DECL_MAIN_VARIANT on
FUNCTION_DECLs.
Mon Dec 5 13:03:16 1994 Mike Stump <mrs@cygnus.com>
* class.c (finish_struct): Give an error if one tries to declare a
bit-field's size greater than a long long, as the backend will dump.
It is not an error to declare an enum bit-field greater than its
precision. Warn if an enum bit-field is too small to hold all
its values.
Mon Dec 5 11:41:50 1994 Mike Stump <mrs@cygnus.com>
* typeck.c (convert_for_assignment): Use cp_convert instead of
convert so that we don't get static casts.
Sun Dec 4 11:59:01 1994 Mike Stump <mrs@cygnus.com>
* cvt.c (cp_convert): Don't complain about int->enum conversion if
we are doing static casts.
Fri Dec 2 18:32:41 1994 Mike Stump <mrs@cygnus.com>
* error.c (dump_expr): Do something more intelligent with SAVE_EXPRs
when dumping expressions in error messages.
Fri Dec 2 17:04:27 1994 Mike Stump <mrs@cygnus.com>
* gc.c (build_dynamic_cast): Change interface to libg++, ensure that
the return type is the right type, and make references work.
Fri Dec 2 16:36:43 1994 Jason Merrill <jason@phydeaux.cygnus.com>
* decl.c (poplevel): Don't be confused by function-scope
declarations of non-nested functions.
(duplicate_decls): Propagate DECL_MAIN_VARIANT.
(pushdecl): Use duplicate_decls to copy info from old decl into new
function-scope one rather than doing it here.
* decl2.c (mark_inline_for_output): Deal with the DECL_MAIN_VARIANT
of this decl, in case this is a function-scope declaration.
* decl.c (finish_enum): Make sure that the type has the right
precision when we call fixup_*_type.
Tue Nov 29 19:12:07 1994 Jason Merrill <jason@phydeaux.cygnus.com>
* cvt.c (build_up_reference): Strip superfluous NOP_EXPRs; we do
want to build up references to rvalues if possible.
(cp_convert): Stick on a NOP_EXPR when converting to the same type.
Tue Nov 29 11:28:59 1994 Mike Stump <mrs@cygnus.com>
* parse.y (maybe_raises): Handle throw ().
* parse.y (ansi_raise_identifier): grok type-ids in exception
specifications.
* tree.c (build_exception_variant): Use list compare to check if
two exception specifications match.
* decl.c (duplicate_decls, bad_specifiers): Enhance wording on error
messages.
* call.c (build_method_call): Remove TREE_RAISES.
* cvt.c (convert_to_aggr): Ditto.
* typeck.c (build_function_call_real, convert_arguments): Ditto.
* init.c (expand_aggr_init_1): Ditto.
Tue Nov 29 09:50:39 1994 Mike Stump <mrs@cygnus.com>
* except.c: Add support for m68k and mips exception handling
support.
Tue Nov 29 08:48:33 1994 Mike Stump <mrs@cygnus.com>
* except.c (expand_end_all_catch): Throw into outer context, if we
fall off end of catch handlers.
Mon Nov 28 16:44:41 1994 Mike Stump <mrs@cygnus.com> Mon Nov 28 16:44:41 1994 Mike Stump <mrs@cygnus.com>
* Makefile.in: Make is easier to decide where parse.[ch] will be * Makefile.in: Make is easier to decide where parse.[ch] will be
...@@ -527,7 +746,7 @@ Thu Sep 29 13:08:50 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -527,7 +746,7 @@ Thu Sep 29 13:08:50 1994 Jason Merrill (jason@deneb.cygnus.com)
* decl.c (finish_decl): Also end temporary allocation if the decl in * decl.c (finish_decl): Also end temporary allocation if the decl in
question has a type of error_mark_node. question has a type of error_mark_node.
Wed Sep 28 21:45:00 1994 Mike Stump (mrs@cygnus.com) Wed Sep 28 21:45:00 1994 Mike Stump <mrs@cygnus.com>
* typeck.c (build_modify_expr): When optimizing ?: on lhs, make sure * typeck.c (build_modify_expr): When optimizing ?: on lhs, make sure
that if the ?: was a reference type, that the subparts will be also. that if the ?: was a reference type, that the subparts will be also.
...@@ -804,7 +1023,7 @@ Wed Aug 24 11:11:50 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -804,7 +1023,7 @@ Wed Aug 24 11:11:50 1994 Jason Merrill (jason@deneb.cygnus.com)
* error.c (cp_line_of): Use CLASSTYPE_SOURCE_LINE for aggregates. * error.c (cp_line_of): Use CLASSTYPE_SOURCE_LINE for aggregates.
* class.c (finish_struct): Set CLASSTYPE_SOURCE_LINE. * class.c (finish_struct): Set CLASSTYPE_SOURCE_LINE.
Tue Aug 23 09:28:35 1994 Mike Stump (mrs@cygnus.com) Tue Aug 23 09:28:35 1994 Mike Stump <mrs@cygnus.com>
* error.c (dump_decl): Improve wording, so that error messages * error.c (dump_decl): Improve wording, so that error messages
dont't read template<, class foo>... dont't read template<, class foo>...
...@@ -839,7 +1058,7 @@ Fri Aug 19 14:04:47 1994 Kung Hsu (kung@mexican.cygnus.com) ...@@ -839,7 +1058,7 @@ Fri Aug 19 14:04:47 1994 Kung Hsu (kung@mexican.cygnus.com)
* method.c (build_overload_name): ditto. * method.c (build_overload_name): ditto.
* method.c (build_overload_identifier): ditto. * method.c (build_overload_identifier): ditto.
Thu Aug 18 16:24:43 1994 Mike Stump (mrs@cygnus.com) Thu Aug 18 16:24:43 1994 Mike Stump <mrs@cygnus.com>
* error.c (dump_decl): Handle NULL args. * error.c (dump_decl): Handle NULL args.
...@@ -853,7 +1072,7 @@ Wed Sep 14 10:17:27 1994 Michael I Bushnell <mib@churchy.gnu.ai.mit.edu> ...@@ -853,7 +1072,7 @@ Wed Sep 14 10:17:27 1994 Michael I Bushnell <mib@churchy.gnu.ai.mit.edu>
* g++.c: Include <sys/errno.h> in case `errno' is a macro * g++.c: Include <sys/errno.h> in case `errno' is a macro
as permitted by ANSI C. as permitted by ANSI C.
Thu Aug 18 12:48:09 1994 Mike Stump (mrs@cygnus.com) Thu Aug 18 12:48:09 1994 Mike Stump <mrs@cygnus.com>
* class.c (finish_struct): Move setting of CLASSTYPE_INTERFACE and * class.c (finish_struct): Move setting of CLASSTYPE_INTERFACE and
CLASSTYPE_VTABLE_NEEDS_WRITING up to left_curly time. CLASSTYPE_VTABLE_NEEDS_WRITING up to left_curly time.
...@@ -1061,7 +1280,7 @@ Fri Aug 5 14:20:16 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -1061,7 +1280,7 @@ Fri Aug 5 14:20:16 1994 Jason Merrill (jason@deneb.cygnus.com)
(finish_function): Use DECL_DEFER_OUTPUT to decide which inlines to (finish_function): Use DECL_DEFER_OUTPUT to decide which inlines to
mark for later consideration, rather than DECL_FUNCTION_MEMBER_P. mark for later consideration, rather than DECL_FUNCTION_MEMBER_P.
Fri Aug 5 01:12:20 1994 Mike Stump (mrs@cygnus.com) Fri Aug 5 01:12:20 1994 Mike Stump <mrs@cygnus.com>
* class.c (get_class_offset_1, get_class_offset): New routine to * class.c (get_class_offset_1, get_class_offset): New routine to
find the offset of the class where a virtual function is defined, find the offset of the class where a virtual function is defined,
...@@ -1207,7 +1426,7 @@ Mon Jul 11 18:37:20 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -1207,7 +1426,7 @@ Mon Jul 11 18:37:20 1994 Jason Merrill (jason@deneb.cygnus.com)
* decl.c (grok_reference_init): Always save the initializer of a * decl.c (grok_reference_init): Always save the initializer of a
reference. reference.
Fri Jul 8 17:41:46 1994 Mike Stump (mrs@cygnus.com) Fri Jul 8 17:41:46 1994 Mike Stump <mrs@cygnus.com>
* decl.c (cplus_expand_expr_stmt): Wrap statement expressions inside * decl.c (cplus_expand_expr_stmt): Wrap statement expressions inside
CLEANUP_POINT_EXPRs so that the stack slots can be reused. CLEANUP_POINT_EXPRs so that the stack slots can be reused.
...@@ -1263,7 +1482,7 @@ Thu Jul 7 13:39:37 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -1263,7 +1482,7 @@ Thu Jul 7 13:39:37 1994 Jason Merrill (jason@deneb.cygnus.com)
(finish_vtable_vardecl): Call import_export_template before (finish_vtable_vardecl): Call import_export_template before
import_export_vtable. import_export_vtable.
Wed Jul 6 20:25:48 1994 Mike Stump (mrs@cygnus.com) Wed Jul 6 20:25:48 1994 Mike Stump <mrs@cygnus.com>
* except.c (init_exception_processing): Setup interim_eh_hook to * except.c (init_exception_processing): Setup interim_eh_hook to
call lang_interim_eh. call lang_interim_eh.
...@@ -1360,7 +1579,7 @@ Fri Jun 24 16:49:41 1994 Gerald Baumgartner (gb@cs.purdue.edu) ...@@ -1360,7 +1579,7 @@ Fri Jun 24 16:49:41 1994 Gerald Baumgartner (gb@cs.purdue.edu)
* decl.c (grokdeclarator): If we are grokking an opaque typedef * decl.c (grokdeclarator): If we are grokking an opaque typedef
in a signature, don't complain about it begin static. in a signature, don't complain about it begin static.
Wed Jun 29 16:44:45 1994 Mike Stump (mrs@cygnus.com) Wed Jun 29 16:44:45 1994 Mike Stump <mrs@cygnus.com>
Fixes a problem of the this pointer being wrong in virtual calls to Fixes a problem of the this pointer being wrong in virtual calls to
methods that are not overridden in more derived classes. methods that are not overridden in more derived classes.
...@@ -1493,7 +1712,7 @@ Wed Jun 15 19:34:54 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -1493,7 +1712,7 @@ Wed Jun 15 19:34:54 1994 Jason Merrill (jason@deneb.cygnus.com)
* typeck2.c (process_init_constructor): Don't treat empty_init_node * typeck2.c (process_init_constructor): Don't treat empty_init_node
specially. specially.
Wed Jun 15 19:05:25 1994 Mike Stump (mrs@cygnus.com) Wed Jun 15 19:05:25 1994 Mike Stump <mrs@cygnus.com>
* class.c (override_one_vtable): Don't forget to merge in an old * class.c (override_one_vtable): Don't forget to merge in an old
overrider when we wanted to reuse a vtable, but couldn't. overrider when we wanted to reuse a vtable, but couldn't.
...@@ -1576,7 +1795,7 @@ Thu Jun 9 19:04:59 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -1576,7 +1795,7 @@ Thu Jun 9 19:04:59 1994 Jason Merrill (jason@deneb.cygnus.com)
(finish_file): Output all pending inlines if (finish_file): Output all pending inlines if
flag_keep_inline_functions. flag_keep_inline_functions.
Wed Jun 8 20:48:02 1994 Mike Stump (mrs@cygnus.com) Wed Jun 8 20:48:02 1994 Mike Stump <mrs@cygnus.com>
* tree.c (layout_vbasetypes): Align virtual base classes inside * tree.c (layout_vbasetypes): Align virtual base classes inside
complete objects, so that we don't core dump on machines such as complete objects, so that we don't core dump on machines such as
...@@ -1662,7 +1881,7 @@ Wed Jun 1 18:57:35 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -1662,7 +1881,7 @@ Wed Jun 1 18:57:35 1994 Jason Merrill (jason@deneb.cygnus.com)
* typeck.c (convert_arguments): Make sure type is not NULL before * typeck.c (convert_arguments): Make sure type is not NULL before
checking its TREE_CODE. checking its TREE_CODE.
Wed Jun 1 17:40:39 1994 Mike Stump (mrs@cygnus.com) Wed Jun 1 17:40:39 1994 Mike Stump <mrs@cygnus.com>
* class.c (get_derived_offset): New routine. * class.c (get_derived_offset): New routine.
* class.c (finish_base_struct): Make sure we set BINFO_VTABLE and * class.c (finish_base_struct): Make sure we set BINFO_VTABLE and
...@@ -1684,7 +1903,7 @@ Wed Jun 1 11:11:15 1994 Brendan Kehoe (brendan@lisa.cygnus.com) ...@@ -1684,7 +1903,7 @@ Wed Jun 1 11:11:15 1994 Brendan Kehoe (brendan@lisa.cygnus.com)
* decl.c (grokdeclarator): Make sure we have a DNAME set before we * decl.c (grokdeclarator): Make sure we have a DNAME set before we
try to use it in an error. try to use it in an error.
Wed Jun 1 09:48:49 1994 Mike Stump (mrs@cygnus.com) Wed Jun 1 09:48:49 1994 Mike Stump <mrs@cygnus.com>
* typeck.c (convert_arguments, convert_for_initialization): Don't * typeck.c (convert_arguments, convert_for_initialization): Don't
strip NOP_EXPRs, when we are converting to a reference. strip NOP_EXPRs, when we are converting to a reference.
...@@ -1780,7 +1999,7 @@ Fri May 27 13:57:40 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -1780,7 +1999,7 @@ Fri May 27 13:57:40 1994 Jason Merrill (jason@deneb.cygnus.com)
* typeck.c (build_binary_op_nodefault): Division by constant zero is * typeck.c (build_binary_op_nodefault): Division by constant zero is
an error. an error.
Fri May 27 13:50:15 1994 Mike Stump (mrs@cygnus.com) Fri May 27 13:50:15 1994 Mike Stump <mrs@cygnus.com>
* class.c (override_one_vtable): Don't modify things we don't own. * class.c (override_one_vtable): Don't modify things we don't own.
...@@ -2049,7 +2268,7 @@ Fri May 13 16:45:07 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -2049,7 +2268,7 @@ Fri May 13 16:45:07 1994 Jason Merrill (jason@deneb.cygnus.com)
* class.c (finish_struct_bits): Set TYPE_HAS_INT_CONVERSION if it * class.c (finish_struct_bits): Set TYPE_HAS_INT_CONVERSION if it
has a conversion to enum or bool, too. has a conversion to enum or bool, too.
Fri May 13 16:31:27 1994 Mike Stump (mrs@cygnus.com) Fri May 13 16:31:27 1994 Mike Stump <mrs@cygnus.com>
* method.c (emit_thunk): Make declaration for * method.c (emit_thunk): Make declaration for
current_call_is_indirect local (needed for hppa). current_call_is_indirect local (needed for hppa).
...@@ -2059,7 +2278,7 @@ Fri May 13 16:16:37 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -2059,7 +2278,7 @@ Fri May 13 16:16:37 1994 Jason Merrill (jason@deneb.cygnus.com)
* pt.c (uses_template_parms): Grok BOOLEAN_TYPE. * pt.c (uses_template_parms): Grok BOOLEAN_TYPE.
(tsubst): Ditto. (tsubst): Ditto.
Fri May 13 16:23:32 1994 Mike Stump (mrs@cygnus.com) Fri May 13 16:23:32 1994 Mike Stump <mrs@cygnus.com>
* pt.c (tsubst): If there is already a function for this expansion, * pt.c (tsubst): If there is already a function for this expansion,
use it. use it.
...@@ -2074,7 +2293,7 @@ Fri May 13 10:30:42 1994 Brendan Kehoe (brendan@lisa.cygnus.com) ...@@ -2074,7 +2293,7 @@ Fri May 13 10:30:42 1994 Brendan Kehoe (brendan@lisa.cygnus.com)
* cp-tree.h (build_static_cast, build_reinterpret_cast, * cp-tree.h (build_static_cast, build_reinterpret_cast,
build_const_cast): Add declarations. build_const_cast): Add declarations.
Fri May 13 09:50:31 1994 Mike Stump (mrs@cygnus.com) Fri May 13 09:50:31 1994 Mike Stump <mrs@cygnus.com>
* search.c (expand_indirect_vtbls_init): Fix breakage from Apr 27 * search.c (expand_indirect_vtbls_init): Fix breakage from Apr 27
fix. We now try get_binfo, and if that doesn't find what we want, fix. We now try get_binfo, and if that doesn't find what we want,
...@@ -2095,7 +2314,7 @@ Fri May 13 01:43:18 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -2095,7 +2314,7 @@ Fri May 13 01:43:18 1994 Jason Merrill (jason@deneb.cygnus.com)
(build_default_unary_type_conversion): Convert arg of ! to bool. (build_default_unary_type_conversion): Convert arg of ! to bool.
(type_promotes_to): bool promotes to int. (type_promotes_to): bool promotes to int.
Fri May 13 01:43:18 1994 Mike Stump (mrs@cygnus.com) Fri May 13 01:43:18 1994 Mike Stump <mrs@cygnus.com>
Implement the new builtin `bool' type. Implement the new builtin `bool' type.
* typeck.c (build_binary_op_nodefault): Convert args of && and || to * typeck.c (build_binary_op_nodefault): Convert args of && and || to
...@@ -2117,7 +2336,7 @@ Thu May 12 19:13:54 1994 Richard Earnshaw (rwe11@cl.cam.ac.uk) ...@@ -2117,7 +2336,7 @@ Thu May 12 19:13:54 1994 Richard Earnshaw (rwe11@cl.cam.ac.uk)
* g++.c: Use #ifdef for __MSDOS__, not #if. * g++.c: Use #ifdef for __MSDOS__, not #if.
Thu May 12 18:05:18 1994 Mike Stump (mrs@cygnus.com) Thu May 12 18:05:18 1994 Mike Stump <mrs@cygnus.com>
* decl2.c (lang_f_options): Handle -fshort-temps. -fshort-temps * decl2.c (lang_f_options): Handle -fshort-temps. -fshort-temps
gives old behavior , and destroys temporaries earlier. Default gives old behavior , and destroys temporaries earlier. Default
...@@ -2188,7 +2407,7 @@ Tue May 10 11:52:04 1994 Brendan Kehoe (brendan@lisa.cygnus.com) ...@@ -2188,7 +2407,7 @@ Tue May 10 11:52:04 1994 Brendan Kehoe (brendan@lisa.cygnus.com)
* init.c (emit_base_init): Check if there's a DECL_NAME on the * init.c (emit_base_init): Check if there's a DECL_NAME on the
member before trying to do an initialization for it. member before trying to do an initialization for it.
Tue May 10 11:34:37 1994 Mike Stump (mrs@cygnus.com) Tue May 10 11:34:37 1994 Mike Stump <mrs@cygnus.com>
* except.c: Don't do anything useful when cross compiling. * except.c: Don't do anything useful when cross compiling.
...@@ -2225,7 +2444,7 @@ Sun May 8 01:29:13 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -2225,7 +2444,7 @@ Sun May 8 01:29:13 1994 Jason Merrill (jason@deneb.cygnus.com)
* decl.c (poplevel): Always call poplevel recursively if we're * decl.c (poplevel): Always call poplevel recursively if we're
dealing with a temporary binding level. dealing with a temporary binding level.
Sat May 7 10:52:28 1994 Mike Stump (mrs@cygnus.com) Sat May 7 10:52:28 1994 Mike Stump <mrs@cygnus.com>
* decl.c (finish_decl): Make sure we run cleanups for initial values * decl.c (finish_decl): Make sure we run cleanups for initial values
of decls. Cures memory leak. of decls. Cures memory leak.
...@@ -2297,7 +2516,7 @@ Fri May 6 03:53:23 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -2297,7 +2516,7 @@ Fri May 6 03:53:23 1994 Jason Merrill (jason@deneb.cygnus.com)
* cp/decl.c (finish_decl): Setting asmspec_tree should not * cp/decl.c (finish_decl): Setting asmspec_tree should not
zero out the old RTL. zero out the old RTL.
Fri May 6 01:25:38 1994 Mike Stump (mrs@cygnus.com) Fri May 6 01:25:38 1994 Mike Stump <mrs@cygnus.com>
Add alpha exception handling support to the compiler. Add alpha exception handling support to the compiler.
Quick and dirty backend in except.c. Quick and dirty backend in except.c.
...@@ -2556,7 +2775,7 @@ Thu Apr 28 02:12:08 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -2556,7 +2775,7 @@ Thu Apr 28 02:12:08 1994 Jason Merrill (jason@deneb.cygnus.com)
* typeck2.c (build_functional_cast): Don't look for a function call * typeck2.c (build_functional_cast): Don't look for a function call
interpretation. interpretation.
Thu Apr 28 15:19:46 1994 Mike Stump (mrs@cygnus.com) Thu Apr 28 15:19:46 1994 Mike Stump <mrs@cygnus.com>
* cp-tree.h: disable use of backend EH. * cp-tree.h: disable use of backend EH.
...@@ -2585,7 +2804,7 @@ Wed Apr 27 18:10:12 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -2585,7 +2804,7 @@ Wed Apr 27 18:10:12 1994 Jason Merrill (jason@deneb.cygnus.com)
* call.c (build_overload_call_real): Don't take the single-function * call.c (build_overload_call_real): Don't take the single-function
shortcut if we're dealing with an overloaded operator. shortcut if we're dealing with an overloaded operator.
Wed Apr 27 17:35:37 1994 Mike Stump (mrs@cygnus.com) Wed Apr 27 17:35:37 1994 Mike Stump <mrs@cygnus.com>
* search.c (get_base_distance): Search the virtual base class * search.c (get_base_distance): Search the virtual base class
binfos, incase someone wants to convert to a real virtual base binfos, incase someone wants to convert to a real virtual base
...@@ -2600,7 +2819,7 @@ Wed Apr 27 15:36:49 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -2600,7 +2819,7 @@ Wed Apr 27 15:36:49 1994 Jason Merrill (jason@deneb.cygnus.com)
* typeck.c (build_unary_op): References are too lvalues. * typeck.c (build_unary_op): References are too lvalues.
Wed Apr 27 13:58:05 1994 Mike Stump (mrs@cygnus.com) Wed Apr 27 13:58:05 1994 Mike Stump <mrs@cygnus.com>
* class.c (override_one_vtable): We have to prepare_fresh_vtable * class.c (override_one_vtable): We have to prepare_fresh_vtable
before we modify it, not after, also, we cannot reuse an old vtable, before we modify it, not after, also, we cannot reuse an old vtable,
...@@ -2642,7 +2861,7 @@ Wed Apr 27 01:17:08 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -2642,7 +2861,7 @@ Wed Apr 27 01:17:08 1994 Jason Merrill (jason@deneb.cygnus.com)
* decl.c (grokdeclarator): Don't bash references to arrays into * decl.c (grokdeclarator): Don't bash references to arrays into
references to pointers in function parms. Use type_promotes_to. references to pointers in function parms. Use type_promotes_to.
Tue Apr 26 23:44:36 1994 Mike Stump (mrs@cygnus.com) Tue Apr 26 23:44:36 1994 Mike Stump <mrs@cygnus.com>
Finish off Apr 19th work. Finish off Apr 19th work.
...@@ -2885,7 +3104,7 @@ Wed Apr 20 16:51:06 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -2885,7 +3104,7 @@ Wed Apr 20 16:51:06 1994 Jason Merrill (jason@deneb.cygnus.com)
* lex.c (process_next_inline): Don't muck with DECL_INLINE. * lex.c (process_next_inline): Don't muck with DECL_INLINE.
(do_pending_inlines): Ditto. (do_pending_inlines): Ditto.
Tue Apr 19 22:25:41 1994 Mike Stump (mrs@cygnus.com) Tue Apr 19 22:25:41 1994 Mike Stump <mrs@cygnus.com>
Reimplement vtable building, and most vtable pointer setting. Reimplement vtable building, and most vtable pointer setting.
Allows for earier maintenance, easier understandability, and most Allows for earier maintenance, easier understandability, and most
...@@ -3305,7 +3524,7 @@ Thu Apr 7 17:47:53 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -3305,7 +3524,7 @@ Thu Apr 7 17:47:53 1994 Jason Merrill (jason@deneb.cygnus.com)
* decl.c (lookup_name): When called from the lexer, look at * decl.c (lookup_name): When called from the lexer, look at
got_scope and looking_at_typename; otherwise don't. got_scope and looking_at_typename; otherwise don't.
Thu Apr 7 22:05:47 1994 Mike Stump (mrs@cygnus.com) Thu Apr 7 22:05:47 1994 Mike Stump <mrs@cygnus.com>
31th Cygnus<->FSF merge. 31th Cygnus<->FSF merge.
...@@ -3322,7 +3541,7 @@ Thu Apr 7 17:47:53 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -3322,7 +3541,7 @@ Thu Apr 7 17:47:53 1994 Jason Merrill (jason@deneb.cygnus.com)
* typeck.c (compparms): Also allow t1 to be ... if strict == 0. * typeck.c (compparms): Also allow t1 to be ... if strict == 0.
Thu Apr 7 16:17:50 1994 Mike Stump (mrs@cygnus.com) Thu Apr 7 16:17:50 1994 Mike Stump <mrs@cygnus.com>
* class.c (build_vtable_entry): Fix breakage introduced Apr 5 * class.c (build_vtable_entry): Fix breakage introduced Apr 5
17:48:41. 17:48:41.
...@@ -3403,7 +3622,7 @@ Tue Apr 5 17:48:41 1994 Per Bothner (bothner@kalessin.cygnus.com) ...@@ -3403,7 +3622,7 @@ Tue Apr 5 17:48:41 1994 Per Bothner (bothner@kalessin.cygnus.com)
instead. (The rationale is that these optimizations both break binary instead. (The rationale is that these optimizations both break binary
compatibility, but should become the default in a future release.) compatibility, but should become the default in a future release.)
Wed Apr 6 10:53:56 1994 Mike Stump (mrs@cygnus.com) Wed Apr 6 10:53:56 1994 Mike Stump <mrs@cygnus.com>
* class.c (modify_vtable_entries): Never reset the DECL_CONTEXT * class.c (modify_vtable_entries): Never reset the DECL_CONTEXT
of a fndecl, as we might not be from that vfield. of a fndecl, as we might not be from that vfield.
...@@ -3468,7 +3687,7 @@ Sat Jan 23 23:23:26 1994 Stephen R. van den Berg (berg@pool.informatik.rwth-aa ...@@ -3468,7 +3687,7 @@ Sat Jan 23 23:23:26 1994 Stephen R. van den Berg (berg@pool.informatik.rwth-aa
* decl.c (init_decl_processing): Declare __builtin_return_address * decl.c (init_decl_processing): Declare __builtin_return_address
and __builtin_frame_address for C++ as well. and __builtin_frame_address for C++ as well.
Thu Mar 31 12:35:49 1994 Mike Stump (mrs@cygnus.com) Thu Mar 31 12:35:49 1994 Mike Stump <mrs@cygnus.com>
* typeck2.c (store_init_value): Integral constant variables are * typeck2.c (store_init_value): Integral constant variables are
always constant, even when doing -fpic. always constant, even when doing -fpic.
...@@ -3478,7 +3697,7 @@ Sat Jan 23 23:23:26 1994 Stephen R. van den Berg (berg@pool.informatik.rwth-aa ...@@ -3478,7 +3697,7 @@ Sat Jan 23 23:23:26 1994 Stephen R. van den Berg (berg@pool.informatik.rwth-aa
* decl.c (redeclaration_error_message): Pass the types to * decl.c (redeclaration_error_message): Pass the types to
comptypes. comptypes.
Wed Mar 30 21:29:25 1994 Mike Stump (mrs@cygnus.com) Wed Mar 30 21:29:25 1994 Mike Stump <mrs@cygnus.com>
Cures incorrect errors about pure virtuals in a class, when they Cures incorrect errors about pure virtuals in a class, when they
have been overridden in a derived class. have been overridden in a derived class.
...@@ -3514,7 +3733,7 @@ Wed Mar 30 14:10:04 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -3514,7 +3733,7 @@ Wed Mar 30 14:10:04 1994 Jason Merrill (jason@deneb.cygnus.com)
(pushdecl): Use DECL_FUNCTION_MEMBER_P to decide whether or not (pushdecl): Use DECL_FUNCTION_MEMBER_P to decide whether or not
a function is a member. a function is a member.
Wed Mar 30 14:20:50 1994 Mike Stump (mrs@cygnus.com) Wed Mar 30 14:20:50 1994 Mike Stump <mrs@cygnus.com>
Cures calling a more base base class function, when a more derived Cures calling a more base base class function, when a more derived
base class member should be called in some MI situations. base class member should be called in some MI situations.
...@@ -3642,7 +3861,7 @@ Thu Mar 24 23:18:19 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -3642,7 +3861,7 @@ Thu Mar 24 23:18:19 1994 Jason Merrill (jason@deneb.cygnus.com)
* call.c (build_method_call): Preserve const & volatile on * call.c (build_method_call): Preserve const & volatile on
`this'. `this'.
Thu Mar 24 16:21:52 1994 Mike Stump (mrs@cygnus.com) Thu Mar 24 16:21:52 1994 Mike Stump <mrs@cygnus.com>
* init.c (build_new, build_vec_delete): Use global new and delete * init.c (build_new, build_vec_delete): Use global new and delete
for arrays. for arrays.
...@@ -3661,11 +3880,11 @@ Wed Mar 23 17:45:37 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -3661,11 +3880,11 @@ Wed Mar 23 17:45:37 1994 Jason Merrill (jason@deneb.cygnus.com)
* init.c (build_new): Handle array typedefs properly. * init.c (build_new): Handle array typedefs properly.
Wed Mar 23 18:23:33 1994 Mike Stump (mrs@cygnus.com) Wed Mar 23 18:23:33 1994 Mike Stump <mrs@cygnus.com>
30th Cygnus<->FSF merge. 30th Cygnus<->FSF merge.
Wed Mar 23 00:46:24 1994 Mike Stump (mrs@cygnus.com) Wed Mar 23 00:46:24 1994 Mike Stump <mrs@cygnus.com>
* class.c (modify_vtable_entries): Avoid running off the end of the * class.c (modify_vtable_entries): Avoid running off the end of the
virtuals list when processing a virtual destructor. virtuals list when processing a virtual destructor.
...@@ -3681,7 +3900,7 @@ Tue Mar 22 23:49:41 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -3681,7 +3900,7 @@ Tue Mar 22 23:49:41 1994 Jason Merrill (jason@deneb.cygnus.com)
* typeck.c (convert_for_assignment): Don't pedwarn about * typeck.c (convert_for_assignment): Don't pedwarn about
converting function pointer to void *. converting function pointer to void *.
Tue Mar 22 22:23:19 1994 Mike Stump (mrs@cygnus.com) Tue Mar 22 22:23:19 1994 Mike Stump <mrs@cygnus.com>
Major revamp of pointer to member functions. Cures major Major revamp of pointer to member functions. Cures major
nonfunctionality when used in casts, and MI situations. nonfunctionality when used in casts, and MI situations.
...@@ -3702,7 +3921,7 @@ Tue Mar 22 22:23:19 1994 Mike Stump (mrs@cygnus.com) ...@@ -3702,7 +3921,7 @@ Tue Mar 22 22:23:19 1994 Mike Stump (mrs@cygnus.com)
* typeck.c (build_ptrmemfunc): Revamp to handle casting better, also * typeck.c (build_ptrmemfunc): Revamp to handle casting better, also
get vtable pointer out of right subobject. get vtable pointer out of right subobject.
Tue Mar 22 17:56:48 1994 Mike Stump (mrs@cygnus.com) Tue Mar 22 17:56:48 1994 Mike Stump <mrs@cygnus.com>
* search.c (get_binfo): Return NULL instead of aborting, when * search.c (get_binfo): Return NULL instead of aborting, when
passed a UNION_TYPE. passed a UNION_TYPE.
...@@ -3839,7 +4058,7 @@ Thu Mar 17 17:30:01 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -3839,7 +4058,7 @@ Thu Mar 17 17:30:01 1994 Jason Merrill (jason@deneb.cygnus.com)
(finish_decl_parsing): New function to deal with parse nodes for (finish_decl_parsing): New function to deal with parse nodes for
code like `int (*a);'. See the difference? code like `int (*a);'. See the difference?
Thu Mar 17 12:16:10 1994 Mike Stump (mrs@cygnus.com) Thu Mar 17 12:16:10 1994 Mike Stump <mrs@cygnus.com>
These changes break binary compatibility in code with classes These changes break binary compatibility in code with classes
that use virtual bases. that use virtual bases.
...@@ -3866,7 +4085,7 @@ Wed Mar 16 17:43:07 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -3866,7 +4085,7 @@ Wed Mar 16 17:43:07 1994 Jason Merrill (jason@deneb.cygnus.com)
* parse.y (direct_notype_declarator): Add PTYPENAME rule, remove * parse.y (direct_notype_declarator): Add PTYPENAME rule, remove
all of the scoped PTYPENAME rules. all of the scoped PTYPENAME rules.
Wed Mar 16 16:39:02 1994 Mike Stump (mrs@cygnus.com) Wed Mar 16 16:39:02 1994 Mike Stump <mrs@cygnus.com>
* init.c (build_offset_ref): The value of A::typedef_name is * init.c (build_offset_ref): The value of A::typedef_name is
always the TYPE_DECL, and never an error. always the TYPE_DECL, and never an error.
...@@ -3890,7 +4109,7 @@ Tue Mar 15 15:33:31 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -3890,7 +4109,7 @@ Tue Mar 15 15:33:31 1994 Jason Merrill (jason@deneb.cygnus.com)
* error.c (dump_expr): Support member functions (which show up as * error.c (dump_expr): Support member functions (which show up as
OFFSET_REFs). OFFSET_REFs).
Mon Mar 14 16:24:36 1994 Mike Stump (mrs@cygnus.com) Mon Mar 14 16:24:36 1994 Mike Stump <mrs@cygnus.com>
* init.c (build_new): Set the return type of multidimensional * init.c (build_new): Set the return type of multidimensional
news correctly. news correctly.
...@@ -3950,7 +4169,7 @@ Fri Mar 4 18:22:39 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -3950,7 +4169,7 @@ Fri Mar 4 18:22:39 1994 Jason Merrill (jason@deneb.cygnus.com)
(direct_abstract_declarator): Replace `LEFT_RIGHT type_quals' rule (direct_abstract_declarator): Replace `LEFT_RIGHT type_quals' rule
with `fcast_or_absdcl type_quals' rule. with `fcast_or_absdcl type_quals' rule.
Fri Mar 4 16:18:03 1994 Mike Stump (mrs@cygnus.com) Fri Mar 4 16:18:03 1994 Mike Stump <mrs@cygnus.com>
* tree.c (lvalue_p): Improve OFFSET_REF handling, so that it * tree.c (lvalue_p): Improve OFFSET_REF handling, so that it
matches Section 5.5. matches Section 5.5.
...@@ -3960,7 +4179,7 @@ Fri Mar 4 14:01:59 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -3960,7 +4179,7 @@ Fri Mar 4 14:01:59 1994 Jason Merrill (jason@deneb.cygnus.com)
* error.c (dump_type_prefix): Don't print basetype twice for * error.c (dump_type_prefix): Don't print basetype twice for
pmfs. pmfs.
Fri Mar 4 13:24:33 1994 Mike Stump (mrs@cygnus.com) Fri Mar 4 13:24:33 1994 Mike Stump <mrs@cygnus.com>
* typeck.c (convert_arguments): Handle setHandler(A::handlerFn) * typeck.c (convert_arguments): Handle setHandler(A::handlerFn)
so that it is like setHandler(&A::handlerFn). Cures an `invalid so that it is like setHandler(&A::handlerFn). Cures an `invalid
...@@ -3990,7 +4209,7 @@ Fri Mar 4 11:15:59 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -3990,7 +4209,7 @@ Fri Mar 4 11:15:59 1994 Jason Merrill (jason@deneb.cygnus.com)
a decl. Also move the IS_AGGR_TYPE check after the stripping of a decl. Also move the IS_AGGR_TYPE check after the stripping of
REFERENCE_TYPE. REFERENCE_TYPE.
Fri Mar 4 04:46:05 1994 Mike Stump (mrs@cygnus.com) Fri Mar 4 04:46:05 1994 Mike Stump <mrs@cygnus.com>
* call.c (build_method_call): Handle b->setHandler(A::handlerFn) * call.c (build_method_call): Handle b->setHandler(A::handlerFn)
so that it is like b->setHandler(&A::handlerFn). Cures an `invalid so that it is like b->setHandler(&A::handlerFn). Cures an `invalid
...@@ -4092,7 +4311,7 @@ Fri Feb 25 15:23:42 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -4092,7 +4311,7 @@ Fri Feb 25 15:23:42 1994 Jason Merrill (jason@deneb.cygnus.com)
* decl.c (start_function): Fix detection of function overloading. * decl.c (start_function): Fix detection of function overloading.
Thu Feb 24 22:26:19 1994 Mike Stump (mrs@cygnus.com) Thu Feb 24 22:26:19 1994 Mike Stump <mrs@cygnus.com>
* lex.c (check_newline): #pragma interface can take a string * lex.c (check_newline): #pragma interface can take a string
argument, just like #pragma implementation. #pragma implementation argument, just like #pragma implementation. #pragma implementation
...@@ -4152,7 +4371,7 @@ Tue Feb 22 12:10:32 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -4152,7 +4371,7 @@ Tue Feb 22 12:10:32 1994 Jason Merrill (jason@deneb.cygnus.com)
* tree.c (lvalue_p): A COND_EXPR is an lvalue if both of the * tree.c (lvalue_p): A COND_EXPR is an lvalue if both of the
options are. options are.
Mon Feb 21 19:59:40 1994 Mike Stump (mrs@cygnus.com) Mon Feb 21 19:59:40 1994 Mike Stump <mrs@cygnus.com>
* Makefile.in (mostlyclean): lex.c is a source file, don't * Makefile.in (mostlyclean): lex.c is a source file, don't
remove. remove.
...@@ -4313,21 +4532,21 @@ hu Jan 13 17:55:51 EST 1994 Gnanasekaran Swaminathan (gs4t@virginia.edu) ...@@ -4313,21 +4532,21 @@ hu Jan 13 17:55:51 EST 1994 Gnanasekaran Swaminathan (gs4t@virginia.edu)
store_init_value fails, build and expand an INIT_EXPR. If store_init_value fails, build and expand an INIT_EXPR. If
store_init_value succeeds, call expand_decl_init. store_init_value succeeds, call expand_decl_init.
Fri Feb 11 02:49:23 1994 Mike Stump (mrs@cygnus.com) Fri Feb 11 02:49:23 1994 Mike Stump <mrs@cygnus.com>
* class.c (build_vbase_path): Use complete_type_p instead of * class.c (build_vbase_path): Use complete_type_p instead of
resolves_to_fixed_type_p to determine if the virtual bases are in resolves_to_fixed_type_p to determine if the virtual bases are in
their right place for the type of expr. Cures problem of thinking a their right place for the type of expr. Cures problem of thinking a
virtual base class is one place, when it is in fact someplace else. virtual base class is one place, when it is in fact someplace else.
Fri Feb 11 00:26:46 1994 Mike Stump (mrs@cygnus.com) Fri Feb 11 00:26:46 1994 Mike Stump <mrs@cygnus.com>
* init.c (resolve_offset_ref): Make sure we first convert to * init.c (resolve_offset_ref): Make sure we first convert to
intermediate type, if given, when dealing with members off `this'. intermediate type, if given, when dealing with members off `this'.
Solves an incorrrect `type `foo' is not a base type for type Solves an incorrrect `type `foo' is not a base type for type
`multiple'' when it is infact, a base type. `multiple'' when it is infact, a base type.
Thu Feb 10 21:49:35 1994 Mike Stump (mrs@cygnus.com) Thu Feb 10 21:49:35 1994 Mike Stump <mrs@cygnus.com>
* class.c (modify_other_vtable_entries): Use get_binfo, instead * class.c (modify_other_vtable_entries): Use get_binfo, instead
of binfo_value. Solves problem with compiler giving a `base class of binfo_value. Solves problem with compiler giving a `base class
...@@ -4335,7 +4554,7 @@ Thu Feb 10 21:49:35 1994 Mike Stump (mrs@cygnus.com) ...@@ -4335,7 +4554,7 @@ Thu Feb 10 21:49:35 1994 Mike Stump (mrs@cygnus.com)
herarchies, when a virtual function is first defied in a virtual herarchies, when a virtual function is first defied in a virtual
base class. base class.
Thu Feb 10 17:19:32 1994 Mike Stump (mrs@cygnus.com) Thu Feb 10 17:19:32 1994 Mike Stump <mrs@cygnus.com>
* class.c (build_vbase_path): Don't complain about ambiguous * class.c (build_vbase_path): Don't complain about ambiguous
intermediate conversion when converting down to a virtual base intermediate conversion when converting down to a virtual base
...@@ -4351,7 +4570,7 @@ Thu Feb 10 12:18:26 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -4351,7 +4570,7 @@ Thu Feb 10 12:18:26 1994 Jason Merrill (jason@deneb.cygnus.com)
* decl.c (grokdeclarator): Fix detection of virtual new/delete. * decl.c (grokdeclarator): Fix detection of virtual new/delete.
Wed Feb 9 22:02:32 1994 Mike Stump (mrs@cygnus.com) Wed Feb 9 22:02:32 1994 Mike Stump <mrs@cygnus.com>
* search.c (build_mi_virtuals, add_mi_virtuals, * search.c (build_mi_virtuals, add_mi_virtuals,
report_ambiguous_mi_virtuals): Removed unneeded code. report_ambiguous_mi_virtuals): Removed unneeded code.
...@@ -4535,7 +4754,7 @@ Fri Feb 4 14:21:00 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -4535,7 +4754,7 @@ Fri Feb 4 14:21:00 1994 Jason Merrill (jason@deneb.cygnus.com)
* decl.c (grokdeclarator): If friendp && virtualp, friendp = 0. * decl.c (grokdeclarator): If friendp && virtualp, friendp = 0.
Fri Feb 4 13:02:56 1994 Mike Stump (mrs@cygnus.com) Fri Feb 4 13:02:56 1994 Mike Stump <mrs@cygnus.com>
* lex.c (reinit_parse_for_method, cons_up_default_function): * lex.c (reinit_parse_for_method, cons_up_default_function):
Don't give warn_if_unknown_interface warning when it came from a Don't give warn_if_unknown_interface warning when it came from a
...@@ -4689,7 +4908,7 @@ Mon Jan 31 12:07:30 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -4689,7 +4908,7 @@ Mon Jan 31 12:07:30 1994 Jason Merrill (jason@deneb.cygnus.com)
(build_x_unary_op): Ditto. (build_x_unary_op): Ditto.
(build_x_conditional_expr): Ditto. (build_x_conditional_expr): Ditto.
Mon Jan 31 10:00:30 1994 Mike Stump (mrs@cygnus.com) Mon Jan 31 10:00:30 1994 Mike Stump <mrs@cygnus.com>
* cvt.c (build_type_conversion_1): Change call to pedwarn into * cvt.c (build_type_conversion_1): Change call to pedwarn into
warning, and conditionalize upon warn_cast_qual. warning, and conditionalize upon warn_cast_qual.
...@@ -4723,7 +4942,7 @@ Thu Jan 27 19:26:51 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -4723,7 +4942,7 @@ Thu Jan 27 19:26:51 1994 Jason Merrill (jason@deneb.cygnus.com)
* decl.c (grokparms): Abort if we get called with something we don't * decl.c (grokparms): Abort if we get called with something we don't
expect. expect.
Thu Jan 27 17:37:25 1994 Mike Stump (mrs@cygnus.com) Thu Jan 27 17:37:25 1994 Mike Stump <mrs@cygnus.com>
* call.c (build_overload_call_real): Change argument complain to * call.c (build_overload_call_real): Change argument complain to
flags to match style of rest of code. Pass it down to flags to match style of rest of code. Pass it down to
...@@ -4784,12 +5003,12 @@ Wed Jan 26 18:28:14 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -4784,12 +5003,12 @@ Wed Jan 26 18:28:14 1994 Jason Merrill (jason@deneb.cygnus.com)
(add_friend): Never stick in ctype. (add_friend): Never stick in ctype.
Why are the friendship functions in init.c, anyway? Why are the friendship functions in init.c, anyway?
Wed Jan 26 17:50:00 1994 Mike Stump (mrs@cygnus.com) Wed Jan 26 17:50:00 1994 Mike Stump <mrs@cygnus.com>
* cvt.c (build_type_conversion_1): Don't conditionalize call to * cvt.c (build_type_conversion_1): Don't conditionalize call to
pedwarn upon pedantic. pedwarn upon pedantic.
Wed Jan 26 17:20:46 1994 Mike Stump (mrs@cygnus.com) Wed Jan 26 17:20:46 1994 Mike Stump <mrs@cygnus.com>
* cvt.c (convert_to_reference): Add 8.4.3 checking so that one * cvt.c (convert_to_reference): Add 8.4.3 checking so that one
gets a warning if one tries to initialize a non-const & from a gets a warning if one tries to initialize a non-const & from a
...@@ -4797,7 +5016,7 @@ Wed Jan 26 17:20:46 1994 Mike Stump (mrs@cygnus.com) ...@@ -4797,7 +5016,7 @@ Wed Jan 26 17:20:46 1994 Mike Stump (mrs@cygnus.com)
* cvt.c (convert_to_reference): Use %P format for argument * cvt.c (convert_to_reference): Use %P format for argument
numbers in warnings. numbers in warnings.
Wed Jan 26 14:35:06 1994 Mike Stump (mrs@cygnus.com) Wed Jan 26 14:35:06 1994 Mike Stump <mrs@cygnus.com>
* init.c (build_delete): Follow style in call.c to construct the * init.c (build_delete): Follow style in call.c to construct the
virtual call to the desctructor, as that code is right. Fixes a virtual call to the desctructor, as that code is right. Fixes a
...@@ -4814,7 +5033,7 @@ Tue Jan 25 18:39:12 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -4814,7 +5033,7 @@ Tue Jan 25 18:39:12 1994 Jason Merrill (jason@deneb.cygnus.com)
* typeck.c (build_modify_expr): Don't smash references if INIT_EXPR. * typeck.c (build_modify_expr): Don't smash references if INIT_EXPR.
Tue Jan 25 13:54:29 1994 Mike Stump (mrs@cygnus.com) Tue Jan 25 13:54:29 1994 Mike Stump <mrs@cygnus.com>
* init.c (build_delete): Back out Jan 17th & 18th pacthes, as * init.c (build_delete): Back out Jan 17th & 18th pacthes, as
they break libg++. they break libg++.
...@@ -4933,7 +5152,7 @@ Mon Jan 17 13:58:18 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -4933,7 +5152,7 @@ Mon Jan 17 13:58:18 1994 Jason Merrill (jason@deneb.cygnus.com)
* Makefile.in (TAGS): Don't try to run etags on cp-parse.y. * Makefile.in (TAGS): Don't try to run etags on cp-parse.y.
Sat Jan 15 18:34:33 1994 Mike Stump (mrs@cygnus.com) Sat Jan 15 18:34:33 1994 Mike Stump <mrs@cygnus.com>
* Makefile.in, configure: Handle the C++ front-end in a * Makefile.in, configure: Handle the C++ front-end in a
subdirectory. subdirectory.
...@@ -4974,7 +5193,7 @@ Fri Jan 14 18:25:29 1994 Kung Hsu (kung@mexican.cygnus.com) ...@@ -4974,7 +5193,7 @@ Fri Jan 14 18:25:29 1994 Kung Hsu (kung@mexican.cygnus.com)
* cp-spew.c (yylex) : generated SCOPED_NAME token. * cp-spew.c (yylex) : generated SCOPED_NAME token.
* cp-lex.c (yyprint): handle SCOPED_NAME. * cp-lex.c (yyprint): handle SCOPED_NAME.
Fri Jan 14 17:00:29 1994 Mike Stump (mrs@cygnus.com) Fri Jan 14 17:00:29 1994 Mike Stump <mrs@cygnus.com>
* cp-decl.c (pushdecl): Revert patch from Jan 11 19:33:03, as it is * cp-decl.c (pushdecl): Revert patch from Jan 11 19:33:03, as it is
not right. not right.
...@@ -4984,7 +5203,7 @@ Thu Jan 13 14:00:35 1994 Kung Hsu (kung@mexican.cygnus.com) ...@@ -4984,7 +5203,7 @@ Thu Jan 13 14:00:35 1994 Kung Hsu (kung@mexican.cygnus.com)
* cp-decl2.c (grok_x_components): fix a bug that enum type does not * cp-decl2.c (grok_x_components): fix a bug that enum type does not
have type_flags. have type_flags.
Thu Jan 13 11:39:34 1994 Mike Stump (mrs@cygnus.com) Thu Jan 13 11:39:34 1994 Mike Stump <mrs@cygnus.com>
Ensure that all vtable pointers are initialized with all the right Ensure that all vtable pointers are initialized with all the right
values. values.
...@@ -5034,7 +5253,7 @@ Tue Jan 11 19:33:03 1994 Jason Merrill (jason@deneb.cygnus.com) ...@@ -5034,7 +5253,7 @@ Tue Jan 11 19:33:03 1994 Jason Merrill (jason@deneb.cygnus.com)
* cp-class.c (finish_struct): When generating default op=, * cp-class.c (finish_struct): When generating default op=,
set TYPE_HAS_ASSIGNMENT. set TYPE_HAS_ASSIGNMENT.
Mon Jan 10 18:48:06 1994 Mike Stump (mrs@cygnus.com) Mon Jan 10 18:48:06 1994 Mike Stump <mrs@cygnus.com>
* cp-cvt.c (convert): Make {double, clashing enum} -> enum * cp-cvt.c (convert): Make {double, clashing enum} -> enum
invalid. invalid.
...@@ -5093,18 +5312,18 @@ Mon Jan 3 22:22:32 1994 Gerald Baumgartner (gb@cygnus.com) ...@@ -5093,18 +5312,18 @@ Mon Jan 3 22:22:32 1994 Gerald Baumgartner (gb@cygnus.com)
* invoke.texi: Added `-fhandle-signatures' in the list of * invoke.texi: Added `-fhandle-signatures' in the list of
C++ language options. Added explanation for this option. C++ language options. Added explanation for this option.
Tue Dec 28 21:10:03 1993 Mike Stump (mrs@cygnus.com) Tue Dec 28 21:10:03 1993 Mike Stump <mrs@cygnus.com>
* cp-init.c (expand_vec_init): Remove comptypes test, as it is too * cp-init.c (expand_vec_init): Remove comptypes test, as it is too
harsh here. harsh here.
Tue Dec 28 13:42:22 1993 Mike Stump (mrs@cygnus.com) Tue Dec 28 13:42:22 1993 Mike Stump <mrs@cygnus.com>
* cp-pt.c (do_pending_expansions): Decide to expand a template * cp-pt.c (do_pending_expansions): Decide to expand a template
member function, based upon it's class type, not the class type of member function, based upon it's class type, not the class type of
the first place it was declared. the first place it was declared.
Tue Dec 28 05:42:31 1993 Mike Stump (mrs@cygnus.com) Tue Dec 28 05:42:31 1993 Mike Stump <mrs@cygnus.com>
* cp-class.c (is_normal): New routine, use to determine when the * cp-class.c (is_normal): New routine, use to determine when the
given binfo is the normal one. (The one that should have the simple given binfo is the normal one. (The one that should have the simple
...@@ -5238,7 +5457,7 @@ Thu Dec 16 12:17:06 1993 Brendan Kehoe (brendan@lisa.cygnus.com) ...@@ -5238,7 +5457,7 @@ Thu Dec 16 12:17:06 1993 Brendan Kehoe (brendan@lisa.cygnus.com)
* cp-method.c (hack_identifier): Also check for a TYPE_PTRMEMFUNC_P * cp-method.c (hack_identifier): Also check for a TYPE_PTRMEMFUNC_P
to see if something is a method. to see if something is a method.
Wed Dec 15 18:35:58 1993 Mike Stump (mrs@cygnus.com) Wed Dec 15 18:35:58 1993 Mike Stump <mrs@cygnus.com>
* cp-typeck.c (build_modify_expr): Avoid error messages on small * cp-typeck.c (build_modify_expr): Avoid error messages on small
enum bit fields. enum bit fields.
...@@ -5287,7 +5506,7 @@ Fri Dec 10 12:40:25 1993 Brendan Kehoe (brendan@lisa.cygnus.com) ...@@ -5287,7 +5506,7 @@ Fri Dec 10 12:40:25 1993 Brendan Kehoe (brendan@lisa.cygnus.com)
only go for setting TRIVIAL_CODE if we are dealing with types that only go for setting TRIVIAL_CODE if we are dealing with types that
are compatible. are compatible.
Thu Dec 9 18:27:22 1993 Mike Stump (mrs@cygnus.com) Thu Dec 9 18:27:22 1993 Mike Stump <mrs@cygnus.com>
* cp-decl.c (flag_huge_objects): New flag to allow large objects. * cp-decl.c (flag_huge_objects): New flag to allow large objects.
* toplev.c (lang_options): Ditto. * toplev.c (lang_options): Ditto.
...@@ -5305,7 +5524,7 @@ Thu Dec 9 16:19:05 1993 Brendan Kehoe (brendan@lisa.cygnus.com) ...@@ -5305,7 +5524,7 @@ Thu Dec 9 16:19:05 1993 Brendan Kehoe (brendan@lisa.cygnus.com)
NO_{DOLLAR,DOT} macro checks, so it always gets defined. NO_{DOLLAR,DOT} macro checks, so it always gets defined.
(VTABLE_NAME_P): Define for NO_DOT && NO_DOLLAR_IN_LABEL. (VTABLE_NAME_P): Define for NO_DOT && NO_DOLLAR_IN_LABEL.
Wed Dec 8 17:38:06 1993 Mike Stump (mrs@cygnus.com) Wed Dec 8 17:38:06 1993 Mike Stump <mrs@cygnus.com>
* cp-decl.c (finish_decl): Make sure things that can go into * cp-decl.c (finish_decl): Make sure things that can go into
"common", do go into common, if -fcommon is given. "common", do go into common, if -fcommon is given.
...@@ -5593,7 +5812,7 @@ Wed Nov 24 00:49:35 1993 Jason Merrill (jason@deneb.cygnus.com) ...@@ -5593,7 +5812,7 @@ Wed Nov 24 00:49:35 1993 Jason Merrill (jason@deneb.cygnus.com)
Propagate TYPE_GETS_ASSIGN_REF. Use cant_synth_copy_ctor. Add call Propagate TYPE_GETS_ASSIGN_REF. Use cant_synth_copy_ctor. Add call
to cons_up_default_function for operator=. to cons_up_default_function for operator=.
Tue Nov 23 20:24:58 1993 Mike Stump (mrs@cygnus.com) Tue Nov 23 20:24:58 1993 Mike Stump <mrs@cygnus.com>
* cp-cvt.c (convert_force): Add code to perform casting of pointer * cp-cvt.c (convert_force): Add code to perform casting of pointer
to member function types. to member function types.
...@@ -5612,7 +5831,7 @@ Tue Nov 23 18:06:58 1993 Jason Merrill (jason@deneb.cygnus.com) ...@@ -5612,7 +5831,7 @@ Tue Nov 23 18:06:58 1993 Jason Merrill (jason@deneb.cygnus.com)
and its kin properly. and its kin properly.
(xref_tag): Propagate TYPE_GETS_ASSIGN_REF. (xref_tag): Propagate TYPE_GETS_ASSIGN_REF.
Tue Nov 23 12:26:13 1993 Mike Stump (mrs@cygnus.com) Tue Nov 23 12:26:13 1993 Mike Stump <mrs@cygnus.com>
* cp-method.c (build_opfncall): Don't count pointer to member * cp-method.c (build_opfncall): Don't count pointer to member
functions as aggregates here, as we don't want to look up methods in functions as aggregates here, as we don't want to look up methods in
......
...@@ -75,7 +75,7 @@ CXX_SRCS = $(srcdir)/cp/call.c $(srcdir)/cp/decl2.c \ ...@@ -75,7 +75,7 @@ CXX_SRCS = $(srcdir)/cp/call.c $(srcdir)/cp/decl2.c \
$(srcdir)/cp/error.c $(srcdir)/cp/init.c $(srcdir)/cp/parse.y \ $(srcdir)/cp/error.c $(srcdir)/cp/init.c $(srcdir)/cp/parse.y \
$(srcdir)/cp/sig.c $(srcdir)/cp/typeck2.c $(srcdir)/cp/sig.c $(srcdir)/cp/typeck2.c
cc1plus: $(P) $(CXX_SRCS) $(LIBDEPS) stamp-objlist c-common.o cc1plus: $(P) $(CXX_SRCS) $(LIBDEPS) stamp-objlist c-common.o c-pragma.o
cd cp; $(MAKE) $(FLAGS_TO_PASS) $(CXX_FLAGS_TO_PASS) ../cc1plus cd cp; $(MAKE) $(FLAGS_TO_PASS) $(CXX_FLAGS_TO_PASS) ../cc1plus
# Build hooks: # Build hooks:
......
...@@ -162,8 +162,8 @@ CXX_OBJS = call.o decl.o errfn.o expr.o pt.o sig.o typeck2.o \ ...@@ -162,8 +162,8 @@ CXX_OBJS = call.o decl.o errfn.o expr.o pt.o sig.o typeck2.o \
edsel.o except.o init.o method.o search.o tree.o xref.o edsel.o except.o init.o method.o search.o tree.o xref.o
# Language-independent object files. # Language-independent object files.
OBJS = `cat ../stamp-objlist` ../c-common.o OBJS = `cat ../stamp-objlist` ../c-common.o ../c-pragma.o
OBJDEPS = ../stamp-objlist ../c-common.o OBJDEPS = ../stamp-objlist ../c-common.o ../c-pragma.o
compiler: ../cc1plus compiler: ../cc1plus
../cc1plus: $(P) $(CXX_OBJS) $(OBJDEPS) $(LIBDEPS) ../cc1plus: $(P) $(CXX_OBJS) $(OBJDEPS) $(LIBDEPS)
......
...@@ -1802,7 +1802,7 @@ build_method_call (instance, name, parms, basetype_path, flags) ...@@ -1802,7 +1802,7 @@ build_method_call (instance, name, parms, basetype_path, flags)
we can manage. */ we can manage. */
tree temp = get_temp_name (TREE_TYPE (instance), 0); tree temp = get_temp_name (TREE_TYPE (instance), 0);
if (IS_AGGR_TYPE (TREE_TYPE (instance))) if (IS_AGGR_TYPE (TREE_TYPE (instance)))
expand_aggr_init (temp, instance, 0); expand_aggr_init (temp, instance, 0, flags);
else else
{ {
store_init_value (temp, instance); store_init_value (temp, instance);
...@@ -2144,7 +2144,7 @@ build_method_call (instance, name, parms, basetype_path, flags) ...@@ -2144,7 +2144,7 @@ build_method_call (instance, name, parms, basetype_path, flags)
{ {
tree type = build_pointer_type tree type = build_pointer_type
(build_type_variant (basetype, constp, volatilep)); (build_type_variant (basetype, constp, volatilep));
TREE_VALUE (parms) = convert_force (type, instance_ptr); TREE_VALUE (parms) = convert_force (type, instance_ptr, 0);
} }
} }
...@@ -2652,8 +2652,6 @@ build_method_call (instance, name, parms, basetype_path, flags) ...@@ -2652,8 +2652,6 @@ build_method_call (instance, name, parms, basetype_path, flags)
TREE_TYPE (result) = value_type; TREE_TYPE (result) = value_type;
TREE_SIDE_EFFECTS (result) = 1; TREE_SIDE_EFFECTS (result) = 1;
TREE_RAISES (result)
= TYPE_RAISES_EXCEPTIONS (fntype) || (parms && TREE_RAISES (parms));
TREE_HAS_CONSTRUCTOR (result) = is_constructor; TREE_HAS_CONSTRUCTOR (result) = is_constructor;
return result; return result;
} }
......
...@@ -2116,7 +2116,7 @@ finish_vtbls (binfo, do_self, t) ...@@ -2116,7 +2116,7 @@ finish_vtbls (binfo, do_self, t)
&& DECL_INITIAL (decl) != BINFO_VIRTUALS (binfo)) && DECL_INITIAL (decl) != BINFO_VIRTUALS (binfo))
DECL_INITIAL (decl) = build_nt (CONSTRUCTOR, NULL_TREE, DECL_INITIAL (decl) = build_nt (CONSTRUCTOR, NULL_TREE,
BINFO_VIRTUALS (binfo)); BINFO_VIRTUALS (binfo));
finish_decl (decl, DECL_INITIAL (decl), NULL_TREE, 0); finish_decl (decl, DECL_INITIAL (decl), NULL_TREE, 0, 0);
DECL_CONTEXT (decl) = context; DECL_CONTEXT (decl) = context;
} }
CLEAR_BINFO_NEW_VTABLE_MARKED (binfo); CLEAR_BINFO_NEW_VTABLE_MARKED (binfo);
...@@ -3161,10 +3161,26 @@ finish_struct (t, list_of_fieldlists, warn_anon) ...@@ -3161,10 +3161,26 @@ finish_struct (t, list_of_fieldlists, warn_anon)
DECL_INITIAL (x) = NULL; DECL_INITIAL (x) = NULL;
cp_error_at ("zero width for bit-field `%D'", x); cp_error_at ("zero width for bit-field `%D'", x);
} }
else if ((unsigned)width > TYPE_PRECISION (TREE_TYPE (x))) else if (width
> TYPE_PRECISION (long_long_unsigned_type_node))
{ {
/* The backend will dump if you try to use something
too big; avoid that. */
DECL_INITIAL (x) = NULL; DECL_INITIAL (x) = NULL;
cp_error_at ("width of `%D' exceeds its type", x); sorry ("bit-fields larger than %d bits",
TYPE_PRECISION (long_long_unsigned_type_node));
cp_error_at (" in declaration of `%D'", x);
}
else if (width > TYPE_PRECISION (TREE_TYPE (x))
&& TREE_CODE (TREE_TYPE (x)) != ENUMERAL_TYPE)
{
cp_warning_at ("width of `%D' exceeds its type", x);
}
else if (width < TYPE_PRECISION (TREE_TYPE (x))
&& TREE_CODE (TREE_TYPE (x)) == ENUMERAL_TYPE)
{
cp_warning_at ("`%D' is too small to hold all values of `%#T'",
x, TREE_TYPE (x));
} }
} }
......
...@@ -1787,6 +1787,7 @@ extern tree current_class_type; /* _TYPE: the type of the current class */ ...@@ -1787,6 +1787,7 @@ extern tree current_class_type; /* _TYPE: the type of the current class */
as well as the space of member functions. as well as the space of member functions.
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_NO_CONVERSION means that user-defined conversions are not LOOKUP_NO_CONVERSION means that user-defined conversions are not
permitted. Built-in conversions are permitted. permitted. Built-in conversions are permitted.
LOOKUP_DESTRUCTOR means explicit call to destructor. */ LOOKUP_DESTRUCTOR means explicit call to destructor. */
...@@ -1809,13 +1810,15 @@ extern tree current_class_type; /* _TYPE: the type of the current class */ ...@@ -1809,13 +1810,15 @@ extern tree current_class_type; /* _TYPE: the type of the current class */
CONV_STATIC : Perform the explicit conversions for static_cast. CONV_STATIC : Perform the explicit conversions for static_cast.
CONV_CONST : Perform the explicit conversions for const_cast. CONV_CONST : Perform the explicit conversions for const_cast.
CONV_REINTERPRET: Perform the explicit conversions for reinterpret_cast. CONV_REINTERPRET: Perform the explicit conversions for reinterpret_cast.
CONV_PRIVATE : Perform upcasts to private bases. */ CONV_PRIVATE : Perform upcasts to private bases.
CONV_NONCONVERTING : Allow non-converting constructors to be used. */
#define CONV_IMPLICIT 1 #define CONV_IMPLICIT 1
#define CONV_STATIC 2 #define CONV_STATIC 2
#define CONV_CONST 4 #define CONV_CONST 4
#define CONV_REINTERPRET 8 #define CONV_REINTERPRET 8
#define CONV_PRIVATE 16 #define CONV_PRIVATE 16
#define CONV_NONCONVERTING 32
#define CONV_STATIC_CAST (CONV_IMPLICIT | CONV_STATIC) #define CONV_STATIC_CAST (CONV_IMPLICIT | CONV_STATIC)
#define CONV_OLD_CONVERT (CONV_IMPLICIT | CONV_STATIC | CONV_CONST \ #define CONV_OLD_CONVERT (CONV_IMPLICIT | CONV_STATIC | CONV_CONST \
| CONV_REINTERPRET) | CONV_REINTERPRET)
...@@ -1896,7 +1899,8 @@ extern tree convert_pointer_to PROTO((tree, tree)); ...@@ -1896,7 +1899,8 @@ extern tree convert_pointer_to PROTO((tree, tree));
extern tree convert_pointer_to_real PROTO((tree, tree)); extern tree convert_pointer_to_real PROTO((tree, tree));
extern tree convert_pointer_to_vbase PROTO((tree, tree)); extern tree convert_pointer_to_vbase PROTO((tree, tree));
extern tree convert PROTO((tree, tree)); extern tree convert PROTO((tree, tree));
extern tree convert_force PROTO((tree, tree)); extern tree cp_convert PROTO((tree, tree, int, int));
extern tree convert_force PROTO((tree, tree, int));
extern tree build_type_conversion PROTO((enum tree_code, tree, tree, int)); extern tree build_type_conversion PROTO((enum tree_code, tree, tree, int));
extern int build_default_binary_type_conversion PROTO((enum tree_code, tree *, tree *)); extern int build_default_binary_type_conversion PROTO((enum tree_code, tree *, tree *));
extern int build_default_unary_type_conversion PROTO((enum tree_code, tree *)); extern int build_default_unary_type_conversion PROTO((enum tree_code, tree *));
...@@ -1956,7 +1960,7 @@ extern void shadow_tag PROTO((tree)); ...@@ -1956,7 +1960,7 @@ extern void shadow_tag PROTO((tree));
extern int grok_ctor_properties PROTO((tree, tree)); extern int grok_ctor_properties PROTO((tree, tree));
extern tree groktypename PROTO((tree)); extern tree groktypename PROTO((tree));
extern tree start_decl PROTO((tree, tree, int, tree)); extern tree start_decl PROTO((tree, tree, int, tree));
extern void finish_decl PROTO((tree, tree, tree, int)); extern void finish_decl PROTO((tree, tree, tree, int, int));
extern void expand_static_init PROTO((tree, tree)); extern void expand_static_init PROTO((tree, tree));
extern int complete_array_type PROTO((tree, tree, int)); extern int complete_array_type PROTO((tree, tree, int));
extern tree build_ptrmemfunc_type PROTO((tree)); extern tree build_ptrmemfunc_type PROTO((tree));
...@@ -2018,6 +2022,9 @@ extern tree reparse_decl_as_expr PROTO((tree, tree)); ...@@ -2018,6 +2022,9 @@ extern tree reparse_decl_as_expr PROTO((tree, tree));
extern tree finish_decl_parsing PROTO((tree)); extern tree finish_decl_parsing PROTO((tree));
extern tree lookup_name_nonclass PROTO((tree)); extern tree lookup_name_nonclass PROTO((tree));
extern tree check_cp_case_value PROTO((tree)); extern tree check_cp_case_value PROTO((tree));
extern tree do_using_decl PROTO((tree));
extern tree current_namespace_id PROTO((tree));
extern tree get_namespace_id PROTO((void));
/* in edsel.c */ /* in edsel.c */
...@@ -2066,7 +2073,7 @@ extern void check_base_init PROTO((tree)); ...@@ -2066,7 +2073,7 @@ extern void check_base_init PROTO((tree));
extern void expand_direct_vtbls_init PROTO((tree, tree, int, int, tree)); extern void expand_direct_vtbls_init PROTO((tree, tree, int, int, tree));
extern void do_member_init PROTO((tree, tree, tree)); extern void do_member_init PROTO((tree, tree, tree));
extern void expand_member_init PROTO((tree, tree, tree)); extern void expand_member_init PROTO((tree, tree, tree));
extern void expand_aggr_init PROTO((tree, tree, int)); extern void expand_aggr_init PROTO((tree, tree, int, int));
extern int is_aggr_typedef PROTO((tree, int)); extern int is_aggr_typedef PROTO((tree, int));
extern tree get_aggr_from_typedef PROTO((tree, int)); extern tree get_aggr_from_typedef PROTO((tree, int));
extern tree get_type_value PROTO((tree)); extern tree get_type_value PROTO((tree));
...@@ -2347,7 +2354,7 @@ extern tree build_compound_expr PROTO((tree)); ...@@ -2347,7 +2354,7 @@ extern tree build_compound_expr PROTO((tree));
extern tree build_static_cast PROTO((tree, tree)); extern tree build_static_cast PROTO((tree, tree));
extern tree build_reinterpret_cast PROTO((tree, tree)); extern tree build_reinterpret_cast PROTO((tree, tree));
extern tree build_const_cast PROTO((tree, tree)); extern tree build_const_cast PROTO((tree, tree));
extern tree build_c_cast PROTO((tree, tree)); extern tree build_c_cast PROTO((tree, tree, int));
extern tree build_modify_expr PROTO((tree, enum tree_code, tree)); extern tree build_modify_expr PROTO((tree, enum tree_code, tree));
extern int language_lvalue_valid PROTO((tree)); extern int language_lvalue_valid PROTO((tree));
extern void warn_for_assignment PROTO((char *, char *, char *, tree, int, int)); extern void warn_for_assignment PROTO((char *, char *, char *, tree, int, int));
......
...@@ -309,6 +309,10 @@ build_up_reference (type, arg, flags, checkconst) ...@@ -309,6 +309,10 @@ build_up_reference (type, arg, flags, checkconst)
targ = arg; targ = arg;
if (TREE_CODE (targ) == SAVE_EXPR) if (TREE_CODE (targ) == SAVE_EXPR)
targ = TREE_OPERAND (targ, 0); targ = TREE_OPERAND (targ, 0);
while (TREE_CODE (targ) == NOP_EXPR
&& (TYPE_MAIN_VARIANT (argtype)
== TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (targ, 0)))))
targ = TREE_OPERAND (targ, 0);
switch (TREE_CODE (targ)) switch (TREE_CODE (targ))
{ {
...@@ -552,13 +556,16 @@ build_up_reference (type, arg, flags, checkconst) ...@@ -552,13 +556,16 @@ build_up_reference (type, arg, flags, checkconst)
} }
else else
{ {
/* We should never get here for class objects, because they are
always in memory. */
my_friendly_assert (! IS_AGGR_TYPE (argtype), 362);
temp = get_temp_name (argtype, 0); temp = get_temp_name (argtype, 0);
if (global_bindings_p ()) if (global_bindings_p ())
{ {
/* Give this new temp some rtl and initialize it. */ /* Give this new temp some rtl and initialize it. */
DECL_INITIAL (temp) = targ; DECL_INITIAL (temp) = targ;
TREE_STATIC (temp) = 1; TREE_STATIC (temp) = 1;
finish_decl (temp, targ, NULL_TREE, 0); finish_decl (temp, targ, NULL_TREE, 0, LOOKUP_ONLYCONVERTING);
/* Do this after declaring it static. */ /* Do this after declaring it static. */
rval = build_unary_op (ADDR_EXPR, temp, 0); rval = build_unary_op (ADDR_EXPR, temp, 0);
TREE_TYPE (rval) = type; TREE_TYPE (rval) = type;
...@@ -605,8 +612,6 @@ build_up_reference (type, arg, flags, checkconst) ...@@ -605,8 +612,6 @@ build_up_reference (type, arg, flags, checkconst)
initialized. It can be error_mark_node if we don't know the _DECL but initialized. It can be error_mark_node if we don't know the _DECL but
we know it's an initialization. */ we know it's an initialization. */
tree cp_convert PROTO((tree, tree, int, int));
tree tree
convert_to_reference (reftype, expr, convtype, flags, decl) convert_to_reference (reftype, expr, convtype, flags, decl)
tree reftype, expr; tree reftype, expr;
...@@ -703,7 +708,7 @@ convert_to_reference (reftype, expr, convtype, flags, decl) ...@@ -703,7 +708,7 @@ convert_to_reference (reftype, expr, convtype, flags, decl)
rval = build_unary_op (ADDR_EXPR, expr, 0); rval = build_unary_op (ADDR_EXPR, expr, 0);
if (rval != error_mark_node) if (rval != error_mark_node)
rval = convert_force (build_pointer_type (TREE_TYPE (reftype)), rval); rval = convert_force (build_pointer_type (TREE_TYPE (reftype)), rval, 0);
if (rval != error_mark_node) if (rval != error_mark_node)
rval = build1 (NOP_EXPR, reftype, rval); rval = build1 (NOP_EXPR, reftype, rval);
} }
...@@ -1061,7 +1066,6 @@ convert_to_aggr (type, expr, msgp, protect) ...@@ -1061,7 +1066,6 @@ convert_to_aggr (type, expr, msgp, protect)
NULL_TREE); NULL_TREE);
TREE_TYPE (result) = TREE_TYPE (fntype); TREE_TYPE (result) = TREE_TYPE (fntype);
TREE_SIDE_EFFECTS (result) = 1; TREE_SIDE_EFFECTS (result) = 1;
TREE_RAISES (result) = !! TYPE_RAISES_EXCEPTIONS (fntype);
return result; return result;
} }
...@@ -1184,10 +1188,8 @@ cp_convert (type, expr, convtype, flags) ...@@ -1184,10 +1188,8 @@ cp_convert (type, expr, convtype, flags)
register tree e = expr; register tree e = expr;
register enum tree_code code = TREE_CODE (type); register enum tree_code code = TREE_CODE (type);
if (type == TREE_TYPE (e) if (TREE_CODE (e) == ERROR_MARK
|| TREE_CODE (e) == ERROR_MARK) || TREE_CODE (TREE_TYPE (e)) == ERROR_MARK)
return e;
if (TREE_CODE (TREE_TYPE (e)) == ERROR_MARK)
return error_mark_node; return error_mark_node;
/* Trivial conversion: cv-qualifiers do not matter on rvalues. */ /* Trivial conversion: cv-qualifiers do not matter on rvalues. */
...@@ -1229,7 +1231,8 @@ cp_convert (type, expr, convtype, flags) ...@@ -1229,7 +1231,8 @@ cp_convert (type, expr, convtype, flags)
/* enum = enum, enum = int, enum = float are all errors. */ /* enum = enum, enum = int, enum = float are all errors. */
if (flag_int_enum_equivalence == 0 if (flag_int_enum_equivalence == 0
&& TREE_CODE (type) == ENUMERAL_TYPE && TREE_CODE (type) == ENUMERAL_TYPE
&& ARITHMETIC_TYPE_P (intype)) && ARITHMETIC_TYPE_P (intype)
&& ! (convtype & CONV_STATIC))
{ {
cp_pedwarn ("conversion from `%#T' to `%#T'", intype, type); cp_pedwarn ("conversion from `%#T' to `%#T'", intype, type);
...@@ -1309,7 +1312,7 @@ cp_convert (type, expr, convtype, flags) ...@@ -1309,7 +1312,7 @@ cp_convert (type, expr, convtype, flags)
sig_ptr = get_temp_name (type, 1); sig_ptr = get_temp_name (type, 1);
DECL_INITIAL (sig_ptr) = constructor; DECL_INITIAL (sig_ptr) = constructor;
CLEAR_SIGNATURE (sig_ty); CLEAR_SIGNATURE (sig_ty);
finish_decl (sig_ptr, constructor, 0, 0); finish_decl (sig_ptr, constructor, NULL_TREE, 0, 0);
SET_SIGNATURE (sig_ty); SET_SIGNATURE (sig_ty);
TREE_READONLY (sig_ptr) = 1; TREE_READONLY (sig_ptr) = 1;
...@@ -1338,7 +1341,7 @@ cp_convert (type, expr, convtype, flags) ...@@ -1338,7 +1341,7 @@ cp_convert (type, expr, convtype, flags)
build_tree_list (NULL_TREE, e), build_tree_list (NULL_TREE, e),
TYPE_BINFO (type), TYPE_BINFO (type),
LOOKUP_NORMAL | LOOKUP_SPECULATIVELY LOOKUP_NORMAL | LOOKUP_SPECULATIVELY
| LOOKUP_ONLYCONVERTING | (convtype&CONV_NONCONVERTING ? 0 : LOOKUP_ONLYCONVERTING)
| (conversion ? LOOKUP_NO_CONVERSION : 0)); | (conversion ? LOOKUP_NO_CONVERSION : 0));
if (ctor == error_mark_node) if (ctor == error_mark_node)
...@@ -1428,9 +1431,10 @@ convert (type, expr) ...@@ -1428,9 +1431,10 @@ convert (type, expr)
are not normally allowed due to access restrictions are not normally allowed due to access restrictions
(such as conversion from sub-type to private super-type). */ (such as conversion from sub-type to private super-type). */
tree tree
convert_force (type, expr) convert_force (type, expr, convtype)
tree type; tree type;
tree expr; tree expr;
int convtype;
{ {
register tree e = expr; register tree e = expr;
register enum tree_code code = TREE_CODE (type); register enum tree_code code = TREE_CODE (type);
...@@ -1455,13 +1459,8 @@ convert_force (type, expr) ...@@ -1455,13 +1459,8 @@ convert_force (type, expr)
/* compatible pointer to member functions. */ /* compatible pointer to member functions. */
return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), e, 1); return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), e, 1);
} }
{
int old_equiv = flag_int_enum_equivalence; return cp_convert (type, e, CONV_OLD_CONVERT|convtype, 0);
flag_int_enum_equivalence = 1;
e = convert (type, e);
flag_int_enum_equivalence = old_equiv;
}
return e;
} }
/* Subroutine of build_type_conversion. */ /* Subroutine of build_type_conversion. */
......
...@@ -932,7 +932,8 @@ poplevel (keep, reverse, functionbody) ...@@ -932,7 +932,8 @@ poplevel (keep, reverse, functionbody)
if (TREE_CODE (decl) == FUNCTION_DECL if (TREE_CODE (decl) == FUNCTION_DECL
&& ! TREE_ASM_WRITTEN (decl) && ! TREE_ASM_WRITTEN (decl)
&& DECL_INITIAL (decl) != NULL_TREE && DECL_INITIAL (decl) != NULL_TREE
&& TREE_ADDRESSABLE (decl)) && TREE_ADDRESSABLE (decl)
&& decl_function_context (decl) == current_function_decl)
{ {
/* If this decl was copied from a file-scope decl /* If this decl was copied from a file-scope decl
on account of a block-scope extern decl, on account of a block-scope extern decl,
...@@ -1933,7 +1934,7 @@ clear_anon_tags () ...@@ -1933,7 +1934,7 @@ clear_anon_tags ()
For C++, we must compare the parameter list so that `int' can match For C++, we must compare the parameter list so that `int' can match
`int&' in a parameter position, but `int&' is not confused with `int&' in a parameter position, but `int&' is not confused with
`const int&'. */ `const int&'. */
static int int
decls_match (newdecl, olddecl) decls_match (newdecl, olddecl)
tree newdecl, olddecl; tree newdecl, olddecl;
{ {
...@@ -2276,13 +2277,6 @@ duplicate_decls (newdecl, olddecl) ...@@ -2276,13 +2277,6 @@ duplicate_decls (newdecl, olddecl)
DECL_LANGUAGE (newdecl)); DECL_LANGUAGE (newdecl));
} }
} }
/* These bits are logically part of the type. */
if (pedantic
&& (TREE_READONLY (newdecl) != TREE_READONLY (olddecl)
|| TREE_THIS_VOLATILE (newdecl) != TREE_THIS_VOLATILE (olddecl)))
cp_error_at ("type qualifiers for `%D' conflict with previous decl",
newdecl);
} }
/* If new decl is `static' and an `extern' was seen previously, /* If new decl is `static' and an `extern' was seen previously,
...@@ -2391,7 +2385,7 @@ duplicate_decls (newdecl, olddecl) ...@@ -2391,7 +2385,7 @@ duplicate_decls (newdecl, olddecl)
if (! compexcepttypes (TREE_TYPE (newdecl), TREE_TYPE (olddecl), 0)) if (! compexcepttypes (TREE_TYPE (newdecl), TREE_TYPE (olddecl), 0))
{ {
cp_error ("declaration of `%D' raises different exceptions...", cp_error ("declaration of `%D' throws different exceptions...",
newdecl); newdecl);
cp_error_at ("...from previous declaration here", olddecl); cp_error_at ("...from previous declaration here", olddecl);
} }
...@@ -2535,6 +2529,8 @@ duplicate_decls (newdecl, olddecl) ...@@ -2535,6 +2529,8 @@ duplicate_decls (newdecl, olddecl)
if (DECL_ARGUMENTS (olddecl)) if (DECL_ARGUMENTS (olddecl))
DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl); DECL_ARGUMENTS (newdecl) = DECL_ARGUMENTS (olddecl);
} }
if (DECL_LANG_SPECIFIC (olddecl))
DECL_MAIN_VARIANT (newdecl) = DECL_MAIN_VARIANT (olddecl);
} }
if (TREE_CODE (newdecl) == TEMPLATE_DECL) if (TREE_CODE (newdecl) == TEMPLATE_DECL)
...@@ -2671,7 +2667,7 @@ pushdecl (x) ...@@ -2671,7 +2667,7 @@ pushdecl (x)
#else #else
/* Type are looked up using the DECL_NAME, as that is what the rest of the /* Type are looked up using the DECL_NAME, as that is what the rest of the
compiler wants to use. */ compiler wants to use. */
if (TREE_CODE (x) == TYPE_DECL) if (TREE_CODE (x) == TYPE_DECL || TREE_CODE (x) == VAR_DECL)
name = DECL_NAME (x); name = DECL_NAME (x);
#endif #endif
...@@ -2908,39 +2904,13 @@ pushdecl (x) ...@@ -2908,39 +2904,13 @@ pushdecl (x)
&& TREE_CODE (oldglobal) == FUNCTION_DECL) && TREE_CODE (oldglobal) == FUNCTION_DECL)
{ {
/* We have one. Their types must agree. */ /* We have one. Their types must agree. */
if (! comptypes (TREE_TYPE (x), TREE_TYPE (oldglobal), 1)) if (duplicate_decls (x, oldglobal))
/* OK */;
else
{ {
cp_warning ("extern declaration of `%#D' doesn't match", x); cp_warning ("extern declaration of `%#D' doesn't match", x);
cp_warning_at ("global declaration `%#D'", oldglobal); cp_warning_at ("global declaration `%#D'", oldglobal);
} }
else
{
/* Inner extern decl is inline if global one is.
Copy enough to really inline it. */
if (DECL_INLINE (oldglobal))
{
DECL_INLINE (x) = DECL_INLINE (oldglobal);
DECL_INITIAL (x) = (current_function_decl == oldglobal
? NULL_TREE : DECL_INITIAL (oldglobal));
DECL_SAVED_INSNS (x) = DECL_SAVED_INSNS (oldglobal);
DECL_FRAME_SIZE (x) = DECL_FRAME_SIZE (oldglobal);
DECL_ARGUMENTS (x) = DECL_ARGUMENTS (oldglobal);
DECL_RESULT (x) = DECL_RESULT (oldglobal);
TREE_ASM_WRITTEN (x) = TREE_ASM_WRITTEN (oldglobal);
DECL_ABSTRACT_ORIGIN (x) = oldglobal;
}
/* Inner extern decl is built-in if global one is. */
if (DECL_BUILT_IN (oldglobal))
{
DECL_BUILT_IN (x) = DECL_BUILT_IN (oldglobal);
DECL_FUNCTION_CODE (x) = DECL_FUNCTION_CODE (oldglobal);
}
/* Keep the arg types from a file-scope fcn defn. */
if (TYPE_ARG_TYPES (TREE_TYPE (oldglobal)) != NULL_TREE
&& DECL_INITIAL (oldglobal)
&& TYPE_ARG_TYPES (TREE_TYPE (x)) == NULL_TREE)
TREE_TYPE (x) = TREE_TYPE (oldglobal);
}
} }
/* If we have a local external declaration, /* If we have a local external declaration,
and no file-scope declaration has yet been seen, and no file-scope declaration has yet been seen,
...@@ -5625,7 +5595,7 @@ make_temporary_for_reference (decl, ctor_call, init, cleanupp) ...@@ -5625,7 +5595,7 @@ make_temporary_for_reference (decl, ctor_call, init, cleanupp)
{ {
DECL_INITIAL (tmp) = init; DECL_INITIAL (tmp) = init;
TREE_STATIC (tmp) = current_binding_level == global_binding_level; TREE_STATIC (tmp) = current_binding_level == global_binding_level;
finish_decl (tmp, init, 0, 0); finish_decl (tmp, init, NULL_TREE, 0, LOOKUP_ONLYCONVERTING);
} }
if (TREE_STATIC (tmp)) if (TREE_STATIC (tmp))
preserve_initializer (); preserve_initializer ();
...@@ -5740,6 +5710,24 @@ grok_reference_init (decl, type, init, cleanupp) ...@@ -5740,6 +5710,24 @@ grok_reference_init (decl, type, init, cleanupp)
return; return;
} }
/* Fill in DECL_INITIAL with some magical value to prevent expand_decl from
mucking with forces it does not comprehend (i.e. initialization with a
constructor). If we are at global scope and won't go into COMMON, fill
it in with a dummy CONSTRUCTOR to force the variable into .data;
otherwise we can use error_mark_node. */
static void
obscure_complex_init (decl)
tree decl;
{
if (current_binding_level == global_binding_level
&& ! DECL_COMMON (decl))
DECL_INITIAL (decl) = build (CONSTRUCTOR, TREE_TYPE (decl), NULL_TREE,
NULL_TREE);
else
DECL_INITIAL (decl) = error_mark_node;
}
/* Finish processing of a declaration; /* Finish processing of a declaration;
install its line number and initial value. install its line number and initial value.
If the length of an array type is not known before, If the length of an array type is not known before,
...@@ -5754,16 +5742,20 @@ grok_reference_init (decl, type, init, cleanupp) ...@@ -5754,16 +5742,20 @@ grok_reference_init (decl, type, init, cleanupp)
INIT0 holds the value of an initializer that should be allowed to escape INIT0 holds the value of an initializer that should be allowed to escape
the normal rules. the normal rules.
FLAGS is LOOKUP_ONLYCONVERTING is the = init syntax was used, else 0
if the (init) syntax was used.
For functions that take default parameters, DECL points to its For functions that take default parameters, DECL points to its
"maximal" instantiation. `finish_decl' must then also declared its "maximal" instantiation. `finish_decl' must then also declared its
subsequently lower and lower forms of instantiation, checking for subsequently lower and lower forms of instantiation, checking for
ambiguity as it goes. This can be sped up later. */ ambiguity as it goes. This can be sped up later. */
void void
finish_decl (decl, init, asmspec_tree, need_pop) finish_decl (decl, init, asmspec_tree, need_pop, flags)
tree decl, init; tree decl, init;
tree asmspec_tree; tree asmspec_tree;
int need_pop; int need_pop;
int flags;
{ {
register tree type; register tree type;
tree cleanup = NULL_TREE, ttype; tree cleanup = NULL_TREE, ttype;
...@@ -5871,10 +5863,7 @@ finish_decl (decl, init, asmspec_tree, need_pop) ...@@ -5871,10 +5863,7 @@ finish_decl (decl, init, asmspec_tree, need_pop)
if (asmspec) if (asmspec)
{ {
/* This must override the asm specifier which was placed /* This must override the asm specifier which was placed
by grokclassfn. Lay this out fresh. by grokclassfn. Lay this out fresh. */
@@ Should emit an error if this redefines an asm-specified
@@ name, or if we have already used the function's name. */
DECL_RTL (TREE_TYPE (decl)) = NULL_RTX; DECL_RTL (TREE_TYPE (decl)) = NULL_RTX;
DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec); DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec);
make_decl_rtl (decl, asmspec, 0); make_decl_rtl (decl, asmspec, 0);
...@@ -5971,18 +5960,7 @@ finish_decl (decl, init, asmspec_tree, need_pop) ...@@ -5971,18 +5960,7 @@ finish_decl (decl, init, asmspec_tree, need_pop)
/* We must hide the initializer so that expand_decl /* We must hide the initializer so that expand_decl
won't try to do something it does not understand. */ won't try to do something it does not understand. */
if (current_binding_level == global_binding_level) obscure_complex_init (decl);
{
tree value;
if (DECL_COMMON (decl))
/* Should this be a NULL_TREE? */
value = error_mark_node;
else
value = build (CONSTRUCTOR, type, NULL_TREE, NULL_TREE);
DECL_INITIAL (decl) = value;
}
else
DECL_INITIAL (decl) = error_mark_node;
} }
else else
{ {
...@@ -5993,14 +5971,7 @@ finish_decl (decl, init, asmspec_tree, need_pop) ...@@ -5993,14 +5971,7 @@ finish_decl (decl, init, asmspec_tree, need_pop)
/* Don't let anyone try to initialize this variable /* Don't let anyone try to initialize this variable
until we are ready to do so. */ until we are ready to do so. */
if (init) if (init)
{ obscure_complex_init (decl);
tree value;
if (DECL_COMMON (decl))
value = error_mark_node;
else
value = build (CONSTRUCTOR, type, NULL_TREE, NULL_TREE);
DECL_INITIAL (decl) = value;
}
} }
} }
else if (DECL_EXTERNAL (decl)) else if (DECL_EXTERNAL (decl))
...@@ -6026,20 +5997,9 @@ finish_decl (decl, init, asmspec_tree, need_pop) ...@@ -6026,20 +5997,9 @@ finish_decl (decl, init, asmspec_tree, need_pop)
&& (TYPE_READONLY (type) || TREE_READONLY (decl))) && (TYPE_READONLY (type) || TREE_READONLY (decl)))
cp_error ("uninitialized const `%D'", decl); cp_error ("uninitialized const `%D'", decl);
/* Initialize variables in need of static initialization with if (TYPE_SIZE (type) != NULL_TREE
an empty CONSTRUCTOR to keep assemble_variable from putting them in && TYPE_NEEDS_CONSTRUCTING (type))
the wrong program space. */ obscure_complex_init (decl);
if (flag_pic == 0
&& TREE_STATIC (decl)
&& TREE_PUBLIC (decl)
&& ! DECL_EXTERNAL (decl)
&& TREE_CODE (decl) == VAR_DECL
&& TYPE_NEEDS_CONSTRUCTING (type)
&& (DECL_INITIAL (decl) == NULL_TREE
|| DECL_INITIAL (decl) == error_mark_node)
&& ! DECL_COMMON (decl))
DECL_INITIAL (decl) = build (CONSTRUCTOR, type, NULL_TREE,
NULL_TREE);
} }
else if (TREE_CODE (decl) == VAR_DECL else if (TREE_CODE (decl) == VAR_DECL
&& TREE_CODE (type) != REFERENCE_TYPE && TREE_CODE (type) != REFERENCE_TYPE
...@@ -6396,7 +6356,7 @@ finish_decl (decl, init, asmspec_tree, need_pop) ...@@ -6396,7 +6356,7 @@ finish_decl (decl, init, asmspec_tree, need_pop)
{ {
emit_line_note (DECL_SOURCE_FILE (decl), emit_line_note (DECL_SOURCE_FILE (decl),
DECL_SOURCE_LINE (decl)); DECL_SOURCE_LINE (decl));
expand_aggr_init (decl, init, 0); expand_aggr_init (decl, init, 0, flags);
} }
/* Set this to 0 so we can tell whether an aggregate which /* Set this to 0 so we can tell whether an aggregate which
...@@ -6510,7 +6470,7 @@ expand_static_init (decl, init) ...@@ -6510,7 +6470,7 @@ expand_static_init (decl, init)
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)))
{ {
expand_aggr_init (decl, init, 0); expand_aggr_init (decl, init, 0, 0);
do_pending_stack_adjust (); do_pending_stack_adjust ();
} }
else else
...@@ -6639,7 +6599,7 @@ bad_specifiers (object, type, virtualp, quals, inlinep, friendp, raises) ...@@ -6639,7 +6599,7 @@ bad_specifiers (object, type, virtualp, quals, inlinep, friendp, raises)
if (friendp) if (friendp)
cp_error_at ("invalid friend declaration", object); cp_error_at ("invalid friend declaration", object);
if (raises) if (raises)
cp_error_at ("invalid raises declaration", object); cp_error_at ("invalid exception specifications", object);
} }
/* CTYPE is class type, or null if non-class. /* CTYPE is class type, or null if non-class.
...@@ -6889,6 +6849,8 @@ grokvardecl (type, declarator, specbits, initialized) ...@@ -6889,6 +6849,8 @@ grokvardecl (type, declarator, specbits, initialized)
else else
decl = build_decl (VAR_DECL, declarator, type); decl = build_decl (VAR_DECL, declarator, type);
DECL_ASSEMBLER_NAME (decl) = current_namespace_id (DECL_ASSEMBLER_NAME (decl));
if (RIDBIT_SETP (RID_EXTERN, specbits)) if (RIDBIT_SETP (RID_EXTERN, specbits))
{ {
DECL_THIS_EXTERN (decl) = 1; DECL_THIS_EXTERN (decl) = 1;
...@@ -7166,7 +7128,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) ...@@ -7166,7 +7128,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises)
init = TREE_OPERAND (decl, 1); init = TREE_OPERAND (decl, 1);
decl = start_decl (declarator, declspecs, 1, NULL_TREE); decl = start_decl (declarator, declspecs, 1, NULL_TREE);
finish_decl (decl, init, NULL_TREE, 1); finish_decl (decl, init, NULL_TREE, 1, 0);
return 0; return 0;
} }
innermost_code = TREE_CODE (decl); innermost_code = TREE_CODE (decl);
...@@ -9071,7 +9033,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises) ...@@ -9071,7 +9033,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises)
return NULL_TREE; return NULL_TREE;
if (ctype == NULL_TREE && DECL_LANGUAGE (decl) != lang_c) if (ctype == NULL_TREE && DECL_LANGUAGE (decl) != lang_c)
DECL_ASSEMBLER_NAME (decl) = declarator; DECL_ASSEMBLER_NAME (decl) = current_namespace_id (declarator);
if (staticp == 1) if (staticp == 1)
{ {
...@@ -10349,26 +10311,17 @@ finish_enum (enumtype, values) ...@@ -10349,26 +10311,17 @@ finish_enum (enumtype, values)
int highprec = min_precision (maxnode, unsignedp); int highprec = min_precision (maxnode, unsignedp);
int precision = MAX (lowprec, highprec); int precision = MAX (lowprec, highprec);
if (! flag_short_enums && precision < TYPE_PRECISION (integer_type_node)) TYPE_SIZE (enumtype) = NULL_TREE;
precision = TYPE_PRECISION (integer_type_node);
/* /* Lay out the type as though it were an integer. */
* The following code is unnecessary since the function if (! flag_short_enums && precision < TYPE_PRECISION (integer_type_node))
* type_promotes_to deals correctly with promotion of enums of {
* underlying unsigned types to signed integer types. TYPE_MIN_VALUE (enumtype) = minnode;
* Moreover, it causes an enum bitfield to require one more bit of TYPE_PRECISION (enumtype) = TYPE_PRECISION (integer_type_node);
* storage than defined by the ANSI/ISO C++ resolution section r.7.2 layout_type (enumtype);
* which defines the range of an enum. }
*/
#if 0
/* Unlike the C frontend, we prefer signed types. */
if (unsignedp && int_fits_type_p (maxnode, type_for_size (precision, 0)))
unsignedp = 0;
#endif
TYPE_PRECISION (enumtype) = precision; TYPE_PRECISION (enumtype) = precision;
TYPE_SIZE (enumtype) = NULL_TREE;
if (unsignedp) if (unsignedp)
fixup_unsigned_type (enumtype); fixup_unsigned_type (enumtype);
else else
...@@ -11110,7 +11063,7 @@ store_return_init (return_id, init) ...@@ -11110,7 +11063,7 @@ store_return_init (return_id, init)
/* Let `finish_decl' know that this initializer is ok. */ /* Let `finish_decl' know that this initializer is ok. */
DECL_INITIAL (decl) = init; DECL_INITIAL (decl) = init;
pushdecl (decl); pushdecl (decl);
finish_decl (decl, init, 0, 0); finish_decl (decl, init, NULL_TREE, 0, LOOKUP_ONLYCONVERTING);
} }
} }
...@@ -11757,7 +11710,7 @@ start_method (declspecs, declarator, raises) ...@@ -11757,7 +11710,7 @@ start_method (declspecs, declarator, raises)
grok_op_properties (fndecl, DECL_VIRTUAL_P (fndecl), 0); grok_op_properties (fndecl, DECL_VIRTUAL_P (fndecl), 0);
} }
finish_decl (fndecl, NULL_TREE, NULL_TREE, 0); finish_decl (fndecl, NULL_TREE, NULL_TREE, 0, 0);
/* Make a place for the parms */ /* Make a place for the parms */
pushlevel (0); pushlevel (0);
......
...@@ -1147,6 +1147,10 @@ check_classfn (ctype, cname, function) ...@@ -1147,6 +1147,10 @@ check_classfn (ctype, cname, function)
{ {
if (DECL_ASSEMBLER_NAME (function) == DECL_ASSEMBLER_NAME (fndecl)) if (DECL_ASSEMBLER_NAME (function) == DECL_ASSEMBLER_NAME (fndecl))
return; return;
/* We have to do more extensive argument checking here, as
the name may have been changed by asm("new_name"). */
if (decls_match (function, fndecl))
return;
fndecl = DECL_CHAIN (fndecl); fndecl = DECL_CHAIN (fndecl);
} }
break; /* loser */ break; /* loser */
...@@ -1195,6 +1199,7 @@ grokfield (declarator, declspecs, raises, init, asmspec_tree) ...@@ -1195,6 +1199,7 @@ grokfield (declarator, declspecs, raises, init, asmspec_tree)
{ {
register tree value; register tree value;
char *asmspec = 0; char *asmspec = 0;
int flags = LOOKUP_ONLYCONVERTING;
/* Convert () initializers to = initializers. */ /* Convert () initializers to = initializers. */
if (init == NULL_TREE && declarator != NULL_TREE if (init == NULL_TREE && declarator != NULL_TREE
...@@ -1206,6 +1211,7 @@ grokfield (declarator, declspecs, raises, init, asmspec_tree) ...@@ -1206,6 +1211,7 @@ grokfield (declarator, declspecs, raises, init, asmspec_tree)
{ {
init = TREE_OPERAND (declarator, 1); init = TREE_OPERAND (declarator, 1);
declarator = TREE_OPERAND (declarator, 0); declarator = TREE_OPERAND (declarator, 0);
flags = 0;
} }
if (init if (init
...@@ -1353,17 +1359,22 @@ grokfield (declarator, declspecs, raises, init, asmspec_tree) ...@@ -1353,17 +1359,22 @@ grokfield (declarator, declspecs, raises, init, asmspec_tree)
DECL_INITIAL (value) = init; DECL_INITIAL (value) = init;
DECL_IN_AGGR_P (value) = 1; DECL_IN_AGGR_P (value) = 1;
finish_decl (value, init, asmspec_tree, 1); finish_decl (value, init, asmspec_tree, 1, flags);
pushdecl_class_level (value); pushdecl_class_level (value);
return value; return value;
} }
if (TREE_CODE (value) == FIELD_DECL) if (TREE_CODE (value) == FIELD_DECL)
{ {
if (asmspec) if (asmspec)
DECL_ASSEMBLER_NAME (value) = get_identifier (asmspec); {
/* This must override the asm specifier which was placed
by grokclassfn. Lay this out fresh. */
DECL_RTL (value) = NULL_RTX;
DECL_ASSEMBLER_NAME (value) = get_identifier (asmspec);
}
if (DECL_INITIAL (value) == error_mark_node) if (DECL_INITIAL (value) == error_mark_node)
init = error_mark_node; init = error_mark_node;
finish_decl (value, init, asmspec_tree, 1); finish_decl (value, init, asmspec_tree, 1, flags);
DECL_INITIAL (value) = init; DECL_INITIAL (value) = init;
DECL_IN_AGGR_P (value) = 1; DECL_IN_AGGR_P (value) = 1;
return value; return value;
...@@ -1378,7 +1389,14 @@ grokfield (declarator, declspecs, raises, init, asmspec_tree) ...@@ -1378,7 +1389,14 @@ grokfield (declarator, declspecs, raises, init, asmspec_tree)
/* When does this happen? */ /* When does this happen? */
my_friendly_assert (init == NULL_TREE, 193); my_friendly_assert (init == NULL_TREE, 193);
} }
finish_decl (value, init, asmspec_tree, 1); if (asmspec)
{
/* This must override the asm specifier which was placed
by grokclassfn. Lay this out fresh. */
DECL_RTL (value) = NULL_RTX;
DECL_ASSEMBLER_NAME (value) = get_identifier (asmspec);
}
finish_decl (value, init, asmspec_tree, 1, flags);
/* Pass friends back this way. */ /* Pass friends back this way. */
if (DECL_FRIEND_P (value)) if (DECL_FRIEND_P (value))
...@@ -1439,7 +1457,7 @@ grokbitfield (declarator, declspecs, width) ...@@ -1439,7 +1457,7 @@ grokbitfield (declarator, declspecs, width)
cp_error ("static member `%D' cannot be a bitfield", value); cp_error ("static member `%D' cannot be a bitfield", value);
return NULL_TREE; return NULL_TREE;
} }
finish_decl (value, NULL_TREE, NULL_TREE, 0); finish_decl (value, NULL_TREE, NULL_TREE, 0, 0);
if (width != error_mark_node) if (width != error_mark_node)
{ {
...@@ -1631,7 +1649,7 @@ groktypefield (declspecs, parmlist) ...@@ -1631,7 +1649,7 @@ groktypefield (declspecs, parmlist)
return void_type_node; return void_type_node;
} }
finish_decl (decl, NULL_TREE, NULL_TREE, 0); finish_decl (decl, NULL_TREE, NULL_TREE, 0, 0);
/* If this declaration is common to another declaration /* If this declaration is common to another declaration
complain about such redundancy, and return NULL_TREE complain about such redundancy, and return NULL_TREE
...@@ -1934,7 +1952,7 @@ setup_vtbl_ptr () ...@@ -1934,7 +1952,7 @@ setup_vtbl_ptr ()
DECL_INITIAL (current_vtable_decl) = error_mark_node; DECL_INITIAL (current_vtable_decl) = error_mark_node;
/* Have to cast the initializer, since it may have come from a /* Have to cast the initializer, since it may have come from a
more base class then we ascribe CURRENT_VTABLE_DECL to be. */ more base class then we ascribe CURRENT_VTABLE_DECL to be. */
finish_decl (current_vtable_decl, convert_force (TREE_TYPE (current_vtable_decl), vfield), 0, 0); finish_decl (current_vtable_decl, convert_force (TREE_TYPE (current_vtable_decl), vfield, 0), NULL_TREE, 0, 0);
current_vtable_decl = build_indirect_ref (current_vtable_decl, NULL_PTR); current_vtable_decl = build_indirect_ref (current_vtable_decl, NULL_PTR);
} }
else else
...@@ -1947,8 +1965,10 @@ void ...@@ -1947,8 +1965,10 @@ void
mark_inline_for_output (decl) mark_inline_for_output (decl)
tree decl; tree decl;
{ {
decl = DECL_MAIN_VARIANT (decl);
if (DECL_SAVED_INLINE (decl)) if (DECL_SAVED_INLINE (decl))
return; return;
my_friendly_assert (TREE_PERMANENT (decl), 363);
DECL_SAVED_INLINE (decl) = 1; DECL_SAVED_INLINE (decl) = 1;
if (DECL_PENDING_INLINE_INFO (decl) != 0 if (DECL_PENDING_INLINE_INFO (decl) != 0
&& ! DECL_PENDING_INLINE_INFO (decl)->deja_vu) && ! DECL_PENDING_INLINE_INFO (decl)->deja_vu)
...@@ -2176,7 +2196,7 @@ finish_table (name, type, init, publicp) ...@@ -2176,7 +2196,7 @@ finish_table (name, type, init, publicp)
DECL_INITIAL (empty_table) = init; DECL_INITIAL (empty_table) = init;
asmspec = build_string (IDENTIFIER_LENGTH (DECL_NAME (empty_table)), asmspec = build_string (IDENTIFIER_LENGTH (DECL_NAME (empty_table)),
IDENTIFIER_POINTER (DECL_NAME (empty_table))); IDENTIFIER_POINTER (DECL_NAME (empty_table)));
finish_decl (empty_table, init, asmspec, 0); finish_decl (empty_table, init, asmspec, 0, 0);
} }
is_empty = 1; is_empty = 1;
} }
...@@ -2214,7 +2234,7 @@ finish_table (name, type, init, publicp) ...@@ -2214,7 +2234,7 @@ finish_table (name, type, init, publicp)
IDENTIFIER_POINTER (DECL_NAME (empty_table))); IDENTIFIER_POINTER (DECL_NAME (empty_table)));
} }
finish_decl (decl, init, asmspec, 0); finish_decl (decl, init, asmspec, 0, 0);
return decl; return decl;
} }
...@@ -2782,7 +2802,7 @@ finish_file () ...@@ -2782,7 +2802,7 @@ finish_file ()
} }
if (IS_AGGR_TYPE (TREE_TYPE (decl)) if (IS_AGGR_TYPE (TREE_TYPE (decl))
|| TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE) || TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
expand_aggr_init (decl, init, 0); expand_aggr_init (decl, init, 0, 0);
else if (TREE_CODE (init) == TREE_VEC) else 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),
...@@ -2803,7 +2823,7 @@ finish_file () ...@@ -2803,7 +2823,7 @@ 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 (); free_temp_slots ();
expand_aggr_init (build_indirect_ref (decl, NULL_PTR), init, 0); expand_aggr_init (build_indirect_ref (decl, NULL_PTR), init, 0, 0);
} }
} }
else if (decl == error_mark_node) else if (decl == error_mark_node)
...@@ -3041,7 +3061,7 @@ reparse_absdcl_as_casts (decl, expr) ...@@ -3041,7 +3061,7 @@ reparse_absdcl_as_casts (decl, expr)
{ {
type = groktypename (TREE_VALUE (TREE_OPERAND (decl, 1))); type = groktypename (TREE_VALUE (TREE_OPERAND (decl, 1)));
decl = TREE_OPERAND (decl, 0); decl = TREE_OPERAND (decl, 0);
expr = build_c_cast (type, expr); expr = build_c_cast (type, expr, 0);
} }
return expr; return expr;
...@@ -3166,3 +3186,77 @@ check_cp_case_value (value) ...@@ -3166,3 +3186,77 @@ check_cp_case_value (value)
return value; return value;
} }
static tree current_namespace;
/* Get the inner part of a namespace id. It doesn't have any prefix, nor
postfix. Returns 0 if in global namespace. */
tree
get_namespace_id ()
{
tree x = current_namespace;
if (x)
x = TREE_PURPOSE (x);
return x;
}
/* Build up a DECL_ASSEMBLER_NAME for NAME in the current namespace. */
tree
current_namespace_id (name)
tree name;
{
tree old_id = get_namespace_id ();
char *buf;
/* Global names retain old encoding. */
if (! old_id)
return name;
buf = (char *) alloca (8 + IDENTIFIER_LENGTH (old_id)
+ IDENTIFIER_LENGTH (name));
sprintf (buf, "__ns_%s_%s", IDENTIFIER_POINTER (old_id),
IDENTIFIER_POINTER (name));
return get_identifier (buf);
}
/* Push into the scopre of the NAME namespace. */
void
push_namespace (name)
tree name;
{
tree old_id = get_namespace_id ();
char *buf;
current_namespace = tree_cons (NULL_TREE, name, current_namespace);
buf = (char *) alloca (4 + (old_id ? IDENTIFIER_LENGTH (old_id) : 0)
+ IDENTIFIER_LENGTH (name));
sprintf (buf, "%s%s", old_id ? IDENTIFIER_POINTER (old_id) : "",
IDENTIFIER_POINTER (name));
TREE_PURPOSE (current_namespace) = get_identifier (buf);
}
/* Pop from the scope of the current namespace. */
void
pop_namespace ()
{
current_namespace = TREE_CHAIN (current_namespace);
}
void
do_namespace_alias (alias, namespace)
tree alias, namespace;
{
}
tree
do_using_decl (decl)
tree decl;
{
return error_mark_node;
}
void
do_using_directive (namespace)
tree namespace;
{
}
...@@ -1017,8 +1017,7 @@ dump_expr (t, nop) ...@@ -1017,8 +1017,7 @@ dump_expr (t, nop)
} }
else else
{ {
sorry ("operand of SAVE_EXPR not understood"); dump_expr (TREE_OPERAND (t, 0), 0);
goto error;
} }
break; break;
......
...@@ -43,7 +43,7 @@ tree builtin_return_address_fndecl; ...@@ -43,7 +43,7 @@ tree builtin_return_address_fndecl;
#define TRY_NEW_EH #define TRY_NEW_EH
#endif #endif
#endif #endif
#if defined(__i386) || defined(__rs6000) || defined(__hppa) #if defined(__i386) || defined(__rs6000) || defined(__hppa) || defined(__mc68000) || defined (__mips)
#define TRY_NEW_EH #define TRY_NEW_EH
#endif #endif
#endif #endif
...@@ -803,6 +803,16 @@ init_exception_processing () ...@@ -803,6 +803,16 @@ init_exception_processing ()
saved_throw_type = gen_rtx (REG, Pmode, 6); saved_throw_type = gen_rtx (REG, Pmode, 6);
saved_throw_value = gen_rtx (REG, Pmode, 7); saved_throw_value = gen_rtx (REG, Pmode, 7);
#endif #endif
#ifdef __mc68000
saved_pc = gen_rtx (REG, Pmode, 10);
saved_throw_type = gen_rtx (REG, Pmode, 11);
saved_throw_value = gen_rtx (REG, Pmode, 12);
#endif
#ifdef __mips
saved_pc = gen_rtx (REG, Pmode, 16);
saved_throw_type = gen_rtx (REG, Pmode, 17);
saved_throw_value = gen_rtx (REG, Pmode, 18);
#endif
new_eh_queue (&ehqueue); new_eh_queue (&ehqueue);
new_eh_queue (&eh_table_output_queue); new_eh_queue (&eh_table_output_queue);
new_eh_stack (&ehstack); new_eh_stack (&ehstack);
...@@ -977,6 +987,13 @@ expand_end_all_catch () ...@@ -977,6 +987,13 @@ expand_end_all_catch ()
if (! doing_eh (1)) if (! doing_eh (1))
return; return;
/* Code to throw out to outer context, if we fall off end of catch
handlers. */
emit_move_insn (saved_pc, gen_rtx (LABEL_REF,
Pmode,
top_label_entry (&caught_return_label_stack)));
emit_jump (throw_label);
/* Find the start of the catch block. */ /* Find the start of the catch block. */
last = pop_last_insn (); last = pop_last_insn ();
catchstart = NEXT_INSN (last); catchstart = NEXT_INSN (last);
...@@ -1136,7 +1153,7 @@ expand_start_catch_block (declspecs, declarator) ...@@ -1136,7 +1153,7 @@ 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_bne (false_label_rtx)); emit_jump_insn (gen_bne (false_label_rtx));
finish_decl (decl, init, NULL_TREE, 0); finish_decl (decl, init, NULL_TREE, 0, LOOKUP_ONLYCONVERTING);
} }
else else
{ {
...@@ -1165,7 +1182,7 @@ void expand_end_catch_block () ...@@ -1165,7 +1182,7 @@ void expand_end_catch_block ()
/* label we jump to if we caught the exception */ /* label we jump to if we caught the exception */
emit_jump (top_label_entry (&caught_return_label_stack)); emit_jump (top_label_entry (&caught_return_label_stack));
/* Code to throw out to outer context, if we get an throw from within /* Code to throw out to outer context, if we get a throw from within
our catch handler. */ our catch handler. */
/* These are saved for the exception table. */ /* These are saved for the exception table. */
push_rtl_perm (); push_rtl_perm ();
...@@ -1240,7 +1257,7 @@ do_unwind (throw_label) ...@@ -1240,7 +1257,7 @@ do_unwind (throw_label)
easy_expand_asm ("restore"); easy_expand_asm ("restore");
emit_barrier (); emit_barrier ();
#endif #endif
#if defined(__i386) || defined(__rs6000) || defined(__hppa) #if defined(__i386) || defined(__rs6000) || defined(__hppa) || defined(__mc68000) || defined (__mips)
extern FILE *asm_out_file; extern FILE *asm_out_file;
tree fcall; tree fcall;
tree params; tree params;
...@@ -1443,9 +1460,13 @@ expand_throw (exp) ...@@ -1443,9 +1460,13 @@ expand_throw (exp)
emit_move_insn (saved_throw_type, throw_type_rtx); emit_move_insn (saved_throw_type, throw_type_rtx);
exp = convert_to_reference (build_reference_type (build_type_variant (TREE_TYPE (exp), 1, 0)), exp, CONV_STATIC, LOOKUP_COMPLAIN, error_mark_node); exp = convert_to_reference (build_reference_type (build_type_variant (TREE_TYPE (exp), 1, 0)), exp, CONV_STATIC, LOOKUP_COMPLAIN, error_mark_node);
/* Make a copy of the thrown object. WP 15.1.5 */
exp = build_new (NULL_TREE, TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (exp))), exp, 0);
if (exp == error_mark_node) if (exp == error_mark_node)
error (" in thrown expression"); error (" in thrown expression");
throw_value_rtx = expand_expr (build_unary_op (ADDR_EXPR, exp, 0), NULL_RTX, VOIDmode, 0); throw_value_rtx = expand_expr (exp, NULL_RTX, VOIDmode, 0);
emit_move_insn (saved_throw_value, throw_value_rtx); emit_move_insn (saved_throw_value, throw_value_rtx);
} }
} }
......
...@@ -155,7 +155,7 @@ cplus_expand_expr (exp, target, tmode, modifier) ...@@ -155,7 +155,7 @@ cplus_expand_expr (exp, target, tmode, modifier)
TREE_ADDRESSABLE (init) = 1; TREE_ADDRESSABLE (init) = 1;
flag_access_control = 0; flag_access_control = 0;
expand_aggr_init (slot, init, 0); expand_aggr_init (slot, init, 0, LOOKUP_ONLYCONVERTING);
flag_access_control = old_ac; flag_access_control = old_ac;
if (TYPE_NEEDS_DESTRUCTOR (type)) if (TYPE_NEEDS_DESTRUCTOR (type))
...@@ -195,7 +195,7 @@ cplus_expand_expr (exp, target, tmode, modifier) ...@@ -195,7 +195,7 @@ cplus_expand_expr (exp, target, tmode, modifier)
init = build (RTL_EXPR, return_type, 0, call_target); init = build (RTL_EXPR, return_type, 0, call_target);
/* We got back a reference to the type we want. Now initialize /* We got back a reference to the type we want. Now initialize
target with that. */ target with that. */
expand_aggr_init (slot, init, 0); expand_aggr_init (slot, init, 0, LOOKUP_ONLYCONVERTING);
} }
if (DECL_RTL (slot) != target) if (DECL_RTL (slot) != target)
......
...@@ -1189,24 +1189,21 @@ the object was thrown. This is so that there is always someplace for ...@@ -1189,24 +1189,21 @@ the object was thrown. This is so that there is always someplace for
the exception object, and nothing can overwrite it, once we start the exception object, and nothing can overwrite it, once we start
throwing. The only bad part, is that the stack remains large. throwing. The only bad part, is that the stack remains large.
Flaws in g++'s exception handling. The stack pointer is restored from The below points out some flaws in g++'s exception handling, as it now
stack, we want to match rs6000, and propagate the stack pointer from stands.
time of throw, down, to the catch place.
Only exact type matching or reference matching of throw types works.
Only exact type matching of throw types works (references work also), Only works on a SPARC machines (like Suns), and i386 machines. Partial
catch variables cannot be used. Only works on a Sun sparc running SunOS support is also in for rs6000, hppa, m68k and mips machines, but a stack
4.1.x. Unwinding to outer catch clauses works. All temps and local unwinder called __unwind_function has to be written, and added to
variables are cleaned up in all unwinded scopes. Completed parts of libgcc2 for them. All completely constructed temps and local variables
partially constructed objects are not cleaned up. Don't expect are cleaned up in all unwinded scopes. Completed parts of partially
exception handling to work right if you optimize, in fact the compiler constructed objects are not cleaned up. Don't expect exception handling
will probably core dump. If two EH regions are the exact same size, the to work right if you optimize, in fact the compiler will probably core
backend cannot tell which one is first. It punts by picking the last dump. If two EH regions are the exact same size, the backend cannot
one, if they tie. This is usually right. We really should stick in a tell which one is first. It punts by picking the last one, if they tie.
nop, if they are the same size. This is usually right. We really should stick in a nop, if they are the
same size.
If we fall off the end of a series of catch blocks, we return to the
flow of control in a normal fasion. But this is wrong, we should
rethrow.
When we invoke the copy constructor for an exception object because it When we invoke the copy constructor for an exception object because it
is passed by value, and if we take a hit (exception) inside the copy is passed by value, and if we take a hit (exception) inside the copy
...@@ -1216,16 +1213,24 @@ exists, but rather to allow the frame to unwind into the next series of ...@@ -1216,16 +1213,24 @@ exists, but rather to allow the frame to unwind into the next series of
handlers, if any. If this is the wrong way to do it, we will need to handlers, if any. If this is the wrong way to do it, we will need to
protect the rest of the handler in some fashion. Maybe just changing protect the rest of the handler in some fashion. Maybe just changing
the handler's handler to protect the whole series of handlers is the the handler's handler to protect the whole series of handlers is the
right way to go. right way to go. This part is wrong. We should call terminate if an
exception is thrown while doing things like trying to copy the exception
The EH object is copied like it should be, if it is passed by value, object.
otherwise we get a reference directly to it.
Exception specifications are handled syntax wise, but not semantic wise.
EH objects make it through unwinding, but are subject to being build_exception_variant should sort the incoming list, so that is
overwritten as they are still past the top of stack. Don't throw implements set compares, not exact list equality. Type smashing should
automatic objects if this is a problem. smash exception specifications using set union.
Exceptions in catch handlers now go to outer block. Thrown objects are allocated on the heap, in the usual way, but they are
never deleted. They should be deleted by the catch clauses.
In stmt.c, expand_end_bindings attempts to eliminate the generation of
destructors for a binding contour if the code would be unreachable (last
insn == BARRIER). In this case, interim_eh_hook is never called for the
end of the lifetimes of auto variables, so the compiler generates
invalid assembler (the end label for the scope is never declared, and
destructor code isn't generated on the exception path).
@node Free Store, Concept Index, Exception Handling, Top @node Free Store, Concept Index, Exception Handling, Top
@section Free Store @section Free Store
......
...@@ -185,7 +185,7 @@ perform_member_init (member, name, init, explicit) ...@@ -185,7 +185,7 @@ perform_member_init (member, name, init, explicit)
array_type_nelts (type), TREE_VALUE (init), 1); array_type_nelts (type), TREE_VALUE (init), 1);
} }
else else
expand_aggr_init (decl, init, 0); expand_aggr_init (decl, init, 0, 0);
} }
else else
{ {
...@@ -734,7 +734,7 @@ expand_virtual_init (binfo, decl) ...@@ -734,7 +734,7 @@ expand_virtual_init (binfo, decl)
return; return;
/* Have to convert VTBL since array sizes may be different. */ /* Have to convert VTBL since array sizes may be different. */
vtbl = convert_force (TREE_TYPE (vtbl_ptr), vtbl); vtbl = convert_force (TREE_TYPE (vtbl_ptr), vtbl, 0);
expand_expr_stmt (build_modify_expr (vtbl_ptr, NOP_EXPR, vtbl)); expand_expr_stmt (build_modify_expr (vtbl_ptr, NOP_EXPR, vtbl));
} }
...@@ -1071,7 +1071,7 @@ expand_member_init (exp, name, init) ...@@ -1071,7 +1071,7 @@ expand_member_init (exp, name, init)
else if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (field))) else if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (field)))
{ {
parm = build_component_ref (exp, name, 0, 0); parm = build_component_ref (exp, name, 0, 0);
expand_aggr_init (parm, NULL_TREE, 0); expand_aggr_init (parm, NULL_TREE, 0, 0);
rval = error_mark_node; rval = error_mark_node;
} }
...@@ -1087,6 +1087,8 @@ expand_member_init (exp, name, init) ...@@ -1087,6 +1087,8 @@ expand_member_init (exp, name, init)
INIT comes in two flavors: it is either a value which INIT comes in two flavors: it is either a value which
is to be stored in EXP, or it is a parameter list is to be stored in EXP, or it is a parameter list
to go to a constructor, which will operate on EXP. to go to a constructor, which will operate on EXP.
If FLAGS is LOOKUP_ONLYCONVERTING then it is the = init form of
the initializer, if FLAGS is 0, then it is the (init) form.
If `init' is a CONSTRUCTOR, then we emit a warning message, If `init' is a CONSTRUCTOR, then we emit a warning message,
explaining that such initializations are illegal. explaining that such initializations are illegal.
...@@ -1116,9 +1118,10 @@ expand_member_init (exp, name, init) ...@@ -1116,9 +1118,10 @@ expand_member_init (exp, name, init)
*/ */
void void
expand_aggr_init (exp, init, alias_this) expand_aggr_init (exp, init, alias_this, flags)
tree exp, init; tree exp, init;
int alias_this; int alias_this;
int flags;
{ {
tree type = TREE_TYPE (exp); tree type = TREE_TYPE (exp);
int was_const = TREE_READONLY (exp); int was_const = TREE_READONLY (exp);
...@@ -1179,7 +1182,7 @@ expand_aggr_init (exp, init, alias_this) ...@@ -1179,7 +1182,7 @@ expand_aggr_init (exp, init, alias_this)
init = CONSTRUCTOR_ELTS (init); init = CONSTRUCTOR_ELTS (init);
#endif #endif
expand_aggr_init_1 (TYPE_BINFO (type), exp, exp, expand_aggr_init_1 (TYPE_BINFO (type), exp, exp,
init, alias_this, LOOKUP_NORMAL); init, alias_this, LOOKUP_NORMAL|flags);
TREE_READONLY (exp) = was_const; TREE_READONLY (exp) = was_const;
} }
...@@ -1353,9 +1356,6 @@ expand_aggr_init_1 (binfo, true_exp, exp, init, alias_this, flags) ...@@ -1353,9 +1356,6 @@ expand_aggr_init_1 (binfo, true_exp, exp, init, alias_this, flags)
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 0
TREE_RAISES (init) = ??
#endif
if (init_list) if (init_list)
TREE_VALUE (init_list) = init; TREE_VALUE (init_list) = init;
} }
...@@ -1425,9 +1425,6 @@ expand_aggr_init_1 (binfo, true_exp, exp, init, alias_this, flags) ...@@ -1425,9 +1425,6 @@ expand_aggr_init_1 (binfo, true_exp, exp, init, alias_this, flags)
init = build (CALL_EXPR, build_pointer_type (TREE_TYPE (init)), init = build (CALL_EXPR, build_pointer_type (TREE_TYPE (init)),
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 0
TREE_RAISES (init) = ??
#endif
TREE_VALUE (TREE_OPERAND (init, 1)) TREE_VALUE (TREE_OPERAND (init, 1))
= convert_pointer_to (TREE_TYPE (TREE_TYPE (TREE_VALUE (tmp))), arg); = convert_pointer_to (TREE_TYPE (TREE_TYPE (TREE_VALUE (tmp))), arg);
...@@ -1561,7 +1558,7 @@ expand_recursive_init_1 (binfo, true_exp, addr, init_list, alias_this) ...@@ -1561,7 +1558,7 @@ expand_recursive_init_1 (binfo, true_exp, addr, init_list, alias_this)
tree subexp = build_indirect_ref (convert_pointer_to (TREE_VALUE (init_list), addr), NULL_PTR); tree subexp = build_indirect_ref (convert_pointer_to (TREE_VALUE (init_list), addr), NULL_PTR);
tree member_base = build (COMPONENT_REF, TREE_TYPE (member), subexp, member); tree member_base = build (COMPONENT_REF, TREE_TYPE (member), subexp, member);
if (IS_AGGR_TYPE (TREE_TYPE (member))) if (IS_AGGR_TYPE (TREE_TYPE (member)))
expand_aggr_init (member_base, DECL_INITIAL (member), 0); expand_aggr_init (member_base, DECL_INITIAL (member), 0, 0);
else if (TREE_CODE (TREE_TYPE (member)) == ARRAY_TYPE else if (TREE_CODE (TREE_TYPE (member)) == ARRAY_TYPE
&& TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (member))) && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (member)))
{ {
...@@ -1803,7 +1800,7 @@ build_member_call (cname, name, parmlist) ...@@ -1803,7 +1800,7 @@ build_member_call (cname, name, parmlist)
{ {
tree newtype = build_type_variant (type, TYPE_READONLY (oldtype), tree newtype = build_type_variant (type, TYPE_READONLY (oldtype),
TYPE_VOLATILE (oldtype)); TYPE_VOLATILE (oldtype));
decl = convert_force (build_pointer_type (newtype), olddecl); decl = convert_force (build_pointer_type (newtype), olddecl, 0);
} }
else else
decl = olddecl; decl = olddecl;
...@@ -3114,7 +3111,7 @@ build_new (placement, decl, init, use_global_new) ...@@ -3114,7 +3111,7 @@ build_new (placement, decl, init, use_global_new)
/* New 2.0 interpretation: `new int (10)' means /* New 2.0 interpretation: `new int (10)' means
allocate an int, and initialize it with 10. */ allocate an int, and initialize it with 10. */
init = build_c_cast (type, init); init = build_c_cast (type, init, 1);
rval = build (COMPOUND_EXPR, TREE_TYPE (rval), rval = build (COMPOUND_EXPR, TREE_TYPE (rval),
build_modify_expr (build_indirect_ref (rval, NULL_PTR), build_modify_expr (build_indirect_ref (rval, NULL_PTR),
NOP_EXPR, init), NOP_EXPR, init),
...@@ -3151,7 +3148,7 @@ build_new (placement, decl, init, use_global_new) ...@@ -3151,7 +3148,7 @@ build_new (placement, decl, init, use_global_new)
build_binary_op (MINUS_EXPR, nelts, integer_one_node, 1), build_binary_op (MINUS_EXPR, nelts, integer_one_node, 1),
init, 0); init, 0);
else else
expand_aggr_init (build_indirect_ref (rval, NULL_PTR), init, 0); expand_aggr_init (build_indirect_ref (rval, NULL_PTR), init, 0, 0);
do_pending_stack_adjust (); do_pending_stack_adjust ();
...@@ -3179,7 +3176,7 @@ build_new (placement, decl, init, use_global_new) ...@@ -3179,7 +3176,7 @@ build_new (placement, decl, init, use_global_new)
if (rval && TREE_TYPE (rval) != build_pointer_type (type)) if (rval && TREE_TYPE (rval) != build_pointer_type (type))
{ {
/* The type of new int [3][3] is not int *, but int [3] * */ /* The type of new int [3][3] is not int *, but int [3] * */
rval = build_c_cast (build_pointer_type (type), rval); rval = build_c_cast (build_pointer_type (type), rval, 0);
} }
if (pending_sizes) if (pending_sizes)
...@@ -3273,7 +3270,7 @@ expand_vec_init (decl, base, maxindex, init, from_array) ...@@ -3273,7 +3270,7 @@ expand_vec_init (decl, base, maxindex, init, from_array)
while (elts) while (elts)
{ {
host_i -= 1; host_i -= 1;
expand_aggr_init (baseref, TREE_VALUE (elts), 0); expand_aggr_init (baseref, TREE_VALUE (elts), 0, 0);
expand_assignment (base, baseinc, 0, 0); expand_assignment (base, baseinc, 0, 0);
elts = TREE_CHAIN (elts); elts = TREE_CHAIN (elts);
...@@ -3357,7 +3354,7 @@ expand_vec_init (decl, base, maxindex, init, from_array) ...@@ -3357,7 +3354,7 @@ expand_vec_init (decl, base, maxindex, init, from_array)
if (from_array == 2) if (from_array == 2)
expand_expr_stmt (build_modify_expr (to, NOP_EXPR, from)); expand_expr_stmt (build_modify_expr (to, NOP_EXPR, from));
else if (TYPE_NEEDS_CONSTRUCTING (type)) else if (TYPE_NEEDS_CONSTRUCTING (type))
expand_aggr_init (to, from, 0); expand_aggr_init (to, from, 0, 0);
else if (from) else if (from)
expand_assignment (to, from, 0, 0); expand_assignment (to, from, 0, 0);
else else
...@@ -3371,7 +3368,7 @@ expand_vec_init (decl, base, maxindex, init, from_array) ...@@ -3371,7 +3368,7 @@ expand_vec_init (decl, base, maxindex, init, from_array)
array_type_nelts (type), 0, 0); array_type_nelts (type), 0, 0);
} }
else else
expand_aggr_init (build1 (INDIRECT_REF, type, base), init, 0); expand_aggr_init (build1 (INDIRECT_REF, type, base), init, 0, 0);
expand_assignment (base, expand_assignment (base,
build (PLUS_EXPR, TYPE_POINTER_TO (type), base, size), build (PLUS_EXPR, TYPE_POINTER_TO (type), base, size),
...@@ -3488,7 +3485,7 @@ build_delete (type, addr, auto_delete, flags, use_global_delete) ...@@ -3488,7 +3485,7 @@ build_delete (type, addr, auto_delete, flags, use_global_delete)
addr = save_expr (addr); addr = save_expr (addr);
/* throw away const and volatile on target type of addr */ /* throw away const and volatile on target type of addr */
addr = convert_force (build_pointer_type (type), addr); addr = convert_force (build_pointer_type (type), addr, 0);
ref = build_indirect_ref (addr, NULL_PTR); ref = build_indirect_ref (addr, NULL_PTR);
ptr = 1; ptr = 1;
} }
...@@ -3514,7 +3511,7 @@ build_delete (type, addr, auto_delete, flags, use_global_delete) ...@@ -3514,7 +3511,7 @@ build_delete (type, addr, auto_delete, flags, use_global_delete)
if (TREE_CONSTANT (addr)) if (TREE_CONSTANT (addr))
addr = convert_pointer_to (type, addr); addr = convert_pointer_to (type, addr);
else else
addr = convert_force (build_pointer_type (type), addr); addr = convert_force (build_pointer_type (type), addr, 0);
if (TREE_CODE (addr) == NOP_EXPR if (TREE_CODE (addr) == NOP_EXPR
&& TREE_OPERAND (addr, 0) == current_class_decl) && TREE_OPERAND (addr, 0) == current_class_decl)
...@@ -3803,7 +3800,7 @@ build_vbase_delete (type, decl) ...@@ -3803,7 +3800,7 @@ build_vbase_delete (type, decl)
while (vbases) while (vbases)
{ {
tree this_addr = convert_force (TYPE_POINTER_TO (BINFO_TYPE (vbases)), tree this_addr = convert_force (TYPE_POINTER_TO (BINFO_TYPE (vbases)),
addr); addr, 0);
result = tree_cons (NULL_TREE, result = tree_cons (NULL_TREE,
build_delete (TREE_TYPE (this_addr), this_addr, build_delete (TREE_TYPE (this_addr), this_addr,
integer_zero_node, integer_zero_node,
......
...@@ -2587,6 +2587,15 @@ check_newline () ...@@ -2587,6 +2587,15 @@ check_newline ()
TREE_INT_CST_HIGH (fileinfo) = interface_unknown; TREE_INT_CST_HIGH (fileinfo) = interface_unknown;
} }
} }
#ifdef HANDLE_SYSV_PRAGMA
else
return handle_sysv_pragma (finput, c);
#else
#ifdef HANDLE_PRAGMA
else
HANDLE_PRAGMA (finput);
#endif
#endif
} }
goto skipline; goto skipline;
} }
...@@ -4874,3 +4883,46 @@ yyerror (string) ...@@ -4874,3 +4883,46 @@ yyerror (string)
error (buf, token_buffer); error (buf, token_buffer);
} }
#ifdef HANDLE_SYSV_PRAGMA
/* Handle a #pragma directive. INPUT is the current input stream,
and C is a character to reread. Processes the entire input line
and returns a character for the caller to reread: either \n or EOF. */
/* This function has to be in this file, in order to get at
the token types. */
int
handle_sysv_pragma (input, c)
FILE *input;
int c;
{
for (;;)
{
while (c == ' ' || c == '\t')
c = getc (input);
if (c == '\n' || c == EOF)
{
handle_pragma_token (0, 0);
return c;
}
ungetc (c, input);
switch (yylex ())
{
case IDENTIFIER:
case TYPENAME:
case STRING:
case CONSTANT:
handle_pragma_token (token_buffer, yylval.ttype);
break;
default:
handle_pragma_token (token_buffer, 0);
}
if (nextchar >= 0)
c = nextchar, nextchar = -1;
else
c = getc (input);
}
}
#endif /* HANDLE_SYSV_PRAGMA */
...@@ -167,13 +167,14 @@ empty_parms () ...@@ -167,13 +167,14 @@ empty_parms ()
%nonassoc IF %nonassoc IF
%nonassoc ELSE %nonassoc ELSE
%left IDENTIFIER TYPENAME PTYPENAME SCSPEC TYPESPEC TYPE_QUAL ENUM AGGR ELLIPSIS TYPEOF SIGOF OPERATOR %left IDENTIFIER TYPENAME PTYPENAME SCSPEC TYPESPEC TYPE_QUAL ENUM AGGR ELLIPSIS TYPEOF SIGOF OPERATOR NSNAME
%left '{' ',' ';' %left '{' ',' ';'
%nonassoc THROW %nonassoc THROW
%right <code> ':'
%right <code> ASSIGN '=' %right <code> ASSIGN '='
%right <code> '?' ':' %right <code> '?'
%left <code> OROR %left <code> OROR
%left <code> ANDAND %left <code> ANDAND
%left <code> '|' %left <code> '|'
...@@ -228,7 +229,7 @@ empty_parms () ...@@ -228,7 +229,7 @@ empty_parms ()
%type <ttype> fcast_or_absdcl regcast_or_absdcl sub_cast_expr %type <ttype> fcast_or_absdcl regcast_or_absdcl sub_cast_expr
%type <ttype> expr_or_declarator complex_notype_declarator %type <ttype> expr_or_declarator complex_notype_declarator
%type <ttype> notype_unqualified_id unqualified_id qualified_id %type <ttype> notype_unqualified_id unqualified_id qualified_id
%type <ttype> overqualified_id notype_qualified_id %type <ttype> overqualified_id notype_qualified_id any_id
%type <ttype> complex_direct_notype_declarator functional_cast %type <ttype> complex_direct_notype_declarator functional_cast
%type <ttype> named_parm complex_parmlist typed_declspecs1 parms_comma %type <ttype> named_parm complex_parmlist typed_declspecs1 parms_comma
...@@ -264,12 +265,16 @@ empty_parms () ...@@ -264,12 +265,16 @@ empty_parms ()
%type <ttype> complex_type_name nested_name_specifier_1 %type <ttype> complex_type_name nested_name_specifier_1
%type <itype> nomods_initdecls nomods_initdcl0 %type <itype> nomods_initdecls nomods_initdcl0
%type <ttype> new_initializer new_placement specialization type_specifier_seq %type <ttype> new_initializer new_placement specialization type_specifier_seq
%type <ttype> using_decl
/* in order to recognize aggr tags as defining and thus shadowing. */ /* in order to recognize aggr tags as defining and thus shadowing. */
%token TYPENAME_DEFN IDENTIFIER_DEFN PTYPENAME_DEFN %token TYPENAME_DEFN IDENTIFIER_DEFN PTYPENAME_DEFN
%type <ttype> named_class_head_sans_basetype_defn %type <ttype> named_class_head_sans_basetype_defn
%type <ttype> identifier_defn IDENTIFIER_DEFN TYPENAME_DEFN PTYPENAME_DEFN %type <ttype> identifier_defn IDENTIFIER_DEFN TYPENAME_DEFN PTYPENAME_DEFN
%token NSNAME
%type <ttype> NSNAME
%type <strtype> .pushlevel %type <strtype> .pushlevel
/* spew.c depends on this being the last token. Define /* spew.c depends on this being the last token. Define
...@@ -313,6 +318,11 @@ extdefs: ...@@ -313,6 +318,11 @@ extdefs:
{ $<ttype>$ = NULL_TREE; } { $<ttype>$ = NULL_TREE; }
; ;
extdefs_opt:
extdefs
| /* empty */
;
.hush_warning: .hush_warning:
{ have_extern_spec = 1; { have_extern_spec = 1;
used_extern_spec = 0; used_extern_spec = 0;
...@@ -345,9 +355,7 @@ extdef: ...@@ -345,9 +355,7 @@ extdef:
| asm_keyword '(' string ')' ';' | asm_keyword '(' string ')' ';'
{ if (TREE_CHAIN ($3)) $3 = combine_strings ($3); { if (TREE_CHAIN ($3)) $3 = combine_strings ($3);
assemble_asm ($3); } assemble_asm ($3); }
| extern_lang_string '{' extdefs '}' | extern_lang_string '{' extdefs_opt '}'
{ pop_lang_context (); }
| extern_lang_string '{' '}'
{ pop_lang_context (); } { pop_lang_context (); }
| extern_lang_string .hush_warning fndef .warning_ok | extern_lang_string .hush_warning fndef .warning_ok
{ if (pending_inlines) do_pending_inlines (); { if (pending_inlines) do_pending_inlines ();
...@@ -355,6 +363,38 @@ extdef: ...@@ -355,6 +363,38 @@ extdef:
| extern_lang_string .hush_warning datadef .warning_ok | extern_lang_string .hush_warning datadef .warning_ok
{ if (pending_inlines) do_pending_inlines (); { if (pending_inlines) do_pending_inlines ();
pop_lang_context (); } pop_lang_context (); }
| NAMESPACE identifier '{'
{ push_namespace ($2); }
extdefs_opt '}'
{ pop_namespace (); }
| NAMESPACE '{'
{ push_namespace (NULL_TREE); }
extdefs_opt '}'
{ pop_namespace (); }
| NAMESPACE identifier '=' any_id ';'
{ do_namespace_alias ($2, $4); }
| using_decl ';'
{ }
| USING NAMESPACE any_id ';'
{ do_using_directive ($3); }
;
using_decl:
USING qualified_id
{ $$ = do_using_decl ($2); }
| USING global_scope qualified_id
{ $$ = do_using_decl ($3); }
| USING global_scope unqualified_id
{ $$ = do_using_decl ($3); }
;
any_id:
unqualified_id
| qualified_id
| global_scope qualified_id
{ $$ = $2; }
| global_scope unqualified_id
{ $$ = $2; }
; ;
extern_lang_string: extern_lang_string:
...@@ -462,7 +502,7 @@ template_def: ...@@ -462,7 +502,7 @@ template_def:
d = start_decl ($<ttype>2, /*current_declspecs*/NULL_TREE, 0, d = start_decl ($<ttype>2, /*current_declspecs*/NULL_TREE, 0,
$3); $3);
cplus_decl_attributes (d, $5); cplus_decl_attributes (d, $5);
finish_decl (d, NULL_TREE, $4, 0); finish_decl (d, NULL_TREE, $4, 0, 0);
end_template_decl ($1, d, 0, def); end_template_decl ($1, d, 0, def);
if (def) if (def)
reinit_parse_for_template ((int) $6, $1, d); reinit_parse_for_template ((int) $6, $1, d);
...@@ -481,7 +521,7 @@ template_def: ...@@ -481,7 +521,7 @@ template_def:
d = start_decl ($<ttype>3, current_declspecs, d = start_decl ($<ttype>3, current_declspecs,
0, $<ttype>4); 0, $<ttype>4);
cplus_decl_attributes (d, $6); cplus_decl_attributes (d, $6);
finish_decl (d, NULL_TREE, $5, 0); finish_decl (d, NULL_TREE, $5, 0, 0);
end_template_decl ($1, d, 0, def); end_template_decl ($1, d, 0, def);
if (def) if (def)
{ {
...@@ -495,7 +535,7 @@ template_def: ...@@ -495,7 +535,7 @@ template_def:
{ {
int def = ($4 != ';'); int def = ($4 != ';');
tree d = start_decl ($<ttype>3, $<ttype>2, 0, NULL_TREE); tree d = start_decl ($<ttype>3, $<ttype>2, 0, NULL_TREE);
finish_decl (d, NULL_TREE, NULL_TREE, 0); finish_decl (d, NULL_TREE, NULL_TREE, 0, 0);
end_template_decl ($1, d, 0, def); end_template_decl ($1, d, 0, def);
if (def) if (def)
reinit_parse_for_template ((int) $4, $1, d); reinit_parse_for_template ((int) $4, $1, d);
...@@ -521,7 +561,7 @@ datadef: ...@@ -521,7 +561,7 @@ datadef:
| declmods notype_declarator ';' | declmods notype_declarator ';'
{ tree d; { tree d;
d = start_decl ($<ttype>2, $<ttype>$, 0, NULL_TREE); d = start_decl ($<ttype>2, $<ttype>$, 0, NULL_TREE);
finish_decl (d, NULL_TREE, NULL_TREE, 0); finish_decl (d, NULL_TREE, NULL_TREE, 0, 0);
} }
| typed_declspecs initdecls ';' | typed_declspecs initdecls ';'
{ {
...@@ -531,7 +571,7 @@ datadef: ...@@ -531,7 +571,7 @@ datadef:
| typed_declspecs declarator ';' | typed_declspecs declarator ';'
{ tree d; { tree d;
d = start_decl ($<ttype>2, $<ttype>$, 0, NULL_TREE); d = start_decl ($<ttype>2, $<ttype>$, 0, NULL_TREE);
finish_decl (d, NULL_TREE, NULL_TREE, 0); finish_decl (d, NULL_TREE, NULL_TREE, 0, 0);
note_list_got_semicolon ($<ttype>$); note_list_got_semicolon ($<ttype>$);
} }
| declmods ';' | declmods ';'
...@@ -752,11 +792,13 @@ identifier: ...@@ -752,11 +792,13 @@ identifier:
IDENTIFIER IDENTIFIER
| TYPENAME | TYPENAME
| PTYPENAME | PTYPENAME
| NSNAME
; ;
notype_identifier: notype_identifier:
IDENTIFIER IDENTIFIER
| PTYPENAME %prec EMPTY | PTYPENAME
| NSNAME %prec EMPTY
; ;
identifier_defn: identifier_defn:
...@@ -939,7 +981,7 @@ condition: ...@@ -939,7 +981,7 @@ condition:
} }
init init
{ {
finish_decl ($<ttype>7, $8, $5, 0); finish_decl ($<ttype>7, $8, $5, 0, LOOKUP_ONLYCONVERTING);
resume_momentary ($<itype>6); resume_momentary ($<itype>6);
$$ = $<ttype>7; $$ = $<ttype>7;
if (TREE_CODE (TREE_TYPE ($$)) == ARRAY_TYPE) if (TREE_CODE (TREE_TYPE ($$)) == ARRAY_TYPE)
...@@ -1225,7 +1267,7 @@ expr_no_commas: ...@@ -1225,7 +1267,7 @@ expr_no_commas:
{ $$ = build_m_component_ref ($$, build_x_unary_op ($2, $3)); } { $$ = build_m_component_ref ($$, build_x_unary_op ($2, $3)); }
| object '(' type_id ')' expr_no_commas %prec UNARY | object '(' type_id ')' expr_no_commas %prec UNARY
{ tree type = groktypename ($3); { tree type = groktypename ($3);
$$ = build_m_component_ref ($$, build_c_cast (type, $5)); } $$ = build_m_component_ref ($$, build_c_cast (type, $5, 0)); }
| object primary_no_id %prec UNARY | object primary_no_id %prec UNARY
{ $$ = build_m_component_ref ($$, $2); } { $$ = build_m_component_ref ($$, $2); }
*/ */
...@@ -1236,7 +1278,8 @@ notype_unqualified_id: ...@@ -1236,7 +1278,8 @@ notype_unqualified_id:
{ $$ = build_parse_node (BIT_NOT_EXPR, $3); } { $$ = build_parse_node (BIT_NOT_EXPR, $3); }
| operator_name | operator_name
| IDENTIFIER | IDENTIFIER
| PTYPENAME %prec EMPTY | PTYPENAME
| NSNAME %prec EMPTY
; ;
unqualified_id: unqualified_id:
...@@ -1421,7 +1464,7 @@ primary: ...@@ -1421,7 +1464,7 @@ primary:
} }
#endif #endif
else my_friendly_abort (79); else my_friendly_abort (79);
$$ = build_c_cast (type, build_compound_expr ($3)); $$ = build_c_cast (type, build_compound_expr ($3), 1);
} }
} }
| functional_cast | functional_cast
...@@ -1659,7 +1702,7 @@ decl: ...@@ -1659,7 +1702,7 @@ decl:
{ tree d = get_decl_list ($1); { tree d = get_decl_list ($1);
int yes = suspend_momentary (); int yes = suspend_momentary ();
d = start_decl ($2, d, 0, NULL_TREE); d = start_decl ($2, d, 0, NULL_TREE);
finish_decl (d, NULL_TREE, NULL_TREE, 0); finish_decl (d, NULL_TREE, NULL_TREE, 0, 0);
resume_momentary (yes); resume_momentary (yes);
if (IS_AGGR_TYPE_CODE (TREE_CODE ($1))) if (IS_AGGR_TYPE_CODE (TREE_CODE ($1)))
note_got_semicolon ($1); note_got_semicolon ($1);
...@@ -1668,7 +1711,7 @@ decl: ...@@ -1668,7 +1711,7 @@ decl:
{ tree d = $1; { tree d = $1;
int yes = suspend_momentary (); int yes = suspend_momentary ();
d = start_decl ($2, d, 0, NULL_TREE); d = start_decl ($2, d, 0, NULL_TREE);
finish_decl (d, NULL_TREE, NULL_TREE, 0); finish_decl (d, NULL_TREE, NULL_TREE, 0, 0);
resume_momentary (yes); resume_momentary (yes);
note_list_got_semicolon ($1); note_list_got_semicolon ($1);
} }
...@@ -1899,7 +1942,7 @@ initdcl0: ...@@ -1899,7 +1942,7 @@ initdcl0:
cplus_decl_attributes ($<ttype>$, $4); } cplus_decl_attributes ($<ttype>$, $4); }
init init
/* Note how the declaration of the variable is in effect while its init is parsed! */ /* Note how the declaration of the variable is in effect while its init is parsed! */
{ finish_decl ($<ttype>6, $7, $3, 0); { finish_decl ($<ttype>6, $7, $3, 0, LOOKUP_ONLYCONVERTING);
$$ = $<itype>5; } $$ = $<itype>5; }
| declarator maybe_raises maybeasm maybe_attribute | declarator maybe_raises maybeasm maybe_attribute
{ tree d; { tree d;
...@@ -1916,7 +1959,7 @@ initdcl0: ...@@ -1916,7 +1959,7 @@ initdcl0:
$$ = suspend_momentary (); $$ = suspend_momentary ();
d = start_decl ($<ttype>1, current_declspecs, 0, $2); d = start_decl ($<ttype>1, current_declspecs, 0, $2);
cplus_decl_attributes (d, $4); cplus_decl_attributes (d, $4);
finish_decl (d, NULL_TREE, $3, 0); } finish_decl (d, NULL_TREE, $3, 0, 0); }
; ;
initdcl: initdcl:
...@@ -1925,11 +1968,11 @@ initdcl: ...@@ -1925,11 +1968,11 @@ initdcl:
cplus_decl_attributes ($<ttype>$, $4); } cplus_decl_attributes ($<ttype>$, $4); }
init init
/* Note how the declaration of the variable is in effect while its init is parsed! */ /* Note how the declaration of the variable is in effect while its init is parsed! */
{ finish_decl ($<ttype>6, $7, $3, 0); } { finish_decl ($<ttype>6, $7, $3, 0, LOOKUP_ONLYCONVERTING); }
| declarator maybe_raises maybeasm maybe_attribute | declarator maybe_raises maybeasm maybe_attribute
{ $<ttype>$ = start_decl ($<ttype>1, current_declspecs, 0, $2); { $<ttype>$ = start_decl ($<ttype>1, current_declspecs, 0, $2);
cplus_decl_attributes ($<ttype>$, $4); cplus_decl_attributes ($<ttype>$, $4);
finish_decl ($<ttype>$, NULL_TREE, $3, 0); } finish_decl ($<ttype>$, NULL_TREE, $3, 0, 0); }
; ;
notype_initdcl0: notype_initdcl0:
...@@ -1940,7 +1983,7 @@ notype_initdcl0: ...@@ -1940,7 +1983,7 @@ notype_initdcl0:
cplus_decl_attributes ($<ttype>$, $4); } cplus_decl_attributes ($<ttype>$, $4); }
init init
/* Note how the declaration of the variable is in effect while its init is parsed! */ /* Note how the declaration of the variable is in effect while its init is parsed! */
{ finish_decl ($<ttype>6, $7, $3, 0); { finish_decl ($<ttype>6, $7, $3, 0, LOOKUP_ONLYCONVERTING);
$$ = $<itype>5; } $$ = $<itype>5; }
| notype_declarator maybe_raises maybeasm maybe_attribute | notype_declarator maybe_raises maybeasm maybe_attribute
{ tree d; { tree d;
...@@ -1948,7 +1991,7 @@ notype_initdcl0: ...@@ -1948,7 +1991,7 @@ notype_initdcl0:
$$ = suspend_momentary (); $$ = suspend_momentary ();
d = start_decl ($<ttype>1, current_declspecs, 0, $2); d = start_decl ($<ttype>1, current_declspecs, 0, $2);
cplus_decl_attributes (d, $4); cplus_decl_attributes (d, $4);
finish_decl (d, NULL_TREE, $3, 0); } finish_decl (d, NULL_TREE, $3, 0, 0); }
; ;
nomods_initdcl0: nomods_initdcl0:
...@@ -1959,7 +2002,7 @@ nomods_initdcl0: ...@@ -1959,7 +2002,7 @@ nomods_initdcl0:
cplus_decl_attributes ($<ttype>$, $4); } cplus_decl_attributes ($<ttype>$, $4); }
init init
/* Note how the declaration of the variable is in effect while its init is parsed! */ /* Note how the declaration of the variable is in effect while its init is parsed! */
{ finish_decl ($<ttype>6, $7, $3, 0); { finish_decl ($<ttype>6, $7, $3, 0, LOOKUP_ONLYCONVERTING);
$$ = $<itype>5; } $$ = $<itype>5; }
| notype_declarator maybe_raises maybeasm maybe_attribute | notype_declarator maybe_raises maybeasm maybe_attribute
{ tree d; { tree d;
...@@ -1967,7 +2010,7 @@ nomods_initdcl0: ...@@ -1967,7 +2010,7 @@ nomods_initdcl0:
$$ = suspend_momentary (); $$ = suspend_momentary ();
d = start_decl ($1, current_declspecs, 0, $2); d = start_decl ($1, current_declspecs, 0, $2);
cplus_decl_attributes (d, $4); cplus_decl_attributes (d, $4);
finish_decl (d, NULL_TREE, $3, 0); } finish_decl (d, NULL_TREE, $3, 0, 0); }
; ;
/* the * rules are dummies to accept the Apollo extended syntax /* the * rules are dummies to accept the Apollo extended syntax
...@@ -2569,6 +2612,7 @@ component_decl_1: ...@@ -2569,6 +2612,7 @@ component_decl_1:
empty_parms (), $3); empty_parms (), $3);
$$ = grokfield ($$, TREE_CHAIN ($1), NULL_TREE, NULL_TREE, $$ = grokfield ($$, TREE_CHAIN ($1), NULL_TREE, NULL_TREE,
NULL_TREE); } NULL_TREE); }
| using_decl
; ;
/* The case of exactly one component is handled directly by component_decl. */ /* The case of exactly one component is handled directly by component_decl. */
...@@ -2887,6 +2931,8 @@ nested_name_specifier: ...@@ -2887,6 +2931,8 @@ nested_name_specifier:
nested_name_specifier_1: nested_name_specifier_1:
TYPENAME SCOPE TYPENAME SCOPE
{ got_scope = TREE_TYPE ($$); } { got_scope = TREE_TYPE ($$); }
| NSNAME SCOPE
{ got_scope = TREE_TYPE ($$); }
| template_type SCOPE | template_type SCOPE
{ got_scope = TREE_TYPE ($$); } { got_scope = TREE_TYPE ($$); }
/* These break 'const i;' /* These break 'const i;'
...@@ -3681,13 +3727,13 @@ try_for_typename: ...@@ -3681,13 +3727,13 @@ try_for_typename:
bad_parm: bad_parm:
/* empty */ %prec EMPTY /* empty */ %prec EMPTY
{ {
warning ("type specifier omitted for parameter"); error ("type specifier omitted for parameter");
$$ = build_tree_list (TREE_PURPOSE (TREE_VALUE ($<ttype>-1)), NULL_TREE); $$ = build_tree_list (integer_type_node, NULL_TREE);
} }
| notype_declarator | notype_declarator
{ {
warning ("type specifier omitted for parameter"); error ("type specifier omitted for parameter");
$$ = build_tree_list (TREE_PURPOSE (TREE_VALUE ($<ttype>-1)), $$); $$ = build_tree_list (integer_type_node, $$);
} }
; ;
...@@ -3696,11 +3742,13 @@ maybe_raises: ...@@ -3696,11 +3742,13 @@ maybe_raises:
{ $$ = NULL_TREE; } { $$ = NULL_TREE; }
| THROW '(' ansi_raise_identifiers ')' %prec EMPTY | THROW '(' ansi_raise_identifiers ')' %prec EMPTY
{ $$ = $3; } { $$ = $3; }
| THROW LEFT_RIGHT %prec EMPTY
{ $$ = build_decl_list (NULL_TREE, NULL_TREE); }
; ;
ansi_raise_identifier: ansi_raise_identifier:
type_id type_id
{ $$ = build_decl_list (NULL_TREE, $$); } { $$ = build_decl_list (NULL_TREE, groktypename($$)); }
; ;
ansi_raise_identifiers: ansi_raise_identifiers:
......
...@@ -2303,8 +2303,9 @@ do_pending_expansions () ...@@ -2303,8 +2303,9 @@ do_pending_expansions ()
else if (! flag_implicit_templates) else if (! flag_implicit_templates)
DECIDE (0); DECIDE (0);
/* OK, it was an implicit instantiation. */ if (i->interface == 1)
TREE_PUBLIC (t) = 0; /* OK, it was an implicit instantiation. */
TREE_PUBLIC (t) = 0;
/* If it's a method, let the class type decide it. /* If it's a method, let the class type decide it.
@@ What if the method template is in a separate file? @@ What if the method template is in a separate file?
......
...@@ -1503,24 +1503,13 @@ build_exception_variant (ctype, type, raises) ...@@ -1503,24 +1503,13 @@ build_exception_variant (ctype, type, raises)
|| TYPE_VOLATILE (v) != volatilep) || TYPE_VOLATILE (v) != volatilep)
continue; continue;
t = raises; /* @@ This should do set equality, not exact match. */
t2 = TYPE_RAISES_EXCEPTIONS (v); if (simple_cst_list_equal (TYPE_RAISES_EXCEPTIONS (v), raises))
while (t && t2) /* List of exceptions raised matches previously found list.
{
if (TREE_TYPE (t) == TREE_TYPE (t2))
{
t = TREE_CHAIN (t);
t2 = TREE_CHAIN (t2);
}
else break;
}
if (t || t2)
continue;
/* List of exceptions raised matches previously found list.
@@ Nice to free up storage used in consing up the @@ Nice to free up storage used in consing up the
@@ list of exceptions raised. */ @@ list of exceptions raised. */
return v; return v;
} }
/* Need to build a new variant. */ /* Need to build a new variant. */
......
...@@ -2162,7 +2162,7 @@ build_x_function_call (function, params, decl) ...@@ -2162,7 +2162,7 @@ build_x_function_call (function, params, decl)
decl = convert_pointer_to (TREE_TYPE (ctypeptr), decl); decl = convert_pointer_to (TREE_TYPE (ctypeptr), decl);
} }
else else
decl = build_c_cast (ctypeptr, decl); decl = build_c_cast (ctypeptr, decl, 0);
params = tree_cons (NULL_TREE, decl, params); params = tree_cons (NULL_TREE, decl, params);
} }
...@@ -2370,8 +2370,6 @@ build_function_call_real (function, params, require_complete, flags) ...@@ -2370,8 +2370,6 @@ build_function_call_real (function, params, require_complete, flags)
function, coerced_params, NULL_TREE); function, coerced_params, NULL_TREE);
TREE_SIDE_EFFECTS (result) = 1; TREE_SIDE_EFFECTS (result) = 1;
/* Remove this sometime. */
TREE_RAISES (result) |= !! TYPE_RAISES_EXCEPTIONS (fntype);
if (! require_complete) if (! require_complete)
return result; return result;
if (value_type == void_type_node) if (value_type == void_type_node)
...@@ -2427,7 +2425,6 @@ convert_arguments (return_loc, typelist, values, fndecl, flags) ...@@ -2427,7 +2425,6 @@ convert_arguments (return_loc, typelist, values, fndecl, flags)
register tree typetail, valtail; register tree typetail, valtail;
register tree result = NULL_TREE; register tree result = NULL_TREE;
char *called_thing; char *called_thing;
int maybe_raises = 0;
int i = 0; int i = 0;
if (! flag_elide_constructors) if (! flag_elide_constructors)
...@@ -2541,8 +2538,6 @@ convert_arguments (return_loc, typelist, values, fndecl, flags) ...@@ -2541,8 +2538,6 @@ convert_arguments (return_loc, typelist, values, fndecl, flags)
if (val == error_mark_node) if (val == error_mark_node)
continue; continue;
maybe_raises |= TREE_RAISES (val);
if (type != 0) if (type != 0)
{ {
/* Formal parm type is specified by a function prototype. */ /* Formal parm type is specified by a function prototype. */
...@@ -2648,7 +2643,6 @@ convert_arguments (return_loc, typelist, values, fndecl, flags) ...@@ -2648,7 +2643,6 @@ convert_arguments (return_loc, typelist, values, fndecl, flags)
parmval = default_conversion (parmval); parmval = default_conversion (parmval);
#endif #endif
} }
maybe_raises |= TREE_RAISES (parmval);
if (flag_gc if (flag_gc
&& type_needs_gc_entry (TREE_TYPE (parmval)) && type_needs_gc_entry (TREE_TYPE (parmval))
...@@ -2676,8 +2670,6 @@ convert_arguments (return_loc, typelist, values, fndecl, flags) ...@@ -2676,8 +2670,6 @@ convert_arguments (return_loc, typelist, values, fndecl, flags)
return error_mark_list; return error_mark_list;
} }
} }
if (result)
TREE_RAISES (result) = maybe_raises;
return nreverse (result); return nreverse (result);
} }
...@@ -2733,14 +2725,13 @@ build_binary_op (code, arg1, arg2, convert_p) ...@@ -2733,14 +2725,13 @@ build_binary_op (code, arg1, arg2, convert_p)
type1 = TREE_TYPE (args[0]); type1 = TREE_TYPE (args[0]);
type2 = TREE_TYPE (args[1]); type2 = TREE_TYPE (args[1]);
if (IS_AGGR_TYPE_2 (type1, type2) && ! TYPE_PTRMEMFUNC_P (type1)) if (IS_AGGR_TYPE_2 (type1, type2))
{ {
/* Try to convert this to something reasonable. */ /* Try to convert this to something reasonable. */
if (! build_default_binary_type_conversion(code, &args[0], &args[1])) if (! build_default_binary_type_conversion(code, &args[0], &args[1]))
return error_mark_node; return error_mark_node;
} }
else if ((IS_AGGR_TYPE (type1) && ! TYPE_PTRMEMFUNC_P (type1)) else if (IS_AGGR_TYPE (type1) || IS_AGGR_TYPE (type2))
|| (IS_AGGR_TYPE (type2) && ! TYPE_PTRMEMFUNC_P (type2)))
{ {
int convert_index = IS_AGGR_TYPE (type2); int convert_index = IS_AGGR_TYPE (type2);
/* Avoid being tripped up by things like (ARG1 != 0). */ /* Avoid being tripped up by things like (ARG1 != 0). */
...@@ -3735,7 +3726,7 @@ build_component_addr (arg, argtype, msg) ...@@ -3735,7 +3726,7 @@ build_component_addr (arg, argtype, msg)
} }
else else
/* This conversion is harmless. */ /* This conversion is harmless. */
rval = convert_force (argtype, rval); rval = convert_force (argtype, rval, 0);
if (! integer_zerop (DECL_FIELD_BITPOS (field))) if (! integer_zerop (DECL_FIELD_BITPOS (field)))
{ {
...@@ -4871,27 +4862,31 @@ build_compound_expr (list) ...@@ -4871,27 +4862,31 @@ build_compound_expr (list)
tree build_static_cast (type, expr) tree build_static_cast (type, expr)
tree type, expr; tree type, expr;
{ {
return build_c_cast (type, expr); return build_c_cast (type, expr, 0);
} }
tree build_reinterpret_cast (type, expr) tree build_reinterpret_cast (type, expr)
tree type, expr; tree type, expr;
{ {
return build_c_cast (type, expr); return build_c_cast (type, expr, 0);
} }
tree build_const_cast (type, expr) tree build_const_cast (type, expr)
tree type, expr; tree type, expr;
{ {
return build_c_cast (type, expr); return build_c_cast (type, expr, 0);
} }
/* Build an expression representing a cast to type TYPE of expression EXPR. */ /* Build an expression representing a cast to type TYPE of expression EXPR.
ALLOW_NONCONVERTING is true if we should allow non-converting constructors
when doing the cast. */
tree tree
build_c_cast (type, expr) build_c_cast (type, expr, allow_nonconverting)
register tree type; register tree type;
tree expr; tree expr;
int allow_nonconverting;
{ {
register tree value = expr; register tree value = expr;
...@@ -5014,7 +5009,7 @@ build_c_cast (type, expr) ...@@ -5014,7 +5009,7 @@ build_c_cast (type, expr)
value = decl_constant_value (value); value = decl_constant_value (value);
ovalue = value; ovalue = value;
value = convert_force (type, value); value = convert_force (type, value, allow_nonconverting?CONV_NONCONVERTING:0);
/* Ignore any integer overflow caused by the cast. */ /* Ignore any integer overflow caused by the cast. */
if (TREE_CODE (value) == INTEGER_CST) if (TREE_CODE (value) == INTEGER_CST)
...@@ -5848,7 +5843,7 @@ build_modify_expr (lhs, modifycode, rhs) ...@@ -5848,7 +5843,7 @@ build_modify_expr (lhs, modifycode, rhs)
{ {
newrhs = convert_for_assignment (olhstype, newrhs, "assignment", newrhs = convert_for_assignment (olhstype, newrhs, "assignment",
NULL_TREE, 0); NULL_TREE, 0);
newrhs = convert_force (lhstype, newrhs); newrhs = convert_force (lhstype, newrhs, 0);
} }
else else
newrhs = convert_for_assignment (lhstype, newrhs, "assignment", newrhs = convert_for_assignment (lhstype, newrhs, "assignment",
...@@ -6121,7 +6116,7 @@ build_ptrmemfunc (type, pfn, force) ...@@ -6121,7 +6116,7 @@ build_ptrmemfunc (type, pfn, force)
/* Handle null pointer to member function conversions. */ /* Handle null pointer to member function conversions. */
if (integer_zerop (pfn)) if (integer_zerop (pfn))
{ {
pfn = build_c_cast (type, integer_zero_node); pfn = build_c_cast (type, integer_zero_node, 0);
u = build_nt (CONSTRUCTOR, 0, tree_cons (pfn_identifier, pfn, NULL_TREE)); u = build_nt (CONSTRUCTOR, 0, tree_cons (pfn_identifier, pfn, NULL_TREE));
u = build_nt (CONSTRUCTOR, 0, tree_cons (NULL_TREE, integer_zero_node, u = build_nt (CONSTRUCTOR, 0, tree_cons (NULL_TREE, integer_zero_node,
tree_cons (NULL_TREE, integer_zero_node, tree_cons (NULL_TREE, integer_zero_node,
...@@ -6299,11 +6294,11 @@ convert_for_assignment (type, rhs, errtype, fndecl, parmnum) ...@@ -6299,11 +6294,11 @@ convert_for_assignment (type, rhs, errtype, fndecl, parmnum)
} }
/* Conversions involving enums. */ /* Conversions involving enums. */
else if ((codel == ENUMERAL_TYPE else if ((codel == ENUMERAL_TYPE
&& (coder == ENUMERAL_TYPE || coder == INTEGER_TYPE || coder == REAL_TYPE)) && (INTEGRAL_CODE_P (coder) || coder == REAL_TYPE))
|| (coder == ENUMERAL_TYPE || (coder == ENUMERAL_TYPE
&& (codel == ENUMERAL_TYPE || codel == INTEGER_TYPE || codel == REAL_TYPE))) && (INTEGRAL_CODE_P (codel) || codel == REAL_TYPE)))
{ {
return convert (type, rhs); return cp_convert (type, rhs, CONV_IMPLICIT, 0);
} }
/* Conversions among pointers */ /* Conversions among pointers */
else if (codel == POINTER_TYPE else if (codel == POINTER_TYPE
...@@ -7065,7 +7060,7 @@ c_expand_return (retval) ...@@ -7065,7 +7060,7 @@ c_expand_return (retval)
if (TREE_CODE (retval) == WITH_CLEANUP_EXPR if (TREE_CODE (retval) == WITH_CLEANUP_EXPR
&& TREE_CODE (TREE_OPERAND (retval, 0)) == TARGET_EXPR) && TREE_CODE (TREE_OPERAND (retval, 0)) == TARGET_EXPR)
retval = TREE_OPERAND (retval, 0); retval = TREE_OPERAND (retval, 0);
expand_aggr_init (result, retval, 0); expand_aggr_init (result, retval, 0, LOOKUP_ONLYCONVERTING);
expand_cleanups_to (NULL_TREE); expand_cleanups_to (NULL_TREE);
DECL_INITIAL (result) = NULL_TREE; DECL_INITIAL (result) = NULL_TREE;
retval = 0; retval = 0;
......
...@@ -329,7 +329,7 @@ ack (s, v, v2) ...@@ -329,7 +329,7 @@ ack (s, v, v2)
silly. So instead, we just do the equivalent of a call to fatal in the silly. So instead, we just do the equivalent of a call to fatal in the
same situation (call exit). */ same situation (call exit). */
/* First used: 0 (reserved), Last used: 361. Free: */ /* First used: 0 (reserved), Last used: 363. Free: */
static int abortcount = 0; static int abortcount = 0;
...@@ -1430,7 +1430,7 @@ build_functional_cast (exp, parms) ...@@ -1430,7 +1430,7 @@ build_functional_cast (exp, parms)
pedwarn ("initializer list being treated as compound expression"); pedwarn ("initializer list being treated as compound expression");
parms = build_compound_expr (parms); parms = build_compound_expr (parms);
} }
return build_c_cast (type, parms); return build_c_cast (type, parms, 1);
} }
if (TYPE_SIZE (type) == NULL_TREE) if (TYPE_SIZE (type) == NULL_TREE)
...@@ -1440,7 +1440,7 @@ build_functional_cast (exp, parms) ...@@ -1440,7 +1440,7 @@ build_functional_cast (exp, parms)
} }
if (parms && TREE_CHAIN (parms) == NULL_TREE) if (parms && TREE_CHAIN (parms) == NULL_TREE)
return build_c_cast (type, parms); return build_c_cast (type, parms, 1);
expr_as_ctor = build_method_call (NULL_TREE, name, parms, expr_as_ctor = build_method_call (NULL_TREE, name, parms,
NULL_TREE, LOOKUP_NORMAL); NULL_TREE, LOOKUP_NORMAL);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment