OSDN Git Service

2006-12-16 Simon Martin <simartin@users.sourceforge.net>
[pf3gnuchains/gcc-fork.git] / gcc / cp / cp-tree.h
index b057581..3968f96 100644 (file)
@@ -1,6 +1,6 @@
 /* Definitions for C++ parsing and type checking.
    Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003, 2004, 2005  Free Software Foundation, Inc.
+   2000, 2001, 2002, 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
    Contributed by Michael Tiemann (tiemann@cygnus.com)
 
 This file is part of GCC.
@@ -17,8 +17,8 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GCC; see the file COPYING.  If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
 
 #ifndef GCC_CP_TREE_H
 #define GCC_CP_TREE_H
@@ -51,6 +51,11 @@ struct diagnostic_context;
       BIND_EXPR_TRY_BLOCK (in BIND_EXPR)
       TYPENAME_IS_ENUM_P (in TYPENAME_TYPE)
       REFERENCE_REF_P (in INDIRECT_EXPR)
+      QUALIFIED_NAME_IS_TEMPLATE (in SCOPE_REF)
+      OMP_ATOMIC_DEPENDENT_P (in OMP_ATOMIC)
+      OMP_FOR_GIMPLIFYING_P (in OMP_FOR)
+      BASELINK_QUALIFIED_P (in BASELINK)
+      TARGET_EXPR_IMPLICIT_P (in TARGET_EXPR)
    1: IDENTIFIER_VIRTUAL_P (in IDENTIFIER_NODE)
       TI_PENDING_TEMPLATE_FLAG.
       TEMPLATE_PARMS_FOR_INLINE.
@@ -59,6 +64,7 @@ struct diagnostic_context;
       ICS_ELLIPSIS_FLAG (in _CONV)
       DECL_INITIALIZED_P (in VAR_DECL)
       TYPENAME_IS_CLASS_P (in TYPENAME_TYPE)
+      STMT_IS_FULL_EXPR_P (in _STMT)
    2: IDENTIFIER_OPNAME_P (in IDENTIFIER_NODE)
       ICS_THIS_FLAG (in _CONV)
       DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (in VAR_DECL)
@@ -68,8 +74,9 @@ struct diagnostic_context;
       FN_TRY_BLOCK_P (in TRY_BLOCK)
       IDENTIFIER_CTOR_OR_DTOR_P (in IDENTIFIER_NODE)
       BIND_EXPR_BODY_BLOCK (in BIND_EXPR)
+      DECL_NON_TRIVIALLY_INITIALIZED_P (in VAR_DECL)
    4: TREE_HAS_CONSTRUCTOR (in INDIRECT_REF, SAVE_EXPR, CONSTRUCTOR,
-          or FIELD_DECL).
+         or FIELD_DECL).
       IDENTIFIER_TYPENAME_P (in IDENTIFIER_NODE)
       DECL_TINFO_P (in VAR_DECL)
    5: C_IS_RESERVED_WORD (in IDENTIFIER_NODE)
@@ -92,6 +99,7 @@ struct diagnostic_context;
       DECL_TEMPLATE_PARM_P (in PARM_DECL, CONST_DECL, TYPE_DECL, or TEMPLATE_DECL)
       DECL_LOCAL_FUNCTION_P (in FUNCTION_DECL)
       DECL_MUTABLE_P (in FIELD_DECL)
+      DECL_DEPENDENT_P (in USING_DECL)
    1: C_TYPEDEF_EXPLICITLY_SIGNED (in TYPE_DECL).
       DECL_TEMPLATE_INSTANTIATED (in a VAR_DECL or a FUNCTION_DECL)
       DECL_MEMBER_TEMPLATE_P (in TEMPLATE_DECL)
@@ -172,15 +180,15 @@ struct diagnostic_context;
 #define NON_THUNK_FUNCTION_CHECK(NODE) __extension__                   \
 ({  const tree __t = (NODE);                                           \
     if (TREE_CODE (__t) != FUNCTION_DECL &&                            \
-       TREE_CODE (__t) != TEMPLATE_DECL && __t->decl.lang_specific     \
-       && __t->decl.lang_specific->decl_flags.thunk_p)                 \
+       TREE_CODE (__t) != TEMPLATE_DECL && __t->decl_common.lang_specific      \
+       && __t->decl_common.lang_specific->decl_flags.thunk_p)                  \
       tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, 0);    \
     __t; })
 #define THUNK_FUNCTION_CHECK(NODE) __extension__                       \
 ({  const tree __t = (NODE);                                           \
-    if (TREE_CODE (__t) != FUNCTION_DECL || !__t->decl.lang_specific   \
-       || !__t->decl.lang_specific->decl_flags.thunk_p)                \
-      tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, 0);    \
+    if (TREE_CODE (__t) != FUNCTION_DECL || !__t->decl_common.lang_specific    \
+       || !__t->decl_common.lang_specific->decl_flags.thunk_p)         \
+      tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, 0);    \
      __t; })
 #else
 #define NON_THUNK_FUNCTION_CHECK(NODE) (NODE)
@@ -245,7 +253,7 @@ typedef struct ptrmem_cst * ptrmem_cst_t;
 #define SET_IDENTIFIER_NAMESPACE_VALUE(NODE, VAL) \
   set_namespace_binding ((NODE), current_namespace, (VAL))
 
-#define CLEANUP_P(NODE)         TREE_LANG_FLAG_0 (TRY_BLOCK_CHECK (NODE))
+#define CLEANUP_P(NODE)                TREE_LANG_FLAG_0 (TRY_BLOCK_CHECK (NODE))
 
 #define BIND_EXPR_TRY_BLOCK(NODE) \
   TREE_LANG_FLAG_0 (BIND_EXPR_CHECK (NODE))
@@ -253,12 +261,19 @@ typedef struct ptrmem_cst * ptrmem_cst_t;
 /* Used to mark the block around the member initializers and cleanups.  */
 #define BIND_EXPR_BODY_BLOCK(NODE) \
   TREE_LANG_FLAG_3 (BIND_EXPR_CHECK (NODE))
+#define FUNCTION_NEEDS_BODY_BLOCK(NODE) \
+  (DECL_CONSTRUCTOR_P (NODE) || DECL_DESTRUCTOR_P (NODE))
 
 #define STATEMENT_LIST_NO_SCOPE(NODE) \
   TREE_LANG_FLAG_0 (STATEMENT_LIST_CHECK (NODE))
 #define STATEMENT_LIST_TRY_BLOCK(NODE) \
   TREE_LANG_FLAG_2 (STATEMENT_LIST_CHECK (NODE))
 
+/* Nonzero if this statement should be considered a full-expression,
+   i.e., if temporaries created during this statement should have
+   their destructors run at the end of this statement.  */
+#define STMT_IS_FULL_EXPR_P(NODE) TREE_LANG_FLAG_1 ((NODE))
+
 /* Marks the result of a statement expression.  */
 #define EXPR_STMT_STMT_EXPR_RESULT(NODE) \
   TREE_LANG_FLAG_0 (EXPR_STMT_CHECK (NODE))
@@ -284,7 +299,7 @@ typedef struct ptrmem_cst * ptrmem_cst_t;
 /* Returns nonzero iff NODE is a declaration for the global function
    `main'.  */
 #define DECL_MAIN_P(NODE)                              \
