OSDN Git Service

50th Cygnus<->FSF merge
authormrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Dec 1994 02:07:31 +0000 (02:07 +0000)
committermrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Dec 1994 02:07:31 +0000 (02:07 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@8657 138bc75d-0d04-0410-961f-82ee72b054a4

20 files changed:
gcc/cp/ChangeLog
gcc/cp/Make-lang.in
gcc/cp/Makefile.in
gcc/cp/call.c
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/cvt.c
gcc/cp/decl.c
gcc/cp/decl2.c
gcc/cp/error.c
gcc/cp/except.c
gcc/cp/expr.c
gcc/cp/gxxint.texi
gcc/cp/init.c
gcc/cp/lex.c
gcc/cp/parse.y
gcc/cp/pt.c
gcc/cp/tree.c
gcc/cp/typeck.c
gcc/cp/typeck2.c

index 3abbd86..8fa9479 100644 (file)
@@ -1,3 +1,80 @@
+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>
 
        * Makefile.in (BISONFLAGS): Delete --yacc.
@@ -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
        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>
 
        * 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)
        * decl.c (finish_decl): Also end temporary allocation if the decl in
        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
        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)
        * error.c (cp_line_of): Use CLASSTYPE_SOURCE_LINE for aggregates.
        * 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
        dont't read template<, class foo>...
@@ -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_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.
 
@@ -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
        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
        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)
        (finish_function): Use DECL_DEFER_OUTPUT to decide which inlines to
        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
        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)
        * decl.c (grok_reference_init): Always save the initializer of a
        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
        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)
        (finish_vtable_vardecl): Call import_export_template before
        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
        call lang_interim_eh. 
@@ -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
        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
        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)
        * typeck2.c (process_init_constructor): Don't treat empty_init_node
        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
        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)
        (finish_file): Output all pending inlines if
        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
        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)
        * typeck.c (convert_arguments): Make sure type is not NULL before
        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 (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)
        * decl.c (grokdeclarator): Make sure we have a DNAME set before we
        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
        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)
        * typeck.c (build_binary_op_nodefault): Division by constant zero is
        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.
 
@@ -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
        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
        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)
        * pt.c (uses_template_parms): Grok BOOLEAN_TYPE.
        (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,
        use it.
@@ -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,
        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
        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)
        (build_default_unary_type_conversion): Convert arg of ! to bool.
        (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.
        * 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)
 
        * 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
        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)
        * init.c (emit_base_init): Check if there's a DECL_NAME on the
        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.
 
@@ -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
        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
        of decls.  Cures memory leak.
@@ -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
        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.
        Quick and dirty backend in except.c.
@@ -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
        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.
 
@@ -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
        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
        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)
 
        * 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
        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)
        * decl.c (grokdeclarator): Don't bash references to arrays into
        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.
 
@@ -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.
        (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.
        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)
        * decl.c (lookup_name): When called from the lexer, look at
        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.
 
@@ -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.
 
-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
        17:48:41.
@@ -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
        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
        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
        * decl.c (init_decl_processing): Declare __builtin_return_address
        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
        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
        * decl.c (redeclaration_error_message): Pass the types to
        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
        have been overridden in a derived class.
@@ -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
        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
        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)
        * call.c (build_method_call): Preserve const & volatile on
        `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
        for arrays. 
@@ -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.
 
-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.
 
-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
        virtuals list when processing a virtual destructor.
@@ -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
        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
        nonfunctionality when used in casts, and MI situations.
@@ -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
        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
        passed a UNION_TYPE.
@@ -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
        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
        that use virtual bases.
@@ -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
        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
        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)
        * error.c (dump_expr): Support member functions (which show up as
        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
        news correctly.
@@ -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
        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
        matches Section 5.5.
@@ -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
        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)
        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)
        a decl.  Also move the IS_AGGR_TYPE check after the stripping of
        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)
        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)
 
        * 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
        argument, just like #pragma implementation.  #pragma implementation
@@ -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
        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
        remove.
@@ -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 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
        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
        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
        intermediate type, if given, when dealing with members off `this'.
        Solves an incorrrect `type `foo' is not a base type for 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
        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)
        herarchies, when a virtual function is first defied in a virtual
        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
        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)
 
        * 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,
        report_ambiguous_mi_virtuals): Removed unneeded code.
@@ -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.
 
-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):
        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)
        (build_x_unary_op): 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
        warning, and conditionalize upon warn_cast_qual.
@@ -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
        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
        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)
        (add_friend): Never stick in ctype.
        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
        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
        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)
        * cvt.c (convert_to_reference): Use %P format for argument
        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
        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)
 
        * 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
        they break libg++.
@@ -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.
 
-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
        subdirectory.
@@ -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-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
        not right.
@@ -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
        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
        values.
@@ -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=,
        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
        invalid.
@@ -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
        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
        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
        member function, based upon it's class type, not the class type of
        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
        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)
        * cp-method.c (hack_identifier): Also check for a TYPE_PTRMEMFUNC_P
        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
        enum bit fields.
@@ -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
        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.
        * toplev.c (lang_options): Ditto.
@@ -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.
        (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
        "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)
        Propagate TYPE_GETS_ASSIGN_REF.  Use cant_synth_copy_ctor.  Add call
        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
        to member function types.
@@ -5612,7 +5831,7 @@ Tue Nov 23 18:06:58 1993  Jason Merrill  (jason@deneb.cygnus.com)
        and its kin properly.
        (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
        functions as aggregates here, as we don't want to look up methods in
index 7a7da70..8442d23 100644 (file)
@@ -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/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
 \f
 # Build hooks:
index 8cc6798..ab3f58b 100644 (file)
@@ -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
 
 # Language-independent object files.
-OBJS = `cat ../stamp-objlist` ../c-common.o
-OBJDEPS = ../stamp-objlist ../c-common.o
+OBJS = `cat ../stamp-objlist` ../c-common.o ../c-pragma.o
+OBJDEPS = ../stamp-objlist ../c-common.o ../c-pragma.o
 
 compiler: ../cc1plus
 ../cc1plus: $(P) $(CXX_OBJS) $(OBJDEPS) $(LIBDEPS)
index 436fc31..85a2788 100644 (file)
@@ -1802,7 +1802,7 @@ build_method_call (instance, name, parms, basetype_path, flags)
                 we can manage.  */
              tree temp = get_temp_name (TREE_TYPE (instance), 0);
              if (IS_AGGR_TYPE (TREE_TYPE (instance)))
-               expand_aggr_init (temp, instance, 0);
+               expand_aggr_init (temp, instance, 0, flags);
              else
                {
                  store_init_value (temp, instance);
@@ -2144,7 +2144,7 @@ build_method_call (instance, name, parms, basetype_path, flags)
                {
                  tree type = build_pointer_type
                    (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)
 
     TREE_TYPE (result) = value_type;
     TREE_SIDE_EFFECTS (result) = 1;
-    TREE_RAISES (result)
-      = TYPE_RAISES_EXCEPTIONS (fntype) || (parms && TREE_RAISES (parms));
     TREE_HAS_CONSTRUCTOR (result) = is_constructor;
     return result;
   }
index 5b89370..9731ac1 100644 (file)
@@ -2116,7 +2116,7 @@ finish_vtbls (binfo, do_self, t)
              && DECL_INITIAL (decl) != BINFO_VIRTUALS (binfo))
            DECL_INITIAL (decl) = build_nt (CONSTRUCTOR, NULL_TREE,
                                            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;
        }
       CLEAR_BINFO_NEW_VTABLE_MARKED (binfo);
@@ -3161,10 +3161,26 @@ finish_struct (t, list_of_fieldlists, warn_anon)
                      DECL_INITIAL (x) = NULL;
                      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;
-                     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));
                    }
                }
 
