OSDN Git Service

* c-typeck.c (struct c_switch): Rename switch_stmt field to
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 5 Apr 2005 01:15:08 +0000 (01:15 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 5 Apr 2005 01:15:08 +0000 (01:15 +0000)
switch_expr.
(c_start_case): Build SWITCH_EXPR, not SWITCH_STMT.
(do_case): Use SWITCH_COND rather than SWITCH_STMT_COND.
(c_finish_case): Use SWITCH_BODY rather than SWITCH_STMT_BODY.
Call c_do_switch_expr_warnings rather than c_do_switch_warnings.
* c-common.c (c_do_switch_warnings_1): New static function broken
out of c_do_switch_warnings.
(c_do_switch_warnings): Call c_do_switch_warnings_1.
(c_do_switch_expr_warnings): New function.
* c-common.h (c_do_switch_expr_warnings): Declare.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@97593 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-common.c
gcc/c-common.h
gcc/c-typeck.c

index 36608c7..b3e4dcd 100644 (file)
@@ -1,3 +1,17 @@
+2005-04-04  Ian Lance Taylor  <ian@airs.com>
+
+       * c-typeck.c (struct c_switch): Rename switch_stmt field to
+       switch_expr.
+       (c_start_case): Build SWITCH_EXPR, not SWITCH_STMT.
+       (do_case): Use SWITCH_COND rather than SWITCH_STMT_COND.
+       (c_finish_case): Use SWITCH_BODY rather than SWITCH_STMT_BODY.
+       Call c_do_switch_expr_warnings rather than c_do_switch_warnings.
+       * c-common.c (c_do_switch_warnings_1): New static function broken
+       out of c_do_switch_warnings.
+       (c_do_switch_warnings): Call c_do_switch_warnings_1.
+       (c_do_switch_expr_warnings): New function.
+       * c-common.h (c_do_switch_expr_warnings): Declare.
+
 2005-04-04  David Edelsohn  <edelsohn@gnu.org>
            Daniel Jacobowitz  <dan@codesourcery.com>
 
index 5705f4d..817d939 100644 (file)
@@ -3708,32 +3708,17 @@ match_case_to_enum (splay_tree_node node, void *data)
   return 0;
 }
 
-/* Handle -Wswitch*.  Called from the front end after parsing the switch
-   construct.  */
-/* ??? Should probably be somewhere generic, since other languages besides
-   C and C++ would want this.  We'd want to agree on the data structure,
-   however, which is a problem.  Alternately, we operate on gimplified
-   switch_exprs, which I don't especially like.  At the moment, however,
-   C/C++ are the only tree-ssa languages that support enumerations at all,
-   so the point is moot.  */
+/* Common code for -Wswitch*.  */
 
-void
-c_do_switch_warnings (splay_tree cases, tree switch_stmt)
+static void
+c_do_switch_warnings_1 (splay_tree cases, location_t switch_location,
+                       tree type, tree cond)
 {
   splay_tree_node default_node;
-  location_t switch_location;
-  tree type;
 
   if (!warn_switch && !warn_switch_enum && !warn_switch_default)
     return;
 
-  if (EXPR_HAS_LOCATION (switch_stmt))
-    switch_location = EXPR_LOCATION (switch_stmt);
-  else
-    switch_location = input_location;
-
-  type = SWITCH_STMT_TYPE (switch_stmt);
-
   default_node = splay_tree_lookup (cases, (splay_tree_key) NULL);
   if (warn_switch_default && !default_node)
     warning ("%Hswitch missing default case", &switch_location);
@@ -3744,7 +3729,7 @@ c_do_switch_warnings (splay_tree cases, tree switch_stmt)
      default case, or when -Wswitch-enum was specified.  */
   if (((warn_switch && !default_node) || warn_switch_enum)
       && type && TREE_CODE (type) == ENUMERAL_TYPE
-      && TREE_CODE (SWITCH_STMT_COND (switch_stmt)) != INTEGER_CST)
+      && TREE_CODE (cond) != INTEGER_CST)
     {
       tree chain;
 
@@ -3788,6 +3773,45 @@ c_do_switch_warnings (splay_tree cases, tree switch_stmt)
     }
 }
 
