/* This file contains the definitions and documentation for the
   additional tree codes used in the GNU C++ compiler (see tree.def
   for the standard codes).
   Copyright (C) 1987-2014 Free Software Foundation, Inc.
   Hacked by Michael Tiemann (tiemann@cygnus.com)

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.

GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
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 COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */


/* An OFFSET_REF is used in two situations:

   1. An expression of the form `A::m' where `A' is a class and `m' is
      a non-static member.  In this case, operand 0 will be a TYPE
      (corresponding to `A') and operand 1 will be a FIELD_DECL,
      BASELINK, or TEMPLATE_ID_EXPR (corresponding to `m').

      The expression is a pointer-to-member if its address is taken,
      but simply denotes a member of the object if its address is not
      taken.

      This form is only used during the parsing phase; once semantic
      analysis has taken place they are eliminated.

   2. An expression of the form `x.*p'.  In this case, operand 0 will
      be an expression corresponding to `x' and operand 1 will be an
      expression with pointer-to-member type.  */
DEFTREECODE (OFFSET_REF, "offset_ref", tcc_reference, 2)

/* A pointer-to-member constant.  For a pointer-to-member constant
   `X::Y' The PTRMEM_CST_CLASS is the RECORD_TYPE for `X' and the
   PTRMEM_CST_MEMBER is the _DECL for `Y'.  */
DEFTREECODE (PTRMEM_CST, "ptrmem_cst", tcc_constant, 0)

/* For NEW_EXPR, operand 0 is the placement list.
   Operand 1 is the new-declarator.
   Operand 2 is the number of elements in the array.
   Operand 3 is the initializer.  */
DEFTREECODE (NEW_EXPR, "nw_expr", tcc_expression, 4)
DEFTREECODE (VEC_NEW_EXPR, "vec_nw_expr", tcc_expression, 3)

/* For DELETE_EXPR, operand 0 is the store to be destroyed.
   Operand 1 is the value to pass to the destroying function
   saying whether the store should be deallocated as well.  */
DEFTREECODE (DELETE_EXPR, "dl_expr", tcc_expression, 2)
DEFTREECODE (VEC_DELETE_EXPR, "vec_dl_expr", tcc_expression, 2)

/* Value is reference to particular overloaded class method.
   Operand 0 is the class, operand 1 is the field
   The COMPLEXITY field holds the class level (usually 0).  */
DEFTREECODE (SCOPE_REF, "scope_ref", tcc_reference, 2)

/* When composing an object with a member, this is the result.
   Operand 0 is the object.  Operand 1 is the member (usually
   a dereferenced pointer to member).  */
DEFTREECODE (MEMBER_REF, "member_ref", tcc_reference, 2)

/* Type conversion operator in C++.  TREE_TYPE is type that this
   operator converts to.  Operand is expression to be converted.  */
DEFTREECODE (TYPE_EXPR, "type_expr", tcc_expression, 1)

/* AGGR_INIT_EXPRs have a variably-sized representation similar to
   that of CALL_EXPRs.  Operand 0 is an INTEGER_CST node containing the
   operand count, operand 1 is the function which performs initialization,
   operand 2 is the slot which was allocated for this expression, and
   the remaining operands are the arguments to the initialization function.  */
DEFTREECODE (AGGR_INIT_EXPR, "aggr_init_expr", tcc_vl_exp, 3)

/* Initialization of an array from another array, expressed at a high level
   so that it works with TARGET_EXPR.  Operand 0 is the target, operand 1
   is the initializer.  */
DEFTREECODE (VEC_INIT_EXPR, "vec_init_expr", tcc_expression, 2)

/* A throw expression.  operand 0 is the expression, if there was one,
   else it is NULL_TREE.  */
DEFTREECODE (THROW_EXPR, "throw_expr", tcc_expression, 1)

/* An empty class object.  The TREE_TYPE gives the class type.  We use
   these to avoid actually creating instances of the empty classes.  */
DEFTREECODE (EMPTY_CLASS_EXPR, "empty_class_expr", tcc_expression, 0)

