OSDN Git Service

* cp-tre.h (finish_function): Change prototype.
[pf3gnuchains/gcc-fork.git] / gcc / cp / cp-tree.h
index d362b41..b556236 100644 (file)
@@ -1,6 +1,7 @@
 /* Definitions for C++ parsing and type checking.
-   Copyright (C) 1987, 92-97, 1998, 1999 Free Software Foundation, Inc.
-   Hacked by Michael Tiemann (tiemann@cygnus.com)
+   Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+   Free Software Foundation, Inc.
+   Contributed by Michael Tiemann (tiemann@cygnus.com)
 
 This file is part of GNU CC.
 
@@ -21,6 +22,7 @@ Boston, MA 02111-1307, USA.  */
 
 #include "c-common.h"
 #include "function.h"
+#include "splay-tree.h"
 #include "varray.h"
 
 #ifndef _CP_TREE_H
@@ -40,21 +42,20 @@ Boston, MA 02111-1307, USA.  */
       CLEANUP_P (in TRY_BLOCK)
       AGGR_INIT_VIA_CTOR_P (in AGGR_INIT_EXPR)
       SCOPE_BEGIN_P (in SCOPE_STMT)
+      CTOR_BEGIN_P (in CTOR_STMT)
    1: IDENTIFIER_VIRTUAL_P.
       TI_PENDING_TEMPLATE_FLAG.
       TEMPLATE_PARMS_FOR_INLINE.
       DELETE_EXPR_USE_VEC (in DELETE_EXPR).
       (TREE_CALLS_NEW) (in _EXPR or _REF) (commented-out).
-      TYPE_USES_COMPLEX_INHERITANCE (in _TYPE).
+      TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P (in _TYPE).
       C_DECLARED_LABEL_FLAG (in LABEL_DECL)
       INHERITED_VALUE_BINDING_P (in CPLUS_BINDING)
       BASELINK_P (in TREE_LIST)
       ICS_ELLIPSIS_FLAG (in _CONV)
       STMT_IS_FULL_EXPR_P (in _STMT)
    2: IDENTIFIER_OPNAME_P.
-      BINFO_VBASE_MARKED.
-      BINFO_FIELDS_MARKED.
-      TYPE_VIRTUAL_P.
+      TYPE_POLYMORHPIC_P (in _TYPE)
       ICS_THIS_FLAG (in _CONV)
       STMT_LINENO_FOR_FN_P (in _STMT)
       BINDING_HAS_LEVEL_P (in CPLUS_BINDING)
@@ -64,27 +65,28 @@ Boston, MA 02111-1307, USA.  */
       (TREE_REFERENCE_EXPR) (in NON_LVALUE_EXPR) (commented-out).
       ICS_BAD_FLAG (in _CONV)
       FN_TRY_BLOCK_P (in TRY_BLOCK)
-      SCOPE_NULLIFIED_P (in SCOPE_STMT)
+      SCOPE_NO_CLEANUPS_P (in SCOPE_STMT)
    4: BINFO_NEW_VTABLE_MARKED.
       TREE_HAS_CONSTRUCTOR (in INDIRECT_REF, SAVE_EXPR, CONSTRUCTOR,
           or FIELD_DECL).
       NEED_TEMPORARY_P (in REF_BIND, BASE_CONV)
       SCOPE_PARTIAL_P (in SCOPE_STMT)
-   5: Not used.
-   6: Not used.
+   5: BINFO_PRIMARY_MARKED_P (in BINFO)
+   6: BINFO_VBASE_PRIMARY_P (in BINFO)
 
    Usage of TYPE_LANG_FLAG_?:
    0: C_TYPE_FIELDS_READONLY (in RECORD_TYPE or UNION_TYPE).
    1: TYPE_HAS_CONSTRUCTOR.
    2: TYPE_HAS_DESTRUCTOR.
    3: TYPE_FOR_JAVA.
-   4: TYPE_NEEDS_DESTRUCTOR.
+   4: TYPE_HAS_NONTRIVIAL_DESTRUCTOR
    5: IS_AGGR_TYPE.
    6: TYPE_BUILT_IN.
 
    Usage of DECL_LANG_FLAG_?:
    0: DECL_ERROR_REPORTED (in VAR_DECL).
       DECL_TEMPLATE_PARM_P (in CONST_DECL, TYPE_DECL, or TEMPLATE_DECL)
+      DECL_LOCAL_FUNCTION_P (in FUNCTION_DECL)
    1: C_TYPEDEF_EXPLICITLY_SIGNED (in TYPE_DECL).
       DECL_TEMPLATE_INSTANTIATED (in a VAR_DECL or a FUNCTION_DECL)
    2: DECL_THIS_EXTERN (in VAR_DECL or FUNCTION_DECL).
@@ -108,23 +110,48 @@ Boston, MA 02111-1307, USA.  */
      For a TEMPLATE_TEMPLATE_PARM, this is
      TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO.
 
-   DECL_SAVED_INSNS/DECL_FIELD_SIZE
-     For a static VAR_DECL, this is DECL_INIT_PRIORITY.
-
-   BINFO_VIRTUALS
-     For a binfo, this is a TREE_LIST.  The TREE_PURPOSE of each node
+  BINFO_VIRTUALS
+     For a binfo, this is a TREE_LIST.  The BV_DELTA of each node
      gives the amount by which to adjust the `this' pointer when
-     calling the function.  The TREE_VALUE is the declaration for the 
-     virtual function itself.  When CLASSTYPE_COM_INTERFACE_P does not
-     hold, the first entry does not have a TREE_VALUE; it is just an
-     offset.
+     calling the function.  If the method is an overriden version of a
+     base class method, then it is assumed that, prior to adjustment,
+     the this pointer points to an object of the base class.
+
+     The BV_VCALL_INDEX of each node, if non-NULL, gives the vtable
+     index of the vcall offset for this entry.
+
+     The BV_FN is the declaration for the virtual function itself.
+     When CLASSTYPE_COM_INTERFACE_P does not hold, the first entry
+     does not have a BV_FN; it is just an offset.
+
+     The BV_OVERRIDING_BASE is the binfo for the final overrider for
+     this function.  (This binfo's BINFO_TYPE will always be the same
+     as the DECL_CLASS_CONTEXT for the function.)
+
+   BINFO_VTABLE
+     Sometimes this is a VAR_DECL.  Under the new ABI, it is instead
+     an expression with POINTER_TYPE pointing that gives the value
+     to which the vptr should be initialized.  Use get_vtbl_decl_for_binfo
+     to extract the VAR_DECL for the complete vtable; that macro works
+     in both ABIs.
 
    DECL_ARGUMENTS
-     For a VAR_DECL this is DECL_ANON_UNION_ELEMS.  */
+     For a VAR_DECL this is DECL_ANON_UNION_ELEMS.  
+
+   DECL_VINDEX
+     This field is NULL for a non-virtual function.  For a virtual
+     function, it is eventually set to an INTEGER_CST indicating the
+     index in the vtable at which this function can be found.  When
+     a virtual function is declared, but before it is known what
+     function is overriden, this field is the error_mark_node.
+
+     Temporarily, it may be set to a TREE_LIST whose TREE_VALUE is 
+     the virtual function this one overrides, and whose TREE_CHAIN is
+     the old DECL_VINDEX.  */
 
 /* Language-specific tree checkers. */
 
-#if defined ENABLE_CHECKING && HAVE_GCC_VERSION(2,7)
+#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
 
 #define VAR_OR_FUNCTION_DECL_CHECK(NODE)                       \
 ({  const tree __t = NODE;                                     \
@@ -134,6 +161,16 @@ Boston, MA 02111-1307, USA.  */
                         __LINE__, __PRETTY_FUNCTION__);        \
     __t; })
 
+#define VAR_FUNCTION_OR_PARM_DECL_CHECK(NODE)                  \
+({  const tree __t = NODE;                                     \
+    enum tree_code __c = TREE_CODE(__t);                       \
+    if (__c != VAR_DECL                                        \
+       && __c != FUNCTION_DECL                                 \
+        && __c != PARM_DECL)                                   \
+      tree_check_failed (__t, VAR_DECL, __FILE__,              \
+                        __LINE__, __PRETTY_FUNCTION__);        \
+    __t; })
+
 #define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE)            \
 ({  const tree __t = NODE;                                     \
     enum tree_code __c = TREE_CODE(__t);                       \
@@ -153,14 +190,74 @@ Boston, MA 02111-1307, USA.  */
                         __LINE__, __PRETTY_FUNCTION__);        \
     __t; })
 
-#else /* not ENABLE_CHECKING, or not gcc */
+#else /* not ENABLE_TREE_CHECKING, or not gcc */
 
 #define VAR_OR_FUNCTION_DECL_CHECK(NODE)       NODE
+#define VAR_FUNCTION_OR_PARM_DECL_CHECK(NODE)   NODE
 #define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE)    NODE
 #define RECORD_OR_UNION_TYPE_CHECK(NODE)       NODE
 
 #endif
+\f
+/* ABI control.  */
+
+/* Nonzero to enable experimental ABI changes.  */
+
+extern int flag_new_abi;
+
+/* Nonzero to use __cxa_atexit, rather than atexit, to register
+   destructors for local statics and global objects.  */
+
+extern int flag_use_cxa_atexit;
+
+/* Nonzero to not ignore namespace std. */
+
+extern int flag_honor_std;
+
+/* Nonzero means generate 'rtti' that give run-time type information.  */
 
+extern int flag_rtti;
+
+/* Nonzero if virtual base class offsets are stored in the virtual
+   function table.  Zero if, instead, a pointer to the virtual base is
+   stored in the object itself.  */
+#define vbase_offsets_in_vtable_p() (flag_new_abi)
+
+/* Nonzero if displacements to the `this' pointer to use when calling
+   virtual functions in a virtual base class are present in the
+   vtable.  */
+#define vcall_offsets_in_vtable_p() (flag_new_abi)
+
+/* Nonzero if a derived class that needs a vptr should always get one,
+   even if a non-primary base class already has one.  For example,
+   given:
+
+     struct S { int i; virtual void f(); };
+     struct T : virtual public S {};
+
+   one could either reuse the vptr in `S' for `T', or create a new
+   vptr for `T'.  If this flag is nonzero we choose the latter
+   alternative; otherwise, we choose the former.  */
+#define vptrs_present_everywhere_p() (flag_new_abi)
+
+/* Nonzero if the vtable for a derived class should contain the
+   virtual functions from the primary base and all virtual functions
+   present in the class itself.  Zero if, instead, it should contain
+   only those virtual functions from the primary base together with
+   the functions declared in the derived class (but not in any base
+   class).  */
+#define all_overridden_vfuns_in_vtables_p() (flag_new_abi)
+
+/* Nonzero if we use access type_info objects directly, and use the
+   cross-vendor layout for them. Zero if we use an accessor function
+   to get the type_info object address.  */
+#define new_abi_rtti_p() (flag_new_abi)
+
+/* Nonzero if primary and secondary vtables are combined into a single
+   vtable.  */
+#define merge_primary_and_secondary_vtables_p() (flag_new_abi)
+
+\f
 /* Language-dependent contents of an identifier.  */
 
 struct lang_identifier
@@ -186,6 +283,7 @@ typedef struct
 {
   tree t;
   int new_type_flag;
+  tree lookups;
 } flagged_type_tree;
 
 typedef struct 
@@ -298,10 +396,6 @@ struct tree_srcloc
   int linenum;
 };
 
-/* To identify to the debug emitters if it should pay attention to the
-   flag `-Wtemplate-debugging'.  */
-#define HAVE_TEMPLATES 1
-
 /* Macros for access to language-specific slots in an identifier.  */
 
 #define IDENTIFIER_NAMESPACE_BINDINGS(NODE)    \
@@ -388,7 +482,7 @@ struct tree_srcloc
               OPERATOR_TYPENAME_FORMAT,                        \
              strlen (OPERATOR_TYPENAME_FORMAT)))
 
-/* Nonzero means reject anything that ANSI standard C forbids.  */
+/* Nonzero means reject anything that ISO standard C++ forbids.  */
 extern int pedantic;
 
 /* In a RECORD_TYPE or UNION_TYPE, nonzero if any component is read-only.  */
@@ -421,20 +515,21 @@ enum cp_tree_index
     CPTI_WCHAR_DECL,
     CPTI_VTABLE_ENTRY_TYPE,
     CPTI_DELTA_TYPE,
+    CPTI_VTABLE_INDEX_TYPE,
     CPTI_CLEANUP_TYPE,
 
-    CPTI_TP_DESC_TYPE,
-    CPTI_ACCESS_MODE_TYPE,
+    CPTI_TI_DESC_TYPE,
     CPTI_BLTN_DESC_TYPE,
-    CPTI_USER_DESC_TYPE,
-    CPTI_CLASS_DESC_TYPE,
     CPTI_PTR_DESC_TYPE,
-    CPTI_ATTR_DESC_TYPE,
+    CPTI_ARY_DESC_TYPE,
     CPTI_FUNC_DESC_TYPE,
-    CPTI_PTMF_DESC_TYPE,
+    CPTI_ENUM_DESC_TYPE,
+    CPTI_CLASS_DESC_TYPE,
+    CPTI_SI_CLASS_DESC_TYPE,
+    CPTI_VMI_CLASS_DESC_TYPE,
     CPTI_PTMD_DESC_TYPE,
+    CPTI_BASE_DESC_TYPE,
     
-    CPTI_CLASS_STAR_TYPE,
     CPTI_CLASS_TYPE,
     CPTI_RECORD_TYPE,
     CPTI_UNION_TYPE,
@@ -443,9 +538,11 @@ enum cp_tree_index
     CPTI_VTBL_TYPE,
     CPTI_VTBL_PTR_TYPE,
     CPTI_STD,
+    CPTI_ABI,
     CPTI_TYPE_INFO_TYPE,
-    CPTI_TINFO_FN_ID,
-    CPTI_TINFO_FN_TYPE,
+    CPTI_TINFO_DECL_ID,
+    CPTI_TINFO_DECL_TYPE,
+    CPTI_TINFO_VAR_ID,
     CPTI_ABORT_FNDECL,
     CPTI_GLOBAL_DELETE_FNDECL,
 
@@ -459,9 +556,13 @@ enum cp_tree_index
     CPTI_ACCESS_PRIVATE_VIRTUAL,
 
     CPTI_CTOR_IDENTIFIER,
+    CPTI_COMPLETE_CTOR_IDENTIFIER,
+    CPTI_BASE_CTOR_IDENTIFIER,
+    CPTI_DTOR_IDENTIFIER,
+    CPTI_BASE_DTOR_IDENTIFIER,
+    CPTI_DELETING_DTOR_IDENTIFIER,
     CPTI_DELTA2_IDENTIFIER,
     CPTI_DELTA_IDENTIFIER,
-    CPTI_DTOR_IDENTIFIER,
     CPTI_IN_CHARGE_IDENTIFIER,
     CPTI_INDEX_IDENTIFIER,
     CPTI_NELTS_IDENTIFIER,
@@ -480,6 +581,8 @@ enum cp_tree_index
     CPTI_MINUS_ONE,
     CPTI_TERMINATE,
     CPTI_ATEXIT,
+    CPTI_DSO_HANDLE,
+    CPTI_DCAST,
 
     CPTI_MAX
 };
@@ -498,18 +601,25 @@ extern tree cp_global_trees[CPTI_MAX];
 #define void_zero_node                 cp_global_trees[CPTI_VOID_ZERO]
 #define wchar_decl_node                        cp_global_trees[CPTI_WCHAR_DECL]
 #define vtable_entry_type              cp_global_trees[CPTI_VTABLE_ENTRY_TYPE]
+/* The type used to represent an offset by which to adjust the `this'
+   pointer in pointer-to-member types and, when not using vtable
+   thunks, in vtables.  */
 #define delta_type_node                        cp_global_trees[CPTI_DELTA_TYPE]
-#define __tp_desc_type_node            cp_global_trees[CPTI_TP_DESC_TYPE]
-#define __access_mode_type_node                cp_global_trees[CPTI_ACCESS_MODE_TYPE]
-#define __bltn_desc_type_node          cp_global_trees[CPTI_BLTN_DESC_TYPE]
-#define __user_desc_type_node          cp_global_trees[CPTI_USER_DESC_TYPE]
-#define __class_desc_type_node         cp_global_trees[CPTI_CLASS_DESC_TYPE]
-#define __ptr_desc_type_node           cp_global_trees[CPTI_PTR_DESC_TYPE]
-#define __attr_desc_type_node          cp_global_trees[CPTI_ATTR_DESC_TYPE]
-#define __func_desc_type_node          cp_global_trees[CPTI_FUNC_DESC_TYPE]
-#define __ptmf_desc_type_node          cp_global_trees[CPTI_PTMF_DESC_TYPE]
-#define __ptmd_desc_type_node          cp_global_trees[CPTI_PTMD_DESC_TYPE]
-#define class_star_type_node           cp_global_trees[CPTI_CLASS_STAR_TYPE]
+/* The type used to represent an index into the vtable.  */
+#define vtable_index_type               cp_global_trees[CPTI_VTABLE_INDEX_TYPE]
+
+#define ti_desc_type_node              cp_global_trees[CPTI_TI_DESC_TYPE]
+#define bltn_desc_type_node            cp_global_trees[CPTI_BLTN_DESC_TYPE]
+#define ptr_desc_type_node             cp_global_trees[CPTI_PTR_DESC_TYPE]
+#define ary_desc_type_node             cp_global_trees[CPTI_ARY_DESC_TYPE]
+#define func_desc_type_node            cp_global_trees[CPTI_FUNC_DESC_TYPE]
+#define enum_desc_type_node            cp_global_trees[CPTI_ENUM_DESC_TYPE]
+#define class_desc_type_node           cp_global_trees[CPTI_CLASS_DESC_TYPE]
+#define si_class_desc_type_node                cp_global_trees[CPTI_SI_CLASS_DESC_TYPE]
+#define vmi_class_desc_type_node       cp_global_trees[CPTI_VMI_CLASS_DESC_TYPE]
+#define ptmd_desc_type_node            cp_global_trees[CPTI_PTMD_DESC_TYPE]
+#define base_desc_type_node            cp_global_trees[CPTI_BASE_DESC_TYPE]
+
 #define class_type_node                        cp_global_trees[CPTI_CLASS_TYPE]
 #define record_type_node               cp_global_trees[CPTI_RECORD_TYPE]
 #define union_type_node                        cp_global_trees[CPTI_UNION_TYPE]
@@ -518,9 +628,11 @@ extern tree cp_global_trees[CPTI_MAX];
 #define vtbl_type_node                 cp_global_trees[CPTI_VTBL_TYPE]
 #define vtbl_ptr_type_node             cp_global_trees[CPTI_VTBL_PTR_TYPE]
 #define std_node                       cp_global_trees[CPTI_STD]
+#define abi_node                        cp_global_trees[CPTI_ABI]
 #define type_info_type_node            cp_global_trees[CPTI_TYPE_INFO_TYPE]
-#define tinfo_fn_id                    cp_global_trees[CPTI_TINFO_FN_ID]
-#define tinfo_fn_type                  cp_global_trees[CPTI_TINFO_FN_TYPE]
+#define tinfo_decl_id                  cp_global_trees[CPTI_TINFO_DECL_ID]
+#define tinfo_decl_type                        cp_global_trees[CPTI_TINFO_DECL_TYPE]
+#define tinfo_var_id                    cp_global_trees[CPTI_TINFO_VAR_ID]
 #define abort_fndecl                   cp_global_trees[CPTI_ABORT_FNDECL]
 #define global_delete_fndecl           cp_global_trees[CPTI_GLOBAL_DELETE_FNDECL]
 
@@ -540,10 +652,24 @@ extern tree cp_global_trees[CPTI_MAX];
 /* We cache these tree nodes so as to call get_identifier less
    frequently.  */
 
+/* The name of a constructor that takes an in-charge parameter to
+   decide whether or not to call virtual base classes.  */
 #define ctor_identifier                 cp_global_trees[CPTI_CTOR_IDENTIFIER]
+/* The name of a constructor that constructs virtual base classes.  */
+#define complete_ctor_identifier        cp_global_trees[CPTI_COMPLETE_CTOR_IDENTIFIER]
+/* The name of a constructor that does not construct virtual base classes.  */
+#define base_ctor_identifier            cp_global_trees[CPTI_BASE_CTOR_IDENTIFIER]
+/* The name of a destructor that destroys virtual base classes.  */
+#define dtor_identifier                 cp_global_trees[CPTI_DTOR_IDENTIFIER]
+/* The name of a destructor that does not destroy virtual base
+   classes.  */
+#define base_dtor_identifier            cp_global_trees[CPTI_BASE_DTOR_IDENTIFIER]
+/* The name of a destructor that destroys virtual base classes, and
+   then deletes the entire object.  */
+#define deleting_dtor_identifier        cp_global_trees[CPTI_DELETING_DTOR_IDENTIFIER]
+
 #define delta2_identifier               cp_global_trees[CPTI_DELTA2_IDENTIFIER]
 #define delta_identifier                cp_global_trees[CPTI_DELTA_IDENTIFIER]
-#define dtor_identifier                 cp_global_trees[CPTI_DTOR_IDENTIFIER]
 #define in_charge_identifier            cp_global_trees[CPTI_IN_CHARGE_IDENTIFIER]
 #define index_identifier                cp_global_trees[CPTI_INDEX_IDENTIFIER]
 #define nelts_identifier                cp_global_trees[CPTI_NELTS_IDENTIFIER]
@@ -571,9 +697,15 @@ extern tree cp_global_trees[CPTI_MAX];
 /* The declaration for `std::terminate'.  */
 #define terminate_node                  cp_global_trees[CPTI_TERMINATE]
 
-/* The declaration for `std::atexit'.  */
+/* A pointer to `std::atexit'.  */
 #define atexit_node                     cp_global_trees[CPTI_ATEXIT]
 
+/* A pointer to `__dso_handle'.  */
+#define dso_handle_node                 cp_global_trees[CPTI_DSO_HANDLE]
+
+/* The declaration of the dynamic_cast runtime.  */
+#define dynamic_cast_node               cp_global_trees[CPTI_DCAST]
+
 /* The type of a destructor.  */
 #define cleanup_type                    cp_global_trees[CPTI_CLEANUP_TYPE]
 
