alias.c (find_base_decl): Remove unreachable case '3' block.
authorJeffrey D. Oldham <oldham@codesourcery.com>
Fri, 17 Sep 2004 21:55:02 +0000 (21:55 +0000)
committerZack Weinberg <zack@gcc.gnu.org>
Fri, 17 Sep 2004 21:55:02 +0000 (21:55 +0000)
2004-09-17  Jeffrey D. Oldham  <oldham@codesourcery.com>
    Zack Weinberg  <zack@codesourcery.com>

* alias.c (find_base_decl): Remove unreachable case '3' block.
* expr.c (safe_from_p): Abort if passed a type.
* tree-gimple.c (recalculate_side_effects): Abort if passed
anything other than an expression.
* tree-ssa-pre.c (phi_translate): Return expr immediately if
is_gimple_min_invariant is true for it.  Reorder cases for clarity.
Abort on un-handled tree classes.
(valid_in_set): Likewise.
* tree.c (tree_code_class_strings): New static data.

* tree.h (enum tree_code_class): New.
(tree_code_class_strings): Declare.
(TREE_CODE_CLASS_STRING, EXCEPTIONAL_CLASS_P, CONSTANT_CLASS_P)
(REFERENCE_CLASS_P, COMPARISON_CLASS_P, UNARY_CLASS_P, BINARY_CLASS_P)
(STATEMENT_CLASS_P, EXPRESSION_CLASS_P, IS_TYPE_OR_DECL_P): New macros.
(TYPE_P, DECL_P, IS_NON_TYPE_CODE_CLASS, IS_EXPR_CODE_CLASS)
(checking macros, EXPR_LOCATION, SET_EXPR_LOCATION, EXPR_LOCUS): Update.

* tree.def, c-common.def, objc/objc-tree.def: Use
tree_code_class enumeration constants instead of code letters.

* alias.c, builtins.c, c-common.c, c-format.c, c-lang.c, c-pragma.c
* c-typeck.c, cgraphunit.c, convert.c, dbxout.c, dwarf2out.c
* emit-rtl.c expr.c, fold-const.c, gimplify.c, lambda-code.c
* langhooks.c, langhooks.h, predict.c, print-tree.c, reload1.c, stmt.c
* tree-browser.c, tree-cfg.c, tree-chrec.c, tree-complex.c, tree-dfa.c
* tree-dump.c, tree-eh.c, tree-gimple.c, tree-inline.c, tree-nested.c
* tree-outof-ssa.c, tree-pretty-print.c, tree-sra.c, tree-ssa-ccp.c
* tree-ssa-dce.c, tree-ssa-dom.c, tree-ssa-forwprop.c, tree-ssa-live.c
* tree-ssa-loop-im.c, tree-ssa-loop-ivopts.c, tree-ssa-operands.c
* tree-ssa-phiopt.c, tree-ssa-pre.c, tree-ssa-propagate.c
* tree-ssa.c, tree-ssanames.c, tree-tailcall.c, tree.c, varasm.c
* config/sol2-c.c, config/arm/arm.c, config/i386/winnt.c
* config/pa/pa.c, config/pa/pa.h, config/sh/sh.c, objc/objc-lang.c
Update to match.

* LANGUAGES: Add note about change.

ada:
* ada-tree.def: Use tree_code_class enumeration constants
instead of code letters.
* ada-tree.h, decl.c, misc.c, trans.c, utils.c, utils2.c:
Update for new tree-class enumeration constants.

cp:
* cp-tree.def: Use tree_code_class enumeration constants
instead of code letters.
* call.c, class.c, cp-gimplify.c, cp-lang.c, cxx-pretty-print.c
* mangle.c, pt.c, semantics.c, tree.c, typeck.c:
Update for new tree-class enumeration constants.

fortran:
* f95-lang.c, trans-expr.c, trans.c: Update for new tree-class
enumeration constants.

java:
* java-tree.def: Use tree_code_class enumeration constants
instead of code letters.
* java-gimplify.c, jcf-write.c, lang.c, parse.y: Update for
new tree-class enumeration constants.

treelang:
* treetree.c: Update for new tree-class enumeration constants.

From-SVN: r87675

97 files changed:
gcc/ChangeLog
gcc/LANGUAGES
gcc/ada/ChangeLog
gcc/ada/ada-tree.def
gcc/ada/ada-tree.h
gcc/ada/decl.c
gcc/ada/misc.c
gcc/ada/trans.c
gcc/ada/utils.c
gcc/ada/utils2.c
gcc/alias.c
gcc/builtins.c
gcc/c-common.c
gcc/c-common.def
gcc/c-format.c
gcc/c-lang.c
gcc/c-pragma.c
gcc/c-typeck.c
gcc/cgraphunit.c
gcc/config/arm/arm.c
gcc/config/i386/winnt.c
gcc/config/pa/pa.c
gcc/config/pa/pa.h
gcc/config/sh/sh.c
gcc/config/sol2-c.c
gcc/convert.c
gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/class.c
gcc/cp/cp-gimplify.c
gcc/cp/cp-lang.c
gcc/cp/cp-tree.def
gcc/cp/cxx-pretty-print.c
gcc/cp/mangle.c
gcc/cp/pt.c
gcc/cp/semantics.c
gcc/cp/tree.c
gcc/cp/typeck.c
gcc/dbxout.c
gcc/dwarf2out.c
gcc/emit-rtl.c
gcc/expr.c
gcc/fold-const.c
gcc/fortran/ChangeLog
gcc/fortran/f95-lang.c
gcc/fortran/trans-expr.c
gcc/fortran/trans.c
gcc/gimplify.c
gcc/java/ChangeLog
gcc/java/java-gimplify.c
gcc/java/java-tree.def
gcc/java/jcf-write.c
gcc/java/lang.c
gcc/java/parse.y
gcc/lambda-code.c
gcc/langhooks.c
gcc/langhooks.h
gcc/objc/objc-lang.c
gcc/objc/objc-tree.def
gcc/predict.c
gcc/print-tree.c
gcc/reload1.c
gcc/stmt.c
gcc/tree-browser.c
gcc/tree-cfg.c
gcc/tree-chrec.c
gcc/tree-complex.c
gcc/tree-dfa.c
gcc/tree-dump.c
gcc/tree-eh.c
gcc/tree-gimple.c
gcc/tree-inline.c
gcc/tree-nested.c
gcc/tree-outof-ssa.c
gcc/tree-pretty-print.c
gcc/tree-sra.c
gcc/tree-ssa-alias.c
gcc/tree-ssa-ccp.c
gcc/tree-ssa-dce.c
gcc/tree-ssa-dom.c
gcc/tree-ssa-forwprop.c
gcc/tree-ssa-live.c
gcc/tree-ssa-loop-im.c
gcc/tree-ssa-loop-ivopts.c
gcc/tree-ssa-operands.c
gcc/tree-ssa-phiopt.c
gcc/tree-ssa-pre.c
gcc/tree-ssa-propagate.c
gcc/tree-ssa.c
gcc/tree-ssanames.c
gcc/tree-tailcall.c
gcc/tree.c
gcc/tree.def
gcc/tree.h
gcc/treelang/ChangeLog
gcc/treelang/treetree.c
gcc/varasm.c

index ad206de..f61c75b 100644 (file)
@@ -1,3 +1,44 @@
+2004-09-17  Jeffrey D. Oldham  <oldham@codesourcery.com>
+           Zack Weinberg  <zack@codesourcery.com>
+
+       * alias.c (find_base_decl): Remove unreachable case '3' block.
+       * expr.c (safe_from_p): Abort if passed a type.
+       * tree-gimple.c (recalculate_side_effects): Abort if passed
+       anything other than an expression.
+       * tree-ssa-pre.c (phi_translate): Return expr immediately if
+       is_gimple_min_invariant is true for it.  Reorder cases for clarity.
+       Abort on un-handled tree classes.
+       (valid_in_set): Likewise.
+       * tree.c (tree_code_class_strings): New static data.
+
+       * tree.h (enum tree_code_class): New.
+       (tree_code_class_strings): Declare.
+       (TREE_CODE_CLASS_STRING, EXCEPTIONAL_CLASS_P, CONSTANT_CLASS_P)
+       (REFERENCE_CLASS_P, COMPARISON_CLASS_P, UNARY_CLASS_P, BINARY_CLASS_P)
+       (STATEMENT_CLASS_P, EXPRESSION_CLASS_P, IS_TYPE_OR_DECL_P): New macros.
+       (TYPE_P, DECL_P, IS_NON_TYPE_CODE_CLASS, IS_EXPR_CODE_CLASS)
+       (checking macros, EXPR_LOCATION, SET_EXPR_LOCATION, EXPR_LOCUS): Update.
+
+       * tree.def, c-common.def, objc/objc-tree.def: Use
+       tree_code_class enumeration constants instead of code letters.
+
+       * alias.c, builtins.c, c-common.c, c-format.c, c-lang.c, c-pragma.c
+       * c-typeck.c, cgraphunit.c, convert.c, dbxout.c, dwarf2out.c
+       * emit-rtl.c expr.c, fold-const.c, gimplify.c, lambda-code.c
+       * langhooks.c, langhooks.h, predict.c, print-tree.c, reload1.c, stmt.c
+       * tree-browser.c, tree-cfg.c, tree-chrec.c, tree-complex.c, tree-dfa.c
+       * tree-dump.c, tree-eh.c, tree-gimple.c, tree-inline.c, tree-nested.c
+       * tree-outof-ssa.c, tree-pretty-print.c, tree-sra.c, tree-ssa-ccp.c
+       * tree-ssa-dce.c, tree-ssa-dom.c, tree-ssa-forwprop.c, tree-ssa-live.c
+       * tree-ssa-loop-im.c, tree-ssa-loop-ivopts.c, tree-ssa-operands.c
+       * tree-ssa-phiopt.c, tree-ssa-pre.c, tree-ssa-propagate.c
+       * tree-ssa.c, tree-ssanames.c, tree-tailcall.c, tree.c, varasm.c
+       * config/sol2-c.c, config/arm/arm.c, config/i386/winnt.c
+       * config/pa/pa.c, config/pa/pa.h, config/sh/sh.c, objc/objc-lang.c
+       Update to match.
+
+       * LANGUAGES: Add note about change.
+
 2004-09-17  Diego Novillo  <dnovillo@redhat.com>
 
        PR tree-optimization/17319
@@ -33,7 +74,7 @@
        (dbxout_init): Include lang number in N_SO  stab.
        * dbxout.h (N_SO_AS, N_SO_C, N_SO_ANSI_C, N_SO_CC, N_SO_FORTRAN,
        N_SO_PASCAL, N_SO_FORTRAN90, N_SO_OBJC, N_SO_OBJCPLUS): New #define.
-       
+
 2004-09-17  Diego Novillo  <dnovillo@redhat.com>
 
        PR tree-optimization/17273
 
 2004-09-17  Sylvain Pion  <Sylvain.Pion@sophia.inria.fr>
 
-        * doc/extend.texi: Fix duplicated word.
+       * doc/extend.texi: Fix duplicated word.
 
 2004-09-17  Toon Moene  <toon@moene.indiv.nluug.nl>
 
 
 2004-09-17  Steven Bosscher  <stevenb@suse.de>
 
-        PR tree-optimization/17513
+       PR tree-optimization/17513
        * cfgexpand.c (construct_init_block): Clear EDGE_EXECUTABLE
        for successors of the entry block.
 
 2004-09-16  Andrew MacLeod  <amacleod@redhat.com>
 
        PR tree-optimization/17517
-       * tree-ssa-copyrename.c (copy_rename_partition_coalesce): Don't 
+       * tree-ssa-copyrename.c (copy_rename_partition_coalesce): Don't
        coalesce same-root variables without checking for abnormal PHI usage.
 
 2004-09-16  Daniel Berlin  <dberlin@dberlin.org>
-       
+
        * cfgloop.h (duplicate_loop):  Add prototype.
        * cfgloopmanip.c (duplicate_loop): Make non-static.
        * lambda-code.c (perfect_nestify): Factor out test whether
        loop invariant as well.
        (perfect_nestify): new function.
        (gcc_loop_to_lambda_loop): New parameters to track lower bounds,
-       upper bounds, and steps. 
+       upper bounds, and steps.
        Set outerinductionvar properly.
        (gcc_loopnest_to_lambda_loopnest): Add loops and need_perfect
        parameters.
 2004-09-16  Sebastian Pop  <pop@cri.ensmp.fr>
 
        * tree-loop-linear.c (gather_interchange_stats): Add more comments.
-       Gather also strides of accessed data.  Pass in the data references 
+       Gather also strides of accessed data.  Pass in the data references
        array.
-       (try_interchange_loops): Add a new heuristic for handling the temporal 
+       (try_interchange_loops): Add a new heuristic for handling the temporal
        locality.  Pass in the data references array.
        (linear_transform_loops): Pass the data references array to
        try_interchange_loops.
 
        * Makefile.in (tree-ssa-dom.o): Depend on tree-ssa-propagate.h.
        * tree-ssa-dom.c (cprop_into_stmt): Recompute TREE_INVARIANT
-        after propagating into an ADDR_EXPR.
+       after propagating into an ADDR_EXPR.
 
 2004-09-15  Andrew Pinski  <apinski@apple.com>
 
 2004-09-14  Jeff Law  <law@redhat.com>
 
        * tree-ssa-dom.c (stmts_to_rescan): Move from a block-local
-       to a global varray.  
+       to a global varray.
        (tree_ssa_dominator_optimize): Allocate stmts_to_rescan.
        (dom_opt_initialize_block_local_data): No longer test state
        of stmts_to_rescan.
        PR tree-optimization/17400
        * tree-ssa-copyrename.c (copy_rename_partition_coalesce): Don't
        coalesce partitions when one occurs in an abnormal PHI.
-                                                             
+
 2004-09-13  Andrew Pinski  <apinski@apple.com>
 
        * config/rs6000/darwin.h (ASM_OUTPUT_COMMON): Change variable size's
index ed1e0b4..5f20d9c 100644 (file)
@@ -6,6 +6,18 @@ time as we can formally start documenting the interface this file will
 serve as a repository for information on these interface and any incompatable
 changes we've made.
 
+2004-09-09:
+  In an effort to decrease execution time, single char tree code
+  classes were changed to enumerated values.
+
+  Old way:
+
+    DEFTREECODE (CLASS_METHOD_DECL, "class_method_decl", 'd', 0)
+
+  New way:
+
+    DEFTREECODE (CLASS_METHOD_DECL, "class_method_decl", tcc_declaration, 0)
+
 2001-02-26:
   A DECL_INITIAL of NULL_TREE or error_mark_node in a VAR_DECL is no longer
   taken to signify a tentative definition which should not be emitted until
index babbc34..92560a9 100644 (file)
@@ -1,3 +1,11 @@
+2004-09-17  Jeffrey D. Oldham  <oldham@codesourcery.com>
+           Zack Weinberg  <zack@codesourcery.com>
+
+       * ada-tree.def: Use tree_code_class enumeration constants
+       instead of code letters.
+       * ada-tree.h, decl.c, misc.c, trans.c, utils.c, utils2.c:
+       Update for new tree-class enumeration constants.
+
 2004-09-17  Vincent Celier  <celier@gnat.com>
 
        * prj-attr-pm.ads, prj-attr-pm.adb: New files, to split some private
 
 2004-08-25  Nathan Sidwell  <nathan@codesourcery.com>
            Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
-       
+
        * ada-tree.h (TYPE_RM_SIZE_INT): Use TYPE_LANG_SLOT_1.
 
 2004-08-25  Nathan Sidwell  <nathan@codesourcery.com>
        * trans.c (Exception_Handler_to_gnu_sjlj, gnat_to_gnu): Likewise.
        * utils.c (init_gigi_decls): Likewise.
        * utils2.c (build_call_raise, build_allocator): Likewise.
-       
+
 2004-08-24  Nathan Sidwell  <nathan@codesourcery.com>
 
        * utils.c (gnat_init_decl_processing): Adjust
        GNAT.Sockets.Thin.Is_Socket_In_Set to account for new specification
        and test explicitly for non-zero return value.
 
-       * g-socthi-vms.ads, g-socthi-mingw.ads, g-socthi-vxworks.ads: 
+       * g-socthi-vms.ads, g-socthi-mingw.ads, g-socthi-vxworks.ads:
        (Is_Socket_In_Set): Declare imported function as returning C.int, to
        avoid using a derived boolean type.
 
        (gnat_to_gnu, case N_Compilation_Unit): Just handle nested case here.
        (add_stmt): Force walking of sizes and DECL_INITIAL for DECL_EXPR.
        (mark_visited): Don't mark dummy type.
-       (tree_transform <N_Procedure_Call_Statement>): Unless this is an In     
+       (tree_transform <N_Procedure_Call_Statement>): Unless this is an In
        parameter, we must remove any LJM building from GNU_NAME.
        (gnat_to_gnu, case N_String_Literal): Fill in indices in CONSTRUCTOR.
        (pos_to_constructor): Use int_const_binop.
        (gnat_to_gnu): If statement and not in procedure, go into elab proc.
        Delete calls to add_decl_expr; add arg to create_*_decl.
        (gnat_to_gnu, case N_Loop): Recalculate side effects on COND_EXPR.
-       (gnat_to_gnu, case N_Subprogram_Body): Move some code to 
+       (gnat_to_gnu, case N_Subprogram_Body): Move some code to
        begin_subprog_body and call it.
        Don't push and pop ggc context.
        (gnat_to_gnu, case N_Compilation_Unit): Rework to support elab proc.
        (function_nesting_depth): Deleted.
        (begin_subprog_body): Delete obsolete code.
        * utils2.c (build_call_alloc_dealloc): Add new arg to create_var_decl.
-       
+
 2004-06-28  Robert Dewar  <dewar@gnat.com>
 
        * mlib-tgt-tru64.adb, mlib-tgt-aix.adb, mlib-tgt-irix.adb,
        Lib_Address and Relocatable.
        (Default_DLL_Address): Removed.
 
-       * mlib-tgt-tru64.adb, mlib-tgt-aix.adb, mlib-tgt-irix.adb, 
-       mlib-tgt-hpux.adb, mlib-tgt-linux.adb, mlib-tgt-solaris.adb, 
+       * mlib-tgt-tru64.adb, mlib-tgt-aix.adb, mlib-tgt-irix.adb,
+       mlib-tgt-hpux.adb, mlib-tgt-linux.adb, mlib-tgt-solaris.adb,
        mlib-tgt-vms-alpha.adb, mlib-tgt-vms-ia64.adb, mlib-tgt-vxworks.adb:
        (Build_Dynamic_Library): Remove parameter Lib_Address and Relocatable.
        (Default_DLL_Address): Removed.
        (Compile_Sources.Compile): Add switch -gnatez as the last option
        (Display): Never display -gnatez
 
-       * Makefile.generic: 
+       * Makefile.generic:
        When using $(MAIN_OBJECT), always use $(OBJ_DIR)/$(MAIN_OBJECT)
 
        * gnatcmd.adb (Check_Project): New function
        opt.adb, par.adb, opt.ads, par-ch11.adb, par-ch3.adb, par-ch4.adb,
        par-ch5.adb, par-ch6.adb, par-ch8.adb, par-ch9.adb, par-prag.adb,
        par-util.adb, scng.adb, sem_aggr.adb, sem_attr.adb, sem_cat.adb,
-        sem_ch10.adb, sem_ch10.adb, sem_ch11.adb, sem_ch12.adb, sem_ch2.adb,
+       sem_ch10.adb, sem_ch10.adb, sem_ch11.adb, sem_ch12.adb, sem_ch2.adb,
        sem_ch3.adb, sem_ch3.ads, sem_ch4.adb, sem_ch5.adb, sem_ch6.adb,
        sem_ch7.adb, sem_ch8.adb, sem_ch9.adb, sem_eval.adb, sem_prag.adb,
        sem_res.adb, sem_type.adb, sem_util.adb, sinfo.ads, snames.adb,
 
        Renaming of target specific files for clarity
 
-        * Makefile.in: Rename GNAT target specific files.
+       * Makefile.in: Rename GNAT target specific files.
 
        * 31soccon.ads, 31soliop.ads 35soccon.ads, 3asoccon.ads,
        3bsoccon.ads, 3gsoccon.ads, 3hsoccon.ads, 3psoccon.ads,
index fe68c63..25ea95e 100644 (file)
@@ -6,7 +6,7 @@
  *                                                                          *
  *                              Specification                               *
  *                                                                          *
- *          Copyright (C) 1992-2003 Free Software Foundation, Inc.          *
+ *          Copyright (C) 1992-2004 Free Software Foundation, Inc.          *
  *                                                                          *
  * GNAT is free software;  you can  redistribute it  and/or modify it under *
  * terms of the  GNU General Public License as published  by the Free Soft- *
    to GCC. TREE_TYPE is the type of the fat pointer and TYPE_OBJECT_RECORD_TYPE
    is the type of a record containing the template and data.  */
 
-DEFTREECODE (UNCONSTRAINED_ARRAY_TYPE, "unconstrained_array_type", 't', 0)
+DEFTREECODE (UNCONSTRAINED_ARRAY_TYPE, "unconstrained_array_type", tcc_type, 0)
 
 /* A reference to an unconstrained array.  This node only exists as an
    intermediate node during the translation of a GNAT tree to a GCC tree;
    it is never passed to GCC.  The only field used is operand 0, which
    is the fat pointer object.  */
 
-DEFTREECODE (UNCONSTRAINED_ARRAY_REF, "unconstrained_array_ref", 'r', 1)
+DEFTREECODE (UNCONSTRAINED_ARRAY_REF, "unconstrained_array_ref",
+           tcc_reference, 1)
 
 /* An expression that returns an RTL suitable for its type.  Operand 0
    is an expression to be evaluated for side effects only.  */
-DEFTREECODE (NULL_EXPR, "null_expr", 'e', 1)
+DEFTREECODE (NULL_EXPR, "null_expr", tcc_expression, 1)
 
 /* Same as ADDR_EXPR, except that if the operand represents a bit field,
    return the address of the byte containing the bit.  This is used
    for the 'Address attribute and never shows up in the tree.  */
-DEFTREECODE (ATTR_ADDR_EXPR, "attr_addr_expr", 'r', 1)
+DEFTREECODE (ATTR_ADDR_EXPR, "attr_addr_expr", tcc_reference, 1)
 
 /* Here are the tree codes for the statement types known to Ada.  These
    must be at the end of this file to allow IS_ADA_STMT to work.  */
@@ -53,32 +54,32 @@ DEFTREECODE (ATTR_ADDR_EXPR, "attr_addr_expr", 'r', 1)
    makes this tree node, whose operand is a statement.  The latter inserts
    the actual statements into this node.  Gimplification consists of
    just returning the inner statement.  */
-DEFTREECODE (STMT_STMT, "stmt_stmt", 's', 1)
+DEFTREECODE (STMT_STMT, "stmt_stmt", tcc_statement, 1)
 
 /* A loop.  LOOP_STMT_TOP_COND and LOOP_STMT_BOT_COND are the tests to exit a
    loop at the top and bottom, respectively.  LOOP_STMT_UPDATE is the statement
    to update the loop iterator at the continue point.  LOOP_STMT_BODY are the
    statements in the body of the loop.  LOOP_STMT_LABEL points to the LABEL_DECL
    of the end label of the loop.  */
-DEFTREECODE (LOOP_STMT, "loop_stmt", 's', 5)
+DEFTREECODE (LOOP_STMT, "loop_stmt", tcc_statement, 5)
 
 /* Conditionally exit a loop.  EXIT_STMT_COND is the condition, which, if
    true, will cause the loop to be exited.  If no condition is specified,
    the loop is unconditionally exited.  EXIT_STMT_LABEL is the end label
    corresponding to the loop to exit.  */
-DEFTREECODE (EXIT_STMT, "exit_stmt", 's', 2)
+DEFTREECODE (EXIT_STMT, "exit_stmt", tcc_statement, 2)
 
 /* A exception region.  REGION_STMT_BODY is the statement to be executed
    inside the region.  REGION_STMT_HANDLE is a statement that represents
    the exception handlers (usually a BLOCK_STMT of HANDLE_STMTs).
    REGION_STMT_BLOCK is the BLOCK node for the declarative region, if any.  */
-DEFTREECODE (REGION_STMT, "region_stmt", 's', 3)
+DEFTREECODE (REGION_STMT, "region_stmt", tcc_statement, 3)
 
 /* An exception handler.  HANDLER_STMT_ARG is the value to pass to 
    expand_start_catch, HANDLER_STMT_LIST is the list of statements for the
    handler itself, and HANDLER_STMT_BLOCK is the BLOCK node for this
    binding. */
-DEFTREECODE (HANDLER_STMT, "handler_stmt", 's', 3)
+DEFTREECODE (HANDLER_STMT, "handler_stmt", tcc_statement, 3)
 
 /* A statement that emits a USE for its single operand.  */
-DEFTREECODE (USE_STMT, "use_expr", 's', 1)
+DEFTREECODE (USE_STMT, "use_expr", tcc_statement, 1)
index 21f1caf..7d4a756 100644 (file)
@@ -273,7 +273,7 @@ struct lang_type GTY(()) {tree t; };
 /* Define fields and macros for statements.
 
    Start by defining which tree codes are used for statements.  */
-#define IS_STMT(NODE)          (TREE_CODE_CLASS (TREE_CODE (NODE)) == 's')
+#define IS_STMT(NODE)          (STATEMENT_CLASS_P (NODE))
 #define IS_ADA_STMT(NODE)      (IS_STMT (NODE)                         \
                                 && TREE_CODE (NODE) >= STMT_STMT)
 
index 604c471..08b5176 100644 (file)
@@ -761,7 +761,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
               just use that declaration or reference as this entity unless
               the latter has to be materialized.  */
            else if ((DECL_P (gnu_expr)
-                     || TREE_CODE_CLASS (TREE_CODE (gnu_expr)) == 'r')
+                     || (REFERENCE_CLASS_P (gnu_expr) == tcc_reference))
                     && !Materialize_Entity (gnat_entity)
                     && (!global_bindings_p ()
                         || (staticp (gnu_expr)
@@ -4553,7 +4553,7 @@ elaborate_expression_1 (Node_Id gnat_expr, Entity_Id gnat_entity,
      rely here on the fact that an expression cannot contain both the
      discriminant and some other variable.  */
 
-  expr_variable = (TREE_CODE_CLASS (TREE_CODE (gnu_expr)) != 'c'
+  expr_variable = (!CONSTANT_CLASS_P (gnu_expr)
                   && !(TREE_CODE (gnu_inner_expr) == VAR_DECL
                        && TREE_READONLY (gnu_inner_expr))
                   && !CONTAINS_PLACEHOLDER_P (gnu_expr));
@@ -5565,8 +5565,7 @@ annotate_value (tree gnu_size)
     return No_Uint;
 
   /* See if we've already saved the value for this node.  */
-  if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (gnu_size)))
-      && TREE_COMPLEXITY (gnu_size))
+  if (EXPR_P (gnu_size) && TREE_COMPLEXITY (gnu_size))
     return (Node_Ref_Or_Val) TREE_COMPLEXITY (gnu_size);
 
   /* If we do not return inside this switch, TCODE will be set to the
index cdaa862..d1631cd 100644 (file)
@@ -173,9 +173,9 @@ const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
 
 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
 
-const char tree_code_type[] = {
+const enum tree_code_class tree_code_type[] = {
 #include "tree.def"
-  'x',
+  tcc_exceptional,
 #include "ada-tree.def"
 };
 #undef DEFTREECODE
index eb25be3..4defe55 100644 (file)
@@ -3219,7 +3219,7 @@ gnat_to_gnu (Node_Id gnat_node)
        /* If this is a comparison operator, convert any references to
           an unconstrained array value into a reference to the
           actual array.  */
-       if (TREE_CODE_CLASS (code) == '<')
+       if (TREE_CODE_CLASS (code) == tcc_comparison)
          {
            gnu_lhs = maybe_unconstrained_array (gnu_lhs);
            gnu_rhs = maybe_unconstrained_array (gnu_rhs);
@@ -4035,7 +4035,7 @@ gnat_to_gnu (Node_Id gnat_node)
   /* Set the location information into the result.  If we're supposed to
      return something of void_type, it means we have something we're
      elaborating for effect, so just return.  */
-  if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (gnu_result))))
+  if (EXPR_P (gnu_result))
     annotate_with_node (gnu_result, gnat_node);
 
   if (TREE_CODE (gnu_result_type) == VOID_TYPE)
@@ -5712,13 +5712,13 @@ gnat_stabilize_reference_1 (tree e, bool force)
 
   switch (TREE_CODE_CLASS (code))
     {
-    case 'x':
-    case 't':
-    case 'd':
-    case '<':
-    case 's':
-    case 'e':
-    case 'r':
+    case tcc_exceptional:
+    case tcc_type:
+    case tcc_declaration:
+    case tcc_comparison:
+    case tcc_statement:
+    case tcc_expression:
+    case tcc_reference:
       /* If this is a COMPONENT_REF of a fat pointer, save the entire
         fat pointer.  This may be more efficient, but will also allow
         us to more easily find the match for the PLACEHOLDER_EXPR.  */
@@ -5734,12 +5734,12 @@ gnat_stabilize_reference_1 (tree e, bool force)
        return e;
       break;
 
-    case 'c':
+    case tcc_constant:
       /* Constants need no processing.  In fact, we should never reach
         here.  */
       return e;
 
-    case '2':
+    case tcc_binary:
       /* Recursively stabilize each operand.  */
       result = build2 (code, type,
                       gnat_stabilize_reference_1 (TREE_OPERAND (e, 0), force),
@@ -5747,7 +5747,7 @@ gnat_stabilize_reference_1 (tree e, bool force)
                                                   force));
       break;
 