+/* Handle -Wswitch* for a SWITCH_STMT.  Called from the front end
+   after parsing the switch construct.  */
+/* ??? Should probably be somewhere generic, since other languages besides
+   C and C++ would want this.  We'd want to agree on the data structure,
+   however, which is a problem.  Alternately, we operate on gimplified
+   switch_exprs, which I don't especially like.  At the moment, however,
+   C/C++ are the only tree-ssa languages that support enumerations at all,
+   so the point is moot.  */
+
+void
+c_do_switch_warnings (splay_tree cases, tree switch_stmt)
+{
+  location_t switch_location;
+
+  if (EXPR_HAS_LOCATION (switch_stmt))
+    switch_location = EXPR_LOCATION (switch_stmt);
+  else
+    switch_location = input_location;
+  c_do_switch_warnings_1 (cases, switch_location,
+                         SWITCH_STMT_TYPE (switch_stmt),
+                         SWITCH_STMT_COND (switch_stmt));
+}
+
+/* Like c_do_switch_warnings, but takes a SWITCH_EXPR rather than a
+   SWITCH_STMT.  */
+
+void
+c_do_switch_expr_warnings (splay_tree cases, tree switch_expr)
+{
+  location_t switch_location;
+
+  if (EXPR_HAS_LOCATION (switch_expr))
+    switch_location = EXPR_LOCATION (switch_expr);
+  else
+    switch_location = input_location;
+  c_do_switch_warnings_1 (cases, switch_location, TREE_TYPE (switch_expr),
+                         SWITCH_COND (switch_expr));
+}
+
 /* Finish an expression taking the address of LABEL (an
    IDENTIFIER_NODE).  Returns an expression for the address.  */
 
index 7794ade..f313e68 100644 (file)
@@ -825,6 +825,7 @@ extern int case_compare (splay_tree_key, splay_tree_key);
 extern tree c_add_case_label (splay_tree, tree, tree, tree, tree);
 
 extern void c_do_switch_warnings (splay_tree, tree);
+extern void c_do_switch_expr_warnings (splay_tree, tree);
 
 extern tree build_function_call (tree, tree);
 
index d6ffc87..663dd7f 100644 (file)
@@ -6609,8 +6609,8 @@ c_finish_return (tree retval)
 }
 \f
 struct c_switch {
-  /* The SWITCH_STMT being built.  */
-  tree switch_stmt;
+  /* The SWITCH_EXPR being built.  */
+  tree switch_expr;
 
   /* The original type of the testing expression, i.e. before the
      default conversion is applied.  */
@@ -6641,7 +6641,7 @@ struct c_switch {
 struct c_switch *c_switch_stack;
 
 /* Start a C switch statement, testing expression EXP.  Return the new
-   SWITCH_STMT.  */
+   SWITCH_EXPR.  */
 
 tree
 c_start_case (tree exp)
@@ -6677,16 +6677,16 @@ c_start_case (tree exp)
        }
     }
 
-  /* Add this new SWITCH_STMT to the stack.  */
+  /* Add this new SWITCH_EXPR to the stack.  */
   cs = XNEW (struct c_switch);
-  cs->switch_stmt = build_stmt (SWITCH_STMT, exp, NULL_TREE, orig_type);
+  cs->switch_expr = build3 (SWITCH_EXPR, orig_type, exp, NULL_TREE, NULL_TREE);
   cs->orig_type = orig_type;
   cs->cases = splay_tree_new (case_compare, NULL, NULL);
   cs->blocked_stmt_expr = 0;
   cs->next = c_switch_stack;
   c_switch_stack = cs;
 
-  return add_stmt (cs->switch_stmt);
+  return add_stmt (cs->switch_expr);
 }
 
 /* Process a case label.  */
@@ -6699,7 +6699,7 @@ do_case (tree low_value, tree high_value)
   if (c_switch_stack && !c_switch_stack->blocked_stmt_expr)
     {
       label = c_add_case_label (c_switch_stack->cases,
-                               SWITCH_STMT_COND (c_switch_stack->switch_stmt),
+                               SWITCH_COND (c_switch_stack->switch_expr),
                                c_switch_stack->orig_type,
                                low_value, high_value);
       if (label == error_mark_node)
@@ -6729,12 +6729,12 @@ c_finish_case (tree body)
 {
   struct c_switch *cs = c_switch_stack;
 
-  SWITCH_STMT_BODY (cs->switch_stmt) = body;
+  SWITCH_BODY (cs->switch_expr) = body;
 
   gcc_assert (!cs->blocked_stmt_expr);
 
   /* Emit warnings as needed.  */
-  c_do_switch_warnings (cs->cases, cs->switch_stmt);
+  c_do_switch_expr_warnings (cs->cases, cs->switch_expr);
 
   /* Pop the stack.  */
   c_switch_stack = cs->next;