@@ -600,6 +732,8 @@ struct saved_scope {
   tree x_previous_class_type;
   tree x_previous_class_values;
   tree x_saved_tree;
+  tree incomplete;
+  tree lookups;
 
   HOST_WIDE_INT x_processing_template_decl;
   int x_processing_specialization;
@@ -660,6 +794,14 @@ struct saved_scope {
 
 #define previous_class_values scope_chain->x_previous_class_values
 
+/* A list of the declarations with incomplete type at namespace scope.  */
+
+#define namespace_scope_incomplete scope_chain->incomplete
+
+/* A list of private types mentioned, for deferred access checking.  */
+
+#define type_lookups scope_chain->lookups
+
 extern struct saved_scope *scope_chain;
 
 /* Global state pertinent to the current function.  */
@@ -679,8 +821,6 @@ struct language_function
 
   tree *x_vcalls_possible_p;
 
-  struct rtx_def *x_last_dtor_insn;
-  struct rtx_def *x_last_parm_cleanup_insn;
   struct rtx_def *x_result_rtx;
 
   int returns_value;
@@ -702,7 +842,7 @@ struct language_function
 
 /* The current C++-specific per-function global variables.  */
 
-#define cp_function_chain (current_function->language)
+#define cp_function_chain (cfun->language)
 
 /* In a destructor, the point at which all derived class destroying
    has been done, just before any base class destroying will be done.  */
@@ -732,14 +872,14 @@ struct language_function
    expression for `*this'.  */
 
 #define current_class_ptr \
-  (current_function ? cp_function_chain->x_current_class_ptr : NULL_TREE)
+  (cfun ? cp_function_chain->x_current_class_ptr : NULL_TREE)
 #define current_class_ref \
-  (current_function ? cp_function_chain->x_current_class_ref : NULL_TREE)
+  (cfun ? cp_function_chain->x_current_class_ref : NULL_TREE)
 
 /* Information about the current statement tree.  */
 
 #define current_stmt_tree                      \
-  (current_function                            \
+  (cfun                                                \
    ? &cp_function_chain->x_stmt_tree           \
    : &scope_chain->x_stmt_tree)
 
@@ -790,8 +930,9 @@ struct language_function
 #define current_function_parms_stored \
   cp_function_chain->parms_stored
 
-/* Non-zero if we have already declared __FUNCTION__ (and related
-   variables) in the current function.  */
+/* One if we have already declared __FUNCTION__ (and related
+   variables) in the current function.  Two if we are in the process
+   of doing so.  */
 
 #define current_function_name_declared \
   cp_function_chain->name_declared
@@ -961,6 +1102,10 @@ extern int warn_extern_inline;
 
 extern int warn_old_style_cast;
 
+/* Non-zero means warn when the compiler will reorder code.  */
+
+extern int warn_reorder;
+
 /* Nonzero means to treat bitfields as unsigned unless they say `signed'.  */
 
 extern int flag_signed_bitfields;
@@ -981,8 +1126,9 @@ extern int interface_only, interface_unknown;
 
 extern int flag_elide_constructors;
 
-/* Nonzero means enable obscure ANSI features and disable GNU extensions
-   that might cause ANSI-compliant code to be miscompiled.  */
+/* Nonzero means enable obscure standard features and disable GNU
+   extensions that might cause standard-compliant code to be
+   miscompiled.  */
 
 extern int flag_ansi;
 
@@ -1026,6 +1172,12 @@ extern int flag_vtable_gc;
    The value of this flag is ignored if -pedantic is specified.  */
 extern int flag_permissive;
 
+/* Nonzero means to implement standard semantics for exception
+   specifications, calling unexpected if an exception is thrown that
+   doesn't match the specification.  Zero means to treat them as
+   assertions and optimize accordingly, but not check them.  */
+extern int flag_enforce_eh_specs;
+
 /* Nonzero if we want to obey access control semantics.  */
 
 extern int flag_access_control;
@@ -1034,7 +1186,7 @@ extern int flag_access_control;
    after the file has been completely parsed.  The argument will be
    the GLOBAL_NAMESPACE.  */
 
-extern void (*back_end_hook) PROTO((tree));
+extern void (*back_end_hook) PARAMS ((tree));
 
 \f
 /* C++ language-specific tree codes.  */
@@ -1175,11 +1327,14 @@ struct lang_type
   unsigned has_const_assign_ref : 1;
   unsigned anon_aggr : 1;
 
-  unsigned has_nonpublic_ctor : 2;
-  unsigned has_nonpublic_assign_ref : 2;
+  unsigned has_mutable : 1;
+  unsigned com_interface : 1;
+  unsigned non_pod_class : 1;
+  unsigned nearly_empty_p : 1;
   unsigned vtable_needs_writing : 1;
   unsigned has_assign_ref : 1;
-  unsigned gets_new : 2;
+  unsigned has_new : 1;
+  unsigned has_array_new : 1;
 
   unsigned gets_delete : 2;
   unsigned has_call_overloaded : 1;
@@ -1208,40 +1363,30 @@ struct lang_type
   unsigned has_abstract_assign_ref : 1;
   unsigned non_aggregate : 1;
   unsigned is_partial_instantiation : 1;
-  unsigned has_mutable : 1;
-
-  unsigned com_interface : 1;
-  unsigned non_pod_class : 1;
 
   /* When adding a flag here, consider whether or not it ought to
      apply to a template instance if it applies to the template.  If
      so, make sure to copy it in instantiate_class_template!  */
 
-  /* There are six bits left to fill out a 32-bit word.  Keep track of
-     this by updating the size of this bitfield whenever you add or
+  /* There are some bits left to fill out a 32-bit word.  Keep track
+     of this by updating the size of this bitfield whenever you add or
      remove a flag.  */
-  unsigned dummy : 6;
+  unsigned dummy : 9;
       
   int vsize;
   int vfield_parent;
 
-  union tree_node *vfields;
-  union tree_node *vbases;
-
-  union tree_node *tags;
-
-  union tree_node *search_slot;
-
-  union tree_node *size;
-
-  union tree_node *abstract_virtuals;
-  union tree_node *friend_classes;
-
-  union tree_node *rtti;
-
-  union tree_node *methods;
-
-  union tree_node *template_info;
+  tree vfields;
+  tree vbases;
+  tree tags;
+  tree search_slot;
+  tree size;
+  tree size_unit;
+  tree pure_virtuals;
+  tree friend_classes;
+  tree rtti;
+  tree methods;
+  tree template_info;
   tree befriending_classes;
 };
 
@@ -1258,9 +1403,7 @@ struct lang_type
 /* List of friends which were defined inline in this class definition.  */
 #define CLASSTYPE_INLINE_FRIENDS(NODE) (TYPE_NONCOPIED_PARTS (NODE))
 
-/* Nonzero for _CLASSTYPE means that operator new and delete are defined,
-   respectively.  */
-#define TYPE_GETS_NEW(NODE) (TYPE_LANG_SPECIFIC(NODE)->gets_new)
+/* Nonzero for _CLASSTYPE means that operator delete is defined.  */
 #define TYPE_GETS_DELETE(NODE) (TYPE_LANG_SPECIFIC(NODE)->gets_delete)
 #define TYPE_GETS_REG_DELETE(NODE) (TYPE_GETS_DELETE (NODE) & 1)
 
@@ -1268,9 +1411,15 @@ struct lang_type
    takes the optional size_t argument.  */
 #define TYPE_VEC_DELETE_TAKES_SIZE(NODE) \
   (TYPE_LANG_SPECIFIC(NODE)->vec_delete_takes_size)
-#define TYPE_VEC_NEW_USES_COOKIE(NODE) \
-  (TYPE_NEEDS_DESTRUCTOR (NODE) \
-   || (TYPE_LANG_SPECIFIC (NODE) && TYPE_VEC_DELETE_TAKES_SIZE (NODE)))
+
+/* Nonzero if `new NODE[x]' should cause the allocation of extra
+   storage to indicate how many array elements are in use.  The old
+   ABI had a bug in that we always allocate the extra storage if NODE
+   has a two-argument array operator delete.  */
+#define TYPE_VEC_NEW_USES_COOKIE(NODE)         \
+  (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (NODE)       \
+   || (TYPE_LANG_SPECIFIC (NODE)               \
+       && TYPE_VEC_DELETE_TAKES_SIZE (NODE)))
 
 /* Nonzero means that this _CLASSTYPE node defines ways of converting
    itself to other types.  */
@@ -1284,6 +1433,15 @@ struct lang_type
 #define TYPE_HAS_INIT_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_init_ref)
 #define TYPE_HAS_CONST_INIT_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_const_init_ref)
 
+/* Nonzero if this class defines an overloaded operator new.  (An
+   operator new [] doesn't count.)  */
+#define TYPE_HAS_NEW_OPERATOR(NODE) \
+  (TYPE_LANG_SPECIFIC (NODE)->has_new)
+
+/* Nonzero if this class defines an overloaded operator new[].  */
+#define TYPE_HAS_ARRAY_NEW_OPERATOR(NODE) \
+  (TYPE_LANG_SPECIFIC (NODE)->has_array_new)
+
 /* Nonzero means that this type is being defined.  I.e., the left brace
    starting the definition of this type has been seen.  */
 #define TYPE_BEING_DEFINED(NODE) (TYPE_LANG_SPECIFIC(NODE)->being_defined)
@@ -1332,21 +1490,21 @@ struct lang_type
 /* Mark bits for depth-first and breath-first searches.  */
 
 /* Get the value of the Nth mark bit.  */
-#define CLASSTYPE_MARKED_N(NODE, N)                                    \
+#define CLASSTYPE_MARKED_N(NODE, N)                            \
   (((CLASS_TYPE_P (NODE) ? TYPE_LANG_SPECIFIC (NODE)->marks    \
-     : TYPE_ALIAS_SET (NODE)) & (1 << N)) != 0)
+     : ((unsigned) TYPE_ALIAS_SET (NODE))) & (1 << N)) != 0)
 
 /* Set the Nth mark bit.  */
-#define SET_CLASSTYPE_MARKED_N(NODE, N)                                        \
-  (CLASS_TYPE_P (NODE)                                                 \
-   ? (TYPE_LANG_SPECIFIC (NODE)->marks |= (1 << (N)))  \
-   : (TYPE_ALIAS_SET (NODE) |= (1 << (N))))
+#define SET_CLASSTYPE_MARKED_N(NODE, N)                                \
+  (CLASS_TYPE_P (NODE)                                         \
+   ? (void) (TYPE_LANG_SPECIFIC (NODE)->marks |= (1 << (N)))   \
+   : (void) (TYPE_ALIAS_SET (NODE) |= (1 << (N))))
 
 /* Clear the Nth mark bit.  */
-#define CLEAR_CLASSTYPE_MARKED_N(NODE, N)                              \
-  (CLASS_TYPE_P (NODE)                                                 \
-   ? (TYPE_LANG_SPECIFIC (NODE)->marks &= ~(1 << (N))) \
-   : (TYPE_ALIAS_SET (NODE) &= ~(1 << (N))))
+#define CLEAR_CLASSTYPE_MARKED_N(NODE, N)                      \
+  (CLASS_TYPE_P (NODE)                                         \
+   ? (void) (TYPE_LANG_SPECIFIC (NODE)->marks &= ~(1 << (N)))  \
+   : (void) (TYPE_ALIAS_SET (NODE) &= ~(1 << (N))))
 
 /* Get the value of the mark bits.  */
 #define CLASSTYPE_MARKED(NODE) CLASSTYPE_MARKED_N(NODE, 0)
@@ -1376,39 +1534,90 @@ struct lang_type
    nested member class templates.  */
 #define CLASSTYPE_TAGS(NODE)           (TYPE_LANG_SPECIFIC(NODE)->tags)
 
-/* If this class has any bases, this is the number of the base class from
-   which our VFIELD is based, -1 otherwise.  If this class has no base
-   classes, this is not used.
-   In D : B1, B2, PARENT would be 0, if D's vtable came from B1,
-   1, if D's vtable came from B2.  */
+/* If this value is non-negative, it is the index (in the
+   TYPE_BINFO_BASETYPES) for the base-class whose vtable pointer we
+   are reusing.  For example, in D : B1, B2, PARENT would be 0, if D's
+   vtable came from B1, 1, if D's vtable came from B2.  */
 #define CLASSTYPE_VFIELD_PARENT(NODE)  (TYPE_LANG_SPECIFIC(NODE)->vfield_parent)
 
-/* The number of virtual functions defined for this
-   _CLASSTYPE node.  */
+/* Nonzero if NODE has a primary base class, i.e., a base class with
+   which it shares the virtual fucntion table pointer.  */
+#define CLASSTYPE_HAS_PRIMARY_BASE_P(NODE) \
+  (CLASSTYPE_VFIELD_PARENT (NODE) != -1)
+
+/* If non-NULL, this is the binfo for the primary base class, i.e.,
+   the base class which contains the virtual function table pointer
+   for this class.  */
+#define CLASSTYPE_PRIMARY_BINFO(NODE) \
+  (BINFO_PRIMARY_BINFO (TYPE_BINFO (NODE)))
+
+/* If non-NULL, this is the binfo for the primary base of BINFO.  Note
+   that in a complex hierarchy the resulting BINFO may not actually
+   *be* primary.  In particular if the resulting BINFO is a virtual
+   base, and it occurs elsewhere in the hierarchy, then this
+   occurrence may not actually be a primary base in the complete
+   object.  Check BINFO_PRIMARY_MARKED_P to be sure.  */
+#define BINFO_PRIMARY_BINFO(NODE)                                      \
+  (CLASSTYPE_HAS_PRIMARY_BASE_P (BINFO_TYPE (NODE))                    \
+   ? BINFO_BASETYPE (NODE,                                             \
+                    CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (NODE)))       \
+   : NULL_TREE)
+
+/* The number of virtual functions present in this class' virtual
+   function table.  */
 #define CLASSTYPE_VSIZE(NODE) (TYPE_LANG_SPECIFIC(NODE)->vsize)
-/* The virtual base classes that this type uses.  */
+
+/* A chain of BINFOs for the direct and indirect virtual base classes
+   that this type uses in a post-order depth-first left-to-right
+   order.  (In other words, these bases appear in the order that they
+   should be initialized.)
+
+   These BINFOs are distinct from those in the TYPE_BINFO hierarchy.
+   So, given:
+
+     struct A {};
+     struct B : public A {};
+     struct C : virtual public B {};
+     struct D : virtual public B {};
+     struct E : public C, public D {};
+
+   there will be two copies of `A' and `B' in the TYPE_BINFO hierarchy
+   for `E'.  On the CLASSTYPE_VBASECLASSES list, there will be just
+   one copy of `B' (distinct from the other two) with its own copy of `A'
+   (also distinct from the copies in the TYPE_BINFO hierarchy.)  */
 #define CLASSTYPE_VBASECLASSES(NODE) (TYPE_LANG_SPECIFIC(NODE)->vbases)
-/* The virtual function pointer fields that this type contains.  */
-#define CLASSTYPE_VFIELDS(NODE) (TYPE_LANG_SPECIFIC(NODE)->vfields)
 
-/* Number of baseclasses defined for this type.
-   0 means no base classes.  */
+/* The BINFO (if any) for the virtual baseclass T of the class C from
+   the CLASSTYPE_VBASECLASSES list.  */
+#define BINFO_FOR_VBASE(T, C) \
+  (binfo_member (T, CLASSTYPE_VBASECLASSES (C)))
+
+/* For a non-virtual BINFO, the BINFO itself; for a virtual BINFO, the
+   BINFO_FOR_VBASE.  C is the most derived class for the hierarchy
+   containing BINFO.  */
+#define CANONICAL_BINFO(BINFO, C)              \
+  (TREE_VIA_VIRTUAL (BINFO)                    \
+   ? BINFO_FOR_VBASE (BINFO_TYPE (BINFO), C)   \
+   : BINFO)
+
+/* Number of direct baseclasses of NODE.  */
 #define CLASSTYPE_N_BASECLASSES(NODE) \
-  (TYPE_BINFO_BASETYPES (NODE) ? TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES(NODE)) : 0)
+  (BINFO_N_BASETYPES (TYPE_BINFO (NODE)))
 
 /* Used for keeping search-specific information.  Any search routine
    which uses this must define what exactly this slot is used for.  */
 #define CLASSTYPE_SEARCH_SLOT(NODE) (TYPE_LANG_SPECIFIC(NODE)->search_slot)
 
-/* These are the size, mode and alignment of the type without its
-   virtual base classes, for when we use this type as a base itself.  */
+/* These are the size and alignment of the type without its virtual
+   base classes, for when we use this type as a base itself.  */
 #define CLASSTYPE_SIZE(NODE) (TYPE_LANG_SPECIFIC(NODE)->size)
+#define CLASSTYPE_SIZE_UNIT(NODE) (TYPE_LANG_SPECIFIC(NODE)->size_unit)
 #define CLASSTYPE_ALIGN(NODE) (TYPE_LANG_SPECIFIC(NODE)->align)
 
 /* A cons list of virtual functions which cannot be inherited by
    derived classes.  When deriving from this type, the derived
    class must provide its own definition for each of these functions.  */
-#define CLASSTYPE_ABSTRACT_VIRTUALS(NODE) (TYPE_LANG_SPECIFIC(NODE)->abstract_virtuals)
+#define CLASSTYPE_PURE_VIRTUALS(NODE) (TYPE_LANG_SPECIFIC(NODE)->pure_virtuals)
 
 /* Nonzero means that this aggr type has been `closed' by a semicolon.  */
 #define CLASSTYPE_GOT_SEMICOLON(NODE) (TYPE_LANG_SPECIFIC (NODE)->got_semicolon)
@@ -1426,14 +1635,6 @@ struct lang_type
 /* Nonzero means that this type has an X() constructor.  */
 #define TYPE_HAS_DEFAULT_CONSTRUCTOR(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_default_ctor)
 
-/* Nonzero means the type declared a ctor as private or protected.  We
-   use this to make sure we don't try to generate a copy ctor for a 
-   class that has a member of type NODE.  */
-#define TYPE_HAS_NONPUBLIC_CTOR(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_nonpublic_ctor)
-
-/* Ditto, for operator=.  */
-#define TYPE_HAS_NONPUBLIC_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_nonpublic_assign_ref)
-
 /* Nonzero means that this type contains a mutable member */
 #define CLASSTYPE_HAS_MUTABLE(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_mutable)
 #define TYPE_HAS_MUTABLE_P(NODE) (cp_has_mutable_p (NODE))
@@ -1441,6 +1642,11 @@ struct lang_type
 /*  Nonzero means that this class type is a non-POD class.  */
 #define CLASSTYPE_NON_POD_P(NODE) (TYPE_LANG_SPECIFIC (NODE)->non_pod_class)
 
+/* Nonzero if this class is "nearly empty", i.e., contains only a
+   virtual function table pointer.  */
+#define CLASSTYPE_NEARLY_EMPTY_P(NODE) \
+  (TYPE_LANG_SPECIFIC (NODE)->nearly_empty_p)
+
 /* Nonzero means that this type is meant for communication via COM.  */
 #define CLASSTYPE_COM_INTERFACE(NODE) \
   (TYPE_LANG_SPECIFIC(NODE)->com_interface)
@@ -1490,9 +1696,7 @@ struct lang_type
 
    We use TREE_VIA_PROTECTED and TREE_VIA_PUBLIC, but private
    inheritance is indicated by the absence of the other two flags, not
-   by TREE_VIA_PRIVATE, which is unused.
-
-   The TREE_CHAIN is for scratch space in search.c.  */
+   by TREE_VIA_PRIVATE, which is unused.  */
 
 /* Nonzero means marked by DFS or BFS search, including searches
    by `get_binfo' and `get_base_distance'.  */
@@ -1502,40 +1706,66 @@ struct lang_type
 #define SET_BINFO_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_0(NODE)=1))
 #define CLEAR_BINFO_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_0(NODE)=0))
 
-/* Nonzero means marked in search through virtual inheritance hierarchy.  */
-#define BINFO_VBASE_MARKED(NODE) CLASSTYPE_MARKED2 (BINFO_TYPE (NODE))
-/* Modifier macros */
-#define SET_BINFO_VBASE_MARKED(NODE) SET_CLASSTYPE_MARKED2 (BINFO_TYPE (NODE))
-#define CLEAR_BINFO_VBASE_MARKED(NODE) CLEAR_CLASSTYPE_MARKED2 (BINFO_TYPE (NODE))
-
-/* Nonzero means marked in search for members or member functions.  */
-#define BINFO_FIELDS_MARKED(NODE) \
-  (TREE_VIA_VIRTUAL(NODE)?CLASSTYPE_MARKED2 (BINFO_TYPE (NODE)):TREE_LANG_FLAG_2(NODE))
-#define SET_BINFO_FIELDS_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED2(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_2(NODE)=1))
-#define CLEAR_BINFO_FIELDS_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED2(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_2(NODE)=0))
-
 /* Nonzero means that this class is on a path leading to a new vtable.  */
 #define BINFO_VTABLE_PATH_MARKED(NODE) \
   (TREE_VIA_VIRTUAL(NODE)?CLASSTYPE_MARKED3(BINFO_TYPE(NODE)):TREE_LANG_FLAG_3(NODE))
 #define SET_BINFO_VTABLE_PATH_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED3(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_3(NODE)=1))
 #define CLEAR_BINFO_VTABLE_PATH_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED3(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_3(NODE)=0))
 
-/* Nonzero means that this class has a new vtable.  */
-#define BINFO_NEW_VTABLE_MARKED(NODE) \
-  (TREE_VIA_VIRTUAL(NODE)?CLASSTYPE_MARKED4(BINFO_TYPE(NODE)):TREE_LANG_FLAG_4(NODE))
-#define SET_BINFO_NEW_VTABLE_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?SET_CLASSTYPE_MARKED4(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_4(NODE)=1))
-#define CLEAR_BINFO_NEW_VTABLE_MARKED(NODE) (TREE_VIA_VIRTUAL(NODE)?CLEAR_CLASSTYPE_MARKED4(BINFO_TYPE(NODE)):(TREE_LANG_FLAG_4(NODE)=0))
+/* Nonzero means B (a BINFO) needs a new vtable.  B is part of the
+   hierarchy dominated by C.  */
+#define BINFO_NEW_VTABLE_MARKED(B, C) \
+  (TREE_LANG_FLAG_4 (CANONICAL_BINFO (B, C)))
+#define SET_BINFO_NEW_VTABLE_MARKED(B, C) \
+  (BINFO_NEW_VTABLE_MARKED (B, C) = 1)
+#define CLEAR_BINFO_NEW_VTABLE_MARKED(B, C) \
+  (BINFO_NEW_VTABLE_MARKED (B, C) = 0)
 
 /* Nonzero means this class has done dfs_pushdecls.  */
 #define BINFO_PUSHDECLS_MARKED(NODE) BINFO_VTABLE_PATH_MARKED (NODE)
 #define SET_BINFO_PUSHDECLS_MARKED(NODE) SET_BINFO_VTABLE_PATH_MARKED (NODE)
 #define CLEAR_BINFO_PUSHDECLS_MARKED(NODE) CLEAR_BINFO_VTABLE_PATH_MARKED (NODE)
 