/* A reference to a member function or member functions from a base
   class.  BASELINK_FUNCTIONS gives the FUNCTION_DECL,
   TEMPLATE_DECL, OVERLOAD, or TEMPLATE_ID_EXPR corresponding to the
   functions.  BASELINK_BINFO gives the base from which the functions
   come, i.e., the base to which the `this' pointer must be converted
   before the functions are called.  BASELINK_ACCESS_BINFO gives the
   base used to name the functions.

   A BASELINK is an expression; the TREE_TYPE of the BASELINK gives
   the type of the expression.  This type is either a FUNCTION_TYPE,
   METHOD_TYPE, or `unknown_type_node' indicating that the function is
   overloaded.  */
DEFTREECODE (BASELINK, "baselink", tcc_exceptional, 0)

/* Template definition.  The following fields have the specified uses,
   although there are other macros in cp-tree.h that should be used for
   accessing this data.
	DECL_ARGUMENTS		template parm vector
	DECL_TEMPLATE_INFO      template text &c
	DECL_VINDEX		list of instantiations already produced;
				only done for functions so far
   For class template:
	DECL_INITIAL		associated templates (methods &c)
	DECL_TEMPLATE_RESULT    null
   For non-class templates:
	TREE_TYPE		type of object to be constructed
	DECL_TEMPLATE_RESULT    decl for object to be created
				(e.g., FUNCTION_DECL with tmpl parms used)
 */
DEFTREECODE (TEMPLATE_DECL, "template_decl", tcc_declaration, 0)

/* Index into a template parameter list.  The TEMPLATE_PARM_IDX gives
   the index (from 0) of the parameter, while the TEMPLATE_PARM_LEVEL
   gives the level (from 1) of the parameter.

   Here's an example:

   template <class T> // Index 0, Level 1.
   struct S
   {
      template <class U, // Index 0, Level 2.
		class V> // Index 1, Level 2.
      void f();
   };

   The DESCENDANTS will be a chain of TEMPLATE_PARM_INDEXs descended
   from this one.  The first descendant will have the same IDX, but
   its LEVEL will be one less.  The TREE_CHAIN field is used to chain
   together the descendants.  The TEMPLATE_PARM_DECL is the
   declaration of this parameter, either a TYPE_DECL or CONST_DECL.
   The TEMPLATE_PARM_ORIG_LEVEL is the LEVEL of the most distant
   parent, i.e., the LEVEL that the parameter originally had when it
   was declared.  For example, if we instantiate S<int>, we will have:

   struct S<int>
   {
     template <class U, // Index 0, Level 1, Orig Level 2
	       class V> // Index 1, Level 1, Orig Level 2
     void f();
   };

   The LEVEL is the level of the parameter when we are worrying about
   the types of things; the ORIG_LEVEL is the level when we are
   worrying about instantiating things.  */
DEFTREECODE (TEMPLATE_PARM_INDEX, "template_parm_index", tcc_exceptional, 0)

/* Index into a template parameter list for template template parameters.
   This parameter must be a type.  The TYPE_FIELDS value will be a
   TEMPLATE_PARM_INDEX.

   It is used without template arguments like TT in C<TT>,
   TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO is NULL_TREE
   and TYPE_NAME is a TEMPLATE_DECL.  */
DEFTREECODE (TEMPLATE_TEMPLATE_PARM, "template_template_parm", tcc_type, 0)

/* The ordering of the following codes is optimized for the checking
   macros in tree.h.  Changing the order will degrade the speed of the
   compiler.  TEMPLATE_TYPE_PARM, TYPENAME_TYPE, TYPEOF_TYPE,
   BOUND_TEMPLATE_TEMPLATE_PARM.  */

/* Index into a template parameter list.  This parameter must be a type.
   The type.values field will be a TEMPLATE_PARM_INDEX.  */
DEFTREECODE (TEMPLATE_TYPE_PARM, "template_type_parm", tcc_type, 0)

