This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[tree-ssa] PATCH to simplify_switch_stmt


This patch fixes the remaining gcov failures in the gcc testsuite; we were
attaching the branch counts to the closing brace of the switch block rather
than to the switch itself.  This patch changes that.

As a result of this change, most of the -Wswitch tests started to fail,
because the warnings now refer to the line of the switch.  This seems
appropriate to me, so I've just changed the testcases.

Booted and tested i686-pc-linux-gnu, applied to tree-ssa.

2003-05-26  Jason Merrill  <jason@redhat.com>

	* c-simplify.c (simplify_switch_stmt): A SWITCH_EXPR also gets the
	source location of its first line.

*** c-simplify.c.~1~	2003-05-24 14:56:05.000000000 -0400
--- c-simplify.c	2003-05-24 14:35:30.000000000 -0400
*************** simplify_switch_stmt (stmt_p)
*** 756,761 ****
--- 756,763 ----
    tree body = SWITCH_BODY (stmt);
    tree break_block, switch_;
    tree cond = SWITCH_COND (stmt);
+   const char *stmt_filename = input_filename;
+   int stmt_lineno = input_line;
  
    simplify_condition (&cond);
  
*************** simplify_switch_stmt (stmt_p)
*** 764,770 ****
    c_simplify_stmt (&body);
  
    switch_ = build (SWITCH_EXPR, SWITCH_TYPE (stmt), cond, body, NULL_TREE);
!   annotate_with_file_line (switch_, input_filename, input_line);
  
    switch_ = finish_bc_block (break_block, switch_);
  
--- 766,772 ----
    c_simplify_stmt (&body);
  
    switch_ = build (SWITCH_EXPR, SWITCH_TYPE (stmt), cond, body, NULL_TREE);
!   annotate_with_file_line (switch_, stmt_filename, stmt_lineno);
  
    switch_ = finish_bc_block (break_block, switch_);
  
*** testsuite/gcc.dg/Wswitch-2.c.~1~	2002-07-15 21:02:53.000000000 -0400
--- testsuite/gcc.dg/Wswitch-2.c	2003-05-26 15:57:01.000000000 -0400
*************** foo (enum e ei, int j)
*** 13,31 ****
      case e3: return 2;
      case e4: return 3;
      }	/* No warning here since e2 has the same value as e3.  */
!   switch (ei)
      {
      case e1: return 1;
      case e2: return 2;
!     }	/* { dg-warning "enumeration value `e4' not handled in switch" "enum e4" } */
    switch ((int) ei)
      {
      case e1: return 1;
      }	/* No warning here since switch condition was cast to int.  */
!   switch ((enum e) j)
      {
      case e2: return 1;
      case e4: return 2;
!     }	/* { dg-warning "enumeration value `e1' not handled in switch" "enum e1" } */
    return 0;
  }
--- 13,31 ----
      case e3: return 2;
      case e4: return 3;
      }	/* No warning here since e2 has the same value as e3.  */
!   switch (ei) /* { dg-warning "enumeration value `e4' not handled in switch" "enum e4" } */
      {
      case e1: return 1;
      case e2: return 2;
!     }
    switch ((int) ei)
      {
      case e1: return 1;
      }	/* No warning here since switch condition was cast to int.  */
!   switch ((enum e) j) /* { dg-warning "enumeration value `e1' not handled in switch" "enum e1" } */
      {
      case e2: return 1;
      case e4: return 2;
!     }
    return 0;
  }
*** testsuite/gcc.dg/Wswitch-2.c.~1.1.~	2002-07-15 21:02:53.000000000 -0400
--- testsuite/gcc.dg/Wswitch-2.c	2003-05-26 15:57:01.000000000 -0400
*************** foo (enum e ei, int j)
*** 13,31 ****
      case e3: return 2;
      case e4: return 3;
      }	/* No warning here since e2 has the same value as e3.  */
!   switch (ei)
      {
      case e1: return 1;
      case e2: return 2;
!     }	/* { dg-warning "enumeration value `e4' not handled in switch" "enum e4" } */
    switch ((int) ei)
      {
      case e1: return 1;
      }	/* No warning here since switch condition was cast to int.  */
!   switch ((enum e) j)
      {
      case e2: return 1;
      case e4: return 2;
!     }	/* { dg-warning "enumeration value `e1' not handled in switch" "enum e1" } */
    return 0;
  }
--- 13,31 ----
      case e3: return 2;
      case e4: return 3;
      }	/* No warning here since e2 has the same value as e3.  */
