/* 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, 1988, 1990, 1993, 1997, 1998,
   1999, 2000, 2001 Free Software Foundation, Inc.
   Written by Benjamin Chelf <chelf@codesourcery.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 2, 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 COPYING.  If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.  */

/* Tree nodes relevant to both C and C++. These were originally in
cp-tree.def in the cp subdir. */

/* A node to remember a source position.  */
DEFTREECODE (SRCLOC, "srcloc", 'x', 2)

DEFTREECODE (SIZEOF_EXPR, "sizeof_expr", '1', 1)
DEFTREECODE (ARROW_EXPR, "arrow_expr", 'e', 1)
DEFTREECODE (ALIGNOF_EXPR, "alignof_expr", '1', 1)

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

/* Used to represent a brace-enclosed block.  The operand is
   COMPOUND_BODY. */ 
DEFTREECODE (COMPOUND_STMT, "compound_stmt", 'e', 1)

/* Used to represent a local declaration. The operand is
   DECL_STMT_DECL. */
DEFTREECODE (DECL_STMT, "decl_stmt", 'e', 1)

/* Represents an 'if' statement. The operands are IF_COND,
   THEN_CLAUSE, and ELSE_CLAUSE, respectively. */
DEFTREECODE (IF_STMT, "if_stmt", 'e', 3)

/* 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", 'e', 4)

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

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

/* Used to represent a 'return' statement. The operand is
   RETURN_EXPR. */
DEFTREECODE (RETURN_STMT, "return_stmt", 'e', 1)

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

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

/* Used to represent a 'switch' statement. The operands are
   SWITCH_COND and SWITCH_BODY, respectively. */
DEFTREECODE (SWITCH_STMT, "switch_stmt", 'e', 2)

/* Used to represent a 'goto' statement. The operand is GOTO_DESTINATION. */
DEFTREECODE (GOTO_STMT, "goto_stmt", 'e', 1)

/* Used to represent a 'label' statement. The operand is a LABEL_DECL
   and can be obtained through the macro LABEL_STMT_LABEL. */
DEFTREECODE (LABEL_STMT, "label_stmt", 'e', 1)

/* Used to represent an inline assembly statement. */
DEFTREECODE (ASM_STMT, "asm_stmt", 'e', 5)

/* A SCOPE_STMT marks the beginning or end of a scope.  If
   SCOPE_BEGIN_P holds, then this is the start of a scope.  If
   SCOPE_END_P holds, then this is the end of a scope.  If
   SCOPE_NULLIFIED_P holds then there turned out to be no variables in
   this scope.  The SCOPE_STMT_BLOCK is the BLOCK containing the
   variables declared in this scope.  */
DEFTREECODE (SCOPE_STMT, "scope_stmt", 'e', 1)

/* A FILE_STMT marks the spot where a function changes files.  It has no
   other semantics.  FILE_STMT_FILENAME gives the name.  */
DEFTREECODE (FILE_STMT, "file_stmt", 'e', 1)

/* Used to represent a CASE_LABEL. The operands are CASE_LOW and
   CASE_HIGH, respectively. If CASE_LOW is NULL_TREE, the label is a
   'default' label. If CASE_HIGH is NULL_TREE, the label is a normal case
   label.  The CASE_LABEL_DECL is a LABEL_DECL for this node.  */
DEFTREECODE (CASE_LABEL, "case_label", 'e', 3)

/* A STMT_EXPR represents a statement-expression.  The
   STMT_EXPR_STMT is the statement given by the expression.  */
DEFTREECODE (STMT_EXPR, "stmt_expr", 'e', 1)

/* A COMPOUND_LITERAL_EXPR represents a C99 compound literal.  The
   COMPOUND_LITERAL_EXPR_DECL_STMT is the a DECL_STMT containing the decl
   for the anonymous object represented by the COMPOUND_LITERAL;
   the DECL_INITIAL of that decl is the CONSTRUCTOR that initializes
   the compound literal.  */
DEFTREECODE (COMPOUND_LITERAL_EXPR, "compound_literal_expr", 'e', 1)

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