/* 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, 2004, 2005 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.  */

DEFTREECODE (SIZEOF_EXPR, "sizeof_expr", tcc_unary, 1)
DEFTREECODE (ARROW_EXPR, "arrow_expr", tcc_expression, 1)
DEFTREECODE (ALIGNOF_EXPR, "alignof_expr", tcc_unary, 1)
/* APPLE LOCAL radar 4278774 */
DEFTREECODE (AT_ENCODE_EXPR, "at_encode_expr", tcc_unary, 1)

/* APPLE LOCAL begin CW asm blocks */
/* Tree nodes for CW asm block.  */
/* Use to represent [x].  */
DEFTREECODE (BRACKET_EXPR, "bracket_expr", tcc_unary, 2)
/* APPLE LOCAL end CW asm blocks */

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

/* 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_expression, 4)

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

/* Used to represent a 'do' statement. The operands are DO_BODY and
   DO_COND, respectively.  */
/* APPLE LOCAL radar 4445586 */
DEFTREECODE (DO_STMT, "do_stmt", tcc_expression, 3)

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

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

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

/* A STMT_EXPR represents a statement-expression.  The
   STMT_EXPR_STMT is the statement given by the expression.  */
DEFTREECODE (STMT_EXPR, "stmt_expr", tcc_expression, 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", tcc_expression, 1)

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