150397Sobrien/* This file contains the definitions and documentation for the 250397Sobrien additional tree codes used in the GNU C++ compiler (see tree.def 350397Sobrien for the standard codes). 4169689Skan Copyright (C) 1987, 1988, 1990, 1993, 1997, 1998, 2003, 2004, 2005, 5169689Skan 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 650397Sobrien Hacked by Michael Tiemann (tiemann@cygnus.com) 750397Sobrien 8132718SkanThis file is part of GCC. 950397Sobrien 10132718SkanGCC is free software; you can redistribute it and/or modify 1150397Sobrienit under the terms of the GNU General Public License as published by 1250397Sobrienthe Free Software Foundation; either version 2, or (at your option) 1350397Sobrienany later version. 1450397Sobrien 15132718SkanGCC is distributed in the hope that it will be useful, 1650397Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of 1750397SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1850397SobrienGNU General Public License for more details. 1950397Sobrien 2050397SobrienYou should have received a copy of the GNU General Public License 21132718Skanalong with GCC; see the file COPYING. If not, write to 22169689Skanthe Free Software Foundation, 51 Franklin Street, Fifth Floor, 23169689SkanBoston, MA 02110-1301, USA. */ 2450397Sobrien 25169689Skan 26117395Skan/* An OFFSET_REF is used in two situations: 27117395Skan 28117395Skan 1. An expression of the form `A::m' where `A' is a class and `m' is 29132718Skan a non-static member. In this case, operand 0 will be a TYPE 30132718Skan (corresponding to `A') and operand 1 will be a FIELD_DECL, 31132718Skan BASELINK, or TEMPLATE_ID_EXPR (corresponding to `m'). 32117395Skan 33117395Skan The expression is a pointer-to-member if its address is taken, 34169689Skan but simply denotes a member of the object if its address is not 35169689Skan taken. 36169689Skan 37132718Skan This form is only used during the parsing phase; once semantic 38132718Skan analysis has taken place they are eliminated. 39117395Skan 40117395Skan 2. An expression of the form `x.*p'. In this case, operand 0 will 41117395Skan be an expression corresponding to `x' and operand 1 will be an 42132718Skan expression with pointer-to-member type. */ 43169689SkanDEFTREECODE (OFFSET_REF, "offset_ref", tcc_reference, 2) 4450397Sobrien 4552284Sobrien/* A pointer-to-member constant. For a pointer-to-member constant 4652284Sobrien `X::Y' The PTRMEM_CST_CLASS is the RECORD_TYPE for `X' and the 4752284Sobrien PTRMEM_CST_MEMBER is the _DECL for `Y'. */ 48169689SkanDEFTREECODE (PTRMEM_CST, "ptrmem_cst", tcc_constant, 0) 4952284Sobrien 5050397Sobrien/* For NEW_EXPR, operand 0 is the placement list. 5150397Sobrien Operand 1 is the new-declarator. 52169689Skan Operand 2 is the number of elements in the array. 53169689Skan Operand 3 is the initializer. */ 54169689SkanDEFTREECODE (NEW_EXPR, "nw_expr", tcc_expression, 4) 55169689SkanDEFTREECODE (VEC_NEW_EXPR, "vec_nw_expr", tcc_expression, 3) 5650397Sobrien 5750397Sobrien/* For DELETE_EXPR, operand 0 is the store to be destroyed. 5850397Sobrien Operand 1 is the value to pass to the destroying function 5950397Sobrien saying whether the store should be deallocated as well. */ 60169689SkanDEFTREECODE (DELETE_EXPR, "dl_expr", tcc_expression, 2) 61169689SkanDEFTREECODE (VEC_DELETE_EXPR, "vec_dl_expr", tcc_expression, 2) 6250397Sobrien 6350397Sobrien/* Value is reference to particular overloaded class method. 64132718Skan Operand 0 is the class, operand 1 is the field 6550397Sobrien The COMPLEXITY field holds the class level (usually 0). */ 66169689SkanDEFTREECODE (SCOPE_REF, "scope_ref", tcc_reference, 2) 6750397Sobrien 6850397Sobrien/* When composing an object with a member, this is the result. 6950397Sobrien Operand 0 is the object. Operand 1 is the member (usually 7050397Sobrien a dereferenced pointer to member). */ 71169689SkanDEFTREECODE (MEMBER_REF, "member_ref", tcc_reference, 2) 7250397Sobrien 7350397Sobrien/* Type conversion operator in C++. TREE_TYPE is type that this 7450397Sobrien operator converts to. Operand is expression to be converted. */ 75169689SkanDEFTREECODE (TYPE_EXPR, "type_expr", tcc_expression, 1) 7650397Sobrien 7750397Sobrien/* For AGGR_INIT_EXPR, operand 0 is function which performs initialization, 7850397Sobrien operand 1 is argument list to initialization function, 7950397Sobrien and operand 2 is the slot which was allocated for this expression. */ 80169689SkanDEFTREECODE (AGGR_INIT_EXPR, "aggr_init_expr", tcc_expression, 3) 8150397Sobrien 8250397Sobrien/* A throw expression. operand 0 is the expression, if there was one, 8350397Sobrien else it is NULL_TREE. */ 84169689SkanDEFTREECODE (THROW_EXPR, "throw_expr", tcc_expression, 1) 8550397Sobrien 8690075Sobrien/* An empty class object. The TREE_TYPE gives the class type. We use 8790075Sobrien these to avoid actually creating instances of the empty classes. */ 88169689SkanDEFTREECODE (EMPTY_CLASS_EXPR, "empty_class_expr", tcc_expression, 0) 8950397Sobrien 90117395Skan/* A reference to a member function or member functions from a base 91117395Skan class. BASELINK_FUNCTIONS gives the FUNCTION_DECL, 92117395Skan TEMPLATE_DECL, OVERLOAD, or TEMPLATE_ID_EXPR corresponding to the 93117395Skan functions. BASELINK_BINFO gives the base from which the functions 94117395Skan come, i.e., the base to which the `this' pointer must be converted 95117395Skan before the functions are called. BASELINK_ACCESS_BINFO gives the 96169689Skan base used to name the functions. 97117395Skan 98117395Skan A BASELINK is an expression; the TREE_TYPE of the BASELINK gives 99117395Skan the type of the expression. This type is either a FUNCTION_TYPE, 100117395Skan METHOD_TYPE, or `unknown_type_node' indicating that the function is 101169689Skan overloaded. */ 102169689SkanDEFTREECODE (BASELINK, "baselink", tcc_exceptional, 0) 103117395Skan 10450397Sobrien/* Template definition. The following fields have the specified uses, 10550397Sobrien although there are other macros in cp-tree.h that should be used for 10650397Sobrien accessing this data. 107169689Skan DECL_ARGUMENTS template parm vector 108169689Skan DECL_TEMPLATE_INFO template text &c 10950397Sobrien DECL_VINDEX list of instantiations already produced; 11050397Sobrien only done for functions so far 11150397Sobrien For class template: 112169689Skan DECL_INITIAL associated templates (methods &c) 113169689Skan DECL_TEMPLATE_RESULT null 11450397Sobrien For non-class templates: 11550397Sobrien TREE_TYPE type of object to be constructed 116169689Skan DECL_TEMPLATE_RESULT decl for object to be created 117169689Skan (e.g., FUNCTION_DECL with tmpl parms used) 11850397Sobrien */ 119169689SkanDEFTREECODE (TEMPLATE_DECL, "template_decl", tcc_declaration, 0) 12050397Sobrien 12150397Sobrien/* Index into a template parameter list. The TEMPLATE_PARM_IDX gives 12250397Sobrien the index (from 0) of the parameter, while the TEMPLATE_PARM_LEVEL 12350397Sobrien gives the level (from 1) of the parameter. 12450397Sobrien 12550397Sobrien Here's an example: 126169689Skan 12750397Sobrien template <class T> // Index 0, Level 1. 12850397Sobrien struct S 12950397Sobrien { 13050397Sobrien template <class U, // Index 0, Level 2. 131169689Skan class V> // Index 1, Level 2. 13250397Sobrien void f(); 133169689Skan }; 13450397Sobrien 13550397Sobrien The DESCENDANTS will be a chain of TEMPLATE_PARM_INDEXs descended 13650397Sobrien from this one. The first descendant will have the same IDX, but 13750397Sobrien its LEVEL will be one less. The TREE_CHAIN field is used to chain 13850397Sobrien together the descendants. The TEMPLATE_PARM_DECL is the 13950397Sobrien declaration of this parameter, either a TYPE_DECL or CONST_DECL. 14050397Sobrien The TEMPLATE_PARM_ORIG_LEVEL is the LEVEL of the most distant 14150397Sobrien parent, i.e., the LEVEL that the parameter originally had when it 14250397Sobrien was declared. For example, if we instantiate S<int>, we will have: 14350397Sobrien 14450397Sobrien struct S<int> 14550397Sobrien { 14650397Sobrien template <class U, // Index 0, Level 1, Orig Level 2 147169689Skan class V> // Index 1, Level 1, Orig Level 2 14850397Sobrien void f(); 14950397Sobrien }; 150169689Skan 15150397Sobrien The LEVEL is the level of the parameter when we are worrying about 15250397Sobrien the types of things; the ORIG_LEVEL is the level when we are 15350397Sobrien worrying about instantiating things. */ 154169689SkanDEFTREECODE (TEMPLATE_PARM_INDEX, "template_parm_index", tcc_exceptional, 0) 15550397Sobrien 15690075Sobrien/* Index into a template parameter list for template template parameters. 157169689Skan This parameter must be a type. The TYPE_FIELDS value will be a 15890075Sobrien TEMPLATE_PARM_INDEX. 15990075Sobrien 160169689Skan It is used without template arguments like TT in C<TT>, 16190075Sobrien TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO is NULL_TREE 16290075Sobrien and TYPE_NAME is a TEMPLATE_DECL. */ 163169689SkanDEFTREECODE (TEMPLATE_TEMPLATE_PARM, "template_template_parm", tcc_type, 0) 16450397Sobrien 165169689Skan/* The ordering of the following codes is optimized for the checking 166169689Skan macros in tree.h. Changing the order will degrade the speed of the 167169689Skan compiler. TEMPLATE_TYPE_PARM, TYPENAME_TYPE, TYPEOF_TYPE, 168169689Skan BOUND_TEMPLATE_TEMPLATE_PARM. */ 16990075Sobrien 170169689Skan/* Index into a template parameter list. This parameter must be a type. 171169689Skan The type.values field will be a TEMPLATE_PARM_INDEX. */ 172169689SkanDEFTREECODE (TEMPLATE_TYPE_PARM, "template_type_parm", tcc_type, 0) 173169689Skan 17452284Sobrien/* A type designated by `typename T::t'. TYPE_CONTEXT is `T', 17552284Sobrien TYPE_NAME is an IDENTIFIER_NODE for `t'. If the type was named via 17652284Sobrien template-id, TYPENAME_TYPE_FULLNAME will hold the TEMPLATE_ID_EXPR. 177169689Skan TREE_TYPE is always NULL. */ 178169689SkanDEFTREECODE (TYPENAME_TYPE, "typename_type", tcc_type, 0) 17950397Sobrien 180169689Skan/* A type designated by `__typeof (expr)'. TYPEOF_TYPE_EXPR is the 181169689Skan expression in question. */ 182169689SkanDEFTREECODE (TYPEOF_TYPE, "typeof_type", tcc_type, 0) 183169689Skan 184169689Skan/* Like TEMPLATE_TEMPLATE_PARM it is used with bound template arguments 185169689Skan like TT<int>. 186169689Skan In this case, TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO contains the 187169689Skan template name and its bound arguments. TYPE_NAME is a TYPE_DECL. */ 188169689SkanDEFTREECODE (BOUND_TEMPLATE_TEMPLATE_PARM, "bound_template_template_parm", 189169689Skan tcc_type, 0) 190169689Skan 19190075Sobrien/* For template template argument of the form `T::template C'. 19290075Sobrien TYPE_CONTEXT is `T', the template parameter dependent object. 19390075Sobrien TYPE_NAME is an IDENTIFIER_NODE for `C', the member class template. */ 194169689SkanDEFTREECODE (UNBOUND_CLASS_TEMPLATE, "unbound_class_template", tcc_type, 0) 19590075Sobrien 196169689Skan/* A using declaration. USING_DECL_SCOPE contains the specified 197169689Skan scope. In a member using decl, unless DECL_DEPENDENT_P is true, 198169689Skan USING_DECL_DECLS contains the _DECL or OVERLOAD so named. This is 199169689Skan not an alias, but is later expanded into multiple aliases. */ 200169689SkanDEFTREECODE (USING_DECL, "using_decl", tcc_declaration, 0) 20152284Sobrien 202169689Skan/* A using directive. The operand is USING_STMT_NAMESPACE. */ 203169689SkanDEFTREECODE (USING_STMT, "using_directive", tcc_statement, 1) 20450397Sobrien 205169689Skan/* An un-parsed default argument. Holds a vector of input tokens and 206169689Skan a vector of places where the argument was instantiated before 207169689Skan parsing had occurred. */ 208169689SkanDEFTREECODE (DEFAULT_ARG, "default_arg", tcc_exceptional, 0) 20990075Sobrien 21052284Sobrien/* A template-id, like foo<int>. The first operand is the template. 211132718Skan The second is NULL if there are no explicit arguments, or a 212132718Skan TREE_VEC of arguments. The template will be a FUNCTION_DECL, 213132718Skan TEMPLATE_DECL, or an OVERLOAD. If the template-id refers to a 214132718Skan member template, the template may be an IDENTIFIER_NODE. */ 215169689SkanDEFTREECODE (TEMPLATE_ID_EXPR, "template_id_expr", tcc_expression, 2) 21650397Sobrien 217169689Skan/* A list-like node for chaining overloading candidates. TREE_TYPE is 21850397Sobrien the original name, and the parameter is the FUNCTION_DECL. */ 219169689SkanDEFTREECODE (OVERLOAD, "overload", tcc_exceptional, 0) 22050397Sobrien 221169689Skan/* A pseudo-destructor, of the form "OBJECT.~DESTRUCTOR" or 222169689Skan "OBJECT.SCOPE::~DESTRUCTOR. The first operand is the OBJECT. The 223169689Skan second operand (if non-NULL) is the SCOPE. The third operand is 224169689Skan the TYPE node corresponding to the DESTRUCTOR. The type of the 225169689Skan first operand will always be a scalar type. 22650397Sobrien 227169689Skan The type of a PSEUDO_DTOR_EXPR is always "void", even though it can 228169689Skan be used as if it were a zero-argument function. We handle the 229169689Skan function-call case specially, and giving it "void" type prevents it 230169689Skan being used in expressions in ways that are not permitted. */ 231169689SkanDEFTREECODE (PSEUDO_DTOR_EXPR, "pseudo_dtor_expr", tcc_expression, 3) 232169689Skan 23350397Sobrien/* A whole bunch of tree codes for the initial, superficial parsing of 23450397Sobrien templates. */ 235169689SkanDEFTREECODE (MODOP_EXPR, "modop_expr", tcc_expression, 3) 236169689SkanDEFTREECODE (CAST_EXPR, "cast_expr", tcc_unary, 1) 237169689SkanDEFTREECODE (REINTERPRET_CAST_EXPR, "reinterpret_cast_expr", tcc_unary, 1) 238169689SkanDEFTREECODE (CONST_CAST_EXPR, "const_cast_expr", tcc_unary, 1) 239169689SkanDEFTREECODE (STATIC_CAST_EXPR, "static_cast_expr", tcc_unary, 1) 240169689SkanDEFTREECODE (DYNAMIC_CAST_EXPR, "dynamic_cast_expr", tcc_unary, 1) 241169689SkanDEFTREECODE (DOTSTAR_EXPR, "dotstar_expr", tcc_expression, 2) 242169689SkanDEFTREECODE (TYPEID_EXPR, "typeid_expr", tcc_expression, 1) 24350397Sobrien 244132718Skan/* A placeholder for an expression that is not type-dependent, but 245132718Skan does occur in a template. When an expression that is not 246132718Skan type-dependent appears in a larger expression, we must compute the 247132718Skan type of that larger expression. That computation would normally 248132718Skan modify the original expression, which would change the mangling of 249132718Skan that expression if it appeared in a template argument list. In 250132718Skan that situation, we create a NON_DEPENDENT_EXPR to take the place of 251132718Skan the original expression. The expression is the only operand -- it 252169689Skan is only needed for diagnostics. */ 253169689SkanDEFTREECODE (NON_DEPENDENT_EXPR, "non_dependent_expr", tcc_expression, 1) 254132718Skan 25590075Sobrien/* CTOR_INITIALIZER is a placeholder in template code for a call to 25690075Sobrien setup_vtbl_pointer (and appears in all functions, not just ctors). */ 257169689SkanDEFTREECODE (CTOR_INITIALIZER, "ctor_initializer", tcc_expression, 1) 258169689Skan 259169689SkanDEFTREECODE (TRY_BLOCK, "try_block", tcc_statement, 2) 260169689Skan 261169689SkanDEFTREECODE (EH_SPEC_BLOCK, "eh_spec_block", tcc_statement, 2) 262169689Skan 26390075Sobrien/* A HANDLER wraps a catch handler for the HANDLER_TYPE. If this is 26490075Sobrien CATCH_ALL_TYPE, then the handler catches all types. The declaration of 26590075Sobrien the catch variable is in HANDLER_PARMS, and the body block in 26690075Sobrien HANDLER_BODY. */ 267169689SkanDEFTREECODE (HANDLER, "handler", tcc_statement, 2) 26850397Sobrien 26990075Sobrien/* A MUST_NOT_THROW_EXPR wraps an expression that may not 27090075Sobrien throw, and must call terminate if it does. */ 271169689SkanDEFTREECODE (MUST_NOT_THROW_EXPR, "must_not_throw_expr", tcc_expression, 1) 27290075Sobrien 273169689Skan/* A CLEANUP_STMT marks the point at which a declaration is fully 274169689Skan constructed. The CLEANUP_EXPR is run on behalf of CLEANUP_DECL 275169689Skan when CLEANUP_BODY completes. */ 276169689SkanDEFTREECODE (CLEANUP_STMT, "cleanup_stmt", tcc_statement, 3) 27750397Sobrien 278169689Skan/* Represents an 'if' statement. The operands are IF_COND, 279169689Skan THEN_CLAUSE, and ELSE_CLAUSE, respectively. */ 280169689Skan/* ??? It is currently still necessary to distinguish between IF_STMT 281169689Skan and COND_EXPR for the benefit of templates. */ 282169689SkanDEFTREECODE (IF_STMT, "if_stmt", tcc_statement, 3) 28350397Sobrien 284260014Spfg/* APPLE LOCAL begin for-fsf-4_4 3274130 5295549 */ \ 285169689Skan/* Used to represent a `for' statement. The operands are 286260014Spfg FOR_INIT_STMT, FOR_COND, FOR_EXPR, FOR_BODY and FOR_ATTRIBUTES 287260014Spfg respectively. */ 288260014SpfgDEFTREECODE (FOR_STMT, "for_stmt", tcc_statement, 5) 289117395Skan 290169689Skan/* Used to represent a 'while' statement. The operands are WHILE_COND 291260014Spfg WHILE_BODY, and WHILE_ATTRIBUTES respectively. */ 292260014SpfgDEFTREECODE (WHILE_STMT, "while_stmt", tcc_statement, 3) 29350397Sobrien 294260014Spfg/* APPLE LOCAL begin radar 4445586 */ 295260014Spfg/* Used to represent a 'do' statement. The operands are DO_BODY, 296260014Spfg DO_COND, DO_ATTRIBUTES, and DO_FOREACH respectively. */ 297260014SpfgDEFTREECODE (DO_STMT, "do_stmt", tcc_statement, 4) 298260014Spfg/* APPLE LOCAL end radar 4445586 */ 299169689Skan 300260014Spfg/* APPLE LOCAL end for-fsf-4_4 3274130 5295549 */ \ 301169689Skan/* Used to represent a 'break' statement. */ 302169689SkanDEFTREECODE (BREAK_STMT, "break_stmt", tcc_statement, 0) 303169689Skan 304169689Skan/* Used to represent a 'continue' statement. */ 305169689SkanDEFTREECODE (CONTINUE_STMT, "continue_stmt", tcc_statement, 0) 306169689Skan 307169689Skan/* Used to represent a 'switch' statement. The operands are 308169689Skan SWITCH_STMT_COND, SWITCH_STMT_BODY and SWITCH_STMT_TYPE, respectively. */ 309169689SkanDEFTREECODE (SWITCH_STMT, "switch_stmt", tcc_statement, 3) 310169689Skan 311169689Skan/* Used to represent an expression statement. Use `EXPR_STMT_EXPR' to 312169689Skan obtain the expression. */ 313169689SkanDEFTREECODE (EXPR_STMT, "expr_stmt", tcc_expression, 1) 314169689Skan 315169689SkanDEFTREECODE (TAG_DEFN, "tag_defn", tcc_expression, 0) 316169689Skan 317169689Skan/* Template instantiation level node. 318169689Skan 319169689Skan TINST_DECL contains the original DECL node. 320169689Skan TINST_LOCATION contains the location where the template is instantiated. 321169689Skan TINST_IN_SYSTEM_HEADER_P is true if the location is in a system header. 322169689Skan 323169689Skan A stack of template instantiation nodes is kept through the TREE_CHAIN 324169689Skan fields of these nodes. */ 325169689Skan 326169689SkanDEFTREECODE (TINST_LEVEL, "TINST_LEVEL", tcc_exceptional, 0) 327169689Skan 328169689Skan/* Represents an 'offsetof' expression during template expansion. */ 329169689SkanDEFTREECODE (OFFSETOF_EXPR, "offsetof_expr", tcc_expression, 1) 330169689Skan 331169689Skan/* Represents a 'sizeof' expression during template expansion. */ 332169689SkanDEFTREECODE (SIZEOF_EXPR, "sizeof_expr", tcc_expression, 1) 333169689Skan 334169689Skan/* Represents the -> operator during template expansion. */ 335169689SkanDEFTREECODE (ARROW_EXPR, "arrow_expr", tcc_expression, 1) 336169689Skan 337169689Skan/* Represents an '__alignof__' expression during template 338169689Skan expansion. */ 339169689SkanDEFTREECODE (ALIGNOF_EXPR, "alignof_expr", tcc_expression, 1) 340169689Skan 341169689Skan/* A STMT_EXPR represents a statement-expression during template 342169689Skan expansion. This is the GCC extension { ( ... ) }. The 343169689Skan STMT_EXPR_STMT is the statement given by the expression. */ 344169689SkanDEFTREECODE (STMT_EXPR, "stmt_expr", tcc_expression, 1) 345169689Skan 346169689Skan/* Unary plus. Operand 0 is the expression to which the unary plus 347169689Skan is applied. */ 348169689SkanDEFTREECODE (UNARY_PLUS_EXPR, "unary_plus_expr", tcc_unary, 1) 349169689Skan 35050397Sobrien/* 35150397SobrienLocal variables: 35250397Sobrienmode:c 35350397SobrienEnd: 35450397Sobrien*/ 355