index 98e2dd9..8b50002 100644 (file)
@@ -1787,6 +1787,7 @@ extern tree current_class_type;   /* _TYPE: the type of the current class */
      as well as the space of member functions.
    LOOKUP_HAS_IN_CHARGE means that the "in charge" variable is already
      in the parameter list.
+   LOOKUP_ONLYCONVERTING means that non-conversion constructors are not tried.
    LOOKUP_NO_CONVERSION means that user-defined conversions are not
      permitted.  Built-in conversions are permitted.
    LOOKUP_DESTRUCTOR means explicit call to destructor.  */
@@ -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_CONST      :  Perform the explicit conversions for const_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_STATIC      2
 #define CONV_CONST       4
 #define CONV_REINTERPRET 8
 #define CONV_PRIVATE    16
+#define CONV_NONCONVERTING 32
 #define CONV_STATIC_CAST (CONV_IMPLICIT | CONV_STATIC)
 #define CONV_OLD_CONVERT (CONV_IMPLICIT | CONV_STATIC | CONV_CONST \
                          | CONV_REINTERPRET)
@@ -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_vbase           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 int build_default_binary_type_conversion        PROTO((enum tree_code, tree *, tree *));
 extern int build_default_unary_type_conversion PROTO((enum tree_code, tree *));
@@ -1956,7 +1960,7 @@ extern void shadow_tag                            PROTO((tree));
 extern int grok_ctor_properties                        PROTO((tree, tree));
 extern tree groktypename                       PROTO((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 int complete_array_type                 PROTO((tree, tree, int));
 extern tree build_ptrmemfunc_type              PROTO((tree));
@@ -2018,6 +2022,9 @@ extern tree reparse_decl_as_expr          PROTO((tree, tree));
 extern tree finish_decl_parsing                        PROTO((tree));
 extern tree lookup_name_nonclass               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 */
 
@@ -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 do_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 tree get_aggr_from_typedef              PROTO((tree, int));
 extern tree get_type_value                     PROTO((tree));
@@ -2347,7 +2354,7 @@ extern tree build_compound_expr                   PROTO((tree));
 extern tree build_static_cast                  PROTO((tree, tree));
 extern tree build_reinterpret_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 int language_lvalue_valid               PROTO((tree));
 extern void warn_for_assignment                        PROTO((char *, char *, char *, tree, int, int));
index 783d1f2..b472c83 100644 (file)
@@ -309,6 +309,10 @@ build_up_reference (type, arg, flags, checkconst)
   targ = arg;
   if (TREE_CODE (targ) == SAVE_EXPR)
     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))
     {
@@ -552,13 +556,16 @@ build_up_reference (type, arg, flags, checkconst)
        }
       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);
          if (global_bindings_p ())
            {
              /* Give this new temp some rtl and initialize it.  */
              DECL_INITIAL (temp) = targ;
              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.  */
              rval = build_unary_op (ADDR_EXPR, temp, 0);
              TREE_TYPE (rval) = type;
@@ -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
    we know it's an initialization.  */
 
-tree cp_convert PROTO((tree, tree, int, int));
-
 tree
 convert_to_reference (reftype, expr, convtype, flags, decl)
      tree reftype, expr;
@@ -703,7 +708,7 @@ convert_to_reference (reftype, expr, convtype, flags, decl)
          
       rval = build_unary_op (ADDR_EXPR, expr, 0);
       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)
        rval = build1 (NOP_EXPR, reftype, rval);
     }
@@ -1061,7 +1066,6 @@ convert_to_aggr (type, expr, msgp, protect)
                     NULL_TREE);
   TREE_TYPE (result) = TREE_TYPE (fntype);
   TREE_SIDE_EFFECTS (result) = 1;
-  TREE_RAISES (result) = !! TYPE_RAISES_EXCEPTIONS (fntype);
   return result;
 }
 
@@ -1184,10 +1188,8 @@ cp_convert (type, expr, convtype, flags)
   register tree e = expr;
   register enum tree_code code = TREE_CODE (type);
 
-  if (type == TREE_TYPE (e)
-      || TREE_CODE (e) == ERROR_MARK)
-    return e;
-  if (TREE_CODE (TREE_TYPE (e)) == ERROR_MARK)
+  if (TREE_CODE (e) == ERROR_MARK
+      || TREE_CODE (TREE_TYPE (e)) == ERROR_MARK)
     return error_mark_node;
 
   /* Trivial conversion: cv-qualifiers do not matter on rvalues.  */
@@ -1229,7 +1231,8 @@ cp_convert (type, expr, convtype, flags)
       /* enum = enum, enum = int, enum = float are all errors. */
       if (flag_int_enum_equivalence == 0
          && 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);
 
@@ -1309,7 +1312,7 @@ cp_convert (type, expr, convtype, flags)
          sig_ptr = get_temp_name (type, 1);
          DECL_INITIAL (sig_ptr) = constructor;
          CLEAR_SIGNATURE (sig_ty);
-         finish_decl (sig_ptr, constructor, 0, 0);
+         finish_decl (sig_ptr, constructor, NULL_TREE, 0, 0);
          SET_SIGNATURE (sig_ty);
          TREE_READONLY (sig_ptr) = 1;
 
@@ -1338,7 +1341,7 @@ cp_convert (type, expr, convtype, flags)
                                  build_tree_list (NULL_TREE, e),
                                  TYPE_BINFO (type),
                                  LOOKUP_NORMAL | LOOKUP_SPECULATIVELY
-                                 | LOOKUP_ONLYCONVERTING
+                                 | (convtype&CONV_NONCONVERTING ? 0 : LOOKUP_ONLYCONVERTING)
                                  | (conversion ? LOOKUP_NO_CONVERSION : 0));
 
       if (ctor == error_mark_node)
@@ -1428,9 +1431,10 @@ convert (type, expr)
    are not normally allowed due to access restrictions
    (such as conversion from sub-type to private super-type).  */
 tree