!   switch (ei) /* { dg-warning "enumeration value `e4' not handled in switch" "enum e4" } */
      {
      case e1: return 1;
      case e2: return 2;
!     }
    switch ((int) ei)
      {
      case e1: return 1;
      }	/* No warning here since switch condition was cast to int.  */
!   switch ((enum e) j) /* { dg-warning "enumeration value `e1' not handled in switch" "enum e1" } */
      {
      case e2: return 1;
      case e4: return 2;
!     }
    return 0;
  }
*** testsuite/gcc.dg/Wswitch.c.~1~	2003-04-27 17:16:06.000000000 -0400
--- testsuite/gcc.dg/Wswitch.c	2003-05-26 15:54:23.000000000 -0400
*************** foo (int i, int j, enum e ei, enum e ej,
*** 26,35 ****
      {
      default: break;
      }
!   switch (ek)
      {
      case e1: return 1;
!     } /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" } */
    switch (el)
      {
      case e1: return 1;
--- 26,35 ----
      {
      default: break;
      }
!   switch (ek) /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" } */
      {
      case e1: return 1;
!     }
    switch (el)
      {
      case e1: return 1;
*************** foo (int i, int j, enum e ei, enum e ej,
*** 46,57 ****
      case e2: return 2;
      default: break;
      }
!   switch (eo)
      {
      case e1: return 1;
      case e2: return 2;
      case 3: return 3;
!     } /* { dg-warning "case value `3' not in enumerated type `e'" "excess 3" } */
    switch (ep)
      {
      case e1: return 1;
--- 46,57 ----
      case e2: return 2;
      default: break;
      }
!   switch (eo) /* { dg-warning "case value `3' not in enumerated type `e'" "excess 3" } */
      {
      case e1: return 1;
      case e2: return 2;
      case 3: return 3;
!     }
    switch (ep)
      {
      case e1: return 1;
*** testsuite/gcc.dg/Wswitch.c.~1.2.18.1.~	2003-04-27 17:16:06.000000000 -0400
--- testsuite/gcc.dg/Wswitch.c	2003-05-26 15:54:23.000000000 -0400
*************** foo (int i, int j, enum e ei, enum e ej,
*** 26,35 ****
      {
      default: break;
      }
!   switch (ek)
      {
      case e1: return 1;
!     } /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" } */
    switch (el)
      {
      case e1: return 1;
--- 26,35 ----
      {
      default: break;
      }
!   switch (ek) /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" } */
      {
      case e1: return 1;
!     }
    switch (el)
      {
      case e1: return 1;
*************** foo (int i, int j, enum e ei, enum e ej,
*** 46,57 ****
      case e2: return 2;
      default: break;
      }
!   switch (eo)
      {
      case e1: return 1;
      case e2: return 2;
      case 3: return 3;
!     } /* { dg-warning "case value `3' not in enumerated type `e'" "excess 3" } */
    switch (ep)
      {
      case e1: return 1;
--- 46,57 ----
      case e2: return 2;
      default: break;
      }
!   switch (eo) /* { dg-warning "case value `3' not in enumerated type `e'" "excess 3" } */
      {
      case e1: return 1;
      case e2: return 2;
      case 3: return 3;
!     }
    switch (ep)
      {
      case e1: return 1;
*** testsuite/gcc.dg/Wswitch-default.c.~1~	2003-04-27 17:16:06.000000000 -0400
--- testsuite/gcc.dg/Wswitch-default.c	2003-05-26 15:50:22.000000000 -0400
*************** int
*** 7,17 ****
  foo (int i, int j, enum e ei, enum e ej, enum e ek, enum e el,
       enum e em, enum e en, enum e eo, enum e ep)
  {
!   switch (i)
      {
      case 1: return 1;
      case 2: return 2;
!     } /* { dg-warning "switch missing default case" } */
    switch (j)
      {
      case 3: return 4;
--- 7,17 ----
  foo (int i, int j, enum e ei, enum e ej, enum e ek, enum e el,
       enum e em, enum e en, enum e eo, enum e ep)
  {
!   switch (i) /* { dg-warning "switch missing default case" } */
      {
      case 1: return 1;
      case 2: return 2;
!     }
    switch (j)
      {
      case 3: return 4;
*************** foo (int i, int j, enum e ei, enum e ej,
*** 25,56 ****
      {
      default: break;
      }
!   switch (ek)
      {
      case e1: return 1;
!     } /* { dg-warning "switch missing default case" } */
    switch (el)
      {
      case e1: return 1;
      default: break;
      }
!   switch (em)
      {
      case e1: return 1;
      case e2: return 2;
!     } /* { dg-warning "switch missing default case" } */
    switch (en)
      {
      case e1: return 1;
      case e2: return 2;
      default: break;
      }
!   switch (eo)
      {
      case e1: return 1;
      case e2: return 2;
      case 3: return 3;
!     } /* { dg-warning "switch missing default case" } */
    switch (ep)
      {
      case e1: return 1;
--- 25,56 ----
      {
      default: break;
      }
!   switch (ek) /* { dg-warning "switch missing default case" } */
      {
      case e1: return 1;
!     }
    switch (el)
      {
      case e1: return 1;
      default: break;
      }
!   switch (em) /* { dg-warning "switch missing default case" } */
      {
      case e1: return 1;
      case e2: return 2;
!     }
    switch (en)
      {
      case e1: return 1;
      case e2: return 2;
      default: break;
      }
!   switch (eo) /* { dg-warning "switch missing default case" } */
      {
      case e1: return 1;
      case e2: return 2;
      case 3: return 3;
!     }
    switch (ep)
      {
      case e1: return 1;
*** testsuite/gcc.dg/Wswitch-default.c.~1.1.12.1.~	2003-04-27 17:16:06.000000000 -0400
--- testsuite/gcc.dg/Wswitch-default.c	2003-05-26 15:50:22.000000000 -0400
*************** int
*** 7,17 ****
  foo (int i, int j, enum e ei, enum e ej, enum e ek, enum e el,
       enum e em, enum e en, enum e eo, enum e ep)
  {
!   switch (i)
      {
      case 1: return 1;
      case 2: return 2;
!     } /* { dg-warning "switch missing default case" } */
    switch (j)
      {
      case 3: return 4;
--- 7,17 ----
  foo (int i, int j, enum e ei, enum e ej, enum e ek, enum e el,
       enum e em, enum e en, enum e eo, enum e ep)
  {
!   switch (i) /* { dg-warning "switch missing default case" } */
      {
      case 1: return 1;
      case 2: return 2;
!     }
    switch (j)
      {
      case 3: return 4;
*************** foo (int i, int j, enum e ei, enum e ej,
*** 25,56 ****
      {
      default: break;
      }
!   switch (ek)
      {
      case e1: return 1;
!     } /* { dg-warning "switch missing default case" } */
    switch (el)
      {
      case e1: return 1;
      default: break;
      }
!   switch (em)
      {
      case e1: return 1;
      case e2: return 2;
!     } /* { dg-warning "switch missing default case" } */
    switch (en)
      {
      case e1: return 1;
      case e2: return 2;
      default: break;
      }
!   switch (eo)
      {
      case e1: return 1;
      case e2: return 2;
      case 3: return 3;
!     } /* { dg-warning "switch missing default case" } */
    switch (ep)
      {
      case e1: return 1;
--- 25,56 ----
      {
      default: break;
      }
!   switch (ek) /* { dg-warning "switch missing default case" } */
      {
      case e1: return 1;
!     }
    switch (el)
      {
      case e1: return 1;
      default: break;
      }
!   switch (em) /* { dg-warning "switch missing default case" } */
      {
      case e1: return 1;
      case e2: return 2;
!     }
    switch (en)
      {
      case e1: return 1;
      case e2: return 2;
      default: break;
      }
!   switch (eo) /* { dg-warning "switch missing default case" } */
      {
      case e1: return 1;
      case e2: return 2;
      case 3: return 3;
!     }
    switch (ep)
      {
      case e1: return 1;
*** testsuite/gcc.dg/Wswitch-enum.c.~1~	2003-04-27 17:16:06.000000000 -0400
--- testsuite/gcc.dg/Wswitch-enum.c	2003-05-26 15:55:11.000000000 -0400
*************** foo (int i, int j, enum e ei, enum e ej,
*** 22,40 ****
    switch (ei) /* { dg-warning "enumeration value `e1' not handled in switch" "enum e1" } */
      { /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" { target *-*-* } 22 } */
      }
!   switch (ej)
!     { /* { dg-warning "enumeration value `e1' not handled in switch" "enum e1" { target *-*-* } 28 } */
      default: break;
!     } /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" } */
!   switch (ek)
      {
      case e1: return 1;
!     } /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" } */
!   switch (el)
      {
      case e1: return 1;
      default: break;
!     }  /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" } */
    switch (em)
      {
      case e1: return 1;
--- 22,40 ----
    switch (ei) /* { dg-warning "enumeration value `e1' not handled in switch" "enum e1" } */
      { /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" { target *-*-* } 22 } */
      }
!   switch (ej) /* { dg-warning "enumeration value `e1' not handled in switch" "enum e1" } */
!     { /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" { target *-*-* } 25 } */
      default: break;
!     }
!   switch (ek) /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" } */
      {
      case e1: return 1;
!     }
!   switch (el) /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" } */
      {
      case e1: return 1;
      default: break;
!     }
    switch (em)
      {
      case e1: return 1;
*************** foo (int i, int j, enum e ei, enum e ej,
*** 46,63 ****
      case e2: return 2;
      default: break;
      }
!   switch (eo)
      {
      case e1: return 1;
      case e2: return 2;
      case 3: return 3;
!     } /* { dg-warning "case value `3' not in enumerated type `e'" "excess 3" } */
!   switch (ep)
      {
      case e1: return 1;
      case e2: return 2;
      case 3: return 3;
      default: break;
!     } /* { dg-warning "case value `3' not in enumerated type `e'" "excess 3" } */
    return 0;
  }
--- 46,63 ----
      case e2: return 2;
      default: break;
      }
!   switch (eo) /* { dg-warning "case value `3' not in enumerated type `e'" "excess 3" } */
      {
      case e1: return 1;
      case e2: return 2;
      case 3: return 3;
!     }
!   switch (ep) /* { dg-warning "case value `3' not in enumerated type `e'" "excess 3" } */
      {
      case e1: return 1;
      case e2: return 2;
      case 3: return 3;
      default: break;
!     }
    return 0;
  }
*** testsuite/gcc.dg/Wswitch-enum.c.~1.1.12.1.~	2003-04-27 17:16:06.000000000 -0400
--- testsuite/gcc.dg/Wswitch-enum.c	2003-05-26 15:55:11.000000000 -0400
*************** foo (int i, int j, enum e ei, enum e ej,
*** 22,40 ****
    switch (ei) /* { dg-warning "enumeration value `e1' not handled in switch" "enum e1" } */
      { /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" { target *-*-* } 22 } */
      }
!   switch (ej)
!     { /* { dg-warning "enumeration value `e1' not handled in switch" "enum e1" { target *-*-* } 28 } */
      default: break;
!     } /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" } */
!   switch (ek)
      {
      case e1: return 1;
!     } /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" } */
!   switch (el)
      {
      case e1: return 1;
      default: break;
!     }  /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" } */
    switch (em)
      {
      case e1: return 1;
--- 22,40 ----
    switch (ei) /* { dg-warning "enumeration value `e1' not handled in switch" "enum e1" } */
      { /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" { target *-*-* } 22 } */
      }
!   switch (ej) /* { dg-warning "enumeration value `e1' not handled in switch" "enum e1" } */
!     { /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" { target *-*-* } 25 } */
      default: break;
!     }
!   switch (ek) /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" } */
      {
      case e1: return 1;
!     }
!   switch (el) /* { dg-warning "enumeration value `e2' not handled in switch" "enum e2" } */
      {
      case e1: return 1;
      default: break;
!     }
    switch (em)
      {
      case e1: return 1;
*************** foo (int i, int j, enum e ei, enum e ej,
*** 46,63 ****
      case e2: return 2;
      default: break;
      }
!   switch (eo)
      {
      case e1: return 1;
      case e2: return 2;
      case 3: return 3;
!     } /* { dg-warning "case value `3' not in enumerated type `e'" "excess 3" } */
!   switch (ep)
      {
      case e1: return 1;
      case e2: return 2;
      case 3: return 3;
      default: break;
!     } /* { dg-warning "case value `3' not in enumerated type `e'" "excess 3" } */
    return 0;
  }
--- 46,63 ----
      case e2: return 2;
      default: break;
      }
!   switch (eo) /* { dg-warning "case value `3' not in enumerated type `e'" "excess 3" } */
      {
      case e1: return 1;
      case e2: return 2;
      case 3: return 3;
!     }
!   switch (ep) /* { dg-warning "case value `3' not in enumerated type `e'" "excess 3" } */
      {
      case e1: return 1;
      case e2: return 2;
      case 3: return 3;
      default: break;
!     }
    return 0;
  }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]