mirror of git://gcc.gnu.org/git/gcc.git
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
|
(gen_variable_die): Likewise. Check TREE_PRIVATE/TREE_PROTECTED
|
||||||
unconditionally.
|
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>
|
2009-05-05 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
* dwarf.h: Remove.
|
* dwarf.h: Remove.
|
||||||
|
|
|
||||||
|
|
@ -1604,21 +1604,64 @@ gimplify_switch_expr (tree *expr_p, gimple_seq *pre_p)
|
||||||
}
|
}
|
||||||
len = i;
|
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))
|
if (!VEC_empty (tree, labels))
|
||||||
sort_case_labels (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),
|
gimple_switch = gimple_build_switch_vec (SWITCH_COND (switch_expr),
|
||||||
default_case, labels);
|
default_case, labels);
|
||||||
gimplify_seq_add_stmt (pre_p, gimple_switch);
|
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>
|
2009-05-05 Adam Nemet <anemet@caviumnetworks.com>
|
||||||
|
|
||||||
* gcc.target/mips/mips.exp: Add -mtune= to mips_option_groups.
|
* gcc.target/mips/mips.exp: Add -mtune= to mips_option_groups.
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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