+/* Nonzero if this BINFO is a primary base class.
+
+   In the TYPE_BINFO hierarchy, this flag is never set for a base
+   class of a non-primary virtual base because the copies of a
+   non-primary virtual base that appear in the TYPE_BINFO hierarchy do
+   not really exist.  Instead, it is the BINFOs in the
+   CLASSTYPE_VBASECLASSES list that are used.  In other words, this
+   flag is only valid for paths (given by BINFO_INHERITANCE_CHAIN)
+   that really exist in the final object.  
+
+   For example, consider:
+
+      struct A {};
+      struct B : public A { };
+      struct C : virtual public B { void f(); };
+
+   `A' is the primary base class for `B'.  But, `B' is not a primary
+   base class for `C'.  So, in the copy of `A' that appears in the
+   TYPE_BINFO hierarcy for `C' does not have BINFO_PRIMARY_MARKED_P
+   set; the copy in the CLASSTYPE_VBASECLASSES list does have this
+   set.  */
+#define BINFO_PRIMARY_MARKED_P(NODE) TREE_LANG_FLAG_5 (NODE)
+
+/* Nonzero if the virtual baseclass with the type given by this BINFO
+   is primary *somewhere* in the hierarchy.  This flag is only set on 
+   entries in the CLASSTYPE_VBASECLASSES list.  */
+#define BINFO_VBASE_PRIMARY_P(NODE) TREE_LANG_FLAG_6 (NODE)
+
 /* Used by various search routines.  */
 #define IDENTIFIER_MARKED(NODE) TREE_LANG_FLAG_0 (NODE)
 \f
 /* Accessor macros for the vfield slots in structures.  */
 
+/* The virtual function pointer fields that this type contains.  For a
+   vfield defined just for this class, or from a primary base, the
+   TREE_PURPOSE is NULL.  Otherwise, the TREE_PURPOSE is the BINFO for
+   the class containing the vfield.  The TREE_VALUE is the class where
+   the vfield was first defined.  */
+#define CLASSTYPE_VFIELDS(NODE) (TYPE_LANG_SPECIFIC(NODE)->vfields)
+
 /* Get the assoc info that caused this vfield to exist.  */
 #define VF_BINFO_VALUE(NODE) TREE_PURPOSE (NODE)
 
@@ -1545,8 +1775,19 @@ struct lang_type
 /* Get the value of the top-most type dominating the non-`normal' vfields.  */
 #define VF_DERIVED_VALUE(NODE) (VF_BINFO_VALUE (NODE) ? BINFO_TYPE (VF_BINFO_VALUE (NODE)) : NULL_TREE)
 
-/* Get the value of the top-most type that's `normal' for the vfield.  */
-#define VF_NORMAL_VALUE(NODE) TREE_TYPE (NODE)
+/* The number of bytes by which to adjust the `this' pointer when
+   calling this virtual function.  */
+#define BV_DELTA(NODE) (TREE_PURPOSE (NODE))
+
+/* If non-NULL, the vtable index at which to find the vcall offset
+   when calling this virtual function.  */
+#define BV_VCALL_INDEX(NODE) (TREE_TYPE (NODE))
+
+/* The function to call.  */
+#define BV_FN(NODE) (TREE_VALUE (NODE))
+
+/* The most derived class.  */
+
 \f
 /* Nonzero for TREE_LIST node means that this list of things
    is a list of parameters, as opposed to a list of expressions.  */
@@ -1592,11 +1833,11 @@ struct lang_decl_flags
   unsigned static_function : 1;
   unsigned const_memfunc : 1;
   unsigned volatile_memfunc : 1;
-  unsigned abstract_virtual : 1;
+  unsigned pure_virtual : 1;
   unsigned constructor_for_vbase_attr : 1;
 
   unsigned mutable_flag : 1;
-  unsigned saved_inline : 1;
+  unsigned deferred : 1;
   unsigned use_template : 2;
   unsigned nonconverting : 1;
   unsigned declared_inline : 1;
@@ -1608,7 +1849,8 @@ struct lang_decl_flags
   unsigned pending_inline_p : 1;
   unsigned global_ctor_p : 1;
   unsigned global_dtor_p : 1;
-  unsigned dummy : 3;
+  unsigned pretty_function_p : 1;
+  unsigned dummy : 2;
 
   tree context;
 
@@ -1635,7 +1877,6 @@ struct lang_decl
 {
   struct lang_decl_flags decl_flags;
 
-  tree main_decl_variant;
   tree befriending_classes;
 
   /* In a FUNCTION_DECL, this is DECL_SAVED_TREE.  */
@@ -1686,7 +1927,8 @@ struct lang_decl
    for an object with virtual baseclasses.  */
 #define DECL_CONSTRUCTOR_FOR_VBASE_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.constructor_for_vbase_attr)
 
-/* Non-zero for a FUNCTION_DECL that declares a type-info function.  */
+/* Non-zero for a FUNCTION_DECL that declares a type-info function.
+   This only happens in the old abi.  */
 #define DECL_TINFO_FN_P(NODE)                                  \
   (TREE_CODE (NODE) == FUNCTION_DECL                           \
    && DECL_ARTIFICIAL (NODE)                                   \
@@ -1696,6 +1938,10 @@ struct lang_decl
 #define SET_DECL_TINFO_FN_P(NODE) \
   (DECL_LANG_SPECIFIC((NODE))->decl_flags.mutable_flag = 1)
 
+/* Nonzero if NODE is an overloaded `operator delete[]' function.  */
+#define DECL_ARRAY_DELETE_OPERATOR_P(NODE) \
+  (DECL_NAME (NODE) == ansi_opname[(int) VEC_DELETE_EXPR])
+
 /* Nonzero for _DECL means that this decl appears in (or will appear
    in) as a member in a RECORD_TYPE or UNION_TYPE node.  It is also for
    detecting circularity in case members are multiply defined.  In the
@@ -1759,21 +2005,38 @@ struct lang_decl
    constructor.  */
 #define DECL_NONCONVERTING_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.nonconverting)
 
-/* Nonzero for FUNCTION_DECL means that this member function
-   exists as part of an abstract class's interface.  */
-#define DECL_ABSTRACT_VIRTUAL_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.abstract_virtual)
+/* Nonzero for FUNCTION_DECL means that this member function is a pure
+   virtual function.  */
+#define DECL_PURE_VIRTUAL_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.pure_virtual)
 
 /* Nonzero for FUNCTION_DECL means that this member function
    must be overridden by derived classes.  */
 #define DECL_NEEDS_FINAL_OVERRIDER_P(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.needs_final_overrider)
 
+/* Nonzero if this DECL is the __PRETTY_FUNCTION__ variable in a
+   template function.  */
+#define DECL_PRETTY_FUNCTION_P(NODE) \
+  (DECL_LANG_SPECIFIC(NODE)->decl_flags.pretty_function_p)
+
 /* The _TYPE context in which this _DECL appears.  This field holds the
-   class where a virtual function instance is actually defined, and the
-   lexical scope of a friend function defined in a class body. */
-#define DECL_CLASS_CONTEXT(NODE) (DECL_LANG_SPECIFIC(NODE)->decl_flags.context)
-#define DECL_REAL_CONTEXT(NODE) \
-  ((TREE_CODE (NODE) == FUNCTION_DECL && DECL_FUNCTION_MEMBER_P (NODE)) \
-   ? DECL_CLASS_CONTEXT (NODE) : CP_DECL_CONTEXT (NODE))
+   class where a virtual function instance is actually defined. */
+#define DECL_CLASS_CONTEXT(NODE) \
+  (DECL_CLASS_SCOPE_P (NODE) ? DECL_CONTEXT (NODE) : NULL_TREE)
+
+/* For a non-member friend function, the class (if any) in which this
+   friend was defined.  For example, given:
+   
+     struct S { friend void f (); };
+
+   the DECL_FRIEND_CONTEXT for `f' will be `S'.  */
+#define DECL_FRIEND_CONTEXT(NODE)                              \
+  ((DECL_FRIEND_P (NODE) && !DECL_FUNCTION_MEMBER_P (NODE))    \
+   ? DECL_LANG_SPECIFIC (NODE)->decl_flags.context              \
+   : NULL_TREE)
+
+/* Set the DECL_FRIEND_CONTEXT for NODE to CONTEXT.  */
+#define SET_DECL_FRIEND_CONTEXT(NODE, CONTEXT) \
+  (DECL_LANG_SPECIFIC (NODE)->decl_flags.context = (CONTEXT))
 
 /* NULL_TREE in DECL_CONTEXT represents the global namespace. */
 #define CP_DECL_CONTEXT(NODE) \
@@ -1782,7 +2045,8 @@ struct lang_decl
 
 /* For a virtual function, the base where we find its vtable entry.
    For a non-virtual function, the base where it is defined.  */
-#define DECL_VIRTUAL_CONTEXT(NODE) DECL_CONTEXT (NODE)
+#define DECL_VIRTUAL_CONTEXT(NODE) \
+  (DECL_LANG_SPECIFIC (NODE)->decl_flags.context)
 
 /* 1 iff NODE has namespace scope, including the global namespace.  */
 #define DECL_NAMESPACE_SCOPE_P(NODE)                           \
@@ -1791,8 +2055,7 @@ struct lang_decl
 
 /* 1 iff NODE is a class member.  */
 #define DECL_CLASS_SCOPE_P(NODE) \
-  (DECL_CONTEXT (NODE) \
-   && TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (NODE))) == 't')
+  (DECL_CONTEXT (NODE) && TYPE_P (DECL_CONTEXT (NODE)))
 
 /* 1 iff NODE is function-local.  */
 #define DECL_FUNCTION_SCOPE_P(NODE) \
@@ -1818,18 +2081,15 @@ struct lang_decl
 /* In a non-local VAR_DECL with static storage duration, this is the
    initialization priority.  If this value is zero, the NODE will be
    initialized at the DEFAULT_INIT_PRIORITY.  */
-#define DECL_INIT_PRIORITY(NODE) (DECL_FIELD_SIZE (VAR_DECL_CHECK (NODE)))
+#define DECL_INIT_PRIORITY(NODE) (VAR_DECL_CHECK (NODE)->decl.u2.i)
 
-/* In a TREE_LIST concatenating using directives, indicate indirekt
+/* In a TREE_LIST concatenating using directives, indicate indirect
    directives  */
 #define TREE_INDIRECT_USING(NODE) (TREE_LIST_CHECK (NODE)->common.lang_flag_0)
 
 /* In a VAR_DECL for a variable declared in a for statement,
    this is the shadowed (local) variable.  */
-#define DECL_SHADOWED_FOR_VAR(NODE) DECL_RESULT(VAR_DECL_CHECK (NODE))
-
-/* Points back to the decl which caused this lang_decl to be allocated.  */
-#define DECL_MAIN_VARIANT(NODE) (DECL_LANG_SPECIFIC(NODE)->main_decl_variant)
+#define DECL_SHADOWED_FOR_VAR(NODE) DECL_RESULT_FLD(VAR_DECL_CHECK (NODE))
 
 /* In a FUNCTION_DECL, this is nonzero if this function was defined in
    the class definition.  We have saved away the text of the function,
@@ -1847,9 +2107,9 @@ struct lang_decl
 #define DECL_SORTED_FIELDS(NODE) \
        (DECL_LANG_SPECIFIC (TYPE_DECL_CHECK (NODE))->u.sorted_fields)
 
-/* True if on the saved_inlines (see decl2.c) list.  */
-#define DECL_SAVED_INLINE(DECL) \
-  (DECL_LANG_SPECIFIC(DECL)->decl_flags.saved_inline)
+/* True if on the deferred_fns (see decl2.c) list.  */
+#define DECL_DEFERRED_FN(DECL) \
+  (DECL_LANG_SPECIFIC(DECL)->decl_flags.deferred)
 
 /* For a VAR_DECL, FUNCTION_DECL, TYPE_DECL or TEMPLATE_DECL:
    template-specific information.  */
@@ -1886,7 +2146,6 @@ struct lang_decl
 
 #define TI_TEMPLATE(NODE) (TREE_PURPOSE (NODE))
 #define TI_ARGS(NODE) (TREE_VALUE (NODE))
-#define TI_SPEC_INFO(NODE) (TREE_CHAIN (NODE))
 #define TI_PENDING_TEMPLATE_FLAG(NODE) TREE_LANG_FLAG_1 (NODE)
 
 /* We use TREE_VECs to hold template arguments.  If there is only one
@@ -1977,7 +2236,6 @@ struct lang_decl
 #define DECL_TI_ARGS(NODE)          TI_ARGS (DECL_TEMPLATE_INFO (NODE))
 #define CLASSTYPE_TI_TEMPLATE(NODE) TI_TEMPLATE (CLASSTYPE_TEMPLATE_INFO (NODE))
 #define CLASSTYPE_TI_ARGS(NODE)     TI_ARGS (CLASSTYPE_TEMPLATE_INFO (NODE))
-#define CLASSTYPE_TI_SPEC_INFO(NODE) TI_SPEC_INFO (CLASSTYPE_TEMPLATE_INFO (NODE))
 #define ENUM_TI_TEMPLATE(NODE)                         \
   TI_TEMPLATE (ENUM_TEMPLATE_INFO (NODE))
 #define ENUM_TI_ARGS(NODE)                     \
@@ -2052,40 +2310,22 @@ struct lang_decl
    using a twos-complement negated operand.  */
 #define TREE_NEGATED_INT(NODE) TREE_LANG_FLAG_0 (INTEGER_CST_CHECK (NODE))
 
-#if 0                          /* UNUSED */
-/* Nonzero in any kind of _EXPR or _REF node means that it is a call
-   to a storage allocation routine.  If, later, alternate storage
-   is found to hold the object, this call can be ignored.  */
-#define TREE_CALLS_NEW(NODE) (TREE_LANG_FLAG_1 (NODE))
-#endif
-
-/* Nonzero in any kind of _TYPE that uses multiple inheritance
-   or virtual baseclasses.  */
-#define TYPE_USES_COMPLEX_INHERITANCE(NODE) (TREE_LANG_FLAG_1 (NODE))
+/* Nonzero in any kind of _TYPE where conversions to base-classes may
+   involve pointer arithmetic.  If this is zero, then converting to
+   a base-class never requires changing the value of the pointer.  */
+#define TYPE_BASE_CONVS_MAY_REQUIRE_CODE_P(NODE) (TREE_LANG_FLAG_1 (NODE))
 
-#if 0                          /* UNUSED */
-/* Nonzero in IDENTIFIER_NODE means that this name is not the name the user
-   gave; it's a DECL_NESTED_TYPENAME.  Someone may want to set this on
-   mangled function names, too, but it isn't currently.  */
-#define TREE_MANGLED(NODE) (FOO)
-#endif
+/* [class.virtual]
 
-#if 0                          /* UNUSED */
-/* Nonzero in IDENTIFIER_NODE means that this name is overloaded, and
-   should be looked up in a non-standard way.  */
-#define DECL_OVERLOADED(NODE) (FOO)
-#endif
+   A class that declares or inherits a virtual function is called a
+   polymorphic class.  */
+#define TYPE_POLYMORPHIC_P(NODE) (TREE_LANG_FLAG_2 (NODE))
 
-/* Nonzero if this (non-TYPE)_DECL has its virtual attribute set.
-   For a FUNCTION_DECL, this is when the function is a virtual function.
-   For a VAR_DECL, this is when the variable is a virtual function table.
-   For a FIELD_DECL, when the field is the field for the virtual function table.
-   For an IDENTIFIER_NODE, nonzero if any function with this name
-   has been declared virtual.
-
-   For a _TYPE if it uses virtual functions (or is derived from
-   one that does).  */
-#define TYPE_VIRTUAL_P(NODE) (TREE_LANG_FLAG_2 (NODE))
+/* Nonzero if this class has a virtual function table pointer.  */
+#define TYPE_CONTAINS_VPTR_P(NODE)             \
+  (TYPE_POLYMORPHIC_P (NODE)                   \
+   || (vbase_offsets_in_vtable_p ()            \
+       && TYPE_USES_VIRTUAL_BASECLASSES (NODE)))
 
 extern int flag_new_for_scope;
 
@@ -2097,6 +2337,11 @@ extern int flag_new_for_scope;
    if we already emitted a warning about using it.  */
 #define DECL_ERROR_REPORTED(NODE) DECL_LANG_FLAG_0 (VAR_DECL_CHECK (NODE))
 
+/* Nonzero if NODE is a FUNCTION_DECL (for a function with global
+   scope) declared in a local scope.  */
+#define DECL_LOCAL_FUNCTION_P(NODE) \
+  DECL_LANG_FLAG_0 (FUNCTION_DECL_CHECK (NODE))
+
 /* This _DECL represents a compiler-generated entity.  */
 #define SET_DECL_ARTIFICIAL(NODE) (DECL_ARTIFICIAL (NODE) = 1)
 
@@ -2109,6 +2354,12 @@ extern int flag_new_for_scope;
    && DECL_LANG_SPECIFIC (NODE)->decl_flags.bitfield)
 #define SET_DECL_C_BIT_FIELD(NODE) \
   (DECL_LANG_SPECIFIC (FIELD_DECL_CHECK (NODE))->decl_flags.bitfield = 1)
+#define CLEAR_DECL_C_BIT_FIELD(NODE) \
+  (DECL_LANG_SPECIFIC (FIELD_DECL_CHECK (NODE))->decl_flags.bitfield = 0)
+
+/* In a FUNCTION_DECL, nonzero if the function cannot be inlined.  */
+#define DECL_UNINLINABLE(NODE) \
+  (DECL_LANG_SPECIFIC (NODE)->decl_flags.bitfield)
 
 #define INTEGRAL_CODE_P(CODE) \
   (CODE == INTEGER_TYPE || CODE == ENUMERAL_TYPE || CODE == BOOLEAN_TYPE)
@@ -2182,10 +2433,26 @@ extern int flag_new_for_scope;
 #define TYPE_HAS_ABSTRACT_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_abstract_assign_ref)
 #define TYPE_HAS_COMPLEX_INIT_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->has_complex_init_ref)
 
-/* Nonzero for _TYPE node means that destroying an object of this type
-   will involve a call to a destructor.  This can apply to objects
-   of ARRAY_TYPE is the type of the elements needs a destructor.  */
-#define TYPE_NEEDS_DESTRUCTOR(NODE) (TYPE_LANG_FLAG_4(NODE))
+/* Nonzero if TYPE has a trivial destructor.  From [class.dtor]:
+   
+     A destructor is trivial if it is an implicitly declared
+     destructor and if:
+
+       - all of the direct base classes of its class have trivial
+         destructors, 
+
+       - for all of the non-static data members of its class that are
+         of class type (or array thereof), each such class has a 
+        trivial destructor.  */
+#define TYPE_HAS_TRIVIAL_DESTRUCTOR(NODE) \
+  (!TYPE_HAS_NONTRIVIAL_DESTRUCTOR (NODE))
+
+/* Nonzero for _TYPE node means that this type does not have a trivial
+   destructor.  Therefore, destroying an object of this type will
+   involve a call to a destructor.  This can apply to objects of
+   ARRAY_TYPE is the type of the elements needs a destructor.  */
+#define TYPE_HAS_NONTRIVIAL_DESTRUCTOR(NODE) \
+  (TYPE_LANG_FLAG_4(NODE))
 
 /* Nonzero for class type means that initialization of this type can use
    a bitwise copy.  */
@@ -2272,12 +2539,27 @@ extern int flag_new_for_scope;
    function.
 
    (Of course, the exact values may differ depending on the mangling
-   scheme, sizes of types, and such.).  */
+   scheme, sizes of types, and such.).  
+
+   Under the new ABI, we do:
+
+     struct {
+       __P __pfn;
+       ptrdiff_t __delta;
+     };
+
+   (We don't need DELTA2, because the vtable is always the first thing
+   in the object.)  If the function is virtual, then PFN is one plus
+   twice the index into the vtable; otherwise, it is just a pointer to
+   the function.  */
      
 /* Get the POINTER_TYPE to the METHOD_TYPE associated with this
    pointer to member function.  TYPE_PTRMEMFUNC_P _must_ be true,
    before using this macro.  */
-#define TYPE_PTRMEMFUNC_FN_TYPE(NODE) (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (NODE)))))))
+#define TYPE_PTRMEMFUNC_FN_TYPE(NODE) \
+  (flag_new_abi                       \
+   ? (TREE_TYPE (TYPE_FIELDS (NODE))) \
+   : (TREE_TYPE (TYPE_FIELDS (TREE_TYPE (TREE_CHAIN (TREE_CHAIN (TYPE_FIELDS (NODE))))))))
 
 /* Returns `A' for a type like `int (A::*)(double)' */
 #define TYPE_PTRMEMFUNC_OBJECT_TYPE(NODE) \
@@ -2313,14 +2595,16 @@ extern int flag_new_for_scope;
 #define PTRMEM_CST_MEMBER(NODE) (((ptrmem_cst_t)PTRMEM_CST_CHECK (NODE))->member)
 
 /* Nonzero for VAR_DECL and FUNCTION_DECL node means that `extern' was
-   specified in its declaration.  */
+   specified in its declaration.  This can also be set for an
+   erroneously declared PARM_DECL.  */
 #define DECL_THIS_EXTERN(NODE) \
-  DECL_LANG_FLAG_2 (VAR_OR_FUNCTION_DECL_CHECK (NODE))
+  DECL_LANG_FLAG_2 (VAR_FUNCTION_OR_PARM_DECL_CHECK (NODE))
 
 /* Nonzero for VAR_DECL and FUNCTION_DECL node means that `static' was
-   specified in its declaration.  */
+   specified in its declaration.  This can also be set for an
+   erroneously declared PARM_DECL.  */
 #define DECL_THIS_STATIC(NODE) \
-  DECL_LANG_FLAG_6 (VAR_OR_FUNCTION_DECL_CHECK (NODE))
+  DECL_LANG_FLAG_6 (VAR_FUNCTION_OR_PARM_DECL_CHECK (NODE))
 
 /* Nonzero in FUNCTION_DECL means it is really an operator.
    Just used to communicate formatting information to dbxout.c.  */
@@ -2420,7 +2704,7 @@ extern int flag_new_for_scope;
 #define DECL_NTPARMS(NODE) \
    TREE_VEC_LENGTH (DECL_INNERMOST_TEMPLATE_PARMS (NODE))
 /* For function, method, class-data templates.  */
-#define DECL_TEMPLATE_RESULT(NODE)      DECL_RESULT(NODE)
+#define DECL_TEMPLATE_RESULT(NODE)      DECL_RESULT_FLD(NODE)
 /* For a static member variable template, the
    DECL_TEMPLATE_INSTANTIATIONS list contains the explicitly and
    implicitly generated instantiations of the variable.  There are no
@@ -2480,9 +2764,17 @@ extern int flag_new_for_scope;
 #define DECL_TEMPLATE_SPECIALIZATIONS(NODE)     DECL_SIZE(NODE)
 
 /* Nonzero for a DECL which is actually a template parameter.  */
-#define DECL_TEMPLATE_PARM_P(NODE) \
-  DECL_LANG_FLAG_0 (NODE)
+#define DECL_TEMPLATE_PARM_P(NODE)             \
+  (DECL_LANG_FLAG_0 (NODE)                     \
+   && (TREE_CODE (NODE) == CONST_DECL          \
+       || TREE_CODE (NODE) == TYPE_DECL                \
+       || TREE_CODE (NODE) == TEMPLATE_DECL))
+
+/* Mark NODE as a template parameter.  */
+#define SET_DECL_TEMPLATE_PARM_P(NODE) \
+  (DECL_LANG_FLAG_0 (NODE) = 1)
 
