/* 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-2022 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 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/>.  */

/* Tree nodes used in the C frontend.  These are also shared with the
   C++ and Objective C frontends.  */

/* A C_MAYBE_CONST_EXPR, currently only used for C and Objective C,
   tracks information about constancy of an expression and VLA type
   sizes or VM expressions from typeof that need to be evaluated
   before the main expression.  It is used during parsing and removed
   in c_fully_fold.  C_MAYBE_CONST_EXPR_PRE is the expression to
   evaluate first, if not NULL; C_MAYBE_CONST_EXPR_EXPR is the main
   expression.  If C_MAYBE_CONST_EXPR_INT_OPERANDS is set then the
   expression may be used in an unevaluated part of an integer
   constant expression, but not in an evaluated part.  If
   C_MAYBE_CONST_EXPR_NON_CONST is set then the expression contains
   something that cannot occur in an evaluated part of a constant
   expression (or outside of sizeof in C90 mode); otherwise it does
   not.  */
DEFTREECODE (C_MAYBE_CONST_EXPR, "c_maybe_const_expr", tcc_expression, 2)

/* An EXCESS_PRECISION_EXPR represents an expression evaluated in greater
   range or precision than its type.  The type of the EXCESS_PRECISION_EXPR
   is the semantic type while the operand represents what is actually being
   evaluated.  */
DEFTREECODE (EXCESS_PRECISION_EXPR, "excess_precision_expr", tcc_expression, 1)

/* Used to represent a user-defined literal.
   The operands are an IDENTIFIER for the suffix, the VALUE of the literal,
   and for numeric literals the original string representation of the
   number.  */
DEFTREECODE (USERDEF_LITERAL, "userdef_literal", tcc_exceptional, 3)

/* Represents a 'sizeof' expression during C++ template expansion,
   or for the purpose of -Wsizeof-pointer-memaccess warning.  */
DEFTREECODE (SIZEOF_EXPR, "sizeof_expr", tcc_expression, 1)

/* Like above, but enclosed in parentheses.  Used to suppress warnings.  */
DEFTREECODE (PAREN_SIZEOF_EXPR, "paren_sizeof_expr", tcc_expression, 1)

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

/* 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_COND and
   DO_BODY, 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)

/* Extensions for C++ Concepts. */

/* Concept definition. This is not entirely different than a VAR_DECL
   except that a) it must be a template, and b) doesn't have the wide
   range of value and linkage options available to variables.  Used
   by C++ FE and in c-family attribute handling.  */
DEFTREECODE (CONCEPT_DECL, "concept_decl", tcc_declaration, 0)

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