| 1 | /* This file contains the definitions and documentation for the |
| 2 | additional tree codes used in the GNU C compiler (see tree.def |
| 3 | for the standard codes). |
| 4 | Copyright (C) 1987-2025 Free Software Foundation, Inc. |
| 5 | Written by Benjamin Chelf <chelf@codesourcery.com> |
| 6 | |
| 7 | This file is part of GCC. |
| 8 | |
| 9 | GCC is free software; you can redistribute it and/or modify it under |
| 10 | the terms of the GNU General Public License as published by the Free |
| 11 | Software Foundation; either version 3, or (at your option) any later |
| 12 | version. |
| 13 | |
| 14 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
| 15 | WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| 16 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| 17 | for more details. |
| 18 | |
| 19 | You should have received a copy of the GNU General Public License |
| 20 | along with GCC; see the file COPYING3. If not see |
| 21 | <http://www.gnu.org/licenses/>. */ |
| 22 | |
| 23 | /* Tree nodes used in the C frontend. These are also shared with the |
| 24 | C++ and Objective C frontends. */ |
| 25 | |
| 26 | /* A C_MAYBE_CONST_EXPR, currently only used for C and Objective C, |
| 27 | tracks information about constancy of an expression and VLA type |
| 28 | sizes or VM expressions from typeof that need to be evaluated |
| 29 | before the main expression. It is used during parsing and removed |
| 30 | in c_fully_fold. C_MAYBE_CONST_EXPR_PRE is the expression to |
| 31 | evaluate first, if not NULL; C_MAYBE_CONST_EXPR_EXPR is the main |
| 32 | expression. If C_MAYBE_CONST_EXPR_INT_OPERANDS is set then the |
| 33 | expression may be used in an unevaluated part of an integer |
| 34 | constant expression, but not in an evaluated part. If |
| 35 | C_MAYBE_CONST_EXPR_NON_CONST is set then the expression contains |
| 36 | something that cannot occur in an evaluated part of a constant |
| 37 | expression (or outside of sizeof in C90 mode); otherwise it does |
| 38 | not. */ |
| 39 | DEFTREECODE (C_MAYBE_CONST_EXPR, "c_maybe_const_expr" , tcc_expression, 2) |
| 40 | |
| 41 | /* An EXCESS_PRECISION_EXPR represents an expression evaluated in greater |
| 42 | range or precision than its type. The type of the EXCESS_PRECISION_EXPR |
| 43 | is the semantic type while the operand represents what is actually being |
| 44 | evaluated. */ |
| 45 | DEFTREECODE (EXCESS_PRECISION_EXPR, "excess_precision_expr" , tcc_expression, 1) |
| 46 | |
| 47 | /* Used to represent a user-defined literal. |
| 48 | The operands are an IDENTIFIER for the suffix, the VALUE of the literal, |
| 49 | and for numeric literals the original string representation of the |
| 50 | number. */ |
| 51 | DEFTREECODE (USERDEF_LITERAL, "userdef_literal" , tcc_exceptional, 3) |
| 52 | |
| 53 | /* Represents a 'countof' expression. */ |
| 54 | DEFTREECODE (COUNTOF_EXPR, "countof_expr" , tcc_expression, 1) |
| 55 | |
| 56 | /* Represents a 'sizeof' expression during C++ template expansion, |
| 57 | or for the purpose of -Wsizeof-pointer-memaccess warning. */ |
| 58 | DEFTREECODE (SIZEOF_EXPR, "sizeof_expr" , tcc_expression, 1) |
| 59 | |
| 60 | /* Like above, but enclosed in parentheses. Used to suppress warnings. */ |
| 61 | DEFTREECODE (PAREN_SIZEOF_EXPR, "paren_sizeof_expr" , tcc_expression, 1) |
| 62 | |
| 63 | /* Used to represent a `for' statement. The operands are |
| 64 | FOR_INIT_STMT, FOR_COND, FOR_EXPR, FOR_BODY, FOR_SCOPE, FOR_NAME, |
| 65 | FOR_COND_PREP and FOR_COND_CLEANUP, respectively. */ |
| 66 | DEFTREECODE (FOR_STMT, "for_stmt" , tcc_statement, 8) |
| 67 | |
| 68 | /* Used to represent a 'while' statement. The operands are WHILE_COND, |
| 69 | WHILE_BODY, WHILE_NAME, WHILE_COND_PREP and WHILE_COND_CLEANUP, |
| 70 | respectively. */ |
| 71 | DEFTREECODE (WHILE_STMT, "while_stmt" , tcc_statement, 5) |
| 72 | |
| 73 | /* Used to represent a 'do' statement. The operands are DO_COND, DO_BODY, |
| 74 | and DO_NAME, respectively. */ |
| 75 | DEFTREECODE (DO_STMT, "do_stmt" , tcc_statement, 3) |
| 76 | |
| 77 | /* Used to represent a 'break' statement. The operand BREAK_NAME is |
| 78 | the {FOR,WHILE,DO,SWITCH}_NAME to which it applies. NULL_TREE means |
| 79 | innermost. */ |
| 80 | DEFTREECODE (BREAK_STMT, "break_stmt" , tcc_statement, 1) |
| 81 | |
| 82 | /* Used to represent a 'continue' statement. The operand CONTINUE_NAME is |
| 83 | the {FOR,WHILE,DO}_STMT to which it applies. NULL_TREE means innermost. */ |
| 84 | DEFTREECODE (CONTINUE_STMT, "continue_stmt" , tcc_statement, 1) |
| 85 | |
| 86 | /* Used to represent a 'switch' statement. The operands are |
| 87 | SWITCH_STMT_COND, SWITCH_STMT_BODY, SWITCH_STMT_TYPE, SWITCH_STMT_SCOPE, |
| 88 | and SWITCH_STMT_NAME, respectively. */ |
| 89 | DEFTREECODE (SWITCH_STMT, "switch_stmt" , tcc_statement, 5) |
| 90 | |
| 91 | /* Extensions for C++ Concepts. */ |
| 92 | |
| 93 | /* Concept definition. This is not entirely different than a VAR_DECL |
| 94 | except that a) it must be a template, and b) doesn't have the wide |
| 95 | range of value and linkage options available to variables. Used |
| 96 | by C++ FE and in c-family attribute handling. */ |
| 97 | DEFTREECODE (CONCEPT_DECL, "concept_decl" , tcc_declaration, 0) |
| 98 | |
| 99 | /* |
| 100 | Local variables: |
| 101 | mode:c |
| 102 | End: |
| 103 | */ |
| 104 | |