-   (DECL_EXTERN_C_FUNCTION_P (NODE)                     \
+   (DECL_EXTERN_C_FUNCTION_P (NODE)                    \
     && DECL_NAME (NODE) != NULL_TREE                   \
     && MAIN_NAME_P (DECL_NAME (NODE)))
 
@@ -293,14 +308,14 @@ typedef struct ptrmem_cst * ptrmem_cst_t;
   (((struct tree_overload*)OVERLOAD_CHECK (NODE))->function)
 #define OVL_CHAIN(NODE)      TREE_CHAIN (NODE)
 /* Polymorphic access to FUNCTION and CHAIN.  */
-#define OVL_CURRENT(NODE)     \
+#define OVL_CURRENT(NODE)      \
   ((TREE_CODE (NODE) == OVERLOAD) ? OVL_FUNCTION (NODE) : (NODE))
-#define OVL_NEXT(NODE)        \
+#define OVL_NEXT(NODE)         \
   ((TREE_CODE (NODE) == OVERLOAD) ? TREE_CHAIN (NODE) : NULL_TREE)
 /* If set, this was imported in a using declaration.
    This is not to confuse with being used somewhere, which
    is not important for this node.  */
-#define OVL_USED(NODE)        TREE_USED (NODE)
+#define OVL_USED(NODE)         TREE_USED (NODE)
 
 struct tree_overload GTY(())
 {
@@ -330,6 +345,9 @@ struct tree_overload GTY(())
    requested.  */
 #define BASELINK_OPTYPE(NODE) \
   (TREE_CHAIN (BASELINK_CHECK (NODE)))
+/* Non-zero if this baselink was from a qualified lookup.  */
+#define BASELINK_QUALIFIED_P(NODE) \
+  TREE_LANG_FLAG_0 (BASELINK_CHECK (NODE))
 
 struct tree_baselink GTY(())
 {
@@ -418,11 +436,37 @@ typedef enum cp_id_kind
 
 #define DEFARG_TOKENS(NODE) \
   (((struct tree_default_arg *)DEFAULT_ARG_CHECK (NODE))->tokens)
+#define DEFARG_INSTANTIATIONS(NODE) \
+  (((struct tree_default_arg *)DEFAULT_ARG_CHECK (NODE))->instantiations)
 
 struct tree_default_arg GTY (())
 {
   struct tree_common common;
   struct cp_token_cache *tokens;
+  VEC(tree,gc) *instantiations;
+};
+
+/* The condition associated with the static assertion.  This must be
+   an integral constant expression.  */
+#define STATIC_ASSERT_CONDITION(NODE) \
+  (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->condition)
+
+/* The message associated with the static assertion.  This must be a
+   string constant, which will be emitted as an error message when the
+   static assert condition is false.  */
+#define STATIC_ASSERT_MESSAGE(NODE) \
+  (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->message)
+
+/* Source location information for a static assertion.  */
+#define STATIC_ASSERT_SOURCE_LOCATION(NODE) \
+  (((struct tree_static_assert *)STATIC_ASSERT_CHECK (NODE))->location)
+
+struct tree_static_assert GTY (())
+{
+  struct tree_common common;
+  tree condition;
+  tree message;
+  location_t location;
 };
 
 enum cp_tree_node_structure_enum {
@@ -436,12 +480,13 @@ enum cp_tree_node_structure_enum {
   TS_CP_BASELINK,
   TS_CP_WRAPPER,
   TS_CP_DEFAULT_ARG,
+  TS_CP_STATIC_ASSERT,
   LAST_TS_CP_ENUM
 };
 
 /* The resulting tree type.  */
 union lang_tree_node GTY((desc ("cp_tree_node_structure (&%h)"),
-       chain_next ("(union lang_tree_node *)TREE_CHAIN (&%h.generic)")))
+       chain_next ("(GIMPLE_STMT_P (&%h.generic) ? (union lang_tree_node *) 0 : (union lang_tree_node *)TREE_CHAIN (&%h.generic))")))
 {
   union tree_node GTY ((tag ("TS_CP_GENERIC"),
                        desc ("tree_node_structure (&%h)"))) generic;
@@ -452,6 +497,8 @@ union lang_tree_node GTY((desc ("cp_tree_node_structure (&%h)"),
   struct tree_baselink GTY ((tag ("TS_CP_BASELINK"))) baselink;
   struct tree_default_arg GTY ((tag ("TS_CP_DEFAULT_ARG"))) default_arg;
   struct lang_identifier GTY ((tag ("TS_CP_IDENTIFIER"))) identifier;
+  struct tree_static_assert GTY ((tag ("TS_CP_STATIC_ASSERT"))) 
+    static_assertion;
 };
 
 \f
@@ -473,18 +520,6 @@ enum cp_tree_index
     CPTI_CLEANUP_TYPE,
     CPTI_VTT_PARM_TYPE,
 
-    CPTI_TI_DESC_TYPE,
-    CPTI_BLTN_DESC_TYPE,
-    CPTI_PTR_DESC_TYPE,
-    CPTI_ARY_DESC_TYPE,
-    CPTI_FUNC_DESC_TYPE,
-    CPTI_ENUM_DESC_TYPE,
-    CPTI_CLASS_DESC_TYPE,
-    CPTI_SI_CLASS_DESC_TYPE,
-    CPTI_VMI_CLASS_DESC_TYPE,
-    CPTI_PTM_DESC_TYPE,
-    CPTI_BASE_DESC_TYPE,
-
     CPTI_CLASS_TYPE,
     CPTI_UNKNOWN_TYPE,
     CPTI_VTBL_TYPE,
@@ -547,26 +582,14 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX];
    pointer in pointer-to-member types.  */
 #define delta_type_node                        cp_global_trees[CPTI_DELTA_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 ptm_desc_type_node             cp_global_trees[CPTI_PTM_DESC_TYPE]
-#define base_desc_type_node            cp_global_trees[CPTI_BASE_DESC_TYPE]
+#define vtable_index_type              cp_global_trees[CPTI_VTABLE_INDEX_TYPE]
 
 #define class_type_node                        cp_global_trees[CPTI_CLASS_TYPE]
 #define unknown_type_node              cp_global_trees[CPTI_UNKNOWN_TYPE]
 #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 abi_node                       cp_global_trees[CPTI_ABI]
 #define const_type_info_type_node      cp_global_trees[CPTI_CONST_TYPE_INFO_TYPE]
 #define type_info_ptr_type             cp_global_trees[CPTI_TYPE_INFO_PTR_TYPE]
 #define abort_fndecl                   cp_global_trees[CPTI_ABORT_FNDECL]
@@ -578,70 +601,70 @@ extern GTY(()) tree cp_global_trees[CPTI_MAX];
 
 /* The name of a constructor that takes an in-charge parameter to
    decide whether or not to construct virtual base classes.  */
-#define ctor_identifier                 cp_global_trees[CPTI_CTOR_IDENTIFIER]
+#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]
+#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]
+#define base_ctor_identifier           cp_global_trees[CPTI_BASE_CTOR_IDENTIFIER]
 /* The name of a destructor that takes an in-charge parameter to
    decide whether or not to destroy virtual base classes and whether
    or not to delete the object.  */
-#define dtor_identifier                 cp_global_trees[CPTI_DTOR_IDENTIFIER]
+#define dtor_identifier                        cp_global_trees[CPTI_DTOR_IDENTIFIER]
 /* The name of a destructor that destroys virtual base classes.  */
-#define complete_dtor_identifier        cp_global_trees[CPTI_COMPLETE_DTOR_IDENTIFIER]
+#define complete_dtor_identifier       cp_global_trees[CPTI_COMPLETE_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]
+#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 delta_identifier                cp_global_trees[CPTI_DELTA_IDENTIFIER]
-#define in_charge_identifier            cp_global_trees[CPTI_IN_CHARGE_IDENTIFIER]
+#define deleting_dtor_identifier       cp_global_trees[CPTI_DELETING_DTOR_IDENTIFIER]
+#define delta_identifier               cp_global_trees[CPTI_DELTA_IDENTIFIER]
+#define in_charge_identifier           cp_global_trees[CPTI_IN_CHARGE_IDENTIFIER]
 /* The name of the parameter that contains a pointer to the VTT to use
    for this subobject constructor or destructor.  */
-#define vtt_parm_identifier             cp_global_trees[CPTI_VTT_PARM_IDENTIFIER]
-#define nelts_identifier                cp_global_trees[CPTI_NELTS_IDENTIFIER]
-#define this_identifier                 cp_global_trees[CPTI_THIS_IDENTIFIER]
-#define pfn_identifier                  cp_global_trees[CPTI_PFN_IDENTIFIER]
-#define vptr_identifier                 cp_global_trees[CPTI_VPTR_IDENTIFIER]
+#define vtt_parm_identifier            cp_global_trees[CPTI_VTT_PARM_IDENTIFIER]
+#define nelts_identifier               cp_global_trees[CPTI_NELTS_IDENTIFIER]
+#define this_identifier                        cp_global_trees[CPTI_THIS_IDENTIFIER]
+#define pfn_identifier                 cp_global_trees[CPTI_PFN_IDENTIFIER]
+#define vptr_identifier                        cp_global_trees[CPTI_VPTR_IDENTIFIER]
 /* The name of the std namespace.  */
-#define std_identifier                  cp_global_trees[CPTI_STD_IDENTIFIER]
-#define lang_name_c                     cp_global_trees[CPTI_LANG_NAME_C]
-#define lang_name_cplusplus             cp_global_trees[CPTI_LANG_NAME_CPLUSPLUS]
-#define lang_name_java                  cp_global_trees[CPTI_LANG_NAME_JAVA]
+#define std_identifier                 cp_global_trees[CPTI_STD_IDENTIFIER]
+#define lang_name_c                    cp_global_trees[CPTI_LANG_NAME_C]
+#define lang_name_cplusplus            cp_global_trees[CPTI_LANG_NAME_CPLUSPLUS]
+#define lang_name_java                 cp_global_trees[CPTI_LANG_NAME_JAVA]
 
 /* Exception specifier used for throw().  */
-#define empty_except_spec               cp_global_trees[CPTI_EMPTY_EXCEPT_SPEC]
+#define empty_except_spec              cp_global_trees[CPTI_EMPTY_EXCEPT_SPEC]
 
 /* If non-NULL, a POINTER_TYPE equivalent to (java::lang::Class*).  */
-#define jclass_node                     cp_global_trees[CPTI_JCLASS]
+#define jclass_node                    cp_global_trees[CPTI_JCLASS]
 
 /* The declaration for `std::terminate'.  */
-#define terminate_node                  cp_global_trees[CPTI_TERMINATE]
+#define terminate_node                 cp_global_trees[CPTI_TERMINATE]
 
 /* The declaration for "__cxa_call_unexpected".  */
-#define call_unexpected_node            cp_global_trees[CPTI_CALL_UNEXPECTED]
+#define call_unexpected_node           cp_global_trees[CPTI_CALL_UNEXPECTED]
 
 /* A pointer to `std::atexit'.  */
-#define atexit_node                     cp_global_trees[CPTI_ATEXIT]
+#define atexit_node                    cp_global_trees[CPTI_ATEXIT]
 
 /* A pointer to `__dso_handle'.  */
-#define dso_handle_node                 cp_global_trees[CPTI_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]
+#define dynamic_cast_node              cp_global_trees[CPTI_DCAST]
 
 /* The type of a destructor.  */
-#define cleanup_type                    cp_global_trees[CPTI_CLEANUP_TYPE]
+#define cleanup_type                   cp_global_trees[CPTI_CLEANUP_TYPE]
 
 /* The type of the vtt parameter passed to subobject constructors and
    destructors.  */
-#define vtt_parm_type                   cp_global_trees[CPTI_VTT_PARM_TYPE]
+#define vtt_parm_type                  cp_global_trees[CPTI_VTT_PARM_TYPE]
 
 /* A TREE_LIST of the dynamic classes whose vtables may have to be
    emitted in this translation unit.  */
 
-#define keyed_classes                   cp_global_trees[CPTI_KEYED_CLASSES]
+#define keyed_classes                  cp_global_trees[CPTI_KEYED_CLASSES]
 
 /* Node to indicate default access. This must be distinct from the
    access nodes in tree.h.  */
@@ -669,6 +692,7 @@ struct saved_scope GTY(())
   int x_processing_specialization;
   bool x_processing_explicit_instantiation;
   int need_pop_function_context;
+  bool skip_evaluation;
 
   struct stmt_tree_s x_stmt_tree;
 
@@ -724,6 +748,15 @@ struct saved_scope GTY(())
 
 extern GTY(()) struct saved_scope *scope_chain;
 
+struct cxx_int_tree_map GTY(())
+{
+  unsigned int uid;
+  tree to;
+};
+
+extern unsigned int cxx_int_tree_map_hash (const void *);
+extern int cxx_int_tree_map_eq (const void *, const void *);
+
 /* Global state pertinent to the current function.  */
 
 struct language_function GTY(())
@@ -747,10 +780,10 @@ struct language_function GTY(())
   /* True if this function can throw an exception.  */
   BOOL_BITFIELD can_throw : 1;
 
-  struct named_label_use_list *x_named_label_uses;
-  struct named_label_list *x_named_labels;
+  htab_t GTY((param_is(struct named_label_entry))) x_named_labels;
   struct cp_binding_level *bindings;
-  varray_type x_local_names;
+  VEC(tree,gc) *x_local_names;
+  htab_t GTY((param_is (struct cxx_int_tree_map))) extern_decl_map;
 };
 
 /* The current C++-specific per-function global variables.  */
@@ -818,9 +851,9 @@ struct language_function GTY(())
 /* True if NAME is the IDENTIFIER_NODE for an overloaded "operator
    new" or "operator delete".  */
 #define NEW_DELETE_OPNAME_P(NAME)              \
-  ((NAME) == ansi_opname (NEW_EXPR)            \
-   || (NAME) == ansi_opname (VEC_NEW_EXPR)     \
-   || (NAME) == ansi_opname (DELETE_EXPR)      \
+  ((NAME) == ansi_opname (NEW_EXPR)            \
+   || (NAME) == ansi_opname (VEC_NEW_EXPR)     \
+   || (NAME) == ansi_opname (DELETE_EXPR)      \
    || (NAME) == ansi_opname (VEC_DELETE_EXPR))
 
 #define ansi_opname(CODE) \
@@ -831,7 +864,7 @@ struct language_function GTY(())
 /* True if NODE is an erroneous expression.  */
 
 #define error_operand_p(NODE)                                  \
-  ((NODE) == error_mark_node                                   \
+  ((NODE) == error_mark_node                                   \
    || ((NODE) && TREE_TYPE ((NODE)) == error_mark_node))
 \f
 /* C++ language-specific tree codes.  */
@@ -843,12 +876,11 @@ enum cplus_tree_code {
 };
 #undef DEFTREECODE
 
-#define cp_stmt_codes                                  \
-   CTOR_INITIALIZER,   TRY_BLOCK,      HANDLER,        \
-   EH_SPEC_BLOCK,      USING_STMT,     TAG_DEFN,       \
-   IF_STMT,            CLEANUP_STMT,   FOR_STMT,       \
-   WHILE_STMT,         DO_STMT,        BREAK_STMT,     \
-   CONTINUE_STMT,      SWITCH_STMT,    EXPR_STMT
+/* TRUE if a tree code represents a statement.  */
+extern bool statement_code_p[MAX_TREE_CODES];
+
+#define STATEMENT_CODE_P(CODE) statement_code_p[(int) (CODE)]
+
 enum languages { lang_c, lang_cplusplus, lang_java };
 
 /* Macros to make error reporting functions' lives easier.  */
@@ -954,7 +986,7 @@ enum languages { lang_c, lang_cplusplus, lang_java };
 /* Nonzero iff TYPE is publicly & uniquely derived from PARENT.  */
 #define PUBLICLY_UNIQUELY_DERIVED_P(PARENT, TYPE) \
   (lookup_base ((TYPE), (PARENT), ba_ignore_scope | ba_check | ba_quiet, \
-               NULL) != NULL_TREE)
+               NULL) != NULL_TREE)
 
 /* Gives the visibility specification for a class type.  */
 #define CLASSTYPE_VISIBILITY(TYPE)             \
@@ -1032,7 +1064,7 @@ struct lang_type_class GTY(())
   unsigned java_interface : 1;
   unsigned debug_requested : 1;
   unsigned fields_readonly : 1;
-  
+
   unsigned use_template : 2;
   unsigned ptrmemfunc_flag : 1;
   unsigned was_anonymous : 1;
@@ -1112,14 +1144,6 @@ struct lang_type GTY(())
 
 #endif /* ENABLE_TREE_CHECKING */
 
-/* Indicates whether or not (and how) a template was expanded for this class.
-     0=no information yet/non-template class
-     1=implicit template instantiation
-     2=explicit template specialization
-     3=explicit template instantiation  */
-#define CLASSTYPE_USE_TEMPLATE(NODE) \
-  (LANG_TYPE_CLASS_CHECK (NODE)->use_template)
-
 /* Fields used for storing information before the class is defined.
    After the class is defined, these fields hold other information.  */
 
@@ -1161,7 +1185,7 @@ struct lang_type GTY(())
    it has not yet been declared.  */
 #define CLASSTYPE_LAZY_DESTRUCTOR(NODE) \
   (LANG_TYPE_CLASS_CHECK (NODE)->lazy_destructor)
+
 /* Nonzero means that this _CLASSTYPE node overloads operator=(X&).  */
 #define TYPE_HAS_ASSIGN_REF(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_assign_ref)
 
@@ -1191,12 +1215,12 @@ struct lang_type GTY(())
 /* Mark bits for repeated base checks.  */
 #define TYPE_MARKED_P(NODE) TREE_LANG_FLAG_6 (TYPE_CHECK (NODE))
 
-/* Non-zero if the class NODE has multiple paths to the same (virtual)
+/* Nonzero if the class NODE has multiple paths to the same (virtual)
    base object.  */
 #define CLASSTYPE_DIAMOND_SHAPED_P(NODE) \
   (LANG_TYPE_CLASS_CHECK(NODE)->diamond_shaped)
 
-/* Non-zero if the class NODE has multiple instances of the same base
+/* Nonzero if the class NODE has multiple instances of the same base
    type.  */
 #define CLASSTYPE_REPEATED_BASE_P(NODE) \
   (LANG_TYPE_CLASS_CHECK(NODE)->repeated_base)
@@ -1520,13 +1544,15 @@ struct lang_decl_flags GTY(())
   unsigned initialized_in_class : 1;
   unsigned assignment_operator_p : 1;
   unsigned u1sel : 1;
+
   unsigned u2sel : 1;
   unsigned can_be_full : 1;
   unsigned thunk_p : 1;
   unsigned this_thunk_p : 1;
   unsigned repo_available_p : 1;
-  unsigned dummy : 3;
+  unsigned hidden_friend_p : 1;
+  unsigned threadprivate_p : 1;
+  /* One unused bit.  */
 
   union lang_decl_u {
     /* In a FUNCTION_DECL for which DECL_THUNK_P holds, this is
@@ -1569,10 +1595,10 @@ struct lang_decl GTY(())
        unsigned u3sel : 1;
        unsigned pending_inline_p : 1;
        unsigned spare : 22;
-       
+
        /* For a non-thunk function decl, this is a tree list of
-          friendly classes. For a thunk function decl, it is the
-          thunked to function decl.  */
+          friendly classes. For a thunk function decl, it is the
+          thunked to function decl.  */
        tree befriending_classes;
 
        /* For a non-virtual FUNCTION_DECL, this is
@@ -1588,17 +1614,17 @@ struct lang_decl GTY(())
          /* In a non-thunk FUNCTION_DECL or TEMPLATE_DECL, this is
             DECL_CLONED_FUNCTION.  */
          tree GTY ((tag ("0"))) cloned_function;
-         
+
          /* In a FUNCTION_DECL for which THUNK_P holds this is the
             THUNK_FIXED_OFFSET.  */
          HOST_WIDE_INT GTY ((tag ("1"))) fixed_offset;
        } GTY ((desc ("%0.decl_flags.thunk_p"))) u5;
-       
+
        union lang_decl_u3
        {
          struct sorted_fields_type * GTY ((tag ("0"), reorder ("resort_sorted_fields")))
               sorted_fields;
-         struct cp_token_cache * GTY ((tag ("2"))) pending_inline_info;
+         struct cp_token_cache * GTY ((tag ("2"))) pending_inline_info;
          struct language_function * GTY ((tag ("1")))
               saved_language_function;
        } GTY ((desc ("%1.u3sel + %1.pending_inline_p"))) u;
@@ -1630,8 +1656,8 @@ struct lang_decl GTY(())
    created by language-independent code, and has C linkage.  Most
    VAR_DECLs have C++ linkage, and do not have DECL_LANG_SPECIFIC, but
    we do create DECL_LANG_SPECIFIC for variables with non-C++ linkage.  */
-#define DECL_LANGUAGE(NODE)                            \
-  (DECL_LANG_SPECIFIC (NODE)                           \
+#define DECL_LANGUAGE(NODE)                            \
+  (DECL_LANG_SPECIFIC (NODE)                           \
    ? DECL_LANG_SPECIFIC (NODE)->decl_flags.language    \
    : (TREE_CODE (NODE) == FUNCTION_DECL                        \
       ? lang_c : lang_cplusplus))
@@ -1712,7 +1738,7 @@ struct lang_decl GTY(())
    clones.  This macro should be used like:
 
       FOR_EACH_CLONE (clone, fn)
-        { ... }
+       { ... }
 
   */
 #define FOR_EACH_CLONE(CLONE, FN)                      \
@@ -1782,6 +1808,12 @@ struct lang_decl GTY(())
 #define DECL_HAS_IN_CHARGE_PARM_P(NODE) \
   (DECL_LANG_SPECIFIC (NODE)->decl_flags.has_in_charge_parm_p)
 
+/* Nonzero if DECL is a declaration of __builtin_constant_p.  */
+#define DECL_IS_BUILTIN_CONSTANT_P(NODE)               \
+ (TREE_CODE (NODE) == FUNCTION_DECL                    \
+  && DECL_BUILT_IN_CLASS (NODE) == BUILT_IN_NORMAL     \
+  && DECL_FUNCTION_CODE (NODE) == BUILT_IN_CONSTANT_P)
+
 /* 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
@@ -1789,11 +1821,17 @@ struct lang_decl GTY(())
    should be allocated.  */
 #define DECL_IN_AGGR_P(NODE) (DECL_LANG_FLAG_3 (NODE))
 
-/* Nonzero for a VAR_DECL means that the variable's initialization has
-   been processed.  */
+/* Nonzero for a VAR_DECL means that the variable's initialization (if
+   any) has been processed.  (In general, DECL_INITIALIZED_P is
+   !DECL_EXTERN, but static data members may be initialized even if
+   not defined.)  */
 #define DECL_INITIALIZED_P(NODE) \
    (TREE_LANG_FLAG_1 (VAR_DECL_CHECK (NODE)))
 
+/* Nonzero for a VAR_DECL iff an explicit initializer was provided.  */
+#define DECL_NONTRIVIALLY_INITIALIZED_P(NODE)  \
+   (TREE_LANG_FLAG_3 (VAR_DECL_CHECK (NODE)))
+
 /* Nonzero for a VAR_DECL that was initialized with a
    constant-expression.  */
 #define DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P(NODE) \
@@ -1822,9 +1860,8 @@ struct lang_decl GTY(())
 #define DECL_INITIALIZED_IN_CLASS_P(DECL) \
  (DECL_LANG_SPECIFIC (DECL)->decl_flags.initialized_in_class)
 
-/* Nonzero for FUNCTION_DECL means that this decl is just a
-   friend declaration, and should not be added to the list of
-   member functions for this class.  */
+/* Nonzero for DECL means that this decl is just a friend declaration,
+   and should not be added to the list of members for this class.  */
 #define DECL_FRIEND_P(NODE) (DECL_LANG_SPECIFIC (NODE)->decl_flags.friend_attr)
 
 /* A TREE_LIST of the types which have befriended this FUNCTION_DECL.  */
@@ -1896,7 +1933,7 @@ struct lang_decl GTY(())
   (TREE_CODE (NODE) == FUNCTION_DECL           \
    && DECL_LANG_SPECIFIC (NODE)                        \
    && DECL_LANG_SPECIFIC (NODE)->decl_flags.thunk_p)
-     
+
 /* Set DECL_THUNK_P for node.  */
 #define SET_DECL_THUNK_P(NODE, THIS_ADJUSTING)                 \
   (DECL_LANG_SPECIFIC (NODE)->decl_flags.thunk_p = 1,          \
@@ -1956,6 +1993,8 @@ struct lang_decl GTY(())
 /* NULL_TREE in DECL_CONTEXT represents the global namespace.  */
 #define CP_DECL_CONTEXT(NODE) \
   (DECL_CONTEXT (NODE) ? DECL_CONTEXT (NODE) : global_namespace)
+#define CP_TYPE_CONTEXT(NODE) \
+  (TYPE_CONTEXT (NODE) ? TYPE_CONTEXT (NODE) : global_namespace)
 #define FROB_CONTEXT(NODE)   ((NODE) == global_namespace ? NULL_TREE : (NODE))
 
 /* 1 iff NODE has namespace scope, including the global namespace.  */
@@ -1963,15 +2002,25 @@ struct lang_decl GTY(())
   (!DECL_TEMPLATE_PARM_P (NODE)                                        \
    && TREE_CODE (CP_DECL_CONTEXT (NODE)) == NAMESPACE_DECL)
 
+#define TYPE_NAMESPACE_SCOPE_P(NODE)                           \
+  (TREE_CODE (CP_TYPE_CONTEXT (NODE)) == NAMESPACE_DECL)
+
 /* 1 iff NODE is a class member.  */
 #define DECL_CLASS_SCOPE_P(NODE) \
   (DECL_CONTEXT (NODE) && TYPE_P (DECL_CONTEXT (NODE)))
 
+#define TYPE_CLASS_SCOPE_P(NODE) \
+  (TYPE_CONTEXT (NODE) && TYPE_P (TYPE_CONTEXT (NODE)))
+
 /* 1 iff NODE is function-local.  */
 #define DECL_FUNCTION_SCOPE_P(NODE) \
   (DECL_CONTEXT (NODE) \
    && TREE_CODE (DECL_CONTEXT (NODE)) == FUNCTION_DECL)
 
+#define TYPE_FUNCTION_SCOPE_P(NODE) \
+  (TYPE_CONTEXT (NODE) \
+   && TREE_CODE (TYPE_CONTEXT (NODE)) == FUNCTION_DECL)
+
 /* 1 iff VAR_DECL node NODE is a type-info decl.  This flag is set for
    both the primary typeinfo object and the associated NTBS name.  */
 #define DECL_TINFO_P(NODE) TREE_LANG_FLAG_4 (VAR_DECL_CHECK (NODE))
@@ -2001,7 +2050,7 @@ struct lang_decl GTY(())
 /* In a NAMESPACE_DECL, the list of namespaces which have associated
    themselves with this one.  */
 #define DECL_NAMESPACE_ASSOCIATIONS(NODE) \
-  (NAMESPACE_DECL_CHECK (NODE)->decl.saved_tree)
+  (NAMESPACE_DECL_CHECK (NODE)->decl_non_common.saved_tree)
 
 /* In a NAMESPACE_DECL, points to the original namespace if this is
    a namespace alias.  */
@@ -2016,18 +2065,34 @@ struct lang_decl GTY(())
    && CP_DECL_CONTEXT (NODE) == global_namespace       \
    && DECL_NAME (NODE) == std_identifier)
 
-/* 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) (VAR_DECL_CHECK (NODE)->decl.u2.i)
-
 /* In a TREE_LIST concatenating using directives, indicate indirect
    directives  */
-#define TREE_INDIRECT_USING(NODE) (TREE_LIST_CHECK (NODE)->common.lang_flag_0)
+#define TREE_INDIRECT_USING(NODE) (TREE_LIST_CHECK (NODE)->base.lang_flag_0)
+
+extern tree decl_shadowed_for_var_lookup (tree);
+extern void decl_shadowed_for_var_insert (tree, tree);
+
+/* Non zero if this is a using decl for a dependent scope. */
+#define DECL_DEPENDENT_P(NODE) DECL_LANG_FLAG_0 (USING_DECL_CHECK (NODE))
+
+/* The scope named in a using decl.  */
+#define USING_DECL_SCOPE(NODE) TREE_TYPE (USING_DECL_CHECK (NODE))
+
+/* The decls named by a using decl.  */
+#define USING_DECL_DECLS(NODE) DECL_INITIAL (USING_DECL_CHECK (NODE))
+
+/* In a VAR_DECL, true if we have a shadowed local variable
+   in the shadowed var table for this VAR_DECL.  */
+#define DECL_HAS_SHADOWED_FOR_VAR_P(NODE) \
+  (VAR_DECL_CHECK (NODE)->decl_with_vis.shadowed_for_var_p)
 
 /* 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_FLD(VAR_DECL_CHECK (NODE))
+#define DECL_SHADOWED_FOR_VAR(NODE) \
+  (DECL_HAS_SHADOWED_FOR_VAR_P(NODE) ? decl_shadowed_for_var_lookup (NODE) : NULL)
+
+#define SET_DECL_SHADOWED_FOR_VAR(NODE, VAL) \
+  (decl_shadowed_for_var_insert (NODE, VAL))
 
 /* 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,
@@ -2049,8 +2114,25 @@ struct lang_decl GTY(())
 #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.  */
+/* If non-NULL for a VAR_DECL, FUNCTION_DECL, TYPE_DECL or
+   TEMPLATE_DECL, the entity is either a template specialization (if
+   DECL_USE_TEMPLATE is non-zero) or the abstract instance of the
+   template itself.
+
+   In either case, DECL_TEMPLATE_INFO is a TREE_LIST, whose
+   TREE_PURPOSE is the TEMPLATE_DECL of which this entity is a
+   specialization or abstract instance.  The TREE_VALUE is the
+   template arguments used to specialize the template.
+   
+   Consider:
+
+      template <typename T> struct S { friend void f(T) {} };
+
+   In this case, S<int>::f is, from the point of view of the compiler,
+   an instantiation of a template -- but, from the point of view of
+   the language, each instantiation of S results in a wholly unrelated
+   global function f.  In this case, DECL_TEMPLATE_INFO for S<int>::f
+   will be non-NULL, but DECL_USE_TEMPLATE will be zero.  */
 #define DECL_TEMPLATE_INFO(NODE) \
   (DECL_LANG_SPECIFIC (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK (NODE)) \
    ->decl_flags.u.template_info)
@@ -2112,7 +2194,7 @@ struct lang_decl GTY(())
 
 /* Nonzero if the template arguments is actually a vector of vectors,
    rather than just a vector.  */
-#define TMPL_ARGS_HAVE_MULTIPLE_LEVELS(NODE)           \
+#define TMPL_ARGS_HAVE_MULTIPLE_LEVELS(NODE)           \
   (NODE && TREE_VEC_ELT (NODE, 0)                      \
    && TREE_CODE (TREE_VEC_ELT (NODE, 0)) == TREE_VEC)
 
@@ -2177,7 +2259,17 @@ struct lang_decl GTY(())
    DECL_TI_TEMPLATE, the DECL_TI_ARGS will be {int, double}.  These
    are always the full set of arguments required to instantiate this
    declaration from the most general template specialized here.  */
-#define DECL_TI_ARGS(NODE)          TI_ARGS (DECL_TEMPLATE_INFO (NODE))
+#define DECL_TI_ARGS(NODE)         TI_ARGS (DECL_TEMPLATE_INFO (NODE))
+
+/* The TEMPLATE_DECL associated with NODE, a class type.  Even if NODE
+   will be generated from a partial specialization, the TEMPLATE_DECL
+   referred to here will be the original template.  For example,
+   given:
+
+      template <typename T> struct S {};
+      template <typename T> struct S<T*> {};
+      
+   the CLASSTPYE_TI_TEMPLATE for S<int*> will be S, not the S<T*>.  */
 #define CLASSTYPE_TI_TEMPLATE(NODE) TI_TEMPLATE (CLASSTYPE_TEMPLATE_INFO (NODE))
 #define CLASSTYPE_TI_ARGS(NODE)     TI_ARGS (CLASSTYPE_TEMPLATE_INFO (NODE))
 
@@ -2190,7 +2282,7 @@ struct lang_decl GTY(())
                                      (CLASSTYPE_TI_TEMPLATE ((TYPE))))) \
    : (TYPE))
 
