/* This file contains the definitions and documentation for the
   additional tree codes used in the CHILL front end (see tree.def
   for the standard codes).
   Copyright (C) 1992, 1993 Free Software Foundation, Inc.

This file is part of GNU CC.

GNU CC 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 2, or (at your option)
any later version.

GNU CC 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 GNU CC; see the file COPYING.  If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */


/* 
 * CHILL types.
 */
DEFTREECODE (GRANT_TYPE, "grant_type", 't', 0)
DEFTREECODE (SEIZE_TYPE, "seize_type", 't', 0)
/* 
 * CHILL decls.
 */
DEFTREECODE (KEYWORD_DECL, "keyword_decl", 'd', 0)
DEFTREECODE (INSTANCE_METHOD_DECL, "instance_method_decl", 'd', 0)
DEFTREECODE (CLASS_METHOD_DECL, "class_method_decl", 'd', 0)

/* A 'SEIZE (OLD->NEW)!POSTFIX' or 'GRANT (OLD->NEW)!POSTFIX' is
   represented as an ALIAS_DECL where DECL_OLD_PREFIX, DECL_NEW_PREFIX,
   and DECL_POSTFIX points to OLD, NEW, and POSTFIX, respectively.
   These are IDENTIFIER_NODEs, or NULL if empty.
   DECL_NAME is NEW!POSTFIX.  After binding, DECL_ABSTRACT_ORIGIN
   (if not an error_mark) points to a decl whose DECL_NAME is OLD!POSTFIX.
   and which this name is linked to.
   For SEIZE, DECL_SEIZEFILE names the most recent use_seize_file directive.
   For GRANT, DECL_SEIZEFILE names the seizefile doing the granting. */
DEFTREECODE (ALIAS_DECL, "alias_decl", 'd', 0)

/* A variable, which is BASED on a pointer variable in DECL_ABSTRACT_ORIGIN. */
DEFTREECODE (BASED_DECL, "based_decl", 'd', 0)

/* A pseudo-variable declared by a DO WITH. */
DEFTREECODE (WITH_DECL, "with_decl", 'd', 0)

/*
 * CHILL exprs.
 */
DEFTREECODE (CONCAT_EXPR, "concat_expr", '2', 2)

/* A slice (sub-array or sub-string) of operand 0, where
   operand 1 is the start of the slice, and operand 2 is its length.
   Currently, only used for bitstring sclices. */
DEFTREECODE (SLICE_EXPR, "slice_expr", 'e', 3)

/* Later, SET_IN_EXPR might be replaced by BIT_FIELD_REF or IN_EXPR. */
DEFTREECODE (SET_IN_EXPR, "set_in_expr", '2', 2)

/* A CASE_EXPR EX implements Chill CASE expression.
   TREE_OPERAND (EX, 0) is a TREE_LIST representing the <case selector list>,
   with one node for each expression.  (Only one is supported by the
   current implementation.)
   TREE_OPERAND (EX, 1) is also a TREE_LIST, with one node for each
   <value case alternative>.   The TREE_VALUE of these node is the
   <sub expression> (case element body); the TREE_PURPOSE contains
   the <case label specification>.  (The TREE_PURPOSE for the
   optional ELSE (default) branch is NULL_TREE.)  Each <case label
   specification> is also represented as a list with one TREE_LIST
   node for each <case label list> (though only length==1 is currently
   supported).  And finally: each <case label list> is again a list
   with one TREE_LIST node for each <case label>. */
DEFTREECODE (CASE_EXPR, "case_expr", 'e', 2)

/* Powerset and static bit array operations.
   Operands have same mode as result.  */
DEFTREECODE (SET_NOT_EXPR,  "set_not_expr",  '1', 1)
DEFTREECODE (SET_IOR_EXPR,  "set_ior_expr",  '2', 2)
DEFTREECODE (SET_XOR_EXPR,  "set_xor_expr",  '2', 2)
DEFTREECODE (SET_AND_EXPR,  "set_and_expr",  '2', 2)
DEFTREECODE (SET_DIFF_EXPR, "set_diff_expr", '2', 2)
DEFTREECODE (PAREN_EXPR,  "paren_expr",  '1', 1)

DEFTREECODE (STRING_EQ_EXPR, "string_eq_expr", '2', 2)
DEFTREECODE (STRING_LT_EXPR, "string_lt_expr", '2', 2)

/* Used to represent a string repetition expression, until
   we have a type for it;  a SET_TYPE replicator needs a
   TYPE_DOMAIN even if it represents the empty set */
DEFTREECODE (REPLICATE_EXPR, "replicate_expr", 'e', 2)

/* An undefined value.  Used for the Chill operator '*',
   and sometimes for padding. */
DEFTREECODE (UNDEFINED_EXPR, "undefined_expr", 'e', 0)

/* Used to represent a process instance */
DEFTREECODE (INSTANCE_TYPE, "instance_type", 't', 0)

/* Used to represent a reference to an array of bitfields. Currently restricted
   to fields which are 1 bit wide.  */
DEFTREECODE (PACKED_ARRAY_REF, "packed_array_ref", 'r', 2)

/* ALSO NOTE:  LANG_TYPE is used for two things during pass 1;
   such a node is converted to some other type node during satisfy.
   If CH_NOVELTY_FLAG is set, then this node is a logical copy of
   its TREE_TYPE, but with a different novelty.
   If TYPE_READONLY is set, then the node stands for 'READ M'
   where M is the TREE_TYPE.  */
