re PR c++/22551 ([ICE] in tree_low_cst, at tree.c:3843)
.: PR c++/22551 * c-common.c (c_add_case_label): Clear LOW_VALUE and HIGH_VALUE's overflow flags. Refactor some conditionals. testsuite: PR c++/22551 * g++.dg/other/switch2.C: New. From-SVN: r105405
This commit is contained in:
parent
771c0562b5
commit
c0e22534e4
|
@ -1,3 +1,9 @@
|
|||
2005-10-14 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
PR c++/22551
|
||||
* c-common.c (c_add_case_label): Clear LOW_VALUE and HIGH_VALUE's
|
||||
overflow flags. Refactor some conditionals.
|
||||
|
||||
2005-10-13 Andrew Pinski <pinskia@physics.uc.edu>
|
||||
|
||||
PR tree-opt/21304
|
||||
|
|
|
@ -3588,25 +3588,32 @@ c_add_case_label (splay_tree cases, tree cond, tree orig_type,
|
|||
{
|
||||
low_value = check_case_value (low_value);
|
||||
low_value = convert_and_check (type, low_value);
|
||||
if (low_value == error_mark_node)
|
||||
goto error_out;
|
||||
/* Do not propagate any overflow information past this point.
|
||||
It is safe to just clear the flags, as any constants with
|
||||
them set will not be shared. */
|
||||
TREE_CONSTANT_OVERFLOW (low_value) = TREE_OVERFLOW (low_value) = 0;
|
||||
}
|
||||
if (high_value)
|
||||
{
|
||||
high_value = check_case_value (high_value);
|
||||
high_value = convert_and_check (type, high_value);
|
||||
if (high_value == error_mark_node)
|
||||
goto error_out;
|
||||
TREE_CONSTANT_OVERFLOW (high_value) = TREE_OVERFLOW (high_value) = 0;
|
||||
}
|
||||
|
||||
/* If an error has occurred, bail out now. */
|
||||
if (low_value == error_mark_node || high_value == error_mark_node)
|
||||
goto error_out;
|
||||
|
||||
/* If the LOW_VALUE and HIGH_VALUE are the same, then this isn't
|
||||
really a case range, even though it was written that way. Remove
|
||||
the HIGH_VALUE to simplify later processing. */
|
||||
if (tree_int_cst_equal (low_value, high_value))
|
||||
high_value = NULL_TREE;
|
||||
if (low_value && high_value
|
||||
&& !tree_int_cst_lt (low_value, high_value))
|
||||
warning (0, "empty range specified");
|
||||
if (low_value && high_value)
|
||||
{
|
||||
/* If the LOW_VALUE and HIGH_VALUE are the same, then this isn't
|
||||
really a case range, even though it was written that way.
|
||||
Remove the HIGH_VALUE to simplify later processing. */
|
||||
if (tree_int_cst_equal (low_value, high_value))
|
||||
high_value = NULL_TREE;
|
||||
else if (!tree_int_cst_lt (low_value, high_value))
|
||||
warning (0, "empty range specified");
|
||||
}
|
||||
|
||||
/* See if the case is in range of the type of the original testing
|
||||
expression. If both low_value and high_value are out of range,
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
2005-10-14 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
PR c++/22551
|
||||
* g++.dg/other/switch2.C: New.
|
||||
|
||||
PR c++/23984
|
||||
* g++.dg/init/ctor7.C: New.
|
||||
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
// Copyright (C) 2005 Free Software Foundation, Inc.
|
||||
// Contributed by Nathan Sidwell 13 Oct 2005 <nathan@codesourcery.com>
|
||||
|
||||
// PR 22551:ICE
|
||||
// Origin: Johnny Casey <emailwastefilter-bugzillagccorg@yahoo.com>
|
||||
|
||||
const int B = 0x80000000;
|
||||
|
||||
#define b(x) (B + x)
|
||||
|
||||
|
||||
int Foo (int error)
|
||||
{
|
||||
switch (error)
|
||||
{
|
||||
case b (1): return 0; // { dg-error "overflow" "" }
|
||||
case b (2): return 0; // { dg-error "overflow" "" }
|
||||
case b (3): return 0; // { dg-error "overflow" "" }
|
||||
case b (4): return 0; // { dg-error "overflow" "" }
|
||||
case b (5): return 0; // { dg-error "overflow" "" }
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue