From 683b810150a0250e65a7640e183aa4339313b34c Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 21 Mar 2016 17:13:06 -0400 Subject: re PR c++/70285 (ICE on valid code on x86_64-linux-gnu: verify_gimple failed) PR c++/70285 * cp-gimplify.c (cp_fold) [COND_EXPR]: Handle bit-fields. From-SVN: r234384 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/cp-gimplify.c | 6 ++++++ gcc/testsuite/g++.dg/other/bitfield5.C | 15 +++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 gcc/testsuite/g++.dg/other/bitfield5.C (limited to 'gcc') diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index cd98a53..3912395 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2016-03-21 Jason Merrill + + PR c++/70285 + * cp-gimplify.c (cp_fold) [COND_EXPR]: Handle bit-fields. + 2016-03-18 Jason Merrill PR c++/70139 diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 6a767fa..9bf2482 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -2130,6 +2130,12 @@ cp_fold (tree x) else x = fold (x); + /* A COND_EXPR might have incompatible types in branches if one or both + arms are bitfields. If folding exposed such a branch, fix it up. */ + if (TREE_CODE (x) != code) + if (tree type = is_bitfield_expr_with_lowered_type (x)) + x = fold_convert (type, x); + break; case CALL_EXPR: diff --git a/gcc/testsuite/g++.dg/other/bitfield5.C b/gcc/testsuite/g++.dg/other/bitfield5.C new file mode 100644 index 0000000..b8cd4dd --- /dev/null +++ b/gcc/testsuite/g++.dg/other/bitfield5.C @@ -0,0 +1,15 @@ +// PR c++/70285 + +int a; + +struct S +{ + int i:8; +} b; + +int +fn1 (bool x) +{ + (&fn1 ? b.i : a) = 42; + return (&fn1 ? b.i : a); +} -- cgit v1.1