-convert_force (type, expr)
+convert_force (type, expr, convtype)
      tree type;
      tree expr;
+     int convtype;
 {
   register tree e = expr;
   register enum tree_code code = TREE_CODE (type);
@@ -1455,13 +1459,8 @@ convert_force (type, expr)
       /* compatible pointer to member functions. */
       return build_ptrmemfunc (TYPE_PTRMEMFUNC_FN_TYPE (type), e, 1);
     }
-  {
-    int old_equiv = flag_int_enum_equivalence;
-    flag_int_enum_equivalence = 1;
-    e = convert (type, e);
-    flag_int_enum_equivalence = old_equiv;
-  }
-  return e;
+
+  return cp_convert (type, e, CONV_OLD_CONVERT|convtype, 0);
 }
 
 /* Subroutine of build_type_conversion.  */
index 60fe14f..5d3c2f2 100644 (file)
@@ -932,7 +932,8 @@ poplevel (keep, reverse, functionbody)
     if (TREE_CODE (decl) == FUNCTION_DECL
        && ! TREE_ASM_WRITTEN (decl)
        && 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
           on account of a block-scope extern decl,
@@ -1933,7 +1934,7 @@ clear_anon_tags ()
    For C++, we must compare the parameter list so that `int' can match
    `int&' in a parameter position, but `int&' is not confused with
    `const int&'.  */
-static int
+int
 decls_match (newdecl, olddecl)
      tree newdecl, olddecl;
 {
@@ -2276,13 +2277,6 @@ duplicate_decls (newdecl, olddecl)
                        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,
@@ -2391,7 +2385,7 @@ duplicate_decls (newdecl, olddecl)
 
          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);
              cp_error_at ("...from previous declaration here", olddecl);
            }
@@ -2535,6 +2529,8 @@ duplicate_decls (newdecl, olddecl)
          if (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)
@@ -2671,7 +2667,7 @@ pushdecl (x)
 #else
   /* Type are looked up using the DECL_NAME, as that is what the rest of the
      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);
 #endif
 
@@ -2908,39 +2904,13 @@ pushdecl (x)
              && TREE_CODE (oldglobal) == FUNCTION_DECL)
            {
              /* 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_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,
             and no file-scope declaration has yet been seen,
@@ -5625,7 +5595,7 @@ make_temporary_for_reference (decl, ctor_call, init, cleanupp)
     {
       DECL_INITIAL (tmp) = init;
       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))
     preserve_initializer ();
@@ -5740,6 +5710,24 @@ grok_reference_init (decl, type, init, cleanupp)
   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;
    install its line number and initial value.
    If the length of an array type is not known before,
@@ -5754,16 +5742,20 @@ grok_reference_init (decl, type, init, cleanupp)
    INIT0 holds the value of an initializer that should be allowed to escape
    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
    "maximal" instantiation.  `finish_decl' must then also declared its
    subsequently lower and lower forms of instantiation, checking for
    ambiguity as it goes.  This can be sped up later.  */
 
 void
-finish_decl (decl, init, asmspec_tree, need_pop)
+finish_decl (decl, init, asmspec_tree, need_pop, flags)
      tree decl, init;
      tree asmspec_tree;
      int need_pop;
+     int flags;
 {
   register tree type;
   tree cleanup = NULL_TREE, ttype;
@@ -5871,10 +5863,7 @@ finish_decl (decl, init, asmspec_tree, need_pop)
       if (asmspec)
        {
          /* This must override the asm specifier which was placed
-            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.  */
+            by grokclassfn.  Lay this out fresh.  */
          DECL_RTL (TREE_TYPE (decl)) = NULL_RTX;
          DECL_ASSEMBLER_NAME (decl) = get_identifier (asmspec);
          make_decl_rtl (decl, asmspec, 0);
@@ -5971,18 +5960,7 @@ finish_decl (decl, init, asmspec_tree, need_pop)
 
          /* We must hide the initializer so that expand_decl
             won't try to do something it does not understand.  */
-         if (current_binding_level == global_binding_level)
-           {
-             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;
+         obscure_complex_init (decl);
        }
       else
        {
@@ -5993,14 +5971,7 @@ finish_decl (decl, init, asmspec_tree, need_pop)
          /* Don't let anyone try to initialize this variable
             until we are ready to do so.  */
          if (init)
-           {
-             tree value;
-             if (DECL_COMMON (decl))
-               value = error_mark_node;
-             else
-               value = build (CONSTRUCTOR, type, NULL_TREE, NULL_TREE);
-             DECL_INITIAL (decl) = value;
-           }
+           obscure_complex_init (decl);
        }
     }
   else if (DECL_EXTERNAL (decl))
@@ -6026,20 +5997,9 @@ finish_decl (decl, init, asmspec_tree, need_pop)
          && (TYPE_READONLY (type) || TREE_READONLY (decl)))
        cp_error ("uninitialized const `%D'", decl);
 
-      /* Initialize variables in need of static initialization with
-        an empty CONSTRUCTOR to keep assemble_variable from putting them in
-        the wrong program space.  */
-      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);
+      if (TYPE_SIZE (type) != NULL_TREE
+         && TYPE_NEEDS_CONSTRUCTING (type))
+       obscure_complex_init (decl);
     }
   else if (TREE_CODE (decl) == VAR_DECL
           && TREE_CODE (type) != REFERENCE_TYPE
@@ -6396,7 +6356,7 @@ finish_decl (decl, init, asmspec_tree, need_pop)
                {
                  emit_line_note (DECL_SOURCE_FILE (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
@@ -6510,7 +6470,7 @@ expand_static_init (decl, init)
       expand_assignment (temp, integer_one_node, 0, 0);
       if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (decl)))
        {
-         expand_aggr_init (decl, init, 0);
+         expand_aggr_init (decl, init, 0, 0);
          do_pending_stack_adjust ();
        }
       else
@@ -6639,7 +6599,7 @@ bad_specifiers (object, type, virtualp, quals, inlinep, friendp, raises)
   if (friendp)
     cp_error_at ("invalid friend declaration", object);
   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.
@@ -6889,6 +6849,8 @@ grokvardecl (type, declarator, specbits, initialized)
   else
     decl = build_decl (VAR_DECL, declarator, type);
 
+  DECL_ASSEMBLER_NAME (decl) = current_namespace_id (DECL_ASSEMBLER_NAME (decl));
+
   if (RIDBIT_SETP (RID_EXTERN, specbits))
     {
       DECL_THIS_EXTERN (decl) = 1;
@@ -7166,7 +7128,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises)
              init = TREE_OPERAND (decl, 1);
 
              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;
            }
          innermost_code = TREE_CODE (decl);
@@ -9071,7 +9033,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, raises)
          return NULL_TREE;
 
        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)
          {
@@ -10349,26 +10311,17 @@ finish_enum (enumtype, values)
     int highprec = min_precision (maxnode, unsignedp);
     int precision = MAX (lowprec, highprec);
 
-    if (! flag_short_enums && precision < TYPE_PRECISION (integer_type_node))
-      precision = TYPE_PRECISION (integer_type_node);
-
+    TYPE_SIZE (enumtype) = NULL_TREE;
 
-    /*
-     *  The following code is unnecessary since the function 
-     *  type_promotes_to deals correctly with promotion of enums of 
-     *  underlying unsigned types to signed integer types.
-     *  Moreover, it causes an enum bitfield to require one more bit of
-     *  storage than defined by the ANSI/ISO C++ resolution section r.7.2
-     *  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
+    /* Lay out the type as though it were an integer.  */
+    if (! flag_short_enums && precision < TYPE_PRECISION (integer_type_node))
+      {
+       TYPE_MIN_VALUE (enumtype) = minnode;
+       TYPE_PRECISION (enumtype) = TYPE_PRECISION (integer_type_node);
+       layout_type (enumtype);
+      }
 
     TYPE_PRECISION (enumtype) = precision;
-    TYPE_SIZE (enumtype) = NULL_TREE;
     if (unsignedp)
       fixup_unsigned_type (enumtype);
     else
@@ -11110,7 +11063,7 @@ store_return_init (return_id, init)
       /* Let `finish_decl' know that this initializer is ok.  */
       DECL_INITIAL (decl) = init;
       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)
        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 */
   pushlevel (0);