-/* Like DECL_TI_TEMPLATE, but for an ENUMERAL_, RECORD_, or UNION_TYPE.  */
+/* Like CLASS_TI_TEMPLATE, but also works for ENUMERAL_TYPEs.  */
 #define TYPE_TI_TEMPLATE(NODE)                 \
   (TI_TEMPLATE (TYPE_TEMPLATE_INFO (NODE)))
 
@@ -2297,10 +2389,23 @@ struct lang_decl GTY(())
 #define DECL_LOCAL_FUNCTION_P(NODE) \
   DECL_LANG_FLAG_0 (FUNCTION_DECL_CHECK (NODE))
 
-/* Nonzero if NODE is a FUNCTION_DECL for a built-in function, and we have
-   not yet seen a prototype for that function.  */
+/* Nonzero if NODE is a DECL which we know about but which has not
+   been explicitly declared, such as a built-in function or a friend
+   declared inside a class.  In the latter case DECL_HIDDEN_FRIEND_P
+   will be set.  */
 #define DECL_ANTICIPATED(NODE) \
-  (DECL_LANG_SPECIFIC (DECL_CHECK (NODE))->decl_flags.anticipated_p)
+  (DECL_LANG_SPECIFIC (DECL_COMMON_CHECK (NODE))->decl_flags.anticipated_p)
+
+/* Nonzero if NODE is a FUNCTION_DECL which was declared as a friend
+   within a class but has not been declared in the surrounding scope.
+   The function is invisible except via argument dependent lookup.  */
+#define DECL_HIDDEN_FRIEND_P(NODE) \
+  (DECL_LANG_SPECIFIC (DECL_COMMON_CHECK (NODE))->decl_flags.hidden_friend_p)
+
+/* Nonzero if DECL has been declared threadprivate by
+   #pragma omp threadprivate.  */
+#define CP_DECL_THREADPRIVATE_P(DECL) \
+  (DECL_LANG_SPECIFIC (VAR_DECL_CHECK (DECL))->decl_flags.threadprivate_p)
 
 /* Record whether a typedef for type `int' was actually `signed int'.  */
 #define C_TYPEDEF_EXPLICITLY_SIGNED(EXP) DECL_LANG_FLAG_1 (EXP)
@@ -2312,12 +2417,12 @@ struct lang_decl GTY(())
 #define DECL_EXTERNAL_LINKAGE_P(DECL) \
   (decl_linkage (DECL) == lk_external)
 
-/* Keep these codes in ascending code order.  CHAR_TYPE is used here
-   to completely fill the range.  */
+/* Keep these codes in ascending code order.  */
 
-#define INTEGRAL_CODE_P(CODE)                          \
-  ((CODE) == ENUMERAL_TYPE || (CODE) == BOOLEAN_TYPE   \
-   || (CODE) == CHAR_TYPE || (CODE) == INTEGER_TYPE)
+#define INTEGRAL_CODE_P(CODE)  \
+  ((CODE) == ENUMERAL_TYPE     \
+   || (CODE) == BOOLEAN_TYPE   \
+   || (CODE) == INTEGER_TYPE)
 
 /* [basic.fundamental]
 
@@ -2326,11 +2431,9 @@ struct lang_decl GTY(())
 
    Note that INTEGRAL_TYPE_P, as defined in tree.h, allows enumeration
    types as well, which is incorrect in C++.  Keep these checks in
-   ascending code order.  CHAR_TYPE is added to complete the interval of
-   values.  */
+   ascending code order.  */
 #define CP_INTEGRAL_TYPE_P(TYPE)               \
   (TREE_CODE (TYPE) == BOOLEAN_TYPE            \
-   || TREE_CODE (TYPE) == CHAR_TYPE            \
    || TREE_CODE (TYPE) == INTEGER_TYPE)
 
 /* Returns true if TYPE is an integral or enumeration name.  Keep
@@ -2394,9 +2497,15 @@ struct lang_decl GTY(())
 #define BRACE_ENCLOSED_INITIALIZER_P(NODE) \
   (TREE_CODE (NODE) == CONSTRUCTOR && !TREE_TYPE (NODE))
 
-#define EMPTY_CONSTRUCTOR_P(NODE) (TREE_CODE (NODE) == CONSTRUCTOR        \
-                                  && CONSTRUCTOR_ELTS (NODE) == NULL_TREE \
-                                  && ! TREE_HAS_CONSTRUCTOR (NODE))
+/* True if NODE is a compound-literal, i.e., a brace-enclosed
+   initializer cast to a particular type.  */
+#define COMPOUND_LITERAL_P(NODE) \
+  (TREE_CODE (NODE) == CONSTRUCTOR && TREE_HAS_CONSTRUCTOR (NODE))
+
+#define EMPTY_CONSTRUCTOR_P(NODE) (TREE_CODE (NODE) == CONSTRUCTOR \
+                                  && VEC_empty (constructor_elt, \
+                                                CONSTRUCTOR_ELTS (NODE)) \
+                                  && !TREE_HAS_CONSTRUCTOR (NODE))
 
 /* Nonzero means that an object of this type can not be initialized using
    an initializer list.  */
@@ -2415,10 +2524,10 @@ struct lang_decl GTY(())
      destructor and if:
 
        - all of the direct base classes of its class have trivial
-         destructors,
+        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
+        of class type (or array thereof), each such class has a
         trivial destructor.  */
 #define TYPE_HAS_TRIVIAL_DESTRUCTOR(NODE) \
   (!TYPE_HAS_NONTRIVIAL_DESTRUCTOR (NODE))
@@ -2446,30 +2555,43 @@ struct lang_decl GTY(())
 /* Returns true if NODE is a pointer.  */
 #define TYPE_PTR_P(NODE)                       \
   (TREE_CODE (NODE) == POINTER_TYPE)
+
+/* Returns true if NODE is an object type:
+
+     [basic.types]
+
+     An object type is a (possibly cv-qualified) type that is not a
+     function type, not a reference type, and not a void type.
+
+   Keep these checks in ascending order, for speed.  */
+#define TYPE_OBJ_P(NODE)                       \
+  (TREE_CODE (NODE) != REFERENCE_TYPE          \
+   && TREE_CODE (NODE) != VOID_TYPE            \
+   && TREE_CODE (NODE) != FUNCTION_TYPE                \
+   && TREE_CODE (NODE) != METHOD_TYPE)
+
 /* Returns true if NODE is a pointer to an object.  Keep these checks
    in ascending tree code order.  */
 #define TYPE_PTROB_P(NODE)                                     \
-  (TYPE_PTR_P (NODE)                                           \
-   && !(TREE_CODE (TREE_TYPE (NODE)) == VOID_TYPE              \
-        || TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE       \
-        || TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE))
+  (TYPE_PTR_P (NODE) && TYPE_OBJ_P (TREE_TYPE (NODE)))
+
 /* Returns true if NODE is a reference to an object.  Keep these checks
    in ascending tree code order.  */
 #define TYPE_REF_OBJ_P(NODE)                                   \
-  (TREE_CODE (NODE) == REFERENCE_TYPE                          \
-   && !(TREE_CODE (TREE_TYPE (NODE)) == VOID_TYPE              \
-        || TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE       \
-        || TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE))
+  (TREE_CODE (NODE) == REFERENCE_TYPE && TYPE_OBJ_P (TREE_TYPE (NODE)))
+
 /* Returns true if NODE is a pointer to an object, or a pointer to
    void.  Keep these checks in ascending tree code order.  */
 #define TYPE_PTROBV_P(NODE)                                    \
-  (TYPE_PTR_P (NODE)                                           \
+  (TYPE_PTR_P (NODE)                                           \
    && !(TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE          \
-        || TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE))
+       || TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE))
+
 /* Returns true if NODE is a pointer to function.  */
 #define TYPE_PTRFN_P(NODE)                             \
   (TREE_CODE (NODE) == POINTER_TYPE                    \
    && TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE)
