mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-24 00:29:37 +08:00
re PR middle-end/39666 (spurious warning with ranged-switch statements)
PR middle-end/39666 * gimplify.c (gimplify_switch_expr): If case labels cover the whole range of the type, but default label is missing, add it with one of the existing labels instead of adding a new label for it. * gcc.dg/pr39666-1.c: New test. * gcc.dg/pr39666-2.c: Likewise. * g++.dg/warn/Wuninitialized-4.C: Likewise. * g++.dg/warn/Wuninitialized-5.C: Likewise. * gfortran.dg/pr39666-1.f90: Likewise. * gfortran.dg/pr39666-2.f90: Likewise. From-SVN: r147136
This commit is contained in:
parent
6e57a01df4
commit
32f579f6eb
@ -12,6 +12,11 @@
|
||||
(gen_variable_die): Likewise. Check TREE_PRIVATE/TREE_PROTECTED
|
||||
unconditionally.
|
||||
|
||||
PR middle-end/39666
|
||||
* gimplify.c (gimplify_switch_expr): If case labels cover the whole
|
||||
range of the type, but default label is missing, add it with one
|
||||
of the existing labels instead of adding a new label for it.
|
||||
|
||||
2009-05-05 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* dwarf.h: Remove.
|
||||
|
@ -1604,21 +1604,64 @@ gimplify_switch_expr (tree *expr_p, gimple_seq *pre_p)
|
||||
}
|
||||
len = i;
|
||||
|
||||
if (!default_case)
|
||||
{
|
||||
gimple new_default;
|
||||
|
||||
/* If the switch has no default label, add one, so that we jump
|
||||
around the switch body. */
|
||||
default_case = build3 (CASE_LABEL_EXPR, void_type_node, NULL_TREE,
|
||||
NULL_TREE, create_artificial_label ());
|
||||
new_default = gimple_build_label (CASE_LABEL (default_case));
|
||||
gimplify_seq_add_stmt (&switch_body_seq, new_default);
|
||||
}
|
||||
|
||||
if (!VEC_empty (tree, labels))
|
||||
sort_case_labels (labels);
|
||||
|
||||
if (!default_case)
|
||||
{
|
||||
tree type = TREE_TYPE (switch_expr);
|
||||
|
||||
/* If the switch has no default label, add one, so that we jump
|
||||
around the switch body. If the labels already cover the whole
|
||||
range of type, add the default label pointing to one of the
|
||||
existing labels. */
|
||||
if (type == void_type_node)
|
||||
type = TREE_TYPE (SWITCH_COND (switch_expr));
|
||||
if (len
|
||||
&& INTEGRAL_TYPE_P (type)
|
||||
&& TYPE_MIN_VALUE (type)
|
||||
&& TYPE_MAX_VALUE (type)
|
||||
&& tree_int_cst_equal (CASE_LOW (VEC_index (tree, labels, 0)),
|
||||
TYPE_MIN_VALUE (type)))
|
||||
{
|
||||
tree low, high = CASE_HIGH (VEC_index (tree, labels, len - 1));
|
||||
if (!high)
|
||||
high = CASE_LOW (VEC_index (tree, labels, len - 1));
|
||||
if (tree_int_cst_equal (high, TYPE_MAX_VALUE (type)))
|
||||
{
|
||||
for (i = 1; i < len; i++)
|
||||
{
|
||||
high = CASE_LOW (VEC_index (tree, labels, i));
|
||||
low = CASE_HIGH (VEC_index (tree, labels, i - 1));
|
||||
if (!low)
|
||||
low = CASE_LOW (VEC_index (tree, labels, i - 1));
|
||||
if ((TREE_INT_CST_LOW (low) + 1
|
||||
!= TREE_INT_CST_LOW (high))
|
||||
|| (TREE_INT_CST_HIGH (low)
|
||||
+ (TREE_INT_CST_LOW (high) == 0)
|
||||
!= TREE_INT_CST_HIGH (high)))
|
||||
break;
|
||||
}
|
||||
if (i == len)
|
||||
default_case = build3 (CASE_LABEL_EXPR, void_type_node,
|
||||
NULL_TREE, NULL_TREE,
|
||||
CASE_LABEL (VEC_index (tree,
|
||||
labels, 0)));
|
||||
}
|
||||
}
|
||||
|
||||
if (!default_case)
|
||||
{
|
||||
gimple new_default;
|
||||
|
||||
default_case = build3 (CASE_LABEL_EXPR, void_type_node,
|
||||
NULL_TREE, NULL_TREE,
|
||||
create_artificial_label ());
|
||||
new_default = gimple_build_label (CASE_LABEL (default_case));
|
||||
gimplify_seq_add_stmt (&switch_body_seq, new_default);
|
||||
}
|
||||
}
|
||||
|
||||
gimple_switch = gimple_build_switch_vec (SWITCH_COND (switch_expr),
|
||||
default_case, labels);
|
||||
gimplify_seq_add_stmt (pre_p, gimple_switch);
|
||||
|
@ -1,3 +1,13 @@
|
||||
2009-05-05 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR middle-end/39666
|
||||
* gcc.dg/pr39666-1.c: New test.
|
||||
* gcc.dg/pr39666-2.c: Likewise.
|
||||
* g++.dg/warn/Wuninitialized-4.C: Likewise.
|
||||
* g++.dg/warn/Wuninitialized-5.C: Likewise.
|
||||
* gfortran.dg/pr39666-1.f90: Likewise.
|
||||
* gfortran.dg/pr39666-2.f90: Likewise.
|
||||
|
||||
2009-05-05 Adam Nemet <anemet@caviumnetworks.com>
|
||||
|
||||
* gcc.target/mips/mips.exp: Add -mtune= to mips_option_groups.
|
||||
|
22
gcc/testsuite/g++.dg/warn/Wuninitialized-4.C
Normal file
22
gcc/testsuite/g++.dg/warn/Wuninitialized-4.C
Normal file
@ -0,0 +1,22 @@
|
||||
// PR middle-end/39666
|
||||
// { dg-do compile }
|
||||
// { dg-options "-O2 -Wuninitialized" }
|
||||
|
||||
int
|
||||
foo (int i)
|
||||
{
|
||||
int j;
|
||||
switch (i)
|
||||
{
|
||||
case -__INT_MAX__ - 1 ... -1:
|
||||
j = 6;
|
||||
break;
|
||||
case 0:
|
||||
j = 5;
|
||||
break;
|
||||
case 1 ... __INT_MAX__:
|
||||
j = 4;
|
||||
break;
|
||||
}
|
||||
return j;
|
||||
}
|
22
gcc/testsuite/g++.dg/warn/Wuninitialized-5.C
Normal file
22
gcc/testsuite/g++.dg/warn/Wuninitialized-5.C
Normal file
@ -0,0 +1,22 @@
|
||||
// PR middle-end/39666
|
||||
// { dg-do compile }
|
||||
// { dg-options "-O2 -Wuninitialized" }
|
||||
|
||||
int
|
||||
foo (int i)
|
||||
{
|
||||
int j; // { dg-warning "may be used uninitialized" }
|
||||
switch (i)
|
||||
{
|
||||
case -__INT_MAX__ - 1 ... -1:
|
||||
j = 6;
|
||||
break;
|
||||
case 0:
|
||||
j = 5;
|
||||
break;
|
||||
case 2 ... __INT_MAX__:
|
||||
j = 4;
|
||||
break;
|
||||
}
|
||||
return j;
|
||||
}
|
22
gcc/testsuite/gcc.dg/pr39666-1.c
Normal file
22
gcc/testsuite/gcc.dg/pr39666-1.c
Normal file
@ -0,0 +1,22 @@
|
||||
/* PR middle-end/39666 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -Wuninitialized" } */
|
||||
|
||||
int
|
||||
foo (int i)
|
||||
{
|
||||
int j;
|
||||
switch (i)
|
||||
{
|
||||
case -__INT_MAX__ - 1 ... -1:
|
||||
j = 6;
|
||||
break;
|
||||
case 0:
|
||||
j = 5;
|
||||
break;
|
||||
case 1 ... __INT_MAX__:
|
||||
j = 4;
|
||||
break;
|
||||
}
|
||||
return j;
|
||||
}
|
22
gcc/testsuite/gcc.dg/pr39666-2.c
Normal file
22
gcc/testsuite/gcc.dg/pr39666-2.c
Normal file
@ -0,0 +1,22 @@
|
||||
/* PR middle-end/39666 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -Wuninitialized" } */
|
||||
|
||||
int
|
||||
foo (int i)
|
||||
{
|
||||
int j; /* { dg-warning "may be used uninitialized" } */
|
||||
switch (i)
|
||||
{
|
||||
case -__INT_MAX__ - 1 ... -1:
|
||||
j = 6;
|
||||
break;
|
||||
case 0:
|
||||
j = 5;
|
||||
break;
|
||||
case 2 ... __INT_MAX__:
|
||||
j = 4;
|
||||
break;
|
||||
}
|
||||
return j;
|
||||
}
|
14
gcc/testsuite/gfortran.dg/pr39666-1.f90
Normal file
14
gcc/testsuite/gfortran.dg/pr39666-1.f90
Normal file
@ -0,0 +1,14 @@
|
||||
! PR middle-end/39666
|
||||
! { dg-do compile }
|
||||
! { dg-options "-O2 -Wuninitialized" }
|
||||
|
||||
FUNCTION f(n)
|
||||
INTEGER, INTENT(in) :: n
|
||||
REAL :: f
|
||||
|
||||
SELECT CASE (n)
|
||||
CASE (:-1); f = -1.0
|
||||
CASE (0); f = 0.0
|
||||
CASE (1:); f = 1.0
|
||||
END SELECT
|
||||
END FUNCTION
|
14
gcc/testsuite/gfortran.dg/pr39666-2.f90
Normal file
14
gcc/testsuite/gfortran.dg/pr39666-2.f90
Normal file
@ -0,0 +1,14 @@
|
||||
! PR middle-end/39666
|
||||
! { dg-do compile }
|
||||
! { dg-options "-O2 -Wuninitialized" }
|
||||
|
||||
FUNCTION f(n) ! { dg-warning "may be used uninitialized" }
|
||||
INTEGER, INTENT(in) :: n
|
||||
REAL :: f
|
||||
|
||||
SELECT CASE (n)
|
||||
CASE (:-1); f = -1.0
|
||||
CASE (0); f = 0.0
|
||||
CASE (2:); f = 1.0
|
||||
END SELECT
|
||||
END FUNCTION
|
Loading…
Reference in New Issue
Block a user