-    case '1':
+    case tcc_unary:
       /* Recursively stabilize each operand.  */
       result = build1 (code, type,
                       gnat_stabilize_reference_1 (TREE_OPERAND (e, 0),
index 2b5bad7..1a5afb3 100644 (file)
@@ -2009,11 +2009,11 @@ max_size (tree exp, bool max_p)
 
   switch (TREE_CODE_CLASS (code))
     {
-    case 'd':
-    case 'c':
+    case tcc_declaration:
+    case tcc_constant:
       return exp;
 
-    case 'x':
+    case tcc_exceptional:
       if (code == TREE_LIST)
        return tree_cons (TREE_PURPOSE (exp),
                          max_size (TREE_VALUE (exp), max_p),
@@ -2021,7 +2021,7 @@ max_size (tree exp, bool max_p)
                          ? max_size (TREE_CHAIN (exp), max_p) : NULL_TREE);
       break;
 
-    case 'r':
+    case tcc_reference:
       /* If this contains a PLACEHOLDER_EXPR, it is the thing we want to
         modify.  Otherwise, we treat it like a variable.  */
       if (!CONTAINS_PLACEHOLDER_P (exp))
@@ -2031,12 +2031,12 @@ max_size (tree exp, bool max_p)
       return
        max_size (max_p ? TYPE_MAX_VALUE (type) : TYPE_MIN_VALUE (type), true);
 
-    case '<':
+    case tcc_comparison:
       return max_p ? size_one_node : size_zero_node;
 
-    case '1':
-    case '2':
-    case 'e':
+    case tcc_unary:
+    case tcc_binary:
+    case tcc_expression:
       switch (TREE_CODE_LENGTH (code))
        {
        case 1:
@@ -2087,6 +2087,10 @@ max_size (tree exp, bool max_p)
            return build3 (CALL_EXPR, type, TREE_OPERAND (exp, 0),
                           max_size (TREE_OPERAND (exp, 1), max_p), NULL);
        }
+
+      /* Other tree classes cannot happen.  */
+    default:
+      break;
     }
 
   abort ();
index 6341863..4611fc8 100644 (file)
@@ -290,17 +290,18 @@ contains_null_expr (tree exp)
 
   switch (TREE_CODE_CLASS (TREE_CODE (exp)))
     {
-    case '1':
+    case tcc_unary:
       return contains_null_expr (TREE_OPERAND (exp, 0));
 
-    case '<':  case '2':
+    case tcc_comparison:
+    case tcc_binary:
       tem = contains_null_expr (TREE_OPERAND (exp, 0));
       if (tem)
        return tem;
 
       return contains_null_expr (TREE_OPERAND (exp, 1));
 
-    case 'e':
+    case tcc_expression:
       switch (TREE_CODE (exp))
        {
        case SAVE_EXPR:
index 24b4605..cc74ee8 100644 (file)
@@ -342,13 +342,13 @@ objects_must_conflict_p (tree t1, tree t2)
 static tree
 find_base_decl (tree t)
 {
-  tree d0, d1, d2;
+  tree d0, d1;
 
   if (t == 0 || t == error_mark_node || ! POINTER_TYPE_P (TREE_TYPE (t)))
     return 0;
 
   /* If this is a declaration, return it.  */
-  if (TREE_CODE_CLASS (TREE_CODE (t)) == 'd')
+  if (DECL_P (t))
     return t;
 
   /* Handle general expressions.  It would be nice to deal with
@@ -356,10 +356,10 @@ find_base_decl (tree t)
      same, then `a->f' and `b->f' are also the same.  */
   switch (TREE_CODE_CLASS (TREE_CODE (t)))
     {
-    case '1':
+    case tcc_unary:
       return find_base_decl (TREE_OPERAND (t, 0));
 
-    case '2':
+    case tcc_binary:
       /* Return 0 if found in neither or both are the same.  */
       d0 = find_base_decl (TREE_OPERAND (t, 0));
       d1 = find_base_decl (TREE_OPERAND (t, 1));
@@ -372,21 +372,6 @@ find_base_decl (tree t)
       else
        return 0;
 
-    case '3':
-      d0 = find_base_decl (TREE_OPERAND (t, 0));
-      d1 = find_base_decl (TREE_OPERAND (t, 1));
-      d2 = find_base_decl (TREE_OPERAND (t, 2));
-
-      /* Set any nonzero values from the last, then from the first.  */
-      if (d1 == 0) d1 = d2;
-      if (d0 == 0) d0 = d1;
-      if (d1 == 0) d1 = d0;
-      if (d2 == 0) d2 = d1;
-
-      /* At this point all are nonzero or all are zero.  If all three are the
-        same, return it.  Otherwise, return zero.  */
-      return (d0 == d1 && d1 == d2) ? d0 : 0;
-
     default:
       return 0;
     }
index a95f11d..8502087 100644 (file)
@@ -248,7 +248,7 @@ get_pointer_alignment (tree exp, unsigned int max_align)
          else if (DECL_P (exp))
            align = DECL_ALIGN (exp);
 #ifdef CONSTANT_ALIGNMENT
-         else if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'c')
+         else if (CONSTANT_CLASS_P (exp))
            align = CONSTANT_ALIGNMENT (exp, align);
 #endif
          return MIN (align, max_align);
@@ -6205,7 +6205,7 @@ fold_builtin_constant_p (tree arglist)
   STRIP_NOPS (arglist);
 
   /* If we know this is a constant, emit the constant of one.  */
-  if (TREE_CODE_CLASS (TREE_CODE (arglist)) == 'c'
+  if (CONSTANT_CLASS_P (arglist)
       || (TREE_CODE (arglist) == CONSTRUCTOR
          && TREE_CONSTANT (arglist))
       || (TREE_CODE (arglist) == ADDR_EXPR
@@ -8513,7 +8513,7 @@ fold_builtin (tree exp, bool ignore)
   if (exp)
     {
       /* ??? Don't clobber shared nodes such as integer_zero_node.  */
-      if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'c')
+      if (CONSTANT_CLASS_P (exp))
        exp = build1 (NOP_EXPR, TREE_TYPE (exp), exp);
       TREE_NO_WARNING (exp) = 1;
     }
index 4749410..2b8ad80 100644 (file)
@@ -1196,7 +1196,7 @@ verify_tree (tree x, struct tlist **pbefore_sp, struct tlist **pno_sp,
 {
   struct tlist *tmp_before, *tmp_nosp, *tmp_list2, *tmp_list3;
   enum tree_code code;
-  char cl;
+  enum tree_code_class cl;
 
   /* X may be NULL if it is the operand of an empty statement expression
      ({ }).  */
@@ -1345,39 +1345,32 @@ verify_tree (tree x, struct tlist **pbefore_sp, struct tlist **pno_sp,
        add_tlist (pno_sp, t->cache_after_sp, NULL_TREE, 1);
        return;
       }
-    default:
-      break;
-    }
 
-  if (cl == '1')
-    {
-      if (first_rtl_op (code) == 0)
-       return;
-      x = TREE_OPERAND (x, 0);
-      writer = 0;
-      goto restart;
-    }
-
-  switch (cl)
-    {
-    case 'r':
-    case '<':
-    case '2':
-    case 'e':
-    case 's':
-    case 'x':
-      {
-       int lp;
-       int max = first_rtl_op (TREE_CODE (x));
-       for (lp = 0; lp < max; lp++)
-         {
-           tmp_before = tmp_nosp = 0;
-           verify_tree (TREE_OPERAND (x, lp), &tmp_before, &tmp_nosp, NULL_TREE);
-           merge_tlist (&tmp_nosp, tmp_before, 0);
-           add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
-         }
-       break;
-      }
+    default:
+      /* For other expressions, simply recurse on their operands.
+         Manual tail recursion for unary expressions.
+        Other non-expressions need not be processed.  */
+      if (cl == tcc_unary)
+       {
+         if (first_rtl_op (code) == 0)
+           return;
+         x = TREE_OPERAND (x, 0);
+         writer = 0;
+         goto restart;
+       }
+      else if (IS_EXPR_CODE_CLASS (cl))
+       {
+         int lp;
+         int max = first_rtl_op (TREE_CODE (x));
+         for (lp = 0; lp < max; lp++)
+           {
+             tmp_before = tmp_nosp = 0;
+             verify_tree (TREE_OPERAND (x, lp), &tmp_before, &tmp_nosp, 0);
+             merge_tlist (&tmp_nosp, tmp_before, 0);
+             add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0);
+           }
+       }
+      return;
     }
 }
 
index fa45ad0..adca88f 100644 (file)
@@ -25,46 +25,46 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 /* Tree nodes relevant to both C and C++. These were originally in
 cp-tree.def in the cp subdir.  */
 
-DEFTREECODE (SIZEOF_EXPR, "sizeof_expr", '1', 1)
-DEFTREECODE (ARROW_EXPR, "arrow_expr", 'e', 1)
-DEFTREECODE (ALIGNOF_EXPR, "alignof_expr", '1', 1)
+DEFTREECODE (SIZEOF_EXPR, "sizeof_expr", tcc_unary, 1)
+DEFTREECODE (ARROW_EXPR, "arrow_expr", tcc_expression, 1)
+DEFTREECODE (ALIGNOF_EXPR, "alignof_expr", tcc_unary, 1)
 
 /* Used to represent an expression statement.  Use `EXPR_STMT_EXPR' to
    obtain the expression.  */
-DEFTREECODE (EXPR_STMT, "expr_stmt", 'e', 1)
+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", 'e', 4)
+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", 'e', 2)
+DEFTREECODE (WHILE_STMT, "while_stmt", tcc_expression, 2)
 
 /* Used to represent a 'do' statement. The operands are DO_BODY and
    DO_COND, respectively.  */
-DEFTREECODE (DO_STMT, "do_stmt", 'e', 2)
+DEFTREECODE (DO_STMT, "do_stmt", tcc_expression, 2)
 
 /* Used to represent a 'break' statement.  */
-DEFTREECODE (BREAK_STMT, "break_stmt", 'e', 0)
+DEFTREECODE (BREAK_STMT, "break_stmt", tcc_expression, 0)
 
 /* Used to represent a 'continue' statement.  */
-DEFTREECODE (CONTINUE_STMT, "continue_stmt", 'e', 0)
+DEFTREECODE (CONTINUE_STMT, "continue_stmt", tcc_expression, 0)
 
 /* Used to represent a 'switch' statement. The operands are
    SWITCH_COND, SWITCH_BODY and SWITCH_TYPE, respectively.  */
-DEFTREECODE (SWITCH_STMT, "switch_stmt", 'e', 3)
+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", 'e', 1)
+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", 'e', 1)
+DEFTREECODE (COMPOUND_LITERAL_EXPR, "compound_literal_expr", tcc_expression, 1)
 
 /*
 Local variables:
index bb730f3..341eb59 100644 (file)
@@ -2094,7 +2094,7 @@ check_format_types (format_wanted_type *types, const char *format_start,
                  && i == 0
                  && (TYPE_READONLY (cur_type)
                      || (cur_param != 0
-                         && (TREE_CODE_CLASS (TREE_CODE (cur_param)) == 'c'
+                         && (CONSTANT_CLASS_P (cur_param)
                              || (DECL_P (cur_param)
                                  && TREE_READONLY (cur_param))))))
                warning ("writing into constant object (arg %d)", arg_num);
index af4932a..ca0173e 100644 (file)
@@ -54,9 +54,9 @@ const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
 
 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
 
-const char tree_code_type[] = {
+const enum tree_code_class tree_code_type[] = {
 #include "tree.def"
-  'x',
+  tcc_exceptional,
 #include "c-common.def"
 };
 #undef DEFTREECODE
index 0b169cf..fd2f7f7 100644 (file)
@@ -316,7 +316,7 @@ handle_pragma_weak (cpp_reader * ARG_UNUSED (dummy))
     warning ("junk at end of #pragma weak");
 
   decl = identifier_global_value (name);
-  if (decl && TREE_CODE_CLASS (TREE_CODE (decl)) == 'd')
+  if (decl && DECL_P (decl))
     {
       apply_pragma_weak (decl, value);
       if (value)
index dd84285..5ec00aa 100644 (file)
@@ -744,18 +744,24 @@ same_translation_unit_p (tree t1, tree t2)
   while (t1 && TREE_CODE (t1) != TRANSLATION_UNIT_DECL)
     switch (TREE_CODE_CLASS (TREE_CODE (t1)))
       {
-      case 'd': t1 = DECL_CONTEXT (t1); break;
-      case 't': t1 = TYPE_CONTEXT (t1); break;
-      case 'x': t1 = BLOCK_SUPERCONTEXT (t1); break;  /* assume block */
+      case tcc_declaration:
+       t1 = DECL_CONTEXT (t1); break;
+      case tcc_type:
+       t1 = TYPE_CONTEXT (t1); break;
+      case tcc_exceptional:
+       t1 = BLOCK_SUPERCONTEXT (t1); break;  /* assume block */
       default: gcc_unreachable ();
       }
 
   while (t2 && TREE_CODE (t2) != TRANSLATION_UNIT_DECL)
     switch (TREE_CODE_CLASS (TREE_CODE (t2)))
       {
-      case 'd': t2 = DECL_CONTEXT (t2); break;
-      case 't': t2 = TYPE_CONTEXT (t2); break;
-      case 'x': t2 = BLOCK_SUPERCONTEXT (t2); break;  /* assume block */
+      case tcc_declaration:
+       t2 = DECL_CONTEXT (t2); break;
+      case tcc_type:
+       t2 = TYPE_CONTEXT (t2); break;
+      case tcc_exceptional:
+       t2 = BLOCK_SUPERCONTEXT (t2); break;  /* assume block */
       default: gcc_unreachable ();
       }
 
@@ -1200,7 +1206,7 @@ default_function_array_conversion (tree exp)
       int volatilep = 0;
       int lvalue_array_p;
 
-      if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'r' || DECL_P (exp))
+      if (REFERENCE_CLASS_P (exp) || DECL_P (exp))
        {
          constp = TREE_READONLY (exp);
          volatilep = TREE_THIS_VOLATILE (exp);
@@ -2232,7 +2238,8 @@ parser_build_binary_op (enum tree_code code, struct c_expr arg1,
              || code2 == PLUS_EXPR || code2 == MINUS_EXPR)
            warning ("suggest parentheses around arithmetic in operand of |");
          /* Check cases like x|y==z */
-         if (TREE_CODE_CLASS (code1) == '<' || TREE_CODE_CLASS (code2) == '<')
+         if (TREE_CODE_CLASS (code1) == tcc_comparison
+             || TREE_CODE_CLASS (code2) == tcc_comparison)
            warning ("suggest parentheses around comparison in operand of |");
        }
 
@@ -2244,7 +2251,8 @@ parser_build_binary_op (enum tree_code code, struct c_expr arg1,
              || code2 == PLUS_EXPR || code2 == MINUS_EXPR)
            warning ("suggest parentheses around arithmetic in operand of ^");
          /* Check cases like x^y==z */
-         if (TREE_CODE_CLASS (code1) == '<' || TREE_CODE_CLASS (code2) == '<')
+         if (TREE_CODE_CLASS (code1) == tcc_comparison
+             || TREE_CODE_CLASS (code2) == tcc_comparison)
            warning ("suggest parentheses around comparison in operand of ^");
        }
 
@@ -2254,13 +2262,14 @@ parser_build_binary_op (enum tree_code code, struct c_expr arg1,
              || code2 == PLUS_EXPR || code2 == MINUS_EXPR)
            warning ("suggest parentheses around + or - in operand of &");
          /* Check cases like x&y==z */
-         if (TREE_CODE_CLASS (code1) == '<' || TREE_CODE_CLASS (code2) == '<')
+         if (TREE_CODE_CLASS (code1) == tcc_comparison
+             || TREE_CODE_CLASS (code2) == tcc_comparison)
            warning ("suggest parentheses around comparison in operand of &");
        }
       /* Similarly, check for cases like 1<=i<=10 that are probably errors.  */
-      if (TREE_CODE_CLASS (code) == '<'
-         && (TREE_CODE_CLASS (code1) == '<'
-             || TREE_CODE_CLASS (code2) == '<'))
+      if (TREE_CODE_CLASS (code) == tcc_comparison
+         && (TREE_CODE_CLASS (code1) == tcc_comparison
+             || TREE_CODE_CLASS (code2) == tcc_comparison))
        warning ("comparisons like X<=Y<=Z do not have their mathematical meaning");
 
     }
@@ -2604,7 +2613,7 @@ build_unary_op (enum tree_code code, tree xarg, int flag)
          to which the address will point.  Note that you can't get a
         restricted pointer by taking the address of something, so we
         only have to deal with `const' and `volatile' here.  */
-      if ((DECL_P (arg) || TREE_CODE_CLASS (TREE_CODE (arg)) == 'r')
+      if ((DECL_P (arg) || REFERENCE_CLASS_P (arg))
          && (TREE_READONLY (arg) || TREE_THIS_VOLATILE (arg)))
          argtype = c_build_type_variant (argtype,
                                          TREE_READONLY (arg),
@@ -3208,7 +3217,7 @@ build_c_cast (tree type, tree expr)
          else
            TREE_OVERFLOW (value) = 0;
          
-         if (TREE_CODE_CLASS (TREE_CODE (ovalue)) == 'c')
+         if (CONSTANT_CLASS_P (ovalue))
            /* Similarly, constant_overflow cannot have become
               cleared.  */
            TREE_CONSTANT_OVERFLOW (value) = TREE_CONSTANT_OVERFLOW (ovalue);
@@ -6396,7 +6405,7 @@ c_finish_return (tree retval)
            case ADDR_EXPR:
              inner = TREE_OPERAND (inner, 0);
 
-             while (TREE_CODE_CLASS (TREE_CODE (inner)) == 'r'
+             while (REFERENCE_CLASS_P (inner)
                     && TREE_CODE (inner) != INDIRECT_REF)
                inner = TREE_OPERAND (inner, 0);
 
@@ -6744,7 +6753,7 @@ c_process_expr_stmt (tree expr)
 
   /* If the expression is not of a type to which we cannot assign a line
      number, wrap the thing in a no-op NOP_EXPR.  */
-  if (DECL_P (expr) || TREE_CODE_CLASS (TREE_CODE (expr)) == 'c')
+  if (DECL_P (expr) || CONSTANT_CLASS_P (expr))
     expr = build1 (NOP_EXPR, TREE_TYPE (expr), expr);
 
   if (EXPR_P (expr))
index 4153504..e4348ca 100644 (file)
@@ -671,7 +671,7 @@ record_call_1 (tree *tp, int *walk_subtrees, void *data)
     default:
       /* Save some cycles by not walking types and declaration as we
         won't find anything useful there anyway.  */
-      if (DECL_P (*tp) || TYPE_P (*tp))
+      if (IS_TYPE_OR_DECL_P (*tp))
        {
          *walk_subtrees = 0;
          break;
@@ -740,7 +740,7 @@ verify_cgraph_node_1 (tree *tp, int *walk_subtrees, void *data)
 
   /* Save some cycles by not walking types and declaration as we
      won't find anything useful there anyway.  */
-  if (DECL_P (*tp) || TYPE_P (*tp))
+  if (IS_TYPE_OR_DECL_P (*tp))
     *walk_subtrees = 0;
 
   return NULL_TREE;
@@ -2225,18 +2225,18 @@ scan_for_static_refs (tree *tp,
        check_lhs_var (fn, TREE_OPERAND (t, 0));
        /* Next check the operands on the rhs to see if they are ok. */
        switch (TREE_CODE_CLASS (TREE_CODE (rhs))) {
-       case '2':
+       case tcc_binary:
          check_rhs_var (fn, TREE_OPERAND (rhs, 0));
          check_rhs_var (fn, TREE_OPERAND (rhs, 1));
          break;
-       case '1':
-       case 'r':
+       case tcc_unary:
+       case tcc_reference:
          check_rhs_var (fn, TREE_OPERAND (rhs, 0));
          break;
-       case 'd':
+       case tcc_declaration:
          check_rhs_var (fn, rhs);
          break;
-       case 'e':
+       case tcc_expression:
          switch (TREE_CODE (rhs)) {
          case ADDR_EXPR:
            check_rhs_var (fn, rhs);
index ee334df..a838372 100644 (file)
@@ -13788,7 +13788,7 @@ arm_encode_section_info (tree decl, rtx rtl, int first)
   /* If we are referencing a function that is weak then encode a long call
      flag in the function name, otherwise if the function is static or
      or known to be defined in this file then encode a short call flag.  */
-  if (first && TREE_CODE_CLASS (TREE_CODE (decl)) == 'd')
+  if (first && DECL_P (decl))
     {
       if (TREE_CODE (decl) == FUNCTION_DECL && DECL_WEAK (decl))
         arm_encode_call_attribute (decl, LONG_CALL_FLAG_CHAR);
index 676a34a..a2a7a30 100644 (file)
@@ -99,8 +99,7 @@ associated_type (tree decl)
        t = TYPE_MAIN_VARIANT
          (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl)))));
     }
-  else if (DECL_CONTEXT (decl)
-          && TREE_CODE_CLASS (TREE_CODE (DECL_CONTEXT (decl))) == 't')
+  else if (DECL_CONTEXT (decl) && TYPE_P (DECL_CONTEXT (decl)))
     t = DECL_CONTEXT (decl);
 
   return t;
index 7c87581..4cefce5 100644 (file)
@@ -9342,8 +9342,7 @@ pa_select_section (tree exp, int reloc,
       else
        readonly_data_section ();
     }
-  else if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'c'
-          && !reloc)
+  else if (CONSTANT_CLASS_P (exp) && !reloc)
     readonly_data_section ();
   else if (TARGET_SOM
           && TREE_CODE (exp) == VAR_DECL
index 7e4e1fd..5c5d8bf 100644 (file)
@@ -1770,7 +1770,7 @@ forget_section (void)                                                     \
        && TREE_READONLY (DECL) && ! TREE_SIDE_EFFECTS (DECL)           \
        && (! DECL_INITIAL (DECL) || ! reloc_needed (DECL_INITIAL (DECL))) \
        && !flag_pic)                                                   \
-   || (TREE_CODE_CLASS (TREE_CODE (DECL)) == 'c'))
+   || CONSTANT_CLASS_P (DECL))
 
 #define FUNCTION_NAME_P(NAME)  (*(NAME) == '@')
 
index 8dc017c..ce4ee85 100644 (file)
@@ -7065,7 +7065,7 @@ sh_insert_attributes (tree node, tree *attributes)
     return;
 
   /* We are only interested in fields.  */
-  if (TREE_CODE_CLASS (TREE_CODE (node)) != 'd')
+  if (!DECL_P (node))
     return;
 
   /* Add a 'handle_interrupt' attribute.  */
index ee017eb..17628a0 100644 (file)
@@ -113,7 +113,7 @@ solaris_pragma_align (cpp_reader *pfile ATTRIBUTE_UNUSED)
   while (1)
     {
       tree decl = identifier_global_value (t);
-      if (decl && TREE_CODE_CLASS (TREE_CODE (decl)) == 'd')
+      if (decl && DECL_P (decl))
        warning ("%<#pragma align%> must appear before the declaration of "
                 "%D, ignoring", decl);
       else
@@ -168,7 +168,7 @@ solaris_pragma_init (cpp_reader *pfile ATTRIBUTE_UNUSED)
   while (1)
     {
       tree decl = identifier_global_value (t);
-      if (decl && TREE_CODE_CLASS (TREE_CODE (decl)) == 'd')
+      if (decl && DECL_P (decl))
        {
          tree init_list = build_tree_list (get_identifier ("init"),
                                            NULL);
@@ -226,7 +226,7 @@ solaris_pragma_fini (cpp_reader *pfile ATTRIBUTE_UNUSED)
   while (1)
     {
       tree decl = identifier_global_value (t);
-      if (decl && TREE_CODE_CLASS (TREE_CODE (decl)) == 'd')
+      if (decl && DECL_P (decl))
        {
          tree fini_list = build_tree_list (get_identifier ("fini"),
                                            NULL);
index 36bae1c..d9c0c12 100644 (file)
@@ -401,7 +401,7 @@ convert_to_integer (tree type, tree expr)
         we must also change the types of the operands to maintain type
         correctness.  */
 
-      if (TREE_CODE_CLASS (ex_form) == '<')
+      if (TREE_CODE_CLASS (ex_form) == tcc_comparison)
        {
          expr = copy_node (expr);
          TREE_TYPE (expr) = type;
index 1a862ad..be9b0d3 100644 (file)
@@ -1,3 +1,12 @@
+2004-09-17  Jeffrey D. Oldham  <oldham@codesourcery.com>
+           Zack Weinberg  <zack@codesourcery.com>
+
+       * cp-tree.def: Use tree_code_class enumeration constants
+       instead of code letters.
+       * call.c, class.c, cp-gimplify.c, cp-lang.c, cxx-pretty-print.c
+       * mangle.c, pt.c, semantics.c, tree.c, typeck.c:
+       Update for new tree-class enumeration constants.
+
 2004-09-16  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/16002
@@ -16,7 +25,7 @@
 
 2004-09-16  Andrew MacLeod  <amacleod@redhat.com>
 
-       * error.c (dump_decl): Make sure there is lang_specific info before 
+       * error.c (dump_decl): Make sure there is lang_specific info before
        checking for DTOR and CTOR decls.
 
 2004-09-16  Nathan Sidwell  <nathan@codesourcery.com>
 2004-09-11  Richard Henderson  <rth@redhat.com>
 
        PR c++/17404
-        * pt.c (cur_stmt_expr): Move from tsubst_expr.
-        (tsubst_expr) <case STMT_EXPR>: Move ...
-        (tsubst_copy_and_build): ... here.
+       * pt.c (cur_stmt_expr): Move from tsubst_expr.
+       (tsubst_expr) <case STMT_EXPR>: Move ...
+       (tsubst_copy_and_build): ... here.
 
 2004-09-10  Zack Weinberg  <zack@codesourcery.com>
 
index f7701ab..4f2a80c 100644 (file)
@@ -5867,7 +5867,7 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn)
   /* If we have two pseudo-candidates for conversions to the same type,
      or two candidates for the same function, arbitrarily pick one.  */
   if (cand1->fn == cand2->fn
-      && (TYPE_P (cand1->fn) || DECL_P (cand1->fn)))
+      && (IS_TYPE_OR_DECL_P (cand1->fn)))
     return 1;
 
   /* a viable function F1
index c16b872..5a06520 100644 (file)
@@ -6272,11 +6272,11 @@ get_enclosing_class (tree type)
     {
       switch (TREE_CODE_CLASS (TREE_CODE (node)))
        {
-       case 'd':
+       case tcc_declaration:
          node = DECL_CONTEXT (node);
          break;
 
-       case 't':
+       case tcc_type:
          if (node != type)
            return node;
          node = TYPE_CONTEXT (node);
index c937a11..d6a2f18 100644 (file)
@@ -303,7 +303,7 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
           && is_invisiref_parm (TREE_OPERAND (stmt, 0)))
     /* Don't dereference an invisiref RESULT_DECL inside a RETURN_EXPR.  */
     *walk_subtrees = 0;
-  else if (DECL_P (stmt) || TYPE_P (stmt))
+  else if (IS_TYPE_OR_DECL_P (stmt))
     *walk_subtrees = 0;
 
   /* Due to the way voidify_wrapper_expr is written, we don't get a chance
index ac89be0..3b2590c 100644 (file)
@@ -57,11 +57,11 @@ const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
 
 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
 
-const char tree_code_type[] = {
+const enum tree_code_class tree_code_type[] = {
 #include "tree.def"
-  'x',
+  tcc_exceptional,
 #include "c-common.def"
-  'x',
+  tcc_exceptional,
 #include "cp-tree.def"
 };
 #undef DEFTREECODE
index 02afea9..2335e2f 100644 (file)
@@ -42,56 +42,56 @@ Boston, MA 02111-1307, USA.  */
    2. An expression of the form `x.*p'.  In this case, operand 0 will
       be an expression corresponding to `x' and operand 1 will be an
       expression with pointer-to-member type.  */
-DEFTREECODE (OFFSET_REF, "offset_ref", 'r', 2)
+DEFTREECODE (OFFSET_REF, "offset_ref", tcc_reference, 2)
 
 /* A pointer-to-member constant.  For a pointer-to-member constant
    `X::Y' The PTRMEM_CST_CLASS is the RECORD_TYPE for `X' and the
    PTRMEM_CST_MEMBER is the _DECL for `Y'.  */
-DEFTREECODE (PTRMEM_CST, "ptrmem_cst", 'c', 0)
+DEFTREECODE (PTRMEM_CST, "ptrmem_cst", tcc_constant, 0)
 
 /* For NEW_EXPR, operand 0 is the placement list.
    Operand 1 is the new-declarator.
    Operand 2 is the number of elements in the array.
    Operand 3 is the initializer.  */
-DEFTREECODE (NEW_EXPR, "nw_expr", 'e', 4)
-DEFTREECODE (VEC_NEW_EXPR, "vec_nw_expr", 'e', 3)
+DEFTREECODE (NEW_EXPR, "nw_expr", tcc_expression, 4)
+DEFTREECODE (VEC_NEW_EXPR, "vec_nw_expr", tcc_expression, 3)
 
 /* For DELETE_EXPR, operand 0 is the store to be destroyed.
    Operand 1 is the value to pass to the destroying function
    saying whether the store should be deallocated as well.  */
-DEFTREECODE (DELETE_EXPR, "dl_expr", 'e', 2)
-DEFTREECODE (VEC_DELETE_EXPR, "vec_dl_expr", 'e', 2)
+DEFTREECODE (DELETE_EXPR, "dl_expr", tcc_expression, 2)
+DEFTREECODE (VEC_DELETE_EXPR, "vec_dl_expr", tcc_expression, 2)
 
 /* Value is reference to particular overloaded class method.
    Operand 0 is the class, operand 1 is the field
    The COMPLEXITY field holds the class level (usually 0).  */
-DEFTREECODE (SCOPE_REF, "scope_ref", 'r', 2)
+DEFTREECODE (SCOPE_REF, "scope_ref", tcc_reference, 2)
 
 /* When composing an object with a member, this is the result.
    Operand 0 is the object.  Operand 1 is the member (usually
    a dereferenced pointer to member).  */
-DEFTREECODE (MEMBER_REF, "member_ref", 'r', 2)
+DEFTREECODE (MEMBER_REF, "member_ref", tcc_reference, 2)
 
 /* Type conversion operator in C++.  TREE_TYPE is type that this
    operator converts to.  Operand is expression to be converted.  */
-DEFTREECODE (TYPE_EXPR, "type_expr", 'e', 1)
+DEFTREECODE (TYPE_EXPR, "type_expr", tcc_expression, 1)
 
 /* For AGGR_INIT_EXPR, operand 0 is function which performs initialization,
    operand 1 is argument list to initialization function,
    and operand 2 is the slot which was allocated for this expression.  */
-DEFTREECODE (AGGR_INIT_EXPR, "aggr_init_expr", 'e', 3)
+DEFTREECODE (AGGR_INIT_EXPR, "aggr_init_expr", tcc_expression, 3)
 
 /* A throw expression.  operand 0 is the expression, if there was one,
    else it is NULL_TREE.  */
-DEFTREECODE (THROW_EXPR, "throw_expr", 'e', 1)
+DEFTREECODE (THROW_EXPR, "throw_expr", tcc_expression, 1)
 
 /* An empty class object.  The TREE_TYPE gives the class type.  We use
    these to avoid actually creating instances of the empty classes.  */
-DEFTREECODE (EMPTY_CLASS_EXPR, "empty_class_expr", 'e', 0)
+DEFTREECODE (EMPTY_CLASS_EXPR, "empty_class_expr", tcc_expression, 0)
 
 /* A DECL which is really just a placeholder for an expression.  Used to
    implement non-class scope anonymous unions.  */
-DEFTREECODE (ALIAS_DECL, "alias_decl", 'd', 0)
+DEFTREECODE (ALIAS_DECL, "alias_decl", tcc_declaration, 0)
 
 /* A reference to a member function or member functions from a base
    class.  BASELINK_FUNCTIONS gives the FUNCTION_DECL,
@@ -105,7 +105,7 @@ DEFTREECODE (ALIAS_DECL, "alias_decl", 'd', 0)
    the type of the expression.  This type is either a FUNCTION_TYPE,
    METHOD_TYPE, or `unknown_type_node' indicating that the function is
    overloaded.  */
-DEFTREECODE (BASELINK, "baselink", 'x', 0)
+DEFTREECODE (BASELINK, "baselink", tcc_exceptional, 0)
 
 /* Template definition.  The following fields have the specified uses,
    although there are other macros in cp-tree.h that should be used for
@@ -122,7 +122,7 @@ DEFTREECODE (BASELINK, "baselink", 'x', 0)
         DECL_TEMPLATE_RESULT    decl for object to be created
                                 (e.g., FUNCTION_DECL with tmpl parms used)
  */
-DEFTREECODE (TEMPLATE_DECL, "template_decl", 'd', 0)
+DEFTREECODE (TEMPLATE_DECL, "template_decl", tcc_declaration, 0)
 
 /* Index into a template parameter list.  The TEMPLATE_PARM_IDX gives
    the index (from 0) of the parameter, while the TEMPLATE_PARM_LEVEL
@@ -157,11 +157,11 @@ DEFTREECODE (TEMPLATE_DECL, "template_decl", 'd', 0)
    The LEVEL is the level of the parameter when we are worrying about
    the types of things; the ORIG_LEVEL is the level when we are
    worrying about instantiating things.  */
-DEFTREECODE (TEMPLATE_PARM_INDEX, "template_parm_index", 'x', 0)
+DEFTREECODE (TEMPLATE_PARM_INDEX, "template_parm_index", tcc_exceptional, 0)
 
 /* Index into a template parameter list.  This parameter must be a type.
    The type.value field will be a TEMPLATE_PARM_INDEX.  */
-DEFTREECODE (TEMPLATE_TYPE_PARM, "template_type_parm", 't', 0)
+DEFTREECODE (TEMPLATE_TYPE_PARM, "template_type_parm", tcc_type, 0)
 
 /* Index into a template parameter list for template template parameters.
    This parameter must be a type.  The TYPE_FIELDS value will be a 
@@ -170,13 +170,14 @@ DEFTREECODE (TEMPLATE_TYPE_PARM, "template_type_parm", 't', 0)
    It is used without template arguments like TT in C<TT>, 
    TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO is NULL_TREE
    and TYPE_NAME is a TEMPLATE_DECL.  */
-DEFTREECODE (TEMPLATE_TEMPLATE_PARM, "template_template_parm", 't', 0)
+DEFTREECODE (TEMPLATE_TEMPLATE_PARM, "template_template_parm", tcc_type, 0)
 
 /* Like TEMPLATE_TEMPLATE_PARM it is used with bound template arguments 
    like TT<int>.
    In this case, TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO contains the
    template name and its bound arguments.  TYPE_NAME is a TYPE_DECL.  */
-DEFTREECODE (BOUND_TEMPLATE_TEMPLATE_PARM, "bound_template_template_parm", 't', 0)
+DEFTREECODE (BOUND_TEMPLATE_TEMPLATE_PARM, "bound_template_template_parm",
+            tcc_type, 0)
 
 /* A type designated by `typename T::t'.  TYPE_CONTEXT is `T',
    TYPE_NAME is an IDENTIFIER_NODE for `t'.  If the type was named via
@@ -184,51 +185,51 @@ DEFTREECODE (BOUND_TEMPLATE_TEMPLATE_PARM, "bound_template_template_parm", 't',
    If TREE_TYPE is present, this type was generated by the implicit
    typename extension, and the TREE_TYPE is a _TYPE from a baseclass
    of `T'.  */
-DEFTREECODE (TYPENAME_TYPE, "typename_type", 't', 0)
+DEFTREECODE (TYPENAME_TYPE, "typename_type", tcc_type, 0)
 
 /* For template template argument of the form `T::template C'.
    TYPE_CONTEXT is `T', the template parameter dependent object.
    TYPE_NAME is an IDENTIFIER_NODE for `C', the member class template.  */
-DEFTREECODE (UNBOUND_CLASS_TEMPLATE, "unbound_class_template", 't', 0)
+DEFTREECODE (UNBOUND_CLASS_TEMPLATE, "unbound_class_template", tcc_type, 0)
 
 /* A type designated by `__typeof (expr)'.  TYPEOF_TYPE_EXPR is the
    expression in question.  */
-DEFTREECODE (TYPEOF_TYPE, "typeof_type", 't', 0)
+DEFTREECODE (TYPEOF_TYPE, "typeof_type", tcc_type, 0)
 
 /* A using declaration.  DECL_INITIAL contains the specified scope.  
    This is not an alias, but is later expanded into multiple aliases.
    The decl will have a NULL_TYPE iff the scope is a dependent scope,
    otherwise it will have a void type.  */
-DEFTREECODE (USING_DECL, "using_decl", 'd', 0)
+DEFTREECODE (USING_DECL, "using_decl", tcc_declaration, 0)
 
 /* A using directive. The operand is USING_STMT_NAMESPACE.  */     
-DEFTREECODE (USING_STMT, "using_directive", 'e', 1)
+DEFTREECODE (USING_STMT, "using_directive", tcc_expression, 1)
 
 /* An un-parsed default argument.  Looks like an IDENTIFIER_NODE.  */
-DEFTREECODE (DEFAULT_ARG, "default_arg", 'x', 0)
+DEFTREECODE (DEFAULT_ARG, "default_arg", tcc_exceptional, 0)
 
 /* A template-id, like foo<int>.  The first operand is the template.
    The second is NULL if there are no explicit arguments, or a
    TREE_VEC of arguments.  The template will be a FUNCTION_DECL,
    TEMPLATE_DECL, or an OVERLOAD.  If the template-id refers to a
    member template, the template may be an IDENTIFIER_NODE.  */
-DEFTREECODE (TEMPLATE_ID_EXPR, "template_id_expr", 'e', 2)
+DEFTREECODE (TEMPLATE_ID_EXPR, "template_id_expr", tcc_expression, 2)
 
 /* A list-like node for chaining overloading candidates. TREE_TYPE is 
    the original name, and the parameter is the FUNCTION_DECL.  */
-DEFTREECODE (OVERLOAD, "overload", 'x', 0)
+DEFTREECODE (OVERLOAD, "overload", tcc_exceptional, 0)
 
 /* A whole bunch of tree codes for the initial, superficial parsing of
    templates.  */
-DEFTREECODE (MODOP_EXPR, "modop_expr", 'e', 3)
-DEFTREECODE (CAST_EXPR, "cast_expr", '1', 1)
-DEFTREECODE (REINTERPRET_CAST_EXPR, "reinterpret_cast_expr", '1', 1)
-DEFTREECODE (CONST_CAST_EXPR, "const_cast_expr", '1', 1)
-DEFTREECODE (STATIC_CAST_EXPR, "static_cast_expr", '1', 1)
-DEFTREECODE (DYNAMIC_CAST_EXPR, "dynamic_cast_expr", '1', 1)
-DEFTREECODE (DOTSTAR_EXPR, "dotstar_expr", 'e', 2)
-DEFTREECODE (TYPEID_EXPR, "typeid_expr", 'e', 1)
-DEFTREECODE (PSEUDO_DTOR_EXPR, "pseudo_dtor_expr", 'e', 3)
+DEFTREECODE (MODOP_EXPR, "modop_expr", tcc_expression, 3)
+DEFTREECODE (CAST_EXPR, "cast_expr", tcc_unary, 1)
+DEFTREECODE (REINTERPRET_CAST_EXPR, "reinterpret_cast_expr", tcc_unary, 1)
+DEFTREECODE (CONST_CAST_EXPR, "const_cast_expr", tcc_unary, 1)
+DEFTREECODE (STATIC_CAST_EXPR, "static_cast_expr", tcc_unary, 1)
+DEFTREECODE (DYNAMIC_CAST_EXPR, "dynamic_cast_expr", tcc_unary, 1)
+DEFTREECODE (DOTSTAR_EXPR, "dotstar_expr", tcc_expression, 2)
+DEFTREECODE (TYPEID_EXPR, "typeid_expr", tcc_expression, 1)
+DEFTREECODE (PSEUDO_DTOR_EXPR, "pseudo_dtor_expr", tcc_expression, 3)
 
 /* A placeholder for an expression that is not type-dependent, but
    does occur in a template.  When an expression that is not
@@ -239,38 +240,38 @@ DEFTREECODE (PSEUDO_DTOR_EXPR, "pseudo_dtor_expr", 'e', 3)
    that situation, we create a NON_DEPENDENT_EXPR to take the place of
    the original expression.  The expression is the only operand -- it
    is only needed for diagnostics.  */
-DEFTREECODE (NON_DEPENDENT_EXPR, "non_dependent_expr", 'e', 1)
+DEFTREECODE (NON_DEPENDENT_EXPR, "non_dependent_expr", tcc_expression, 1)
 
 /* CTOR_INITIALIZER is a placeholder in template code for a call to
    setup_vtbl_pointer (and appears in all functions, not just ctors).  */
-DEFTREECODE (CTOR_INITIALIZER, "ctor_initializer", 'e', 1)
+DEFTREECODE (CTOR_INITIALIZER, "ctor_initializer", tcc_expression, 1)
 
-DEFTREECODE (TRY_BLOCK, "try_block", 'e', 2)
+DEFTREECODE (TRY_BLOCK, "try_block", tcc_expression, 2)
 
-DEFTREECODE (EH_SPEC_BLOCK, "eh_spec_block", 'e', 2)
+DEFTREECODE (EH_SPEC_BLOCK, "eh_spec_block", tcc_expression, 2)
 
 /* A HANDLER wraps a catch handler for the HANDLER_TYPE.  If this is
    CATCH_ALL_TYPE, then the handler catches all types.  The declaration of
    the catch variable is in HANDLER_PARMS, and the body block in
    HANDLER_BODY.  */
-DEFTREECODE (HANDLER, "handler", 'e', 2)
+DEFTREECODE (HANDLER, "handler", tcc_expression, 2)
 
 /* A MUST_NOT_THROW_EXPR wraps an expression that may not
    throw, and must call terminate if it does.  */
-DEFTREECODE (MUST_NOT_THROW_EXPR, "must_not_throw_expr", 'e', 1)
+DEFTREECODE (MUST_NOT_THROW_EXPR, "must_not_throw_expr", tcc_expression, 1)
 
 /* A CLEANUP_STMT marks the point at which a declaration is fully
    constructed.  The CLEANUP_EXPR is run on behalf of CLEANUP_DECL
    when CLEANUP_BODY completes.  */
-DEFTREECODE (CLEANUP_STMT, "cleanup_stmt", 'e', 3)
+DEFTREECODE (CLEANUP_STMT, "cleanup_stmt", tcc_expression, 3)
 
 /* Represents an 'if' statement. The operands are IF_COND,
    THEN_CLAUSE, and ELSE_CLAUSE, respectively.  */
 /* ??? It is currently still necessary to distinguish between IF_STMT 
    and COND_EXPR for the benefit of templates.  */
-DEFTREECODE (IF_STMT, "if_stmt", 'e', 3)
+DEFTREECODE (IF_STMT, "if_stmt", tcc_expression, 3)
 
-DEFTREECODE (TAG_DEFN, "tag_defn", 'e', 0)
+DEFTREECODE (TAG_DEFN, "tag_defn", tcc_expression, 0)
 
 /* Template instantiation level node.
 
@@ -280,10 +281,10 @@ DEFTREECODE (TAG_DEFN, "tag_defn", 'e', 0)
    A stack of template instantiation nodes is kept through the TREE_CHAIN
    fields of these nodes.  */
 
-DEFTREECODE (TINST_LEVEL, "TINST_LEVEL", 'x', 0)
+DEFTREECODE (TINST_LEVEL, "TINST_LEVEL", tcc_exceptional, 0)
 
 /* Represents an 'offsetof' expression during template expansion.  */
-DEFTREECODE (OFFSETOF_EXPR, "offsetof_expr", 'e', 1)
+DEFTREECODE (OFFSETOF_EXPR, "offsetof_expr", tcc_expression, 1)
 
 /*
 Local variables:
index 1c84e16..ca2a29f 100644 (file)
@@ -1154,7 +1154,8 @@ static void
 pp_cxx_parameter_declaration_clause (cxx_pretty_printer *pp, tree t)
 {
   tree args = TYPE_P (t) ? NULL : FUNCTION_FIRST_USER_PARM (t);
-  tree types = TYPE_P (t) ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t);
+  tree types = 
+    TYPE_P (t) ? TYPE_ARG_TYPES (t) : FUNCTION_FIRST_USER_PARMTYPE (t);
   const bool abstract = args == NULL
     || pp_c_base (pp)->flags & pp_c_flag_abstract;
   bool first = true;
@@ -1441,7 +1442,7 @@ pp_cxx_template_argument_list (cxx_pretty_printer *pp, tree t)
       if (i != 0)
         pp_cxx_separate_with (pp, ',');
       if (TYPE_P (arg) || (TREE_CODE (arg) == TEMPLATE_DECL
-                           && TYPE_P (DECL_TEMPLATE_RESULT (arg))))
+                          && TYPE_P (DECL_TEMPLATE_RESULT (arg))))
         pp_cxx_type_id (pp, arg);
       else
         pp_cxx_expression (pp, arg);
index 41c381d..5d9995f 100644 (file)
@@ -1997,7 +1997,7 @@ write_expression (tree expr)
       || code == TEMPLATE_PARM_INDEX)
     write_template_param (expr);
   /* Handle literals.  */
-  else if (TREE_CODE_CLASS (code) == 'c' 
+  else if (TREE_CODE_CLASS (code) == tcc_constant
           || (abi_version_at_least (2) && code == CONST_DECL))
     write_template_arg_literal (expr);
   else if (DECL_P (expr))
@@ -2260,7 +2260,7 @@ write_template_arg (tree node)
   else if (code == TEMPLATE_DECL)
     /* A template appearing as a template arg is a template template arg.  */
     write_template_template_arg (node);
-  else if ((TREE_CODE_CLASS (code) == 'c' && code != PTRMEM_CST)
+  else if ((TREE_CODE_CLASS (code) == tcc_constant && code != PTRMEM_CST)
           || (abi_version_at_least (2) && code == CONST_DECL))
     write_template_arg_literal (node);
   else if (DECL_P (node))
index e7d44f2..d7e5903 100644 (file)
@@ -4891,7 +4891,7 @@ uses_template_parms (tree t)
           || TREE_CODE (t) == TEMPLATE_PARM_INDEX
           || TREE_CODE (t) == OVERLOAD
           || TREE_CODE (t) == BASELINK
-          || TREE_CODE_CLASS (TREE_CODE (t)) == 'c')
+          || CONSTANT_CLASS_P (t))
     dependent_p = (type_dependent_expression_p (t)
                   || value_dependent_expression_p (t));
   else
@@ -10109,7 +10109,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
       return 1;
 
     default:
-      gcc_assert (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (parm))));
+      gcc_assert (EXPR_P (parm));
       
       /* We must be looking at an expression.  This can happen with
         something like: 
@@ -11586,9 +11586,9 @@ dependent_type_p_r (tree type)
 
      A type is dependent if it is:
 
-     -- a template parameter. Template template parameters are
-       types for us (since TYPE_P holds true for them) so we
-       handle them here.  */
+     -- a template parameter. Template template parameters are types
+       for us (since TYPE_P holds true for them) so we handle
+       them here.  */
   if (TREE_CODE (type) == TEMPLATE_TYPE_PARM 
       || TREE_CODE (type) == TEMPLATE_TEMPLATE_PARM)
     return true;
@@ -11819,20 +11819,20 @@ value_dependent_expression_p (tree expression)
            || value_dependent_expression_p (TREE_OPERAND (expression, 1)));
   /* A constant expression is value-dependent if any subexpression is
      value-dependent.  */
-  if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (expression))))
+  if (EXPR_P (expression))
     {
       switch (TREE_CODE_CLASS (TREE_CODE (expression)))
        {
-       case '1':
+       case tcc_unary:
          return (value_dependent_expression_p 
                  (TREE_OPERAND (expression, 0)));
-       case '<':
-       case '2':
+       case tcc_comparison:
+       case tcc_binary:
          return ((value_dependent_expression_p 
                   (TREE_OPERAND (expression, 0)))
                  || (value_dependent_expression_p 
                      (TREE_OPERAND (expression, 1))));
-       case 'e':
+       case tcc_expression:
          {
            int i;
            for (i = 0; i < first_rtl_op (TREE_CODE (expression)); ++i)
@@ -11846,6 +11846,13 @@ value_dependent_expression_p (tree expression)
                return true;
            return false;
          }
+       case tcc_reference:
+       case tcc_statement:
+         /* These cannot be value dependent.  */
+         return false;
+
+       default:
+         gcc_unreachable ();
        }
     }
 