index 4931870..5e06572 100644 (file)
@@ -1147,6 +1147,10 @@ check_classfn (ctype, cname, function)
                {
                  if (DECL_ASSEMBLER_NAME (function) == DECL_ASSEMBLER_NAME (fndecl))
                    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);
                }
              break;            /* loser */
@@ -1195,6 +1199,7 @@ grokfield (declarator, declspecs, raises, init, asmspec_tree)
 {
   register tree value;
   char *asmspec = 0;
+  int flags = LOOKUP_ONLYCONVERTING;
 
   /* Convert () initializers to = initializers.  */
   if (init == NULL_TREE && declarator != NULL_TREE
@@ -1206,6 +1211,7 @@ grokfield (declarator, declspecs, raises, init, asmspec_tree)
     {
       init = TREE_OPERAND (declarator, 1);
       declarator = TREE_OPERAND (declarator, 0);
+      flags = 0;
     }
 
   if (init
@@ -1353,17 +1359,22 @@ grokfield (declarator, declspecs, raises, init, asmspec_tree)
       DECL_INITIAL (value) = init;
       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);
       return value;
     }
   if (TREE_CODE (value) == FIELD_DECL)
     {
       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)
        init = error_mark_node;
-      finish_decl (value, init, asmspec_tree, 1);
+      finish_decl (value, init, asmspec_tree, 1, flags);
       DECL_INITIAL (value) = init;
       DECL_IN_AGGR_P (value) = 1;
       return value;
@@ -1378,7 +1389,14 @@ grokfield (declarator, declspecs, raises, init, asmspec_tree)
          /* When does this happen?  */
          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.  */
       if (DECL_FRIEND_P (value))
@@ -1439,7 +1457,7 @@ grokbitfield (declarator, declspecs, width)
       cp_error ("static member `%D' cannot be a bitfield", value);
       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)
     {
@@ -1631,7 +1649,7 @@ groktypefield (declspecs, parmlist)
       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
      complain about such redundancy, and return NULL_TREE
@@ -1934,7 +1952,7 @@ setup_vtbl_ptr ()
       DECL_INITIAL (current_vtable_decl) = error_mark_node;
       /* Have to cast the initializer, since it may have come from a
         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);
     }
   else
@@ -1947,8 +1965,10 @@ void
 mark_inline_for_output (decl)
      tree decl;
 {
+  decl = DECL_MAIN_VARIANT (decl);
   if (DECL_SAVED_INLINE (decl))
     return;
+  my_friendly_assert (TREE_PERMANENT (decl), 363);
   DECL_SAVED_INLINE (decl) = 1;
   if (DECL_PENDING_INLINE_INFO (decl) != 0
       && ! DECL_PENDING_INLINE_INFO (decl)->deja_vu)
@@ -2176,7 +2196,7 @@ finish_table (name, type, init, publicp)
          DECL_INITIAL (empty_table) = init;
          asmspec = build_string (IDENTIFIER_LENGTH (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;
     }
@@ -2214,7 +2234,7 @@ finish_table (name, type, init, publicp)
                              IDENTIFIER_POINTER (DECL_NAME (empty_table)));
     }
 
-  finish_decl (decl, init, asmspec, 0);
+  finish_decl (decl, init, asmspec, 0, 0);
   return decl;
 }
 
@@ -2782,7 +2802,7 @@ finish_file ()
                }
              if (IS_AGGR_TYPE (TREE_TYPE (decl))
                  || 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)
                {
                  expand_expr (expand_vec_init (decl, TREE_VEC_ELT (init, 0),
@@ -2803,7 +2823,7 @@ finish_file ()
                  /* a `new' expression at top level.  */
                  expand_expr (decl, const0_rtx, VOIDmode, 0);
                  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)
@@ -3041,7 +3061,7 @@ reparse_absdcl_as_casts (decl, expr)
     {
       type = groktypename (TREE_VALUE (TREE_OPERAND (decl, 1)));
       decl = TREE_OPERAND (decl, 0);
-      expr = build_c_cast (type, expr);
+      expr = build_c_cast (type, expr, 0);
     }
 
   return expr;
@@ -3166,3 +3186,77 @@ check_cp_case_value (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;
+{
+}
index b826283..ff4cc09 100644 (file)
@@ -1017,8 +1017,7 @@ dump_expr (t, nop)
        }
       else
        {
-         sorry ("operand of SAVE_EXPR not understood");
-         goto error;
+         dump_expr (TREE_OPERAND (t, 0), 0);
        }
       break;
 
index 4d6ac73..87ec7a8 100644 (file)
@@ -43,7 +43,7 @@ tree builtin_return_address_fndecl;
 #define TRY_NEW_EH
 #endif
 #endif
-#if defined(__i386) || defined(__rs6000) || defined(__hppa)
+#if defined(__i386) || defined(__rs6000) || defined(__hppa) || defined(__mc68000) || defined (__mips)
 #define TRY_NEW_EH
 #endif
 #endif
@@ -803,6 +803,16 @@ init_exception_processing ()
   saved_throw_type = gen_rtx (REG, Pmode, 6);
   saved_throw_value = gen_rtx (REG, Pmode, 7);
 #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 (&eh_table_output_queue);
   new_eh_stack (&ehstack);
@@ -977,6 +987,13 @@ expand_end_all_catch ()
   if (! doing_eh (1))
     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.  */
   last = pop_last_insn ();
   catchstart = NEXT_INSN (last);