/* A type designated by `typename T::t'.  TYPE_CONTEXT is `T',
   TYPE_NAME is an IDENTIFIER_NODE for `t'.  If the type was named via
   template-id, TYPENAME_TYPE_FULLNAME will hold the TEMPLATE_ID_EXPR.
   TREE_TYPE is always NULL.  */
DEFTREECODE (TYPENAME_TYPE, "typename_type", tcc_type, 0)

/* A type designated by `__typeof (expr)'.  TYPEOF_TYPE_EXPR is the
   expression in question.  */
DEFTREECODE (TYPEOF_TYPE, "typeof_type", tcc_type, 0)

/* Like TEMPLATE_TEMPLATE_PARM it is used with bound template arguments
   like TT<int>.
   In this case, TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO contains the
   template name and its bound arguments.  TYPE_NAME is a TYPE_DECL.  */
DEFTREECODE (BOUND_TEMPLATE_TEMPLATE_PARM, "bound_template_template_parm",
	     tcc_type, 0)

/* For template template argument of the form `T::template C'.
   TYPE_CONTEXT is `T', the template parameter dependent object.
   TYPE_NAME is an IDENTIFIER_NODE for `C', the member class template.  */
DEFTREECODE (UNBOUND_CLASS_TEMPLATE, "unbound_class_template", tcc_type, 0)

/* A using declaration.  USING_DECL_SCOPE contains the specified
   scope.  In a member using decl, unless DECL_DEPENDENT_P is true,
   USING_DECL_DECLS contains the _DECL or OVERLOAD so named.  This is
   not an alias, but is later expanded into multiple aliases.  */
DEFTREECODE (USING_DECL, "using_decl", tcc_declaration, 0)

/* A using directive. The operand is USING_STMT_NAMESPACE.  */
DEFTREECODE (USING_STMT, "using_stmt", tcc_statement, 1)

/* An un-parsed default argument.  Holds a vector of input tokens and
   a vector of places where the argument was instantiated before
   parsing had occurred.  */
DEFTREECODE (DEFAULT_ARG, "default_arg", tcc_exceptional, 0)

/* An uninstantiated noexcept-specification.  DEFERRED_NOEXCEPT_PATTERN is
   the pattern from the template, and DEFERRED_NOEXCEPT_ARGS are the
   template arguments to substitute into the pattern when needed.  */
DEFTREECODE (DEFERRED_NOEXCEPT, "deferred_noexcept", tcc_exceptional, 0)

/* A template-id, like foo<int>.  The first operand is the template.
   The second is NULL if there are no explicit arguments, or a
   TREE_VEC of arguments.  The template will be a FUNCTION_DECL,
   TEMPLATE_DECL, or an OVERLOAD.  If the template-id refers to a
   member template, the template may be an IDENTIFIER_NODE.  */
DEFTREECODE (TEMPLATE_ID_EXPR, "template_id_expr", tcc_expression, 2)

/* A list-like node for chaining overloading candidates. TREE_TYPE is
   the original name, and the parameter is the FUNCTION_DECL.  */
DEFTREECODE (OVERLOAD, "overload", tcc_exceptional, 0)

/* A pseudo-destructor, of the form "OBJECT.~DESTRUCTOR" or
   "OBJECT.SCOPE::~DESTRUCTOR.  The first operand is the OBJECT.  The
   second operand (if non-NULL) is the SCOPE.  The third operand is
   the TYPE node corresponding to the DESTRUCTOR.  The type of the
   first operand will always be a scalar type.

   The type of a PSEUDO_DTOR_EXPR is always "void", even though it can
   be used as if it were a zero-argument function.  We handle the
   function-call case specially, and giving it "void" type prevents it
   being used in expressions in ways that are not permitted.  */
DEFTREECODE (PSEUDO_DTOR_EXPR, "pseudo_dtor_expr", tcc_expression, 3)

/* A whole bunch of tree codes for the initial, superficial parsing of
   templates.  */