+
 /* Returns true if NODE is a reference to function.  */
 #define TYPE_REFFN_P(NODE)                             \
   (TREE_CODE (NODE) == REFERENCE_TYPE                  \
@@ -2512,8 +2634,8 @@ struct lang_decl GTY(())
   do {                                                                 \
     if (TYPE_LANG_SPECIFIC (NODE) == NULL)                             \
       {                                                                        \
-       TYPE_LANG_SPECIFIC (NODE) = GGC_CNEWVAR                         \
-         (struct lang_type, sizeof (struct lang_type_ptrmem)); \
+       TYPE_LANG_SPECIFIC (NODE) = GGC_CNEWVAR                         \
+        (struct lang_type, sizeof (struct lang_type_ptrmem));          \
        TYPE_LANG_SPECIFIC (NODE)->u.ptrmem.h.is_lang_type_class = 0;   \
       }                                                                        \
     TYPE_LANG_SPECIFIC (NODE)->u.ptrmem.record = (VALUE);              \
@@ -2622,7 +2744,7 @@ struct lang_decl GTY(())
    TEMPLATE_PARM_INDEX for the parameter is available as the
    DECL_INITIAL (for a PARM_DECL) or as the TREE_TYPE (for a
    TYPE_DECL).  */
-#define DECL_TEMPLATE_PARMS(NODE)       DECL_ARGUMENTS (NODE)
+#define DECL_TEMPLATE_PARMS(NODE)       DECL_NON_COMMON_CHECK (NODE)->decl_non_common.arguments
 #define DECL_INNERMOST_TEMPLATE_PARMS(NODE) \
    INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (NODE))
 #define DECL_NTPARMS(NODE) \
@@ -2644,7 +2766,7 @@ struct lang_decl GTY(())
    arguments are always complete.  For example, given:
 
       template <class T> struct S1 {
-        template <class U> struct S2 {};
+       template <class U> struct S2 {};
        template <class U> struct S2<U*> {};
       };
 
@@ -2663,7 +2785,7 @@ struct lang_decl GTY(())
    partial instantiation.  For example, given:
 
       template <class T> struct S {
-        template <class U> void f(U);
+       template <class U> void f(U);
        template <> void f(T);
       };
 
@@ -2677,12 +2799,13 @@ struct lang_decl GTY(())
 
    For a class template, this list contains the partial
    specializations of this template.  (Full specializations are not
-   recorded on this list.)  The TREE_PURPOSE holds the innermost
-   arguments used in the partial specialization (e.g., for `template
-   <class T> struct S<T*, int>' this will be `T*'.)  The TREE_VALUE
-   holds the innermost template parameters for the specialization
-   (e.g., `T' in the example above.)  The TREE_TYPE is the _TYPE node
-   for the partial specialization.
+   recorded on this list.)  The TREE_PURPOSE holds the arguments used
+   in the partial specialization (e.g., for `template <class T> struct
+   S<T*, int>' this will be `T*'.)  The arguments will also include
+   any outer template arguments.  The TREE_VALUE holds the innermost
+   template parameters for the specialization (e.g., `T' in the
+   example above.)  The TREE_TYPE is the _TYPE node for the partial
+   specialization.
 
    This list is not used for static variable templates.  */
 #define DECL_TEMPLATE_SPECIALIZATIONS(NODE)     DECL_SIZE (NODE)
@@ -2752,17 +2875,44 @@ struct lang_decl GTY(())
 /* Returns nonzero if NODE is a primary template.  */
 #define PRIMARY_TEMPLATE_P(NODE) (DECL_PRIMARY_TEMPLATE (NODE) == (NODE))
 
-/* Indicates whether or not (and how) a template was expanded for this
-   FUNCTION_DECL or VAR_DECL.
-     0=normal declaration, e.g. int min (int, int);
-     1=implicit template instantiation
-     2=explicit template specialization, e.g. int min<int> (int, int);
-     3=explicit template instantiation, e.g. template int min<int> (int, int);
+/* Non-zero iff NODE is a specialization of a template.  The value
+   indicates the type of specializations:
+
+     1=implicit instantiation
+
+     2=partial or explicit specialization, e.g.:
+
+        template <> int min<int> (int, int),
+
+     3=explicit instantiation, e.g.:
+  
+        template int min<int> (int, int);
+
+   Note that NODE will be marked as a specialization even if the
+   template it is instantiating is not a primary template.  For
+   example, given:
+
+     template <typename T> struct O { 
+       void f();
+       struct I {}; 
+     };
+    
+   both O<int>::f and O<int>::I will be marked as instantiations.
 
    If DECL_USE_TEMPLATE is non-zero, then DECL_TEMPLATE_INFO will also
    be non-NULL.  */
 #define DECL_USE_TEMPLATE(NODE) (DECL_LANG_SPECIFIC (NODE)->decl_flags.use_template)
 
+/* Like DECL_USE_TEMPLATE, but for class types.  */
+#define CLASSTYPE_USE_TEMPLATE(NODE) \
+  (LANG_TYPE_CLASS_CHECK (NODE)->use_template)
+
+/* True if NODE is a specialization of a primary template.  */
+#define CLASSTYPE_SPECIALIZATION_OF_PRIMARY_TEMPLATE_P(NODE)   \
+  (CLASS_TYPE_P (NODE)                                         \
+   && CLASSTYPE_USE_TEMPLATE (NODE)                            \
+   && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (arg)))  
+
 #define DECL_TEMPLATE_INSTANTIATION(NODE) (DECL_USE_TEMPLATE (NODE) & 1)
 #define CLASSTYPE_TEMPLATE_INSTANTIATION(NODE) \
   (CLASSTYPE_USE_TEMPLATE (NODE) & 1)
@@ -2891,20 +3041,45 @@ struct lang_decl GTY(())
 #define THUNK_TARGET(NODE)                             \
   (DECL_LANG_SPECIFIC (NODE)->u.f.befriending_classes)
 
+/* True for a SCOPE_REF iff the "template" keyword was used to
+   indicate that the qualified name denotes a template.  */
+#define QUALIFIED_NAME_IS_TEMPLATE(NODE) \
+  (TREE_LANG_FLAG_0 (SCOPE_REF_CHECK (NODE)))
+
+/* True for an OMP_ATOMIC that has dependent parameters.  These are stored
+   as bare LHS/RHS, and not as ADDR/RHS, as in the generic statement.  */
+#define OMP_ATOMIC_DEPENDENT_P(NODE) \
+  (TREE_LANG_FLAG_0 (OMP_ATOMIC_CHECK (NODE)))
+
+/* Used to store the operation code when OMP_ATOMIC_DEPENDENT_P is set.  */
+#define OMP_ATOMIC_CODE(NODE) \
+  (OMP_ATOMIC_CHECK (NODE)->exp.complexity)
+
+/* Used while gimplifying continue statements bound to OMP_FOR nodes.  */
+#define OMP_FOR_GIMPLIFYING_P(NODE) \
+  (TREE_LANG_FLAG_0 (OMP_FOR_CHECK (NODE)))
+
+/* A language-specific token attached to the OpenMP data clauses to
+   hold code (or code fragments) related to ctors, dtors, and op=.
+   See semantics.c for details.  */
+#define CP_OMP_CLAUSE_INFO(NODE) \
+  TREE_TYPE (OMP_CLAUSE_RANGE_CHECK (NODE, OMP_CLAUSE_PRIVATE, \
+                                    OMP_CLAUSE_COPYPRIVATE))
+
 /* These macros provide convenient access to the various _STMT nodes
    created when parsing template declarations.  */
-#define TRY_STMTS(NODE)         TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 0)
-#define TRY_HANDLERS(NODE)      TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 1)
+#define TRY_STMTS(NODE)                TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 0)
+#define TRY_HANDLERS(NODE)     TREE_OPERAND (TRY_BLOCK_CHECK (NODE), 1)
 
-#define EH_SPEC_STMTS(NODE)     TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 0)
-#define EH_SPEC_RAISES(NODE)    TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 1)
+#define EH_SPEC_STMTS(NODE)    TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 0)
+#define EH_SPEC_RAISES(NODE)   TREE_OPERAND (EH_SPEC_BLOCK_CHECK (NODE), 1)
 
 #define USING_STMT_NAMESPACE(NODE) TREE_OPERAND (USING_STMT_CHECK (NODE), 0)
 
 /* Nonzero if this try block is a function try block.  */
-#define FN_TRY_BLOCK_P(NODE)    TREE_LANG_FLAG_3 (TRY_BLOCK_CHECK (NODE))
-#define HANDLER_PARMS(NODE)     TREE_OPERAND (HANDLER_CHECK (NODE), 0)
-#define HANDLER_BODY(NODE)      TREE_OPERAND (HANDLER_CHECK (NODE), 1)
+#define FN_TRY_BLOCK_P(NODE)   TREE_LANG_FLAG_3 (TRY_BLOCK_CHECK (NODE))
+#define HANDLER_PARMS(NODE)    TREE_OPERAND (HANDLER_CHECK (NODE), 0)
+#define HANDLER_BODY(NODE)     TREE_OPERAND (HANDLER_CHECK (NODE), 1)
 #define HANDLER_TYPE(NODE)     TREE_TYPE (HANDLER_CHECK (NODE))
 
 /* CLEANUP_STMT accessors.  The statement(s) covered, the cleanup to run
@@ -2916,38 +3091,43 @@ struct lang_decl GTY(())
 /* IF_STMT accessors. These give access to the condition of the if
    statement, the then block of the if statement, and the else block
    of the if statement if it exists.  */
-#define IF_COND(NODE)           TREE_OPERAND (IF_STMT_CHECK (NODE), 0)
-#define THEN_CLAUSE(NODE)       TREE_OPERAND (IF_STMT_CHECK (NODE), 1)
-#define ELSE_CLAUSE(NODE)       TREE_OPERAND (IF_STMT_CHECK (NODE), 2)
+#define IF_COND(NODE)          TREE_OPERAND (IF_STMT_CHECK (NODE), 0)
+#define THEN_CLAUSE(NODE)      TREE_OPERAND (IF_STMT_CHECK (NODE), 1)
+#define ELSE_CLAUSE(NODE)      TREE_OPERAND (IF_STMT_CHECK (NODE), 2)
 
 /* WHILE_STMT accessors. These give access to the condition of the
    while statement and the body of the while statement, respectively.  */
-#define WHILE_COND(NODE)        TREE_OPERAND (WHILE_STMT_CHECK (NODE), 0)
-#define WHILE_BODY(NODE)        TREE_OPERAND (WHILE_STMT_CHECK (NODE), 1)
+#define WHILE_COND(NODE)       TREE_OPERAND (WHILE_STMT_CHECK (NODE), 0)
+#define WHILE_BODY(NODE)       TREE_OPERAND (WHILE_STMT_CHECK (NODE), 1)
 
 /* DO_STMT accessors. These give access to the condition of the do
    statement and the body of the do statement, respectively.  */
-#define DO_COND(NODE)           TREE_OPERAND (DO_STMT_CHECK (NODE), 0)
-#define DO_BODY(NODE)           TREE_OPERAND (DO_STMT_CHECK (NODE), 1)
+#define DO_COND(NODE)          TREE_OPERAND (DO_STMT_CHECK (NODE), 0)
+#define DO_BODY(NODE)          TREE_OPERAND (DO_STMT_CHECK (NODE), 1)
 
 /* FOR_STMT accessors. These give access to the init statement,
    condition, update expression, and body of the for statement,
    respectively.  */
-#define FOR_INIT_STMT(NODE)     TREE_OPERAND (FOR_STMT_CHECK (NODE), 0)
-#define FOR_COND(NODE)          TREE_OPERAND (FOR_STMT_CHECK (NODE), 1)
-#define FOR_EXPR(NODE)          TREE_OPERAND (FOR_STMT_CHECK (NODE), 2)
-#define FOR_BODY(NODE)          TREE_OPERAND (FOR_STMT_CHECK (NODE), 3)
+#define FOR_INIT_STMT(NODE)    TREE_OPERAND (FOR_STMT_CHECK (NODE), 0)
+#define FOR_COND(NODE)         TREE_OPERAND (FOR_STMT_CHECK (NODE), 1)
+#define FOR_EXPR(NODE)         TREE_OPERAND (FOR_STMT_CHECK (NODE), 2)
+#define FOR_BODY(NODE)         TREE_OPERAND (FOR_STMT_CHECK (NODE), 3)
 
 #define SWITCH_STMT_COND(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 0)
 #define SWITCH_STMT_BODY(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 1)
 #define SWITCH_STMT_TYPE(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 2)
 
 /* STMT_EXPR accessor.  */
-#define STMT_EXPR_STMT(NODE)    TREE_OPERAND (STMT_EXPR_CHECK (NODE), 0)
+#define STMT_EXPR_STMT(NODE)   TREE_OPERAND (STMT_EXPR_CHECK (NODE), 0)
 
 /* EXPR_STMT accessor. This gives the expression associated with an
    expression statement.  */
-#define EXPR_STMT_EXPR(NODE)    TREE_OPERAND (EXPR_STMT_CHECK (NODE), 0)
+#define EXPR_STMT_EXPR(NODE)   TREE_OPERAND (EXPR_STMT_CHECK (NODE), 0)
+
+/* True if this TARGET_EXPR was created by build_cplus_new, and so we can
+   discard it if it isn't useful.  */
+#define TARGET_EXPR_IMPLICIT_P(NODE) \
+  TREE_LANG_FLAG_0 (TARGET_EXPR_CHECK (NODE))
 
 /* An enumeration of the kind of tags that C++ accepts.  */
 enum tag_types {
@@ -2970,20 +3150,20 @@ typedef enum cp_lvalue_kind {
 
 /* Various kinds of template specialization, instantiation, etc.  */
 typedef enum tmpl_spec_kind {
-  tsk_none,                /* Not a template at all.  */
+  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
+  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.  */
+  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
@@ -2991,28 +3171,28 @@ typedef enum tmpl_spec_kind {
    used to initialize RTTI data structures, so changing 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.  */
+  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;
 
 /* The various kinds of special functions.  If you add to this list,
    you should update special_function_p as well.  */
 typedef enum special_function_kind {
-  sfk_none = 0,            /* Not a special function.  This enumeral
+  sfk_none = 0,                   /* Not a special function.  This enumeral
                              must have value zero; see
                              special_function_p.  */
-  sfk_constructor,         /* A constructor.  */
+  sfk_constructor,        /* A constructor.  */
   sfk_copy_constructor,    /* A copy constructor.  */
   sfk_assignment_operator, /* An assignment operator.  */
-  sfk_destructor,          /* A destructor.  */
+  sfk_destructor,         /* A destructor.  */
   sfk_complete_destructor, /* A destructor for complete objects.  */
   sfk_base_destructor,     /* A destructor for base subobjects.  */
   sfk_deleting_destructor, /* A destructor for complete objects that
                              deletes the object after it has been
                              destroyed.  */
-  sfk_conversion           /* A conversion operator.  */
+  sfk_conversion          /* A conversion operator.  */
 } special_function_kind;
 
 /* The various kinds of linkage.  From [basic.link],
@@ -3022,38 +3202,40 @@ typedef enum special_function_kind {
       as a name introduced in another scope:
 
       -- When a name has external linkage, the entity it denotes can
-         be referred to from scopes of other translation units or from
+        be referred to from scopes of other translation units or from
         other scopes of the same translation unit.
 
       -- When a name has internal linkage, the entity it denotes can
-         be referred to by names from other scopes in the same
+        be referred to by names from other scopes in the same
         translation unit.
 
       -- When a name has no linkage, the entity it denotes cannot be
-         referred to by names from other scopes.  */
+        referred to by names from other scopes.  */
 
 typedef enum linkage_kind {
-  lk_none,                 /* No linkage.  */
-  lk_internal,             /* Internal linkage.  */
-  lk_external              /* External linkage.  */
+  lk_none,                     /* No linkage.  */
+  lk_internal,                 /* Internal linkage.  */
+  lk_external                  /* External linkage.  */
 } linkage_kind;
 
 /* Bitmask flags to control type substitution.  */
 typedef enum tsubst_flags_t {
-  tf_none = 0,               /* nothing special */
-  tf_error = 1 << 0,         /* give error messages  */
-  tf_warning = 1 << 1,       /* give warnings too  */
-  tf_ignore_bad_quals = 1 << 2, /* ignore bad cvr qualifiers */
+  tf_none = 0,                 /* nothing special */
+  tf_error = 1 << 0,           /* give error messages  */
+  tf_warning = 1 << 1,         /* give warnings too  */
+  tf_ignore_bad_quals = 1 << 2,        /* ignore bad cvr qualifiers */
   tf_keep_type_decl = 1 << 3,  /* retain typedef type decls
                                   (make_typename_type use) */
-  tf_ptrmem_ok = 1 << 4,        /* pointers to member ok (internal
+  tf_ptrmem_ok = 1 << 4,       /* pointers to member ok (internal
                                   instantiate_type use) */
   tf_user = 1 << 5,            /* found template must be a user template
                                   (lookup_template_class use) */
-  tf_conv = 1 << 6              /* We are determining what kind of
+  tf_conv = 1 << 6,            /* We are determining what kind of
                                   conversion might be permissible,
                                   not actually performing the
                                   conversion.  */
+  /* Convenient substitution flags combinations.  */
+  tf_warning_or_error = tf_warning | tf_error
 } tsubst_flags_t;
 
 /* The kind of checking we can do looking in a class hierarchy.  */
@@ -3078,19 +3260,15 @@ typedef enum deferring_kind {
    Values <0 indicate we failed.  */
 typedef enum base_kind {
   bk_inaccessible = -3,   /* The base is inaccessible */
-  bk_ambig = -2,          /* The base is ambiguous */
-  bk_not_base = -1,       /* It is not a base */
-  bk_same_type = 0,       /* It is the same type */
-  bk_proper_base = 1,     /* It is a proper base */
-  bk_via_virtual = 2      /* It is a proper base, but via a virtual
+  bk_ambig = -2,         /* The base is ambiguous */
+  bk_not_base = -1,      /* It is not a base */
+  bk_same_type = 0,      /* It is the same type */
+  bk_proper_base = 1,    /* It is a proper base */
+  bk_via_virtual = 2     /* It is a proper base, but via a virtual
                             path. This might not be the canonical
                             binfo.  */
 } base_kind;
 
-/* in decl{2}.c */
-/* A node that is a list (length 1) of error_mark_nodes.  */
-extern GTY(()) tree error_mark_list;
-
 /* Node for "pointer to (virtual) function".
    This may be distinct from ptr_type_node so gdb can distinguish them.  */
 #define vfunc_ptr_type_node  vtable_entry_type
@@ -3222,13 +3400,6 @@ extern GTY(()) VEC(tree,gc) *local_classes;
                                  && IDENTIFIER_POINTER (ID_NODE)[1] == '_')
 #endif /* !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) */
 
-/* Returns nonzero iff NODE is a declaration for the global function
-   `main'.  */
-#define DECL_MAIN_P(NODE)                              \
-   (DECL_EXTERN_C_FUNCTION_P (NODE)                     \
-    && DECL_NAME (NODE) != NULL_TREE                   \
-    && MAIN_NAME_P (DECL_NAME (NODE)))
-
 \f
 /* Nonzero if we're done parsing and into end-of-file activities.  */
 
@@ -3247,46 +3418,51 @@ extern GTY(()) tree static_dtors;
 
 enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG };
 
-/* These are uses as bits in flags passed to build_new_method_call
-   to control its error reporting behavior.
-
-   LOOKUP_PROTECT means flag access violations.
-   LOOKUP_COMPLAIN mean complain if no suitable member function
-     matching the arguments is found.
-   LOOKUP_NORMAL is just a combination of these two.
-   LOOKUP_NONVIRTUAL means make a direct call to the member function found
-   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
-     only lives until the end of the complete-expression.  It also forces
-     direct-initialization in cases where other parts of the compiler have
-     already generated a temporary, such as reference initialization and the
-     catch parameter.
-   LOOKUP_NO_CONVERSION means that user-defined conversions are not
-     permitted.  Built-in conversions are permitted.
-   LOOKUP_DESTRUCTOR means explicit call to destructor.
-   LOOKUP_NO_TEMP_BIND means temporaries will not be bound to references.
-
-   These are used in global lookup to support elaborated types and
-   qualifiers.
-
-   LOOKUP_PREFER_TYPES means not to accept objects, and possibly namespaces.
-   LOOKUP_PREFER_NAMESPACES means not to accept objects, and possibly types.
-   LOOKUP_PREFER_BOTH means class-or-namespace-name.  */
-
+/* These are uses as bits in flags passed to various functions to
+   control their behavior.  Despite the LOOKUP_ prefix, many of these
+   do not control name lookup.  ??? Functions using these flags should
+   probably be modified to accept explicit boolean flags for the
+   behaviors relevant to them.  */
+/* Check for access violations.  */
 #define LOOKUP_PROTECT (1 << 0)
+/* Complain if no suitable member function matching the arguments is
+   found.  */
 #define LOOKUP_COMPLAIN (1 << 1)
 #define LOOKUP_NORMAL (LOOKUP_PROTECT | LOOKUP_COMPLAIN)
+/* Even if the function found by lookup is a virtual function, it
+   should be called directly.  */
 #define LOOKUP_NONVIRTUAL (1 << 2)
+/* Non-converting (i.e., "explicit") constructors are not tried.  */
 #define LOOKUP_ONLYCONVERTING (1 << 3)
+/* If a temporary is created, it should be created so that it lives
+   as long as the current variable bindings; otherwise it only lives
+   until the end of the complete-expression.  It also forces
+   direct-initialization in cases where other parts of the compiler
+   have already generated a temporary, such as reference
+   initialization and the catch parameter.  */
 #define DIRECT_BIND (1 << 4)
+/* User-defined conversions are not permitted.  (Built-in conversions
+   are permitted.)  */
 #define LOOKUP_NO_CONVERSION (1 << 5)
+/* The user has explicitly called a destructor.  (Therefore, we do
+   not need to check that the object is non-NULL before calling the
+   destructor.)  */
 #define LOOKUP_DESTRUCTOR (1 << 6)
+/* Do not permit references to bind to temporaries.  */
 #define LOOKUP_NO_TEMP_BIND (1 << 7)
+/* Do not accept objects, and possibly namespaces.  */
 #define LOOKUP_PREFER_TYPES (1 << 8)
+/* Do not accept objects, and possibly types.   */
 #define LOOKUP_PREFER_NAMESPACES (1 << 9)
+/* Accept types or namespaces.  */
 #define LOOKUP_PREFER_BOTH (LOOKUP_PREFER_TYPES | LOOKUP_PREFER_NAMESPACES)
+/* We are checking that a constructor can be called -- but we do not
+   actually plan to call it.  */
 #define LOOKUP_CONSTRUCTOR_CALLABLE (1 << 10)
+/* Return friend declarations and un-declared builtin functions.
+   (Normally, these entities are registered in the symbol table, but
+   not found by lookup.)  */
+#define LOOKUP_HIDDEN (LOOKUP_CONSTRUCTOR_CALLABLE << 1)
 
 #define LOOKUP_NAMESPACES_ONLY(F)  \
   (((F) & LOOKUP_PREFER_NAMESPACES) && !((F) & LOOKUP_PREFER_TYPES))
@@ -3324,32 +3500,33 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG };
 #define WANT_ENUM      4 /* enumerated types */
 #define WANT_POINTER   8 /* pointer types */
 #define WANT_NULL      16 /* null pointer constant */
-#define WANT_ARITH     (WANT_INT | WANT_FLOAT)
+#define WANT_VECTOR    32 /* vector types */
+#define WANT_ARITH     (WANT_INT | WANT_FLOAT | WANT_VECTOR)
 
 /* Used with comptypes, and related functions, to guide type
    comparison.  */
 
-#define COMPARE_STRICT        0 /* Just check if the types are the
+#define COMPARE_STRICT       0 /* Just check if the types are the
                                   same.  */
-#define COMPARE_BASE          1 /* Check to see if the second type is
+#define COMPARE_BASE         1 /* Check to see if the second type is
                                   derived from the first.  */
-#define COMPARE_DERIVED       2 /* Like COMPARE_BASE, but in
+#define COMPARE_DERIVED              2 /* Like COMPARE_BASE, but in
                                   reverse.  */
 #define COMPARE_REDECLARATION 4 /* The comparison is being done when
                                   another declaration of an existing
                                   entity is seen.  */
 
 /* Used with push_overloaded_decl.  */
-#define PUSH_GLOBAL          0  /* Push the DECL into namespace scope,
+#define PUSH_GLOBAL         0  /* Push the DECL into namespace scope,
                                   regardless of the current scope.  */
-#define PUSH_LOCAL           1  /* Push the DECL into the current
+#define PUSH_LOCAL          1  /* Push the DECL into the current
                                   scope.  */
-#define PUSH_USING           2  /* We are pushing this DECL as the
+#define PUSH_USING          2  /* We are pushing this DECL as the
                                   result of a using declaration.  */
 
 /* Used with start function.  */
-#define SF_DEFAULT           0  /* No flags.  */
-#define SF_PRE_PARSED        1  /* The function declaration has
+#define SF_DEFAULT          0  /* No flags.  */
+#define SF_PRE_PARSED       1  /* The function declaration has
                                   already been parsed.  */
 #define SF_INCLASS_INLINE    2  /* The function is an inline, defined
                                   in the class body.  */
@@ -3400,18 +3577,18 @@ enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG };
    TFF_EXPR_IN_PARENS: parenthesize expressions.
    TFF_NO_FUNCTION_ARGUMENTS: don't show function arguments.  */
 