@@ -1136,7 +1153,7 @@ expand_start_catch_block (declspecs, declarator)
 
       /* if it returned FALSE, jump over the catch block, else fall into it */
       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
     {
@@ -1165,7 +1182,7 @@ void expand_end_catch_block ()
       /* label we jump to if we caught the exception */
       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. */
       /* These are saved for the exception table.  */
       push_rtl_perm ();
@@ -1240,7 +1257,7 @@ do_unwind (throw_label)
   easy_expand_asm ("restore");
   emit_barrier ();
 #endif
-#if defined(__i386) || defined(__rs6000) || defined(__hppa)
+#if defined(__i386) || defined(__rs6000) || defined(__hppa) || defined(__mc68000) || defined (__mips)
   extern FILE *asm_out_file;
   tree fcall;
   tree params;
@@ -1443,9 +1460,13 @@ expand_throw (exp)
 
        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);
+
+       /* 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)
          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);
       }
     }
index 3b4f65d..a7dc3d8 100644 (file)
@@ -155,7 +155,7 @@ cplus_expand_expr (exp, target, tmode, modifier)
                TREE_ADDRESSABLE (init) = 1;
 
                flag_access_control = 0;
-               expand_aggr_init (slot, init, 0);
+               expand_aggr_init (slot, init, 0, LOOKUP_ONLYCONVERTING);
                flag_access_control = old_ac;
 
                if (TYPE_NEEDS_DESTRUCTOR (type))
@@ -195,7 +195,7 @@ cplus_expand_expr (exp, target, tmode, modifier)
            init = build (RTL_EXPR, return_type, 0, call_target);
            /* We got back a reference to the type we want.  Now initialize
               target with that.  */
-           expand_aggr_init (slot, init, 0);
+           expand_aggr_init (slot, init, 0, LOOKUP_ONLYCONVERTING);
          }
 
        if (DECL_RTL (slot) != target)
index fc9157c..961fb6d 100644 (file)
@@ -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
 throwing.  The only bad part, is that the stack remains large.
 
-Flaws in g++'s exception handling.  The stack pointer is restored from
-stack, we want to match rs6000, and propagate the stack pointer from
-time of throw, down, to the catch place.
-
-Only exact type matching of throw types works (references work also),
-catch variables cannot be used.  Only works on a Sun sparc running SunOS
-4.1.x.  Unwinding to outer catch clauses works.  All temps and local
-variables are cleaned up in all unwinded scopes.  Completed parts of
-partially constructed objects are not cleaned up.  Don't expect
-exception handling to work right if you optimize, in fact the compiler
-will probably core dump.  If two EH regions are the exact same size, the
-backend cannot tell which one is first.  It punts by picking the last
-one, if they tie.  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.
+The below points out some flaws in g++'s exception handling, as it now
+stands.
+
+Only exact type matching or reference matching of throw types works.
+Only works on a SPARC machines (like Suns), and i386 machines.  Partial
+support is also in for rs6000, hppa, m68k and mips machines, but a stack
+unwinder called __unwind_function has to be written, and added to
+libgcc2 for them.  All completely constructed temps and local variables
+are cleaned up in all unwinded scopes.  Completed parts of partially
+constructed objects are not cleaned up.  Don't expect exception handling
+to work right if you optimize, in fact the compiler will probably core
+dump.  If two EH regions are the exact same size, the backend cannot
+tell which one is first.  It punts by picking the last one, if they tie.
+This is usually right.  We really should stick in a nop, if they are the
+same size.
 
 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
@@ -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
 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
-right way to go.
-
-The EH object is copied like it should be, if it is passed by value,
-otherwise we get a reference directly to it.
-
-EH objects make it through unwinding, but are subject to being
-overwritten as they are still past the top of stack.  Don't throw
-automatic objects if this is a problem.
-
-Exceptions in catch handlers now go to outer block.
+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
+object.
+
+Exception specifications are handled syntax wise, but not semantic wise.
+build_exception_variant should sort the incoming list, so that is
+implements set compares, not exact list equality.  Type smashing should
+smash exception specifications using set union.
+
+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
 @section Free Store
index 777ebe5..cbff4c7 100644 (file)
@@ -185,7 +185,7 @@ perform_member_init (member, name, init, explicit)
                           array_type_nelts (type), TREE_VALUE (init), 1);
        }
       else
-       expand_aggr_init (decl, init, 0);
+       expand_aggr_init (decl, init, 0, 0);
     }
   else
     {
@@ -734,7 +734,7 @@ expand_virtual_init (binfo, decl)
     return;
 
   /* 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));
 }
 
@@ -1071,7 +1071,7 @@ expand_member_init (exp, name, init)
   else if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (field)))
     {
       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;
     }
 
@@ -1087,6 +1087,8 @@ expand_member_init (exp, name, init)
    INIT comes in two flavors: it is either a value which
    is to be stored in EXP, or it is a parameter list
    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,
    explaining that such initializations are illegal.
 
@@ -1116,9 +1118,10 @@ expand_member_init (exp, name, init)
    */
 
 void
-expand_aggr_init (exp, init, alias_this)
+expand_aggr_init (exp, init, alias_this, flags)
      tree exp, init;
      int alias_this;
+     int flags;
 {
   tree type = TREE_TYPE (exp);
   int was_const = TREE_READONLY (exp);
@@ -1179,7 +1182,7 @@ expand_aggr_init (exp, init, alias_this)
     init = CONSTRUCTOR_ELTS (init);
 #endif
   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;
 }
 
@@ -1353,9 +1356,6 @@ expand_aggr_init_1 (binfo, true_exp, exp, init, alias_this, flags)
                  init = build (CALL_EXPR, init_type,
                                TREE_OPERAND (init, 0), TREE_OPERAND (init, 1), 0);
                  TREE_SIDE_EFFECTS (init) = 1;
-#if 0
-                 TREE_RAISES (init) = ??
-#endif
                    if (init_list)
                      TREE_VALUE (init_list) = init;
                }
@@ -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)),
                            TREE_OPERAND (init, 0), TREE_OPERAND (init, 1), 0);
              TREE_SIDE_EFFECTS (init) = 1;