DEFTREECODE (MODOP_EXPR, "modop_expr", tcc_expression, 3)
DEFTREECODE (CAST_EXPR, "cast_expr", tcc_unary, 1)
DEFTREECODE (REINTERPRET_CAST_EXPR, "reinterpret_cast_expr", tcc_unary, 1)
DEFTREECODE (CONST_CAST_EXPR, "const_cast_expr", tcc_unary, 1)
DEFTREECODE (STATIC_CAST_EXPR, "static_cast_expr", tcc_unary, 1)
DEFTREECODE (DYNAMIC_CAST_EXPR, "dynamic_cast_expr", tcc_unary, 1)
DEFTREECODE (IMPLICIT_CONV_EXPR, "implicit_conv_expr", tcc_unary, 1)
DEFTREECODE (DOTSTAR_EXPR, "dotstar_expr", tcc_expression, 2)
DEFTREECODE (TYPEID_EXPR, "typeid_expr", tcc_expression, 1)
DEFTREECODE (NOEXCEPT_EXPR, "noexcept_expr", tcc_unary, 1)

/* A placeholder for an expression that is not type-dependent, but
   does occur in a template.  When an expression that is not
   type-dependent appears in a larger expression, we must compute the
   type of that larger expression.  That computation would normally
   modify the original expression, which would change the mangling of
   that expression if it appeared in a template argument list.  In
   that situation, we create a NON_DEPENDENT_EXPR to take the place of
   the original expression.  The expression is the only operand -- it
   is only needed for diagnostics.  */
DEFTREECODE (NON_DEPENDENT_EXPR, "non_dependent_expr", tcc_expression, 1)

/* CTOR_INITIALIZER is a placeholder in template code for a call to
   setup_vtbl_pointer (and appears in all functions, not just ctors).  */
DEFTREECODE (CTOR_INITIALIZER, "ctor_initializer", tcc_expression, 1)

DEFTREECODE (TRY_BLOCK, "try_block", tcc_statement, 2)

DEFTREECODE (EH_SPEC_BLOCK, "eh_spec_block", tcc_statement, 2)

/* A HANDLER wraps a catch handler for the HANDLER_TYPE.  If this is
   CATCH_ALL_TYPE, then the handler catches all types.  The declaration of
   the catch variable is in HANDLER_PARMS, and the body block in
   HANDLER_BODY.  */
DEFTREECODE (HANDLER, "handler", tcc_statement, 2)

/* A MUST_NOT_THROW_EXPR wraps an expression that may not
   throw, and must call terminate if it does.  The second argument
   is a condition, used in templates to express noexcept (condition).  */
DEFTREECODE (MUST_NOT_THROW_EXPR, "must_not_throw_expr", tcc_expression, 2)

/* A CLEANUP_STMT marks the point at which a declaration is fully
   constructed.  The CLEANUP_EXPR is run on behalf of CLEANUP_DECL
   when CLEANUP_BODY completes.  */
DEFTREECODE (CLEANUP_STMT, "cleanup_stmt", tcc_statement, 3)

/* Represents an 'if' statement. The operands are IF_COND,
   THEN_CLAUSE, and ELSE_CLAUSE, and the current scope, respectively.  */
/* ??? It is currently still necessary to distinguish between IF_STMT
   and COND_EXPR for the benefit of templates.  */
DEFTREECODE (IF_STMT, "if_stmt", tcc_statement, 4)

/* Used to represent a `for' statement. The operands are
   FOR_INIT_STMT, FOR_COND, FOR_EXPR, and FOR_BODY, respectively.  */
DEFTREECODE (FOR_STMT, "for_stmt", tcc_statement, 5)

/* Used to represent a range-based `for' statement. The operands are
   RANGE_FOR_DECL, RANGE_FOR_EXPR, RANGE_FOR_BODY, and RANGE_FOR_SCOPE,
   respectively.  Only used in templates.  */
DEFTREECODE (RANGE_FOR_STMT, "range_for_stmt", tcc_statement, 4)

/* Used to represent a 'while' statement. The operands are WHILE_COND
   and WHILE_BODY, respectively.  */
DEFTREECODE (WHILE_STMT, "while_stmt", tcc_statement, 2)

