re PR c++/65556 (ICE: verify_gimple failed (type precision mismatch in switch statement))

PR c++/65556
	* semantics.c (finish_switch_cond): If the unlowered type is not an
	enum, use the type of the condition.

	* c-c++-common/pr65556.c: New test.

From-SVN: r221738
This commit is contained in:
Marek Polacek 2015-03-27 16:46:44 +00:00 committed by Marek Polacek
parent 0b7dccc63e
commit 5964a3a672
4 changed files with 36 additions and 0 deletions

View file

@ -1,3 +1,9 @@
2015-03-27 Marek Polacek <polacek@redhat.com>
PR c++/65556
* semantics.c (finish_switch_cond): If the unlowered type is not an
enum, use the type of the condition.
2015-03-27 Jason Merrill <jason@redhat.com>
PR c++/65509

View file

@ -1165,6 +1165,8 @@ finish_switch_cond (tree cond, tree switch_stmt)
}
/* We want unlowered type here to handle enum bit-fields. */
orig_type = unlowered_expr_type (cond);
if (TREE_CODE (orig_type) != ENUMERAL_TYPE)
orig_type = TREE_TYPE (cond);
if (cond != error_mark_node)
{
/* Warn if the condition has boolean value. */

View file

@ -1,3 +1,8 @@
2015-03-27 Marek Polacek <polacek@redhat.com>
PR c++/65556
* c-c++-common/pr65556.c: New test.
2015-03-27 Jan Hubicka <hubicka@ucw.cz>
PR ipa/65600

View file

@ -0,0 +1,23 @@
/* PR c++/65556 */
/* { dg-do compile } */
struct S
{
long l: 1;
long l2: 41;
unsigned long ul: 1;
unsigned long ul2: 41;
} s;
void
fn ()
{
switch (s.l)
case 0:;
switch (s.ul)
case 0:;
switch (s.l2)
case 0:;
switch (s.ul2)
case 0:;
}