-#if 0
-             TREE_RAISES (init) = ??
-#endif
              TREE_VALUE (TREE_OPERAND (init, 1))
                = 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)
              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);
              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
                       && TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (member)))
                {
@@ -1803,7 +1800,7 @@ build_member_call (cname, name, parmlist)
        {
          tree newtype = build_type_variant (type, TYPE_READONLY (oldtype),
                                             TYPE_VOLATILE (oldtype));
-         decl = convert_force (build_pointer_type (newtype), olddecl);
+         decl = convert_force (build_pointer_type (newtype), olddecl, 0);
        }
       else
        decl = olddecl;
@@ -3114,7 +3111,7 @@ build_new (placement, decl, init, use_global_new)
          /* New 2.0 interpretation: `new int (10)' means
             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),
                        build_modify_expr (build_indirect_ref (rval, NULL_PTR),
                                           NOP_EXPR, init),
@@ -3151,7 +3148,7 @@ build_new (placement, decl, init, use_global_new)
                                    build_binary_op (MINUS_EXPR, nelts, integer_one_node, 1),
                                    init, 0);
          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 ();
 
@@ -3179,7 +3176,7 @@ build_new (placement, decl, init, use_global_new)
   if (rval && TREE_TYPE (rval) != build_pointer_type (type))
     {
       /* 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)
@@ -3273,7 +3270,7 @@ expand_vec_init (decl, base, maxindex, init, from_array)
          while (elts)
            {
              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);
              elts = TREE_CHAIN (elts);
@@ -3357,7 +3354,7 @@ expand_vec_init (decl, base, maxindex, init, from_array)
          if (from_array == 2)
            expand_expr_stmt (build_modify_expr (to, NOP_EXPR, from));
          else if (TYPE_NEEDS_CONSTRUCTING (type))
-           expand_aggr_init (to, from, 0);
+           expand_aggr_init (to, from, 0, 0);
          else if (from)
            expand_assignment (to, from, 0, 0);
          else
@@ -3371,7 +3368,7 @@ expand_vec_init (decl, base, maxindex, init, from_array)
                           array_type_nelts (type), 0, 0);
        }
       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,
                         build (PLUS_EXPR, TYPE_POINTER_TO (type), base, size),
@@ -3488,7 +3485,7 @@ build_delete (type, addr, auto_delete, flags, use_global_delete)
        addr = save_expr (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);
       ptr = 1;
     }
@@ -3514,7 +3511,7 @@ build_delete (type, addr, auto_delete, flags, use_global_delete)
       if (TREE_CONSTANT (addr))
        addr = convert_pointer_to (type, addr);
       else
-       addr = convert_force (build_pointer_type (type), addr);
+       addr = convert_force (build_pointer_type (type), addr, 0);
 
       if (TREE_CODE (addr) == NOP_EXPR
          && TREE_OPERAND (addr, 0) == current_class_decl)
@@ -3803,7 +3800,7 @@ build_vbase_delete (type, decl)
   while (vbases)
     {
       tree this_addr = convert_force (TYPE_POINTER_TO (BINFO_TYPE (vbases)),
-                                     addr);
+                                     addr, 0);
       result = tree_cons (NULL_TREE,
                          build_delete (TREE_TYPE (this_addr), this_addr,
                                        integer_zero_node,
index 9d85c47..97f1f02 100644 (file)
@@ -2587,6 +2587,15 @@ check_newline ()
                      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;
        }
@@ -4874,3 +4883,46 @@ yyerror (string)
 
   error (buf, token_buffer);
 }
+\f
+#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 */
index c04d608..9fb1b37 100644 (file)
@@ -167,13 +167,14 @@ empty_parms ()
 %nonassoc IF
 %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 '{' ',' ';'
 
 %nonassoc THROW
+%right <code> ':'
 %right <code> ASSIGN '='
-%right <code> '?' ':'
+%right <code> '?'
 %left <code> OROR
 %left <code> ANDAND
 %left <code> '|'
@@ -228,7 +229,7 @@ empty_parms ()
 %type <ttype> fcast_or_absdcl regcast_or_absdcl sub_cast_expr
 %type <ttype> expr_or_declarator complex_notype_declarator
 %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> named_parm complex_parmlist typed_declspecs1 parms_comma
 
@@ -264,12 +265,16 @@ empty_parms ()
 %type <ttype> complex_type_name nested_name_specifier_1
 %type <itype> nomods_initdecls nomods_initdcl0
 %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. */
 %token TYPENAME_DEFN IDENTIFIER_DEFN PTYPENAME_DEFN
 %type <ttype> named_class_head_sans_basetype_defn 
 %type <ttype> identifier_defn IDENTIFIER_DEFN TYPENAME_DEFN PTYPENAME_DEFN
 
+%token NSNAME
+%type <ttype> NSNAME
+
 %type <strtype> .pushlevel
 
 /* spew.c depends on this being the last token.  Define
@@ -313,6 +318,11 @@ extdefs:
                { $<ttype>$ = NULL_TREE; }
        ;
 
+extdefs_opt:
+         extdefs
+       | /* empty */
+       ;
+
 .hush_warning:
                { have_extern_spec = 1;
                  used_extern_spec = 0;
@@ -345,9 +355,7 @@ extdef:
        | asm_keyword '(' string ')' ';'
                { if (TREE_CHAIN ($3)) $3 = combine_strings ($3);
                  assemble_asm ($3); }
-       | extern_lang_string '{' extdefs '}'
-               { pop_lang_context (); }
-       | extern_lang_string '{' '}'
+       | extern_lang_string '{' extdefs_opt '}'
                { pop_lang_context (); }
        | extern_lang_string .hush_warning fndef .warning_ok
                { if (pending_inlines) do_pending_inlines ();
@@ -355,6 +363,38 @@ extdef:
        | extern_lang_string .hush_warning datadef .warning_ok
                { if (pending_inlines) do_pending_inlines ();
                  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:
@@ -462,7 +502,7 @@ template_def:
                  d = start_decl ($<ttype>2, /*current_declspecs*/NULL_TREE, 0,
                                  $3);
                  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);
                  if (def)
                    reinit_parse_for_template ((int) $6, $1, d);
@@ -481,7 +521,7 @@ template_def:
                  d = start_decl ($<ttype>3, current_declspecs,
                                  0, $<ttype>4);
                  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);
                  if (def)
                    {
@@ -495,7 +535,7 @@ template_def:
                {
                  int def = ($4 != ';');
                  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);
                  if (def)
                    reinit_parse_for_template ((int) $4, $1, d);
@@ -521,7 +561,7 @@ datadef:
        | declmods notype_declarator ';'
                { tree d;
                  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 ';'
                {
@@ -531,7 +571,7 @@ datadef:
        | typed_declspecs declarator ';'
                { tree d;
                  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>$);
                }
         | declmods ';'
@@ -752,11 +792,13 @@ identifier:
          IDENTIFIER
        | TYPENAME
        | PTYPENAME
+       | NSNAME
        ;
 
 notype_identifier:
          IDENTIFIER
-       | PTYPENAME %prec EMPTY
+       | PTYPENAME 
+       | NSNAME %prec EMPTY
        ;
 
 identifier_defn:
@@ -939,7 +981,7 @@ condition:
                }
        init
                { 
-                 finish_decl ($<ttype>7, $8, $5, 0);
+                 finish_decl ($<ttype>7, $8, $5, 0, LOOKUP_ONLYCONVERTING);
                  resume_momentary ($<itype>6);
                  $$ = $<ttype>7; 
                  if (TREE_CODE (TREE_TYPE ($$)) == ARRAY_TYPE)
@@ -1225,7 +1267,7 @@ expr_no_commas:
                { $$ = build_m_component_ref ($$, build_x_unary_op ($2, $3)); }
        | object '(' type_id ')' expr_no_commas  %prec UNARY
                { 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
                { $$ = build_m_component_ref ($$, $2); }
 */
@@ -1236,7 +1278,8 @@ notype_unqualified_id:
                { $$ = build_parse_node (BIT_NOT_EXPR, $3); }
        | operator_name
        | IDENTIFIER
-       | PTYPENAME %prec EMPTY
+       | PTYPENAME
+       | NSNAME %prec EMPTY
        ;
 
 unqualified_id:
@@ -1421,7 +1464,7 @@ primary:
                        }
 #endif
                      else my_friendly_abort (79);
-                     $$ = build_c_cast (type, build_compound_expr ($3));
+                     $$ = build_c_cast (type, build_compound_expr ($3), 1);
                    }
                }
        | functional_cast
@@ -1659,7 +1702,7 @@ decl:
                { tree d = get_decl_list ($1);
                  int yes = suspend_momentary ();
                  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);
                  if (IS_AGGR_TYPE_CODE (TREE_CODE ($1)))
                    note_got_semicolon ($1);
@@ -1668,7 +1711,7 @@ decl:
                { tree d = $1;
                  int yes = suspend_momentary ();
                  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);
                  note_list_got_semicolon ($1);
                }
@@ -1899,7 +1942,7 @@ initdcl0:
                  cplus_decl_attributes ($<ttype>$, $4); }
          init
 /* 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; }
        | declarator maybe_raises maybeasm maybe_attribute
                { tree d;
@@ -1916,7 +1959,7 @@ initdcl0:
                  $$ = suspend_momentary ();
                  d = start_decl ($<ttype>1, current_declspecs, 0, $2);
                  cplus_decl_attributes (d, $4);
-                 finish_decl (d, NULL_TREE, $3, 0); }
+                 finish_decl (d, NULL_TREE, $3, 0, 0); }
        ;
 
 initdcl:
@@ -1925,11 +1968,11 @@ initdcl:
                  cplus_decl_attributes ($<ttype>$, $4); }
          init
 /* 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
                { $<ttype>$ = start_decl ($<ttype>1, current_declspecs, 0, $2);
                  cplus_decl_attributes ($<ttype>$, $4);
-                 finish_decl ($<ttype>$, NULL_TREE, $3, 0); }
+                 finish_decl ($<ttype>$, NULL_TREE, $3, 0, 0); }
        ;
 
 notype_initdcl0:
@@ -1940,7 +1983,7 @@ notype_initdcl0:
                  cplus_decl_attributes ($<ttype>$, $4); }
          init
 /* 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; }
        | notype_declarator maybe_raises maybeasm maybe_attribute
                { tree d;
@@ -1948,7 +1991,7 @@ notype_initdcl0:
                  $$ = suspend_momentary ();
                  d = start_decl ($<ttype>1, current_declspecs, 0, $2);
                  cplus_decl_attributes (d, $4);
-                 finish_decl (d, NULL_TREE, $3, 0); }
+                 finish_decl (d, NULL_TREE, $3, 0, 0); }
        ;
 
 nomods_initdcl0:
@@ -1959,7 +2002,7 @@ nomods_initdcl0:
                  cplus_decl_attributes ($<ttype>$, $4); }
          init
 /* 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; }
        | notype_declarator maybe_raises maybeasm maybe_attribute
                { tree d;
@@ -1967,7 +2010,7 @@ nomods_initdcl0:
                  $$ = suspend_momentary ();
                  d = start_decl ($1, current_declspecs, 0, $2);
                  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
@@ -2569,6 +2612,7 @@ component_decl_1:
                                         empty_parms (), $3);
                  $$ = grokfield ($$, TREE_CHAIN ($1), NULL_TREE, NULL_TREE,
                                  NULL_TREE); }
+       | using_decl
        ;
 
 /* The case of exactly one component is handled directly by component_decl. */