-#define TFF_PLAIN_IDENTIFIER               (0)
-#define TFF_SCOPE                         (1)
-#define TFF_CHASE_TYPEDEF                  (1 << 1)
-#define TFF_DECL_SPECIFIERS                (1 << 2)
-#define TFF_CLASS_KEY_OR_ENUM              (1 << 3)
-#define TFF_RETURN_TYPE                    (1 << 4)
-#define TFF_FUNCTION_DEFAULT_ARGUMENTS     (1 << 5)
-#define TFF_EXCEPTION_SPECIFICATION        (1 << 6)
-#define TFF_TEMPLATE_HEADER                (1 << 7)
-#define TFF_TEMPLATE_NAME                  (1 << 8)
-#define TFF_EXPR_IN_PARENS                 (1 << 9)
-#define TFF_NO_FUNCTION_ARGUMENTS          (1 << 10)
+#define TFF_PLAIN_IDENTIFIER                   (0)
+#define TFF_SCOPE                              (1)
+#define TFF_CHASE_TYPEDEF                      (1 << 1)
+#define TFF_DECL_SPECIFIERS                    (1 << 2)
+#define TFF_CLASS_KEY_OR_ENUM                  (1 << 3)
+#define TFF_RETURN_TYPE                                (1 << 4)
+#define TFF_FUNCTION_DEFAULT_ARGUMENTS         (1 << 5)
+#define TFF_EXCEPTION_SPECIFICATION            (1 << 6)
+#define TFF_TEMPLATE_HEADER                    (1 << 7)
+#define TFF_TEMPLATE_NAME                      (1 << 8)
+#define TFF_EXPR_IN_PARENS                     (1 << 9)
+#define TFF_NO_FUNCTION_ARGUMENTS              (1 << 10)
 
 /* Returns the TEMPLATE_DECL associated to a TEMPLATE_TEMPLATE_PARM
    node.  */