+/* Nonzero if NODE is a template template parameter.  */
 #define DECL_TEMPLATE_TEMPLATE_PARM_P(NODE) \
   (TREE_CODE (NODE) == TEMPLATE_DECL && DECL_TEMPLATE_PARM_P (NODE))
 
@@ -2505,7 +2797,7 @@ extern int flag_new_for_scope;
    to `struct S {}; typedef struct S S;' in C.  This macro will hold
    for the typedef indicated in this example.  Note that in C++, there
    is a second implicit typedef for each class, in the scope of `S'
-   itself, so that you can `S::S'.  This macro does *not* hold for
+   itself, so that you can say `S::S'.  This macro does *not* hold for
    those typedefs.  */
 #define DECL_IMPLICIT_TYPEDEF_P(NODE) \
   (TREE_CODE ((NODE)) == TYPE_DECL && DECL_LANG_FLAG_2 ((NODE)))
@@ -2608,15 +2900,27 @@ extern int flag_new_for_scope;
 #define DECL_REALLY_EXTERN(NODE) \
   (DECL_EXTERNAL (NODE) && ! DECL_NOT_REALLY_EXTERN (NODE))
 
-#define THUNK_DELTA(DECL) ((DECL)->decl.frame_size.i)
+/* An integer indicating how many bytes should be subtracted from the
+   `this' pointer when this function is called.  */
+#define THUNK_DELTA(DECL) (DECL_CHECK (DECL)->decl.u1.i)
+
+/* An integer indicating how many bytes should be subtracted from the
+   vtable for the `this' pointer to find the vcall offset.  (The vptr
+   is always located at offset zero from the f `this' pointer.)  If
+   zero, then there is no vcall offset.  */
+#define THUNK_VCALL_OFFSET(DECL) (DECL_CHECK (DECL)->decl.u2.i)
 
 /* DECL_NEEDED_P holds of a declaration when we need to emit its
    definition.  This is true when the back-end tells us that
    the symbol has been referenced in the generated code.  If, however,
    we are not generating code, then it is also true when a symbol has
-   just been used somewhere, even if it's not really needed.  */
-#define DECL_NEEDED_P(DECL)                              \
-  (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME ((DECL)))) \
+   just been used somewhere, even if it's not really needed.  We need
+   anything that isn't comdat, but we don't know for sure whether or
+   not something is comdat until end-of-file.  */
+#define DECL_NEEDED_P(DECL)                                    \
+  ((at_eof && !DECL_COMDAT (DECL))                             \
+   || (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME ((DECL))))  \
+   || (flag_syntax_only && TREE_USED ((DECL))))
 
 /* An un-parsed default argument looks like an identifier.  */
 #define DEFARG_LENGTH(NODE)  (DEFAULT_ARG_CHECK(NODE)->identifier.length)
@@ -2671,8 +2975,26 @@ extern int flag_new_for_scope;
 #define SCOPE_END_P(NODE) \
   (!SCOPE_BEGIN_P (SCOPE_STMT_CHECK (NODE)))
 
+/* The BLOCK containing the declarations contained in this scope.  */
+#define SCOPE_STMT_BLOCK(NODE) \
+  (TREE_OPERAND (SCOPE_STMT_CHECK (NODE), 0))
+
+/* Nonzero if this CTOR_STMT is for the beginning of a constructor.  */
+#define CTOR_BEGIN_P(NODE) \
+  (TREE_LANG_FLAG_0 (CTOR_STMT_CHECK (NODE)))
+
+/* Nonzero if this CTOR_STMT is for the end of a constructor.  */
+#define CTOR_END_P(NODE) \
+  (!CTOR_BEGIN_P (NODE))
+
 /* Nonzero for a SCOPE_STMT if there were no variables in this scope.  */
 #define SCOPE_NULLIFIED_P(NODE) \
+  (SCOPE_STMT_BLOCK ((NODE)) == NULL_TREE)
+
+/* Nonzero for a SCOPE_STMT which represents a lexical scope, but
+   which should be treated as non-existant from the point of view of
+   running cleanup actions.  */
+#define SCOPE_NO_CLEANUPS_P(NODE) \
   (TREE_LANG_FLAG_3 (SCOPE_STMT_CHECK (NODE)))
 
 /* Nonzero for a SCOPE_STMT if this statement is for a partial scope.
@@ -2728,6 +3050,52 @@ typedef enum cp_lvalue_kind {
   clk_bitfield = 4, /* An lvalue for a bit-field.  */
 } cp_lvalue_kind;
 
+/* The kinds of scopes we recognize.  */
+typedef enum scope_kind {
+  sk_template_parms, /* A scope for template parameters.  */
+  sk_template_spec   /* A scope corresponding to a template
+                       specialization.  There is never anything in
+                       this scope.  */
+} scope_kind;
+
+/* Various kinds of template specialization, instantiation, etc.  */
+typedef enum tmpl_spec_kind {
+  tsk_none,                /* Not a template at all.  */
+  tsk_invalid_member_spec, /* An explicit member template
+                             specialization, but the enclosing
+                             classes have not all been explicitly
+                             specialized.  */
+  tsk_invalid_expl_inst,   /* An explicit instantiation containing
+                             template parameter lists.  */
+  tsk_excessive_parms,     /* A template declaration with too many
+                             template parameter lists.  */
+  tsk_insufficient_parms,  /* A template declaration with too few
+                             parameter lists.  */
+  tsk_template,            /* A template declaration.  */
+  tsk_expl_spec,           /* An explicit specialization.  */
+  tsk_expl_inst            /* An explicit instantiation.  */
+} tmpl_spec_kind;
+
+/* The various kinds of access.  BINFO_ACCESS depends on these being
+   two bit quantities.  The numerical values are important; they are
+   used to initialize RTTI data structures, so chaning them changes
+   the ABI.  */
+typedef enum access_kind {
+  ak_none = 0,             /* Inaccessible.  */
+  ak_public = 1,           /* Accessible, as a `public' thing.  */
+  ak_protected = 2,        /* Accessible, as a `protected' thing.  */
+  ak_private = 3           /* Accessible, as a `private' thing.  */
+} access_kind;
+
+typedef enum special_function_kind {
+  sfk_none,                /* Not a special function.  */
+  sfk_constructor,         /* A constructor.  */
+  sfk_copy_constructor,    /* A copy constructor.  */
+  sfk_assignment_operator, /* An assignment operator.  */
+  sfk_destructor,          /* A destructor.  */
+  sfk_conversion           /* A conversion operator.  */
+} special_function_kind;
+
 /* Zero means prototype weakly, as in ANSI C (no args means nothing).
    Each language context defines how this variable should be set.  */
 extern int strict_prototype;
@@ -2758,44 +3126,45 @@ extern int warn_multichar;
 extern int warn_nontemplate_friend;
 
 /* in c-common.c */
-extern void declare_function_name               PROTO((void));
-extern void decl_attributes                     PROTO((tree, tree, tree));
-extern void init_function_format_info          PROTO((void));
-extern void record_function_format             PROTO((tree, tree, int, int, int));
-extern void check_function_format              PROTO((tree, tree, tree));
+extern void declare_function_name               PARAMS ((void));
+extern void decl_attributes                     PARAMS ((tree, tree, tree));
+extern void init_function_format_info          PARAMS ((void));
+extern void record_function_format             PARAMS ((tree, tree, int, int, int));
+extern void check_function_format              PARAMS ((tree, tree, tree));
 /* Print an error message for invalid operands to arith operation CODE.
    NOP_EXPR is used as a special case (see truthvalue_conversion).  */
-extern void binary_op_error                     PROTO((enum tree_code));
-extern tree canonical_type_variant              PROTO((tree));
-extern void c_expand_expr_stmt                  PROTO((tree));
+extern void binary_op_error                     PARAMS ((enum tree_code));
+extern tree canonical_type_variant              PARAMS ((tree));
+extern void c_expand_expr_stmt                  PARAMS ((tree));
 /* Validate the expression after `case' and apply default promotions.  */
-extern tree check_case_value                    PROTO((tree));
+extern tree check_case_value                    PARAMS ((tree));
 /* Concatenate a list of STRING_CST nodes into one STRING_CST.  */
-extern tree combine_strings                     PROTO((tree));
-extern void constant_expression_warning         PROTO((tree));
-extern tree convert_and_check                  PROTO((tree, tree));
-extern void overflow_warning                   PROTO((tree));
-extern void unsigned_conversion_warning                PROTO((tree, tree));
-extern void c_apply_type_quals_to_decl          PROTO((int, tree));
+extern tree combine_strings                     PARAMS ((tree));
+extern void constant_expression_warning         PARAMS ((tree));
+extern tree convert_and_check                  PARAMS ((tree, tree));
+extern void overflow_warning                   PARAMS ((tree));
+extern void unsigned_conversion_warning                PARAMS ((tree, tree));
+extern void c_apply_type_quals_to_decl          PARAMS ((int, tree));
+extern unsigned int min_precision              PARAMS ((tree, int));
 
 /* Read the rest of the current #-directive line.  */
 #if USE_CPPLIB
-extern char *get_directive_line                 PROTO((void));
+extern char *get_directive_line                 PARAMS ((void));
 #define GET_DIRECTIVE_LINE() get_directive_line ()
 #else
-extern char *get_directive_line                 PROTO((FILE *));
+extern char *get_directive_line                 PARAMS ((FILE *));
 #define GET_DIRECTIVE_LINE() get_directive_line (finput)
 #endif
 /* Subroutine of build_binary_op, used for comparison operations.
    See if the operands have both been converted from subword integer types
    and, if so, perhaps change them both back to their original type.  */
-extern tree shorten_compare                     PROTO((tree *, tree *, tree *, enum tree_code *));
+extern tree shorten_compare                     PARAMS ((tree *, tree *, tree *, enum tree_code *));
 /* Prepare expr to be an argument of a TRUTH_NOT_EXPR,
    or validate its data type for an `if' or `while' statement or ?..: exp.  */
-extern tree truthvalue_conversion               PROTO((tree));
-extern tree type_for_mode                       PROTO((enum machine_mode, int));
-extern tree type_for_size                       PROTO((unsigned, int));
-extern int c_get_alias_set                      PROTO((tree));
+extern tree truthvalue_conversion               PARAMS ((tree));
+extern tree type_for_mode                       PARAMS ((enum machine_mode, int));
+extern tree type_for_size                       PARAMS ((unsigned, int));
+extern int c_get_alias_set                      PARAMS ((tree));
 
 /* in decl{2}.c */
 /* A node that is a list (length 1) of error_mark_nodes.  */
@@ -2837,7 +3206,7 @@ struct tinst_level
   struct tinst_level *next;
 };
 
-extern void maybe_print_template_context       PROTO ((void));
+extern void maybe_print_template_context       PARAMS ((void));
 
 /* in class.c */
 
@@ -2846,10 +3215,6 @@ extern int current_class_depth;
 /* Points to the name of that function. May not be the DECL_NAME
    of CURRENT_FUNCTION_DECL due to overloading */
 extern tree original_function_name;
-
-/* in init.c  */
-extern tree global_base_init_list;
-
 \f
 /* Here's where we control how name mangling takes place.  */
 
@@ -2878,7 +3243,7 @@ extern tree global_base_init_list;
 #define AUTO_TEMP_NAME "_$tmp_"
 #define AUTO_TEMP_FORMAT "_$tmp_%d"
 #define VTABLE_BASE "$vb"
-#define VTABLE_NAME_FORMAT (flag_vtable_thunks ? "__vt_%s" : "_vt$%s")
+#define VTABLE_NAME_PREFIX (flag_vtable_thunks ? "__vt_" : "_vt$")
 #define VFIELD_BASE "$vf"
 #define VFIELD_NAME "_vptr$"
 #define VFIELD_NAME_FORMAT "_vptr$%s"
@@ -2900,7 +3265,7 @@ extern tree global_base_init_list;
 #define AUTO_TEMP_NAME "_.tmp_"
 #define AUTO_TEMP_FORMAT "_.tmp_%d"
 #define VTABLE_BASE ".vb"
-#define VTABLE_NAME_FORMAT (flag_vtable_thunks ? "__vt_%s" : "_vt.%s")
+#define VTABLE_NAME_PREFIX (flag_vtable_thunks ? "__vt_" : "_vt.")
 #define VFIELD_BASE ".vf"
 #define VFIELD_NAME "_vptr."
 #define VFIELD_NAME_FORMAT "_vptr.%s"
@@ -2929,7 +3294,7 @@ extern tree global_base_init_list;
 #define AUTO_TEMP_FORMAT "__tmp_%d"
 #define VTABLE_BASE "__vtb"
 #define VTABLE_NAME "__vt_"
-#define VTABLE_NAME_FORMAT (flag_vtable_thunks ? "__vt_%s" : "_vt_%s")
+#define VTABLE_NAME_PREFIX (flag_vtable_thunks ? "__vt_" : "_vt_")
 #define VTABLE_NAME_P(ID_NODE) \
   (!strncmp (IDENTIFIER_POINTER (ID_NODE), VTABLE_NAME, \
             sizeof (VTABLE_NAME) - 1))
@@ -3052,10 +3417,6 @@ extern struct pending_inline *pending_inlines;
 
 extern int flag_this_is_variable;
 
-/* Nonzero means generate 'rtti' that give run-time type information.  */
-
-extern int flag_rtti;
-
 /* Nonzero means do emit exported implementations of functions even if
    they can be inlined.  */
 
@@ -3079,13 +3440,10 @@ extern int flag_implicit_templates;
 
 extern int flag_weak;
 
-/* Nonzero to enable experimental ABI changes.  */
+/* Nonzero if we should expand functions calls inline at the tree
+   level, rather than at the RTL level.  */
 
-extern int flag_new_abi;
-
-/* Nonzero to not ignore namespace std. */
-
-extern int flag_honor_std;
+extern int flag_inline_trees;
 
 /* Nonzero if we're done parsing and into end-of-file activities.  */
 
@@ -3108,8 +3466,6 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG };
    LOOKUP_NONVIRTUAL means make a direct call to the member function found
    LOOKUP_GLOBAL means search through the space of overloaded functions,
      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.
    DIRECT_BIND means that if a temporary is created, it should be created so
      that it lives as long as the current variable bindings; otherwise it
@@ -3134,10 +3490,8 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG };
 #define LOOKUP_PROTECT (1)
 #define LOOKUP_COMPLAIN (2)
 #define LOOKUP_NORMAL (3)
-/* #define LOOKUP_UNUSED (4) */
 #define LOOKUP_NONVIRTUAL (8)
 #define LOOKUP_GLOBAL (16)
-#define LOOKUP_HAS_IN_CHARGE (32)
 #define LOOKUP_SPECULATIVELY (64)
 #define LOOKUP_ONLYCONVERTING (128)
 #define DIRECT_BIND (256)
@@ -3288,851 +3642,870 @@ enum tree_string_flags
 extern const char **opname_tab, **assignop_tab;
 \f
 /* in call.c */
-extern int check_dtor_name                     PROTO((tree, tree));
-extern int get_arglist_len_in_bytes            PROTO((tree));
-
-extern tree build_vfield_ref                   PROTO((tree, tree));
-extern tree resolve_scope_to_name              PROTO((tree, tree));
-extern tree build_scoped_method_call           PROTO((tree, tree, tree, tree));
-extern tree build_addr_func                    PROTO((tree));
-extern tree build_call                         PROTO((tree, tree, tree));
-extern tree build_method_call                  PROTO((tree, tree, tree, tree, int));
-extern int null_ptr_cst_p                      PROTO((tree));
-extern tree type_decays_to                     PROTO((tree));
-extern tree build_user_type_conversion         PROTO((tree, tree, int));
-extern tree build_new_function_call            PROTO((tree, tree));
-extern tree build_new_op                       PROTO((enum tree_code, int, tree, tree, tree));
-extern tree build_op_new_call                  PROTO((enum tree_code, tree, tree, int));
-extern tree build_op_delete_call               PROTO((enum tree_code, tree, tree, int, tree));
-extern int can_convert                         PROTO((tree, tree));
-extern int can_convert_arg                     PROTO((tree, tree, tree));
-extern int enforce_access                       PROTO((tree, tree));
-extern tree convert_default_arg                 PROTO((tree, tree, tree));
-extern tree convert_arg_to_ellipsis             PROTO((tree));
-extern tree build_x_va_arg                      PROTO((tree, tree));
-extern tree convert_type_from_ellipsis          PROTO((tree));
-extern int is_properly_derived_from             PROTO((tree, tree));
-extern tree initialize_reference                PROTO((tree, tree));
-extern tree strip_top_quals                     PROTO((tree));
-extern tree perform_implicit_conversion         PROTO((tree, tree));
+extern int check_dtor_name                     PARAMS ((tree, tree));
+extern int get_arglist_len_in_bytes            PARAMS ((tree));
+
+extern tree build_vfield_ref                   PARAMS ((tree, tree));
+extern tree resolve_scope_to_name              PARAMS ((tree, tree));
+extern tree build_scoped_method_call           PARAMS ((tree, tree, tree, tree));
+extern tree build_addr_func                    PARAMS ((tree));
+extern tree build_call                         PARAMS ((tree, tree));
+extern tree build_method_call                  PARAMS ((tree, tree, tree, tree, int));
+extern int null_ptr_cst_p                      PARAMS ((tree));
+extern tree type_decays_to                     PARAMS ((tree));
+extern tree build_user_type_conversion         PARAMS ((tree, tree, int));
+extern tree build_new_function_call            PARAMS ((tree, tree));
+extern tree build_new_op                       PARAMS ((enum tree_code, int, tree, tree, tree));
+extern tree build_op_delete_call               PARAMS ((enum tree_code, tree, tree, int, tree));
+extern int can_convert                         PARAMS ((tree, tree));
+extern int can_convert_arg                     PARAMS ((tree, tree, tree));
+extern int enforce_access                       PARAMS ((tree, tree));
+extern tree convert_default_arg                 PARAMS ((tree, tree, tree, int));
+extern tree convert_arg_to_ellipsis             PARAMS ((tree));
+extern tree build_x_va_arg                      PARAMS ((tree, tree));
+extern tree convert_type_from_ellipsis          PARAMS ((tree));
+extern int is_properly_derived_from             PARAMS ((tree, tree));
+extern tree initialize_reference                PARAMS ((tree, tree));
+extern tree strip_top_quals                     PARAMS ((tree));
+extern tree perform_implicit_conversion         PARAMS ((tree, tree));
 
 /* in class.c */
-extern tree build_vbase_path                   PROTO((enum tree_code, tree, tree, tree, int));
-extern tree build_vtbl_ref                     PROTO((tree, tree));
-extern tree build_vfn_ref                      PROTO((tree *, tree, tree));
-extern void add_method                         PROTO((tree, tree *, tree));
-extern int currently_open_class                        PROTO((tree));
-extern tree get_vfield_offset                  PROTO((tree));
-extern void duplicate_tag_error                        PROTO((tree));
-extern tree finish_struct                      PROTO((tree, tree));
-extern void finish_struct_1                    PROTO((tree));
-extern int resolves_to_fixed_type_p            PROTO((tree, int *));
-extern void init_class_processing              PROTO((void));
-extern int is_empty_class                      PROTO((tree));
-extern void pushclass                          PROTO((tree, int));
-extern void popclass                           PROTO((void));
-extern void push_nested_class                  PROTO((tree, int));
-extern void pop_nested_class                   PROTO((void));
-extern void push_lang_context                  PROTO((tree));
-extern void pop_lang_context                   PROTO((void));
-extern tree instantiate_type                   PROTO((tree, tree, int));
-extern void print_class_statistics             PROTO((void));
-extern unsigned HOST_WIDE_INT skip_rtti_stuff  PROTO((tree *, tree));
-extern void build_self_reference               PROTO((void));
-extern void warn_hidden                                PROTO((tree));
-extern tree get_enclosing_class                        PROTO((tree));
-int is_base_of_enclosing_class                 PROTO((tree, tree));
-extern void unreverse_member_declarations       PROTO((tree));
-extern void invalidate_class_lookup_cache       PROTO((void));
-extern void maybe_note_name_used_in_class       PROTO((tree, tree));
-extern void note_name_declared_in_class         PROTO((tree, tree));
+extern tree build_vbase_path                   PARAMS ((enum tree_code, tree, tree, tree, int));
+extern tree build_vtbl_ref                     PARAMS ((tree, tree));
+extern tree build_vfn_ref                      PARAMS ((tree *, tree, tree));
+extern tree get_vtable_decl                     PARAMS ((tree, int));
+extern void add_method                         PARAMS ((tree, tree *, tree));
+extern int currently_open_class                        PARAMS ((tree));
+extern tree currently_open_derived_class       PARAMS ((tree));
+extern tree get_vfield_offset                  PARAMS ((tree));
+extern void duplicate_tag_error                        PARAMS ((tree));
+extern tree finish_struct                      PARAMS ((tree, tree));
+extern void finish_struct_1                    PARAMS ((tree));
+extern int resolves_to_fixed_type_p            PARAMS ((tree, int *));
+extern void init_class_processing              PARAMS ((void));
+extern int is_empty_class                      PARAMS ((tree));
+extern void pushclass                          PARAMS ((tree, int));
+extern void popclass                           PARAMS ((void));
+extern void push_nested_class                  PARAMS ((tree, int));
+extern void pop_nested_class                   PARAMS ((void));
+extern void push_lang_context                  PARAMS ((tree));
+extern void pop_lang_context                   PARAMS ((void));
+extern tree instantiate_type                   PARAMS ((tree, tree, int));
+extern void print_class_statistics             PARAMS ((void));
+extern int first_vfun_index                     PARAMS ((tree));
+extern void build_self_reference               PARAMS ((void));
+extern void warn_hidden                                PARAMS ((tree));
+extern tree get_enclosing_class                        PARAMS ((tree));
+int is_base_of_enclosing_class                 PARAMS ((tree, tree));
+extern void unreverse_member_declarations       PARAMS ((tree));
+extern void invalidate_class_lookup_cache       PARAMS ((void));
+extern void maybe_note_name_used_in_class       PARAMS ((tree, tree));
+extern void note_name_declared_in_class         PARAMS ((tree, tree));
+extern tree get_vtbl_decl_for_binfo           PARAMS ((tree));
 
 /* in cvt.c */