@@ -2887,6 +2931,8 @@ nested_name_specifier:
 nested_name_specifier_1:
          TYPENAME SCOPE
                { got_scope = TREE_TYPE ($$); }
+       | NSNAME SCOPE
+               { got_scope = TREE_TYPE ($$); }
        | template_type SCOPE
                { got_scope = TREE_TYPE ($$); }
 /*     These break 'const i;'
@@ -3681,13 +3727,13 @@ try_for_typename:
 bad_parm:
          /* empty */ %prec EMPTY
                {
-                 warning ("type specifier omitted for parameter");
-                 $$ = build_tree_list (TREE_PURPOSE (TREE_VALUE ($<ttype>-1)), NULL_TREE);
+                 error ("type specifier omitted for parameter");
+                 $$ = build_tree_list (integer_type_node, NULL_TREE);
                }
        | notype_declarator
                {
-                 warning ("type specifier omitted for parameter");
-                 $$ = build_tree_list (TREE_PURPOSE (TREE_VALUE ($<ttype>-1)), $$);
+                 error ("type specifier omitted for parameter");
+                 $$ = build_tree_list (integer_type_node, $$);
                }
        ;
 
@@ -3696,11 +3742,13 @@ maybe_raises:
                { $$ = NULL_TREE; }
        | THROW '(' ansi_raise_identifiers  ')' %prec EMPTY
                { $$ = $3; }
+       | THROW LEFT_RIGHT %prec EMPTY
+               { $$ = build_decl_list (NULL_TREE, NULL_TREE); }
        ;
 
 ansi_raise_identifier:
          type_id
-               { $$ = build_decl_list (NULL_TREE, $$); }
+               { $$ = build_decl_list (NULL_TREE, groktypename($$)); }
        ;
 
 ansi_raise_identifiers:
index 655535a..eab4e10 100644 (file)
@@ -2303,8 +2303,9 @@ do_pending_expansions ()
       else if (! flag_implicit_templates)
        DECIDE (0);
 
-      /* OK, it was an implicit instantiation.  */
-      TREE_PUBLIC (t) = 0;
+      if (i->interface == 1)
+       /* OK, it was an implicit instantiation.  */
+       TREE_PUBLIC (t) = 0;
 
       /* If it's a method, let the class type decide it.
         @@ What if the method template is in a separate file?
index 13b88f6..82583c7 100644 (file)
@@ -1503,24 +1503,13 @@ build_exception_variant (ctype, type, raises)
          || TYPE_VOLATILE (v) != volatilep)
        continue;
 
-      t = raises;
-      t2 = TYPE_RAISES_EXCEPTIONS (v);
-      while (t && t2)
-       {
-         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.
+      /* @@ This should do set equality, not exact match. */
+      if (simple_cst_list_equal (TYPE_RAISES_EXCEPTIONS (v), raises))
+       /* List of exceptions raised matches previously found list.
 
-         @@ Nice to free up storage used in consing up the
-        @@ list of exceptions raised.  */
-      return v;
+          @@ Nice to free up storage used in consing up the
+          @@ list of exceptions raised.  */
+       return v;
     }
 
   /* Need to build a new variant.  */