@@ -3511,8 +3688,9 @@ typedef struct cp_decl_specifier_seq {
      decl-specifier-seq.  */
   BOOL_BITFIELD multiple_types_p : 1;
   /* True iff multiple storage classes were (erroneously) specified
-     for this decl-specifier-seq.  */
-  BOOL_BITFIELD multiple_storage_classes_p : 1;
+     for this decl-specifier-seq or a combination of a storage class
+     with a typedef specifier.  */
+  BOOL_BITFIELD conflicting_specifiers_p : 1;
   /* True iff at least one decl-specifier was found.  */
   BOOL_BITFIELD any_specifiers_p : 1;
   /* True iff "int" was explicitly provided.  */
@@ -3568,7 +3746,7 @@ struct cp_declarator {
     /* For identifiers.  */
     struct {
       /* If non-NULL, the qualifying scope (a NAMESPACE_DECL or
-         *_TYPE) for this identifier.  */
+        *_TYPE) for this identifier.  */
       tree qualifying_scope;
       /* The unqualified name of the entity -- an IDENTIFIER_NODE,
         BIT_NOT_EXPR, or TEMPLATE_ID_EXPR.  */
@@ -3601,63 +3779,63 @@ struct cp_declarator {
   } u;
 };
 
-/* An erroneous declarator.  */
-extern cp_declarator *cp_error_declarator;
-
 /* A parameter list indicating for a function with no parameters,
    e.g  "int f(void)".  */
 extern cp_parameter_declarator *no_parameters;
 
 /* in call.c */
-extern bool check_dtor_name (tree, tree);
+extern bool check_dtor_name                    (tree, tree);
 
 extern tree build_vfield_ref                   (tree, tree);
 extern tree build_conditional_expr             (tree, tree, tree);
-extern tree build_addr_func (tree);
-extern tree build_call (tree, tree);
-extern bool null_ptr_cst_p (tree);
-extern bool sufficient_parms_p (tree);
-extern tree type_decays_to (tree);
-extern tree build_user_type_conversion (tree, tree, int);
-extern tree build_new_function_call (tree, tree);
-extern tree build_operator_new_call (tree, tree, tree *, tree *);
-extern tree build_new_method_call (tree, tree, tree, tree, int);
-extern tree build_special_member_call (tree, tree, tree, tree, int);
-extern tree build_new_op (enum tree_code, int, tree, tree, tree, bool *);
-extern tree build_op_delete_call (enum tree_code, tree, tree, bool, tree);
-extern bool can_convert (tree, tree);
-extern bool can_convert_arg (tree, tree, tree);
-extern bool can_convert_arg_bad (tree, tree, tree);
-extern bool enforce_access (tree, tree);
-extern tree convert_default_arg (tree, tree, tree, int);
-extern tree convert_arg_to_ellipsis (tree);
-extern tree build_x_va_arg (tree, tree);
-extern tree cxx_type_promotes_to (tree);
-extern tree type_passed_as (tree);
-extern tree convert_for_arg_passing (tree, tree);
-extern bool is_properly_derived_from (tree, tree);
-extern tree initialize_reference (tree, tree, tree, tree *);
-extern tree make_temporary_var_for_ref_to_temp (tree, tree);
-extern tree strip_top_quals (tree);
-extern tree perform_implicit_conversion (tree, tree);
+extern tree build_addr_func                    (tree);
+extern tree build_call                         (tree, tree);
+extern bool null_ptr_cst_p                     (tree);
+extern bool sufficient_parms_p                 (tree);
+extern tree type_decays_to                     (tree);
+extern tree build_user_type_conversion         (tree, tree, int);
+extern tree build_new_function_call            (tree, tree, bool);
+extern tree build_operator_new_call            (tree, tree, tree *, tree *,
+                                                tree *);
+extern tree build_new_method_call              (tree, tree, tree, tree, int,
+                                                tree *);
+extern tree build_special_member_call          (tree, tree, tree, tree, int);
+extern tree build_new_op                       (enum tree_code, int, tree, tree, tree, bool *);
+extern tree build_op_delete_call               (enum tree_code, tree, tree, bool, tree, tree);
+extern bool can_convert                                (tree, tree);
+extern bool can_convert_arg                    (tree, tree, tree, int);
+extern bool can_convert_arg_bad                        (tree, tree, tree);
+extern bool enforce_access                     (tree, tree, tree);
+extern tree convert_default_arg                        (tree, tree, tree, int);
+extern tree convert_arg_to_ellipsis            (tree);
+extern tree build_x_va_arg                     (tree, tree);
+extern tree cxx_type_promotes_to               (tree);
+extern tree type_passed_as                     (tree);
+extern tree convert_for_arg_passing            (tree, tree);
+extern bool is_properly_derived_from           (tree, tree);
+extern tree initialize_reference               (tree, tree, tree, tree *);
+extern tree make_temporary_var_for_ref_to_temp (tree, tree);
+extern tree strip_top_quals                    (tree);
+extern tree perform_implicit_conversion                (tree, tree);
 extern tree perform_direct_initialization_if_possible (tree, tree, bool);
-extern tree in_charge_arg_for_name (tree);
-extern tree build_cxx_call (tree, tree);
+extern tree in_charge_arg_for_name             (tree);
+extern tree build_cxx_call                     (tree, tree);
 #ifdef ENABLE_CHECKING
-extern void validate_conversion_obstack (void);
+extern void validate_conversion_obstack                (void);
 #endif /* ENABLE_CHECKING */
 
 /* in class.c */
-extern tree build_base_path                    (enum tree_code, tree, tree, int);
-extern tree convert_to_base                     (tree, tree, bool, bool);
-extern tree convert_to_base_statically (tree, tree);
+extern tree build_base_path                    (enum tree_code, tree,
+                                                tree, int);
+extern tree convert_to_base                    (tree, tree, bool, bool);
+extern tree convert_to_base_statically         (tree, tree);
 extern tree build_vtbl_ref                     (tree, tree);
 extern tree build_vfn_ref                      (tree, tree);
-extern tree get_vtable_decl                     (tree, int);
-extern void resort_type_method_vec
-  (void *, void *, gt_pointer_operator, void *);
-extern void add_method                         (tree, tree);
-extern int currently_open_class                        (tree);
+extern tree get_vtable_decl                    (tree, int);
+extern void resort_type_method_vec             (void *, void *,
+                                                gt_pointer_operator, void *);
+extern bool add_method                         (tree, tree, tree);
+extern bool currently_open_class               (tree);
 extern tree currently_open_derived_class       (tree);
 extern tree finish_struct                      (tree, tree);
 extern void finish_struct_1                    (tree);
@@ -3672,74 +3850,73 @@ extern int current_lang_depth                   (void);
 extern void push_lang_context                  (tree);
 extern void pop_lang_context                   (void);
 extern tree instantiate_type                   (tree, tree, tsubst_flags_t);
-extern void print_class_statistics              (void);
+extern void print_class_statistics             (void);
 extern void cxx_print_statistics               (void);
-extern void cxx_print_xnode (FILE *, tree, int);
-extern void cxx_print_decl (FILE *, tree, int);
-extern void cxx_print_type (FILE *, tree, int);
-extern void cxx_print_identifier (FILE *, tree, int);
+extern void cxx_print_xnode                    (FILE *, tree, int);
+extern void cxx_print_decl                     (FILE *, tree, int);
+extern void cxx_print_type                     (FILE *, tree, int);
+extern void cxx_print_identifier               (FILE *, tree, int);
 extern void cxx_print_error_function   (struct diagnostic_context *,
                                                 const char *);
 extern void build_self_reference               (void);
 extern int same_signature_p                    (tree, tree);
-extern void warn_hidden                                (tree);
 extern void maybe_add_class_template_decl_list (tree, tree, int);
-extern void unreverse_member_declarations       (tree);
-extern void invalidate_class_lookup_cache       (void);
-extern void maybe_note_name_used_in_class       (tree, tree);
-extern void note_name_declared_in_class         (tree, tree);
-extern tree get_vtbl_decl_for_binfo             (tree);
-extern tree get_vtt_name                        (tree);
-extern tree get_primary_binfo                   (tree);
+extern void unreverse_member_declarations      (tree);
+extern void invalidate_class_lookup_cache      (void);
+extern void maybe_note_name_used_in_class      (tree, tree);
+extern void note_name_declared_in_class                (tree, tree);
+extern tree get_vtbl_decl_for_binfo            (tree);
 extern void debug_class                                (tree);
-extern void debug_thunks                       (tree);
+extern void debug_thunks                       (tree);
 extern tree cp_fold_obj_type_ref               (tree, tree);
-extern void set_linkage_according_to_type       (tree, tree);
-extern void determine_key_method                (tree);
-extern void check_for_override                  (tree, tree);
+extern void set_linkage_according_to_type      (tree, tree);
+extern void determine_key_method               (tree);
+extern void check_for_override                 (tree, tree);
+extern void push_class_stack                   (void);
+extern void pop_class_stack                    (void);
 
 /* in cvt.c */
-extern tree convert_to_reference (tree, tree, int, int, tree);
-extern tree convert_from_reference (tree);
-extern tree force_rvalue (tree);
-extern tree ocp_convert (tree, tree, int, int);
-extern tree cp_convert (tree, tree);
-extern tree convert_to_void (tree, const char */*implicit context*/);
-extern tree convert_force (tree, tree, int);
-extern tree build_type_conversion (tree, tree);
-extern tree build_expr_type_conversion (int, tree, bool);
-extern tree type_promotes_to (tree);
-extern tree perform_qualification_conversions (tree, tree);
-extern void clone_function_decl                 (tree, int);
+extern tree convert_to_reference               (tree, tree, int, int, tree);
+extern tree convert_from_reference             (tree);
+extern tree force_rvalue                       (tree);
+extern tree ocp_convert                                (tree, tree, int, int);
+extern tree cp_convert                         (tree, tree);
+extern tree convert_to_void    (tree, const char */*implicit context*/);
+extern tree convert_force                      (tree, tree, int);
+extern tree build_expr_type_conversion         (int, tree, bool);
+extern tree type_promotes_to                   (tree);
+extern tree perform_qualification_conversions  (tree, tree);
+extern void clone_function_decl                        (tree, int);
 extern void adjust_clone_args                  (tree);
 
 /* decl.c */
 extern tree poplevel                           (int, int, int);
 extern void insert_block                       (tree);
 extern tree pushdecl                           (tree);
+extern tree pushdecl_maybe_friend              (tree, bool);
 extern void cxx_init_decl_processing           (void);
 enum cp_tree_node_structure_enum cp_tree_node_structure
-  (union lang_tree_node *);
+                                               (union lang_tree_node *);
 extern bool cxx_mark_addressable               (tree);
 extern void cxx_push_function_context          (struct function *);
 extern void cxx_pop_function_context           (struct function *);
-extern void maybe_push_cleanup_level (tree);
-extern void finish_scope                        (void);
+extern void maybe_push_cleanup_level           (tree);
+extern void finish_scope                       (void);
 extern void push_switch                                (tree);
 extern void pop_switch                         (void);
 extern tree pushtag                            (tree, tree, tag_scope);
 extern tree make_anon_name                     (void);
 extern int decls_match                         (tree, tree);
-extern tree duplicate_decls                    (tree, tree);
-extern tree pushdecl_top_level                 (tree);
-extern tree pushdecl_top_level_and_finish       (tree, tree);
-extern tree push_using_decl                     (tree, tree);
-extern tree declare_local_label                 (tree);
+extern tree duplicate_decls                    (tree, tree, bool);
+extern tree pushdecl_top_level_maybe_friend    (tree, bool);
+extern tree pushdecl_top_level_and_finish      (tree, tree);
+extern tree declare_local_label                        (tree);
 extern tree define_label                       (location_t, tree);
 extern void check_goto                         (tree);
+extern bool check_omp_return                   (void);
 extern tree make_typename_type                 (tree, tree, enum tag_types, tsubst_flags_t);
 extern tree make_unbound_class_template                (tree, tree, tree, tsubst_flags_t);
-extern tree check_for_out_of_scope_variable     (tree);
+extern tree check_for_out_of_scope_variable    (tree);
 extern tree build_library_fn                   (tree, tree);
 extern tree build_library_fn_ptr               (const char *, tree);
 extern tree build_cp_library_fn_ptr            (const char *, tree);
@@ -3750,100 +3927,102 @@ extern tree check_tag_decl                    (cp_decl_specifier_seq *);
 extern tree shadow_tag                         (cp_decl_specifier_seq *);
 extern tree groktypename                       (cp_decl_specifier_seq *, const cp_declarator *);
 extern tree start_decl                         (const cp_declarator *, cp_decl_specifier_seq *, int, tree, tree, tree *);
-extern void start_decl_1                       (tree);
-extern void cp_finish_decl                     (tree, tree, tree, int);
+extern void start_decl_1                       (tree, bool);
+extern void cp_finish_decl                     (tree, tree, bool, tree, int);
 extern void finish_decl                                (tree, tree, tree);
 extern int cp_complete_array_type              (tree *, tree, bool);
 extern tree build_ptrmemfunc_type              (tree);
-extern tree build_ptrmem_type                   (tree, tree);
+extern tree build_ptrmem_type                  (tree, tree);
 /* the grokdeclarator prototype is in decl.h */
+extern tree build_this_parm                    (tree, cp_cv_quals);
 extern int copy_fn_p                           (tree);
-extern tree get_scope_of_declarator             (const cp_declarator *);
+extern tree get_scope_of_declarator            (const cp_declarator *);
 extern void grok_special_member_properties     (tree);
 extern int grok_ctor_properties                        (tree, tree);
-extern void grok_op_properties                 (tree, int, bool);
+extern bool grok_op_properties                 (tree, bool);
 extern tree xref_tag                           (enum tag_types, tree, tag_scope, bool);
 extern tree xref_tag_from_type                 (tree, tree, tag_scope);
-extern void xref_basetypes                     (tree, tree);
+extern bool xref_basetypes                     (tree, tree);
 extern tree start_enum                         (tree);
 extern void finish_enum                                (tree);
 extern void build_enumerator                   (tree, tree, tree);
-extern void start_preparsed_function            (tree, tree, int);
+extern void start_preparsed_function           (tree, tree, int);
 extern int start_function                      (cp_decl_specifier_seq *, const cp_declarator *, tree);
 extern tree begin_function_body                        (void);
 extern void finish_function_body               (tree);
 extern tree finish_function                    (int);
 extern tree start_method                       (cp_decl_specifier_seq *, const cp_declarator *, tree);
 extern tree finish_method                      (tree);
-extern void maybe_register_incomplete_var       (tree);
+extern void maybe_register_incomplete_var      (tree);
 extern void complete_vars                      (tree);
 extern void finish_stmt                                (void);
 extern void print_other_binding_stack          (struct cp_binding_level *);
-extern void revert_static_member_fn             (tree);
-extern void fixup_anonymous_aggr                (tree);
-extern int check_static_variable_definition     (tree, tree);
+extern void revert_static_member_fn            (tree);
+extern void fixup_anonymous_aggr               (tree);
+extern int check_static_variable_definition    (tree, tree);
 extern tree compute_array_index_type           (tree, tree);
-extern tree check_default_argument              (tree, tree);
-typedef int (*walk_namespaces_fn)               (tree, void *);
-extern int walk_namespaces                      (walk_namespaces_fn,
-                                                      void *);
-extern int wrapup_globals_for_namespace         (tree, void *);
-extern tree create_implicit_typedef             (tree, tree);
-extern tree maybe_push_decl                     (tree);
+extern tree check_default_argument             (tree, tree);
+typedef int (*walk_namespaces_fn)              (tree, void *);
+extern int walk_namespaces                     (walk_namespaces_fn,
+                                                void *);
+extern int wrapup_globals_for_namespace                (tree, void *);
+extern tree create_implicit_typedef            (tree, tree);
+extern tree maybe_push_decl                    (tree);
 extern tree force_target_expr                  (tree, tree);
-extern tree build_target_expr_with_type         (tree, tree);
-extern int local_variable_p                     (tree);
-extern int nonstatic_local_decl_p               (tree);
-extern tree declare_global_var                  (tree, tree);
-extern tree register_dtor_fn                    (tree);
-extern tmpl_spec_kind current_tmpl_spec_kind    (int);
+extern tree build_target_expr_with_type                (tree, tree);
+extern int local_variable_p                    (tree);
+extern int nonstatic_local_decl_p              (tree);
+extern tree register_dtor_fn                   (tree);
+extern tmpl_spec_kind current_tmpl_spec_kind   (int);
 extern tree cp_fname_init                      (const char *, tree *);
-extern tree builtin_function (const char *name, tree type,
-                             int code,
-                             enum built_in_class cl,
-                             const char *libname, tree attrs);
-extern tree check_elaborated_type_specifier     (enum tag_types, tree, bool);
-extern void warn_extern_redeclared_static (tree, tree);
-extern const char *cxx_comdat_group             (tree);
+extern tree cxx_builtin_function               (tree decl);
+extern tree check_elaborated_type_specifier    (enum tag_types, tree, bool);
+extern void warn_extern_redeclared_static      (tree, tree);
+extern const char *cxx_comdat_group            (tree);
 extern bool cp_missing_noreturn_ok_p           (tree);
-extern void initialize_artificial_var            (tree, tree);
-extern tree check_var_type (tree, tree);
-
-extern bool have_extern_spec;
+extern void initialize_artificial_var          (tree, tree);
+extern tree check_var_type                     (tree, tree);
+extern tree reshape_init (tree, tree);
 
 /* in decl2.c */
-extern bool check_java_method (tree);
-extern cp_cv_quals grok_method_quals (tree, tree, cp_cv_quals);
-extern void maybe_retrofit_in_chrg (tree);
-extern void maybe_make_one_only        (tree);
-extern void grokclassfn        (tree, tree, enum overload_flags, cp_cv_quals);
-extern tree grok_array_decl (tree, tree);
-extern tree delete_sanity (tree, tree, bool, int);
-extern tree check_classfn (tree, tree, tree);
-extern void check_member_template (tree);
-extern tree grokfield (const cp_declarator *, cp_decl_specifier_seq *, tree, tree, tree);
-extern tree grokbitfield (const cp_declarator *, cp_decl_specifier_seq *, tree);
-extern void cplus_decl_attributes (tree *, tree, int);
-extern void finish_anon_union (tree);
-extern void cp_finish_file (void);
-extern tree coerce_new_type (tree);
-extern tree coerce_delete_type (tree);
-extern void comdat_linkage (tree);
-extern void determine_visibility (tree);
-extern void import_export_decl (tree);
+extern bool check_java_method                  (tree);
+extern tree build_memfn_type                   (tree, tree, cp_cv_quals);
+extern void maybe_retrofit_in_chrg             (tree);
+extern void maybe_make_one_only                        (tree);
+extern void grokclassfn                                (tree, tree,
+                                                enum overload_flags);
+extern tree grok_array_decl                    (tree, tree);
+extern tree delete_sanity                      (tree, tree, bool, int);
+extern tree check_classfn                      (tree, tree, tree);
+extern void check_member_template              (tree);
+extern tree grokfield (const cp_declarator *, cp_decl_specifier_seq *,
+                      tree, bool, tree, tree);
+extern tree grokbitfield (const cp_declarator *, cp_decl_specifier_seq *,
+                         tree);
+extern void cplus_decl_attributes              (tree *, tree, int);
+extern void finish_anon_union                  (tree);
+extern void cp_write_global_declarations       (void);
+extern tree coerce_new_type                    (tree);
+extern tree coerce_delete_type                 (tree);
+extern void comdat_linkage                     (tree);
+extern void determine_visibility               (tree);
+extern void constrain_class_visibility         (tree);
+extern void update_member_visibility           (tree);
+extern void import_export_decl                 (tree);
 extern tree build_cleanup                      (tree);
-extern tree build_offset_ref_call_from_tree     (tree, tree);
-extern void check_default_args (tree);
-extern void mark_used (tree);
-extern void finish_static_data_member_decl (tree, tree, tree, int);
-extern tree cp_build_parm_decl (tree, tree);
-extern tree get_guard (tree);
-extern tree get_guard_cond (tree);
-extern tree set_guard (tree);
-extern tree cxx_callgraph_analyze_expr (tree *, int *, tree);
-extern void mark_needed (tree);
-extern bool decl_needed_p (tree);
-extern void note_vague_linkage_fn (tree);
+extern tree build_offset_ref_call_from_tree    (tree, tree);
+extern void check_default_args                 (tree);
+extern void mark_used                          (tree);
+extern void finish_static_data_member_decl     (tree, tree, bool, tree, int);
+extern tree cp_build_parm_decl                 (tree, tree);
+extern tree get_guard                          (tree);
+extern tree get_guard_cond                     (tree);
+extern tree set_guard                          (tree);
+extern tree cxx_callgraph_analyze_expr         (tree *, int *, tree);
+extern void mark_needed                                (tree);
+extern bool decl_needed_p                      (tree);
+extern void note_vague_linkage_fn              (tree);
+extern tree build_artificial_parm              (tree, tree);
 
 /* in error.c */
 extern void init_error                         (void);
@@ -3851,9 +4030,9 @@ extern const char *type_as_string         (tree, int);
 extern const char *decl_as_string              (tree, int);
 extern const char *expr_as_string              (tree, int);
 extern const char *lang_decl_name              (tree, int);
-extern const char *language_to_string           (enum languages);
-extern const char *class_key_or_enum_as_string  (tree);
-extern void print_instantiation_context         (void);
+extern const char *language_to_string          (enum languages);
+extern const char *class_key_or_enum_as_string (tree);
+extern void print_instantiation_context                (void);
 
 /* in except.c */
 extern void init_exception_processing          (void);
@@ -3870,172 +4049,173 @@ extern tree eh_type_info                      (tree);
 extern rtx cxx_expand_expr                     (tree, rtx,
                                                 enum machine_mode,
                                                 int, rtx *);
-extern tree cplus_expand_constant               (tree);
+extern tree cplus_expand_constant              (tree);
 
 /* friend.c */
 extern int is_friend                           (tree, tree);
 extern void make_friend_class                  (tree, tree, bool);
-extern void add_friend                          (tree, tree, bool);
-extern tree do_friend                          (tree, tree, tree, tree, enum overload_flags, cp_cv_quals, int);
+extern void add_friend                         (tree, tree, bool);
+extern tree do_friend                          (tree, tree, tree, tree, enum overload_flags, bool);
 
 /* in init.c */
 extern tree expand_member_init                 (tree);
 extern void emit_mem_initializers              (tree);
 extern tree build_aggr_init                    (tree, tree, int);
-extern tree build_init                         (tree, tree, int);
 extern int is_aggr_type                                (tree, int);
 extern tree get_type_value                     (tree);
-extern tree build_zero_init                    (tree, tree, bool);
+extern tree build_zero_init                    (tree, tree, bool);
 extern tree build_offset_ref                   (tree, tree, bool);
 extern tree build_new                          (tree, tree, tree, tree, int);
-extern tree build_vec_init                     (tree, tree, tree, int);
-extern tree build_x_delete                     (tree, int, tree);
-extern tree build_delete                       (tree, tree, special_function_kind, int, int);
+extern tree build_vec_init                     (tree, tree, tree, bool, int);
+extern tree build_delete                       (tree, tree,
+                                                special_function_kind,
+                                                int, int);
 extern void push_base_cleanups                 (void);
-extern tree build_vec_delete                   (tree, tree, special_function_kind, int);
-extern tree create_temporary_var                (tree);
-extern void initialize_vtbl_ptrs                (tree);
-extern tree build_java_class_ref                (tree);
-extern tree integral_constant_value            (tree);
+extern tree build_vec_delete                   (tree, tree,
+                                                special_function_kind, int);
+extern tree create_temporary_var               (tree);
+extern void initialize_vtbl_ptrs               (tree);
+extern tree build_java_class_ref               (tree);
+extern tree integral_constant_value            (tree);
 
 /* in lex.c */
 extern void cxx_dup_lang_specific_decl         (tree);
 extern void yyungetc                           (int, int);
 
-extern tree unqualified_name_lookup_error       (tree);
-extern tree unqualified_fn_lookup_error         (tree);
+extern tree unqualified_name_lookup_error      (tree);
+extern tree unqualified_fn_lookup_error                (tree);
 extern tree build_lang_decl                    (enum tree_code, tree, tree);
 extern void retrofit_lang_decl                 (tree);
-extern tree copy_decl                           (tree);
-extern tree copy_type                           (tree);
+extern tree copy_decl                          (tree);
+extern tree copy_type                          (tree);
 extern tree cxx_make_type                      (enum tree_code);
 extern tree make_aggr_type                     (enum tree_code);
 extern void yyerror                            (const char *);
 extern void yyhook                             (int);
 extern bool cxx_init                           (void);
-extern void cxx_finish (void);
+extern void cxx_finish                         (void);
 
 /* in method.c */
-extern void init_method        (void);
-extern tree make_thunk (tree, bool, tree, tree);
-extern void finish_thunk (tree);
-extern void use_thunk (tree, bool);
-extern void synthesize_method (tree);
-extern tree implicitly_declare_fn (special_function_kind, tree, bool);
-extern tree lazily_declare_fn (special_function_kind, tree);
-extern tree skip_artificial_parms_for (tree, tree);
+extern void init_method                                (void);
+extern tree make_thunk                         (tree, bool, tree, tree);
+extern void finish_thunk                       (tree);
+extern void use_thunk                          (tree, bool);
+extern void synthesize_method                  (tree);
+extern tree lazily_declare_fn                  (special_function_kind,
+                                                tree);
+extern tree skip_artificial_parms_for          (tree, tree);
+extern tree make_alias_for                     (tree, tree);
 
 /* In optimize.c */
-extern bool maybe_clone_body (tree);
+extern bool maybe_clone_body                   (tree);
 
 /* in pt.c */
 extern void check_template_shadow              (tree);
-extern tree get_innermost_template_args         (tree, int);
+extern tree get_innermost_template_args                (tree, int);
 extern void maybe_begin_member_template_processing (tree);
 extern void maybe_end_member_template_processing (void);
-extern tree finish_member_template_decl         (tree);
+extern tree finish_member_template_decl                (tree);
 extern void begin_template_parm_list           (void);
-extern void begin_specialization                (void);
-extern void reset_specialization                (void);
-extern void end_specialization                  (void);
-extern void begin_explicit_instantiation        (void);
-extern void end_explicit_instantiation          (void);
-extern tree check_explicit_specialization       (tree, tree, int, int);
+extern bool begin_specialization               (void);
+extern void reset_specialization               (void);
+extern void end_specialization                 (void);
+extern void begin_explicit_instantiation       (void);
+extern void end_explicit_instantiation         (void);
+extern tree check_explicit_specialization      (tree, tree, int, int);
 extern tree process_template_parm              (tree, tree, bool);
 extern tree end_template_parm_list             (tree);
 extern void end_template_decl                  (void);
-extern tree current_template_args              (void);
 extern tree push_template_decl                 (tree);
-extern tree push_template_decl_real             (tree, int);
-extern void redeclare_class_template            (tree, tree);
-extern tree lookup_template_class              (tree, tree, tree, tree, int, tsubst_flags_t);
-extern tree lookup_template_function            (tree, tree);
+extern tree push_template_decl_real            (tree, bool);
+extern bool redeclare_class_template           (tree, tree);
+extern tree lookup_template_class              (tree, tree, tree, tree,
+                                                int, tsubst_flags_t);
+extern tree lookup_template_function           (tree, tree);
 extern int uses_template_parms                 (tree);
 extern int uses_template_parms_level           (tree, int);
 extern tree instantiate_class_template         (tree);
 extern tree instantiate_template               (tree, tree, tsubst_flags_t);
-extern int fn_type_unification                  (tree, tree, tree, tree, tree, unification_kind_t);
+extern int fn_type_unification                 (tree, tree, tree, tree,
+                                                tree, unification_kind_t, int);
 extern void mark_decl_instantiated             (tree, int);
 extern int more_specialized_fn                 (tree, tree, int);
-extern void mark_class_instantiated            (tree, int);
 extern void do_decl_instantiation              (tree, tree);
 extern void do_type_instantiation              (tree, tree, tsubst_flags_t);
-extern tree instantiate_decl                   (tree, int, int);
-extern int push_tinst_level                    (tree);
-extern void pop_tinst_level                    (void);
-extern int more_specialized_class              (tree, tree, tree);
-extern int comp_template_parms                  (tree, tree);
-extern int template_class_depth                 (tree);
-extern int is_specialization_of                 (tree, tree);
-extern bool is_specialization_of_friend         (tree, tree);
-extern int comp_template_args                   (tree, tree);
-extern void maybe_process_partial_specialization (tree);
-extern tree most_specialized_instantiation      (tree);
-extern void print_candidates                    (tree);
-extern void instantiate_pending_templates       (int);
-extern tree tsubst_default_argument             (tree, tree, tree);
-extern tree tsubst_copy_and_build               (tree, tree, tsubst_flags_t, tree, bool);
+extern tree instantiate_decl                   (tree, int, bool);
+extern int comp_template_parms                 (tree, tree);
+extern int template_class_depth                        (tree);
+extern int is_specialization_of                        (tree, tree);
+extern bool is_specialization_of_friend                (tree, tree);
+extern int comp_template_args                  (tree, tree);
+extern tree maybe_process_partial_specialization (tree);
+extern tree most_specialized_instantiation     (tree);
+extern void print_candidates                   (tree);
+extern void instantiate_pending_templates      (int);
+extern tree tsubst_default_argument            (tree, tree, tree);
+extern tree tsubst_copy_and_build              (tree, tree, tsubst_flags_t,
+                                                tree, bool, bool);
 extern tree most_general_template              (tree);
 extern tree get_mostly_instantiated_function_type (tree);
-extern int problematic_instantiation_changed    (void);
+extern int problematic_instantiation_changed   (void);
 extern void record_last_problematic_instantiation (void);
-extern tree current_instantiation               (void);
+extern tree current_instantiation              (void);
 extern tree maybe_get_template_decl_from_type_decl (tree);
 extern int processing_template_parmlist;
-extern bool dependent_type_p                    (tree);
+extern bool dependent_type_p                   (tree);
 extern bool any_dependent_template_arguments_p  (tree);
-extern bool dependent_template_p                (tree);
-extern bool dependent_template_id_p             (tree, tree);
-extern bool type_dependent_expression_p         (tree);
+extern bool dependent_template_p               (tree);
+extern bool dependent_template_id_p            (tree, tree);
+extern bool type_dependent_expression_p                (tree);
 extern bool any_type_dependent_arguments_p      (tree);
-extern bool value_dependent_expression_p        (tree);
-extern tree resolve_typename_type               (tree, bool);
-extern tree template_for_substitution           (tree);
-extern tree build_non_dependent_expr            (tree);
-extern tree build_non_dependent_args            (tree);
-extern bool reregister_specialization           (tree, tree, tree);
-extern tree fold_non_dependent_expr             (tree);
-extern tree fold_decl_constant_value            (tree);
+extern bool value_dependent_expression_p       (tree);
+extern tree resolve_typename_type              (tree, bool);
+extern tree template_for_substitution          (tree);
+extern tree build_non_dependent_expr           (tree);
+extern tree build_non_dependent_args           (tree);
+extern bool reregister_specialization          (tree, tree, tree);
+extern tree fold_non_dependent_expr            (tree);
+extern bool explicit_class_specialization_p     (tree);
 
 /* in repo.c */
-extern void init_repo (void);
-extern int repo_emit_p (tree);
-extern bool repo_export_class_p (tree);
-extern void finish_repo (void);
+extern void init_repo                          (void);
+extern int repo_emit_p                         (tree);
+extern bool repo_export_class_p                        (tree);
+extern void finish_repo                                (void);
 
 /* in rtti.c */
 /* A vector of all tinfo decls that haven't been emitted yet.  */
 extern GTY(()) VEC(tree,gc) *unemitted_tinfo_decls;
 
-extern void init_rtti_processing (void);
-extern tree build_typeid (tree);
-extern tree get_tinfo_decl (tree);
-extern tree get_typeid (tree);
-extern tree build_dynamic_cast (tree, tree);
-extern void emit_support_tinfos (void);
-extern bool emit_tinfo_decl (tree);
+extern void init_rtti_processing               (void);
+extern tree build_typeid                       (tree);
+extern tree get_tinfo_decl                     (tree);
+extern tree get_typeid                         (tree);
+extern tree build_dynamic_cast                 (tree, tree);
+extern void emit_support_tinfos                        (void);
+extern bool emit_tinfo_decl                    (tree);
 
 /* in search.c */
-extern bool accessible_base_p (tree, tree, bool);
-extern tree lookup_base (tree, tree, base_access, base_kind *);
-extern tree dcast_base_hint                     (tree, tree);
-extern int accessible_p                         (tree, tree, bool);
-extern tree lookup_field_1                      (tree, tree, bool);
+extern bool accessible_base_p                  (tree, tree, bool);
+extern tree lookup_base                                (tree, tree, base_access,
+                                                base_kind *);
+extern tree dcast_base_hint                    (tree, tree);
+extern int accessible_p                                (tree, tree, bool);
+extern tree lookup_field_1                     (tree, tree, bool);
 extern tree lookup_field                       (tree, tree, int, bool);
-extern int lookup_fnfields_1                    (tree, tree);
-extern int class_method_index_for_fn            (tree, tree);
+extern int lookup_fnfields_1                   (tree, tree);
+extern int class_method_index_for_fn           (tree, tree);
 extern tree lookup_fnfields                    (tree, tree, int);
 extern tree lookup_member                      (tree, tree, int, bool);
 extern int look_for_overrides                  (tree, tree);
-extern void get_pure_virtuals                  (tree);
+extern void get_pure_virtuals                  (tree);
 extern void maybe_suppress_debug_info          (tree);
 extern void note_debug_info_needed             (tree);
 extern void print_search_statistics            (void);
 extern void reinit_search_statistics           (void);
 extern tree current_scope                      (void);
-extern int at_function_scope_p                  (void);
-extern bool at_class_scope_p                    (void);
-extern bool at_namespace_scope_p                (void);
+extern int at_function_scope_p                 (void);
+extern bool at_class_scope_p                   (void);
+extern bool at_namespace_scope_p               (void);
 extern tree context_for_name_lookup            (tree);
 extern tree lookup_conversions                 (tree);
 extern tree binfo_from_vbase                   (tree);
@@ -4046,131 +4226,173 @@ extern tree dfs_walk_all (tree, tree (*) (tree, void *),
                          tree (*) (tree, void *), void *);
 extern tree dfs_walk_once (tree, tree (*) (tree, void *),
                           tree (*) (tree, void *), void *);
-extern tree binfo_via_virtual                   (tree, tree);
-extern tree build_baselink                      (tree, tree, tree, tree);
+extern tree binfo_via_virtual                  (tree, tree);
+extern tree build_baselink                     (tree, tree, tree, tree);
 extern tree adjust_result_of_qualified_name_lookup
-                                                (tree, tree, tree);
+                                               (tree, tree, tree);
 extern tree copied_binfo                       (tree, tree);
 extern tree original_binfo                     (tree, tree);
-extern int shared_member_p                      (tree);
+extern int shared_member_p                     (tree);
+
+
+/* The representation of a deferred access check.  */
+
+typedef struct deferred_access_check GTY(())
+{
+  /* The base class in which the declaration is referenced. */
+  tree binfo;
+  /* The declaration whose access must be checked.  */
+  tree decl;
+  /* The declaration that should be used in the error message.  */
+  tree diag_decl;
+} deferred_access_check;
+DEF_VEC_O(deferred_access_check);
+DEF_VEC_ALLOC_O(deferred_access_check,gc);
 
 /* in semantics.c */
 extern void push_deferring_access_checks       (deferring_kind);
 extern void resume_deferring_access_checks     (void);
 extern void stop_deferring_access_checks       (void);
 extern void pop_deferring_access_checks                (void);
-extern tree get_deferred_access_checks         (void);
-extern void pop_to_parent_deferring_access_checks      (void);
+extern VEC (deferred_access_check,gc)* get_deferred_access_checks              (void);
+extern void pop_to_parent_deferring_access_checks (void);
+extern void perform_access_checks              (VEC (deferred_access_check,gc)*);
 extern void perform_deferred_access_checks     (void);
-extern void perform_or_defer_access_check      (tree, tree);
-extern void init_cp_semantics                   (void);
+extern void perform_or_defer_access_check      (tree, tree, tree);
+extern int stmts_are_full_exprs_p              (void);
+extern void init_cp_semantics                  (void);
+extern tree do_poplevel                                (tree);
 extern void add_decl_expr                      (tree);
-extern tree finish_expr_stmt                    (tree);
-extern tree begin_if_stmt                       (void);
-extern void finish_if_stmt_cond                 (tree, tree);
-extern tree finish_then_clause                  (tree);
+extern tree finish_expr_stmt                   (tree);
+extern tree begin_if_stmt                      (void);
+extern void finish_if_stmt_cond                        (tree, tree);
+extern tree finish_then_clause                 (tree);
 extern void begin_else_clause                  (tree);
-extern void finish_else_clause                  (tree);
-extern void finish_if_stmt                      (tree);
-extern tree begin_while_stmt                    (void);
-extern void finish_while_stmt_cond              (tree, tree);
-extern void finish_while_stmt                   (tree);
-extern tree begin_do_stmt                       (void);
-extern void finish_do_body                      (tree);
-extern void finish_do_stmt                      (tree, tree);
-extern tree finish_return_stmt                  (tree);
-extern tree begin_for_stmt                      (void);
-extern void finish_for_init_stmt                (tree);
-extern void finish_for_cond                     (tree, tree);
-extern void finish_for_expr                     (tree, tree);
-extern void finish_for_stmt                     (tree);
-extern tree finish_break_stmt                   (void);
-extern tree finish_continue_stmt                (void);
-extern tree begin_switch_stmt                   (void);
-extern void finish_switch_cond                  (tree, tree);
-extern void finish_switch_stmt                  (tree);
-extern tree finish_case_label                   (tree, tree);
-extern tree finish_goto_stmt                    (tree);
-extern tree begin_try_block                     (void);
-extern void finish_try_block                    (tree);
+extern void finish_else_clause                 (tree);
+extern void finish_if_stmt                     (tree);
+extern tree begin_while_stmt                   (void);
+extern void finish_while_stmt_cond             (tree, tree);
+extern void finish_while_stmt                  (tree);
+extern tree begin_do_stmt                      (void);
+extern void finish_do_body                     (tree);
+extern void finish_do_stmt                     (tree, tree);
+extern tree finish_return_stmt                 (tree);
+extern tree begin_for_stmt                     (void);
+extern void finish_for_init_stmt               (tree);
+extern void finish_for_cond                    (tree, tree);
+extern void finish_for_expr                    (tree, tree);
+extern void finish_for_stmt                    (tree);
+extern tree finish_break_stmt                  (void);
+extern tree finish_continue_stmt               (void);
+extern tree begin_switch_stmt                  (void);
+extern void finish_switch_cond                 (tree, tree);
+extern void finish_switch_stmt                 (tree);
+extern tree finish_case_label                  (tree, tree);
+extern tree finish_goto_stmt                   (tree);
+extern tree begin_try_block                    (void);
+extern void finish_try_block                   (tree);
 extern tree begin_eh_spec_block                        (void);
 extern void finish_eh_spec_block               (tree, tree);
-extern void finish_handler_sequence             (tree);
-extern tree begin_function_try_block            (void);
-extern void finish_function_try_block           (tree);
-extern void finish_function_handler_sequence    (tree);
-extern void finish_cleanup_try_block            (tree);
-extern tree begin_handler                       (void);
-extern void finish_handler_parms                (tree, tree);
-extern void finish_handler                      (tree);
-extern void finish_cleanup                      (tree, tree);
+extern void finish_handler_sequence            (tree);
+extern tree begin_function_try_block           (tree *);
+extern void finish_function_try_block          (tree);
+extern void finish_function_handler_sequence    (tree, tree);
+extern void finish_cleanup_try_block           (tree);
+extern tree begin_handler                      (void);
+extern void finish_handler_parms               (tree, tree);
+extern void finish_handler                     (tree);
+extern void finish_cleanup                     (tree, tree);
 
 enum {
   BCS_NO_SCOPE = 1,
   BCS_TRY_BLOCK = 2,
   BCS_FN_BODY = 4
 };
-extern tree begin_compound_stmt                 (unsigned int);
+extern tree begin_compound_stmt                        (unsigned int);
 
-extern void finish_compound_stmt                (tree);
-extern tree finish_asm_stmt                     (int, tree, tree, tree, tree);
-extern tree finish_label_stmt                   (tree);
-extern void finish_label_decl                   (tree);
-extern tree finish_parenthesized_expr           (tree);
+extern void finish_compound_stmt               (tree);
+extern tree finish_asm_stmt                    (int, tree, tree, tree, tree);
+extern tree finish_label_stmt                  (tree);
+extern void finish_label_decl                  (tree);
+extern tree finish_parenthesized_expr          (tree);
 extern tree finish_non_static_data_member       (tree, tree, tree);
-extern tree begin_stmt_expr                     (void);
-extern tree finish_stmt_expr_expr              (tree, tree);
-extern tree finish_stmt_expr                    (tree, bool);
-extern tree perform_koenig_lookup               (tree, tree);
-extern tree finish_call_expr                    (tree, tree, bool, bool);
-extern tree finish_increment_expr               (tree, enum tree_code);
-extern tree finish_this_expr                    (void);
+extern tree begin_stmt_expr                    (void);
+extern tree finish_stmt_expr_expr              (tree, tree);
+extern tree finish_stmt_expr                   (tree, bool);
+extern tree perform_koenig_lookup              (tree, tree);
+extern tree finish_call_expr                   (tree, tree, bool, bool);
+extern tree finish_increment_expr              (tree, enum tree_code);
+extern tree finish_this_expr                   (void);
 extern tree finish_pseudo_destructor_expr       (tree, tree, tree);
-extern tree finish_unary_op_expr                (enum tree_code, tree);
-extern tree finish_compound_literal             (tree, tree);
-extern tree finish_fname                        (tree);
-extern void finish_translation_unit             (void);
-extern tree finish_template_type_parm           (tree, tree);
+extern tree finish_unary_op_expr               (enum tree_code, tree);
+extern tree finish_compound_literal            (tree, VEC(constructor_elt,gc) *);
+extern tree finish_fname                       (tree);
+extern void finish_translation_unit            (void);
+extern tree finish_template_type_parm          (tree, tree);
 extern tree finish_template_template_parm       (tree, tree);
-extern tree begin_class_definition              (tree);
-extern void finish_template_decl                (tree);
-extern tree finish_template_type                (tree, tree, int);
-extern tree finish_base_specifier               (tree, tree, bool);
-extern void finish_member_declaration           (tree);
+extern tree begin_class_definition             (tree, tree);
+extern void finish_template_decl               (tree);
+extern tree finish_template_type               (tree, tree, int);
+extern tree finish_base_specifier              (tree, tree, bool);
+extern void finish_member_declaration          (tree);
 extern void qualified_name_lookup_error                (tree, tree, tree);
-extern tree finish_id_expression                (tree, tree, tree,
-                                                cp_id_kind *, tree *,
+extern void check_template_keyword             (tree);
+extern tree finish_id_expression               (tree, tree, tree,
+                                                cp_id_kind *,
                                                 bool, bool, bool *,
+                                                bool, bool, bool, bool,
                                                 const char **);
 extern tree finish_typeof                      (tree);
-extern void finish_decl_cleanup                 (tree, tree);
-extern void finish_eh_cleanup                   (tree);
-extern void expand_body                         (tree);
-extern void finish_mem_initializers             (tree);
+extern tree finish_offsetof                    (tree);
+extern void finish_decl_cleanup                        (tree, tree);
+extern void finish_eh_cleanup                  (tree);
+extern void expand_body                                (tree);
+extern void finish_mem_initializers            (tree);
 extern tree check_template_template_default_arg (tree);
 extern void expand_or_defer_fn                 (tree);
 extern void check_accessibility_of_qualified_id (tree, tree, tree);
-extern tree finish_qualified_id_expr            (tree, tree, bool, bool);
+extern tree finish_qualified_id_expr           (tree, tree, bool, bool,
+                                                bool, bool);
 extern void simplify_aggr_init_expr            (tree *);
 extern void finalize_nrv                       (tree *, tree, tree);
-extern void note_decl_for_pch                   (tree);
+extern void note_decl_for_pch                  (tree);
+extern tree finish_omp_clauses                 (tree);
+extern void finish_omp_threadprivate           (tree);
+extern tree begin_omp_structured_block         (void);
+extern tree finish_omp_structured_block                (tree);
+extern tree begin_omp_parallel                 (void);
+extern tree finish_omp_parallel                        (tree, tree);
+extern tree finish_omp_for                     (location_t, tree, tree,
+                                                tree, tree, tree, tree);
+extern void finish_omp_atomic                  (enum tree_code, tree, tree);
+extern void finish_omp_barrier                 (void);
+extern void finish_omp_flush                   (void);
+extern enum omp_clause_default_kind cxx_omp_predetermined_sharing (tree);
+extern tree cxx_omp_clause_default_ctor                (tree, tree);
+extern tree cxx_omp_clause_copy_ctor           (tree, tree, tree);
+extern tree cxx_omp_clause_assign_op           (tree, tree, tree);
+extern tree cxx_omp_clause_dtor                        (tree, tree);
+extern bool cxx_omp_privatize_by_reference     (tree);
+extern tree baselink_for_fns                    (tree);
+extern void finish_static_assert                (tree, tree, location_t,
+                                                 bool);
 
 /* in tree.c */
 extern void lang_check_failed                  (const char *, int,
-                                                        const char *);
+                                                const char *) ATTRIBUTE_NORETURN;
 extern tree stabilize_expr                     (tree, tree *);
 extern void stabilize_call                     (tree, tree *);
 extern bool stabilize_init                     (tree, tree *);
 extern tree add_stmt_to_compound               (tree, tree);
 extern tree cxx_maybe_build_cleanup            (tree);
-extern void init_tree                          (void);
+extern void init_tree                          (void);
 extern int pod_type_p                          (tree);
 extern int zero_init_p                         (tree);
-extern tree canonical_type_variant              (tree);
+extern tree canonical_type_variant             (tree);
 extern tree copy_binfo                         (tree, tree, tree,
                                                 tree *, int);
 extern int member_p                            (tree);
-extern cp_lvalue_kind real_lvalue_p             (tree);
+extern cp_lvalue_kind real_lvalue_p            (tree);
 extern bool builtin_valid_in_constant_expr_p    (tree);
 extern tree build_min                          (enum tree_code, tree, ...);
 extern tree build_min_nt                       (enum tree_code, ...);
@@ -4180,10 +4402,11 @@ extern tree get_target_expr                     (tree);
 extern tree build_cplus_array_type             (tree, tree);
 extern tree hash_tree_cons                     (tree, tree, tree);
 extern tree hash_tree_chain                    (tree, tree);
+extern tree build_qualified_name               (tree, tree, tree, bool);
 extern int is_overloaded_fn                    (tree);
 extern tree get_first_fn                       (tree);
-extern tree ovl_cons                            (tree, tree);
-extern tree build_overload                      (tree, tree);
+extern tree ovl_cons                           (tree, tree);
+extern tree build_overload                     (tree, tree);
 extern const char *cxx_printable_name          (tree, int);
 extern tree build_exception_variant            (tree, tree);
 extern tree bind_template_template_parm                (tree, tree);
@@ -4192,10 +4415,11 @@ extern tree array_type_nelts_top                (tree);
 extern tree break_out_target_exprs             (tree);
 extern tree get_type_decl                      (tree);
 extern tree decl_namespace_context             (tree);
+extern bool decl_anon_ns_mem_p                 (tree);
 extern tree lvalue_type                                (tree);
 extern tree error_type                         (tree);
 extern int varargs_function_p                  (tree);
-extern int really_overloaded_fn                        (tree);
+extern bool really_overloaded_fn               (tree);
 extern bool cp_tree_equal                      (tree, tree);
 extern tree no_linkage_check                   (tree, bool);
 extern void debug_binfo                                (tree);
@@ -4203,23 +4427,26 @@ extern tree build_dummy_object                  (tree);
 extern tree maybe_dummy_object                 (tree, tree *);
 extern int is_dummy_object                     (tree);
 extern const struct attribute_spec cxx_attribute_table[];
-extern tree make_ptrmem_cst                     (tree, tree);
+extern tree make_ptrmem_cst                    (tree, tree);
 extern tree cp_build_type_attribute_variant     (tree, tree);
-extern tree cp_build_qualified_type_real        (tree, int, tsubst_flags_t);
+extern tree cp_build_qualified_type_real       (tree, int, tsubst_flags_t);
 #define cp_build_qualified_type(TYPE, QUALS) \
-  cp_build_qualified_type_real ((TYPE), (QUALS), tf_error | tf_warning)
+  cp_build_qualified_type_real ((TYPE), (QUALS), tf_warning_or_error)
 extern special_function_kind special_function_p (tree);
-extern int count_trees                          (tree);
-extern int char_type_p                          (tree);
-extern void verify_stmt_tree                    (tree);
-extern tree find_tree                           (tree, tree);
-extern linkage_kind decl_linkage                (tree);
+extern int count_trees                         (tree);
+extern int char_type_p                         (tree);
+extern void verify_stmt_tree                   (tree);
+extern linkage_kind decl_linkage               (tree);
 extern tree cp_walk_subtrees (tree*, int*, walk_tree_fn,
-                                     void*, struct pointer_set_t*);
-extern int cp_cannot_inline_tree_fn (tree*);
-extern tree cp_add_pending_fn_decls (void*,tree);
-extern int cp_auto_var_in_fn_p (tree,tree);
-extern tree fold_if_not_in_template             (tree);
+                             void*, struct pointer_set_t*);
+extern int cp_cannot_inline_tree_fn            (tree*);
+extern tree cp_add_pending_fn_decls            (void*,tree);
+extern int cp_auto_var_in_fn_p                 (tree,tree);
+extern tree fold_if_not_in_template            (tree);
+extern tree rvalue                             (tree);
+extern tree convert_bitfield_to_declared_type   (tree);
+extern tree cp_save_expr                       (tree);
+extern bool cast_valid_in_integral_constant_expression_p (tree);
 
 /* in typeck.c */
 extern int string_conv_p                       (tree, tree, int);