-extern tree convert_to_reference               PROTO((tree, tree, int, int, tree));
-extern tree convert_from_reference             PROTO((tree));
-extern tree convert_pointer_to_real            PROTO((tree, tree));
-extern tree convert_pointer_to                 PROTO((tree, tree));
-extern tree ocp_convert                                PROTO((tree, tree, int, int));
-extern tree cp_convert                         PROTO((tree, tree));
-extern tree convert_to_void                    PROTO((tree, const char */*implicit context*/));
-extern tree convert                            PROTO((tree, tree));
-extern tree convert_force                      PROTO((tree, tree, int));
-extern tree build_type_conversion              PROTO((tree, tree, int));
-extern tree build_expr_type_conversion         PROTO((int, tree, int));
-extern tree type_promotes_to                   PROTO((tree));
-extern tree perform_qualification_conversions   PROTO((tree, tree));
+extern tree convert_to_reference               PARAMS ((tree, tree, int, int, tree));
+extern tree convert_from_reference             PARAMS ((tree));
+extern tree convert_pointer_to_real            PARAMS ((tree, tree));
+extern tree convert_pointer_to                 PARAMS ((tree, tree));
+extern tree ocp_convert                                PARAMS ((tree, tree, int, int));
+extern tree cp_convert                         PARAMS ((tree, tree));
+extern tree convert_to_void                    PARAMS ((tree, const char */*implicit context*/));
+extern tree convert                            PARAMS ((tree, tree));
+extern tree convert_force                      PARAMS ((tree, tree, int));
+extern tree build_type_conversion              PARAMS ((tree, tree, int));
+extern tree build_expr_type_conversion         PARAMS ((int, tree, int));
+extern tree type_promotes_to                   PARAMS ((tree));
+extern tree perform_qualification_conversions   PARAMS ((tree, tree));
 
 /* decl.c */
 /* resume_binding_level */
-extern void set_identifier_local_value         PROTO((tree, tree));
-extern int global_bindings_p                   PROTO((void));
-extern int toplevel_bindings_p                 PROTO((void));
-extern int namespace_bindings_p                        PROTO((void));
-extern void keep_next_level                    PROTO((int));
-extern int kept_level_p                                PROTO((void));
-extern void declare_pseudo_global_level                PROTO((void));
-extern int pseudo_global_level_p               PROTO((void));
-extern void set_class_shadows                  PROTO((tree));
-extern void pushlevel                          PROTO((int));
-extern void note_level_for_for                 PROTO((void));
-extern void resume_level                       PROTO((struct binding_level *));
-extern void delete_block                       PROTO((tree));
-extern void insert_block                       PROTO((tree));
-extern void add_block_current_level            PROTO((tree));
-extern void set_block                          PROTO((tree));
-extern void pushlevel_class                    PROTO((void));
-extern void poplevel_class                      PROTO((void));
-extern void print_binding_stack                        PROTO((void));
-extern void print_binding_level                        PROTO((struct binding_level *));
-extern void push_namespace                     PROTO((tree));
-extern void pop_namespace                      PROTO((void));
-extern void push_nested_namespace              PROTO((tree));
-extern void pop_nested_namespace               PROTO((tree));
-extern void maybe_push_to_top_level            PROTO((int));
-extern void push_to_top_level                  PROTO((void));
-extern void pop_from_top_level                 PROTO((void));
-extern tree identifier_type_value              PROTO((tree));
-extern void set_identifier_type_value          PROTO((tree, tree));
-extern void pop_everything                     PROTO((void));
-extern void pushtag                            PROTO((tree, tree, int));
-extern tree make_anon_name                     PROTO((void));
-extern void clear_anon_tags                    PROTO((void));
-extern int decls_match                         PROTO((tree, tree));
-extern int duplicate_decls                     PROTO((tree, tree));
-extern tree pushdecl                           PROTO((tree));
-extern tree pushdecl_top_level                 PROTO((tree));
-extern void pushdecl_class_level               PROTO((tree));
+extern void set_identifier_local_value         PARAMS ((tree, tree));
+extern int global_bindings_p                   PARAMS ((void));
+extern int toplevel_bindings_p                 PARAMS ((void));
+extern int namespace_bindings_p                        PARAMS ((void));
+extern void keep_next_level                    PARAMS ((int));
+extern int kept_level_p                                PARAMS ((void));
+extern int template_parm_scope_p               PARAMS ((void));
+extern void set_class_shadows                  PARAMS ((tree));
+extern void begin_scope                         PARAMS ((scope_kind));
+extern void finish_scope                        PARAMS ((void));
+extern void note_level_for_for                 PARAMS ((void));
+extern void resume_level                       PARAMS ((struct binding_level *));
+extern void delete_block                       PARAMS ((tree));
+extern void insert_block                       PARAMS ((tree));
+extern void add_block_current_level            PARAMS ((tree));
+extern void set_block                          PARAMS ((tree));
+extern void pushlevel_class                    PARAMS ((void));
+extern void poplevel_class                      PARAMS ((void));
+extern void print_binding_stack                        PARAMS ((void));
+extern void print_binding_level                        PARAMS ((struct binding_level *));
+extern void push_namespace                     PARAMS ((tree));
+extern void pop_namespace                      PARAMS ((void));
+extern void push_nested_namespace              PARAMS ((tree));
+extern void pop_nested_namespace               PARAMS ((tree));
+extern void maybe_push_to_top_level            PARAMS ((int));
+extern void push_to_top_level                  PARAMS ((void));
+extern void pop_from_top_level                 PARAMS ((void));
+extern tree identifier_type_value              PARAMS ((tree));
+extern void set_identifier_type_value          PARAMS ((tree, tree));
+extern void pop_everything                     PARAMS ((void));
+extern void pushtag                            PARAMS ((tree, tree, int));
+extern tree make_anon_name                     PARAMS ((void));
+extern void clear_anon_tags                    PARAMS ((void));
+extern int decls_match                         PARAMS ((tree, tree));
+extern int duplicate_decls                     PARAMS ((tree, tree));
+extern tree pushdecl                           PARAMS ((tree));
+extern tree pushdecl_top_level                 PARAMS ((tree));
+extern void pushdecl_class_level               PARAMS ((tree));
 #if 0
-extern void pushdecl_nonclass_level            PROTO((tree));
+extern void pushdecl_nonclass_level            PARAMS ((tree));
 #endif
-extern tree pushdecl_namespace_level            PROTO((tree));
-extern tree push_using_decl                     PROTO((tree, tree));
-extern tree push_using_directive                PROTO((tree));
-extern void push_class_level_binding           PROTO((tree, tree));
-extern tree implicitly_declare                 PROTO((tree));
-extern tree lookup_label                       PROTO((tree));
-extern tree declare_local_label                 PROTO((tree));
-extern tree define_label                       PROTO((char *, int, tree));
-extern void push_switch                                PROTO((void));
-extern void pop_switch                         PROTO((void));
-extern void define_case_label                  PROTO((void));
-extern tree getdecls                           PROTO((void));
-extern tree gettags                            PROTO((void));
+extern tree pushdecl_namespace_level            PARAMS ((tree));
+extern tree push_using_decl                     PARAMS ((tree, tree));
+extern tree push_using_directive                PARAMS ((tree));
+extern void push_class_level_binding           PARAMS ((tree, tree));
+extern tree implicitly_declare                 PARAMS ((tree));
+extern tree lookup_label                       PARAMS ((tree));
+extern tree declare_local_label                 PARAMS ((tree));
+extern tree define_label                       PARAMS ((char *, int, tree));
+extern void push_switch                                PARAMS ((void));
+extern void pop_switch                         PARAMS ((void));
+extern void define_case_label                  PARAMS ((void));
+extern tree getdecls                           PARAMS ((void));
+extern tree gettags                            PARAMS ((void));
 #if 0
-extern void set_current_level_tags_transparency        PROTO((int));
+extern void set_current_level_tags_transparency        PARAMS ((int));
 #endif
-extern tree binding_for_name                    PROTO((tree, tree));
-extern tree namespace_binding                   PROTO((tree, tree));
-extern void set_namespace_binding               PROTO((tree, tree, tree));
-extern tree lookup_namespace_name              PROTO((tree, tree));
-extern tree build_typename_type                 PROTO((tree, tree, tree, tree));
-extern tree make_typename_type                 PROTO((tree, tree, int));
-extern tree lookup_name_nonclass               PROTO((tree));
-extern tree lookup_function_nonclass            PROTO((tree, tree));
-extern tree lookup_name                                PROTO((tree, int));
-extern tree lookup_name_current_level          PROTO((tree));
-extern tree lookup_type_current_level          PROTO((tree));
-extern tree lookup_name_namespace_only          PROTO((tree));
-extern void begin_only_namespace_names          PROTO((void));
-extern void end_only_namespace_names            PROTO((void));
-extern tree namespace_ancestor                 PROTO((tree, tree));
-extern tree unqualified_namespace_lookup       PROTO((tree, int, tree *));
-extern int  lookup_using_namespace              PROTO((tree, tree, tree, tree, int, tree *));
-extern int  qualified_lookup_using_namespace    PROTO((tree, tree, tree, int));
-extern tree auto_function                      PROTO((tree, tree));
-extern void init_decl_processing               PROTO((void));
-extern int init_type_desc                      PROTO((void));
-extern tree define_function                    PROTO((const char *, tree,
-                                                      void (*) (tree),
-                                                      const char *));
-extern tree check_tag_decl                     PROTO((tree));
-extern void shadow_tag                         PROTO((tree));
-extern tree groktypename                       PROTO((tree));
-extern tree start_decl                         PROTO((tree, tree, int, tree, tree));
-extern void start_decl_1                       PROTO((tree));
-extern void cp_finish_decl                     PROTO((tree, tree, tree, int, int));
-extern void finish_decl                                PROTO((tree, tree, tree));
-extern void maybe_inject_for_scope_var          PROTO((tree));
-extern void initialize_local_var                PROTO((tree, tree, int));
-extern void expand_static_init                 PROTO((tree, tree));
-extern tree start_handler_parms                 PROTO((tree, tree));
-extern int complete_array_type                 PROTO((tree, tree, int));
-extern tree build_ptrmemfunc_type              PROTO((tree));
+extern tree binding_for_name                    PARAMS ((tree, tree));
+extern tree namespace_binding                   PARAMS ((tree, tree));
+extern void set_namespace_binding               PARAMS ((tree, tree, tree));
+extern tree lookup_namespace_name              PARAMS ((tree, tree));
+extern tree build_typename_type                 PARAMS ((tree, tree, tree, tree));
+extern tree make_typename_type                 PARAMS ((tree, tree, int));
+extern tree lookup_name_nonclass               PARAMS ((tree));
+extern tree lookup_function_nonclass            PARAMS ((tree, tree));
+extern tree lookup_name                                PARAMS ((tree, int));
+extern tree lookup_name_current_level          PARAMS ((tree));
+extern tree lookup_type_current_level          PARAMS ((tree));
+extern tree lookup_name_namespace_only          PARAMS ((tree));
+extern void begin_only_namespace_names          PARAMS ((void));
+extern void end_only_namespace_names            PARAMS ((void));
+extern tree namespace_ancestor                 PARAMS ((tree, tree));
+extern tree unqualified_namespace_lookup       PARAMS ((tree, int, tree *));
+extern int  lookup_using_namespace              PARAMS ((tree, tree, tree, tree, int, tree *));
+extern int  qualified_lookup_using_namespace    PARAMS ((tree, tree, tree, int));
+extern tree build_library_fn                   PARAMS ((tree, tree));
+extern tree build_cp_library_fn                        PARAMS ((tree, tree));
+extern tree build_library_fn_ptr               PARAMS ((const char *, tree));
+extern tree build_cp_library_fn_ptr            PARAMS ((const char *, tree));
+extern tree push_library_fn                    PARAMS ((tree, tree));
+extern tree push_cp_library_fn                 PARAMS ((tree, tree));
+extern tree push_void_library_fn               PARAMS ((tree, tree));
+extern tree push_throw_library_fn              PARAMS ((tree, tree));
+extern void init_decl_processing               PARAMS ((void));
+extern int init_type_desc                      PARAMS ((void));
+extern tree check_tag_decl                     PARAMS ((tree));
+extern void shadow_tag                         PARAMS ((tree));
+extern tree groktypename                       PARAMS ((tree));
+extern tree start_decl                         PARAMS ((tree, tree, int, tree, tree));
+extern void start_decl_1                       PARAMS ((tree));
+extern void cp_finish_decl                     PARAMS ((tree, tree, tree, int));
+extern void finish_decl                                PARAMS ((tree, tree, tree));
+extern void maybe_inject_for_scope_var          PARAMS ((tree));
+extern void initialize_local_var                PARAMS ((tree, tree, int));
+extern void expand_static_init                 PARAMS ((tree, tree));
+extern tree start_handler_parms                 PARAMS ((tree, tree));
+extern int complete_array_type                 PARAMS ((tree, tree, int));
+extern tree build_ptrmemfunc_type              PARAMS ((tree));
 /* the grokdeclarator prototype is in decl.h */