/* Used to represent a 'do' statement. The operands are DO_BODY and
   DO_COND, respectively.  */
DEFTREECODE (DO_STMT, "do_stmt", tcc_statement, 2)

/* Used to represent a 'break' statement.  */
DEFTREECODE (BREAK_STMT, "break_stmt", tcc_statement, 0)

/* Used to represent a 'continue' statement.  */
DEFTREECODE (CONTINUE_STMT, "continue_stmt", tcc_statement, 0)

/* Used to represent a 'switch' statement. The operands are
   SWITCH_STMT_COND, SWITCH_STMT_BODY, SWITCH_STMT_TYPE, and
   SWITCH_STMT_SCOPE, respectively.  */
DEFTREECODE (SWITCH_STMT, "switch_stmt", tcc_statement, 4)

/* Used to represent an expression statement.  Use `EXPR_STMT_EXPR' to
   obtain the expression.  */
DEFTREECODE (EXPR_STMT, "expr_stmt", tcc_expression, 1)

DEFTREECODE (TAG_DEFN, "tag_defn", tcc_expression, 0)

/* Represents an 'offsetof' expression during template expansion.  */
DEFTREECODE (OFFSETOF_EXPR, "offsetof_expr", tcc_expression, 1)

/* Represents the -> operator during template expansion.  */
DEFTREECODE (ARROW_EXPR, "arrow_expr", tcc_expression, 1)

/* Represents an '__alignof__' expression during template
   expansion.  */
DEFTREECODE (ALIGNOF_EXPR, "alignof_expr", tcc_expression, 1)

/* Represents an Objective-C++ '@encode' expression during template
   expansion.  */
DEFTREECODE (AT_ENCODE_EXPR, "at_encode_expr", tcc_expression, 1)

/* A STMT_EXPR represents a statement-expression during template
   expansion.  This is the GCC extension { ( ... ) }.  The
   STMT_EXPR_STMT is the statement given by the expression.  */
DEFTREECODE (STMT_EXPR, "stmt_expr", tcc_expression, 1)

/* Unary plus. Operand 0 is the expression to which the unary plus
   is applied.  */
DEFTREECODE (UNARY_PLUS_EXPR, "unary_plus_expr", tcc_unary, 1)

/** C++0x extensions. */

/* A static assertion.  This is a C++0x extension.
   STATIC_ASSERT_CONDITION contains the condition that is being
   checked.  STATIC_ASSERT_MESSAGE contains the message (a string
   literal) to be displayed if the condition fails to hold.  */
DEFTREECODE (STATIC_ASSERT, "static_assert", tcc_exceptional, 0)

/* Represents an argument pack of types (or templates). An argument
   pack stores zero or more arguments that will be used to instantiate
   a parameter pack. 

   ARGUMENT_PACK_ARGS retrieves the arguments stored in the argument
   pack.

   Example:
     template<typename... Values>
     class tuple { ... };

     tuple<int, float, double> t;

   Values is a (template) parameter pack. When tuple<int, float,
   double> is instantiated, the Values parameter pack is instantiated
   with the argument pack <int, float, double>. ARGUMENT_PACK_ARGS will
   be a TREE_VEC containing int, float, and double.  */
DEFTREECODE (TYPE_ARGUMENT_PACK, "type_argument_pack", tcc_type, 0)

/* Represents an argument pack of values, which can be used either for
   non-type template arguments or function call arguments. 

   NONTYPE_ARGUMENT_PACK plays precisely the same role as
   TYPE_ARGUMENT_PACK, but will be used for packing non-type template
   arguments (e.g., "int... Dimensions") or function arguments ("const
   Args&... args"). */
DEFTREECODE (NONTYPE_ARGUMENT_PACK, "nontype_argument_pack", tcc_expression, 1)