@@ -4229,30 +4456,30 @@ extern tree require_complete_type               (tree);
 extern tree complete_type                      (tree);
 extern tree complete_type_or_else              (tree, tree);
 extern int type_unknown_p                      (tree);
-extern tree original_type                      (tree);
 extern bool comp_except_specs                  (tree, tree, bool);
 extern bool comptypes                          (tree, tree, int);
 extern bool compparms                          (tree, tree);
-extern int comp_cv_qualification                (tree, tree);
-extern int comp_cv_qual_signature               (tree, tree);
-extern tree cxx_sizeof_or_alignof_expr    (tree, enum tree_code);
-extern tree cxx_sizeof_or_alignof_type    (tree, enum tree_code, bool);
+extern int comp_cv_qualification               (tree, tree);
+extern int comp_cv_qual_signature              (tree, tree);
+extern tree cxx_sizeof_or_alignof_expr         (tree, enum tree_code);
+extern tree cxx_sizeof_or_alignof_type         (tree, enum tree_code, bool);
 #define cxx_sizeof_nowarn(T) cxx_sizeof_or_alignof_type (T, SIZEOF_EXPR, false)
 extern tree inline_conversion                  (tree);
+extern tree is_bitfield_expr_with_lowered_type  (tree);
 extern tree decay_conversion                   (tree);