index 1ea97a0..2f1d0e8 100644 (file)
@@ -1239,7 +1239,7 @@ finish_mem_initializers (tree mem_inits)
 tree
 finish_parenthesized_expr (tree expr)
 {
-  if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (expr))))
+  if (EXPR_P (expr))
     /* This inhibits warnings in c_common_truthvalue_conversion.  */
     TREE_NO_WARNING (expr) = 1;
 
index 2038b05..28bb512 100644 (file)
@@ -1,6 +1,6 @@
 /* Language-dependent node constructors for parse phase of GNU compiler.
    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
    Hacked by Michael Tiemann (tiemann@cygnus.com)
 
 This file is part of GCC.
@@ -1554,12 +1554,12 @@ cp_tree_equal (tree t1, tree t2)
 
   switch (TREE_CODE_CLASS (code1))
     {
-    case '1':
-    case '2':
-    case '<':
-    case 'e':
-    case 'r':
-    case 's':
+    case tcc_unary:
+    case tcc_binary:
+    case tcc_comparison:
+    case tcc_expression:
+    case tcc_reference:
+    case tcc_statement:
       {
        int i;
 
@@ -1570,11 +1570,12 @@ cp_tree_equal (tree t1, tree t2)
        return true;
       }
 
-    case 't':
+    case tcc_type:
       return same_type_p (t1, t2);
+    default:
+      gcc_unreachable ();
     }
-
-  gcc_unreachable ();
+  /* We can get here with --disable-checking.  */
   return false;
 }
 
index 2169bad..990352d 100644 (file)
@@ -4956,7 +4956,7 @@ build_c_cast (tree type, tree expr)
        {
          TREE_OVERFLOW (value) = TREE_OVERFLOW (ovalue);
 
-         if (TREE_CODE_CLASS (TREE_CODE (ovalue)) == 'c')
+         if (CONSTANT_CLASS_P (ovalue))
            TREE_CONSTANT_OVERFLOW (value) = TREE_CONSTANT_OVERFLOW (ovalue);
        }
     }
index 452a62d..62f3102 100644 (file)
@@ -1318,7 +1318,7 @@ dbxout_type (tree type, int full)
           || TREE_CODE (type) == QUAL_UNION_TYPE
           || TREE_CODE (type) == ENUMERAL_TYPE)
          && TYPE_STUB_DECL (type)
-         && TREE_CODE_CLASS (TREE_CODE (TYPE_STUB_DECL (type))) == 'd'
+         && DECL_P (TYPE_STUB_DECL (type))
          && ! DECL_IGNORED_P (TYPE_STUB_DECL (type)))
        debug_queue_symbol (TYPE_STUB_DECL (type));
       else if (TYPE_NAME (type)
@@ -2179,19 +2179,19 @@ dbxout_symbol (tree decl, int local ATTRIBUTE_UNUSED)
            || TREE_CODE (t) == ENUMERAL_TYPE)
           && TYPE_STUB_DECL (t)
           && TYPE_STUB_DECL (t) != decl
-          && TREE_CODE_CLASS (TREE_CODE (TYPE_STUB_DECL (t))) == 'd'
+          && DECL_P (TYPE_STUB_DECL (t))
           && ! DECL_IGNORED_P (TYPE_STUB_DECL (t)))
         {
           debug_queue_symbol (TYPE_STUB_DECL (t));
           if (TYPE_NAME (t)
               && TYPE_NAME (t) != TYPE_STUB_DECL (t)
               && TYPE_NAME (t) != decl
-              && TREE_CODE_CLASS (TREE_CODE (TYPE_NAME (t))) == 'd')
+              && DECL_P (TYPE_NAME (t)))
             debug_queue_symbol (TYPE_NAME (t));
         }
       else if (TYPE_NAME (t)
               && TYPE_NAME (t) != decl
-              && TREE_CODE_CLASS (TREE_CODE (TYPE_NAME (t))) == 'd')
+              && DECL_P (TYPE_NAME (t)))
         debug_queue_symbol (TYPE_NAME (t));
     }
 
index 25f4b25..51b3681 100644 (file)
@@ -10918,7 +10918,7 @@ gen_formal_parameter_die (tree node, dw_die_ref context_die)
 
   switch (TREE_CODE_CLASS (TREE_CODE (node)))
     {
-    case 'd':
+    case tcc_declaration:
       origin = decl_ultimate_origin (node);
       if (origin != NULL)
        add_abstract_origin_attribute (parm_die, origin);
@@ -10939,7 +10939,7 @@ gen_formal_parameter_die (tree node, dw_die_ref context_die)
 
       break;
 
-    case 't':
+    case tcc_type:
       /* We were called with some kind of a ..._TYPE node.  */
       add_type_attribute (parm_die, node, 0, 0, context_die);
       break;
@@ -12417,7 +12417,8 @@ force_type_die (tree type)
 static dw_die_ref
 setup_namespace_context (tree thing, dw_die_ref context_die)
 {
-  tree context = DECL_P (thing) ? DECL_CONTEXT (thing) : TYPE_CONTEXT (thing);
+  tree context = (DECL_P (thing)
+                 ? DECL_CONTEXT (thing) : TYPE_CONTEXT (thing));
   if (context && TREE_CODE (context) == NAMESPACE_DECL)
     /* Force out the namespace.  */
     context_die = force_decl_die (context);
index 1dcda2c..ce597b0 100644 (file)
@@ -1592,7 +1592,7 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
        }
 
       /* If this is a constant, we know the alignment.  */
-      else if (TREE_CODE_CLASS (TREE_CODE (t)) == 'c')
+      else if (CONSTANT_CLASS_P (t))
        {
          align = TYPE_ALIGN (type);
 #ifdef CONSTANT_ALIGNMENT
index e5ed2f6..da8304a 100644 (file)
@@ -3527,7 +3527,7 @@ expand_assignment (tree to, tree from, int want_value)
          src = from;
          STRIP_NOPS (src);
          if (TREE_CODE (TREE_TYPE (src)) != INTEGER_TYPE
-             || TREE_CODE_CLASS (TREE_CODE (src)) != '2')
+             || !BINARY_CLASS_P (src))
            break;
 
          op0 = TREE_OPERAND (src, 0);
@@ -5755,14 +5755,14 @@ safe_from_p (rtx x, tree exp, int top_p)
   /* Now look at our tree code and possibly recurse.  */
   switch (TREE_CODE_CLASS (TREE_CODE (exp)))
     {
-    case 'd':
+    case tcc_declaration:
       exp_rtl = DECL_RTL_IF_SET (exp);
       break;
 
-    case 'c':
+    case tcc_constant:
       return 1;
 
-    case 'x':
+    case tcc_exceptional:
       if (TREE_CODE (exp) == TREE_LIST)
        {
          while (1)
@@ -5781,7 +5781,7 @@ safe_from_p (rtx x, tree exp, int top_p)
       else
        return 0;
 
-    case 's':
+    case tcc_statement:
       /* The only case we look at here is the DECL_INITIAL inside a
         DECL_EXPR.  */
       return (TREE_CODE (exp) != DECL_EXPR
@@ -5789,17 +5789,17 @@ safe_from_p (rtx x, tree exp, int top_p)
              || !DECL_INITIAL (DECL_EXPR_DECL (exp))
              || safe_from_p (x, DECL_INITIAL (DECL_EXPR_DECL (exp)), 0));
 
-    case '2':
-    case '<':
+    case tcc_binary:
+    case tcc_comparison:
       if (!safe_from_p (x, TREE_OPERAND (exp, 1), 0))
        return 0;
       /* Fall through.  */
 
-    case '1':
+    case tcc_unary:
       return safe_from_p (x, TREE_OPERAND (exp, 0), 0);
 
-    case 'e':
-    case 'r':
+    case tcc_expression:
+    case tcc_reference:
       /* Now do code-specific tests.  EXP_RTL is set to any rtx we find in
         the expression.  If it is set, we conflict iff we are that rtx or
         both are in memory.  Otherwise, we check all operands of the
@@ -5872,6 +5872,11 @@ safe_from_p (rtx x, tree exp, int top_p)
          >= (unsigned int) LAST_AND_UNUSED_TREE_CODE
          && !lang_hooks.safe_from_p (x, exp))
        return 0;
+      break;
+
+    case tcc_type:
+      /* Should never get a type here.  */
+      gcc_unreachable ();
     }
 
   /* If we have an rtl, find any enclosed object.  Then see if we conflict
@@ -6068,7 +6073,7 @@ expand_expr_addr_expr_1 (tree exp, rtx target, enum machine_mode tmode,
      generating ADDR_EXPR of something that isn't an LVALUE.  The only
      exception here is STRING_CST.  */
   if (TREE_CODE (exp) == CONSTRUCTOR
-      || TREE_CODE_CLASS (TREE_CODE (exp)) == 'c')
+      || CONSTANT_CLASS_P (exp))
     return XEXP (output_constant_def (exp, 0), 0);
 
   /* Everything must be something allowed by is_gimple_addressable.  */
@@ -6400,12 +6405,13 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
          return const0_rtx;
        }
 
-      if (TREE_CODE_CLASS (code) == '1' || code == COMPONENT_REF
-         || code == INDIRECT_REF)
+      if (TREE_CODE_CLASS (code) == tcc_unary
+         || code == COMPONENT_REF || code == INDIRECT_REF)
        return expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode,
                            modifier);
 
-      else if (TREE_CODE_CLASS (code) == '2' || TREE_CODE_CLASS (code) == '<'
+      else if (TREE_CODE_CLASS (code) == tcc_binary
+              || TREE_CODE_CLASS (code) == tcc_comparison
               || code == ARRAY_REF || code == ARRAY_RANGE_REF)
        {
          expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, modifier);
index 7d8fff9..25c84a4 100644 (file)
@@ -2281,7 +2281,7 @@ combine_comparisons (enum tree_code code, enum tree_code lcode,
 static int
 truth_value_p (enum tree_code code)
 {
-  return (TREE_CODE_CLASS (code) == '<'
+  return (TREE_CODE_CLASS (code) == tcc_comparison
          || code == TRUTH_AND_EXPR || code == TRUTH_ANDIF_EXPR
          || code == TRUTH_OR_EXPR || code == TRUTH_ORIF_EXPR
          || code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR);
@@ -2420,7 +2420,7 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags)
 
   switch (TREE_CODE_CLASS (TREE_CODE (arg0)))
     {
-    case '1':
+    case tcc_unary:
       /* Two conversions are equal only if signedness and modes match.  */
       switch (TREE_CODE (arg0))
         {
@@ -2441,8 +2441,8 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags)
       return operand_equal_p (TREE_OPERAND (arg0, 0),
                              TREE_OPERAND (arg1, 0), flags);
 
-    case '<':
-    case '2':
+    case tcc_comparison:
+    case tcc_binary:
       if (operand_equal_p (TREE_OPERAND (arg0, 0),
                           TREE_OPERAND (arg1, 0), flags)
          && operand_equal_p (TREE_OPERAND (arg0, 1),
@@ -2456,7 +2456,7 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags)
              && operand_equal_p (TREE_OPERAND (arg0, 1),
                                  TREE_OPERAND (arg1, 0), flags));
 
-    case 'r':
+    case tcc_reference:
       /* If either of the pointer (or reference) expressions we are
         dereferencing contain a side effect, these cannot be equal.  */
       if (TREE_SIDE_EFFECTS (arg0)
@@ -2503,7 +2503,7 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags)
          return 0;
        }
 
-    case 'e':
+    case tcc_expression:
       switch (TREE_CODE (arg0))
        {
        case ADDR_EXPR:
@@ -2570,7 +2570,7 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags)
          return 0;
        }
 
-    case 'd':
+    case tcc_declaration:
       /* Consider __builtin_sqrt equal to sqrt.  */
       return (TREE_CODE (arg0) == FUNCTION_DECL
              && DECL_BUILT_IN (arg0) && DECL_BUILT_IN (arg1)
@@ -2652,17 +2652,17 @@ static int
 twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
 {
   enum tree_code code = TREE_CODE (arg);
-  char class = TREE_CODE_CLASS (code);
+  enum tree_code_class class = TREE_CODE_CLASS (code);
 
-  /* We can handle some of the 'e' cases here.  */
-  if (class == 'e' && code == TRUTH_NOT_EXPR)
-    class = '1';
-  else if (class == 'e'
+  /* We can handle some of the tcc_expression cases here.  */
+  if (class == tcc_expression && code == TRUTH_NOT_EXPR)
+    class = tcc_unary;
+  else if (class == tcc_expression
           && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR
               || code == COMPOUND_EXPR))
-    class = '2';
+    class = tcc_binary;
 
-  else if (class == 'e' && code == SAVE_EXPR
+  else if (class == tcc_expression && code == SAVE_EXPR
           && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg, 0)))
     {
       /* If we've already found a CVAL1 or CVAL2, this expression is
@@ -2670,24 +2670,24 @@ twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
       if (*cval1 || *cval2)
        return 0;
 
-      class = '1';
+      class = tcc_unary;
       *save_p = 1;
     }
 
   switch (class)
     {
-    case '1':
+    case tcc_unary:
       return twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p);
 
-    case '2':
+    case tcc_binary:
       return (twoval_comparison_p (TREE_OPERAND (arg, 0), cval1, cval2, save_p)
              && twoval_comparison_p (TREE_OPERAND (arg, 1),
                                      cval1, cval2, save_p));
 
-    case 'c':
+    case tcc_constant:
       return 1;
 
-    case 'e':
+    case tcc_expression:
       if (code == COND_EXPR)
        return (twoval_comparison_p (TREE_OPERAND (arg, 0),
                                     cval1, cval2, save_p)
@@ -2697,7 +2697,7 @@ twoval_comparison_p (tree arg, tree *cval1, tree *cval2, int *save_p)
                                        cval1, cval2, save_p));
       return 0;
 
-    case '<':
+    case tcc_comparison:
       /* First see if we can handle the first operand, then the second.  For
         the second operand, we know *CVAL1 can't be zero.  It must be that
         one side of the comparison is each of the values; test for the
@@ -2745,30 +2745,30 @@ eval_subst (tree arg, tree old0, tree new0, tree old1, tree new1)
 {
   tree type = TREE_TYPE (arg);
   enum tree_code code = TREE_CODE (arg);
-  char class = TREE_CODE_CLASS (code);
+  enum tree_code_class class = TREE_CODE_CLASS (code);
 
-  /* We can handle some of the 'e' cases here.  */
-  if (class == 'e' && code == TRUTH_NOT_EXPR)
-    class = '1';
-  else if (class == 'e'
+  /* We can handle some of the tcc_expression cases here.  */
+  if (class == tcc_expression && code == TRUTH_NOT_EXPR)
+    class = tcc_unary;
+  else if (class == tcc_expression
           && (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR))
-    class = '2';
+    class = tcc_binary;
 
   switch (class)
     {
-    case '1':
+    case tcc_unary:
       return fold (build1 (code, type,
                           eval_subst (TREE_OPERAND (arg, 0),
                                       old0, new0, old1, new1)));
 
-    case '2':
+    case tcc_binary:
       return fold (build2 (code, type,
                           eval_subst (TREE_OPERAND (arg, 0),
                                       old0, new0, old1, new1),
                           eval_subst (TREE_OPERAND (arg, 1),
                                       old0, new0, old1, new1)));
 
-    case 'e':
+    case tcc_expression:
       switch (code)
        {
        case SAVE_EXPR:
@@ -2790,7 +2790,7 @@ eval_subst (tree arg, tree old0, tree new0, tree old1, tree new1)
        }
       /* Fall through - ???  */
 
-    case '<':
+    case tcc_comparison:
       {
        tree arg0 = TREE_OPERAND (arg, 0);
        tree arg1 = TREE_OPERAND (arg, 1);
@@ -2890,7 +2890,7 @@ invert_truthvalue (tree arg)
      floating-point non-equality comparisons, in which case we just
      enclose a TRUTH_NOT_EXPR around what we have.  */
 
-  if (TREE_CODE_CLASS (code) == '<')
+  if (TREE_CODE_CLASS (code) == tcc_comparison)
     {
       tree op_type = TREE_TYPE (TREE_OPERAND (arg, 0));
       if (FLOAT_TYPE_P (op_type)
@@ -3413,7 +3413,7 @@ simple_operand_p (tree exp)
             == TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)))))
     exp = TREE_OPERAND (exp, 0);
 
-  return (TREE_CODE_CLASS (TREE_CODE (exp)) == 'c'
+  return (CONSTANT_CLASS_P (exp)
          || (DECL_P (exp)
              && ! TREE_ADDRESSABLE (exp)
              && ! TREE_THIS_VOLATILE (exp)
@@ -3484,7 +3484,7 @@ range_binop (enum tree_code code, tree type, tree arg0, int upper0_p,
       return TREE_CODE (tem) == INTEGER_CST ? tem : 0;
     }
 
-  if (TREE_CODE_CLASS (code) != '<')
+  if (TREE_CODE_CLASS (code) != tcc_comparison)
     return 0;
 
   /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0
@@ -3555,13 +3555,13 @@ make_range (tree exp, int *pin_p, tree *plow, tree *phigh)
        {
          if (first_rtl_op (code) > 0)
            arg0 = TREE_OPERAND (exp, 0);
-         if (TREE_CODE_CLASS (code) == '<'
-             || TREE_CODE_CLASS (code) == '1'
-             || TREE_CODE_CLASS (code) == '2')
+         if (TREE_CODE_CLASS (code) == tcc_comparison
+             || TREE_CODE_CLASS (code) == tcc_unary
+             || TREE_CODE_CLASS (code) == tcc_binary)
            arg0_type = TREE_TYPE (arg0);
-         if (TREE_CODE_CLASS (code) == '2'
-             || TREE_CODE_CLASS (code) == '<'
-             || (TREE_CODE_CLASS (code) == 'e'
+         if (TREE_CODE_CLASS (code) == tcc_binary
+             || TREE_CODE_CLASS (code) == tcc_comparison
+             || (TREE_CODE_CLASS (code) == tcc_expression
                  && TREE_CODE_LENGTH (code) > 1))
            arg1 = TREE_OPERAND (exp, 1);
        }
@@ -4192,7 +4192,7 @@ fold_cond_expr_with_comparison (tree type, tree arg0, tree arg1, tree arg2)
        tem = fold (build1 (ABS_EXPR, TREE_TYPE (arg1), arg1));
        return negate_expr (fold_convert (type, tem));
       default:
-       gcc_assert (TREE_CODE_CLASS (comp_code) == '<');
+       gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
        break;
       }
 
@@ -4296,7 +4296,7 @@ fold_cond_expr_with_comparison (tree type, tree arg0, tree arg1, tree arg2)
            return pedantic_non_lvalue (fold_convert (type, arg1));
          break;
        default:
-         gcc_assert (TREE_CODE_CLASS (comp_code) == '<');
+         gcc_assert (TREE_CODE_CLASS (comp_code) == tcc_comparison);
          break;
        }
     }
@@ -4569,7 +4569,8 @@ fold_truthop (enum tree_code code, tree truth_type, tree lhs, tree rhs)
       rcode = NE_EXPR;
     }
 
-  if (TREE_CODE_CLASS (lcode) != '<' || TREE_CODE_CLASS (rcode) != '<')
+  if (TREE_CODE_CLASS (lcode) != tcc_comparison
+      || TREE_CODE_CLASS (rcode) != tcc_comparison)
     return 0;
 
   ll_arg = TREE_OPERAND (lhs, 0);
@@ -5073,10 +5074,10 @@ extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type)
   if (integer_zerop (c))
     return NULL_TREE;
 
-  if (TREE_CODE_CLASS (tcode) == '1')
+  if (TREE_CODE_CLASS (tcode) == tcc_unary)
     op0 = TREE_OPERAND (t, 0);
 
-  if (TREE_CODE_CLASS (tcode) == '2')
+  if (TREE_CODE_CLASS (tcode) == tcc_binary)
     op0 = TREE_OPERAND (t, 0), op1 = TREE_OPERAND (t, 1);
 
   /* Note that we need not handle conditional operations here since fold
@@ -5094,10 +5095,10 @@ extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type)
 
     case CONVERT_EXPR:  case NON_LVALUE_EXPR:  case NOP_EXPR:
       /* If op0 is an expression ...  */
-      if ((TREE_CODE_CLASS (TREE_CODE (op0)) == '<'
-          || TREE_CODE_CLASS (TREE_CODE (op0)) == '1'
-          || TREE_CODE_CLASS (TREE_CODE (op0)) == '2'
-          || TREE_CODE_CLASS (TREE_CODE (op0)) == 'e')
+      if ((COMPARISON_CLASS_P (op0)
+          || UNARY_CLASS_P (op0)
+          || BINARY_CLASS_P (op0)
+          || EXPRESSION_CLASS_P (op0))
          /* ... and is unsigned, and its type is smaller than ctype,
             then we cannot pass through as widening.  */
          && ((TYPE_UNSIGNED (TREE_TYPE (op0))
@@ -5990,14 +5991,14 @@ fold (tree expr)
   tree tem;
   tree arg0 = NULL_TREE, arg1 = NULL_TREE;
   enum tree_code code = TREE_CODE (t);
-  int kind = TREE_CODE_CLASS (code);
+  enum tree_code_class kind = TREE_CODE_CLASS (code);
 
   /* WINS will be nonzero when the switch is done
      if all operands are constant.  */
   int wins = 1;
 
   /* Return right away if a constant.  */
-  if (kind == 'c')
+  if (kind == tcc_constant)
     return t;
 
   if (code == NOP_EXPR || code == FLOAT_EXPR || code == CONVERT_EXPR)
@@ -6046,7 +6047,7 @@ fold (tree expr)
             of the arguments so that their form can be studied.  In any
             cases, the appropriate type conversions should be put back in
             the tree that will get out of the constant folder.  */
-         if (kind == '<')
+         if (kind == tcc_comparison)
            STRIP_SIGN_NOPS (op);
          else
            STRIP_NOPS (op);
@@ -6118,7 +6119,7 @@ fold (tree expr)
       return tem;
     }
 
-  if (TREE_CODE_CLASS (code) == '1')
+  if (TREE_CODE_CLASS (code) == tcc_unary)
     {
       if (TREE_CODE (arg0) == COMPOUND_EXPR)
        return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
@@ -6165,7 +6166,7 @@ fold (tree expr)
                                  TREE_OPERAND (TREE_OPERAND (tem, 2), 0)));
          return tem;
        }
-      else if (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<')
+      else if (COMPARISON_CLASS_P (arg0))
        {
          if (TREE_CODE (type) == BOOLEAN_TYPE)
            {
@@ -6181,16 +6182,16 @@ fold (tree expr)
                                               integer_zero_node))));
        }
    }
-  else if (TREE_CODE_CLASS (code) == '<'
+  else if (TREE_CODE_CLASS (code) == tcc_comparison
           && TREE_CODE (arg0) == COMPOUND_EXPR)
     return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
                   fold (build2 (code, type, TREE_OPERAND (arg0, 1), arg1)));
-  else if (TREE_CODE_CLASS (code) == '<'
+  else if (TREE_CODE_CLASS (code) == tcc_comparison
           && TREE_CODE (arg1) == COMPOUND_EXPR)
     return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg1, 0),
                   fold (build2 (code, type, arg0, TREE_OPERAND (arg1, 1))));
-  else if (TREE_CODE_CLASS (code) == '2'
-          || TREE_CODE_CLASS (code) == '<')
+  else if (TREE_CODE_CLASS (code) == tcc_binary
+          || TREE_CODE_CLASS (code) == tcc_comparison)
     {
       if (TREE_CODE (arg0) == COMPOUND_EXPR)
        return build2 (COMPOUND_EXPR, type, TREE_OPERAND (arg0, 0),
@@ -6202,8 +6203,7 @@ fold (tree expr)
                       fold (build2 (code, type,
                                     arg0, TREE_OPERAND (arg1, 1))));
 
-      if (TREE_CODE (arg0) == COND_EXPR
-         || TREE_CODE_CLASS (TREE_CODE (arg0)) == '<')
+      if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
        {
          tem = fold_binary_op_with_conditional_arg (code, type, arg0, arg1,
                                                     /*cond_first_p=*/1);
@@ -6211,8 +6211,7 @@ fold (tree expr)
            return tem;
        }
 
-      if (TREE_CODE (arg1) == COND_EXPR
-         || TREE_CODE_CLASS (TREE_CODE (arg1)) == '<')
+      if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
        {
          tem = fold_binary_op_with_conditional_arg (code, type, arg1, arg0,
                                                     /*cond_first_p=*/0);
@@ -6382,7 +6381,7 @@ fold (tree expr)
       /* Convert (T1)((T2)X op Y) into (T1)X op Y, for pointer types T1 and
         T2 being pointers to types of the same size.  */
       if (POINTER_TYPE_P (TREE_TYPE (t))
-         && TREE_CODE_CLASS (TREE_CODE (arg0)) == '2'
+         && BINARY_CLASS_P (arg0)
          && TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR
          && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 0))))
        {
@@ -8772,7 +8771,7 @@ fold (tree expr)
         for reasons given above each one.
 
          Also try swapping the arguments and inverting the conditional.  */
-      if (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
+      if (COMPARISON_CLASS_P (arg0)
          && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
                                             arg1, TREE_OPERAND (arg0, 1))
          && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg1))))
@@ -8784,14 +8783,14 @@ fold (tree expr)
            return tem;
        }
 