-extern int parmlist_is_exprlist                        PROTO((tree));
-extern int copy_args_p                         PROTO((tree));
-extern int grok_ctor_properties                        PROTO((tree, tree));
-extern void grok_op_properties                 PROTO((tree, int, int));
-extern tree xref_tag                           PROTO((tree, tree, int));
-extern tree xref_tag_from_type                 PROTO((tree, tree, int));
-extern void xref_basetypes                     PROTO((tree, tree, tree, tree));
-extern tree start_enum                         PROTO((tree));
-extern tree finish_enum                                PROTO((tree));
-extern tree build_enumerator                   PROTO((tree, tree, tree));
-extern int start_function                      PROTO((tree, tree, tree, int));
-extern void expand_start_early_try_stmts       PROTO((void));
-extern void store_parm_decls                   PROTO((void));
-extern void store_return_init                  PROTO((tree));
-extern tree finish_function                    PROTO((int, int));
-extern tree start_method                       PROTO((tree, tree, tree));
-extern tree finish_method                      PROTO((tree));
-extern void hack_incomplete_structures         PROTO((tree));
-extern tree maybe_build_cleanup_and_delete     PROTO((tree));
-extern tree maybe_build_cleanup                        PROTO((tree));
-extern void cplus_expand_expr_stmt             PROTO((tree));
-extern void finish_stmt                                PROTO((void));
-extern int in_function_p                       PROTO((void));
-extern void replace_defarg                     PROTO((tree, tree));
-extern void print_other_binding_stack          PROTO((struct binding_level *));
-extern void revert_static_member_fn             PROTO((tree*, tree*, tree*));
-extern void fixup_anonymous_aggr               PROTO((tree));
-extern int check_static_variable_definition     PROTO((tree, tree));
-extern void push_local_binding                  PROTO((tree, tree, int));
-extern int push_class_binding                   PROTO((tree, tree));
-extern tree check_default_argument              PROTO((tree, tree));
-extern tree push_overloaded_decl               PROTO((tree, int));
-extern void clear_identifier_class_values       PROTO((void));
-extern void storetags                           PROTO((tree));
-extern int vtable_decl_p                        PROTO((tree, void *));
-extern int vtype_decl_p                         PROTO((tree, void *));
-extern int sigtable_decl_p                      PROTO((tree, void *));
-typedef int (*walk_globals_pred)                PROTO((tree, void *));
-typedef int (*walk_globals_fn)                  PROTO((tree *, void *));
-extern int walk_globals                         PROTO((walk_globals_pred,
+extern int parmlist_is_exprlist                        PARAMS ((tree));
+extern int copy_args_p                         PARAMS ((tree));
+extern int grok_ctor_properties                        PARAMS ((tree, tree));
+extern void grok_op_properties                 PARAMS ((tree, int, int));
+extern tree xref_tag                           PARAMS ((tree, tree, int));
+extern tree xref_tag_from_type                 PARAMS ((tree, tree, int));
+extern void xref_basetypes                     PARAMS ((tree, tree, tree, tree));
+extern tree start_enum                         PARAMS ((tree));
+extern tree finish_enum                                PARAMS ((tree));
+extern void build_enumerator                   PARAMS ((tree, tree, tree));
+extern int start_function                      PARAMS ((tree, tree, tree, int));
+extern void expand_start_early_try_stmts       PARAMS ((void));
+extern void store_parm_decls                   PARAMS ((void));
+extern void store_return_init                  PARAMS ((tree));
+extern tree finish_function                    PARAMS ((int));
+extern tree start_method                       PARAMS ((tree, tree, tree));
+extern tree finish_method                      PARAMS ((tree));
+extern void hack_incomplete_structures         PARAMS ((tree));
+extern tree maybe_build_cleanup_and_delete     PARAMS ((tree));
+extern tree maybe_build_cleanup                        PARAMS ((tree));
+extern void cplus_expand_expr_stmt             PARAMS ((tree));
+extern void finish_stmt                                PARAMS ((void));
+extern void replace_defarg                     PARAMS ((tree, tree));
+extern void print_other_binding_stack          PARAMS ((struct binding_level *));
+extern void revert_static_member_fn             PARAMS ((tree));
+extern void fixup_anonymous_aggr                PARAMS ((tree));
+extern int check_static_variable_definition     PARAMS ((tree, tree));
+extern tree compute_array_index_type           PARAMS ((tree, tree));
+extern void push_local_binding                  PARAMS ((tree, tree, int));
+extern int push_class_binding                   PARAMS ((tree, tree));
+extern tree check_default_argument              PARAMS ((tree, tree));
+extern tree push_overloaded_decl               PARAMS ((tree, int));
+extern void clear_identifier_class_values       PARAMS ((void));
+extern void storetags                           PARAMS ((tree));
+extern int vtable_decl_p                        PARAMS ((tree, void *));
+extern int vtype_decl_p                         PARAMS ((tree, void *));
+extern int sigtable_decl_p                      PARAMS ((tree, void *));
+typedef int (*walk_globals_pred)                PARAMS ((tree, void *));
+typedef int (*walk_globals_fn)                  PARAMS ((tree *, void *));
+extern int walk_globals                         PARAMS ((walk_globals_pred,
                                                       walk_globals_fn,
                                                       void *));
-typedef int (*walk_namespaces_fn)               PROTO((tree, void *));
-extern int walk_namespaces                      PROTO((walk_namespaces_fn,
+typedef int (*walk_namespaces_fn)               PARAMS ((tree, void *));
+extern int walk_namespaces                      PARAMS ((walk_namespaces_fn,
                                                       void *));
-extern int wrapup_globals_for_namespace         PROTO((tree, void *));
-extern tree cp_namespace_decls                  PROTO((tree));
-extern tree create_implicit_typedef             PROTO((tree, tree));
-extern tree maybe_push_decl                     PROTO((tree));
-extern void emit_local_var                      PROTO((tree));
-extern tree build_target_expr                   PROTO((tree, tree));
-extern void make_rtl_for_local_static           PROTO((tree));
+extern int wrapup_globals_for_namespace         PARAMS ((tree, void *));
+extern tree cp_namespace_decls                  PARAMS ((tree));
+extern tree create_implicit_typedef             PARAMS ((tree, tree));
+extern tree maybe_push_decl                     PARAMS ((tree));
+extern void emit_local_var                      PARAMS ((tree));
+extern tree build_target_expr_with_type         PARAMS ((tree, tree));
+extern void make_rtl_for_local_static           PARAMS ((tree));
+extern int local_variable_p                     PARAMS ((tree));
+extern int nonstatic_local_decl_p               PARAMS ((tree));
+extern tree declare_global_var                  PARAMS ((tree, tree));
+extern void register_dtor_fn                    PARAMS ((tree));
+extern tmpl_spec_kind current_tmpl_spec_kind    PARAMS ((int));
 
 /* in decl2.c */
-extern void init_decl2                         PROTO((void));
-extern int check_java_method                   PROTO((tree));
-extern int lang_decode_option                  PROTO((int, char **));
-extern tree grok_method_quals                  PROTO((tree, tree, tree));
-extern void warn_if_unknown_interface          PROTO((tree));
-extern void grok_x_components                  PROTO((tree));
-extern void maybe_retrofit_in_chrg             PROTO((tree));
-extern void maybe_make_one_only                        PROTO((tree));
-extern void grokclassfn                                PROTO((tree, tree, enum overload_flags, tree));
-extern tree grok_alignof                       PROTO((tree));
-extern tree grok_array_decl                    PROTO((tree, tree));
-extern tree delete_sanity                      PROTO((tree, tree, int, int));
-extern tree check_classfn                      PROTO((tree, tree));
-extern void check_member_template               PROTO((tree));
-extern tree grokfield                          PROTO((tree, tree, tree, tree, tree));
-extern tree grokbitfield                       PROTO((tree, tree, tree));
-extern tree groktypefield                      PROTO((tree, tree));
-extern tree grokoptypename                     PROTO((tree, tree));
-extern int copy_assignment_arg_p               PROTO((tree, int));
-extern void cplus_decl_attributes              PROTO((tree, tree, tree)); 
-extern tree constructor_name_full              PROTO((tree));
-extern tree constructor_name                   PROTO((tree));
-extern void setup_vtbl_ptr                     PROTO((void));
-extern void mark_inline_for_output             PROTO((tree));
-extern tree get_temp_name                      PROTO((tree, int));
-extern void finish_anon_union                  PROTO((tree));
-extern tree finish_table                       PROTO((tree, tree, tree, int));
-extern void finish_builtin_type                        PROTO((tree, const char *,
+extern void init_decl2                         PARAMS ((void));
+extern int check_java_method                   PARAMS ((tree));
+extern int lang_decode_option                  PARAMS ((int, char **));
+extern int grok_method_quals                   PARAMS ((tree, tree, tree));
+extern void warn_if_unknown_interface          PARAMS ((tree));
+extern void grok_x_components                  PARAMS ((tree));
+extern void maybe_retrofit_in_chrg             PARAMS ((tree));
+extern void maybe_make_one_only                        PARAMS ((tree));
+extern void grokclassfn                                PARAMS ((tree, tree, enum overload_flags, tree));
+extern tree grok_alignof                       PARAMS ((tree));
+extern tree grok_array_decl                    PARAMS ((tree, tree));
+extern tree delete_sanity                      PARAMS ((tree, tree, int, int));
+extern tree check_classfn                      PARAMS ((tree, tree));
+extern void check_member_template               PARAMS ((tree));
+extern tree grokfield                          PARAMS ((tree, tree, tree, tree, tree));
+extern tree grokbitfield                       PARAMS ((tree, tree, tree));
+extern tree groktypefield                      PARAMS ((tree, tree));
+extern tree grokoptypename                     PARAMS ((tree, tree));
+extern int copy_assignment_arg_p               PARAMS ((tree, int));
+extern void cplus_decl_attributes              PARAMS ((tree, tree, tree)); 
+extern tree constructor_name_full              PARAMS ((tree));
+extern tree constructor_name                   PARAMS ((tree));
+extern void setup_vtbl_ptr                     PARAMS ((void));
+extern void defer_fn                           PARAMS ((tree));
+extern tree get_temp_name                      PARAMS ((tree, int));
+extern void finish_anon_union                  PARAMS ((tree));
+extern tree finish_table                       PARAMS ((tree, tree, tree, int));
+extern void finish_builtin_type                        PARAMS ((tree, const char *,
                                                       tree *, int, tree));
-extern tree coerce_new_type                    PROTO((tree));
-extern tree coerce_delete_type                 PROTO((tree));
-extern void comdat_linkage                     PROTO((tree));
-extern void import_export_class                        PROTO((tree));
-extern void import_export_vtable               PROTO((tree, tree, int));
-extern void import_export_decl                 PROTO((tree));
-extern tree build_cleanup                      PROTO((tree));
-extern void finish_file                                PROTO((void));
-extern tree reparse_absdcl_as_expr             PROTO((tree, tree));
-extern tree reparse_absdcl_as_casts            PROTO((tree, tree));
-extern tree build_expr_from_tree               PROTO((tree));
-extern tree reparse_decl_as_expr               PROTO((tree, tree));
-extern tree finish_decl_parsing                        PROTO((tree));
-extern tree check_cp_case_value                        PROTO((tree));
-extern void set_decl_namespace                  PROTO((tree, tree, int));
-extern tree current_decl_namespace              PROTO((void));
-extern void push_decl_namespace                 PROTO((tree));
-extern void pop_decl_namespace                  PROTO((void));
-extern void push_scope                         PROTO((tree));
-extern void pop_scope                          PROTO((tree));
-extern void do_namespace_alias                 PROTO((tree, tree));
-extern void do_toplevel_using_decl             PROTO((tree));
-extern void do_local_using_decl                 PROTO((tree));
-extern tree do_class_using_decl                        PROTO((tree));
-extern void do_using_directive                 PROTO((tree));
-extern void check_default_args                 PROTO((tree));
-extern void mark_used                          PROTO((tree));
-extern tree handle_class_head                  PROTO((tree, tree, tree));
-extern tree lookup_arg_dependent                PROTO((tree, tree, tree));
-extern void finish_static_data_member_decl      PROTO((tree, tree, tree, int, int));
+extern tree coerce_new_type                    PARAMS ((tree));
+extern tree coerce_delete_type                 PARAMS ((tree));
+extern void comdat_linkage                     PARAMS ((tree));
+extern void import_export_vtable               PARAMS ((tree, tree, int));
+extern void import_export_decl                 PARAMS ((tree));
+extern tree build_cleanup                      PARAMS ((tree));
+extern void finish_file                                PARAMS ((void));
+extern tree reparse_absdcl_as_expr             PARAMS ((tree, tree));
+extern tree reparse_absdcl_as_casts            PARAMS ((tree, tree));
+extern tree build_expr_from_tree               PARAMS ((tree));
+extern tree reparse_decl_as_expr               PARAMS ((tree, tree));
+extern tree finish_decl_parsing                        PARAMS ((tree));
+extern tree check_cp_case_value                        PARAMS ((tree));
+extern void set_decl_namespace                  PARAMS ((tree, tree, int));
+extern tree current_decl_namespace              PARAMS ((void));
+extern void push_decl_namespace                 PARAMS ((tree));
+extern void pop_decl_namespace                  PARAMS ((void));
+extern void push_scope                         PARAMS ((tree));
+extern void pop_scope                          PARAMS ((tree));
+extern void do_namespace_alias                 PARAMS ((tree, tree));
+extern void do_toplevel_using_decl             PARAMS ((tree));
+extern void do_local_using_decl                 PARAMS ((tree));
+extern tree do_class_using_decl                        PARAMS ((tree));
+extern void do_using_directive                 PARAMS ((tree));
+extern void check_default_args                 PARAMS ((tree));
+extern void mark_used                          PARAMS ((tree));
+extern tree handle_class_head                  PARAMS ((tree, tree, tree));
+extern tree lookup_arg_dependent                PARAMS ((tree, tree, tree));
+extern void finish_static_data_member_decl      PARAMS ((tree, tree, tree, int));
 
 /* in parse.y */
-extern void cp_parse_init                      PROTO((void));
+extern void cp_parse_init                      PARAMS ((void));
 
 /* in errfn.c */
 /* The cp_* functions aren't suitable for ATTRIBUTE_PRINTF. */
-extern void cp_error                           PVPROTO((const char *, ...));
-extern void cp_error_at                                PVPROTO((const char *, ...));
-extern void cp_warning                         PVPROTO((const char *, ...));
-extern void cp_warning_at                      PVPROTO((const char *, ...));
-extern void cp_pedwarn                         PVPROTO((const char *, ...));
-extern void cp_pedwarn_at                      PVPROTO((const char *, ...));
-extern void cp_compiler_error                  PVPROTO((const char *, ...));
-extern void cp_sprintf                         PVPROTO((const char *, ...));
-extern void cp_deprecated                       PROTO((const char*));
+extern void cp_error                           PARAMS ((const char *, ...));
+extern void cp_error_at                                PARAMS ((const char *, ...));
+extern void cp_warning                         PARAMS ((const char *, ...));
+extern void cp_warning_at                      PARAMS ((const char *, ...));
+extern void cp_pedwarn                         PARAMS ((const char *, ...));
+extern void cp_pedwarn_at                      PARAMS ((const char *, ...));
+extern void cp_compiler_error                  PARAMS ((const char *, ...));
+extern void cp_sprintf                         PARAMS ((const char *, ...));
+extern void cp_deprecated                       PARAMS ((const char*));
 
 /* in error.c */
-extern void init_error                         PROTO((void));
-extern const char *type_as_string              PROTO((tree, enum tree_string_flags));
-extern const char *decl_as_string              PROTO((tree, enum tree_string_flags));
-extern const char *expr_as_string              PROTO((tree, enum tree_string_flags));
-extern const char *context_as_string            PROTO((tree, enum tree_string_flags));
-extern const char *lang_decl_name              PROTO((tree, int));
-extern const char *cp_file_of                  PROTO((tree));
-extern int cp_line_of                          PROTO((tree));
+extern void init_error                         PARAMS ((void));
+extern const char *type_as_string              PARAMS ((tree, enum tree_string_flags));
+extern const char *decl_as_string              PARAMS ((tree, enum tree_string_flags));
+extern const char *expr_as_string              PARAMS ((tree, enum tree_string_flags));
+extern const char *context_as_string            PARAMS ((tree, enum tree_string_flags));
+extern const char *lang_decl_name              PARAMS ((tree, int));
+extern const char *cp_file_of                  PARAMS ((tree));
+extern int cp_line_of                          PARAMS ((tree));
 
 /* in except.c */
-extern void init_exception_processing          PROTO((void));
-extern tree expand_start_catch_block           PROTO((tree));
-extern void expand_end_catch_block             PROTO((tree));
-extern void expand_builtin_throw               PROTO((void));
-extern tree expand_start_eh_spec               PROTO((void));
-extern void expand_end_eh_spec                 PROTO((tree, tree));
-extern void expand_exception_blocks            PROTO((void));
-extern tree start_anon_func                    PROTO((void));
-extern void end_anon_func                      PROTO((void));
-extern tree build_throw                                PROTO((tree));
-extern void mark_all_runtime_matches            PROTO((void));
+extern void init_exception_processing          PARAMS ((void));
+extern tree expand_start_catch_block           PARAMS ((tree));
+extern void expand_end_catch_block             PARAMS ((tree));
+extern void expand_builtin_throw               PARAMS ((void));
+extern tree expand_start_eh_spec               PARAMS ((void));
+extern void expand_end_eh_spec                 PARAMS ((tree, tree));
+extern void expand_exception_blocks            PARAMS ((void));
+extern tree build_throw                                PARAMS ((tree));
+extern void mark_all_runtime_matches            PARAMS ((void));
+extern int nothrow_libfn_p                     PARAMS ((tree));
 
 /* in expr.c */
-extern void init_cplus_expand                  PROTO((void));
-extern void fixup_result_decl                  PROTO((tree, struct rtx_def *));
-extern int extract_init                                PROTO((tree, tree));
-extern void do_case                            PROTO((tree, tree));
-extern tree cplus_expand_constant               PROTO((tree));
+extern void init_cplus_expand                  PARAMS ((void));
+extern void fixup_result_decl                  PARAMS ((tree, struct rtx_def *));
+extern int extract_init                                PARAMS ((tree, tree));
+extern void do_case                            PARAMS ((tree, tree));
+extern tree cplus_expand_constant               PARAMS ((tree));
 
 /* friend.c */
-extern int is_friend                           PROTO((tree, tree));
-extern void make_friend_class                  PROTO((tree, tree));
-extern void add_friend                          PROTO((tree, tree));
-extern void add_friends                         PROTO((tree, tree, tree));
-extern tree do_friend                          PROTO((tree, tree, tree, tree, tree, enum overload_flags, tree, int));
+extern int is_friend                           PARAMS ((tree, tree));
+extern void make_friend_class                  PARAMS ((tree, tree));
+extern void add_friend                          PARAMS ((tree, tree));
+extern tree do_friend                          PARAMS ((tree, tree, tree, tree, tree, enum overload_flags, tree, int));
 
 /* in init.c */
-extern void init_init_processing               PROTO((void));
-extern void expand_direct_vtbls_init           PROTO((tree, tree, int, int, tree));
-extern tree emit_base_init                     PROTO((tree));
-extern void check_base_init                    PROTO((tree));
-extern void expand_member_init                 PROTO((tree, tree, tree));
-extern tree build_aggr_init                    PROTO((tree, tree, int));
-extern int is_aggr_typedef                     PROTO((tree, int));
-extern int is_aggr_type                                PROTO((tree, int));
-extern tree get_aggr_from_typedef              PROTO((tree, int));
-extern tree get_type_value                     PROTO((tree));
-extern tree build_member_call                  PROTO((tree, tree, tree));
-extern tree build_offset_ref                   PROTO((tree, tree));
-extern tree resolve_offset_ref                 PROTO((tree));
-extern tree decl_constant_value                        PROTO((tree));
-extern tree build_new                          PROTO((tree, tree, tree, int));
-extern tree build_new_1                                PROTO((tree));
-extern tree build_vec_init                     PROTO((tree, tree, tree, tree, int));
-extern tree build_x_delete                     PROTO((tree, int, tree));
-extern tree build_delete                       PROTO((tree, tree, tree, int, int));
-extern tree build_vbase_delete                 PROTO((tree, tree));
-extern tree build_vec_delete                   PROTO((tree, tree, tree, tree, int));
-extern tree create_temporary_var                PROTO((tree));
-extern void begin_init_stmts                    PROTO((tree *, tree *));
-extern tree finish_init_stmts                   PROTO((tree, tree));
+extern void init_init_processing               PARAMS ((void));
+extern void emit_base_init                     PARAMS ((tree));
+extern void expand_member_init                 PARAMS ((tree, tree, tree));
+extern tree build_aggr_init                    PARAMS ((tree, tree, int));
+extern int is_aggr_type                                PARAMS ((tree, int));
+extern tree get_aggr_from_typedef              PARAMS ((tree, int));
+extern tree get_type_value                     PARAMS ((tree));
+extern tree build_member_call                  PARAMS ((tree, tree, tree));
+extern tree build_offset_ref                   PARAMS ((tree, tree));
+extern tree resolve_offset_ref                 PARAMS ((tree));
+extern tree decl_constant_value                        PARAMS ((tree));
+extern tree build_new                          PARAMS ((tree, tree, tree, int));
+extern tree build_vec_init                     PARAMS ((tree, tree, tree, tree, int));
+extern tree build_x_delete                     PARAMS ((tree, int, tree));
+extern tree build_delete                       PARAMS ((tree, tree, tree, int, int));
+extern tree build_vbase_delete                 PARAMS ((tree, tree));
+extern tree build_vec_delete                   PARAMS ((tree, tree, tree, int));
+extern tree create_temporary_var                PARAMS ((tree));
+extern void begin_init_stmts                    PARAMS ((tree *, tree *));
+extern tree finish_init_stmts                   PARAMS ((tree, tree));
+extern void initialize_vtbl_ptrs                PARAMS ((tree, tree));
+extern tree build_java_class_ref                PARAMS ((tree));
 
 /* in input.c */
 
 /* in lex.c */
-extern char *file_name_nondirectory            PROTO((const char *));
-extern tree make_pointer_declarator            PROTO((tree, tree));
-extern tree make_reference_declarator          PROTO((tree, tree));
-extern tree make_call_declarator               PROTO((tree, tree, tree, tree));
-extern void set_quals_and_spec                 PROTO((tree, tree, tree));
-extern const char *operator_name_string                PROTO((tree));
-extern void lang_init                          PROTO((void));
-extern void lang_finish                                PROTO((void));
+extern char *file_name_nondirectory            PARAMS ((const char *));
+extern tree make_pointer_declarator            PARAMS ((tree, tree));
+extern tree make_reference_declarator          PARAMS ((tree, tree));
+extern tree make_call_declarator               PARAMS ((tree, tree, tree, tree));
+extern void set_quals_and_spec                 PARAMS ((tree, tree, tree));
+extern const char *operator_name_string                PARAMS ((tree));
+extern void lang_init                          PARAMS ((void));
+extern void lang_finish                                PARAMS ((void));
 #if 0
-extern void reinit_lang_specific               PROTO((void));
+extern void reinit_lang_specific               PARAMS ((void));
 #endif
-extern void reinit_parse_for_function          PROTO((void));
-extern void print_parse_statistics             PROTO((void));
-extern void extract_interface_info             PROTO((void));
-extern void do_pending_inlines                 PROTO((void));
-extern void process_next_inline                        PROTO((struct pending_inline *));
-extern struct pending_input *save_pending_input PROTO((void));
-extern void restore_pending_input              PROTO((struct pending_input *));
-extern void yyungetc                           PROTO((int, int));
-extern void reinit_parse_for_method            PROTO((int, tree));
-extern void reinit_parse_for_block             PROTO((int, struct obstack *));
-extern tree cons_up_default_function           PROTO((tree, tree, int));
-extern void check_for_missing_semicolon                PROTO((tree));
-extern void note_got_semicolon                 PROTO((tree));
-extern void note_list_got_semicolon            PROTO((tree));
-extern void do_pending_lang_change             PROTO((void));
-extern int identifier_type                     PROTO((tree));
-extern void see_typename                       PROTO((void));
-extern tree do_identifier                      PROTO((tree, int, tree));
-extern tree do_scoped_id                       PROTO((tree, int));
-extern tree identifier_typedecl_value          PROTO((tree));
-extern int real_yylex                          PROTO((void));
-extern int is_rid                              PROTO((tree));
-extern tree build_lang_decl                    PROTO((enum tree_code, tree, tree));
-extern void retrofit_lang_decl                 PROTO((tree));
-extern void copy_lang_decl                     PROTO((tree));
-extern tree cp_make_lang_type                  PROTO((enum tree_code));
-extern void dump_time_statistics               PROTO((void));
-extern void compiler_error                     PVPROTO((const char *, ...))
+extern void reinit_parse_for_function          PARAMS ((void));
+extern void print_parse_statistics             PARAMS ((void));
+extern void extract_interface_info             PARAMS ((void));
+extern void do_pending_inlines                 PARAMS ((void));
+extern void process_next_inline                        PARAMS ((struct pending_inline *));
+extern struct pending_input *save_pending_input PARAMS ((void));
+extern void restore_pending_input              PARAMS ((struct pending_input *));
+extern void yyungetc                           PARAMS ((int, int));
+extern void reinit_parse_for_method            PARAMS ((int, tree));
+extern void reinit_parse_for_block             PARAMS ((int, struct obstack *));
+extern void check_for_missing_semicolon                PARAMS ((tree));
+extern void note_got_semicolon                 PARAMS ((tree));
+extern void note_list_got_semicolon            PARAMS ((tree));
+extern void do_pending_lang_change             PARAMS ((void));
+extern int identifier_type                     PARAMS ((tree));
+extern void see_typename                       PARAMS ((void));
+extern tree do_identifier                      PARAMS ((tree, int, tree));
+extern tree do_scoped_id                       PARAMS ((tree, int));
+extern tree identifier_typedecl_value          PARAMS ((tree));
+extern int real_yylex                          PARAMS ((void));
+extern int is_rid                              PARAMS ((tree));
+extern tree build_lang_decl                    PARAMS ((enum tree_code, tree, tree));
+extern void retrofit_lang_decl                 PARAMS ((tree));
+extern tree copy_decl                           PARAMS ((tree));
+extern void copy_lang_decl                     PARAMS ((tree));
+extern tree cp_make_lang_type                  PARAMS ((enum tree_code));
+extern tree make_aggr_type                     PARAMS ((enum tree_code));
+extern void dump_time_statistics               PARAMS ((void));
+extern void compiler_error                     PARAMS ((const char *, ...))
   ATTRIBUTE_PRINTF_1;
-extern void yyerror                            PROTO((const char *));
-extern void clear_inline_text_obstack          PROTO((void));
-extern void maybe_snarf_defarg                 PROTO((void));
-extern tree snarf_defarg                       PROTO((void));
-extern void add_defarg_fn                      PROTO((tree));
-extern void do_pending_defargs                 PROTO((void));
-extern int identifier_type                     PROTO((tree));
-extern void yyhook                             PROTO((int));
-extern int cp_type_qual_from_rid                PROTO((tree));
+extern void yyerror                            PARAMS ((const char *));
+extern void clear_inline_text_obstack          PARAMS ((void));
+extern void maybe_snarf_defarg                 PARAMS ((void));
+extern tree snarf_defarg                       PARAMS ((void));
+extern void add_defarg_fn                      PARAMS ((tree));
+extern void do_pending_defargs                 PARAMS ((void));
+extern int identifier_type                     PARAMS ((tree));
+extern void yyhook                             PARAMS ((int));
+extern int cp_type_qual_from_rid                PARAMS ((tree));
 
 /* in method.c */
-extern void init_method                                PROTO((void));
-extern void do_inline_function_hair            PROTO((tree, tree));
-extern char *build_overload_name               PROTO((tree, int, int));
-extern tree build_static_name                  PROTO((tree, tree));
-extern tree build_decl_overload                        PROTO((tree, tree, int));
-extern tree build_decl_overload_real            PROTO((tree, tree, tree, tree,
+extern void init_method                                PARAMS ((void));
+extern char *build_overload_name               PARAMS ((tree, int, int));
+extern tree build_static_name                  PARAMS ((tree, tree));
+extern tree build_decl_overload                        PARAMS ((tree, tree, int));
+extern tree build_decl_overload_real            PARAMS ((tree, tree, tree, tree,
                                                       tree, int)); 
-extern void set_mangled_name_for_decl           PROTO((tree));
-extern tree build_typename_overload            PROTO((tree));
-extern tree build_overload_with_type           PROTO((tree, tree));
-extern tree build_destructor_name              PROTO((tree));
-extern tree build_opfncall                     PROTO((enum tree_code, int, tree, tree, tree));
-extern tree hack_identifier                    PROTO((tree, tree));
-extern tree make_thunk                         PROTO((tree, int));
-extern void emit_thunk                         PROTO((tree));
-extern void synthesize_method                  PROTO((tree));
-extern tree get_id_2                           PROTO((const char *, tree));
+extern void set_mangled_name_for_decl           PARAMS ((tree));
+extern tree build_typename_overload            PARAMS ((tree));
+extern tree build_overload_with_type           PARAMS ((tree, tree));
+extern tree build_destructor_name              PARAMS ((tree));
+extern tree build_opfncall                     PARAMS ((enum tree_code, int, tree, tree, tree));
+extern tree hack_identifier                    PARAMS ((tree, tree));
+extern tree make_thunk                         PARAMS ((tree, int, int));
+extern void emit_thunk                         PARAMS ((tree));
+extern void synthesize_method                  PARAMS ((tree));
+extern tree get_id_2                           PARAMS ((const char *, tree));
+extern tree implicitly_declare_fn               PARAMS ((special_function_kind, tree, int));
+
+/* In optimize.c */
+extern void optimize_function                   PARAMS ((tree));
+extern int calls_setjmp_p                       PARAMS ((tree));
 
 /* in pt.c */
-extern void init_pt                             PROTO ((void));
-extern void check_template_shadow              PROTO ((tree));
-extern tree innermost_args                     PROTO ((tree));
-extern tree tsubst                             PROTO ((tree, tree, int, tree));
-extern tree tsubst_expr                                PROTO ((tree, tree, int, tree));
-extern tree tsubst_copy                                PROTO ((tree, tree, int, tree));
-extern void maybe_begin_member_template_processing PROTO((tree));
-extern void maybe_end_member_template_processing PROTO((void));
-extern tree finish_member_template_decl         PROTO((tree));
-extern void begin_template_parm_list           PROTO((void));
-extern void begin_specialization                PROTO((void));
-extern void reset_specialization                PROTO((void));
-extern void end_specialization                  PROTO((void));
-extern void begin_explicit_instantiation        PROTO((void));
-extern void end_explicit_instantiation          PROTO((void));
-extern tree check_explicit_specialization       PROTO((tree, tree, int, int));
-extern tree process_template_parm              PROTO((tree, tree));
-extern tree end_template_parm_list             PROTO((tree));
-extern void end_template_decl                  PROTO((void));
-extern tree current_template_args              PROTO((void));
-extern tree push_template_decl                 PROTO((tree));
-extern tree push_template_decl_real             PROTO((tree, int));
-extern void redeclare_class_template            PROTO((tree, tree));
-extern tree lookup_template_class              PROTO((tree, tree, tree, tree, int));
-extern tree lookup_template_function            PROTO((tree, tree));
-extern int uses_template_parms                 PROTO((tree));
-extern tree instantiate_class_template         PROTO((tree));
-extern tree instantiate_template               PROTO((tree, tree));
-extern void overload_template_name             PROTO((tree));
-extern int fn_type_unification                  PROTO((tree, tree, tree, tree, tree, unification_kind_t));
-struct tinst_level *tinst_for_decl             PROTO((void));
-extern void mark_decl_instantiated             PROTO((tree, int));
-extern int more_specialized                    PROTO((tree, tree, tree));
-extern void mark_class_instantiated            PROTO((tree, int));
-extern void do_decl_instantiation              PROTO((tree, tree, tree));
-extern void do_type_instantiation              PROTO((tree, tree));
-extern tree instantiate_decl                   PROTO((tree));
-extern tree get_bindings                       PROTO((tree, tree, tree));
-extern void add_tree                           PROTO((tree));
-extern void add_maybe_template                 PROTO((tree, tree));
-extern void pop_tinst_level                    PROTO((void));
-extern int more_specialized_class              PROTO((tree, tree));
-extern int is_member_template                   PROTO((tree));
-extern int template_parms_equal                 PROTO((tree, tree));
-extern int comp_template_parms                  PROTO((tree, tree));
-extern int template_class_depth                 PROTO((tree));
-extern int is_specialization_of                 PROTO((tree, tree));
-extern int comp_template_args                   PROTO((tree, tree));
-extern void maybe_process_partial_specialization PROTO((tree));
-extern void maybe_check_template_type           PROTO((tree));
-extern tree most_specialized_instantiation      PROTO((tree, tree));
-extern void print_candidates                    PROTO((tree));
-extern int instantiate_pending_templates        PROTO((void));
-extern tree tsubst_default_argument             PROTO((tree, tree, tree));
-extern tree most_general_template              PROTO((tree));
+extern void init_pt                             PARAMS ((void));
+extern void check_template_shadow              PARAMS ((tree));
+extern tree innermost_args                     PARAMS ((tree));
+extern tree tsubst                             PARAMS ((tree, tree, int, tree));
+extern tree tsubst_expr                                PARAMS ((tree, tree, int, tree));
+extern tree tsubst_copy                                PARAMS ((tree, tree, int, tree));
+extern void maybe_begin_member_template_processing PARAMS ((tree));
+extern void maybe_end_member_template_processing PARAMS ((void));
+extern tree finish_member_template_decl         PARAMS ((tree));
+extern void begin_template_parm_list           PARAMS ((void));
+extern void begin_specialization                PARAMS ((void));
+extern void reset_specialization                PARAMS ((void));
+extern void end_specialization                  PARAMS ((void));
+extern void begin_explicit_instantiation        PARAMS ((void));
+extern void end_explicit_instantiation          PARAMS ((void));
+extern tree check_explicit_specialization       PARAMS ((tree, tree, int, int));
+extern tree process_template_parm              PARAMS ((tree, tree));
+extern tree end_template_parm_list             PARAMS ((tree));
+extern void end_template_decl                  PARAMS ((void));
+extern tree current_template_args              PARAMS ((void));
+extern tree push_template_decl                 PARAMS ((tree));
+extern tree push_template_decl_real             PARAMS ((tree, int));
+extern void redeclare_class_template            PARAMS ((tree, tree));
+extern tree lookup_template_class              PARAMS ((tree, tree, tree, tree, int));
+extern tree lookup_template_function            PARAMS ((tree, tree));
+extern int uses_template_parms                 PARAMS ((tree));
+extern tree instantiate_class_template         PARAMS ((tree));
+extern tree instantiate_template               PARAMS ((tree, tree));
+extern void overload_template_name             PARAMS ((tree));
+extern int fn_type_unification                  PARAMS ((tree, tree, tree, tree, tree, unification_kind_t));
+struct tinst_level *tinst_for_decl             PARAMS ((void));
+extern void mark_decl_instantiated             PARAMS ((tree, int));
+extern int more_specialized                    PARAMS ((tree, tree, tree));
+extern void mark_class_instantiated            PARAMS ((tree, int));
+extern void do_decl_instantiation              PARAMS ((tree, tree, tree));
+extern void do_type_instantiation              PARAMS ((tree, tree));
+extern tree instantiate_decl                   PARAMS ((tree, int));
+extern tree get_bindings                       PARAMS ((tree, tree, tree));
+extern void add_tree                           PARAMS ((tree));
+extern void add_maybe_template                 PARAMS ((tree, tree));
+extern void pop_tinst_level                    PARAMS ((void));
+extern int more_specialized_class              PARAMS ((tree, tree));
+extern int is_member_template                   PARAMS ((tree));
+extern int template_parms_equal                 PARAMS ((tree, tree));
+extern int comp_template_parms                  PARAMS ((tree, tree));
+extern int template_class_depth                 PARAMS ((tree));
+extern int is_specialization_of                 PARAMS ((tree, tree));
+extern int comp_template_args                   PARAMS ((tree, tree));
+extern void maybe_process_partial_specialization PARAMS ((tree));
+extern void maybe_check_template_type           PARAMS ((tree));
+extern tree most_specialized_instantiation      PARAMS ((tree, tree));
+extern void print_candidates                    PARAMS ((tree));
+extern int instantiate_pending_templates        PARAMS ((void));
+extern tree tsubst_default_argument             PARAMS ((tree, tree, tree));
+extern tree most_general_template              PARAMS ((tree));
 
 extern int processing_template_parmlist;
 
 /* in repo.c */
-extern void repo_template_used                 PROTO((tree));
-extern void repo_template_instantiated         PROTO((tree, int));
-extern void init_repo                          PROTO((const char *));
-extern void finish_repo                                PROTO((void));
+extern void repo_template_used                 PARAMS ((tree));
+extern void repo_template_instantiated         PARAMS ((tree, int));
+extern void init_repo                          PARAMS ((const char *));
+extern void finish_repo                                PARAMS ((void));
 
 /* in rtti.c */
-extern void init_rtti_processing               PROTO((void));
-extern tree get_tinfo_fn_dynamic               PROTO((tree));
-extern tree build_typeid                       PROTO((tree));
-extern tree build_x_typeid                     PROTO((tree));
-extern tree get_tinfo_fn                       PROTO((tree));
-extern tree get_typeid                         PROTO((tree));
-extern tree get_typeid_1                       PROTO((tree));
-extern tree build_dynamic_cast                 PROTO((tree, tree));
-extern void synthesize_tinfo_fn                        PROTO((tree));
+extern void init_rtti_processing               PARAMS((void));
+extern tree build_typeid                       PARAMS((tree));
+extern tree get_tinfo_decl                      PARAMS((tree));
+extern tree get_typeid                         PARAMS((tree));
+extern tree get_typeid_1                       PARAMS((tree));
+extern tree build_dynamic_cast                 PARAMS((tree, tree));
+extern void synthesize_tinfo_fn                        PARAMS((tree));
+extern void emit_support_tinfos                 PARAMS((void));
+extern int tinfo_decl_p                         PARAMS((tree, void *));
+extern int emit_tinfo_decl                      PARAMS((tree *, void *));
 
 /* in search.c */
-extern int types_overlap_p                     PROTO((tree, tree));
-extern tree get_vbase                          PROTO((tree, tree));
-extern tree get_binfo                          PROTO((tree, tree, int));
-extern int get_base_distance                   PROTO((tree, tree, int, tree *));
-extern tree get_dynamic_cast_base_type          PROTO((tree, tree));
-extern int accessible_p                         PROTO((tree, tree));
-extern tree lookup_field                       PROTO((tree, tree, int, int));
-extern int lookup_fnfields_1                    PROTO((tree, tree));
-extern tree lookup_fnfields                    PROTO((tree, tree, int));
-extern tree lookup_member                      PROTO((tree, tree, int, int));
-extern tree lookup_nested_tag                  PROTO((tree, tree));
-extern tree get_matching_virtual               PROTO((tree, tree, int));
-extern tree get_abstract_virtuals              PROTO((tree));
-extern tree init_vbase_pointers                        PROTO((tree, tree));
-extern void expand_indirect_vtbls_init         PROTO((tree, tree, tree));
-extern void clear_search_slots                 PROTO((tree));
-extern tree get_vbase_types                    PROTO((tree));
-extern void note_debug_info_needed             PROTO((tree));
-extern void push_class_decls                   PROTO((tree));
-extern void pop_class_decls                    PROTO((void));
-extern void unuse_fields                       PROTO((tree));
-extern void print_search_statistics            PROTO((void));
-extern void init_search_processing             PROTO((void));
-extern void reinit_search_statistics           PROTO((void));
-extern tree current_scope                      PROTO((void));
-extern int at_function_scope_p                  PROTO((void));
-extern tree lookup_conversions                 PROTO((tree));
-extern tree binfo_for_vtable                   PROTO((tree));
-extern int  binfo_from_vbase                   PROTO((tree));
-extern tree dfs_walk                            PROTO((tree, 
+extern int types_overlap_p                     PARAMS ((tree, tree));
+extern tree get_vbase                          PARAMS ((tree, tree));
+extern tree get_binfo                          PARAMS ((tree, tree, int));
+extern int get_base_distance                   PARAMS ((tree, tree, int, tree *));
+extern tree get_dynamic_cast_base_type          PARAMS ((tree, tree));
+extern void type_access_control                        PARAMS ((tree, tree));
+extern int accessible_p                         PARAMS ((tree, tree));
+extern tree lookup_field                       PARAMS ((tree, tree, int, int));
+extern int lookup_fnfields_1                    PARAMS ((tree, tree));
+extern tree lookup_fnfields                    PARAMS ((tree, tree, int));
+extern tree lookup_member                      PARAMS ((tree, tree, int, int));
+extern tree lookup_nested_tag                  PARAMS ((tree, tree));
+extern tree get_matching_virtual               PARAMS ((tree, tree, int));
+extern void get_pure_virtuals                  PARAMS ((tree));
+extern tree init_vbase_pointers                        PARAMS ((tree, tree));
+extern void expand_indirect_vtbls_init         PARAMS ((tree, tree));
+extern void clear_search_slots                 PARAMS ((tree));
+extern void get_vbase_types                    PARAMS ((tree));
+extern void maybe_suppress_debug_info          PARAMS ((tree));
+extern void note_debug_info_needed             PARAMS ((tree));
+extern void push_class_decls                   PARAMS ((tree));
+extern void pop_class_decls                    PARAMS ((void));
+extern void unuse_fields                       PARAMS ((tree));
+extern void print_search_statistics            PARAMS ((void));
+extern void init_search_processing             PARAMS ((void));
+extern void reinit_search_statistics           PARAMS ((void));
+extern tree current_scope                      PARAMS ((void));
+extern int at_function_scope_p                  PARAMS ((void));
+extern tree lookup_conversions                 PARAMS ((tree));
+extern tree binfo_for_vtable                   PARAMS ((tree));
+extern int  binfo_from_vbase                   PARAMS ((tree));
+extern tree dfs_walk                            PARAMS ((tree, 
                                                       tree (*)(tree, void *),
                                                       tree (*) (tree, void *),
                                                       void *));
-extern tree dfs_unmark                          PROTO((tree, void *));
-extern tree markedp                             PROTO((tree, void *));
+extern tree dfs_walk_real                      PARAMS ((tree, 
+                                                      tree (*) (tree, void *),
+                                                      tree (*) (tree, void *),
+                                                      tree (*) (tree, void *),
+                                                      void *));
+extern tree dfs_unmark                          PARAMS ((tree, void *));
+extern tree dfs_vtable_path_unmark              PARAMS ((tree, void *));
+extern tree markedp                             PARAMS ((tree, void *));
+extern tree unmarkedp                           PARAMS ((tree, void *));
+extern tree dfs_skip_nonprimary_vbases_unmarkedp PARAMS ((tree, void *));
+extern tree dfs_skip_nonprimary_vbases_markedp  PARAMS ((tree, void *));
+extern tree dfs_unmarked_real_bases_queue_p     PARAMS ((tree, void *));
+extern tree dfs_marked_real_bases_queue_p       PARAMS ((tree, void *));
+extern tree dfs_skip_vbases                     PARAMS ((tree, void *));
+extern tree marked_vtable_pathp                 PARAMS ((tree, void *));
+extern tree unmarked_vtable_pathp               PARAMS ((tree, void *));
+extern tree convert_pointer_to_vbase            PARAMS ((tree, tree));
+extern tree find_vbase_instance                 PARAMS ((tree, tree));
 
 /* in semantics.c */
-extern void finish_expr_stmt                    PROTO((tree));
-extern tree begin_if_stmt                       PROTO((void));
-extern void finish_if_stmt_cond                 PROTO((tree, tree));
-extern tree finish_then_clause                  PROTO((tree));
-extern void begin_else_clause                   PROTO((void));
-extern void finish_else_clause                  PROTO((tree));
-extern void finish_if_stmt                      PROTO((void));
-extern tree begin_while_stmt                    PROTO((void));
-extern void finish_while_stmt_cond              PROTO((tree, tree));
-extern void finish_while_stmt                   PROTO((tree));
-extern tree begin_do_stmt                       PROTO((void));
-extern void finish_do_body                      PROTO((tree));
-extern void finish_do_stmt                      PROTO((tree, tree));
-extern void finish_return_stmt                  PROTO((tree));
-extern tree begin_for_stmt                      PROTO((void));
-extern void finish_for_init_stmt                PROTO((tree));
-extern void finish_for_cond                     PROTO((tree, tree));
-extern void finish_for_expr                     PROTO((tree, tree));
-extern void finish_for_stmt                     PROTO((tree, tree));
-extern void finish_break_stmt                   PROTO((void));
-extern void finish_continue_stmt                PROTO((void));
-extern tree begin_switch_stmt                   PROTO((void));
-extern void finish_switch_cond                  PROTO((tree, tree));
-extern void finish_switch_stmt                  PROTO((tree, tree));
-extern void finish_case_label                   PROTO((tree, tree));
-extern void finish_goto_stmt                    PROTO((tree));
-extern tree begin_try_block                     PROTO((void));
-extern void finish_try_block                    PROTO((tree));
-extern void finish_handler_sequence             PROTO((tree));
-extern tree begin_function_try_block            PROTO((void));
-extern void finish_function_try_block           PROTO((tree));
-extern void finish_function_handler_sequence    PROTO((tree));
-extern void finish_cleanup_try_block            PROTO((tree));
-extern tree begin_handler                       PROTO((void));
-extern tree finish_handler_parms                PROTO((tree, tree));
-extern void begin_catch_block                   PROTO((tree));
-extern void finish_handler                      PROTO((tree, tree));
-extern void finish_cleanup                      PROTO((tree, tree));
-extern tree begin_compound_stmt                 PROTO((int));
-extern tree finish_compound_stmt                PROTO((int, tree));
-extern void finish_asm_stmt                     PROTO((tree, tree, tree, tree, tree));
-extern void finish_label_stmt                   PROTO((tree));
-extern void finish_label_decl                   PROTO((tree));
-extern void finish_subobject                    PROTO((tree));
-extern tree finish_parenthesized_expr           PROTO((tree));
-extern tree begin_stmt_expr                     PROTO((void));
-extern tree finish_stmt_expr                    PROTO((tree));
-extern tree finish_call_expr                    PROTO((tree, tree, int));
-extern tree finish_increment_expr               PROTO((tree, enum tree_code));
-extern tree finish_this_expr                    PROTO((void));
-extern tree finish_object_call_expr             PROTO((tree, tree, tree));
-extern tree finish_qualified_object_call_expr   PROTO((tree, tree, tree));
-extern tree finish_pseudo_destructor_call_expr  PROTO((tree, tree, tree));
-extern tree finish_qualified_call_expr          PROTO ((tree, tree));
-extern tree finish_label_address_expr           PROTO((tree));
-extern tree finish_unary_op_expr                PROTO((enum tree_code, tree));
-extern tree finish_id_expr                      PROTO((tree));
-extern int begin_function_definition            PROTO((tree, tree));
-extern tree begin_constructor_declarator        PROTO((tree, tree));
-extern tree finish_declarator                   PROTO((tree, tree, tree, tree, int));
-extern void finish_translation_unit             PROTO((void));
-extern tree finish_template_type_parm           PROTO((tree, tree));
-extern tree finish_template_template_parm       PROTO((tree, tree));
-extern tree finish_parmlist                     PROTO((tree, int));
-extern tree begin_class_definition              PROTO((tree));
-extern tree finish_class_definition             PROTO((tree, tree, int, int));
-extern void finish_default_args                 PROTO((void));
-extern void begin_inline_definitions            PROTO((void));
-extern void finish_inline_definitions           PROTO((void));
-extern tree finish_member_class_template        PROTO((tree));
-extern void finish_template_decl                PROTO((tree));
-extern tree finish_template_type                PROTO((tree, tree, int));
-extern void enter_scope_of                      PROTO((tree));
-extern tree finish_base_specifier               PROTO((tree, tree));
-extern void finish_member_declaration           PROTO((tree));
-extern void check_multiple_declarators          PROTO((void));
-extern tree finish_typeof                      PROTO((tree));
-extern void add_decl_stmt                       PROTO((tree));
-extern void finish_decl_cleanup                 PROTO((tree, tree));
-extern void finish_named_return_value           PROTO((tree, tree));
-extern tree expand_stmt                         PROTO((tree));
-extern void expand_body                         PROTO((tree));
-extern void begin_stmt_tree                     PROTO((tree *));
-extern void finish_stmt_tree                    PROTO((tree *));
-extern void prep_stmt                           PROTO((tree));
-extern void add_scope_stmt                      PROTO((int, int));
-extern void do_pushlevel                        PROTO((void));
-extern tree do_poplevel                         PROTO((void));
+extern void finish_expr_stmt                    PARAMS ((tree));
+extern tree begin_if_stmt                       PARAMS ((void));
+extern void finish_if_stmt_cond                 PARAMS ((tree, tree));
+extern tree finish_then_clause                  PARAMS ((tree));
+extern void begin_else_clause                   PARAMS ((void));
+extern void finish_else_clause                  PARAMS ((tree));
+extern void finish_if_stmt                      PARAMS ((void));
+extern tree begin_while_stmt                    PARAMS ((void));
+extern void finish_while_stmt_cond              PARAMS ((tree, tree));
+extern void finish_while_stmt                   PARAMS ((tree));
+extern tree begin_do_stmt                       PARAMS ((void));
+extern void finish_do_body                      PARAMS ((tree));
+extern void finish_do_stmt                      PARAMS ((tree, tree));
+extern void finish_return_stmt                  PARAMS ((tree));
+extern tree begin_for_stmt                      PARAMS ((void));
+extern void finish_for_init_stmt                PARAMS ((tree));
+extern void finish_for_cond                     PARAMS ((tree, tree));
+extern void finish_for_expr                     PARAMS ((tree, tree));
+extern void finish_for_stmt                     PARAMS ((tree, tree));
+extern void finish_break_stmt                   PARAMS ((void));
+extern void finish_continue_stmt                PARAMS ((void));
+extern tree begin_switch_stmt                   PARAMS ((void));
+extern void finish_switch_cond                  PARAMS ((tree, tree));
+extern void finish_switch_stmt                  PARAMS ((tree, tree));
+extern void finish_case_label                   PARAMS ((tree, tree));
+extern void finish_goto_stmt                    PARAMS ((tree));
+extern tree begin_try_block                     PARAMS ((void));
+extern void finish_try_block                    PARAMS ((tree));
+extern void finish_handler_sequence             PARAMS ((tree));
+extern tree begin_function_try_block            PARAMS ((void));
+extern void finish_function_try_block           PARAMS ((tree));
+extern void finish_function_handler_sequence    PARAMS ((tree));
+extern void finish_cleanup_try_block            PARAMS ((tree));
+extern tree begin_handler                       PARAMS ((void));
+extern tree finish_handler_parms                PARAMS ((tree, tree));
+extern void begin_catch_block                   PARAMS ((tree));
+extern void finish_handler                      PARAMS ((tree, tree));
+extern void finish_cleanup                      PARAMS ((tree, tree));
+extern tree begin_compound_stmt                 PARAMS ((int));
+extern tree finish_compound_stmt                PARAMS ((int, tree));
+extern void finish_asm_stmt                     PARAMS ((tree, tree, tree, tree, tree));
+extern void finish_label_stmt                   PARAMS ((tree));
+extern void finish_label_decl                   PARAMS ((tree));
+extern void finish_subobject                    PARAMS ((tree));
+extern tree finish_parenthesized_expr           PARAMS ((tree));
+extern tree begin_stmt_expr                     PARAMS ((void));
+extern tree finish_stmt_expr                    PARAMS ((tree));
+extern tree finish_call_expr                    PARAMS ((tree, tree, int));
+extern tree finish_increment_expr               PARAMS ((tree, enum tree_code));
+extern tree finish_this_expr                    PARAMS ((void));
+extern tree finish_object_call_expr             PARAMS ((tree, tree, tree));
+extern tree finish_qualified_object_call_expr   PARAMS ((tree, tree, tree));
+extern tree finish_pseudo_destructor_call_expr  PARAMS ((tree, tree, tree));
+extern tree finish_qualified_call_expr          PARAMS ((tree, tree));
+extern tree finish_label_address_expr           PARAMS ((tree));
+extern tree finish_unary_op_expr                PARAMS ((enum tree_code, tree));
+extern tree finish_id_expr                      PARAMS ((tree));
+extern void save_type_access_control           PARAMS ((tree));
+extern void decl_type_access_control           PARAMS ((tree));
+extern int begin_function_definition            PARAMS ((tree, tree));
+extern tree begin_constructor_declarator        PARAMS ((tree, tree));
+extern tree finish_declarator                   PARAMS ((tree, tree, tree, tree, int));
+extern void finish_translation_unit             PARAMS ((void));
+extern tree finish_template_type_parm           PARAMS ((tree, tree));
+extern tree finish_template_template_parm       PARAMS ((tree, tree));
+extern tree finish_parmlist                     PARAMS ((tree, int));
+extern tree begin_class_definition              PARAMS ((tree));
+extern tree finish_class_definition             PARAMS ((tree, tree, int, int));
+extern void finish_default_args                 PARAMS ((void));
+extern void begin_inline_definitions            PARAMS ((void));
+extern void finish_inline_definitions           PARAMS ((void));
+extern tree finish_member_class_template        PARAMS ((tree));
+extern void finish_template_decl                PARAMS ((tree));
+extern tree finish_template_type                PARAMS ((tree, tree, int));
+extern void enter_scope_of                      PARAMS ((tree));
+extern tree finish_base_specifier               PARAMS ((tree, tree));
+extern void finish_member_declaration           PARAMS ((tree));
+extern void check_multiple_declarators          PARAMS ((void));
+extern tree finish_typeof                      PARAMS ((tree));
+extern void add_decl_stmt                       PARAMS ((tree));
+extern void finish_decl_cleanup                 PARAMS ((tree, tree));
+extern void finish_named_return_value           PARAMS ((tree, tree));
+extern tree expand_stmt                         PARAMS ((tree));
+extern void expand_body                         PARAMS ((tree));
+extern void begin_stmt_tree                     PARAMS ((tree *));
+extern void finish_stmt_tree                    PARAMS ((tree *));
+extern void prep_stmt                           PARAMS ((tree));
+extern tree add_scope_stmt                      PARAMS ((int, int));
+extern void do_pushlevel                        PARAMS ((void));
+extern tree do_poplevel                         PARAMS ((void));
 /* Non-zero if we are presently building a statement tree, rather
    than expanding each statement as we encounter it.  */
 #define building_stmt_tree() (last_tree != NULL_TREE)
 
 /* in spew.c */
-extern void init_spew                          PROTO((void));
-extern int peekyylex                           PROTO((void));
-extern int yylex                               PROTO((void));
-extern tree arbitrate_lookup                   PROTO((tree, tree, tree));
+extern void init_spew                          PARAMS ((void));
+extern int peekyylex                           PARAMS ((void));
+extern int yylex                               PARAMS ((void));
+extern tree arbitrate_lookup                   PARAMS ((tree, tree, tree));
 
 /* in tree.c */
-extern void init_tree                          PROTO((void));
-extern void cplus_unsave_expr_now               PROTO((tree));
-extern int pod_type_p                          PROTO((tree));
-extern void unshare_base_binfos                        PROTO((tree));
-extern int member_p                            PROTO((tree));
-extern cp_lvalue_kind real_lvalue_p            PROTO((tree));
-extern tree build_min                          PVPROTO((enum tree_code, tree, ...));
-extern tree build_min_nt                       PVPROTO((enum tree_code, ...));
-extern tree min_tree_cons                      PROTO((tree, tree, tree));
-extern int lvalue_p                            PROTO((tree));
-extern int lvalue_or_else                      PROTO((tree, const char *));
-extern tree build_cplus_new                    PROTO((tree, tree));
-extern tree get_target_expr                    PROTO((tree));
-extern tree break_out_cleanups                 PROTO((tree));
-extern tree break_out_calls                    PROTO((tree));
-extern tree build_cplus_method_type            PROTO((tree, tree, tree));
-extern tree build_cplus_staticfn_type          PROTO((tree, tree, tree));
-extern tree build_cplus_array_type             PROTO((tree, tree));
-extern int layout_basetypes                    PROTO((tree, int));
-extern tree build_vbase_pointer_fields         PROTO((tree));
-extern tree build_base_fields                  PROTO((tree));
-extern tree hash_tree_cons                     PROTO((tree, tree, tree));
-extern tree hash_tree_chain                    PROTO((tree, tree));
-extern tree hash_chainon                       PROTO((tree, tree));
-extern tree make_binfo                         PROTO((tree, tree, tree, tree));
-extern tree binfo_value                                PROTO((tree, tree));
-extern tree reverse_path                       PROTO((tree));
-extern int count_functions                     PROTO((tree));
-extern int is_overloaded_fn                    PROTO((tree));
-extern tree get_first_fn                       PROTO((tree));
-extern int bound_pmf_p                         PROTO((tree));
-extern tree ovl_cons                            PROTO((tree, tree));
-extern tree scratch_ovl_cons                    PROTO((tree, tree));
-extern int ovl_member                           PROTO((tree, tree));
-extern tree build_overload                      PROTO((tree, tree));
-extern tree fnaddr_from_vtable_entry           PROTO((tree));
-extern tree function_arg_chain                 PROTO((tree));
-extern int promotes_to_aggr_type               PROTO((tree, enum tree_code));
-extern int is_aggr_type_2                      PROTO((tree, tree));
-extern const char *lang_printable_name         PROTO((tree, int));
-extern tree build_exception_variant            PROTO((tree, tree));
-extern tree copy_template_template_parm                PROTO((tree));
-extern void print_lang_statistics              PROTO((void));
-extern void __eprintf
-       PROTO((const char *, const char *, unsigned, const char *));
-extern tree array_type_nelts_total             PROTO((tree));
-extern tree array_type_nelts_top               PROTO((tree));
-extern tree break_out_target_exprs             PROTO((tree));
-extern tree get_type_decl                      PROTO((tree));
-extern tree vec_binfo_member                   PROTO((tree, tree));
-extern tree hack_decl_function_context                 PROTO((tree));
-extern tree decl_namespace_context             PROTO((tree));
-extern tree lvalue_type                                PROTO((tree));
-extern tree error_type                         PROTO((tree));
-extern tree build_ptr_wrapper                  PROTO((void *));
-extern tree build_expr_ptr_wrapper             PROTO((void *));
-extern tree build_int_wrapper                  PROTO((int));
-extern tree build_srcloc_here                  PROTO((void));
-extern int varargs_function_p                  PROTO((tree));
-extern int really_overloaded_fn                        PROTO((tree));
-extern int cp_tree_equal                       PROTO((tree, tree));
-extern int can_free                            PROTO((struct obstack *, tree));
-extern tree no_linkage_check                   PROTO((tree));
-extern void debug_binfo                                PROTO((tree));
-extern void push_expression_obstack            PROTO((void));
-extern void push_permanent_obstack              PROTO((void));
-extern tree build_dummy_object                 PROTO((tree));
-extern tree maybe_dummy_object                 PROTO((tree, tree *));
-extern int is_dummy_object                     PROTO((tree));
-typedef tree (*walk_tree_fn)                    PROTO((tree *, int *, void *));
-extern tree walk_tree                           PROTO((tree *, walk_tree_fn, void *));
-extern int cp_valid_lang_attribute             PROTO((tree, tree, tree, tree));
-extern tree make_ptrmem_cst                     PROTO((tree, tree));
-extern tree cp_build_qualified_type_real        PROTO((tree, int, int));
+extern void init_tree                          PARAMS ((void));
+extern int pod_type_p                          PARAMS ((tree));
+extern void unshare_base_binfos                        PARAMS ((tree));
+extern int member_p                            PARAMS ((tree));
+extern cp_lvalue_kind real_lvalue_p            PARAMS ((tree));
+extern tree build_min                          PARAMS ((enum tree_code, tree, ...));
+extern tree build_min_nt                       PARAMS ((enum tree_code, ...));
+extern int lvalue_p                            PARAMS ((tree));
+extern int lvalue_or_else                      PARAMS ((tree, const char *));
+extern tree build_cplus_new                    PARAMS ((tree, tree));
+extern tree get_target_expr                    PARAMS ((tree));
+extern tree break_out_cleanups                 PARAMS ((tree));
+extern tree break_out_calls                    PARAMS ((tree));
+extern tree build_cplus_method_type            PARAMS ((tree, tree, tree));
+extern tree build_cplus_staticfn_type          PARAMS ((tree, tree, tree));
+extern tree build_cplus_array_type             PARAMS ((tree, tree));
+extern tree hash_tree_cons                     PARAMS ((tree, tree, tree));
+extern tree hash_tree_chain                    PARAMS ((tree, tree));
+extern tree hash_chainon                       PARAMS ((tree, tree));
+extern tree make_binfo                         PARAMS ((tree, tree, tree, tree));
+extern tree binfo_value                                PARAMS ((tree, tree));
+extern tree reverse_path                       PARAMS ((tree));
+extern int count_functions                     PARAMS ((tree));
+extern int is_overloaded_fn                    PARAMS ((tree));
+extern tree get_first_fn                       PARAMS ((tree));
+extern int bound_pmf_p                         PARAMS ((tree));
+extern tree ovl_cons                            PARAMS ((tree, tree));
+extern int ovl_member                           PARAMS ((tree, tree));
+extern tree build_overload                      PARAMS ((tree, tree));
+extern tree fnaddr_from_vtable_entry           PARAMS ((tree));
+extern tree function_arg_chain                 PARAMS ((tree));
+extern int promotes_to_aggr_type               PARAMS ((tree, enum tree_code));
+extern int is_aggr_type_2                      PARAMS ((tree, tree));
+extern const char *lang_printable_name         PARAMS ((tree, int));
+extern tree build_exception_variant            PARAMS ((tree, tree));
+extern tree copy_template_template_parm                PARAMS ((tree));
+extern void print_lang_statistics              PARAMS ((void));
+extern tree array_type_nelts_total             PARAMS ((tree));
+extern tree array_type_nelts_top               PARAMS ((tree));
+extern tree break_out_target_exprs             PARAMS ((tree));
+extern tree get_type_decl                      PARAMS ((tree));
+extern tree vec_binfo_member                   PARAMS ((tree, tree));
+extern tree decl_namespace_context             PARAMS ((tree));
+extern tree lvalue_type                                PARAMS ((tree));
+extern tree error_type                         PARAMS ((tree));
+extern tree build_ptr_wrapper                  PARAMS ((void *));
+extern tree build_expr_ptr_wrapper             PARAMS ((void *));
+extern tree build_int_wrapper                  PARAMS ((int));
+extern tree build_srcloc_here                  PARAMS ((void));
+extern int varargs_function_p                  PARAMS ((tree));
+extern int really_overloaded_fn                        PARAMS ((tree));
+extern int cp_tree_equal                       PARAMS ((tree, tree));
+extern int can_free                            PARAMS ((struct obstack *, tree));
+extern tree no_linkage_check                   PARAMS ((tree));
+extern void debug_binfo                                PARAMS ((tree));
+extern tree build_dummy_object                 PARAMS ((tree));
+extern tree maybe_dummy_object                 PARAMS ((tree, tree *));
+extern int is_dummy_object                     PARAMS ((tree));
+typedef tree (*walk_tree_fn)                    PARAMS ((tree *, int *, void *));
+extern tree walk_tree                           PARAMS ((tree *, walk_tree_fn, void *));
+extern tree copy_tree_r                         PARAMS ((tree *, int *, void *));
+extern int cp_valid_lang_attribute             PARAMS ((tree, tree, tree, tree));
+extern tree make_ptrmem_cst                     PARAMS ((tree, tree));
+extern tree cp_build_qualified_type_real        PARAMS ((tree, int, int));
+extern void remap_save_expr                     PARAMS ((tree *, splay_tree, tree, int *));
 #define cp_build_qualified_type(TYPE, QUALS) \
   cp_build_qualified_type_real ((TYPE), (QUALS), /*complain=*/1)
-
-#define scratchalloc expralloc
-#define build_scratch_list build_expr_list
-#define push_scratch_obstack push_expression_obstack
+extern tree build_shared_int_cst                PARAMS ((int));
 
 /* in typeck.c */
-extern int string_conv_p                       PROTO((tree, tree, int));
-extern tree condition_conversion               PROTO((tree));
-extern tree target_type                                PROTO((tree));
-extern tree require_complete_type              PROTO((tree));
-extern tree complete_type                      PROTO((tree));
-extern tree complete_type_or_else               PROTO((tree, tree));
-extern int type_unknown_p                      PROTO((tree));
-extern int fntype_p                            PROTO((tree));
-extern tree commonparms                                PROTO((tree, tree));
-extern tree original_type                      PROTO((tree));
-extern tree common_type                                PROTO((tree, tree));
-extern int comp_except_specs                   PROTO((tree, tree, int));
-extern int comptypes                           PROTO((tree, tree, int));
-extern int comp_target_types                   PROTO((tree, tree, int));
-extern int compparms                           PROTO((tree, tree));
-extern int comp_target_types                   PROTO((tree, tree, int));
-extern int comp_cv_qualification                PROTO((tree, tree));
-extern int comp_cv_qual_signature               PROTO((tree, tree));
-extern tree unsigned_type                      PROTO((tree));
-extern tree signed_type                                PROTO((tree));
-extern tree signed_or_unsigned_type            PROTO((int, tree));
-extern tree expr_sizeof                                PROTO((tree));
-extern tree c_sizeof                           PROTO((tree));
-extern tree c_sizeof_nowarn                    PROTO((tree));
-extern tree c_alignof                          PROTO((tree));
-extern tree inline_conversion                  PROTO((tree));
-extern tree decay_conversion                   PROTO((tree));
-extern tree default_conversion                 PROTO((tree));
-extern tree build_object_ref                   PROTO((tree, tree, tree));
-extern tree build_component_ref_1              PROTO((tree, tree, int));
-extern tree build_component_ref                        PROTO((tree, tree, tree, int));
-extern tree build_x_component_ref              PROTO((tree, tree, tree, int));
-extern tree build_x_indirect_ref               PROTO((tree, const char *));
-extern tree build_indirect_ref                 PROTO((tree, const char *));
-extern tree build_array_ref                    PROTO((tree, tree));
-extern tree build_x_function_call              PROTO((tree, tree, tree));
-extern tree get_member_function_from_ptrfunc   PROTO((tree *, tree));
-extern tree build_function_call_real           PROTO((tree, tree, int, int));
-extern tree build_function_call                        PROTO((tree, tree));
-extern tree build_function_call_maybe          PROTO((tree, tree));
-extern tree convert_arguments                  PROTO((tree, tree, tree, int));
-extern tree build_x_binary_op                  PROTO((enum tree_code, tree, tree));
-extern tree build_binary_op                    PROTO((enum tree_code, tree, tree));
-extern tree build_binary_op_nodefault          PROTO((enum tree_code, tree, tree, enum tree_code));
-extern tree build_x_unary_op                   PROTO((enum tree_code, tree));
-extern tree build_unary_op                     PROTO((enum tree_code, tree, int));
-extern tree unary_complex_lvalue               PROTO((enum tree_code, tree));
-extern int mark_addressable                    PROTO((tree));
-extern tree build_x_conditional_expr           PROTO((tree, tree, tree));
-extern tree build_conditional_expr             PROTO((tree, tree, tree));
-extern tree build_x_compound_expr              PROTO((tree));
-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_x_modify_expr                        PROTO((tree, enum tree_code, tree));
-extern tree build_modify_expr                  PROTO((tree, enum tree_code, tree));
-extern tree convert_for_initialization         PROTO((tree, tree, tree, int, const char *, tree, int));
-extern void c_expand_asm_operands              PROTO((tree, tree, tree, tree, int, char *, int));
-extern void c_expand_return                    PROTO((tree));
-extern tree c_expand_start_case                        PROTO((tree));
-extern int comp_ptr_ttypes                     PROTO((tree, tree));
-extern int ptr_reasonably_similar              PROTO((tree, tree));
-extern tree build_ptrmemfunc                   PROTO((tree, tree, int));
-extern tree strip_array_types                   PROTO((tree));
-extern int cp_type_quals                        PROTO((tree));
-extern int cp_has_mutable_p                     PROTO((tree));
-extern int at_least_as_qualified_p              PROTO((tree, tree));
-extern int more_qualified_p                     PROTO((tree, tree));
-extern tree build_ptrmemfunc1                   PROTO((tree, tree, tree, tree, tree));
-extern void expand_ptrmemfunc_cst               PROTO((tree, tree *, tree *, tree *, tree *));
-extern tree delta2_from_ptrmemfunc              PROTO((tree));
-extern tree pfn_from_ptrmemfunc                 PROTO((tree));
-extern tree type_after_usual_arithmetic_conversions PROTO((tree, tree));
-extern tree composite_pointer_type              PROTO((tree, tree, tree, tree,
+extern int string_conv_p                       PARAMS ((tree, tree, int));
+extern tree condition_conversion               PARAMS ((tree));
+extern tree target_type                                PARAMS ((tree));
+extern tree require_complete_type              PARAMS ((tree));
+extern tree complete_type                      PARAMS ((tree));
+extern tree complete_type_or_else               PARAMS ((tree, tree));
+extern int type_unknown_p                      PARAMS ((tree));
+extern tree commonparms                                PARAMS ((tree, tree));
+extern tree original_type                      PARAMS ((tree));
+extern tree common_type                                PARAMS ((tree, tree));
+extern int comp_except_specs                   PARAMS ((tree, tree, int));
+extern int comptypes                           PARAMS ((tree, tree, int));
+extern int comp_target_types                   PARAMS ((tree, tree, int));
+extern int compparms                           PARAMS ((tree, tree));
+extern int comp_target_types                   PARAMS ((tree, tree, int));
+extern int comp_cv_qualification                PARAMS ((tree, tree));
+extern int comp_cv_qual_signature               PARAMS ((tree, tree));
+extern tree unsigned_type                      PARAMS ((tree));
+extern tree signed_type                                PARAMS ((tree));
+extern tree signed_or_unsigned_type            PARAMS ((int, tree));
+extern tree expr_sizeof                                PARAMS ((tree));
+extern tree c_sizeof                           PARAMS ((tree));
+extern tree c_sizeof_nowarn                    PARAMS ((tree));
+extern tree c_alignof                          PARAMS ((tree));
+extern tree inline_conversion                  PARAMS ((tree));
+extern tree decay_conversion                   PARAMS ((tree));
+extern tree default_conversion                 PARAMS ((tree));
+extern tree build_object_ref                   PARAMS ((tree, tree, tree));
+extern tree build_component_ref_1              PARAMS ((tree, tree, int));
+extern tree build_component_ref                        PARAMS ((tree, tree, tree, int));
+extern tree build_x_component_ref              PARAMS ((tree, tree, tree, int));
+extern tree build_x_indirect_ref               PARAMS ((tree, const char *));
+extern tree build_indirect_ref                 PARAMS ((tree, const char *));
+extern tree build_array_ref                    PARAMS ((tree, tree));
+extern tree build_x_function_call              PARAMS ((tree, tree, tree));
+extern tree get_member_function_from_ptrfunc   PARAMS ((tree *, tree));
+extern tree build_function_call_real           PARAMS ((tree, tree, int, int));
+extern tree build_function_call                        PARAMS ((tree, tree));
+extern tree build_function_call_maybe          PARAMS ((tree, tree));
+extern tree convert_arguments                  PARAMS ((tree, tree, tree, int));
+extern tree build_x_binary_op                  PARAMS ((enum tree_code, tree, tree));
+extern tree build_binary_op                    PARAMS ((enum tree_code, tree, tree));
+extern tree build_x_unary_op                   PARAMS ((enum tree_code, tree));
+extern tree build_unary_op                     PARAMS ((enum tree_code, tree, int));
+extern tree unary_complex_lvalue               PARAMS ((enum tree_code, tree));
+extern int mark_addressable                    PARAMS ((tree));
+extern tree build_x_conditional_expr           PARAMS ((tree, tree, tree));
+extern tree build_conditional_expr             PARAMS ((tree, tree, tree));
+extern tree build_x_compound_expr              PARAMS ((tree));
+extern tree build_compound_expr                        PARAMS ((tree));
+extern tree build_static_cast                  PARAMS ((tree, tree));
+extern tree build_reinterpret_cast             PARAMS ((tree, tree));
+extern tree build_const_cast                   PARAMS ((tree, tree));
+extern tree build_c_cast                       PARAMS ((tree, tree));
+extern tree build_x_modify_expr                        PARAMS ((tree, enum tree_code, tree));
+extern tree build_modify_expr                  PARAMS ((tree, enum tree_code, tree));
+extern tree dubious_conversion_warnings         PARAMS ((tree, tree, const char *, tree, int));
+extern tree convert_for_initialization         PARAMS ((tree, tree, tree, int, const char *, tree, int));
+extern void c_expand_asm_operands              PARAMS ((tree, tree, tree, tree, int, char *, int));
+extern void c_expand_return                    PARAMS ((tree));
+extern tree c_expand_start_case                        PARAMS ((tree));
+extern int comp_ptr_ttypes                     PARAMS ((tree, tree));
+extern int ptr_reasonably_similar              PARAMS ((tree, tree));
+extern tree build_ptrmemfunc                   PARAMS ((tree, tree, int));
+extern tree strip_array_types                   PARAMS ((tree));
+extern int cp_type_quals                        PARAMS ((tree));
+extern int cp_has_mutable_p                     PARAMS ((tree));
+extern int at_least_as_qualified_p              PARAMS ((tree, tree));
+extern int more_qualified_p                     PARAMS ((tree, tree));
+extern tree build_ptrmemfunc1                   PARAMS ((tree, tree, tree, tree, tree));
+extern void expand_ptrmemfunc_cst               PARAMS ((tree, tree *, tree *, tree *, tree *));
+extern tree delta2_from_ptrmemfunc              PARAMS ((tree));
+extern tree pfn_from_ptrmemfunc                 PARAMS ((tree));
+extern tree type_after_usual_arithmetic_conversions PARAMS ((tree, tree));
+extern tree composite_pointer_type              PARAMS ((tree, tree, tree, tree,
                                                       const char*));
-extern tree check_return_expr                   PROTO((tree));
+extern tree check_return_expr                   PARAMS ((tree));
 
 /* in typeck2.c */
-extern tree error_not_base_type                        PROTO((tree, tree));
-extern tree binfo_or_else                      PROTO((tree, tree));
-extern void readonly_error                     PROTO((tree, const char *, int));
-extern int abstract_virtuals_error             PROTO((tree, tree));
-extern void incomplete_type_error              PROTO((tree, tree));
-extern void my_friendly_abort                  PROTO((int))
+extern tree error_not_base_type                        PARAMS ((tree, tree));
+extern tree binfo_or_else                      PARAMS ((tree, tree));
+extern void readonly_error                     PARAMS ((tree, const char *, int));
+extern int abstract_virtuals_error             PARAMS ((tree, tree));
+extern void incomplete_type_error              PARAMS ((tree, tree));
+extern void my_friendly_abort                  PARAMS ((int))
   ATTRIBUTE_NORETURN;
-extern void my_friendly_assert                 PROTO((int, int));
-extern tree store_init_value                   PROTO((tree, tree));
-extern tree digest_init                                PROTO((tree, tree, tree *));
-extern tree build_scoped_ref                   PROTO((tree, tree));
-extern tree build_x_arrow                      PROTO((tree));
-extern tree build_m_component_ref              PROTO((tree, tree));
-extern tree build_functional_cast              PROTO((tree, tree));
-extern char *enum_name_string                  PROTO((tree, tree));
-extern void report_case_error                  PROTO((int, tree, tree, tree));
-extern void check_for_new_type                 PROTO((const char *, flagged_type_tree));
-extern tree add_exception_specifier             PROTO((tree, tree, int));
+extern void my_friendly_assert                 PARAMS ((int, int));
+extern tree store_init_value                   PARAMS ((tree, tree));
+extern tree digest_init                                PARAMS ((tree, tree, tree *));
+extern tree build_scoped_ref                   PARAMS ((tree, tree));
+extern tree build_x_arrow                      PARAMS ((tree));
+extern tree build_m_component_ref              PARAMS ((tree, tree));
+extern tree build_functional_cast              PARAMS ((tree, tree));
+extern char *enum_name_string                  PARAMS ((tree, tree));
+extern void report_case_error                  PARAMS ((int, tree, tree, tree));
+extern void check_for_new_type                 PARAMS ((const char *, flagged_type_tree));
+extern tree add_exception_specifier             PARAMS ((tree, tree, int));
 
 /* in xref.c */
-extern void GNU_xref_begin                     PROTO((const char *));
-extern void GNU_xref_end                       PROTO((int));
-extern void GNU_xref_file                      PROTO((const char *));
-extern void GNU_xref_start_scope               PROTO((HOST_WIDE_INT));
-extern void GNU_xref_end_scope                 PROTO((HOST_WIDE_INT, HOST_WIDE_INT, int, int));
-extern void GNU_xref_ref                       PROTO((tree, const char *));
-extern void GNU_xref_decl                      PROTO((tree, tree));
-extern void GNU_xref_call                      PROTO((tree, const char *));
-extern void GNU_xref_function                  PROTO((tree, tree));
-extern void GNU_xref_assign                    PROTO((tree));
-extern void GNU_xref_hier                      PROTO((tree, tree, int, int, int));
-extern void GNU_xref_member                    PROTO((tree, tree));
+extern void GNU_xref_begin                     PARAMS ((const char *));
+extern void GNU_xref_end                       PARAMS ((int));
+extern void GNU_xref_file                      PARAMS ((const char *));
+extern void GNU_xref_start_scope               PARAMS ((HOST_WIDE_INT));
+extern void GNU_xref_end_scope                 PARAMS ((HOST_WIDE_INT, HOST_WIDE_INT, int, int));
+extern void GNU_xref_ref                       PARAMS ((tree, const char *));
+extern void GNU_xref_decl                      PARAMS ((tree, tree));
+extern void GNU_xref_call                      PARAMS ((tree, const char *));
+extern void GNU_xref_function                  PARAMS ((tree, tree));
+extern void GNU_xref_assign                    PARAMS ((tree));
+extern void GNU_xref_hier                      PARAMS ((tree, tree, int, int, int));
+extern void GNU_xref_member                    PARAMS ((tree, tree));
 
 /* in dump.c */
-extern void dump_node_to_file                   PROTO ((tree, const char *));
+extern void dump_node_to_file                   PARAMS ((tree, const char *));
 
 /* -- end of C++ */