-extern tree default_conversion                  (tree);
 extern tree build_class_member_access_expr      (tree, tree, tree, bool);
-extern tree finish_class_member_access_expr     (tree, tree);
+extern tree finish_class_member_access_expr     (tree, tree, bool);
 extern tree build_x_indirect_ref               (tree, const char *);
 extern tree build_indirect_ref                 (tree, const char *);
 extern tree build_array_ref                    (tree, tree);
 extern tree get_member_function_from_ptrfunc   (tree *, tree);
-extern tree build_x_binary_op                  (enum tree_code, tree, tree,
-                                                bool *);
+extern tree build_x_binary_op                  (enum tree_code, tree,
+                                                enum tree_code, tree,
+                                                enum tree_code, bool *);
 extern tree build_x_unary_op                   (enum tree_code, tree);
 extern tree unary_complex_lvalue               (enum tree_code, tree);
 extern tree build_x_conditional_expr           (tree, tree, tree);
-extern tree build_x_compound_expr_from_list    (tree, const char *);
+extern tree build_x_compound_expr_from_list    (tree, const char *);
 extern tree build_x_compound_expr              (tree, tree);
 extern tree build_compound_expr                        (tree, tree);
 extern tree build_static_cast                  (tree, tree);
@@ -4261,35 +4488,36 @@ extern tree build_const_cast                    (tree, tree);
 extern tree build_c_cast                       (tree, tree);
 extern tree build_x_modify_expr                        (tree, enum tree_code, tree);
 extern tree build_modify_expr                  (tree, enum tree_code, tree);
-extern tree convert_for_initialization         (tree, tree, tree, int, const char *, tree, int);
+extern tree convert_for_initialization         (tree, tree, tree, int,
+                                                const char *, tree, int);
 extern int comp_ptr_ttypes                     (tree, tree);
+extern bool comp_ptr_ttypes_const              (tree, tree);
 extern int ptr_reasonably_similar              (tree, tree);
 extern tree build_ptrmemfunc                   (tree, tree, int, bool);
-extern int cp_type_quals                        (tree);
-extern bool cp_has_mutable_p                     (tree);
-extern bool at_least_as_qualified_p              (tree, tree);
-extern void cp_apply_type_quals_to_decl         (int, tree);
-extern tree build_ptrmemfunc1                   (tree, tree, tree);
-extern void expand_ptrmemfunc_cst               (tree, tree *, tree *);
-extern tree pfn_from_ptrmemfunc                 (tree);
+extern int cp_type_quals                       (tree);
+extern bool cp_has_mutable_p                   (tree);
+extern bool at_least_as_qualified_p            (tree, tree);
+extern void cp_apply_type_quals_to_decl                (int, tree);
+extern tree build_ptrmemfunc1                  (tree, tree, tree);
+extern void expand_ptrmemfunc_cst              (tree, tree *, tree *);
 extern tree type_after_usual_arithmetic_conversions (tree, tree);
-extern tree composite_pointer_type              (tree, tree, tree, tree,
-                                                      const char*);
+extern tree composite_pointer_type             (tree, tree, tree, tree,
+                                                const char*);
 extern tree merge_types                                (tree, tree);
-extern tree check_return_expr                   (tree);
+extern tree check_return_expr                  (tree, bool *);
 #define cp_build_binary_op(code, arg1, arg2) \
   build_binary_op(code, arg1, arg2, 1)
 #define cxx_sizeof(T)  cxx_sizeof_or_alignof_type (T, SIZEOF_EXPR, true)
-extern tree build_ptrmemfunc_access_expr       (tree, tree);
-extern tree build_address                       (tree);
-extern tree build_nop                           (tree, tree);
-extern tree non_reference                       (tree);
-extern tree lookup_anon_field                   (tree, tree);
-extern bool invalid_nonstatic_memfn_p           (tree);
-extern tree convert_member_func_to_ptr          (tree, tree);
-extern tree convert_ptrmem                      (tree, tree, bool, bool);
-extern int lvalue_or_else                       (tree, enum lvalue_use);
-extern int lvalue_p                             (tree);
+extern tree build_ptrmemfunc_access_expr       (tree, tree);
+extern tree build_address                      (tree);
+extern tree build_nop                          (tree, tree);
+extern tree non_reference                      (tree);
+extern tree lookup_anon_field                  (tree, tree);
+extern bool invalid_nonstatic_memfn_p          (tree);
+extern tree convert_member_func_to_ptr         (tree, tree);
+extern tree convert_ptrmem                     (tree, tree, bool, bool);
+extern int lvalue_or_else                      (tree, enum lvalue_use);
+extern int lvalue_p                            (tree);
 
 /* in typeck2.c */
 extern void require_complete_eh_spec_types     (tree, tree);
@@ -4305,49 +4533,62 @@ extern void complete_type_check_abstract        (tree);
 extern int abstract_virtuals_error             (tree, tree);
 
 extern tree store_init_value                   (tree, tree);
-extern tree digest_init                                (tree, tree, tree *);
+extern tree digest_init                                (tree, tree);
 extern tree build_scoped_ref                   (tree, tree, tree *);
 extern tree build_x_arrow                      (tree);
 extern tree build_m_component_ref              (tree, tree);
 extern tree build_functional_cast              (tree, tree);
-extern tree add_exception_specifier             (tree, tree, int);
-extern tree merge_exception_specifiers          (tree, tree);
+extern tree add_exception_specifier            (tree, tree, int);
+extern tree merge_exception_specifiers         (tree, tree);
 
 /* in mangle.c */
-extern void init_mangle                         (void);
-extern void mangle_decl                         (tree);
-extern const char *mangle_type_string           (tree);
-extern tree mangle_typeinfo_for_type            (tree);
-extern tree mangle_typeinfo_string_for_type     (tree);
-extern tree mangle_vtbl_for_type                (tree);
-extern tree mangle_vtt_for_type                 (tree);
-extern tree mangle_ctor_vtbl_for_type           (tree, tree);
-extern tree mangle_thunk                        (tree, int, tree, tree);
-extern tree mangle_conv_op_name_for_type        (tree);
-extern tree mangle_guard_variable               (tree);
-extern tree mangle_ref_init_variable            (tree);
+extern void init_mangle                                (void);
+extern void mangle_decl                                (tree);
+extern const char *mangle_type_string          (tree);
+extern tree mangle_typeinfo_for_type           (tree);
+extern tree mangle_typeinfo_string_for_type    (tree);
+extern tree mangle_vtbl_for_type               (tree);
+extern tree mangle_vtt_for_type                        (tree);
+extern tree mangle_ctor_vtbl_for_type          (tree, tree);
+extern tree mangle_thunk                       (tree, int, tree, tree);
+extern tree mangle_conv_op_name_for_type       (tree);
+extern tree mangle_guard_variable              (tree);
+extern tree mangle_ref_init_variable           (tree);
 
 /* in dump.c */
-extern bool cp_dump_tree                         (void *, tree);
+extern bool cp_dump_tree                       (void *, tree);
+
+/* In cp/cp-objcp-common.c.  */
+
+extern HOST_WIDE_INT cxx_get_alias_set         (tree);
+extern bool cxx_warn_unused_global_decl                (tree);
+extern tree cp_expr_size                       (tree);
+extern size_t cp_tree_size                     (enum tree_code);
+extern bool cp_var_mod_type_p                  (tree, tree);
+extern void cxx_initialize_diagnostics         (struct diagnostic_context *);
+extern int cxx_types_compatible_p              (tree, tree);
+extern void init_shadowed_var_for_decl         (void);
+extern tree cxx_staticp                         (tree);
 
 /* in cp-gimplify.c */
-extern int cp_gimplify_expr                    (tree *, tree *, tree *);
+extern int cp_gimplify_expr                    (tree *, tree *, tree *);
 extern void cp_genericize                      (tree);
 
 /* -- end of C++ */
 
 /* In order for the format checking to accept the C++ frontend
    diagnostic framework extensions, you must include this file before
-   toplev.h, not after.  */
+   toplev.h, not after.  We override the definition of GCC_DIAG_STYLE
+   in c-common.h.  */
+#undef GCC_DIAG_STYLE
 #define GCC_DIAG_STYLE __gcc_cxxdiag__
-#if GCC_VERSION >= 3004
+#if GCC_VERSION >= 4001
 #define ATTRIBUTE_GCC_CXXDIAG(m, n) __attribute__ ((__format__ (GCC_DIAG_STYLE, m, n))) ATTRIBUTE_NONNULL(m)
 #else
 #define ATTRIBUTE_GCC_CXXDIAG(m, n) ATTRIBUTE_NONNULL(m)
 #endif
-
-extern void cp_error_at                (const char *, ...) ATTRIBUTE_GCC_CXXDIAG(1, 2);
-extern void cp_warning_at      (const char *, ...) ATTRIBUTE_GCC_CXXDIAG(1, 2);
-extern void cp_pedwarn_at      (const char *, ...) ATTRIBUTE_GCC_CXXDIAG(1, 2);
+extern void cp_cpp_error                       (cpp_reader *, int,
+                                                const char *, va_list *)
+     ATTRIBUTE_GCC_CXXDIAG(3,0);
 
 #endif /* ! GCC_CP_TREE_H */