-      if (TREE_CODE_CLASS (TREE_CODE (arg0)) == '<'
+      if (COMPARISON_CLASS_P (arg0)
          && operand_equal_for_comparison_p (TREE_OPERAND (arg0, 0),
                                             TREE_OPERAND (t, 2),
                                             TREE_OPERAND (arg0, 1))
          && !HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (TREE_OPERAND (t, 2)))))
        {
          tem = invert_truthvalue (arg0);
-         if (TREE_CODE_CLASS (TREE_CODE (tem)) == '<')
+         if (COMPARISON_CLASS_P (tem))
            {
              tem = fold_cond_expr_with_comparison (type, tem,
                                                    TREE_OPERAND (t, 2),
@@ -9055,14 +9054,15 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
     return;
   *slot = expr;
   code = TREE_CODE (expr);
-  if (TREE_CODE_CLASS (code) == 'd' && DECL_ASSEMBLER_NAME_SET_P (expr))
+  if (TREE_CODE_CLASS (code) == tcc_declaration
+      && DECL_ASSEMBLER_NAME_SET_P (expr))
     {
       /* Allow DECL_ASSEMBLER_NAME to be modified.  */
       memcpy (buf, expr, tree_size (expr));
       expr = (tree) buf;
       SET_DECL_ASSEMBLER_NAME (expr, NULL);
     }
-  else if (TREE_CODE_CLASS (code) == 't'
+  else if (TREE_CODE_CLASS (code) == tcc_type
           && (TYPE_POINTER_TO (expr) || TYPE_REFERENCE_TO (expr)
               || TYPE_CACHED_VALUES_P (expr)))
     {
@@ -9076,11 +9076,12 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
     }
   md5_process_bytes (expr, tree_size (expr), ctx);
   fold_checksum_tree (TREE_TYPE (expr), ctx, ht);
-  if (TREE_CODE_CLASS (code) != 't' && TREE_CODE_CLASS (code) != 'd')
+  if (TREE_CODE_CLASS (code) != tcc_type
+      && TREE_CODE_CLASS (code) != tcc_declaration)
     fold_checksum_tree (TREE_CHAIN (expr), ctx, ht);
   switch (TREE_CODE_CLASS (code))
     {
-    case 'c':
+    case tcc_constant:
       switch (code)
        {
        case STRING_CST:
@@ -9098,7 +9099,7 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
          break;
        }
       break;
-    case 'x':
+    case tcc_exceptional:
       switch (code)
        {
        case TREE_LIST:
@@ -9113,17 +9114,17 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
          break;
        }
       break;
-    case 'e':
-    case 'r':
-    case '<':
-    case '1':
-    case '2':
-    case 's':
+    case tcc_expression:
+    case tcc_reference:
+    case tcc_comparison:
+    case tcc_unary:
+    case tcc_binary:
+    case tcc_statement:
       len = first_rtl_op (code);
       for (i = 0; i < len; ++i)
        fold_checksum_tree (TREE_OPERAND (expr, i), ctx, ht);
       break;
-    case 'd':
+    case tcc_declaration:
       fold_checksum_tree (DECL_SIZE (expr), ctx, ht);
       fold_checksum_tree (DECL_SIZE_UNIT (expr), ctx, ht);
       fold_checksum_tree (DECL_NAME (expr), ctx, ht);
@@ -9136,7 +9137,7 @@ fold_checksum_tree (tree expr, struct md5_ctx *ctx, htab_t ht)
       fold_checksum_tree (DECL_ATTRIBUTES (expr), ctx, ht);
       fold_checksum_tree (DECL_VINDEX (expr), ctx, ht);
       break;
-    case 't':
+    case tcc_type:
       if (TREE_CODE (expr) == ENUMERAL_TYPE)
         fold_checksum_tree (TYPE_VALUES (expr), ctx, ht);
       fold_checksum_tree (TYPE_SIZE (expr), ctx, ht);
@@ -9630,7 +9631,7 @@ tree_expr_nonzero_p (tree t)
          return !DECL_WEAK (base);
 
        /* Constants are never weak.  */
-       if (TREE_CODE_CLASS (TREE_CODE (base)) == 'c')
+       if (CONSTANT_CLASS_P (base))
          return true;
 
        return false;
@@ -10554,12 +10555,12 @@ fold_ignored_result (tree t)
   for (;;)
     switch (TREE_CODE_CLASS (TREE_CODE (t)))
       {
-      case '1':
+      case tcc_unary:
        t = TREE_OPERAND (t, 0);
        break;
 
-      case '2':
-      case '<':
+      case tcc_binary:
+      case tcc_comparison:
        if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)))
          t = TREE_OPERAND (t, 0);
        else if (!TREE_SIDE_EFFECTS (TREE_OPERAND (t, 0)))
@@ -10568,7 +10569,7 @@ fold_ignored_result (tree t)
          return t;
        break;
 
-      case 'e':
+      case tcc_expression:
        switch (TREE_CODE (t))
          {
          case COMPOUND_EXPR:
index 4d4b445..9053f36 100644 (file)
@@ -1,3 +1,9 @@
+2004-09-17  Jeffrey D. Oldham  <oldham@codesourcery.com>
+           Zack Weinberg  <zack@codesourcery.com>
+
+       * f95-lang.c, trans-expr.c, trans.c: Update for new tree-class
+       enumeration constants.
+
 2004-09-17  Paul Brook  <paul@codesourcery.com>
 
        * gfortran.h (struct gfc_linebuf): Don't use C99 empty arrays.
 
 2004-08-26  Richard Henderson  <rth@redhat.com>
 
-        * arith.c: Include system.h, not real system headers.
-        (MPZ_NULL, MPF_NULL, DEF_GFC_INTEGER_KIND, DEF_GFC_LOGICAL_KIND,
-        DEF_GFC_REAL_KIND, GFC_SP_KIND, GFC_SP_PREC, GFC_SP_EMIN, GFC_SP_EMAX,
-        GFC_DP_KIND, GFC_DP_PREC, GFC_DP_EMIN, GFC_DP_EMAX, GFC_QP_KIND,
-        GFC_QP_PREC, GFC_QP_EMIN, GFC_QP_EMAX): Remove.
-        (gfc_integer_kinds, gfc_logical_kinds, gfc_real_kinds,
-        gfc_index_integer_kind, gfc_default_integer_kind,
-        gfc_default_real_kind,gfc_default_double_kind,
-        gfc_default_character_kind, gfc_default_logical_kind,
-        gfc_default_complex_kind, validate_integer, validate_real,
-        validate_logical, validate_character,
-        gfc_validate_kind): Move to trans-types.c.
-        (gfc_set_model_kind): Use gfc_validate_kind.
-        (gfc_set_model): Just copy the current precision to default.
-        (gfc_arith_init_1): Use mpfr precision 128 for integer setup.
-        * f95-lang.c (gfc_init_decl_processing): Invoke gfc_init_kinds.
-        * gfortran.h: Update file commentary.
-        * trans-types.c (MAX_INT_KINDS, MAX_REAL_KINDS): New.
-        (gfc_default_integer_kind_1, gfc_default_real_kind_1,
-        gfc_default_double_kind_1, gfc_default_character_kind_1,
-        gfc_default_logical_kind_1, gfc_default_complex_kind_1): New.
-        (gfc_init_kinds): New.
-        (gfc_init_types): Don't set gfc_index_integer_kind here.
-        * trans-types.h (gfc_init_kinds): Declare.
+       * arith.c: Include system.h, not real system headers.
+       (MPZ_NULL, MPF_NULL, DEF_GFC_INTEGER_KIND, DEF_GFC_LOGICAL_KIND,
+       DEF_GFC_REAL_KIND, GFC_SP_KIND, GFC_SP_PREC, GFC_SP_EMIN, GFC_SP_EMAX,
+       GFC_DP_KIND, GFC_DP_PREC, GFC_DP_EMIN, GFC_DP_EMAX, GFC_QP_KIND,
+       GFC_QP_PREC, GFC_QP_EMIN, GFC_QP_EMAX): Remove.
+       (gfc_integer_kinds, gfc_logical_kinds, gfc_real_kinds,
+       gfc_index_integer_kind, gfc_default_integer_kind,
+       gfc_default_real_kind,gfc_default_double_kind,
+       gfc_default_character_kind, gfc_default_logical_kind,
+       gfc_default_complex_kind, validate_integer, validate_real,
+       validate_logical, validate_character,
+       gfc_validate_kind): Move to trans-types.c.
+       (gfc_set_model_kind): Use gfc_validate_kind.
+       (gfc_set_model): Just copy the current precision to default.
+       (gfc_arith_init_1): Use mpfr precision 128 for integer setup.
+       * f95-lang.c (gfc_init_decl_processing): Invoke gfc_init_kinds.
+       * gfortran.h: Update file commentary.
+       * trans-types.c (MAX_INT_KINDS, MAX_REAL_KINDS): New.
+       (gfc_default_integer_kind_1, gfc_default_real_kind_1,
+       gfc_default_double_kind_1, gfc_default_character_kind_1,
+       gfc_default_logical_kind_1, gfc_default_complex_kind_1): New.
+       (gfc_init_kinds): New.
+       (gfc_init_types): Don't set gfc_index_integer_kind here.
+       * trans-types.h (gfc_init_kinds): Declare.
        * doc/invoke.texi: Clarify DOUBLE PRECISION behaviour wrt -r8.
 
 2004-08-26  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
        build.
        * trans-array.c (gfc_conv_descriptor_data,
        gfc_conv_descriptor_offset, gfc_conv_descriptor_dimension,
-       gfc_conv_descriptor_stride, gfc_conv_descriptor_lbound, 
+       gfc_conv_descriptor_stride, gfc_conv_descriptor_lbound,
        gfc_conv_descriptor_ubound, gfc_trans_allocate_array_storage,
        gfc_trans_allocate_temp_array,
        gfc_trans_array_constructor_subarray,
 
 2004-08-25  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
-       * trans-const.c (gfc_conv_mpz_to_tree): Change call to 
+       * trans-const.c (gfc_conv_mpz_to_tree): Change call to
        build_int_cst to build_int_cst_wide in accordance to Nathan's
        previous patch.
 
 
 2004-08-24  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
-       * trans-decl.c, trans-types.c: Add and remove blank lines as 
+       * trans-decl.c, trans-types.c: Add and remove blank lines as
        required.
 
 2004-08-24  Richard Henderson  <rth@redhat.com>
 
 2004-08-24  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
-       * resolve.c (merge_argument_lists): Revert unintentionally 
+       * resolve.c (merge_argument_lists): Revert unintentionally
        committed change.
-       
+
 2004-08-24  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
        * trans-decl.c (build_function_decl): Fix spelling in comment.
 2004-08-22  Richard Henderson  <rth@redhat.com>
 
        PR 13465
-        * data.c (find_con_by_offset): Search ordered list; handle
-        elements with repeat counts.
-        (gfc_assign_data_value_range): New.
-        * gfortran.h (struct gfc_data_value): Make repeat unsigned.
-        (gfc_assign_data_value_range): Declare.
-        * match.c (top_val_list): Extract repeat count into a temporary.
-        * resolve.c (values): Make left unsigned.
-        (next_data_value): Don't decrement left.
-        (check_data_variable): Use gfc_assign_data_value_range.
+       * data.c (find_con_by_offset): Search ordered list; handle
+       elements with repeat counts.
+       (gfc_assign_data_value_range): New.
+       * gfortran.h (struct gfc_data_value): Make repeat unsigned.
+       (gfc_assign_data_value_range): Declare.
+       * match.c (top_val_list): Extract repeat count into a temporary.
+       * resolve.c (values): Make left unsigned.
+       (next_data_value): Don't decrement left.
+       (check_data_variable): Use gfc_assign_data_value_range.
 
 2004-08-22  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
        unused variables if they're use associated.
 
 2004-06-14  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
-        Andrew Vaught <andyv@firstinter.net>
+       Andrew Vaught <andyv@firstinter.net>
 
        PR fortran/14928
        * gfortran.h (gfc_check_f): Add new field f3ml.
 2004-05-17  Steve Kargl  <kargls@comcast.net>
 
        * arith.c (gfc_real2complex): Range checking wrong part of complex
-        number.
+       number.
 
 2004-05-16  Paul Brook  <paul@codesourcery.com>
 
 
 2004-05-14  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
-        PR fortran/14066
+       PR fortran/14066
        * match.c (gfc_match_do): Allow infinite loops with
        label-do-stmt. Do not enforce space after comma.
 
 2004-05-14  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
-        PR fortran/15051
+       PR fortran/15051
        * parse.c (parse_interface): Allow empty INTERFACE, remove
-        seen_body.
+       seen_body.
 
 2004-05-14  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
 
        PR fortran/14568
        * trans-decl.c (generate_local_decl): Don't warn for unused
-        variables which are in common blocks.
+       variables which are in common blocks.
 
 2004-05-13  Diego Novillo  <dnovillo@redhat.com>
 
 
 2004-03-24  Bud Davis  <bdavis9659@comcast.net>
 
-        PR 14055
+       PR 14055
        * arith.c (gfc_convert_integer,gfc_convert_real):  Removed leading '+'
-        before conversion by gmp library call.
+       before conversion by gmp library call.
 
 2004-03-24  Bud Davis  <bdavis9659@comcast.net>
 
        * lang-options.h: Remove.
 
 2003-07-23  Arnaud Desitter  <arnaud.desitter@geography.oxford.ac.uk>
-        * iresolve.c (g95_resolve_transpose): Proper variable in switch.
-        * simplify.c (g95_simplify_nearest): Fix typo and use a correct test
+       * iresolve.c (g95_resolve_transpose): Proper variable in switch.
+       * simplify.c (g95_simplify_nearest): Fix typo and use a correct test
        on kind.
 
 2003-07-22  Steven Bosscher  <steven@gcc.gnu.org>
 
 2003-04-10  Canqun Yang  <canqun@yahoo.com.cn>
 
-        * trans-stmt.c (g95_trans_forall): Implement WHERE inside FORALL.
-        (g95_trans_forall_body): New function.
+       * trans-stmt.c (g95_trans_forall): Implement WHERE inside FORALL.
+       (g95_trans_forall_body): New function.
 
 2003-04-10  Canqun Yang  <canqun@yahoo.com.cn>
 
-        * resolve.c (resove_where): New function.
-        (resolve_where_shape): New function.
-        (resolve_code): Add call to 'resolve_where'
-        * trans-stmt.c (g95_trans_where): Modified.
-        (g95_trans_where_2): New function.
-        (g95_trans_where_assign): New function.
-        (g95_evaluate_where_mask): New function.
-        (g95_add_to_stmt_list): New function.
-        (g95_get_temp_expr): New function.
-        * trans.h (where_stmt_list): New structure.
+       * resolve.c (resove_where): New function.
+       (resolve_where_shape): New function.
+       (resolve_code): Add call to 'resolve_where'
+       * trans-stmt.c (g95_trans_where): Modified.
+       (g95_trans_where_2): New function.
+       (g95_trans_where_assign): New function.
+       (g95_evaluate_where_mask): New function.
+       (g95_add_to_stmt_list): New function.
+       (g95_get_temp_expr): New function.
+       * trans.h (where_stmt_list): New structure.
 
 2003-04-10  Paul Brook  <paul@nowt.org>
 
 
        * arith.c (validate_logical), g95.h, options.c (g95_init_options):
        Remove option l1.
-        * g95.h, intrinsic.c(g95_get_intrinsic_sub_symbol): Add const.
+       * g95.h, intrinsic.c(g95_get_intrinsic_sub_symbol): Add const.
        * iresolve.c(g95_resolve_cpu_time, g95_resolve_random_number): Add
        const.
        * lang-options.h: Remove -finline-repack-arrays. Add -fg77-calls.
 2003-02-05  Toon Moene  <toon@moene.indiv.nluug.nl>
 
        * lang-options.h: Fix warning involving C90 concatenated
-        strings.
+       strings.
 
 2003-02-06  Steven Bosscher  <s.bosscher@student.tudelft.nl>
            Arnaud Desitter  <arnaud.desitter@geography.oxford.ac.uk>
 
 2003-01-28  Steven Bosscher  <s.bosscher@student.tudelft.n>
 
-        * Make-lang.in: Don't build with broken tree-ssa-pre.
+       * Make-lang.in: Don't build with broken tree-ssa-pre.
 
 2003-01-28  Steven Bosscher  <s.bosscher@student.tudelft.nl>
 
 
 2003-01-10  Steven Bosscher  <s.bosscher@student.tudelft.nl>
 
-        * dump-parse-tree.c (g95_show_namespace): Fixed another
+       * dump-parse-tree.c (g95_show_namespace): Fixed another
        typo.  Sorry, it's Friday...
 
 2003-01-10  Steven Bosscher  <s.bosscher@student.tudelft.nl>
 2002-09-01  Toon Moene  <toon@moene.indiv.nluug.nl>
 
        * g95_conv_mpz_to_tree: Free storage pointed to by q,
-        not by buff.
+       not by buff.
 
 2002-08-30  Paul Brook  <paul@nowt.org>
 
index d5e436d..8edf569 100644 (file)
@@ -153,7 +153,7 @@ const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
 
 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
 
-const char tree_code_type[] = {
+const enum tree_code_class tree_code_type[] = {
 #include "tree.def"
 };
 #undef DEFTREECODE
@@ -221,7 +221,7 @@ gfc_truthvalue_conversion (tree expr)
     case BOOLEAN_TYPE:
       if (TREE_TYPE (expr) == boolean_type_node)
        return expr;
-      else if (TREE_CODE_CLASS (TREE_CODE (expr)) == '<')
+      else if (COMPARISON_CLASS_P (expr))
        {
          TREE_TYPE (expr) = boolean_type_node;
          return expr;
index 9e4df47..29550b7 100644 (file)
@@ -107,7 +107,7 @@ gfc_make_safe_expr (gfc_se * se)
 {
   tree var;
 
-  if (TREE_CODE_CLASS (TREE_CODE (se->expr)) == 'c')
+  if (CONSTANT_CLASS_P (se->expr))
     return;
 
   /* We need a temporary for this result.  */
index 306c475..8005b32 100644 (file)
@@ -127,7 +127,7 @@ gfc_evaluate_now (tree expr, stmtblock_t * pblock)
 {
   tree var;
 
-  if (TREE_CODE_CLASS (TREE_CODE (expr)) == 'c')
+  if (CONSTANT_CLASS_P (expr))
     return expr;
 
   var = gfc_create_var (TREE_TYPE (expr), NULL);
index 5235118..f648985 100644 (file)
@@ -562,9 +562,7 @@ should_carry_locus_p (tree stmt)
 static void
 annotate_one_with_locus (tree t, location_t locus)
 {
-  if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (t)))
-      && ! EXPR_HAS_LOCATION (t)
-      && should_carry_locus_p (t))
+  if (EXPR_P (t) && ! EXPR_HAS_LOCATION (t) && should_carry_locus_p (t))
     SET_EXPR_LOCATION (t, locus);
 }
 
@@ -599,9 +597,9 @@ mostly_copy_tree_r (tree *tp, int *walk_subtrees, void *data)
 {
   enum tree_code code = TREE_CODE (*tp);
   /* Don't unshare types, decls, constants and SAVE_EXPR nodes.  */
-  if (TREE_CODE_CLASS (code) == 't'
-      || TREE_CODE_CLASS (code) == 'd'
-      || TREE_CODE_CLASS (code) == 'c'
+  if (TREE_CODE_CLASS (code) == tcc_type
+      || TREE_CODE_CLASS (code) == tcc_declaration
+      || TREE_CODE_CLASS (code) == tcc_constant
       || code == SAVE_EXPR || code == TARGET_EXPR
       /* We can't do anything sensible with a BLOCK used as an expression,
         but we also can't abort when we see it because of non-expression
@@ -637,9 +635,9 @@ copy_if_shared_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
      types and the bounds of types.  Mark them as visited so we properly
      unmark their subtrees on the unmark pass.  If we've already seen them,
      don't look down further.  */
-  if (TREE_CODE_CLASS (code) == 't'
-      || TREE_CODE_CLASS (code) == 'd'
-      || TREE_CODE_CLASS (code) == 'c')
+  if (TREE_CODE_CLASS (code) == tcc_type
+      || TREE_CODE_CLASS (code) == tcc_declaration
+      || TREE_CODE_CLASS (code) == tcc_constant)
     {
       if (TREE_VISITED (t))
        *walk_subtrees = 0;
@@ -2319,7 +2317,7 @@ gimplify_init_ctor_preeval_1 (tree *tp, int *walk_subtrees, void *xdata)
       && alias_sets_conflict_p (data->lhs_alias_set, get_alias_set (t)))
     return t;
 
-  if (DECL_P (t) || TYPE_P (t))
+  if (IS_TYPE_OR_DECL_P (t))
     *walk_subtrees = 0;
   return NULL;
 }
@@ -3872,7 +3870,7 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
        default:
          switch (TREE_CODE_CLASS (TREE_CODE (*expr_p)))
            {
-           case '<':
+           case tcc_comparison:
              /* If this is a comparison of objects of aggregate type,
                 handle it specially (by converting to a call to
                 memcmp).  It would be nice to only have to do this
@@ -3886,12 +3884,12 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
              
            /* If *EXPR_P does not need to be special-cased, handle it
               according to its class.  */
-           case '1':
+           case tcc_unary:
              ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p,
                                   post_p, is_gimple_val, fb_rvalue);
              break;
 
-           case '2':
+           case tcc_binary:
            expr_2:
              {
                enum gimplify_status r0, r1;
@@ -3905,8 +3903,8 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
                break;
              }
              
-           case 'd':
-           case 'c':
+           case tcc_declaration:
+           case tcc_constant:
              ret = GS_ALL_DONE;
              goto dont_recalculate;
              
index ecb2cad..f0311cc 100644 (file)
@@ -1,3 +1,11 @@
+2004-09-17  Jeffrey D. Oldham  <oldham@codesourcery.com>
+           Zack Weinberg  <zack@codesourcery.com>
+
+       * java-tree.def: Use tree_code_class enumeration constants
+       instead of code letters.
+       * java-gimplify.c, jcf-write.c, lang.c, parse.y: Update for
+       new tree-class enumeration constants.
+
 2004-09-13  Tom Tromey  <tromey@redhat.com>
 
        PR java/17216:
        * class.c (build_utf8_ref, build_static_field_ref,
        make_field_value, make_method_value, get_dispatch_table,
        make_class_data, emit_symbol_table, emit_catch_table): Likewise.
-       * constants.c (get_tag_node,  build_ref_from_constant_pool, 
+       * constants.c (get_tag_node,  build_ref_from_constant_pool,
        build_constants_constructor): Likewise.
        * decl.c (java_init_decl_processing): Likewise.
        * expr.c (build_java_array_length_access, build_newarray,
        set_nested_class_simple_name_value.
 
 2004-06-22  Andrew Haley  <aph@redhat.com>
-            Ranjit Mathew  <rmathew@hotmail.com>
+           Ranjit Mathew  <rmathew@hotmail.com>
 
        Fixes PR java/16113.
        * decl.c (force_poplevels): Remove call to expand_end_bindings.
        of unordered conditionals. Add comment.
 
 2004-05-29  Ranjit Mathew  <rmathew@hotmail.com>
-            Per Bothner  <per@bothner.com>
+           Per Bothner  <per@bothner.com>
 
        * java-tree.h (DECL_LOCAL_FINAL_IUD): New macro to test if a
        local variable was initialised upon declaration.
index 6632e93..54d5c75 100644 (file)
@@ -141,7 +141,8 @@ java_gimplify_expr (tree *expr_p, tree *pre_p ATTRIBUTE_UNUSED,
         Parameter lists, maybe?  Or perhaps that's unnecessary because
         the front end already generates SAVE_EXPRs.  */
 
-      if (TREE_CODE_CLASS (code) == '2' || TREE_CODE_CLASS (code) == '<')
+      if (TREE_CODE_CLASS (code) == tcc_binary
+         || TREE_CODE_CLASS (code) == tcc_comparison)
        {
          enum gimplify_status stat 
            = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
index 25ee538..2f2b9f4 100644 (file)
@@ -1,33 +1,34 @@
 /* Shift right, logical. */
 
-DEFTREECODE (URSHIFT_EXPR, "urshift_expr", '2', 2)
+DEFTREECODE (URSHIFT_EXPR, "urshift_expr", tcc_binary, 2)
 
 /* Return -1, 0, 1 depending on whether the first argument is
    less, equal, or greater to the second argument. */
-DEFTREECODE (COMPARE_EXPR, "compare_expr", '2', 2)
+DEFTREECODE (COMPARE_EXPR, "compare_expr", tcc_binary, 2)
 
 /* Same as COMPARE_EXPR, but if either value is NaN, the result is -1. */
-DEFTREECODE (COMPARE_L_EXPR, "compare_l_expr", '2', 2)
+DEFTREECODE (COMPARE_L_EXPR, "compare_l_expr", tcc_binary, 2)
 /* Same as COMPARE_EXPR, but if either value is NaN, the result is 1. */
-DEFTREECODE (COMPARE_G_EXPR, "compare_g_expr", '2', 2)
+DEFTREECODE (COMPARE_G_EXPR, "compare_g_expr", tcc_binary, 2)
 
 /* Unary plus. Operand 0 is the expression the unary plus is applied
    to */
-DEFTREECODE (UNARY_PLUS_EXPR, "unary_plus_expr", '1', 1)
+DEFTREECODE (UNARY_PLUS_EXPR, "unary_plus_expr", tcc_unary, 1)
 
 /* New array creation expression.
    Operand 0 is the array base type.
    Operand 1 is the list of dimension expressions. 
    Operand 2 is the number of other dimensions of unspecified range.
    Once patched, the node will bear the type of the created array.  */
-DEFTREECODE (NEW_ARRAY_EXPR, "new_array_expr", 'e', 3)
+DEFTREECODE (NEW_ARRAY_EXPR, "new_array_expr", tcc_expression, 3)
 
 /* New anonymous array creation expression.
    Operand 0 is the base type of the anonymous array.
    Operand 1 is the signature of the dimensions this array contains.
    Operand 2 is the anonymous array initializer.
    Once patched, the node will bear the type of the created array.  */
-DEFTREECODE (NEW_ANONYMOUS_ARRAY_EXPR, "new_anonymous_array", 'e', 3)
+DEFTREECODE (NEW_ANONYMOUS_ARRAY_EXPR, "new_anonymous_array",
+            tcc_expression, 3)
 
 /* New class creation expression.
    Operand 0 is the name of the class to be created
@@ -35,68 +36,69 @@ DEFTREECODE (NEW_ANONYMOUS_ARRAY_EXPR, "new_anonymous_array", 'e', 3)
    There is no operand 2.  That slot is used for the
    CALL_EXPR_RTL macro (see preexpand_calls).
    The type should be the one of the created class.  */
-DEFTREECODE (NEW_CLASS_EXPR, "new_class_expr", 'e', 3)
+DEFTREECODE (NEW_CLASS_EXPR, "new_class_expr", tcc_expression, 3)
 
 /* Defines `this' as an expression.  */
-DEFTREECODE (THIS_EXPR, "this", '1', 0)
+DEFTREECODE (THIS_EXPR, "this", tcc_unary, 0)
 
 /* Case statement expression.
    Operand 1 is the case value.  */
-DEFTREECODE (CASE_EXPR, "case", 'e', 1)
+DEFTREECODE (CASE_EXPR, "case", tcc_expression, 1)
 
 /* Default statement expression. */
-DEFTREECODE (DEFAULT_EXPR, "default", 'e', 0)
+DEFTREECODE (DEFAULT_EXPR, "default", tcc_expression, 0)
 
 /* Try expression
    Operand 0 is the tried block,
    Operand 1 contains chained catch nodes. */
-DEFTREECODE (TRY_EXPR, "try-catch", 'e', 2)
+DEFTREECODE (TRY_EXPR, "try-catch", tcc_expression, 2)
 
 /* Catch clause.
    Operand 0 is the catch clause block, which contains the declaration of
    the catch clause parameter.  */
-DEFTREECODE (JAVA_CATCH_EXPR, "catch", '1', 1)
+DEFTREECODE (JAVA_CATCH_EXPR, "catch", tcc_unary, 1)
 
 /* Synchronized statement.
    Operand 0 is the expression on which we wish to synchronize,
    Operand 1 is the synchronized expression block.  */
-DEFTREECODE (SYNCHRONIZED_EXPR, "synchronized", 'e', 2)
+DEFTREECODE (SYNCHRONIZED_EXPR, "synchronized", tcc_expression, 2)
 
 /* Throw statement.
    Operand 0 is the throw expression.  */
-DEFTREECODE (THROW_EXPR, "throw", '1', 1)
+DEFTREECODE (THROW_EXPR, "throw", tcc_unary, 1)
 
 /* Conditional operator.
    Operand 0 is the condition expression
    Operand 1 is the then-value
    Operand 2 is the else-value.  */
-DEFTREECODE (CONDITIONAL_EXPR, "?:", 'e', 3)
+DEFTREECODE (CONDITIONAL_EXPR, "?:", tcc_expression, 3)
 
 /* instanceof operator.
    Operand 0 is the expression that is getting tested
    Operand 1 is the class used for the test.  */
-DEFTREECODE (INSTANCEOF_EXPR, "instanceof", 'e', 2)
+DEFTREECODE (INSTANCEOF_EXPR, "instanceof", tcc_expression, 2)
 
 /* Array initializers.
    Operand 0 is the (sub) array target to initialize, left to NULL_TREE
    when the node is created.
    Operand 1 is a CONSTRUCTOR node.  */
-DEFTREECODE (NEW_ARRAY_INIT, "new_array_init", '1', 1)
+DEFTREECODE (NEW_ARRAY_INIT, "new_array_init", tcc_unary, 1)
 
 /* Class literal.
    Operand 0 is the name of the class we're trying to build a
    reference from.  */
-DEFTREECODE (CLASS_LITERAL, "class_literal", '1', 1)
+DEFTREECODE (CLASS_LITERAL, "class_literal", tcc_unary, 1)
 
 /* The Java object within the exception object from the runtime.  */
-DEFTREECODE (JAVA_EXC_OBJ_EXPR, "java_exc_obj_expr", 'e', 0)
+DEFTREECODE (JAVA_EXC_OBJ_EXPR, "java_exc_obj_expr", tcc_expression, 0)
 
 /* Annotates a tree node (usually an expression) with source location
    information: a file name (EXPR_WFL_FILENAME);  a line number
    (EXPR_WFL_LINENO); and column number (EXPR_WFL_COLNO).  It is
    expanded as the contained node (EXPR_WFL_NODE);  a line note should
    be emitted first if EXPR_WFL_EMIT_LINE_NOTE.  */
-DEFTREECODE (EXPR_WITH_FILE_LOCATION, "expr_with_file_location", 'e', 3)
+DEFTREECODE (EXPR_WITH_FILE_LOCATION, "expr_with_file_location",
+            tcc_expression, 3)
 
 /*
 Local variables:
index 7b5bdcc..5137eec 100644 (file)
@@ -2036,8 +2036,7 @@ generate_bytecode_insns (tree exp, int target, struct jcf_partial *state)
        /* If the rhs is a binary expression and the left operand is
           `==' to the lhs then we have an OP= expression.  In this
           case we must do some special processing.  */
-       if (TREE_CODE_CLASS (TREE_CODE (rhs)) == '2'
-           && lhs == TREE_OPERAND (rhs, 0))
+       if (BINARY_CLASS_P (rhs) && lhs == TREE_OPERAND (rhs, 0))
          {
            if (TREE_CODE (lhs) == COMPONENT_REF)
              {
index b9429a1..d1c6977 100644 (file)
@@ -78,9 +78,9 @@ static void java_clear_binding_stack (void);
 
 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
 
-const char tree_code_type[] = {
+const enum tree_code_class tree_code_type[] = {
 #include "tree.def"
-  'x',
+  tcc_exceptional,
 #include "java-tree.def"
 };
 #undef DEFTREECODE
@@ -430,8 +430,7 @@ put_decl_node (tree node)
       node = TREE_TYPE (node);
       was_pointer = 1;
     }
-  if (TREE_CODE_CLASS (TREE_CODE (node)) == 'd'
-      && DECL_NAME (node) != NULL_TREE)
+  if (DECL_P (node) && DECL_NAME (node) != NULL_TREE)
     {
       if (TREE_CODE (node) == FUNCTION_DECL)
        {
@@ -464,8 +463,7 @@ put_decl_node (tree node)
       else
        put_decl_node (DECL_NAME (node));
     }
-  else if (TREE_CODE_CLASS (TREE_CODE (node)) == 't'
-      && TYPE_NAME (node) != NULL_TREE)
+  else if (TYPE_P (node) && TYPE_NAME (node) != NULL_TREE)
     {
       if (TREE_CODE (node) == RECORD_TYPE && TYPE_ARRAY_P (node))
        {
index 4996271..377c195 100644 (file)
@@ -1687,7 +1687,7 @@ do_statement:
 for_statement:
        for_begin SC_TK expression SC_TK for_update CP_TK statement
                {
-                 if (TREE_CODE_CLASS (TREE_CODE ($3)) == 'c')
+                 if (CONSTANT_CLASS_P ($3))
                    $3 = build_wfl_node ($3);
                  $$ = finish_for_loop (EXPR_WFL_LINECOL ($3), $3, $5, $7);
                }
@@ -3126,7 +3126,7 @@ find_expr_with_wfl (tree node)
 {
   while (node)
     {
-      char code;
+      enum tree_code_class code;
       tree to_return;
 
       switch (TREE_CODE (node))
@@ -3152,7 +3152,8 @@ find_expr_with_wfl (tree node)
 
        default:
          code = TREE_CODE_CLASS (TREE_CODE (node));
-         if (((code == '1') || (code == '2') || (code == 'e'))
+         if (((code == tcc_unary) || (code == tcc_binary)
+              || (code == tcc_expression))
              && EXPR_WFL_LINECOL (node))
            return node;
          return NULL_TREE;
@@ -14895,8 +14896,7 @@ finish_for_loop (int location, tree condition, tree update, tree body)
        {
          /* Try to detect constraint violations.  These would be
             programming errors somewhere.  */
-         if (! IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (up2)))
-             || TREE_CODE (up2) == LOOP_EXPR)
+         if (! EXPR_P (up2) || TREE_CODE (up2) == LOOP_EXPR)
            abort ();
          SUPPRESS_UNREACHABLE_ERROR (up2) = 1;
        }
index f780da5..c520a6b 100644 (file)
@@ -1420,7 +1420,7 @@ find_induction_var_from_exit_cond (struct loop *loop)
   if (TREE_CODE (expr) != COND_EXPR)
     return NULL_TREE;
   test = TREE_OPERAND (expr, 0);
-  if (TREE_CODE_CLASS (TREE_CODE (test)) != '<')
+  if (!COMPARISON_CLASS_P (test))
     return NULL_TREE;
   /* This is a guess.  We say that for a <,!=,<= b, a is the induction
      variable.
index b52d36b..199c93e 100644 (file)
@@ -422,7 +422,7 @@ lhd_tree_dump_type_quals (tree t)
 tree
 lhd_expr_size (tree exp)
 {
-  if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'd'
+  if (DECL_P (exp)
       && DECL_SIZE_UNIT (exp) != 0)
     return DECL_SIZE_UNIT (exp);
   else
@@ -439,8 +439,8 @@ lhd_gimplify_expr (tree *expr_p ATTRIBUTE_UNUSED, tree *pre_p ATTRIBUTE_UNUSED,
 }
 
 /* lang_hooks.tree_size: Determine the size of a tree with code C,
-   which is a language-specific tree code in category 'x'.  The
-   default expects never to be called.  */
+   which is a language-specific tree code in category tcc_constant or
+   tcc_exceptional.  The default expects never to be called.  */
 size_t
 lhd_tree_size (enum tree_code c ATTRIBUTE_UNUSED)
 {
index 1b2dae1..43749a2 100644 (file)
@@ -205,9 +205,10 @@ struct lang_hooks
      identifier nodes long enough for the language-specific slots.  */
   size_t identifier_size;
 
-  /* Determines the size of any language-specific 'x' or 'c' nodes.
-     Since it is called from make_node, the only information available
-     is the tree code.  Expected to abort on unrecognized codes.  */
+  /* Determines the size of any language-specific tcc_constant or
+     tcc_exceptional nodes.  Since it is called from make_node, the
+     only information available is the tree code.  Expected to abort
+     on unrecognized codes.  */
   size_t (*tree_size) (enum tree_code);
 
   /* The first callback made to the front end, for simple
@@ -338,12 +339,12 @@ struct lang_hooks
      this hook.  It should output to stderr.  */
   void (*print_statistics) (void);
 
-  /* Called by print_tree when there is a tree of class 'x' that it
-     doesn't know how to display.  */
+  /* Called by print_tree when there is a tree of class tcc_exceptional
+     that it doesn't know how to display.  */
   lang_print_tree_hook print_xnode;
 
-  /* Called to print language-dependent parts of a class 'd', class
-     't', and IDENTIFIER_NODE nodes.  */
+  /* Called to print language-dependent parts of tcc_decl, tcc_type,
+     and IDENTIFIER_NODE nodes.  */
   lang_print_tree_hook print_decl;
   lang_print_tree_hook print_type;
   lang_print_tree_hook print_identifier;
index 0b65772..2d8319d 100644 (file)
@@ -54,11 +54,11 @@ const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
 
 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
 
-const char tree_code_type[] = {
+const enum tree_code_class tree_code_type[] = {
 #include "tree.def"
-  'x',
+  tcc_exceptional,
 #include "c-common.def"
-  'x',
+  tcc_exceptional,
 #include "objc-tree.def"
 };
 #undef DEFTREECODE
index ea88d1e..8702e96 100644 (file)
@@ -1,7 +1,7 @@
 /* This file contains the definitions and documentation for the
    additional tree codes used in the Objective C front end (see tree.def
    for the standard codes).
-   Copyright (C) 1990, 1997, 1998, 1999, 2000, 2001, 2003 
+   Copyright (C) 1990, 1997, 1998, 1999, 2000, 2001, 2003, 2004 
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -23,20 +23,22 @@ Boston, MA 02111-1307, USA.  */
 
 
 /* Objective-C types.  */
-DEFTREECODE (CLASS_INTERFACE_TYPE, "class_interface_type", 't', 0)
-DEFTREECODE (CLASS_IMPLEMENTATION_TYPE, "class_implementation_type", 't', 0)
-DEFTREECODE (CATEGORY_INTERFACE_TYPE, "category_interface_type", 't', 0)
-DEFTREECODE (CATEGORY_IMPLEMENTATION_TYPE,"category_implementation_type", 't', 0)
-DEFTREECODE (PROTOCOL_INTERFACE_TYPE, "protocol_interface_type", 't', 0)
+DEFTREECODE (CLASS_INTERFACE_TYPE, "class_interface_type", tcc_type, 0)
+DEFTREECODE (CLASS_IMPLEMENTATION_TYPE, "class_implementation_type",
+            tcc_type, 0)
+DEFTREECODE (CATEGORY_INTERFACE_TYPE, "category_interface_type", tcc_type, 0)
+DEFTREECODE (CATEGORY_IMPLEMENTATION_TYPE,"category_implementation_type",
+            tcc_type, 0)
+DEFTREECODE (PROTOCOL_INTERFACE_TYPE, "protocol_interface_type", tcc_type, 0)
 
 /* Objective-C decls.  */
-DEFTREECODE (KEYWORD_DECL, "keyword_decl", 'd', 0)
-DEFTREECODE (INSTANCE_METHOD_DECL, "instance_method_decl", 'd', 0)
-DEFTREECODE (CLASS_METHOD_DECL, "class_method_decl", 'd', 0)
+DEFTREECODE (KEYWORD_DECL, "keyword_decl", tcc_declaration, 0)
+DEFTREECODE (INSTANCE_METHOD_DECL, "instance_method_decl", tcc_declaration, 0)
+DEFTREECODE (CLASS_METHOD_DECL, "class_method_decl", tcc_declaration, 0)
 
 /* Objective-C expressions.  */
-DEFTREECODE (MESSAGE_SEND_EXPR, "message_send_expr", 'e', 3)
-DEFTREECODE (CLASS_REFERENCE_EXPR, "class_reference_expr", 'e', 1)
+DEFTREECODE (MESSAGE_SEND_EXPR, "message_send_expr", tcc_expression, 3)
+DEFTREECODE (CLASS_REFERENCE_EXPR, "class_reference_expr", tcc_expression, 1)
 
 /*
 Local variables:
index 8a7f093..c6d5ce7 100644 (file)
@@ -1048,7 +1048,7 @@ tree_predict_by_opcode (basic_block bb)
     if (then_edge->flags & EDGE_TRUE_VALUE)
        break;
   cond = TREE_OPERAND (stmt, 0);
-  if (TREE_CODE_CLASS (TREE_CODE (cond)) != '<')
+  if (!COMPARISON_CLASS_P (cond))
     return;
   op0 = TREE_OPERAND (cond, 0);
   type = TREE_TYPE (op0);
index 829e2c9..20822af 100644 (file)
@@ -61,7 +61,7 @@ debug_tree (tree node)
 void
 print_node_brief (FILE *file, const char *prefix, tree node, int indent)
 {
-  char class;
+  enum tree_code_class class;
 
   if (node == 0)
     return;
@@ -75,12 +75,12 @@ print_node_brief (FILE *file, const char *prefix, tree node, int indent)
   fprintf (file, "%s <%s " HOST_PTR_PRINTF,
           prefix, tree_code_name[(int) TREE_CODE (node)], (char *) node);
 
-  if (class == 'd')
+  if (class == tcc_declaration)
     {
       if (DECL_NAME (node))
        fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
     }
-  else if (class == 't')
+  else if (class == tcc_type)
     {
       if (TYPE_NAME (node))
        {
@@ -156,7 +156,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
   int hash;
   struct bucket *b;
   enum machine_mode mode;
-  char class;
+  enum tree_code_class class;
   int len;
   int first_rtl;
   int i;
@@ -177,7 +177,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
       return;
     }
 
-  if (indent > 8 && (class == 't' || class == 'd'))
+  if (indent > 8 && (class == tcc_type || class == tcc_declaration))
     {
       print_node_brief (file, prefix, node, indent);
       return;
@@ -214,12 +214,12 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
           prefix, tree_code_name[(int) TREE_CODE (node)], (void *) node);
 
   /* Print the name, if any.  */
-  if (class == 'd')
+  if (class == tcc_declaration)
     {
       if (DECL_NAME (node))
        fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
     }
-  else if (class == 't')
+  else if (class == tcc_type)
     {
       if (TYPE_NAME (node))
        {
@@ -296,7 +296,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
 
   switch (TREE_CODE_CLASS (TREE_CODE (node)))
     {
-    case 'd':
+    case tcc_declaration:
       mode = DECL_MODE (node);
 
       if (DECL_UNSIGNED (node))
@@ -461,7 +461,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
        print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
       break;
 
-    case 't':
+    case tcc_type:
       if (TYPE_UNSIGNED (node))
        fputs (" unsigned", file);
 
@@ -573,12 +573,12 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
       print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
       break;
 
-    case 'e':
-    case '<':
-    case '1':
-    case '2':
-    case 'r':
-    case 's':
+    case tcc_expression:
+    case tcc_comparison:
+    case tcc_unary:
+    case tcc_binary:
+    case tcc_reference:
+    case tcc_statement:
       if (TREE_CODE (node) == BIT_FIELD_REF && BIT_FIELD_REF_UNSIGNED (node))
        fputs (" unsigned", file);
       if (TREE_CODE (node) == BIND_EXPR)
@@ -619,8 +619,8 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
       print_node (file, "chain", TREE_CHAIN (node), indent + 4);
       break;
 
-    case 'c':
-    case 'x':
+    case tcc_constant:
+    case tcc_exceptional:
       switch (TREE_CODE (node))
        {
        case INTEGER_CST:
@@ -765,7 +765,7 @@ print_node (FILE *file, const char *prefix, tree node, int indent)
          break;
 
        default:
-         if (TREE_CODE_CLASS (TREE_CODE (node)) == 'x')
+         if (EXCEPTIONAL_CLASS_P (node))
            lang_hooks.print_xnode (file, node, indent);
          break;
        }
index 8d2c2d8..c63d418 100644 (file)
@@ -2032,7 +2032,7 @@ alter_reg (int i, int from_reg)
       /* If we have a decl for the original register, set it for the
         memory.  If this is a shared MEM, make a copy.  */
       if (REG_EXPR (regno_reg_rtx[i])
-         && TREE_CODE_CLASS (TREE_CODE (REG_EXPR (regno_reg_rtx[i]))) == 'd')
+         && DECL_P (REG_EXPR (regno_reg_rtx[i])))
        {
          rtx decl = DECL_RTL_IF_SET (REG_EXPR (regno_reg_rtx[i]));
 
index 2db6dfa..e5d094d 100644 (file)
@@ -1471,16 +1471,14 @@ warn_if_unused_value (tree exp, location_t locus)
 
     default:
       /* Referencing a volatile value is a side effect, so don't warn.  */
-      if ((DECL_P (exp)
-          || TREE_CODE_CLASS (TREE_CODE (exp)) == 'r')
+      if ((DECL_P (exp) || REFERENCE_CLASS_P (exp))
          && TREE_THIS_VOLATILE (exp))
        return 0;
 
       /* If this is an expression which has no operands, there is no value
         to be unused.  There are no such language-independent codes,
         but front ends may define such.  */
-      if (TREE_CODE_CLASS (TREE_CODE (exp)) == 'e'
-         && TREE_CODE_LENGTH (TREE_CODE (exp)) == 0)
+      if (EXPRESSION_CLASS_P (exp) && TREE_CODE_LENGTH (TREE_CODE (exp)) == 0)
        return 0;
 
     maybe_warn:
index 891c761..1ac5dda 100644 (file)
@@ -1,5 +1,5 @@
 /* Tree browser.
-   Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
    Contributed by Sebastian Pop <s.pop@laposte.net>
 
 This file is part of GCC.
@@ -262,14 +262,14 @@ browse_tree (tree begin)
          break;
 
        case TB_REFERENCE_TO_THIS:
-         if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 't')
+         if (head && TYPE_P (head))
            TB_SET_HEAD (TYPE_REFERENCE_TO (head));
          else
            TB_WF;
          break;
 
        case TB_POINTER_TO_THIS:
-         if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 't')
+         if (head && TYPE_P (head))
            TB_SET_HEAD (TYPE_POINTER_TO (head));
          else
            TB_WF;
@@ -338,28 +338,28 @@ browse_tree (tree begin)
          break;
 
        case TB_INITIAL:
-         if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 'd')
+         if (head && DECL_P (head))
            TB_SET_HEAD (DECL_INITIAL (head));
          else
            TB_WF;
          break;
 
        case TB_RESULT:
-         if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 'd')
+         if (head && DECL_P (head))
            TB_SET_HEAD (DECL_RESULT_FLD (head));
          else
            TB_WF;
          break;
 
        case TB_ARGUMENTS:
-         if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 'd')
+         if (head && DECL_P (head))
            TB_SET_HEAD (DECL_ARGUMENTS (head));
          else
            TB_WF;
          break;
 
        case TB_ABSTRACT_ORIGIN:
-         if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 'd')
+         if (head && DECL_P (head))
            TB_SET_HEAD (DECL_ABSTRACT_ORIGIN (head));
          else if (head && TREE_CODE (head) == BLOCK)
            TB_SET_HEAD (BLOCK_ABSTRACT_ORIGIN (head));
@@ -368,18 +368,18 @@ browse_tree (tree begin)
          break;
 
        case TB_ATTRIBUTES:
-         if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 'd')
+         if (head && DECL_P (head))
            TB_SET_HEAD (DECL_ATTRIBUTES (head));
-         else if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 't')
+         else if (head && TYPE_P (head))
            TB_SET_HEAD (TYPE_ATTRIBUTES (head));
          else
            TB_WF;
          break;
 
        case TB_CONTEXT:
-         if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 'd')
+         if (head && DECL_P (head))
            TB_SET_HEAD (DECL_CONTEXT (head));
-         else if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 't'
+         else if (head && TYPE_P (head)
                   && TYPE_CONTEXT (head))
            TB_SET_HEAD (TYPE_CONTEXT (head));
          else
@@ -401,18 +401,18 @@ browse_tree (tree begin)
           break;
 
        case TB_UNIT_SIZE:
-         if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 'd')
+         if (head && DECL_P (head))
            TB_SET_HEAD (DECL_SIZE_UNIT (head));
-         else if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 't')
+         else if (head && TYPE_P (head))
            TB_SET_HEAD (TYPE_SIZE_UNIT (head));
          else
            TB_WF;
          break;
 
        case TB_SIZE:
-         if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 'd')
+         if (head && DECL_P (head))
            TB_SET_HEAD (DECL_SIZE (head));
-         else if (head && TREE_CODE_CLASS (TREE_CODE (head)) == 't')
+         else if (head && TYPE_P (head))
            TB_SET_HEAD (TYPE_SIZE (head));
          else
            TB_WF;
@@ -441,32 +441,28 @@ browse_tree (tree begin)
          break;
 
        case TB_CHILD_0:
-         if (head && IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (head)))
-             && TREE_OPERAND (head, 0))
+         if (head && EXPR_P (head) && TREE_OPERAND (head, 0))
            TB_SET_HEAD (TREE_OPERAND (head, 0));
          else
            TB_WF;
          break;
 
        case TB_CHILD_1:
-          if (head && IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (head)))
-             && TREE_OPERAND (head, 1))
+          if (head && EXPR_P (head) && TREE_OPERAND (head, 1))
            TB_SET_HEAD (TREE_OPERAND (head, 1));
          else
            TB_WF;
           break;
 
        case TB_CHILD_2:
-          if (head && IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (head)))
-             && TREE_OPERAND (head, 2))
+          if (head && EXPR_P (head) && TREE_OPERAND (head, 2))
            TB_SET_HEAD (TREE_OPERAND (head, 2));
          else
            TB_WF;
          break;
 
        case TB_CHILD_3:
-         if (head && IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (head)))
-             && TREE_OPERAND (head, 3))
+         if (head && EXPR_P (head) && TREE_OPERAND (head, 3))
            TB_SET_HEAD (TREE_OPERAND (head, 3));
          else
            TB_WF;
@@ -751,7 +747,7 @@ store_child_info (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
   node = *tp;
 
   /* 'node' is the parent of 'TREE_OPERAND (node, *)'.  */
-  if (TREE_CODE_CLASS (TREE_CODE (node)) == 'e')
+  if (EXPRESSION_CLASS_P (node))
     {
 
 #define STORE_CHILD(N) do {                                                \
@@ -808,7 +804,7 @@ TB_parent_eq (const void *p1, const void *p2)
   if (p1 == NULL || p2 == NULL)
     return 0;
 
-  if (TREE_CODE_CLASS(TREE_CODE(parent)) == 'e')
+  if (EXPRESSION_CLASS_P (parent))
     {
 
 #define TEST_CHILD(N) do {               \
index f7c5155..69c8b25 100644 (file)
@@ -2004,7 +2004,7 @@ find_taken_edge (basic_block bb, tree val)
      SSA_NAME, we can always determine its truth value (except when
      doing floating point comparisons that may involve NaNs).  */
   if (val
-      && TREE_CODE_CLASS (TREE_CODE (val)) == '<'
+      && COMPARISON_CLASS_P (val)
       && TREE_OPERAND (val, 0) == TREE_OPERAND (val, 1)
       && TREE_CODE (TREE_OPERAND (val, 0)) == SSA_NAME
       && (TREE_CODE (TREE_TYPE (TREE_OPERAND (val, 0))) != REAL_TYPE
@@ -3085,8 +3085,8 @@ verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
      We check for constants explicitly since they are not considered
      gimple invariants if they overflowed.  */
 #define CHECK_OP(N, MSG) \
-  do { if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t, N))) != 'c'    \
-         && !is_gimple_val (TREE_OPERAND (t, N)))                      \
+  do { if (!CONSTANT_CLASS_P (TREE_OPERAND (t, N))             \
+         && !is_gimple_val (TREE_OPERAND (t, N)))              \
        { error (MSG); return TREE_OPERAND (t, N); }} while (0)
 
   switch (TREE_CODE (t))
@@ -3187,8 +3187,7 @@ verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
          t = TREE_OPERAND (t, 0);
        }
 
-      if (TREE_CODE_CLASS (TREE_CODE (t)) != 'c'
-         && !is_gimple_lvalue (t))
+      if (!CONSTANT_CLASS_P (t) && !is_gimple_lvalue (t))
        {
          error ("Invalid reference prefix.");
          return t;
@@ -3298,10 +3297,10 @@ verify_stmt (tree stmt, bool last_in_block)
 static bool
 tree_node_can_be_shared (tree t)
 {
-  if (TYPE_P (t) || DECL_P (t)
+  if (IS_TYPE_OR_DECL_P (t)
       /* We check for constants explicitly since they are not considered
         gimple invariants if they overflowed.  */
-      || TREE_CODE_CLASS (TREE_CODE (t)) == 'c'
+      || CONSTANT_CLASS_P (t)
       || is_gimple_min_invariant (t)
       || TREE_CODE (t) == SSA_NAME)
     return true;
@@ -3309,7 +3308,7 @@ tree_node_can_be_shared (tree t)
   while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
          /* We check for constants explicitly since they are not considered
             gimple invariants if they overflowed.  */
-         && (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t, 1))) == 'c'
+         && (CONSTANT_CLASS_P (TREE_OPERAND (t, 1))
              || is_gimple_min_invariant (TREE_OPERAND (t, 1))))
         || (TREE_CODE (t) == COMPONENT_REF
             || TREE_CODE (t) == REALPART_EXPR
index c6b79b6..47419c2 100644 (file)
@@ -932,7 +932,7 @@ chrec_convert (tree type,
 
        /* Don't propagate overflows.  */
        TREE_OVERFLOW (res) = 0;
-       if (TREE_CODE_CLASS (TREE_CODE (res)) == 'c')
+       if (CONSTANT_CLASS_P (res))
          TREE_CONSTANT_OVERFLOW (res) = 0;
        return res;
       }
index 363e3a2..5a4fdf5 100644 (file)
@@ -425,7 +425,7 @@ expand_complex_operations_1 (block_stmt_iterator *bsi)
   ar = extract_component (bsi, ac, 0);
   ai = extract_component (bsi, ac, 1);
 
-  if (TREE_CODE_CLASS (code) == '1')
+  if (TREE_CODE_CLASS (code) == tcc_unary)
     bc = br = bi = NULL;
   else
     {
@@ -776,8 +776,8 @@ expand_vector_operations_1 (block_stmt_iterator *bsi)
     return;
 
   code = TREE_CODE (rhs);
-  if (TREE_CODE_CLASS (code) != '1'
-      && TREE_CODE_CLASS (code) != '2')
+  if (TREE_CODE_CLASS (code) != tcc_unary
+      && TREE_CODE_CLASS (code) != tcc_binary)
     return;
 
   if (code == NOP_EXPR || code == VIEW_CONVERT_EXPR)
@@ -872,7 +872,7 @@ expand_vector_operations_1 (block_stmt_iterator *bsi)
        break;
       }
 
-  if (TREE_CODE_CLASS (code) == '1')
+  if (TREE_CODE_CLASS (code) == tcc_unary)
     *p_rhs = expand_vector_piecewise (bsi, do_unop, type, compute_type,
                                      TREE_OPERAND (rhs, 0),
                                      NULL_TREE, code);
index 3d7e4d4..4e65c5d 100644 (file)
@@ -847,9 +847,7 @@ find_vars_r (tree *tp, int *walk_subtrees, void *data)
 
   /* Type, _DECL and constant nodes have no interesting children.
      Ignore them.  */
-  else if (DECL_P (*tp)
-          || TYPE_P (*tp)
-          || TREE_CODE_CLASS (TREE_CODE (*tp)) == 'c')
+  else if (IS_TYPE_OR_DECL_P (*tp) || CONSTANT_CLASS_P (*tp))
     *walk_subtrees = 0;
 
   return NULL_TREE;
index a8818c3..d8d370f 100644 (file)
@@ -216,7 +216,7 @@ dequeue_and_dump (dump_info_p di)
   tree t;
   unsigned int index;
   enum tree_code code;
-  char code_class;
+  enum tree_code_class code_class;
   const char* code_name;
 
   /* Get the next node from the queue.  */
@@ -292,19 +292,19 @@ dequeue_and_dump (dump_info_p di)
 
       switch (code_class)
        {
-       case '1':
+       case tcc_unary:
          dump_child ("op 0", TREE_OPERAND (t, 0));
          break;
 
-       case '2':
-       case '<':
+       case tcc_binary:
+       case tcc_comparison:
          dump_child ("op 0", TREE_OPERAND (t, 0));
          dump_child ("op 1", TREE_OPERAND (t, 1));
          break;
 
-       case 'e':
-       case 'r':
-       case 's':
+       case tcc_expression:
+       case tcc_reference:
+       case tcc_statement:
          /* These nodes are handled explicitly below.  */
          break;
 
@@ -346,7 +346,7 @@ dequeue_and_dump (dump_info_p di)
       if (TREE_CHAIN (t) && !dump_flag (di, TDF_SLIM, NULL))
        dump_child ("chan", TREE_CHAIN (t));
     }
-  else if (code_class == 't')
+  else if (code_class == tcc_type)
     {
       /* All types have qualifiers.  */
       int quals = lang_hooks.tree_dump.type_quals (t);
@@ -373,7 +373,7 @@ dequeue_and_dump (dump_info_p di)
       /* All types have alignments.  */
       dump_int (di, "algn", TYPE_ALIGN (t));
     }
-  else if (code_class == 'c')
+  else if (code_class == tcc_constant)
     /* All constants can have types.  */
     queue_and_dump_type (di, t);
 
index 008632d..b7bc7c3 100644 (file)
@@ -1,5 +1,5 @@
 /* Exception handling semantics and decomposition for trees.
-   Copyright (C) 2003 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -1719,9 +1719,9 @@ tree_could_trap_p (tree expr)
   bool honor_trapv = false;
   tree t, base, idx;
 
-  if (TREE_CODE_CLASS (code) == '<'
-      || TREE_CODE_CLASS (code) == '1'
-      || TREE_CODE_CLASS (code) == '2')
+  if (TREE_CODE_CLASS (code) == tcc_comparison
+      || TREE_CODE_CLASS (code) == tcc_unary
+      || TREE_CODE_CLASS (code) == tcc_binary)
     {
       t = TREE_TYPE (expr);
       fp_operation = FLOAT_TYPE_P (t);
index 9211a65..d9fe020 100644 (file)
@@ -201,9 +201,9 @@ is_gimple_formal_tmp_rhs (tree t)
 
   switch (TREE_CODE_CLASS (code))
     {
-    case '1':
-    case '2':
-    case '<':
+    case tcc_unary:
+    case tcc_binary:
+    case tcc_comparison:
       return true;
 
     default:
@@ -312,8 +312,7 @@ is_gimple_lvalue (tree t)
 bool
 is_gimple_condexpr (tree t)
 {
-  return (is_gimple_val (t)
-         || TREE_CODE_CLASS (TREE_CODE (t)) == '<');
+  return (is_gimple_val (t) || COMPARISON_CLASS_P (t));
 }
 
 /*  Return true if T is something whose address can be taken.  */
@@ -579,7 +578,7 @@ recalculate_side_effects (tree t)
 
   switch (TREE_CODE_CLASS (code))
     {
-    case 'e':
+    case tcc_expression:
       switch (code)
        {
        case INIT_EXPR:
@@ -598,10 +597,10 @@ recalculate_side_effects (tree t)
        }
       /* Fall through.  */
 
-    case '<':  /* a comparison expression */
-    case '1':  /* a unary arithmetic expression */
-    case '2':  /* a binary arithmetic expression */
-    case 'r':  /* a reference */
+    case tcc_comparison:  /* a comparison expression */
+    case tcc_unary:       /* a unary arithmetic expression */
+    case tcc_binary:      /* a binary arithmetic expression */
+    case tcc_reference:   /* a reference */
       TREE_SIDE_EFFECTS (t) = TREE_THIS_VOLATILE (t);
       for (i = 0; i < fro; ++i)
        {
@@ -610,5 +609,9 @@ recalculate_side_effects (tree t)
            TREE_SIDE_EFFECTS (t) = 1;
        }
       break;
+
+    default:
+      /* Can never be used with non-expressions.  */
+      gcc_unreachable ();
    }
 }
index 82b7857..707faaf 100644 (file)
@@ -1159,7 +1159,7 @@ estimate_num_insns_1 (tree *tp, int *walk_subtrees, void *data)
   int *count = data;
   tree x = *tp;
 
-  if (TYPE_P (x) || DECL_P (x))
+  if (IS_TYPE_OR_DECL_P (x))
     {
       *walk_subtrees = 0;
       return NULL;
@@ -1167,8 +1167,7 @@ estimate_num_insns_1 (tree *tp, int *walk_subtrees, void *data)
   /* Assume that constants and references counts nothing.  These should
      be majorized by amount of operations among them we count later
      and are common target of CSE and similar optimizations.  */
-  else if (TREE_CODE_CLASS (TREE_CODE (x)) == 'c'
-          || TREE_CODE_CLASS (TREE_CODE (x)) == 'r')
+  else if (CONSTANT_CLASS_P (x) || REFERENCE_CLASS_P (x))
     return NULL;
 
   switch (TREE_CODE (x))
@@ -2258,7 +2257,7 @@ copy_tree_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
 
   /* We make copies of most nodes.  */
   if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
-      || TREE_CODE_CLASS (code) == 'c'
+      || TREE_CODE_CLASS (code) == tcc_constant
       || code == TREE_LIST
       || code == TREE_VEC
       || code == TYPE_DECL)
@@ -2288,9 +2287,9 @@ copy_tree_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
        BIND_EXPR_BLOCK (*tp) = NULL_TREE;
     }
 
-  else if (TREE_CODE_CLASS (code) == 't')
+  else if (TREE_CODE_CLASS (code) == tcc_type)
     *walk_subtrees = 0;
-  else if (TREE_CODE_CLASS (code) == 'd')
+  else if (TREE_CODE_CLASS (code) == tcc_declaration)
     *walk_subtrees = 0;
   else
     gcc_assert (code != STATEMENT_LIST);
index 9f4a57d..135ac04 100644 (file)
@@ -831,7 +831,7 @@ convert_nonlocal_reference (tree *tp, int *walk_subtrees, void *data)
       break;
 
     default:
-      if (!DECL_P (t) && !TYPE_P (t))
+      if (!IS_TYPE_OR_DECL_P (t))
        {
          *walk_subtrees = 1;
           wi->val_only = true;
@@ -945,7 +945,7 @@ convert_local_reference (tree *tp, int *walk_subtrees, void *data)
       break;
 
     default:
-      if (!DECL_P (t) && !TYPE_P (t))
+      if (!IS_TYPE_OR_DECL_P (t))
        {
          *walk_subtrees = 1;
          wi->val_only = true;
@@ -1124,7 +1124,7 @@ convert_tramp_reference (tree *tp, int *walk_subtrees, void *data)
       break;
 
     default:
-      if (!DECL_P (t) && !TYPE_P (t))
+      if (!IS_TYPE_OR_DECL_P (t))
        *walk_subtrees = 1;
       break;
     }
index 4c8c216..185e39b 100644 (file)
@@ -1750,7 +1750,7 @@ discover_nonconstant_array_refs_r (tree * tp, int *walk_subtrees,
 {
   tree t = *tp;
 
-  if (TYPE_P (t) || DECL_P (t))
+  if (IS_TYPE_OR_DECL_P (t))
     *walk_subtrees = 0;
   else if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
     {
index d0b9aed..71196fb 100644 (file)
@@ -1,5 +1,5 @@
 /* Pretty formatting of GENERIC trees in C syntax.
-   Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
    Adapted from c-pretty-print.c by Diego Novillo <dnovillo@redhat.com>
 
 This file is part of GCC.
@@ -70,7 +70,7 @@ do_niy (pretty_printer *buffer, tree node)
   pp_string (buffer, "<<< Unknown tree: ");
   pp_string (buffer, tree_code_name[(int) TREE_CODE (node)]);
 
-  if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (node))))
+  if (EXPR_P (node))
     {
       len = first_rtl_op (TREE_CODE (node));
       for (i = 0; i < len; ++i)
@@ -303,7 +303,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
     case CHAR_TYPE:
       {
        unsigned int quals = TYPE_QUALS (node);
-       char class;
+       enum tree_code_class class;
 
        if (quals & TYPE_QUAL_CONST)
          pp_string (buffer, "const ");
@@ -314,14 +314,14 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
 
        class = TREE_CODE_CLASS (TREE_CODE (node));
 
-       if (class == 'd')
+       if (class == tcc_declaration)
          {
            if (DECL_NAME (node))
              dump_decl_name (buffer, node, flags);
            else
               pp_string (buffer, "<unnamed type decl>");
          }
-       else if (class == 't')
+       else if (class == tcc_type)
          {
            if (TYPE_NAME (node))
              {
@@ -1330,9 +1330,7 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags,
 
     case GOTO_EXPR:
       op0 = GOTO_DESTINATION (node);
-      if (TREE_CODE (op0) != SSA_NAME
-         && DECL_P (op0)
-         && DECL_NAME (op0))
+      if (TREE_CODE (op0) != SSA_NAME && DECL_P (op0) && DECL_NAME (op0))
        {
          const char *name = IDENTIFIER_POINTER (DECL_NAME (op0));
          if (strcmp (name, "break") == 0
index e54d7d1..01a609a 100644 (file)
@@ -1553,7 +1553,7 @@ find_new_referenced_vars_1 (tree *tp, int *walk_subtrees,
   if (TREE_CODE (t) == VAR_DECL && !var_ann (t))
     add_referenced_tmp_var (t);
 
-  if (DECL_P (t) || TYPE_P (t))
+  if (IS_TYPE_OR_DECL_P (t))
     *walk_subtrees = 0;
 
   return NULL;
@@ -1903,7 +1903,7 @@ mark_notrap (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
       TREE_THIS_NOTRAP (t) = 1;
       *walk_subtrees = 0;
     }
-  else if (DECL_P (t) || TYPE_P (t))
+  else if (IS_TYPE_OR_DECL_P (t))
     *walk_subtrees = 0;
 
   return NULL;
index 2fe4069..ae06ea0 100644 (file)
@@ -1790,7 +1790,7 @@ add_pointed_to_var (struct alias_info *ai, tree ptr, tree value)
   gcc_assert (TREE_CODE (value) == ADDR_EXPR);
 
   pt_var = TREE_OPERAND (value, 0);
-  if (TREE_CODE_CLASS (TREE_CODE (pt_var)) == 'r')
+  if (REFERENCE_CLASS_P (pt_var))
     pt_var = get_base_address (pt_var);
 
   if (pt_var && SSA_VAR_P (pt_var))
index 54ff28a..81ce673 100644 (file)
@@ -787,7 +787,7 @@ ccp_fold (tree stmt)
 {
   tree rhs = get_rhs (stmt);
   enum tree_code code = TREE_CODE (rhs);
-  int kind = TREE_CODE_CLASS (code);
+  enum tree_code_class kind = TREE_CODE_CLASS (code);
   tree retval = NULL_TREE;
   vuse_optype vuses;
   
@@ -805,7 +805,7 @@ ccp_fold (tree stmt)
   /* Unary operators.  Note that we know the single operand must
      be a constant.  So this should almost always return a
      simplified RHS.  */
-  if (kind == '1')
+  if (kind == tcc_unary)
     {
       /* Handle unary operators which can appear in GIMPLE form.  */
       tree op0 = TREE_OPERAND (rhs, 0);
@@ -845,8 +845,8 @@ ccp_fold (tree stmt)
 
   /* Binary and comparison operators.  We know one or both of the
      operands are constants.  */
-  else if (kind == '2'
-           || kind == '<'
+  else if (kind == tcc_binary
+           || kind == tcc_comparison
            || code == TRUTH_AND_EXPR
            || code == TRUTH_OR_EXPR
            || code == TRUTH_XOR_EXPR)
@@ -2035,7 +2035,8 @@ fold_stmt (tree *stmt_p)
          if (TREE_CODE (callee) == OBJ_TYPE_REF
              && lang_hooks.fold_obj_type_ref
              && TREE_CODE (OBJ_TYPE_REF_OBJECT (callee)) == ADDR_EXPR
-             && DECL_P (TREE_OPERAND (OBJ_TYPE_REF_OBJECT (callee), 0)))
+             && DECL_P (TREE_OPERAND
+                        (OBJ_TYPE_REF_OBJECT (callee), 0)))
            {
              tree t;
 
index fec54ab..80357dc 100644 (file)
@@ -402,7 +402,7 @@ mark_stmt_if_obviously_necessary (tree stmt, bool aggressive)
         a global variable.  Otherwise, we check if the base variable
         is a global.  */
       lhs = TREE_OPERAND (stmt, 0);
-      if (TREE_CODE_CLASS (TREE_CODE (lhs)) == 'r')
+      if (REFERENCE_CLASS_P (lhs))
        lhs = get_base_address (lhs);
 
       if (lhs == NULL_TREE)
index e0e0b46..1953dfb 100644 (file)
@@ -616,7 +616,7 @@ thread_across_edge (struct dom_walk_data *walk_data, edge e)
       else
        cond = SWITCH_COND (stmt);
 
-      if (TREE_CODE_CLASS (TREE_CODE (cond)) == '<')
+      if (COMPARISON_CLASS_P (cond))
        {
          tree dummy_cond, op0, op1;
          enum tree_code cond_code;
@@ -776,8 +776,7 @@ initialize_hash_element (tree expr, tree lhs, struct expr_hash_elt *element)
      For the former case, we have no annotation and we want to hash the
      conditional expression.  In the latter case we have an annotation and
      we want to record the expression the statement evaluates.  */
-  if (TREE_CODE_CLASS (TREE_CODE (expr)) == '<'
-      || TREE_CODE (expr) == TRUTH_NOT_EXPR)
+  if (COMPARISON_CLASS_P (expr) || TREE_CODE (expr) == TRUTH_NOT_EXPR)
     {
       element->ann = NULL;
       element->rhs = expr;
@@ -932,7 +931,7 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb)
     }
   else if ((last = last_stmt (bb))
           && TREE_CODE (last) == COND_EXPR
-          && (TREE_CODE_CLASS (TREE_CODE (COND_EXPR_COND (last))) == '<'
+          && (COMPARISON_CLASS_P (COND_EXPR_COND (last))
               || TREE_CODE (COND_EXPR_COND (last)) == SSA_NAME)
           && bb->succ
           && (bb->succ->flags & EDGE_ABNORMAL) == 0
@@ -949,7 +948,7 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb)
       cond = COND_EXPR_COND (last);
       cond_code = TREE_CODE (cond);
 
-      if (TREE_CODE_CLASS (cond_code) == '<')
+      if (TREE_CODE_CLASS (cond_code) == tcc_comparison)
        inverted = invert_truthvalue (cond);
 
       /* If the THEN arm is the end of a dominator tree or has PHI nodes,
@@ -965,7 +964,7 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb)
          VARRAY_PUSH_TREE (const_and_copies_stack, NULL_TREE);
 
          /* Record any equivalences created by following this edge.  */
-         if (TREE_CODE_CLASS (cond_code) == '<')
+         if (TREE_CODE_CLASS (cond_code) == tcc_comparison)
            {
              record_cond (cond, boolean_true_node);
              record_dominating_conditions (cond);
@@ -989,7 +988,7 @@ dom_opt_finalize_block (struct dom_walk_data *walk_data, basic_block bb)
          || phi_nodes (false_edge->dest))
        {
          /* Record any equivalences created by following this edge.  */
-         if (TREE_CODE_CLASS (cond_code) == '<')
+         if (TREE_CODE_CLASS (cond_code) == tcc_comparison)
            {
              record_cond (cond, boolean_false_node);
              record_cond (inverted, boolean_true_node);
@@ -1699,10 +1698,9 @@ simplify_rhs_and_lookup_avail_expr (struct dom_walk_data *walk_data,
                  /* If the result is a suitable looking gimple expression,
                     then use it instead of the original for STMT.  */
                  if (TREE_CODE (t) == SSA_NAME
-                     || (TREE_CODE_CLASS (TREE_CODE (t)) == '1'
+                     || (UNARY_CLASS_P (t)
                          && TREE_CODE (TREE_OPERAND (t, 0)) == SSA_NAME)
-                     || ((TREE_CODE_CLASS (TREE_CODE (t)) == '2'
-                          || TREE_CODE_CLASS (TREE_CODE (t)) == '<')
+                     || ((BINARY_CLASS_P (t) || COMPARISON_CLASS_P (t))
                          && TREE_CODE (TREE_OPERAND (t, 0)) == SSA_NAME
                          && is_gimple_val (TREE_OPERAND (t, 1))))
                    result = update_rhs_and_lookup_avail_expr (stmt, t, insert);
@@ -1920,7 +1918,7 @@ simplify_cond_and_lookup_avail_expr (tree stmt,
 {
   tree cond = COND_EXPR_COND (stmt);
 
-  if (TREE_CODE_CLASS (TREE_CODE (cond)) == '<')
+  if (COMPARISON_CLASS_P (cond))
     {
       tree op0 = TREE_OPERAND (cond, 0);
       tree op1 = TREE_OPERAND (cond, 1);
@@ -3023,7 +3021,7 @@ record_range (tree cond, basic_block bb, varray_type *vrp_variables_p)
 {
   /* We explicitly ignore NE_EXPRs.  They rarely allow for meaningful
      range optimizations and significantly complicate the implementation.  */
-  if (TREE_CODE_CLASS (TREE_CODE (cond)) == '<'
+  if (COMPARISON_CLASS_P (cond)
       && TREE_CODE (cond) != NE_EXPR
       && TREE_CODE (TREE_TYPE (TREE_OPERAND (cond, 1))) == INTEGER_TYPE)
     {
@@ -3091,7 +3089,7 @@ get_eq_expr_value (tree if_stmt,
 
   /* If we have a comparison expression, then record its result into
      the available expression table.  */
-  if (TREE_CODE_CLASS (TREE_CODE (cond)) == '<')
+  if (COMPARISON_CLASS_P (cond))
     {
       tree op0 = TREE_OPERAND (cond, 0);
       tree op1 = TREE_OPERAND (cond, 1);
index 9343ec2..52c3860 100644 (file)
@@ -172,7 +172,7 @@ record_single_argument_cond_exprs (varray_type cond_worklist,
          if (cond_code == SSA_NAME
              || ((cond_code == EQ_EXPR || cond_code == NE_EXPR)
                  && TREE_CODE (TREE_OPERAND (cond, 0)) == SSA_NAME
-                 && TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (cond, 1))) == 'c'
+                 && CONSTANT_CLASS_P (TREE_OPERAND (cond, 1))
                  && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (cond, 1)))))
            {
              tree def;
@@ -209,7 +209,7 @@ record_single_argument_cond_exprs (varray_type cond_worklist,
                      /* The first operand must be an SSA_NAME and the second
                         operand must be a constant.  */
                      if (TREE_CODE (op0) != SSA_NAME
-                         || TREE_CODE_CLASS (TREE_CODE (op1)) != 'c'
+                         || !CONSTANT_CLASS_P (op1)
                          || !INTEGRAL_TYPE_P (TREE_TYPE (op1)))
                        continue;
                    }
@@ -223,7 +223,7 @@ record_single_argument_cond_exprs (varray_type cond_worklist,
                      /* If TEST_VAR is set from a relational operation
                         between two SSA_NAMEs or a combination of an SSA_NAME
                         and a constant, then it is interesting.  */
-                     if (TREE_CODE_CLASS (TREE_CODE (def_rhs)) == '<')
+                     if (COMPARISON_CLASS_P (def_rhs))
                        {
                          tree op0 = TREE_OPERAND (def_rhs, 0);
                          tree op1 = TREE_OPERAND (def_rhs, 1);
@@ -364,7 +364,7 @@ substitute_single_use_vars (varray_type *cond_worklist,
              new_cond = build (cond_code, boolean_type_node, op0, t);
            }
          /* If the variable is defined by a conditional expression... */
-         else if (TREE_CODE_CLASS (def_rhs_code) == '<')
+         else if (TREE_CODE_CLASS (def_rhs_code) == tcc_comparison)
            {
              /* TEST_VAR was set from a relational operator.  */
              tree op0 = TREE_OPERAND (def_rhs, 0);
@@ -382,7 +382,7 @@ substitute_single_use_vars (varray_type *cond_worklist,
 
                  /* If we did not get a simple relational expression or
                     bare SSA_NAME, then we can not optimize this case.  */
-                 if (TREE_CODE_CLASS (TREE_CODE (new_cond)) != '<'
+                 if (!COMPARISON_CLASS_P (new_cond)
                      && TREE_CODE (new_cond) != SSA_NAME)
                    continue;
                }
index 3c4825e..507f378 100644 (file)
@@ -1,5 +1,5 @@
 /* Liveness for SSA trees.
-   Copyright (C) 2003 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
    Contributed by Andrew MacLeod <amacleod@redhat.com>
 
 This file is part of GCC.
@@ -297,7 +297,7 @@ mark_all_vars_used_1 (tree *tp, int *walk_subtrees,
   if (TREE_CODE (t) == VAR_DECL)
     set_is_used (t);
 
-  if (DECL_P (t) || TYPE_P (t))
+  if (IS_TYPE_OR_DECL_P (t))
     *walk_subtrees = 0;
 
   return NULL;
index bc606e6..de86491 100644 (file)
@@ -1,5 +1,5 @@
 /* Loop invariant motion.
-   Copyright (C) 2003 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
    
 This file is part of GCC.
    
@@ -256,7 +256,7 @@ outermost_invariant_loop (tree def, struct loop *loop)
 static struct loop *
 outermost_invariant_loop_expr (tree expr, struct loop *loop)
 {
-  char class = TREE_CODE_CLASS (TREE_CODE (expr));
+  enum tree_code_class class = TREE_CODE_CLASS (TREE_CODE (expr));
   unsigned i, nops;
   struct loop *max_loop = superloop_at_depth (loop, 1), *aloop;
 
@@ -265,10 +265,10 @@ outermost_invariant_loop_expr (tree expr, struct loop *loop)
       || is_gimple_min_invariant (expr))
     return outermost_invariant_loop (expr, loop);
 
-  if (class != '1'
-      && class != '2'
-      && class != 'e'
-      && class != '<')
+  if (class != tcc_unary
+      && class != tcc_binary
+      && class != tcc_expression
+      && class != tcc_comparison)
     return NULL;
 
   nops = first_rtl_op (TREE_CODE (expr));
@@ -714,7 +714,7 @@ may_move_till (tree ref, tree *index, void *data)
 static void
 force_move_till_expr (tree expr, struct loop *orig_loop, struct loop *loop)
 {
-  char class = TREE_CODE_CLASS (TREE_CODE (expr));
+  enum tree_code_class class = TREE_CODE_CLASS (TREE_CODE (expr));
   unsigned i, nops;
 
   if (TREE_CODE (expr) == SSA_NAME)
@@ -727,10 +727,10 @@ force_move_till_expr (tree expr, struct loop *orig_loop, struct loop *loop)
       return;
     }
 
-  if (class != '1'
-      && class != '2'
-      && class != 'e'
-      && class != '<')
+  if (class != tcc_unary
+      && class != tcc_binary
+      && class != tcc_expression
+      && class != tcc_comparison)
     return;
 
   nops = first_rtl_op (TREE_CODE (expr));
index e831b51..078e8a3 100644 (file)
@@ -1,5 +1,5 @@
 /* Induction variable optimizations.
-   Copyright (C) 2003 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
    
 This file is part of GCC.
    
@@ -721,7 +721,7 @@ static bool
 contains_abnormal_ssa_name_p (tree expr)
 {
   enum tree_code code = TREE_CODE (expr);
-  char class = TREE_CODE_CLASS (code);
+  enum tree_code_class class = TREE_CODE_CLASS (code);
     
   if (code == SSA_NAME)
     return SSA_NAME_OCCURS_IN_ABNORMAL_PHI (expr) != 0;
@@ -737,13 +737,13 @@ contains_abnormal_ssa_name_p (tree expr)
 
   switch (class)
     {
-    case '2':
-    case '<':
+    case tcc_binary:
+    case tcc_comparison:
       if (contains_abnormal_ssa_name_p (TREE_OPERAND (expr, 1)))
        return true;
 
       /* Fallthru.  */
-    case '1':
+    case tcc_unary:
       if (contains_abnormal_ssa_name_p (TREE_OPERAND (expr, 0)))
        return true;
 
@@ -1347,21 +1347,20 @@ find_interesting_uses_stmt (struct ivopts_data *data, tree stmt)
 
       switch (TREE_CODE_CLASS (TREE_CODE (rhs)))
        {
-       case '<':
+       case tcc_comparison:
          find_interesting_uses_cond (data, stmt, &TREE_OPERAND (stmt, 1));
          return;
 
-       case 'r':
+       case tcc_reference:
          find_interesting_uses_address (data, stmt, &TREE_OPERAND (stmt, 1));
-         if (TREE_CODE_CLASS (TREE_CODE (lhs)) == 'r')
+         if (REFERENCE_CLASS_P (lhs))
            find_interesting_uses_address (data, stmt, &TREE_OPERAND (stmt, 0));
          return;
 
        default: ;
        }
 
-      /* Handle memory = gimple_val.  */
-      if (TREE_CODE_CLASS (TREE_CODE (lhs)) == 'r'
+      if (REFERENCE_CLASS_P (lhs)
          && is_gimple_val (rhs))
        {
          find_interesting_uses_address (data, stmt, &TREE_OPERAND (stmt, 0));
index a007b50..8aae4ca 100644 (file)
@@ -1,5 +1,5 @@
 /* SSA operands management for trees.
-   Copyright (C) 2003 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -967,7 +967,7 @@ static void
 get_expr_operands (tree stmt, tree *expr_p, int flags)
 {
   enum tree_code code;
-  char class;
+  enum tree_code_class class;
   tree expr = *expr_p;
 
   if (expr == NULL || expr == error_mark_node)
@@ -1170,11 +1170,11 @@ get_expr_operands (tree stmt, tree *expr_p, int flags)
       return;
 
     default:
-      if (class == '1')
+      if (class == tcc_unary)
        goto do_unary;
-      if (class == '2' || class == '<')
+      if (class == tcc_binary || class == tcc_comparison)
        goto do_binary;
-      if (class == 'c' || class == 't')
+      if (class == tcc_constant || class == tcc_type)
        return;
     }
 
index bbdccf4..5d7f0e4 100644 (file)
@@ -341,7 +341,7 @@ conditional_replacement (basic_block bb, tree phi, tree arg0, tree arg1)
   if (old_result)
     {
       tree new1;
-      if (TREE_CODE_CLASS (TREE_CODE (old_result)) != '<')
+      if (!COMPARISON_CLASS_P (old_result))
        return false;
       
       new1 = build (TREE_CODE (old_result), TREE_TYPE (result),
index bf332f4..cbaba2c 100644 (file)
@@ -848,15 +848,21 @@ phi_translate (tree expr, value_set_t set, basic_block pred,
   if (expr == NULL)
     return NULL;
 
+  if (is_gimple_min_invariant (expr))
+    return expr;
+
   /* Phi translations of a given expression don't change,  */
   phitrans = phi_trans_lookup (expr, pred);
   if (phitrans)
     return phitrans;
   
-  
   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
     {
-    case '2':
+    case tcc_reference:
+      /* XXX: Until we have PRE of loads working, none will be ANTIC. */
+      return NULL;
+
+    case tcc_binary:
       {
        tree oldop1 = TREE_OPERAND (expr, 0);
        tree oldop2 = TREE_OPERAND (expr, 1);
@@ -884,13 +890,9 @@ phi_translate (tree expr, value_set_t set, basic_block pred,
            phi_trans_add (oldexpr, newexpr, pred);         
          }
       }
-      break;
-      /* XXX: Until we have PRE of loads working, none will be ANTIC.
-       */
-    case 'r':
-      return NULL;
-      break;
-    case '1':
+      return expr;
+
+    case tcc_unary:
       {
        tree oldop1 = TREE_OPERAND (expr, 0);
        tree newop1;
@@ -911,10 +913,9 @@ phi_translate (tree expr, value_set_t set, basic_block pred,
            phi_trans_add (oldexpr, newexpr, pred);
          }
       }
-      break;
-    case 'd':
-      gcc_unreachable ();
-    case 'x':
+      return expr;
+
+    case tcc_exceptional:
       {
        tree phi = NULL;
        int i;
@@ -934,9 +935,11 @@ phi_translate (tree expr, value_set_t set, basic_block pred,
              return PHI_ARG_DEF (phi, i);
            }
       }
-      break;
+      return expr;
+
+    default:
+      gcc_unreachable ();
     }
-  return expr;
 }
 
 static void
@@ -1046,34 +1049,31 @@ valid_in_set (value_set_t set, tree expr)
 {
   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
     {
-    case '2':
+    case tcc_binary:
       {
        tree op1 = TREE_OPERAND (expr, 0);
        tree op2 = TREE_OPERAND (expr, 1);
        return set_contains_value (set, op1) && set_contains_value (set, op2);
       }
-      break;
-    case '1':
+
+    case tcc_unary:
       {
        tree op1 = TREE_OPERAND (expr, 0);
        return set_contains_value (set, op1);
       }
-      break;
-      /* XXX: Until PRE of loads works, no reference nodes are ANTIC.
-       */
-    case 'r':
-      {
-       return false;
-      }
-    case 'x':
-      {
-       gcc_assert (TREE_CODE (expr) == SSA_NAME);
-       return true;
-      }
-    case 'c':
-      gcc_unreachable ();
-    }
-  return false;
+
+    case tcc_reference:
+      /* XXX: Until PRE of loads works, no reference nodes are ANTIC.  */
+      return false;
+
+    case tcc_exceptional:
+      gcc_assert (TREE_CODE (expr) == SSA_NAME);
+      return true;
+
+    default:
+      /* No other cases should be encountered.  */
+      gcc_unreachable (); 
+   }
 }
 
 /* Clean the set of expressions that are no longer valid in SET.  This
@@ -1291,9 +1291,9 @@ find_or_generate_expression (basic_block block, tree expr, tree stmts)
   if (genop == NULL)
     {
       genop = VALUE_HANDLE_EXPR_SET (expr)->head->expr;
-      gcc_assert (TREE_CODE_CLASS (TREE_CODE (genop)) == '1'
-                 || TREE_CODE_CLASS (TREE_CODE (genop)) == '2'
-                 || TREE_CODE_CLASS (TREE_CODE (genop)) == 'r');
+      gcc_assert (UNARY_CLASS_P (genop)
+                 || BINARY_CLASS_P (genop)
+                 || REFERENCE_CLASS_P (genop));
       genop = create_expression_by_pieces (block, genop, stmts);
     }
   return genop;
@@ -1323,7 +1323,7 @@ create_expression_by_pieces (basic_block block, tree expr, tree stmts)
   
   switch (TREE_CODE_CLASS (TREE_CODE (expr)))
     {
-    case '2':
+    case tcc_binary:
       {
        tree_stmt_iterator tsi;
        tree genop1, genop2;
@@ -1345,7 +1345,7 @@ create_expression_by_pieces (basic_block block, tree expr, tree stmts)
        pre_stats.insertions++;
        break;
       }
-    case '1':
+    case tcc_unary:
       {
        tree_stmt_iterator tsi;
        tree genop1;
@@ -1423,8 +1423,8 @@ insert_aux (basic_block block)
                   node;
                   node = node->next)
                {
-                 if (TREE_CODE_CLASS (TREE_CODE (node->expr)) == '2'
-                     || TREE_CODE_CLASS (TREE_CODE (node->expr)) == '1')
+                 if (BINARY_CLASS_P (node->expr)
+                     || UNARY_CLASS_P (node->expr))
                    {
                      tree *avail;
                      tree val;
@@ -1528,8 +1528,8 @@ insert_aux (basic_block block)
                              tree builtexpr;
                              bprime = pred->src;
                              eprime = avail[bprime->index];
-                             if (TREE_CODE_CLASS (TREE_CODE (eprime)) == '2'
-                                 || TREE_CODE_CLASS (TREE_CODE (eprime)) == '1')
+                             if (BINARY_CLASS_P (eprime)
+                                 || UNARY_CLASS_P (eprime))
                                {
                                  builtexpr = create_expression_by_pieces (bprime,
                                                                           eprime,
@@ -1668,13 +1668,13 @@ create_value_expr_from (tree expr, basic_block block, vuse_optype vuses)
   enum tree_code code = TREE_CODE (expr);
   tree vexpr;
 
-  gcc_assert (TREE_CODE_CLASS (code) == '1'
-             || TREE_CODE_CLASS (code) == '2'
-             || TREE_CODE_CLASS (code) == 'r');
+  gcc_assert (TREE_CODE_CLASS (code) == tcc_unary
+             || TREE_CODE_CLASS (code) == tcc_binary
+             || TREE_CODE_CLASS (code) == tcc_reference);
 
-  if (TREE_CODE_CLASS (code) == '1')
+  if (TREE_CODE_CLASS (code) == tcc_unary)
     vexpr = pool_alloc (unary_node_pool);
-  else if (TREE_CODE_CLASS (code) == 'r')
+  else if (TREE_CODE_CLASS (code) == tcc_reference)
     vexpr = pool_alloc (reference_node_pool);
   else
     vexpr = pool_alloc (binary_node_pool);
@@ -1791,8 +1791,7 @@ compute_avail (basic_block block)
                    value_insert_into_set (EXP_GEN (block), rhs);
                  continue;
                }          
-             else if (TREE_CODE_CLASS (TREE_CODE (rhs)) == '1'
-                      || TREE_CODE_CLASS (TREE_CODE (rhs)) == '2'
+             else if (UNARY_CLASS_P (rhs) || BINARY_CLASS_P (rhs)
                       || TREE_CODE (rhs) == INDIRECT_REF)
                {
                  /* For binary, unary, and reference expressions,
index 8e65f64..ffb7c9c 100644 (file)
@@ -564,13 +564,13 @@ set_rhs (tree *stmt_p, tree expr)
   ssa_op_iter iter;
 
   /* Verify the constant folded result is valid gimple.  */
-  if (TREE_CODE_CLASS (code) == '2')
+  if (TREE_CODE_CLASS (code) == tcc_binary)
     {
       if (!is_gimple_val (TREE_OPERAND (expr, 0))
          || !is_gimple_val (TREE_OPERAND (expr, 1)))
        return false;
     }
-  else if (TREE_CODE_CLASS (code) == '1')
+  else if (TREE_CODE_CLASS (code) == tcc_unary)
     {
       if (!is_gimple_val (TREE_OPERAND (expr, 0)))
        return false;
index f79466d..21dc59a 100644 (file)
@@ -1296,7 +1296,7 @@ warn_uninitialized_var (tree *tp, int *walk_subtrees, void *data)
       warn_uninit (t, "%H'%D' is used uninitialized in this function", locus);
       *walk_subtrees = 0;
     }
-  else if (DECL_P (t) || TYPE_P (t))
+  else if (IS_TYPE_OR_DECL_P (t))
     *walk_subtrees = 0;
 
   return NULL_TREE;
index d138a79..55ba145 100644 (file)
@@ -1,5 +1,5 @@
 /* Generic routines for manipulating SSA_NAME expressions
-   Copyright (C) 2003 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
                                                                                 
 This file is part of GCC.
                                                                                 
@@ -184,9 +184,7 @@ make_ssa_name (tree var, tree stmt)
   gcc_assert (DECL_P (var)
              || TREE_CODE (var) == INDIRECT_REF);
 
-  gcc_assert (!stmt
-             || IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (stmt)))
-             || TREE_CODE (stmt) == PHI_NODE);
+  gcc_assert (!stmt || EXPR_P (stmt) || TREE_CODE (stmt) == PHI_NODE);
 
   /* If our free list has an element, then use it.  Also reuse the
      SSA version number of the element on the free list which helps
index e1c1f67..6f3fdca 100644 (file)
@@ -1,5 +1,5 @@
 /* Tail call optimization on trees.
-   Copyright (C) 2003 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -279,7 +279,7 @@ process_assignment (tree ass, tree stmt, block_stmt_iterator call, tree *m,
       return true;
     }
 
-  if (TREE_CODE_CLASS (code) != '2')
+  if (TREE_CODE_CLASS (code) != tcc_binary)
     return false;
 
   /* Accumulator optimizations will reverse the order of operations.
index 05bbc1e..f0c55e0 100644 (file)
@@ -50,6 +50,23 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "tree-flow.h"
 #include "params.h"
 
+/* Each tree code class has an associated string representation.
+   These must correspond to the tree_code_class entries.  */
+
+const char* tree_code_class_strings[] =
+  {
+    "exceptional",
+    "constant",
+    "type",
+    "declaration",
+    "reference",
+    "comparison",
+    "unary",
+    "binary",
+    "statement",
+    "expression",
+  };
+
 /* obstack.[ch] explicitly declined to prototype this.  */
 extern int _obstack_allocated_p (struct obstack *h, void *obj);
 
@@ -155,22 +172,22 @@ tree_code_size (enum tree_code code)
 
   switch (TREE_CODE_CLASS (code))
     {
-    case 'd':  /* A decl node */
+    case tcc_declaration:  /* A decl node */
       return sizeof (struct tree_decl);
 
-    case 't':  /* a type node */
+    case tcc_type:  /* a type node */
       return sizeof (struct tree_type);
 
-    case 'r':  /* a reference */
-    case 'e':  /* an expression */
-    case 's':  /* an expression with side effects */
-    case '<':  /* a comparison expression */
-    case '1':  /* a unary arithmetic expression */
-    case '2':  /* a binary arithmetic expression */
+    case tcc_reference:   /* a reference */
+    case tcc_expression:  /* an expression */
+    case tcc_statement:   /* an expression with side effects */
+    case tcc_comparison:  /* a comparison expression */
+    case tcc_unary:       /* a unary arithmetic expression */
+    case tcc_binary:      /* a binary arithmetic expression */
       return (sizeof (struct tree_exp)
              + (TREE_CODE_LENGTH (code) - 1) * sizeof (char *));
 
-    case 'c':  /* a constant */
+    case tcc_constant:  /* a constant */
       switch (code)
        {
        case INTEGER_CST:       return sizeof (struct tree_int_cst);
@@ -182,7 +199,7 @@ tree_code_size (enum tree_code code)
          return lang_hooks.tree_size (code);
        }
 
-    case 'x':  /* something random, like an identifier.  */
+    case tcc_exceptional:  /* something random, like an identifier.  */
       switch (code)
        {
        case IDENTIFIER_NODE:   return lang_hooks.identifier_size;
@@ -240,41 +257,41 @@ tree
 make_node_stat (enum tree_code code MEM_STAT_DECL)
 {
   tree t;
-  int type = TREE_CODE_CLASS (code);
+  enum tree_code_class type = TREE_CODE_CLASS (code);
   size_t length = tree_code_size (code);
 #ifdef GATHER_STATISTICS
   tree_node_kind kind;
 
   switch (type)
     {
-    case 'd':  /* A decl node */
+    case tcc_declaration:  /* A decl node */
       kind = d_kind;
       break;
 
-    case 't':  /* a type node */
+    case tcc_type:  /* a type node */
       kind = t_kind;
       break;
 
-    case 's':  /* an expression with side effects */
+    case tcc_statement:  /* an expression with side effects */
       kind = s_kind;
       break;
 
-    case 'r':  /* a reference */
+    case tcc_reference:  /* a reference */
       kind = r_kind;
       break;
 
-    case 'e':  /* an expression */
-    case '<':  /* a comparison expression */
-    case '1':  /* a unary arithmetic expression */
-    case '2':  /* a binary arithmetic expression */
+    case tcc_expression:  /* an expression */
+    case tcc_comparison:  /* a comparison expression */
+    case tcc_unary:  /* a unary arithmetic expression */
+    case tcc_binary:  /* a binary arithmetic expression */
       kind = e_kind;
       break;
 
-    case 'c':  /* a constant */
+    case tcc_constant:  /* a constant */
       kind = c_kind;
       break;
 
-    case 'x':  /* something random, like an identifier.  */
+    case tcc_exceptional:  /* something random, like an identifier.  */
       if (code == IDENTIFIER_NODE)
        kind = id_kind;
       else if (code == TREE_VEC)
@@ -290,9 +307,6 @@ make_node_stat (enum tree_code code MEM_STAT_DECL)
       else
        kind = x_kind;
       break;
-
-    default:
-      gcc_unreachable ();
     }
 
   tree_node_counts[(int) kind]++;
@@ -307,11 +321,11 @@ make_node_stat (enum tree_code code MEM_STAT_DECL)
 
   switch (type)
     {
-    case 's':
+    case tcc_statement:
       TREE_SIDE_EFFECTS (t) = 1;
       break;
 
-    case 'd':
+    case tcc_declaration:
       if (code != FUNCTION_DECL)
        DECL_ALIGN (t) = 1;
       DECL_USER_ALIGN (t) = 0;
@@ -323,7 +337,7 @@ make_node_stat (enum tree_code code MEM_STAT_DECL)
       DECL_POINTER_ALIAS_SET (t) = -1;
       break;
 
-    case 't':
+    case tcc_type:
       TYPE_UID (t) = next_type_uid++;
       TYPE_ALIGN (t) = char_type_node ? TYPE_ALIGN (char_type_node) : 0;
       TYPE_USER_ALIGN (t) = 0;
@@ -337,12 +351,12 @@ make_node_stat (enum tree_code code MEM_STAT_DECL)
       TYPE_ALIAS_SET (t) = -1;
       break;
 
-    case 'c':
+    case tcc_constant:
       TREE_CONSTANT (t) = 1;
       TREE_INVARIANT (t) = 1;
       break;
 
-    case 'e':
+    case tcc_expression:
       switch (code)
        {
        case INIT_EXPR:
@@ -361,6 +375,10 @@ make_node_stat (enum tree_code code MEM_STAT_DECL)
          break;
        }
       break;
+
+    default:
+      /* Other classes need no special treatment.  */
+      break;
     }
 
   return t;
@@ -387,9 +405,9 @@ copy_node_stat (tree node MEM_STAT_DECL)
   TREE_VISITED (t) = 0;
   t->common.ann = 0;
 
-  if (TREE_CODE_CLASS (code) == 'd')
+  if (TREE_CODE_CLASS (code) == tcc_declaration)
     DECL_UID (t) = next_decl_uid++;
-  else if (TREE_CODE_CLASS (code) == 't')
+  else if (TREE_CODE_CLASS (code) == tcc_type)
     {
       TYPE_UID (t) = next_type_uid++;
       /* The following is so that the debug code for
@@ -1566,9 +1584,9 @@ skip_simple_arithmetic (tree expr)
   inner = expr;
   while (1)
     {
-      if (TREE_CODE_CLASS (TREE_CODE (inner)) == '1')
+      if (UNARY_CLASS_P (inner))
        inner = TREE_OPERAND (inner, 0);
-      else if (TREE_CODE_CLASS (TREE_CODE (inner)) == '2')
+      else if (BINARY_CLASS_P (inner))
        {
          if (TREE_INVARIANT (TREE_OPERAND (inner, 1)))
            inner = TREE_OPERAND (inner, 0);
@@ -1606,22 +1624,29 @@ tree_node_structure (tree t)
 
   switch (TREE_CODE_CLASS (code))
     {
-    case 'd':  return TS_DECL;
-    case 't':  return TS_TYPE;
-    case 'r': case '<': case '1': case '2': case 'e': case 's':
+    case tcc_declaration:
+      return TS_DECL;
+    case tcc_type:
+      return TS_TYPE;
+    case tcc_reference:
+    case tcc_comparison:
+    case tcc_unary:
+    case tcc_binary:
+    case tcc_expression:
+    case tcc_statement:
       return TS_EXP;
-    default:  /* 'c' and 'x' */
+    default:  /* tcc_constant and tcc_exceptional */
       break;
     }
   switch (code)
     {
-      /* 'c' cases.  */
+      /* tcc_constant cases.  */
     case INTEGER_CST:          return TS_INT_CST;
     case REAL_CST:             return TS_REAL_CST;
     case COMPLEX_CST:          return TS_COMPLEX;
     case VECTOR_CST:           return TS_VECTOR;
     case STRING_CST:           return TS_STRING;
-      /* 'x' cases.  */
+      /* tcc_exceptional cases.  */
     case ERROR_MARK:           return TS_COMMON;
     case IDENTIFIER_NODE:      return TS_IDENTIFIER;
     case TREE_LIST:            return TS_LIST;
@@ -1656,22 +1681,23 @@ contains_placeholder_p (tree exp)
 
   switch (TREE_CODE_CLASS (code))
     {
-    case 'r':
+    case tcc_reference:
       /* Don't look at any PLACEHOLDER_EXPRs that might be in index or bit
         position computations since they will be converted into a
         WITH_RECORD_EXPR involving the reference, which will assume
         here will be valid.  */
       return CONTAINS_PLACEHOLDER_P (TREE_OPERAND (exp, 0));
 
-    case 'x':
+    case tcc_exceptional:
       if (code == TREE_LIST)
        return (CONTAINS_PLACEHOLDER_P (TREE_VALUE (exp))
                || CONTAINS_PLACEHOLDER_P (TREE_CHAIN (exp)));
       break;
 
-    case '1':
-    case '2':  case '<':
-    case 'e':
+    case tcc_unary:
+    case tcc_binary:
+    case tcc_comparison:
+    case tcc_expression:
       switch (code)
        {
        case COMPOUND_EXPR:
@@ -1823,7 +1849,7 @@ substitute_in_expr (tree exp, tree f, tree r)
      /* If this expression is getting a value from a PLACEHOLDER_EXPR
        and it is the right field, replace it with R.  */
      for (inner = TREE_OPERAND (exp, 0);
-         TREE_CODE_CLASS (TREE_CODE (inner)) == 'r';
+         REFERENCE_CLASS_P (inner);
          inner = TREE_OPERAND (inner, 0))
        ;
      if (TREE_CODE (inner) == PLACEHOLDER_EXPR
@@ -1844,16 +1870,16 @@ substitute_in_expr (tree exp, tree f, tree r)
   else
     switch (TREE_CODE_CLASS (code))
       {
-      case 'c':
-      case 'd':
+      case tcc_constant:
+      case tcc_declaration:
        return exp;
 
-      case 'x':
-      case '1':
-      case '2':
-      case '<':
-      case 'e':
-      case 'r':
+      case tcc_exceptional:
+      case tcc_unary:
+      case tcc_binary:
+      case tcc_comparison:
+      case tcc_expression:
+      case tcc_reference:
        switch (first_rtl_op (code))
          {
          case 0:
@@ -1922,10 +1948,10 @@ substitute_placeholder_in_expr (tree exp, tree obj)
           elt = ((TREE_CODE (elt) == COMPOUND_EXPR
                   || TREE_CODE (elt) == COND_EXPR)
                  ? TREE_OPERAND (elt, 1)
-                 : (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
-                    || TREE_CODE_CLASS (TREE_CODE (elt)) == '1'
-                    || TREE_CODE_CLASS (TREE_CODE (elt)) == '2'
-                    || TREE_CODE_CLASS (TREE_CODE (elt)) == 'e')
+                 : (REFERENCE_CLASS_P (elt)
+                    || UNARY_CLASS_P (elt)
+                    || BINARY_CLASS_P (elt)
+                    || EXPRESSION_CLASS_P (elt))
                  ? TREE_OPERAND (elt, 0) : 0))
        if (TYPE_MAIN_VARIANT (TREE_TYPE (elt)) == need_type)
          return elt;
@@ -1934,10 +1960,10 @@ substitute_placeholder_in_expr (tree exp, tree obj)
           elt = ((TREE_CODE (elt) == COMPOUND_EXPR
                   || TREE_CODE (elt) == COND_EXPR)
                  ? TREE_OPERAND (elt, 1)
-                 : (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
-                    || TREE_CODE_CLASS (TREE_CODE (elt)) == '1'
-                    || TREE_CODE_CLASS (TREE_CODE (elt)) == '2'
-                    || TREE_CODE_CLASS (TREE_CODE (elt)) == 'e')
+                 : (REFERENCE_CLASS_P (elt)
+                    || UNARY_CLASS_P (elt)
+                    || BINARY_CLASS_P (elt)
+                    || EXPRESSION_CLASS_P (elt))
                  ? TREE_OPERAND (elt, 0) : 0))
        if (POINTER_TYPE_P (TREE_TYPE (elt))
            && (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (elt)))
@@ -1963,17 +1989,17 @@ substitute_placeholder_in_expr (tree exp, tree obj)
   else
     switch (TREE_CODE_CLASS (code))
       {
-      case 'c':
-      case 'd':
+      case tcc_constant:
+      case tcc_declaration:
        return exp;
 
-      case 'x':
-      case '1':
-      case '2':
-      case '<':
-      case 'e':
-      case 'r':
-      case 's':
+      case tcc_exceptional:
+      case tcc_unary:
+      case tcc_binary:
+      case tcc_comparison:
+      case tcc_expression:
+      case tcc_reference:
+      case tcc_statement:
        switch (first_rtl_op (code))
          {
          case 0:
@@ -2145,13 +2171,13 @@ stabilize_reference_1 (tree e)
 
   switch (TREE_CODE_CLASS (code))
     {
-    case 'x':
-    case 't':
-    case 'd':
-    case '<':
-    case 's':
-    case 'e':
-    case 'r':
+    case tcc_exceptional:
+    case tcc_type:
+    case tcc_declaration:
+    case tcc_comparison:
+    case tcc_statement:
+    case tcc_expression:
+    case tcc_reference:
       /* If the expression has side-effects, then encase it in a SAVE_EXPR
         so that it will only be evaluated once.  */
       /* The reference (r) and comparison (<) classes could be handled as
@@ -2160,12 +2186,12 @@ stabilize_reference_1 (tree e)
        return save_expr (e);
       return e;
 
-    case 'c':
+    case tcc_constant:
       /* Constants need no processing.  In fact, we should never reach
         here.  */
       return e;
 
-    case '2':
+    case tcc_binary:
       /* Division is slow and tends to be compiled with jumps,
         especially the division by powers of 2 that is often
         found inside of an array reference.  So do it just once.  */
@@ -2179,7 +2205,7 @@ stabilize_reference_1 (tree e)
                         stabilize_reference_1 (TREE_OPERAND (e, 1)));
       break;
 
-    case '1':
+    case tcc_unary:
       /* Recursively stabilize each operand.  */
       result = build_nt (code, stabilize_reference_1 (TREE_OPERAND (e, 0)));
       break;
@@ -2271,7 +2297,7 @@ do { tree _node = (NODE); \
       else
        ti = tc = false;
     }
-  else if (TREE_CODE_CLASS (TREE_CODE (node)) == 'c')
+  else if (CONSTANT_CLASS_P (node))
     ;
   else
     {
@@ -2319,10 +2345,10 @@ build1_stat (enum tree_code code, tree type, tree node MEM_STAT_DECL)
 #ifdef GATHER_STATISTICS
   switch (TREE_CODE_CLASS (code))
     {
-    case 's':  /* an expression with side effects */
+    case tcc_statement:  /* an expression with side effects */
       kind = s_kind;
       break;
-    case 'r':  /* a reference */
+    case tcc_reference:  /* a reference */
       kind = r_kind;
       break;
     default:
@@ -2357,7 +2383,7 @@ build1_stat (enum tree_code code, tree type, tree node MEM_STAT_DECL)
       TREE_READONLY (t) = TREE_READONLY (node);
     }
 
-  if (TREE_CODE_CLASS (code) == 's')
+  if (TREE_CODE_CLASS (code) == tcc_statement)
     TREE_SIDE_EFFECTS (t) = 1;
   else switch (code)
     {
@@ -2386,12 +2412,15 @@ build1_stat (enum tree_code code, tree type, tree node MEM_STAT_DECL)
       break;
 
     default:
-      if (TREE_CODE_CLASS (code) == '1' && node && !TYPE_P (node)
+      if (TREE_CODE_CLASS (code) == tcc_unary
+         && node && !TYPE_P (node)
          && TREE_CONSTANT (node))
        TREE_CONSTANT (t) = 1;
-      if (TREE_CODE_CLASS (code) == '1' && node && TREE_INVARIANT (node))
+      if (TREE_CODE_CLASS (code) == tcc_unary
+         && node && TREE_INVARIANT (node))
        TREE_INVARIANT (t) = 1;
-      if (TREE_CODE_CLASS (code) == 'r' && node && TREE_THIS_VOLATILE (node))
+      if (TREE_CODE_CLASS (code) == tcc_reference
+         && node && TREE_THIS_VOLATILE (node))
        TREE_THIS_VOLATILE (t) = 1;
       break;
     }
@@ -2435,8 +2464,8 @@ build2_stat (enum tree_code code, tree tt, tree arg0, tree arg1 MEM_STAT_DECL)
 
   /* Expressions without side effects may be constant if their
      arguments are as well.  */
-  constant = (TREE_CODE_CLASS (code) == '<'
-             || TREE_CODE_CLASS (code) == '2');
+  constant = (TREE_CODE_CLASS (code) == tcc_comparison
+             || TREE_CODE_CLASS (code) == tcc_binary);
   read_only = 1;
   side_effects = TREE_SIDE_EFFECTS (t);
   invariant = constant;
@@ -2449,7 +2478,8 @@ build2_stat (enum tree_code code, tree tt, tree arg0, tree arg1 MEM_STAT_DECL)
   TREE_INVARIANT (t) = invariant;
   TREE_SIDE_EFFECTS (t) = side_effects;
   TREE_THIS_VOLATILE (t)
-    = TREE_CODE_CLASS (code) == 'r' && arg0 && TREE_THIS_VOLATILE (arg0);
+    = (TREE_CODE_CLASS (code) == tcc_reference
+       && arg0 && TREE_THIS_VOLATILE (arg0));
 
   return t;
 }
@@ -2497,7 +2527,8 @@ build3_stat (enum tree_code code, tree tt, tree arg0, tree arg1,
 
   TREE_SIDE_EFFECTS (t) = side_effects;
   TREE_THIS_VOLATILE (t)
-    = TREE_CODE_CLASS (code) == 'r' && arg0 && TREE_THIS_VOLATILE (arg0);
+    = (TREE_CODE_CLASS (code) == tcc_reference
+       && arg0 && TREE_THIS_VOLATILE (arg0));
 
   return t;
 }
@@ -2526,7 +2557,8 @@ build4_stat (enum tree_code code, tree tt, tree arg0, tree arg1,
 
   TREE_SIDE_EFFECTS (t) = side_effects;
   TREE_THIS_VOLATILE (t)
-    = TREE_CODE_CLASS (code) == 'r' && arg0 && TREE_THIS_VOLATILE (arg0);
+    = (TREE_CODE_CLASS (code) == tcc_reference
+       && arg0 && TREE_THIS_VOLATILE (arg0));
 
   return t;
 }
@@ -3829,12 +3861,12 @@ simple_cst_equal (tree t1, tree t2)
 
   switch (TREE_CODE_CLASS (code1))
     {
-    case '1':
-    case '2':
-    case '<':
-    case 'e':
-    case 'r':
-    case 's':
+    case tcc_unary:
+    case tcc_binary:
+    case tcc_comparison:
+    case tcc_expression:
+    case tcc_reference:
+    case tcc_statement:
       cmp = 1;
       for (i = 0; i < TREE_CODE_LENGTH (code1); i++)
        {
@@ -3976,7 +4008,7 @@ iterative_hash_expr (tree t, hashval_t val)
     default:
       class = TREE_CODE_CLASS (code);
 
-      if (class == 'd')
+      if (class == tcc_declaration)
        {
          /* Decls we can just compare by pointer.  */
          val = iterative_hash_pointer (t, val);
@@ -4774,7 +4806,8 @@ find_var_from_fn (tree *tp, int *walk_subtrees, void *data)
   if (TYPE_P (*tp))
     *walk_subtrees = 0;
 
-  else if (DECL_P (*tp) && lang_hooks.tree_inlining.auto_var_in_fn_p (*tp, fn))
+  else if (DECL_P (*tp)
+          && lang_hooks.tree_inlining.auto_var_in_fn_p (*tp, fn))
     return *tp;
 
   return NULL_TREE;
@@ -5312,12 +5345,13 @@ tree_not_check_failed (const tree node, const char *file,
    code, given in CL.  */
 
 void
-tree_class_check_failed (const tree node, int cl, const char *file,
-                        int line, const char *function)
+tree_class_check_failed (const tree node, const enum tree_code_class cl,
+                        const char *file, int line, const char *function)
 {
   internal_error
-    ("tree check: expected class %qc, have %qc (%s) in %s, at %s:%d",
-     cl, TREE_CODE_CLASS (TREE_CODE (node)),
+    ("tree check: expected class %qs, have %qs (%s) in %s, at %s:%d",
+     TREE_CODE_CLASS_STRING (cl),
+     TREE_CODE_CLASS_STRING (TREE_CODE_CLASS (TREE_CODE (node))),
      tree_code_name[TREE_CODE (node)], function, trim_filename (file), line);
 }
 
index fc7ed81..c050742 100644 (file)
@@ -21,49 +21,37 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 02111-1307, USA.  */
 
 
-/* The third argument can be:
-   'x' for an exceptional code (fits no category).
-   't' for a type object code.
-   'c' for codes for constants.
-   'd' for codes for declarations (also serving as variable refs).
-   'r' for codes for references to storage.
-   '<' for codes for comparison expressions.
-   '1' for codes for unary arithmetic expressions.
-   '2' for codes for binary arithmetic expressions.
-   's' for codes for "statement" expressions, which have side-effects,
-       but usually no interesting value.
-   'e' for codes for other kinds of expressions.  */
-
-/* For `r', `e', `<', `1', `2', and `s' nodes, which use struct
-   tree_exp, the 4th element is the number of argument slots to
-   allocate.  This determines the size of the tree node object.
-   Other nodes use different structures, and the size is determined
-   by the tree_union member structure; the 4th element should be
-   zero.  Languages that define language-specific 'x' or 'c' codes
-   must define the tree_size langhook to say how big they are.  */
+/* For tcc_references, tcc_expression, tcc_comparison, tcc_unary,
+   tcc_binary, and tcc_statement nodes, which use struct tree_exp, the
+   4th element is the number of argument slots to allocate.  This
+   determines the size of the tree node object.  Other nodes use
+   different structures, and the size is determined by the tree_union
+   member structure; the 4th element should be zero.  Languages that
+   define language-specific tcc_exceptional or tcc_constant codes must
+   define the tree_size langhook to say how big they are.  */
 
 /* Any erroneous construct is parsed into a node of this type.
    This type of node is accepted without complaint in all contexts
    by later parsing activities, to avoid multiple error messages
    for one error.
    No fields in these nodes are used except the TREE_CODE.  */
-DEFTREECODE (ERROR_MARK, "error_mark", 'x', 0)
+DEFTREECODE (ERROR_MARK, "error_mark", tcc_exceptional, 0)
 
 /* Used to represent a name (such as, in the DECL_NAME of a decl node).
    Internally it looks like a STRING_CST node.
    There is only one IDENTIFIER_NODE ever made for any particular name.
    Use `get_identifier' to get it (or create it, the first time).  */
-DEFTREECODE (IDENTIFIER_NODE, "identifier_node", 'x', 0)
+DEFTREECODE (IDENTIFIER_NODE, "identifier_node", tcc_exceptional, 0)
 
 /* Has the TREE_VALUE and TREE_PURPOSE fields.  */
 /* These nodes are made into lists by chaining through the
    TREE_CHAIN field.  The elements of the list live in the
    TREE_VALUE fields, while TREE_PURPOSE fields are occasionally
    used as well to get the effect of Lisp association lists.  */
-DEFTREECODE (TREE_LIST, "tree_list", 'x', 0)
+DEFTREECODE (TREE_LIST, "tree_list", tcc_exceptional, 0)
 
 /* These nodes contain an array of tree nodes.  */
-DEFTREECODE (TREE_VEC, "tree_vec", 'x', 0)
+DEFTREECODE (TREE_VEC, "tree_vec", tcc_exceptional, 0)
 
 /* A symbol binding block.  These are arranged in a tree,
    where the BLOCK_SUBBLOCKS field contains a chain of subblocks
@@ -85,7 +73,7 @@ DEFTREECODE (TREE_VEC, "tree_vec", 'x', 0)
    instance of an inline function).
    TREE_ASM_WRITTEN is nonzero if the block was actually referenced
    in the generated assembly.  */
-DEFTREECODE (BLOCK, "block", 'x', 0)
+DEFTREECODE (BLOCK, "block", tcc_exceptional, 0)
 \f
 /* Each data type is represented by a tree node whose code is one of
    the following:  */
@@ -130,7 +118,8 @@ DEFTREECODE (BLOCK, "block", 'x', 0)
     ENUMERAL_TYPE, RECORD_TYPE, UNION_TYPE, and QUAL_UNION_TYPE nodes;
     see below.  */
 
-DEFTREECODE (VOID_TYPE, "void_type", 't', 0)   /* The void type in C */
+DEFTREECODE (VOID_TYPE, "void_type", tcc_type, 0)
+       /* The void type in C */
 
 /* Integer types in all languages, including char in C.
    Also used for sub-ranges of other discrete types.
@@ -140,20 +129,20 @@ DEFTREECODE (VOID_TYPE, "void_type", 't', 0)      /* The void type in C */
    of this will point at the supertype (another INTEGER_TYPE,
    or an ENUMERAL_TYPE, CHAR_TYPE, or BOOLEAN_TYPE).
    Otherwise, the TREE_TYPE is zero.  */
-DEFTREECODE (INTEGER_TYPE, "integer_type", 't', 0)
+DEFTREECODE (INTEGER_TYPE, "integer_type", tcc_type, 0)
 
 /* C's float and double.  Different floating types are distinguished
    by machine mode and by the TYPE_SIZE and the TYPE_PRECISION.  */
-DEFTREECODE (REAL_TYPE, "real_type", 't', 0)
+DEFTREECODE (REAL_TYPE, "real_type", tcc_type, 0)
 
 /* Complex number types.  The TREE_TYPE field is the data type
    of the real and imaginary parts.  */
-DEFTREECODE (COMPLEX_TYPE, "complex_type", 't', 0)
+DEFTREECODE (COMPLEX_TYPE, "complex_type", tcc_type, 0)
 
 /* Vector types.  The TREE_TYPE field is the data type of the vector
    elements.  The TYPE_PRECISION field is the number of subparts of
    the vector.  */
-DEFTREECODE (VECTOR_TYPE, "vector_type", 't', 0)
+DEFTREECODE (VECTOR_TYPE, "vector_type", tcc_type, 0)
 
 /* C enums.  The type node looks just like an INTEGER_TYPE node.
    The symbols for the values of the enum type are defined by
@@ -166,39 +155,39 @@ DEFTREECODE (VECTOR_TYPE, "vector_type", 't', 0)
    fields are filled in.
    RECORD_TYPE, UNION_TYPE, and QUAL_UNION_TYPE forward refs are
    treated similarly.  */
-DEFTREECODE (ENUMERAL_TYPE, "enumeral_type", 't', 0)
+DEFTREECODE (ENUMERAL_TYPE, "enumeral_type", tcc_type, 0)
 
 /* Pascal's boolean type (true or false are the only values);
    no special fields needed.  */
-DEFTREECODE (BOOLEAN_TYPE, "boolean_type", 't', 0)
+DEFTREECODE (BOOLEAN_TYPE, "boolean_type", tcc_type, 0)
 
 /* CHAR in Pascal; not used in C.
    No special fields needed.  */
-DEFTREECODE (CHAR_TYPE, "char_type", 't', 0)
+DEFTREECODE (CHAR_TYPE, "char_type", tcc_type, 0)
 
 /* All pointer-to-x types have code POINTER_TYPE.
    The TREE_TYPE points to the node for the type pointed to.  */
-DEFTREECODE (POINTER_TYPE, "pointer_type", 't', 0)
+DEFTREECODE (POINTER_TYPE, "pointer_type", tcc_type, 0)
 
 /* An offset is a pointer relative to an object.
    The TREE_TYPE field is the type of the object at the offset.
    The TYPE_OFFSET_BASETYPE points to the node for the type of object
    that the offset is relative to.  */
-DEFTREECODE (OFFSET_TYPE, "offset_type", 't', 0)
+DEFTREECODE (OFFSET_TYPE, "offset_type", tcc_type, 0)
 
 /* A reference is like a pointer except that it is coerced
    automatically to the value it points to.  Used in C++.  */
-DEFTREECODE (REFERENCE_TYPE, "reference_type", 't', 0)
+DEFTREECODE (REFERENCE_TYPE, "reference_type", tcc_type, 0)
 
 /* METHOD_TYPE is the type of a function which takes an extra first
    argument for "self", which is not present in the declared argument list.
    The TREE_TYPE is the return type of the method.  The TYPE_METHOD_BASETYPE
    is the type of "self".  TYPE_ARG_TYPES is the real argument list, which
    includes the hidden argument for "self".  */
-DEFTREECODE (METHOD_TYPE, "method_type", 't', 0)
+DEFTREECODE (METHOD_TYPE, "method_type", tcc_type, 0)
 
 /* Used for Pascal; details not determined right now.  */
-DEFTREECODE (FILE_TYPE, "file_type", 't', 0)
+DEFTREECODE (FILE_TYPE, "file_type", tcc_type, 0)
 
 /* Types of arrays.  Special fields:
    TREE_TYPE             Type of an array element.
@@ -209,13 +198,13 @@ DEFTREECODE (FILE_TYPE, "file_type", 't', 0)
  TYPE_STRING_FLAG indicates a string (in contrast to an array of chars)
  in languages (such as Chill) that make a distinction.  */
 /* Array types in C or Pascal */
-DEFTREECODE (ARRAY_TYPE, "array_type", 't', 0)
+DEFTREECODE (ARRAY_TYPE, "array_type", tcc_type, 0)
 
 /* Types of sets for Pascal.  Special fields are the same as
    in an array type.  The target type is always a boolean type.
    Used for both bitstrings and powersets in Chill;
    TYPE_STRING_FLAG indicates a bitstring.  */
-DEFTREECODE (SET_TYPE, "set_type", 't', 0)
+DEFTREECODE (SET_TYPE, "set_type", tcc_type, 0)
 
 /* Struct in C, or record in Pascal.  */
 /* Special fields:
@@ -225,19 +214,19 @@ DEFTREECODE (SET_TYPE, "set_type", 't', 0)
    A few may need to be added for Pascal.  */
 /* See the comment above, before ENUMERAL_TYPE, for how
    forward references to struct tags are handled in C.  */
-DEFTREECODE (RECORD_TYPE, "record_type", 't', 0)
+DEFTREECODE (RECORD_TYPE, "record_type", tcc_type, 0)
 
 /* Union in C.  Like a struct, except that the offsets of the fields
    will all be zero.  */
 /* See the comment above, before ENUMERAL_TYPE, for how
    forward references to union tags are handled in C.  */
-DEFTREECODE (UNION_TYPE, "union_type", 't', 0) /* C union type */
+DEFTREECODE (UNION_TYPE, "union_type", tcc_type, 0)    /* C union type */
 
 /* Similar to UNION_TYPE, except that the expressions in DECL_QUALIFIER
    in each FIELD_DECL determine what the union contains.  The first
    field whose DECL_QUALIFIER expression is true is deemed to occupy
    the union.  */
-DEFTREECODE (QUAL_UNION_TYPE, "qual_union_type", 't', 0)
+DEFTREECODE (QUAL_UNION_TYPE, "qual_union_type", tcc_type, 0)
 
 /* Type of functions.  Special fields:
    TREE_TYPE               type of value returned.
@@ -245,13 +234,13 @@ DEFTREECODE (QUAL_UNION_TYPE, "qual_union_type", 't', 0)
        this list is made of TREE_LIST nodes.
    Types of "Procedures" in languages where they are different from functions
    have code FUNCTION_TYPE also, but then TREE_TYPE is zero or void type.  */
-DEFTREECODE (FUNCTION_TYPE, "function_type", 't', 0)
+DEFTREECODE (FUNCTION_TYPE, "function_type", tcc_type, 0)
 
 /* This is a language-specific kind of type.
    Its meaning is defined by the language front end.
    layout_type does not know how to lay this out,
    so the front-end must do so manually.  */
-DEFTREECODE (LANG_TYPE, "lang_type", 't', 0)
+DEFTREECODE (LANG_TYPE, "lang_type", tcc_type, 0)
 \f
 /* Expressions */
 
@@ -265,20 +254,20 @@ DEFTREECODE (LANG_TYPE, "lang_type", 't', 0)
    TREE_CONSTANT_OVERFLOW already set, it is known to be unique.
    INTEGER_CST nodes are created for the integral types, for pointer
    types and for vector and float types in some circumstances.  */
-DEFTREECODE (INTEGER_CST, "integer_cst", 'c', 0)
+DEFTREECODE (INTEGER_CST, "integer_cst", tcc_constant, 0)
 
 /* Contents are in TREE_REAL_CST field.  */
-DEFTREECODE (REAL_CST, "real_cst", 'c', 0)
+DEFTREECODE (REAL_CST, "real_cst", tcc_constant, 0)
 
 /* Contents are in TREE_REALPART and TREE_IMAGPART fields,
    whose contents are other constant nodes.  */
-DEFTREECODE (COMPLEX_CST, "complex_cst", 'c', 0)
+DEFTREECODE (COMPLEX_CST, "complex_cst", tcc_constant, 0)
 
 /* Contents are in TREE_VECTOR_CST_ELTS field.  */
-DEFTREECODE (VECTOR_CST, "vector_cst", 'c', 0)
+DEFTREECODE (VECTOR_CST, "vector_cst", tcc_constant, 0)
 
 /* Contents are TREE_STRING_LENGTH and TREE_STRING_POINTER fields.  */
-DEFTREECODE (STRING_CST, "string_cst", 'c', 0)
+DEFTREECODE (STRING_CST, "string_cst", tcc_constant, 0)
 
 /* Declarations.  All references to names are represented as ..._DECL
    nodes.  The decls in one binding context are chained through the
@@ -338,22 +327,23 @@ DEFTREECODE (STRING_CST, "string_cst", 'c', 0)
    of a decl (i.e. one which is nested within an abstract instance of a
    inline function.  */
 
-DEFTREECODE (FUNCTION_DECL, "function_decl", 'd', 0)
-DEFTREECODE (LABEL_DECL, "label_decl", 'd', 0)
-DEFTREECODE (CONST_DECL, "const_decl", 'd', 0)
-DEFTREECODE (TYPE_DECL, "type_decl", 'd', 0)
-DEFTREECODE (VAR_DECL, "var_decl", 'd', 0)
-DEFTREECODE (PARM_DECL, "parm_decl", 'd', 0)
-DEFTREECODE (RESULT_DECL, "result_decl", 'd', 0)
-DEFTREECODE (FIELD_DECL, "field_decl", 'd', 0)
+DEFTREECODE (FUNCTION_DECL, "function_decl", tcc_declaration, 0)
+DEFTREECODE (LABEL_DECL, "label_decl", tcc_declaration, 0)
+DEFTREECODE (CONST_DECL, "const_decl", tcc_declaration, 0)
+DEFTREECODE (TYPE_DECL, "type_decl", tcc_declaration, 0)
+DEFTREECODE (VAR_DECL, "var_decl", tcc_declaration, 0)
+DEFTREECODE (PARM_DECL, "parm_decl", tcc_declaration, 0)
+DEFTREECODE (RESULT_DECL, "result_decl", tcc_declaration, 0)
+DEFTREECODE (FIELD_DECL, "field_decl", tcc_declaration, 0)
 
 /* A namespace declaration.  Namespaces appear in DECL_CONTEXT of other
    _DECLs, providing a hierarchy of names.  */
-DEFTREECODE (NAMESPACE_DECL, "namespace_decl", 'd', 0)
+DEFTREECODE (NAMESPACE_DECL, "namespace_decl", tcc_declaration, 0)
 
 /* A translation unit.  This is not technically a declaration, since it
    can't be looked up, but it's close enough.  */
-DEFTREECODE (TRANSLATION_UNIT_DECL, "translation_unit_decl", 'd', 0)
+DEFTREECODE (TRANSLATION_UNIT_DECL, "translation_unit_decl",\
+            tcc_declaration, 0)
 \f
 /* References to storage.  */
 
@@ -362,7 +352,7 @@ DEFTREECODE (TRANSLATION_UNIT_DECL, "translation_unit_decl", 'd', 0)
    Operand 1 is the field (a node of type FIELD_DECL).
    Operand 2, if present, is the value of DECL_FIELD_OFFSET, measured
    in units of DECL_OFFSET_ALIGN / BITS_PER_UNIT.  */
-DEFTREECODE (COMPONENT_REF, "component_ref", 'r', 3)
+DEFTREECODE (COMPONENT_REF, "component_ref", tcc_reference, 3)
 
 /* Reference to a group of bits within an object.  Similar to COMPONENT_REF
    except the position is given explicitly rather than via a FIELD_DECL.
@@ -371,22 +361,22 @@ DEFTREECODE (COMPONENT_REF, "component_ref", 'r', 3)
    operand 2 is a tree giving the position of the first referenced bit.
    The field can be either a signed or unsigned field;
    BIT_FIELD_REF_UNSIGNED says which.  */
-DEFTREECODE (BIT_FIELD_REF, "bit_field_ref", 'r', 3)
+DEFTREECODE (BIT_FIELD_REF, "bit_field_ref", tcc_reference, 3)
 
 /* C unary `*' or Pascal `^'.  One operand, an expression for a pointer.  */
-DEFTREECODE (INDIRECT_REF, "indirect_ref", 'r', 1)
+DEFTREECODE (INDIRECT_REF, "indirect_ref", tcc_reference, 1)
 
 /* Array indexing.
    Operand 0 is the array; operand 1 is a (single) array index.
    Operand 2, if present, is a copy of TYPE_MIN_VALUE of the index.
    Operand 3, if present, is the element size, measured in units of
    the alignment of the element type.  */
-DEFTREECODE (ARRAY_REF, "array_ref", 'r', 4)
+DEFTREECODE (ARRAY_REF, "array_ref", tcc_reference, 4)
 
 /* Likewise, except that the result is a range ("slice") of the array.  The
    starting index of the resulting array is taken from operand 1 and the size
    of the range is taken from the type of the expression.  */
-DEFTREECODE (ARRAY_RANGE_REF, "array_range_ref", 'r', 4)
+DEFTREECODE (ARRAY_RANGE_REF, "array_range_ref", tcc_reference, 4)
 
 /* Used to represent lookup of runtime type dependent data.  Often this is
    a reference to a vtable, but it needn't be.  Operands are:
@@ -398,13 +388,13 @@ DEFTREECODE (ARRAY_RANGE_REF, "array_range_ref", 'r', 4)
    reference to something simpler, usually to the address of a DECL.
    Never touched by the middle-end.  Good choices would be either an
    identifier or a vtable index.  */
-DEFTREECODE (OBJ_TYPE_REF, "obj_type_ref", 'e', 3)
+DEFTREECODE (OBJ_TYPE_REF, "obj_type_ref", tcc_expression, 3)
 
 /* The exception object from the runtime.  */
-DEFTREECODE (EXC_PTR_EXPR, "exc_ptr_expr", 'e', 0)
+DEFTREECODE (EXC_PTR_EXPR, "exc_ptr_expr", tcc_expression, 0)
 
 /* The filter object from the runtime.  */
-DEFTREECODE (FILTER_EXPR, "filter_expr", 'e', 0)
+DEFTREECODE (FILTER_EXPR, "filter_expr", tcc_expression, 0)
 
 /* Constructor: return an aggregate value made from specified components.
    In C, this is used only for structure and array initializers.
@@ -426,7 +416,7 @@ DEFTREECODE (FILTER_EXPR, "filter_expr", 'e', 0)
    The TREE_VALUE specifies a value (index) in the set that is true.
    If TREE_PURPOSE is non-NULL, it specifies the lower limit of a
    range of true values.  Elements not listed are false (not in the set).  */
-DEFTREECODE (CONSTRUCTOR, "constructor", 'e', 1)
+DEFTREECODE (CONSTRUCTOR, "constructor", tcc_expression, 1)
 
 /* The expression types are mostly straightforward, with the fourth argument
    of DEFTREECODE saying how many operands there are.
@@ -436,14 +426,14 @@ DEFTREECODE (CONSTRUCTOR, "constructor", 'e', 1)
 /* Contains two expressions to compute, one followed by the other.
    the first value is ignored.  The second one's value is used.  The
    type of the first expression need not agree with the other types.  */
-DEFTREECODE (COMPOUND_EXPR, "compound_expr", 'e', 2)
+DEFTREECODE (COMPOUND_EXPR, "compound_expr", tcc_expression, 2)
 
 /* Assignment expression.  Operand 0 is the what to set; 1, the new value.  */
-DEFTREECODE (MODIFY_EXPR, "modify_expr", 'e', 2)
+DEFTREECODE (MODIFY_EXPR, "modify_expr", tcc_expression, 2)
 
 /* Initialization expression.  Operand 0 is the variable to initialize;
    Operand 1 is the initializer.  */
-DEFTREECODE (INIT_EXPR, "init_expr", 'e', 2)
+DEFTREECODE (INIT_EXPR, "init_expr", tcc_expression, 2)
 
 /* For TARGET_EXPR, operand 0 is the target of an initialization,
    operand 1 is the initializer for the target, which may be void
@@ -451,7 +441,7 @@ DEFTREECODE (INIT_EXPR, "init_expr", 'e', 2)
    operand 2 is the cleanup for this node, if any.
    operand 3 is the saved initializer after this node has been
    expanded once; this is so we can re-expand the tree later.  */
-DEFTREECODE (TARGET_EXPR, "target_expr", 'e', 4)
+DEFTREECODE (TARGET_EXPR, "target_expr", tcc_expression, 4)
 
 /* Conditional expression ( ... ? ... : ...  in C).
    Operand 0 is the condition.
@@ -461,7 +451,7 @@ DEFTREECODE (TARGET_EXPR, "target_expr", 'e', 4)
    Operand 1 must have the same type as the entire expression, unless
    it unconditionally throws an exception, in which case it should
    have VOID_TYPE.  The same constraints apply to operand 2.  */
-DEFTREECODE (COND_EXPR, "cond_expr", 'e', 3)
+DEFTREECODE (COND_EXPR, "cond_expr", tcc_expression, 3)
 
 /* Declare local variables, including making RTL and allocating space.
    BIND_EXPR_VARS is a chain of VAR_DECL nodes for the variables.
@@ -484,25 +474,25 @@ DEFTREECODE (COND_EXPR, "cond_expr", 'e', 3)
    In order for the BIND_EXPR to be known at all, the code that creates it
    must also install it as a subblock in the tree of BLOCK
    nodes for the function.  */
-DEFTREECODE (BIND_EXPR, "bind_expr", 'e', 3)
+DEFTREECODE (BIND_EXPR, "bind_expr", tcc_expression, 3)
 
 /* A labeled block. Operand 0 is the label that will be generated to
    mark the end of the block.
    Operand 1 is the labeled block body.  */
-DEFTREECODE (LABELED_BLOCK_EXPR, "labeled_block_expr", 'e', 2)
+DEFTREECODE (LABELED_BLOCK_EXPR, "labeled_block_expr", tcc_expression, 2)
 
 /* Function call.  Operand 0 is the function.
    Operand 1 is the argument list, a list of expressions
    made out of a chain of TREE_LIST nodes.
    Operand 2 is the static chain argument, or NULL.  */
-DEFTREECODE (CALL_EXPR, "call_expr", 'e', 3)
+DEFTREECODE (CALL_EXPR, "call_expr", tcc_expression, 3)
 
 /* Specify a value to compute along with its corresponding cleanup.
    Operand 0 is the cleanup expression.
    The cleanup is executed by the first enclosing CLEANUP_POINT_EXPR,
    which must exist.  This differs from TRY_CATCH_EXPR in that operand 1
    is always evaluated when cleanups are run.  */
-DEFTREECODE (WITH_CLEANUP_EXPR, "with_cleanup_expr", 'e', 1)
+DEFTREECODE (WITH_CLEANUP_EXPR, "with_cleanup_expr", tcc_expression, 1)
 
 /* Specify a cleanup point.
    Operand 0 is an expression that may have cleanups.  If it does, those
@@ -519,7 +509,7 @@ DEFTREECODE (WITH_CLEANUP_EXPR, "with_cleanup_expr", 'e', 1)
 
    As a consequence, the operand of a CLEANUP_POINT_EXPR must not have
    BLKmode, because it will not be forced out of memory.  */
-DEFTREECODE (CLEANUP_POINT_EXPR, "cleanup_point_expr", 'e', 1)
+DEFTREECODE (CLEANUP_POINT_EXPR, "cleanup_point_expr", tcc_expression, 1)
 
 /* The following two codes are used in languages that have types where
    some field in an object of the type contains a value that is used in
@@ -571,62 +561,62 @@ DEFTREECODE (CLEANUP_POINT_EXPR, "cleanup_point_expr", 'e', 1)
 
 /* Denotes a record to later be substituted before evaluating this expression.
    The type of this expression is used to find the record to replace it.  */
-DEFTREECODE (PLACEHOLDER_EXPR, "placeholder_expr", 'x', 0)
+DEFTREECODE (PLACEHOLDER_EXPR, "placeholder_expr", tcc_exceptional, 0)
 
 /* Simple arithmetic.  */
-DEFTREECODE (PLUS_EXPR, "plus_expr", '2', 2)
-DEFTREECODE (MINUS_EXPR, "minus_expr", '2', 2)
-DEFTREECODE (MULT_EXPR, "mult_expr", '2', 2)
+DEFTREECODE (PLUS_EXPR, "plus_expr", tcc_binary, 2)
+DEFTREECODE (MINUS_EXPR, "minus_expr", tcc_binary, 2)
+DEFTREECODE (MULT_EXPR, "mult_expr", tcc_binary, 2)
 
 /* Division for integer result that rounds the quotient toward zero.  */
-DEFTREECODE (TRUNC_DIV_EXPR, "trunc_div_expr", '2', 2)
+DEFTREECODE (TRUNC_DIV_EXPR, "trunc_div_expr", tcc_binary, 2)
 
 /* Division for integer result that rounds the quotient toward infinity.  */
-DEFTREECODE (CEIL_DIV_EXPR, "ceil_div_expr", '2', 2)
+DEFTREECODE (CEIL_DIV_EXPR, "ceil_div_expr", tcc_binary, 2)
 
 /* Division for integer result that rounds toward minus infinity.  */
-DEFTREECODE (FLOOR_DIV_EXPR, "floor_div_expr", '2', 2)
+DEFTREECODE (FLOOR_DIV_EXPR, "floor_div_expr", tcc_binary, 2)
 
 /* Division for integer result that rounds toward nearest integer.  */
-DEFTREECODE (ROUND_DIV_EXPR, "round_div_expr", '2', 2)
+DEFTREECODE (ROUND_DIV_EXPR, "round_div_expr", tcc_binary, 2)
 
 /* Four kinds of remainder that go with the four kinds of division.  */
-DEFTREECODE (TRUNC_MOD_EXPR, "trunc_mod_expr", '2', 2)
-DEFTREECODE (CEIL_MOD_EXPR, "ceil_mod_expr", '2', 2)
-DEFTREECODE (FLOOR_MOD_EXPR, "floor_mod_expr", '2', 2)
-DEFTREECODE (ROUND_MOD_EXPR, "round_mod_expr", '2', 2)
+DEFTREECODE (TRUNC_MOD_EXPR, "trunc_mod_expr", tcc_binary, 2)
+DEFTREECODE (CEIL_MOD_EXPR, "ceil_mod_expr", tcc_binary, 2)
+DEFTREECODE (FLOOR_MOD_EXPR, "floor_mod_expr", tcc_binary, 2)
+DEFTREECODE (ROUND_MOD_EXPR, "round_mod_expr", tcc_binary, 2)
 
 /* Division for real result.  */
-DEFTREECODE (RDIV_EXPR, "rdiv_expr", '2', 2)
+DEFTREECODE (RDIV_EXPR, "rdiv_expr", tcc_binary, 2)
 
 /* Division which is not supposed to need rounding.
    Used for pointer subtraction in C.  */
-DEFTREECODE (EXACT_DIV_EXPR, "exact_div_expr", '2', 2)
+DEFTREECODE (EXACT_DIV_EXPR, "exact_div_expr", tcc_binary, 2)
 
 /* Conversion of real to fixed point: four ways to round,
    like the four ways to divide.
    CONVERT_EXPR can also be used to convert a real to an integer,
    and that is what is used in languages that do not have ways of
    specifying which of these is wanted.  Maybe these are not needed.  */
-DEFTREECODE (FIX_TRUNC_EXPR, "fix_trunc_expr", '1', 1)
-DEFTREECODE (FIX_CEIL_EXPR, "fix_ceil_expr", '1', 1)
-DEFTREECODE (FIX_FLOOR_EXPR, "fix_floor_expr", '1', 1)
-DEFTREECODE (FIX_ROUND_EXPR, "fix_round_expr", '1', 1)
+DEFTREECODE (FIX_TRUNC_EXPR, "fix_trunc_expr", tcc_unary, 1)
+DEFTREECODE (FIX_CEIL_EXPR, "fix_ceil_expr", tcc_unary, 1)
+DEFTREECODE (FIX_FLOOR_EXPR, "fix_floor_expr", tcc_unary, 1)
+DEFTREECODE (FIX_ROUND_EXPR, "fix_round_expr", tcc_unary, 1)
 
 /* Conversion of an integer to a real.  */
-DEFTREECODE (FLOAT_EXPR, "float_expr", '1', 1)
+DEFTREECODE (FLOAT_EXPR, "float_expr", tcc_unary, 1)
 
 /* Unary negation.  */
-DEFTREECODE (NEGATE_EXPR, "negate_expr", '1', 1)
+DEFTREECODE (NEGATE_EXPR, "negate_expr", tcc_unary, 1)
 
-DEFTREECODE (MIN_EXPR, "min_expr", '2', 2)
-DEFTREECODE (MAX_EXPR, "max_expr", '2', 2)
+DEFTREECODE (MIN_EXPR, "min_expr", tcc_binary, 2)
+DEFTREECODE (MAX_EXPR, "max_expr", tcc_binary, 2)
 
 /* Represents the absolute value of the operand.
 
    An ABS_EXPR must have either an INTEGER_TYPE or a REAL_TYPE.  The
    operand of the ABS_EXPR must have the same type.  */
-DEFTREECODE (ABS_EXPR, "abs_expr", '1', 1)
+DEFTREECODE (ABS_EXPR, "abs_expr", tcc_unary, 1)
 
 /* Shift operations for shift and rotate.
    Shift means logical shift if done on an
@@ -635,16 +625,16 @@ DEFTREECODE (ABS_EXPR, "abs_expr", '1', 1)
    shift by; it need not be the same type as the first operand and result.
    Note that the result is undefined if the second operand is larger
    than the first operand's type size.  */
-DEFTREECODE (LSHIFT_EXPR, "lshift_expr", '2', 2)
-DEFTREECODE (RSHIFT_EXPR, "rshift_expr", '2', 2)
-DEFTREECODE (LROTATE_EXPR, "lrotate_expr", '2', 2)
-DEFTREECODE (RROTATE_EXPR, "rrotate_expr", '2', 2)
+DEFTREECODE (LSHIFT_EXPR, "lshift_expr", tcc_binary, 2)
+DEFTREECODE (RSHIFT_EXPR, "rshift_expr", tcc_binary, 2)
+DEFTREECODE (LROTATE_EXPR, "lrotate_expr", tcc_binary, 2)
+DEFTREECODE (RROTATE_EXPR, "rrotate_expr", tcc_binary, 2)
 
 /* Bitwise operations.  Operands have same mode as result.  */
-DEFTREECODE (BIT_IOR_EXPR, "bit_ior_expr", '2', 2)
-DEFTREECODE (BIT_XOR_EXPR, "bit_xor_expr", '2', 2)
-DEFTREECODE (BIT_AND_EXPR, "bit_and_expr", '2', 2)
-DEFTREECODE (BIT_NOT_EXPR, "bit_not_expr", '1', 1)
+DEFTREECODE (BIT_IOR_EXPR, "bit_ior_expr", tcc_binary, 2)
+DEFTREECODE (BIT_XOR_EXPR, "bit_xor_expr", tcc_binary, 2)
+DEFTREECODE (BIT_AND_EXPR, "bit_and_expr", tcc_binary, 2)
+DEFTREECODE (BIT_NOT_EXPR, "bit_not_expr", tcc_unary, 1)
 
 /* ANDIF and ORIF allow the second operand not to be computed if the
    value of the expression is determined from the first operand.  AND,
@@ -655,12 +645,12 @@ DEFTREECODE (BIT_NOT_EXPR, "bit_not_expr", '1', 1)
    an INTEGER_TYPE VAR_DECL as its argument; instead, a NE_EXPR will be
    used to compare the VAR_DECL to zero, thereby obtaining a node with
    value zero or one.  */
-DEFTREECODE (TRUTH_ANDIF_EXPR, "truth_andif_expr", 'e', 2)
-DEFTREECODE (TRUTH_ORIF_EXPR, "truth_orif_expr", 'e', 2)
-DEFTREECODE (TRUTH_AND_EXPR, "truth_and_expr", 'e', 2)
-DEFTREECODE (TRUTH_OR_EXPR, "truth_or_expr", 'e', 2)
-DEFTREECODE (TRUTH_XOR_EXPR, "truth_xor_expr", 'e', 2)
-DEFTREECODE (TRUTH_NOT_EXPR, "truth_not_expr", 'e', 1)
+DEFTREECODE (TRUTH_ANDIF_EXPR, "truth_andif_expr", tcc_expression, 2)
+DEFTREECODE (TRUTH_ORIF_EXPR, "truth_orif_expr", tcc_expression, 2)
+DEFTREECODE (TRUTH_AND_EXPR, "truth_and_expr", tcc_expression, 2)
+DEFTREECODE (TRUTH_OR_EXPR, "truth_or_expr", tcc_expression, 2)
+DEFTREECODE (TRUTH_XOR_EXPR, "truth_xor_expr", tcc_expression, 2)
+DEFTREECODE (TRUTH_NOT_EXPR, "truth_not_expr", tcc_expression, 1)
 
 /* Relational operators.
    `EQ_EXPR' and `NE_EXPR' are allowed for any types.
@@ -668,39 +658,39 @@ DEFTREECODE (TRUTH_NOT_EXPR, "truth_not_expr", 'e', 1)
    or real types.
    In all cases the operands will have the same type,
    and the value is always the type used by the language for booleans.  */
-DEFTREECODE (LT_EXPR, "lt_expr", '<', 2)
-DEFTREECODE (LE_EXPR, "le_expr", '<', 2)
-DEFTREECODE (GT_EXPR, "gt_expr", '<', 2)
-DEFTREECODE (GE_EXPR, "ge_expr", '<', 2)
-DEFTREECODE (EQ_EXPR, "eq_expr", '<', 2)
-DEFTREECODE (NE_EXPR, "ne_expr", '<', 2)
+DEFTREECODE (LT_EXPR, "lt_expr", tcc_comparison, 2)
+DEFTREECODE (LE_EXPR, "le_expr", tcc_comparison, 2)
+DEFTREECODE (GT_EXPR, "gt_expr", tcc_comparison, 2)
+DEFTREECODE (GE_EXPR, "ge_expr", tcc_comparison, 2)
+DEFTREECODE (EQ_EXPR, "eq_expr", tcc_comparison, 2)
+DEFTREECODE (NE_EXPR, "ne_expr", tcc_comparison, 2)
 
 /* Additional relational operators for floating point unordered.  */
-DEFTREECODE (UNORDERED_EXPR, "unordered_expr", '<', 2)
-DEFTREECODE (ORDERED_EXPR, "ordered_expr", '<', 2)
+DEFTREECODE (UNORDERED_EXPR, "unordered_expr", tcc_comparison, 2)
+DEFTREECODE (ORDERED_EXPR, "ordered_expr", tcc_comparison, 2)
 
 /* These are equivalent to unordered or ...  */
-DEFTREECODE (UNLT_EXPR, "unlt_expr", '<', 2)
-DEFTREECODE (UNLE_EXPR, "unle_expr", '<', 2)
-DEFTREECODE (UNGT_EXPR, "ungt_expr", '<', 2)
-DEFTREECODE (UNGE_EXPR, "unge_expr", '<', 2)
-DEFTREECODE (UNEQ_EXPR, "uneq_expr", '<', 2)
+DEFTREECODE (UNLT_EXPR, "unlt_expr", tcc_comparison, 2)
+DEFTREECODE (UNLE_EXPR, "unle_expr", tcc_comparison, 2)
+DEFTREECODE (UNGT_EXPR, "ungt_expr", tcc_comparison, 2)
+DEFTREECODE (UNGE_EXPR, "unge_expr", tcc_comparison, 2)
+DEFTREECODE (UNEQ_EXPR, "uneq_expr", tcc_comparison, 2)
 
 /* This is the reverse of uneq_expr.  */
-DEFTREECODE (LTGT_EXPR, "ltgt_expr", '<', 2)
+DEFTREECODE (LTGT_EXPR, "ltgt_expr", tcc_comparison, 2)
 
-DEFTREECODE (RANGE_EXPR, "range_expr", '2', 2)
+DEFTREECODE (RANGE_EXPR, "range_expr", tcc_binary, 2)
 
 /* Represents a conversion of type of a value.
    All conversions, including implicit ones, must be
    represented by CONVERT_EXPR or NOP_EXPR nodes.  */
-DEFTREECODE (CONVERT_EXPR, "convert_expr", '1', 1)
+DEFTREECODE (CONVERT_EXPR, "convert_expr", tcc_unary, 1)
 
 /* Represents a conversion expected to require no code to be generated.  */
-DEFTREECODE (NOP_EXPR, "nop_expr", '1', 1)
+DEFTREECODE (NOP_EXPR, "nop_expr", tcc_unary, 1)
 
 /* Value is same as argument, but guaranteed not an lvalue.  */
-DEFTREECODE (NON_LVALUE_EXPR, "non_lvalue_expr", '1', 1)
+DEFTREECODE (NON_LVALUE_EXPR, "non_lvalue_expr", tcc_unary, 1)
 
 /* Represents viewing something of one type as being of a second type.
    This corresponds to an "Unchecked Conversion" in Ada and roughly to
@@ -712,91 +702,91 @@ DEFTREECODE (NON_LVALUE_EXPR, "non_lvalue_expr", '1', 1)
    case no actual data motion may occur.  TREE_ADDRESSABLE will be set in
    this case and GCC must abort if it could not do the operation without
    generating insns.  */
-DEFTREECODE (VIEW_CONVERT_EXPR, "view_convert_expr", 'r', 1)
+DEFTREECODE (VIEW_CONVERT_EXPR, "view_convert_expr", tcc_reference, 1)
 
 /* Represents something we computed once and will use multiple times.
    First operand is that expression.  After it is evaluated once, it
    will be replaced by the temporary variable that holds the value.  */
-DEFTREECODE (SAVE_EXPR, "save_expr", 'e', 1)
+DEFTREECODE (SAVE_EXPR, "save_expr", tcc_expression, 1)
 
 /* & in C.  Value is the address at which the operand's value resides.
    Operand may have any mode.  Result mode is Pmode.  */
-DEFTREECODE (ADDR_EXPR, "addr_expr", 'e', 1)
+DEFTREECODE (ADDR_EXPR, "addr_expr", tcc_expression, 1)
 
 /* Operand0 is a function constant; result is part N of a function
    descriptor of type ptr_mode.  */
-DEFTREECODE (FDESC_EXPR, "fdesc_expr", 'e', 2)
+DEFTREECODE (FDESC_EXPR, "fdesc_expr", tcc_expression, 2)
 
 /* Given two real or integer operands of the same type,
    returns a complex value of the corresponding complex type.  */
-DEFTREECODE (COMPLEX_EXPR, "complex_expr", '2', 2)
+DEFTREECODE (COMPLEX_EXPR, "complex_expr", tcc_binary, 2)
 
 /* Complex conjugate of operand.  Used only on complex types.  */
-DEFTREECODE (CONJ_EXPR, "conj_expr", '1', 1)
+DEFTREECODE (CONJ_EXPR, "conj_expr", tcc_unary, 1)
 
 /* Used only on an operand of complex type, these return
    a value of the corresponding component type.  */
-DEFTREECODE (REALPART_EXPR, "realpart_expr", 'r', 1)
-DEFTREECODE (IMAGPART_EXPR, "imagpart_expr", 'r', 1)
+DEFTREECODE (REALPART_EXPR, "realpart_expr", tcc_reference, 1)
+DEFTREECODE (IMAGPART_EXPR, "imagpart_expr", tcc_reference, 1)
 
 /* Nodes for ++ and -- in C.
    The second arg is how much to increment or decrement by.
    For a pointer, it would be the size of the object pointed to.  */
-DEFTREECODE (PREDECREMENT_EXPR, "predecrement_expr", 'e', 2)
-DEFTREECODE (PREINCREMENT_EXPR, "preincrement_expr", 'e', 2)
-DEFTREECODE (POSTDECREMENT_EXPR, "postdecrement_expr", 'e', 2)
-DEFTREECODE (POSTINCREMENT_EXPR, "postincrement_expr", 'e', 2)
+DEFTREECODE (PREDECREMENT_EXPR, "predecrement_expr", tcc_expression, 2)
+DEFTREECODE (PREINCREMENT_EXPR, "preincrement_expr", tcc_expression, 2)
+DEFTREECODE (POSTDECREMENT_EXPR, "postdecrement_expr", tcc_expression, 2)
+DEFTREECODE (POSTINCREMENT_EXPR, "postincrement_expr", tcc_expression, 2)
 
 /* Used to implement `va_arg'.  */
-DEFTREECODE (VA_ARG_EXPR, "va_arg_expr", 'e', 1)
+DEFTREECODE (VA_ARG_EXPR, "va_arg_expr", tcc_expression, 1)
 
 /* Evaluate operand 1.  If and only if an exception is thrown during
    the evaluation of operand 1, evaluate operand 2.
 
    This differs from TRY_FINALLY_EXPR in that operand 2 is not evaluated
    on a normal or jump exit, only on an exception.  */
-DEFTREECODE (TRY_CATCH_EXPR, "try_catch_expr", 's', 2)
+DEFTREECODE (TRY_CATCH_EXPR, "try_catch_expr", tcc_statement, 2)
 
 /* Evaluate the first operand.
    The second operand is a cleanup expression which is evaluated
    on any exit (normal, exception, or jump out) from this expression.  */
-DEFTREECODE (TRY_FINALLY_EXPR, "try_finally", 's', 2)
+DEFTREECODE (TRY_FINALLY_EXPR, "try_finally", tcc_statement, 2)
 \f
 /* These types of expressions have no useful value,
    and always have side effects.  */
 
 /* Used to represent a local declaration. The operand is DECL_EXPR_DECL.  */
-DEFTREECODE (DECL_EXPR, "decl_expr", 's', 1)
+DEFTREECODE (DECL_EXPR, "decl_expr", tcc_statement, 1)
 
 /* A label definition, encapsulated as a statement.
    Operand 0 is the LABEL_DECL node for the label that appears here.
    The type should be void and the value should be ignored.  */
-DEFTREECODE (LABEL_EXPR, "label_expr", 's', 1)
+DEFTREECODE (LABEL_EXPR, "label_expr", tcc_statement, 1)
 
 /* GOTO.  Operand 0 is a LABEL_DECL node or an expression.
    The type should be void and the value should be ignored.  */
-DEFTREECODE (GOTO_EXPR, "goto_expr", 's', 1)
+DEFTREECODE (GOTO_EXPR, "goto_expr", tcc_statement, 1)
 
 /* RETURN.  Evaluates operand 0, then returns from the current function.
    Presumably that operand is an assignment that stores into the
    RESULT_DECL that hold the value to be returned.
    The operand may be null.
    The type should be void and the value should be ignored.  */
-DEFTREECODE (RETURN_EXPR, "return_expr", 's', 1)
+DEFTREECODE (RETURN_EXPR, "return_expr", tcc_statement, 1)
 
 /* Exit the inner most loop conditionally.  Operand 0 is the condition.
    The type should be void and the value should be ignored.  */
-DEFTREECODE (EXIT_EXPR, "exit_expr", 's', 1)
+DEFTREECODE (EXIT_EXPR, "exit_expr", tcc_statement, 1)
 
 /* A loop.  Operand 0 is the body of the loop.
    It must contain an EXIT_EXPR or is an infinite loop.
    The type should be void and the value should be ignored.  */
-DEFTREECODE (LOOP_EXPR, "loop_expr", 's', 1)
+DEFTREECODE (LOOP_EXPR, "loop_expr", tcc_statement, 1)
 
 /* Exit a labeled block, possibly returning a value.  Operand 0 is a
    LABELED_BLOCK_EXPR to exit.  Operand 1 is the value to return. It
    may be left null.  */
-DEFTREECODE (EXIT_BLOCK_EXPR, "exit_block_expr", 's', 2)
+DEFTREECODE (EXIT_BLOCK_EXPR, "exit_block_expr", tcc_statement, 2)
 
 /* Switch expression.
 
@@ -810,28 +800,28 @@ DEFTREECODE (EXIT_BLOCK_EXPR, "exit_block_expr", 's', 2)
      must not be NULL.
    Operand 2 is either NULL_TREE or a TREE_VEC of the CASE_LABEL_EXPRs
      of all the cases.  */
-DEFTREECODE (SWITCH_EXPR, "switch_expr", 's', 3)
+DEFTREECODE (SWITCH_EXPR, "switch_expr", tcc_statement, 3)
 
 /* 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.  CASE_LABEL is the corresponding LABEL_DECL.  */
-DEFTREECODE (CASE_LABEL_EXPR, "case_label_expr", 's', 3)
+DEFTREECODE (CASE_LABEL_EXPR, "case_label_expr", tcc_statement, 3)
 
 /* RESX.  Resume execution after an exception.  Operand 0 is a
    number indicating the exception region that is being left.  */
-DEFTREECODE (RESX_EXPR, "resx_expr", 's', 1)
+DEFTREECODE (RESX_EXPR, "resx_expr", tcc_statement, 1)
 
 /* Used to represent an inline assembly statement.  ASM_STRING returns a
    STRING_CST for the instruction (e.g., "mov x, y"). ASM_OUTPUTS,
    ASM_INPUTS, and ASM_CLOBBERS represent the outputs, inputs, and clobbers
    for the statement.  */
-DEFTREECODE (ASM_EXPR, "asm_expr", 's', 4)
+DEFTREECODE (ASM_EXPR, "asm_expr", tcc_statement, 4)
 
 /* Variable references for SSA analysis.  New SSA names are created every
    time a variable is assigned a new value.  The SSA builder uses SSA_NAME
    nodes to implement SSA versioning.  */
-DEFTREECODE (SSA_NAME, "ssa_name", 'x', 0)
+DEFTREECODE (SSA_NAME, "ssa_name", tcc_exceptional, 0)
 
 /* SSA PHI operator.  PHI_RESULT is the new SSA_NAME node created by
    the PHI node.  PHI_ARG_LENGTH is the number of arguments.
@@ -839,50 +829,50 @@ DEFTREECODE (SSA_NAME, "ssa_name", 'x', 0)
    argument list.  Each tuple contains the incoming reaching
    definition (SSA_NAME node) and the edge via which that definition
    is coming through.   */
-DEFTREECODE (PHI_NODE, "phi_node", 'x', 0)
+DEFTREECODE (PHI_NODE, "phi_node", tcc_exceptional, 0)
 
 /* Used to represent a typed exception handler.  CATCH_TYPES is the type (or
    list of types) handled, and CATCH_BODY is the code for the handler.  */
-DEFTREECODE (CATCH_EXPR, "catch_expr", 's', 2)
+DEFTREECODE (CATCH_EXPR, "catch_expr", tcc_statement, 2)
 
 /* Used to represent an exception specification.  EH_FILTER_TYPES is a list
    of allowed types, and EH_FILTER_FAILURE is an expression to evaluate on
    failure.  EH_FILTER_MUST_NOT_THROW controls which range type to use when
    expanding.  */
-DEFTREECODE (EH_FILTER_EXPR, "eh_filter_expr", 's', 2)
+DEFTREECODE (EH_FILTER_EXPR, "eh_filter_expr", tcc_statement, 2)
 
 /* Node used for describing a property that is known at compile
    time.  */
-DEFTREECODE (SCEV_KNOWN, "scev_known", 'e', 0)
+DEFTREECODE (SCEV_KNOWN, "scev_known", tcc_expression, 0)
 
 /* Node used for describing a property that is not known at compile
    time.  */
-DEFTREECODE (SCEV_NOT_KNOWN, "scev_not_known", 'e', 0)
+DEFTREECODE (SCEV_NOT_KNOWN, "scev_not_known", tcc_expression, 0)
 
 /* Polynomial chains of recurrences.
    Under the form: cr = {CHREC_LEFT (cr), +, CHREC_RIGHT (cr)}.  */
-DEFTREECODE (POLYNOMIAL_CHREC, "polynomial_chrec", 'e', 3)
+DEFTREECODE (POLYNOMIAL_CHREC, "polynomial_chrec", tcc_expression, 3)
 
 /* Used to chain children of container statements together.
    Use the interface in tree-iterator.h to access this node.  */
-DEFTREECODE (STATEMENT_LIST, "statement_list", 'x', 0)
+DEFTREECODE (STATEMENT_LIST, "statement_list", tcc_exceptional, 0)
 
 /* Value handles.  Artificial nodes to represent expressions in
    partial redundancy elimination (tree-ssa-pre.c).  These nodes are
    used for expression canonicalization.  If two expressions compute
    the same value, they will be assigned the same value handle.  */
-DEFTREECODE (VALUE_HANDLE, "value_handle", 'x', 0)
+DEFTREECODE (VALUE_HANDLE, "value_handle", tcc_exceptional, 0)
 
 /* Base class information. Holds information about a class as a
    baseclass of itself or another class.  */
-DEFTREECODE (TREE_BINFO, "tree_binfo", 'x', 0)
+DEFTREECODE (TREE_BINFO, "tree_binfo", tcc_exceptional, 0)
 
 /* Records the size for an expression of variable size type.  This is
    for use in contexts in which we are accessing the entire object,
    such as for a function call, or block copy.
    Operand 0 is the real expression.
    Operand 1 is the size of the type in the expression.  */
-DEFTREECODE (WITH_SIZE_EXPR, "with_size_expr", 'e', 2)
+DEFTREECODE (WITH_SIZE_EXPR, "with_size_expr", tcc_expression, 2)
 
 /*
 Local variables:
index 19ba220..83f90b7 100644 (file)
@@ -43,25 +43,103 @@ enum tree_code {
 /* Number of language-independent tree codes.  */
 #define NUM_TREE_CODES ((int) LAST_AND_UNUSED_TREE_CODE)
 
-/* Indexed by enum tree_code, contains a character which is
-   `<' for a comparison expression, `1', for a unary arithmetic
-   expression, `2' for a binary arithmetic expression, `e' for
-   other types of expressions, `r' for a reference, `c' for a
-   constant, `d' for a decl, `t' for a type, `s' for a statement,
-   and `x' for anything else (TREE_LIST, IDENTIFIER, etc).  */
+/* Tree code classes.  */
+
+/* Each tree_code has an associated code class represented by a
+   TREE_CODE_CLASS.  */
+
+enum tree_code_class {
+  tcc_exceptional, /* An exceptional code (fits no category).  */
+  tcc_constant,    /* A constant.  */
+  tcc_type,        /* A type object code.  */
+  tcc_declaration, /* A declaration (also serving as variable refs).  */
+  tcc_reference,   /* A reference to storage.  */
+  tcc_comparison,  /* A comparison expression.  */
+  tcc_unary,       /* A unary arithmetic expression.  */
+  tcc_binary,      /* A binary arithmetic expression.  */
+  tcc_statement,   /* A statement expression, which have side effects
+                     but usually no interesting value.  */
+  tcc_expression   /* Any other expression.  */
+};
+
+/* Each tree code class has an associated string representation.
+   These must correspond to the tree_code_class entries.  */
+
+extern const char* tree_code_class_strings[];
+
+/* Returns the string representing CLASS.  */
+
+#define TREE_CODE_CLASS_STRING(CLASS)\
+        tree_code_class_strings[(int) (CLASS)]
 
 #define MAX_TREE_CODES 256
-extern const char tree_code_type[];
+extern const enum tree_code_class tree_code_type[];
 #define TREE_CODE_CLASS(CODE)  tree_code_type[(int) (CODE)]
 
+/* Nonzero if CODE represents an exceptional code.  */
+
+#define EXCEPTIONAL_CLASS_P(CODE)\
+       (TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_exceptional)
+
+/* Nonzero if CODE represents a constant.  */
+
+#define CONSTANT_CLASS_P(CODE)\
+       (TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_constant)
+
+/* Nonzero if CODE represents a type.  */
+
+#define TYPE_P(CODE)\
+       (TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_type)
+
+/* Nonzero if CODE represents a declaration.  */
+
+#define DECL_P(CODE)\
+        (TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_declaration)
+
+/* Nonzero if CODE represents a reference.  */
+
+#define REFERENCE_CLASS_P(CODE)\
+       (TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_reference)
+
+/* Nonzero if CODE represents a comparison.  */
+
+#define COMPARISON_CLASS_P(CODE)\
+       (TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_comparison)
+
+/* Nonzero if CODE represents a unary arithmetic expression.  */
+
+#define UNARY_CLASS_P(CODE)\
+       (TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_unary)
+
+/* Nonzero if CODE represents a binary arithmetic expression.  */
+
+#define BINARY_CLASS_P(CODE)\
+       (TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_binary)
+
+/* Nonzero if CODE represents a statement expression.  */
+
+#define STATEMENT_CLASS_P(CODE)\
+       (TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_statement)
+
+/* Nonzero if CODE represents any other expression.  */
+
+#define EXPRESSION_CLASS_P(CODE)\
+       (TREE_CODE_CLASS (TREE_CODE (CODE)) == tcc_expression)
+
 /* Returns nonzero iff CLASS is not the tree code of a type.  */
 
-#define IS_NON_TYPE_CODE_CLASS(CLASS) ((CLASS) != 't')
+#define IS_NON_TYPE_CODE_CLASS(CLASS) ((CLASS) != tcc_type)
+
+/* Returns nonzero iff CODE represents a type or declaration.  */
+
+#define IS_TYPE_OR_DECL_P(CODE)\
+       (TYPE_P (CODE) || DECL_P (CODE))
 
 /* Returns nonzero iff CLASS is the tree-code class of an
    expression.  */
 
-#define IS_EXPR_CODE_CLASS(CLASS) (strchr ("<12ers", (CLASS)) != 0)
+#define IS_EXPR_CODE_CLASS(CLASS)\
+       (((CLASS) >= tcc_reference) && ((CLASS) <= tcc_expression))
 
 /* Returns nonzero iff NODE is an expression of some kind.  */
 
@@ -448,7 +526,7 @@ struct tree_common GTY(())
 ({  const tree __t = (T);                                              \
     char const __c = TREE_CODE_CLASS (TREE_CODE (__t));                        \
     if (!IS_EXPR_CODE_CLASS (__c))                                     \
-      tree_class_check_failed (__t, 'E', __FILE__, __LINE__,           \
+      tree_class_check_failed (__t, tcc_expression, __FILE__, __LINE__,        \
                               __FUNCTION__);                           \
     __t; })
 
@@ -457,7 +535,7 @@ struct tree_common GTY(())
 ({  const tree __t = (T);                                              \
     char const __c = TREE_CODE_CLASS (TREE_CODE (__t));                        \
     if (!IS_NON_TYPE_CODE_CLASS (__c))                                 \
-      tree_class_check_failed (__t, 'T', __FILE__, __LINE__,           \
+      tree_class_check_failed (__t, tcc_type, __FILE__, __LINE__,      \
                               __FUNCTION__);                           \
     __t; })
 
@@ -517,7 +595,7 @@ extern void tree_check_failed (const tree, const char *, int, const char *,
                               ...) ATTRIBUTE_NORETURN;
 extern void tree_not_check_failed (const tree, const char *, int, const char *,
                                   ...) ATTRIBUTE_NORETURN;
-extern void tree_class_check_failed (const tree, int,
+extern void tree_class_check_failed (const tree, const enum tree_code_class,
                                     const char *, int, const char *)
     ATTRIBUTE_NORETURN;
 extern void tree_vec_elt_check_failed (int, int, const char *,
@@ -557,10 +635,10 @@ extern void tree_operand_check_failed (int, enum tree_code,
 
 #include "tree-check.h"
 
-#define TYPE_CHECK(T)          TREE_CLASS_CHECK (T, 't')
-#define DECL_CHECK(T)          TREE_CLASS_CHECK (T, 'd')
-#define CST_CHECK(T)           TREE_CLASS_CHECK (T, 'c')
-#define STMT_CHECK(T)          TREE_CLASS_CHECK (T, 's')
+#define TYPE_CHECK(T)          TREE_CLASS_CHECK (T, tcc_type)
+#define DECL_CHECK(T)          TREE_CLASS_CHECK (T, tcc_declaration)
+#define CST_CHECK(T)           TREE_CLASS_CHECK (T, tcc_constant)
+#define STMT_CHECK(T)          TREE_CLASS_CHECK (T, tcc_statement)
 #define FUNC_OR_METHOD_CHECK(T)        TREE_CHECK2 (T, FUNCTION_TYPE, METHOD_TYPE)
 #define PTR_OR_REF_CHECK(T)    TREE_CHECK2 (T, POINTER_TYPE, REFERENCE_TYPE)
 
@@ -712,9 +790,6 @@ extern void tree_operand_check_failed (int, enum tree_code,
 #define COMPLETE_OR_UNBOUND_ARRAY_TYPE_P(NODE) \
   (COMPLETE_TYPE_P (TREE_CODE (NODE) == ARRAY_TYPE ? TREE_TYPE (NODE) : (NODE)))
 
-/* Nonzero if TYPE represents a type.  */
-
-#define TYPE_P(TYPE)   (TREE_CODE_CLASS (TREE_CODE (TYPE)) == 't')
 \f
 /* Define many boolean fields that all tree nodes have.  */
 
@@ -839,7 +914,8 @@ extern void tree_operand_check_failed (int, enum tree_code,
 #define TREE_READONLY(NODE) (NON_TYPE_CHECK (NODE)->common.readonly_flag)
 
 /* Nonzero if NODE is a _DECL with TREE_READONLY set.  */
-#define TREE_READONLY_DECL_P(NODE) (DECL_P (NODE) && TREE_READONLY (NODE))
+#define TREE_READONLY_DECL_P(NODE)\
+       (DECL_P (NODE) && TREE_READONLY (NODE))
 
 /* Value of expression is constant.  Always on in all ..._CST nodes.  May
    also appear in an expression or decl where the value is constant.  */
@@ -1091,17 +1167,13 @@ struct tree_vec GTY(())
    decls and constants can be shared among multiple locations, so
    return nothing.  */
 #define EXPR_LOCATION(NODE)                                    \
-  (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (NODE)))     \
-   ? (NODE)->exp.locus                                         \
-   : UNKNOWN_LOCATION)
+  (EXPR_P (NODE) ? (NODE)->exp.locus : UNKNOWN_LOCATION)
 #define SET_EXPR_LOCATION(NODE, FROM) \
   (EXPR_CHECK (NODE)->exp.locus = (FROM))
 #define EXPR_HAS_LOCATION(NODE) (EXPR_LOCATION (NODE) != UNKNOWN_LOCATION)
 /* EXPR_LOCUS and SET_EXPR_LOCUS are deprecated.  */
 #define EXPR_LOCUS(NODE)                                       \
-  (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (NODE)))     \
-   ? &(NODE)->exp.locus                                                \
-   : (location_t *)NULL)
+  (EXPR_P (NODE) ? &(NODE)->exp.locus : (location_t *)NULL)
 #define SET_EXPR_LOCUS(NODE, FROM) \
   do { source_location *loc_tmp = FROM; \
        EXPR_CHECK (NODE)->exp.locus \
@@ -1115,9 +1187,7 @@ struct tree_vec GTY(())
    decls and constants can be shared among multiple locations, so
    return nothing.  */
 #define EXPR_LOCUS(NODE)                                       \
-  (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (NODE)))     \
-   ? (NODE)->exp.locus                                         \
-   : (location_t *)NULL)
+  (EXPR_P (NODE) ? (NODE)->exp.locus : (location_t *)NULL)
 #define SET_EXPR_LOCUS(NODE, FROM) \
   (EXPR_CHECK (NODE)->exp.locus = (FROM))
 #define SET_EXPR_LOCATION(NODE, FROM) annotate_with_locus (NODE, FROM)
@@ -1753,9 +1823,6 @@ struct tree_binfo GTY (())
 \f
 /* Define fields and accessors for nodes representing declared names.  */
 
-/* Nonzero if DECL represents a decl.  */
-#define DECL_P(DECL)   (TREE_CODE_CLASS (TREE_CODE (DECL)) == 'd')
-
 /* Nonzero if DECL represents a variable for the SSA passes.  */
 #define SSA_VAR_P(DECL) \
        (TREE_CODE (DECL) == VAR_DECL   \
index e53d824..773a50a 100644 (file)
@@ -1,3 +1,8 @@
+2004-09-17  Jeffrey D. Oldham  <oldham@codesourcery.com>
+           Zack Weinberg  <zack@codesourcery.com>
+
+       * treetree.c: Update for new tree-class enumeration constants.
+
 2004-09-15  Zack Weinberg  <zack@codesourcery.com>
 
        * Make-lang.in (treelang-warn): Set to $(STRICT_WARN).
index c86918c..e0a220f 100644 (file)
@@ -199,9 +199,9 @@ const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
 
 #define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
 
-const char tree_code_type[] = {
+const enum tree_code_class tree_code_type[] = {
 #include "tree.def"
-  'x'
+  tcc_exceptional
 };
 #undef DEFTREECODE
 
index 05d60eb..5bb96c6 100644 (file)
@@ -2466,7 +2466,7 @@ copy_constant (tree exp)
     case ADDR_EXPR:
       /* For ADDR_EXPR, we do not want to copy the decl whose address
         is requested.  We do want to copy constants though.  */
-      if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (exp, 0))) == 'c')
+      if (CONSTANT_CLASS_P (TREE_OPERAND (exp, 0)))
        return build1 (TREE_CODE (exp), TREE_TYPE (exp),
                       copy_constant (TREE_OPERAND (exp, 0)));
       else
@@ -3378,8 +3378,7 @@ output_addressed_constants (tree exp)
           tem = TREE_OPERAND (tem, 0))
        ;
 
-      if (TREE_CODE_CLASS (TREE_CODE (tem)) == 'c'
-         || TREE_CODE (tem) == CONSTRUCTOR)
+      if (CONSTANT_CLASS_P (tem) || TREE_CODE (tem) == CONSTRUCTOR)
        output_constant_def (tem, 0);
       break;