index f7289e1..90ea075 100644 (file)
@@ -2162,7 +2162,7 @@ build_x_function_call (function, params, decl)
          decl = convert_pointer_to (TREE_TYPE (ctypeptr), decl);
        }
       else
-       decl = build_c_cast (ctypeptr, decl);
+       decl = build_c_cast (ctypeptr, decl, 0);
       params = tree_cons (NULL_TREE, decl, params);
     }
 
@@ -2370,8 +2370,6 @@ build_function_call_real (function, params, require_complete, flags)
             function, coerced_params, NULL_TREE);
 
     TREE_SIDE_EFFECTS (result) = 1;
-    /* Remove this sometime. */
-    TREE_RAISES (result) |= !! TYPE_RAISES_EXCEPTIONS (fntype);
     if (! require_complete)
       return result;
     if (value_type == void_type_node)
@@ -2427,7 +2425,6 @@ convert_arguments (return_loc, typelist, values, fndecl, flags)
   register tree typetail, valtail;
   register tree result = NULL_TREE;
   char *called_thing;
-  int maybe_raises = 0;
   int i = 0;
 
   if (! flag_elide_constructors)
@@ -2541,8 +2538,6 @@ convert_arguments (return_loc, typelist, values, fndecl, flags)
       if (val == error_mark_node)
        continue;
 
-      maybe_raises |= TREE_RAISES (val);
-
       if (type != 0)
        {
          /* Formal parm type is specified by a function prototype.  */
@@ -2648,7 +2643,6 @@ convert_arguments (return_loc, typelist, values, fndecl, flags)
                    parmval = default_conversion (parmval);
 #endif
                }
-             maybe_raises |= TREE_RAISES (parmval);
 
              if (flag_gc
                  && type_needs_gc_entry (TREE_TYPE (parmval))
@@ -2676,8 +2670,6 @@ convert_arguments (return_loc, typelist, values, fndecl, flags)
          return error_mark_list;
        }
     }
-  if (result)
-    TREE_RAISES (result) = maybe_raises;
 
   return nreverse (result);
 }
@@ -2733,14 +2725,13 @@ build_binary_op (code, arg1, arg2, convert_p)
       type1 = TREE_TYPE (args[0]);
       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.  */
          if (! build_default_binary_type_conversion(code, &args[0], &args[1]))
            return error_mark_node;
        }
-      else if ((IS_AGGR_TYPE (type1) && ! TYPE_PTRMEMFUNC_P (type1))
-              || (IS_AGGR_TYPE (type2) && ! TYPE_PTRMEMFUNC_P (type2)))
+      else if (IS_AGGR_TYPE (type1) || IS_AGGR_TYPE (type2))
        {
          int convert_index = IS_AGGR_TYPE (type2);
          /* Avoid being tripped up by things like (ARG1 != 0).  */
@@ -3735,7 +3726,7 @@ build_component_addr (arg, argtype, msg)
     }
   else
     /* This conversion is harmless.  */
-    rval = convert_force (argtype, rval);
+    rval = convert_force (argtype, rval, 0);
 
   if (! integer_zerop (DECL_FIELD_BITPOS (field)))
     {
@@ -4871,27 +4862,31 @@ build_compound_expr (list)
 tree build_static_cast (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 type, expr;
 {
-  return build_c_cast (type, expr);
+  return build_c_cast (type, expr, 0);
 }
 
 tree build_const_cast (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
-build_c_cast (type, expr)
+build_c_cast (type, expr, allow_nonconverting)
      register tree type;
      tree expr;
+     int allow_nonconverting;
 {
   register tree value = expr;
 
@@ -5014,7 +5009,7 @@ build_c_cast (type, expr)
        value = decl_constant_value (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.  */
       if (TREE_CODE (value) == INTEGER_CST)
@@ -5848,7 +5843,7 @@ build_modify_expr (lhs, modifycode, rhs)
        {
          newrhs = convert_for_assignment (olhstype, newrhs, "assignment",
                                           NULL_TREE, 0);
-         newrhs = convert_force (lhstype, newrhs);
+         newrhs = convert_force (lhstype, newrhs, 0);
        }
       else
        newrhs = convert_for_assignment (lhstype, newrhs, "assignment",
@@ -6121,7 +6116,7 @@ build_ptrmemfunc (type, pfn, force)
   /* Handle null pointer to member function conversions. */
   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 (NULL_TREE, integer_zero_node,
                                               tree_cons (NULL_TREE, integer_zero_node,
@@ -6299,11 +6294,11 @@ convert_for_assignment (type, rhs, errtype, fndecl, parmnum)
     }
   /* Conversions involving enums.  */
   else if ((codel == ENUMERAL_TYPE
-           && (coder == ENUMERAL_TYPE || coder == INTEGER_TYPE || coder == REAL_TYPE))
+           && (INTEGRAL_CODE_P (coder) || coder == REAL_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 */
   else if (codel == POINTER_TYPE
@@ -7065,7 +7060,7 @@ c_expand_return (retval)
       if (TREE_CODE (retval) == WITH_CLEANUP_EXPR
          && TREE_CODE (TREE_OPERAND (retval, 0)) == TARGET_EXPR)
        retval = TREE_OPERAND (retval, 0);
-      expand_aggr_init (result, retval, 0);
+      expand_aggr_init (result, retval, 0, LOOKUP_ONLYCONVERTING);
       expand_cleanups_to (NULL_TREE);
       DECL_INITIAL (result) = NULL_TREE;
       retval = 0;
index 417eda0..e5e9c8e 100644 (file)
@@ -329,7 +329,7 @@ ack (s, v, v2)
    silly.  So instead, we just do the equivalent of a call to fatal in the
    same situation (call exit).  */
 
-/* First used: 0 (reserved), Last used: 361.  Free: */
+/* First used: 0 (reserved), Last used: 363.  Free: */
 
 static int abortcount = 0;
 
@@ -1430,7 +1430,7 @@ build_functional_cast (exp, parms)
          pedwarn ("initializer list being treated as compound expression");
          parms = build_compound_expr (parms);
        }
-      return build_c_cast (type, parms);
+      return build_c_cast (type, parms, 1);
     }
 
   if (TYPE_SIZE (type) == NULL_TREE)
@@ -1440,7 +1440,7 @@ build_functional_cast (exp, parms)
     }
 
   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,
                                    NULL_TREE, LOOKUP_NORMAL);