/* Represents a type expression that will be expanded into a list of
   types when instantiated with one or more argument packs.

   PACK_EXPANSION_PATTERN retrieves the expansion pattern. This is
   the type or expression that we will substitute into with each
   argument in an argument pack.

   SET_PACK_EXPANSION_PATTERN sets the expansion pattern.

   PACK_EXPANSION_PARAMETER_PACKS contains a TREE_LIST of the parameter
   packs that are used in this pack expansion.

   Example:
     template<typename... Values>
     struct tied : tuple<Values&...> { 
       // ...
     };

   The derivation from tuple contains a TYPE_PACK_EXPANSION for the
   template arguments. Its PACK_EXPANSION_PATTERN is "Values&" and its
   PACK_EXPANSION_PARAMETER_PACKS will contain "Values".  */
DEFTREECODE (TYPE_PACK_EXPANSION, "type_pack_expansion", tcc_type, 0)

/* Represents an expression that will be expanded into a list of
   expressions when instantiated with one or more argument packs.

   EXPR_PACK_EXPANSION plays precisely the same role as TYPE_PACK_EXPANSION,
   but will be used for expressions.  */
DEFTREECODE (EXPR_PACK_EXPANSION, "expr_pack_expansion", tcc_expression, 3)

/* Selects the Ith parameter out of an argument pack. This node will
   be used when instantiating pack expansions; see
   tsubst_pack_expansion. 

   ARGUMENT_PACK_SELECT_FROM_PACK contains the *_ARGUMENT_PACK node
   from which the argument will be selected.

   ARGUMENT_PACK_SELECT_INDEX contains the index into the argument
   pack that will be returned by this ARGUMENT_PACK_SELECT node. The
   index is a machine integer.  */
DEFTREECODE (ARGUMENT_PACK_SELECT, "argument_pack_select", tcc_exceptional, 0)

/** C++ extensions. */

/* Represents a trait expression during template expansion.  */
DEFTREECODE (TRAIT_EXPR, "trait_expr", tcc_exceptional, 0)

/* A lambda expression.  This is a C++0x extension.
   LAMBDA_EXPR_DEFAULT_CAPTURE_MODE is an enum for the default, which may be
   none.
   LAMBDA_EXPR_CAPTURE_LIST holds the capture-list, including `this'.
   LAMBDA_EXPR_THIS_CAPTURE goes straight to the capture of `this', if it exists.
   LAMBDA_EXPR_PENDING_PROXIES is a vector of capture proxies which need to
   be pushed once scope returns to the lambda.
   LAMBDA_EXPR_MUTABLE_P signals whether this lambda was declared mutable.
   LAMBDA_EXPR_RETURN_TYPE holds the return type, if it was specified.  */
DEFTREECODE (LAMBDA_EXPR, "lambda_expr", tcc_exceptional, 0)

/* The declared type of an expression.  This is a C++0x extension.
   DECLTYPE_TYPE_EXPR is the expression whose type we are computing.
   DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P states whether the
   expression was parsed as an id-expression or a member access
   expression. When false, it was parsed as a full expression.
   DECLTYPE_FOR_LAMBDA_CAPTURE is set if we want lambda capture semantics.
   DECLTYPE_FOR_LAMBDA_RETURN is set if we want lambda return deduction.  */
DEFTREECODE (DECLTYPE_TYPE, "decltype_type", tcc_type, 0)

/* A type designated by `__underlying_type (type)'.
   UNDERLYING_TYPE_TYPE is the type in question.  */
DEFTREECODE (UNDERLYING_TYPE, "underlying_type", tcc_type, 0)

/* A type designated by one of the bases type traits.
   BASES_TYPE is the type in question.  */
DEFTREECODE (BASES, "bases", tcc_type, 0)

/* Used to represent the template information stored by template
   specializations.
   The accessors are:
   TI_TEMPLATE the template declaration associated to the specialization
   TI_ARGS the arguments of the template specialization
   TI_TYPEDEFS_NEEDING_ACCESS_CHECKING the vector of typedefs used in
   the pattern of the template for which access check is needed at template
   instantiation time.  */
DEFTREECODE (TEMPLATE_INFO, "template_info", tcc_exceptional, 0)

/*
Local variables:
mode:c
End:
*/
